mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-04 06:18:17 +00:00
support IF EXISTS in COMMENT statements (#831)
* support IF EXISTS in COMMENT statements Signed-off-by: Pawel Leszczynski <leszczynski.pawel@gmail.com> * Update src/ast/mod.rs Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org> --------- Signed-off-by: Pawel Leszczynski <leszczynski.pawel@gmail.com> Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
This commit is contained in:
parent
548191814c
commit
4ff3aeb040
3 changed files with 19 additions and 2 deletions
|
@ -1487,6 +1487,9 @@ pub enum Statement {
|
|||
object_type: CommentObject,
|
||||
object_name: ObjectName,
|
||||
comment: Option<String>,
|
||||
/// An optional `IF EXISTS` clause. (Non-standard.)
|
||||
/// See <https://docs.snowflake.com/en/sql-reference/sql/comment>
|
||||
if_exists: bool,
|
||||
},
|
||||
/// `COMMIT [ TRANSACTION | WORK ] [ AND [ NO ] CHAIN ]`
|
||||
Commit { chain: bool },
|
||||
|
@ -2637,8 +2640,13 @@ impl fmt::Display for Statement {
|
|||
object_type,
|
||||
object_name,
|
||||
comment,
|
||||
if_exists,
|
||||
} => {
|
||||
write!(f, "COMMENT ON {object_type} {object_name} IS ")?;
|
||||
write!(f, "COMMENT ")?;
|
||||
if *if_exists {
|
||||
write!(f, "IF EXISTS ")?
|
||||
};
|
||||
write!(f, "ON {object_type} {object_name} IS ")?;
|
||||
if let Some(c) = comment {
|
||||
write!(f, "'{c}'")
|
||||
} else {
|
||||
|
|
|
@ -49,6 +49,8 @@ impl Dialect for PostgreSqlDialect {
|
|||
}
|
||||
|
||||
pub fn parse_comment(parser: &mut Parser) -> Result<Statement, ParserError> {
|
||||
let if_exists = parser.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
||||
|
||||
parser.expect_keyword(Keyword::ON)?;
|
||||
let token = parser.next_token();
|
||||
|
||||
|
@ -74,5 +76,6 @@ pub fn parse_comment(parser: &mut Parser) -> Result<Statement, ParserError> {
|
|||
object_type,
|
||||
object_name,
|
||||
comment,
|
||||
if_exists,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1790,10 +1790,12 @@ fn parse_comments() {
|
|||
object_type,
|
||||
object_name,
|
||||
comment: Some(comment),
|
||||
if_exists,
|
||||
} => {
|
||||
assert_eq!("comment", comment);
|
||||
assert_eq!("tab.name", object_name.to_string());
|
||||
assert_eq!(CommentObject::Column, object_type);
|
||||
assert!(!if_exists);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
@ -1803,22 +1805,26 @@ fn parse_comments() {
|
|||
object_type,
|
||||
object_name,
|
||||
comment: Some(comment),
|
||||
if_exists,
|
||||
} => {
|
||||
assert_eq!("comment", comment);
|
||||
assert_eq!("public.tab", object_name.to_string());
|
||||
assert_eq!(CommentObject::Table, object_type);
|
||||
assert!(!if_exists);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
||||
match pg().verified_stmt("COMMENT ON TABLE public.tab IS NULL") {
|
||||
match pg().verified_stmt("COMMENT IF EXISTS ON TABLE public.tab IS NULL") {
|
||||
Statement::Comment {
|
||||
object_type,
|
||||
object_name,
|
||||
comment: None,
|
||||
if_exists,
|
||||
} => {
|
||||
assert_eq!("public.tab", object_name.to_string());
|
||||
assert_eq!(CommentObject::Table, object_type);
|
||||
assert!(if_exists);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue