Add support for `DROP USER` statement (#1951)
diff --git a/src/ast/mod.rs b/src/ast/mod.rs
index 8bf7507..c2ec8c6 100644
--- a/src/ast/mod.rs
+++ b/src/ast/mod.rs
@@ -7768,6 +7768,7 @@
Sequence,
Stage,
Type,
+ User,
}
impl fmt::Display for ObjectType {
@@ -7783,6 +7784,7 @@
ObjectType::Sequence => "SEQUENCE",
ObjectType::Stage => "STAGE",
ObjectType::Type => "TYPE",
+ ObjectType::User => "USER",
})
}
}
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index e219b20..d96a300 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -6251,6 +6251,8 @@
ObjectType::Stage
} else if self.parse_keyword(Keyword::TYPE) {
ObjectType::Type
+ } else if self.parse_keyword(Keyword::USER) {
+ ObjectType::User
} else if self.parse_keyword(Keyword::FUNCTION) {
return self.parse_drop_function();
} else if self.parse_keyword(Keyword::POLICY) {
@@ -6269,7 +6271,7 @@
return self.parse_drop_extension();
} else {
return self.expected(
- "CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, or MATERIALIZED VIEW after DROP",
+ "CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
self.peek_token(),
);
};
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index e95c7e7..32bc70e 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -8355,6 +8355,24 @@
}
#[test]
+fn parse_drop_user() {
+ let sql = "DROP USER u1";
+ match verified_stmt(sql) {
+ Statement::Drop {
+ names, object_type, ..
+ } => {
+ assert_eq!(
+ vec!["u1"],
+ names.iter().map(ToString::to_string).collect::<Vec<_>>()
+ );
+ assert_eq!(ObjectType::User, object_type);
+ }
+ _ => unreachable!(),
+ }
+ verified_stmt("DROP USER IF EXISTS u1");
+}
+
+#[test]
fn parse_invalid_subquery_without_parens() {
let res = parse_sql_statements("SELECT SELECT 1 FROM bar WHERE 1=1 FROM baz");
assert_eq!(