Skip to content

Commit a514d65

Browse files
committed
PostgreSQL: Support more COMMENT ON object types
Signed-off-by: Guan-Ming Chiu <guanmingchiu@gmail.com>
1 parent 2ea773a commit a514d65

3 files changed

Lines changed: 79 additions & 18 deletions

File tree

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
@@ -899,23 +899,51 @@ impl<'a> Parser<'a> {
899899
Token::Word(w) if w.keyword == Keyword::COLUMN => {
900900
(CommentObject::Column, self.parse_object_name(false)?)
901901
}
902-
Token::Word(w) if w.keyword == Keyword::TABLE => {
903-
(CommentObject::Table, self.parse_object_name(false)?)
902+
Token::Word(w) if w.keyword == Keyword::DATABASE => {
903+
(CommentObject::Database, self.parse_object_name(false)?)
904+
}
905+
Token::Word(w) if w.keyword == Keyword::DOMAIN => {
906+
(CommentObject::Domain, self.parse_object_name(false)?)
904907
}
905908
Token::Word(w) if w.keyword == Keyword::EXTENSION => {
906909
(CommentObject::Extension, self.parse_object_name(false)?)
907910
}
911+
Token::Word(w) if w.keyword == Keyword::FUNCTION => {
912+
(CommentObject::Function, self.parse_object_name(false)?)
913+
}
914+
Token::Word(w) if w.keyword == Keyword::INDEX => {
915+
(CommentObject::Index, self.parse_object_name(false)?)
916+
}
917+
Token::Word(w) if w.keyword == Keyword::MATERIALIZED => {
918+
self.expect_keyword_is(Keyword::VIEW)?;
919+
(
920+
CommentObject::MaterializedView,
921+
self.parse_object_name(false)?,
922+
)
923+
}
924+
Token::Word(w) if w.keyword == Keyword::PROCEDURE => {
925+
(CommentObject::Procedure, self.parse_object_name(false)?)
926+
}
927+
Token::Word(w) if w.keyword == Keyword::ROLE => {
928+
(CommentObject::Role, self.parse_object_name(false)?)
929+
}
908930
Token::Word(w) if w.keyword == Keyword::SCHEMA => {
909931
(CommentObject::Schema, self.parse_object_name(false)?)
910932
}
911-
Token::Word(w) if w.keyword == Keyword::DATABASE => {
912-
(CommentObject::Database, self.parse_object_name(false)?)
933+
Token::Word(w) if w.keyword == Keyword::SEQUENCE => {
934+
(CommentObject::Sequence, self.parse_object_name(false)?)
935+
}
936+
Token::Word(w) if w.keyword == Keyword::TABLE => {
937+
(CommentObject::Table, self.parse_object_name(false)?)
938+
}
939+
Token::Word(w) if w.keyword == Keyword::TYPE => {
940+
(CommentObject::Type, self.parse_object_name(false)?)
913941
}
914942
Token::Word(w) if w.keyword == Keyword::USER => {
915943
(CommentObject::User, self.parse_object_name(false)?)
916944
}
917-
Token::Word(w) if w.keyword == Keyword::ROLE => {
918-
(CommentObject::Role, self.parse_object_name(false)?)
945+
Token::Word(w) if w.keyword == Keyword::VIEW => {
946+
(CommentObject::View, self.parse_object_name(false)?)
919947
}
920948
_ => self.expected("comment object_type", token)?,
921949
};

tests/sqlparser_common.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15172,14 +15172,23 @@ fn parse_comments() {
1517215172
_ => unreachable!(),
1517315173
}
1517415174

15175+
// https://www.postgresql.org/docs/current/sql-comment.html
1517515176
let object_types = [
1517615177
("COLUMN", CommentObject::Column),
15178+
("DATABASE", CommentObject::Database),
15179+
("DOMAIN", CommentObject::Domain),
1517715180
("EXTENSION", CommentObject::Extension),
15178-
("TABLE", CommentObject::Table),
15181+
("FUNCTION", CommentObject::Function),
15182+
("INDEX", CommentObject::Index),
15183+
("MATERIALIZED VIEW", CommentObject::MaterializedView),
15184+
("PROCEDURE", CommentObject::Procedure),
15185+
("ROLE", CommentObject::Role),
1517915186
("SCHEMA", CommentObject::Schema),
15180-
("DATABASE", CommentObject::Database),
15187+
("SEQUENCE", CommentObject::Sequence),
15188+
("TABLE", CommentObject::Table),
15189+
("TYPE", CommentObject::Type),
1518115190
("USER", CommentObject::User),
15182-
("ROLE", CommentObject::Role),
15191+
("VIEW", CommentObject::View),
1518315192
];
1518415193
for (keyword, expected_object_type) in object_types.iter() {
1518515194
match all_dialects_where(|d| d.supports_comment_on())

0 commit comments

Comments
 (0)