Skip to content

Commit a99fe54

Browse files
authored
PostgreSQL: Support more COMMENT ON object types (#2220)
Signed-off-by: Guan-Ming Chiu <guanmingchiu@gmail.com>
1 parent bfd944c commit a99fe54

File tree

3 files changed

+79
-18
lines changed

3 files changed

+79
-18
lines changed

src/ast/mod.rs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2439,30 +2439,54 @@ impl fmt::Display for ShowCreateObject {
24392439
pub enum CommentObject {
24402440
/// A table column.
24412441
Column,
2442-
/// A table.
2443-
Table,
2442+
/// A database.
2443+
Database,
2444+
/// A domain.
2445+
Domain,
24442446
/// An extension.
24452447
Extension,
2448+
/// A function.
2449+
Function,
2450+
/// An index.
2451+
Index,
2452+
/// A materialized view.
2453+
MaterializedView,
2454+
/// A procedure.
2455+
Procedure,
2456+
/// A role.
2457+
Role,
24462458
/// A schema.
24472459
Schema,
2448-
/// A database.
2449-
Database,
2460+
/// A sequence.
2461+
Sequence,
2462+
/// A table.
2463+
Table,
2464+
/// A type.
2465+
Type,
24502466
/// A user.
24512467
User,
2452-
/// A role.
2453-
Role,
2468+
/// A view.
2469+
View,
24542470
}
24552471

24562472
impl fmt::Display for CommentObject {
24572473
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
24582474
match self {
24592475
CommentObject::Column => f.write_str("COLUMN"),
2460-
CommentObject::Table => f.write_str("TABLE"),
2476+
CommentObject::Database => f.write_str("DATABASE"),
2477+
CommentObject::Domain => f.write_str("DOMAIN"),
24612478
CommentObject::Extension => f.write_str("EXTENSION"),
2479+
CommentObject::Function => f.write_str("FUNCTION"),
2480+
CommentObject::Index => f.write_str("INDEX"),
2481+
CommentObject::MaterializedView => f.write_str("MATERIALIZED VIEW"),
2482+
CommentObject::Procedure => f.write_str("PROCEDURE"),
2483+
CommentObject::Role => f.write_str("ROLE"),
24622484
CommentObject::Schema => f.write_str("SCHEMA"),
2463-
CommentObject::Database => f.write_str("DATABASE"),
2485+
CommentObject::Sequence => f.write_str("SEQUENCE"),
2486+
CommentObject::Table => f.write_str("TABLE"),
2487+
CommentObject::Type => f.write_str("TYPE"),
24642488
CommentObject::User => f.write_str("USER"),
2465-
CommentObject::Role => f.write_str("ROLE"),
2489+
CommentObject::View => f.write_str("VIEW"),
24662490
}
24672491
}
24682492
}

src/parser/mod.rs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -901,23 +901,51 @@ impl<'a> Parser<'a> {
901901
Token::Word(w) if w.keyword == Keyword::COLUMN => {
902902
(CommentObject::Column, self.parse_object_name(false)?)
903903
}
904-
Token::Word(w) if w.keyword == Keyword::TABLE => {
905-
(CommentObject::Table, self.parse_object_name(false)?)
904+
Token::Word(w) if w.keyword == Keyword::DATABASE => {
905+
(CommentObject::Database, self.parse_object_name(false)?)
906+
}
907+
Token::Word(w) if w.keyword == Keyword::DOMAIN => {
908+
(CommentObject::Domain, self.parse_object_name(false)?)
906909
}
907910
Token::Word(w) if w.keyword == Keyword::EXTENSION => {
908911
(CommentObject::Extension, self.parse_object_name(false)?)
909912
}
913+
Token::Word(w) if w.keyword == Keyword::FUNCTION => {
914+
(CommentObject::Function, self.parse_object_name(false)?)
915+
}
916+
Token::Word(w) if w.keyword == Keyword::INDEX => {
917+
(CommentObject::Index, self.parse_object_name(false)?)
918+
}
919+
Token::Word(w) if w.keyword == Keyword::MATERIALIZED => {
920+
self.expect_keyword_is(Keyword::VIEW)?;
921+
(
922+
CommentObject::MaterializedView,
923+
self.parse_object_name(false)?,
924+
)
925+
}
926+
Token::Word(w) if w.keyword == Keyword::PROCEDURE => {
927+
(CommentObject::Procedure, self.parse_object_name(false)?)
928+
}
929+
Token::Word(w) if w.keyword == Keyword::ROLE => {
930+
(CommentObject::Role, self.parse_object_name(false)?)
931+
}
910932
Token::Word(w) if w.keyword == Keyword::SCHEMA => {
911933
(CommentObject::Schema, self.parse_object_name(false)?)
912934
}
913-
Token::Word(w) if w.keyword == Keyword::DATABASE => {
914-
(CommentObject::Database, self.parse_object_name(false)?)
935+
Token::Word(w) if w.keyword == Keyword::SEQUENCE => {
936+
(CommentObject::Sequence, self.parse_object_name(false)?)
937+
}
938+
Token::Word(w) if w.keyword == Keyword::TABLE => {
939+
(CommentObject::Table, self.parse_object_name(false)?)
940+
}
941+
Token::Word(w) if w.keyword == Keyword::TYPE => {
942+
(CommentObject::Type, self.parse_object_name(false)?)
915943
}
916944
Token::Word(w) if w.keyword == Keyword::USER => {
917945
(CommentObject::User, self.parse_object_name(false)?)
918946
}
919-
Token::Word(w) if w.keyword == Keyword::ROLE => {
920-
(CommentObject::Role, self.parse_object_name(false)?)
947+
Token::Word(w) if w.keyword == Keyword::VIEW => {
948+
(CommentObject::View, self.parse_object_name(false)?)
921949
}
922950
_ => self.expected("comment object_type", token)?,
923951
};

tests/sqlparser_common.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15185,14 +15185,23 @@ fn parse_comments() {
1518515185
_ => unreachable!(),
1518615186
}
1518715187

15188+
// https://www.postgresql.org/docs/current/sql-comment.html
1518815189
let object_types = [
1518915190
("COLUMN", CommentObject::Column),
15191+
("DATABASE", CommentObject::Database),
15192+
("DOMAIN", CommentObject::Domain),
1519015193
("EXTENSION", CommentObject::Extension),
15191-
("TABLE", CommentObject::Table),
15194+
("FUNCTION", CommentObject::Function),
15195+
("INDEX", CommentObject::Index),
15196+
("MATERIALIZED VIEW", CommentObject::MaterializedView),
15197+
("PROCEDURE", CommentObject::Procedure),
15198+
("ROLE", CommentObject::Role),
1519215199
("SCHEMA", CommentObject::Schema),
15193-
("DATABASE", CommentObject::Database),
15200+
("SEQUENCE", CommentObject::Sequence),
15201+
("TABLE", CommentObject::Table),
15202+
("TYPE", CommentObject::Type),
1519415203
("USER", CommentObject::User),
15195-
("ROLE", CommentObject::Role),
15204+
("VIEW", CommentObject::View),
1519615205
];
1519715206
for (keyword, expected_object_type) in object_types.iter() {
1519815207
match all_dialects_where(|d| d.supports_comment_on())

0 commit comments

Comments
 (0)