From 95ec56844f21509e2c58960c03e5fa1bcdc8ccb4 Mon Sep 17 00:00:00 2001 From: Yoav Cohen Date: Thu, 17 Jul 2025 07:46:52 +0300 Subject: [PATCH] DROP USER --- src/ast/mod.rs | 2 ++ src/parser/mod.rs | 4 +++- tests/sqlparser_common.rs | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 8bf750765..c2ec8c686 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -7768,6 +7768,7 @@ pub enum ObjectType { Sequence, Stage, Type, + User, } impl fmt::Display for ObjectType { @@ -7783,6 +7784,7 @@ impl fmt::Display for ObjectType { 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 b3ceec7e2..13301d059 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -6243,6 +6243,8 @@ impl<'a> Parser<'a> { 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) { @@ -6261,7 +6263,7 @@ impl<'a> Parser<'a> { 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 e95c7e7b6..32bc70e65 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -8354,6 +8354,24 @@ fn parse_drop_view() { verified_stmt("DROP MATERIALIZED VIEW IF EXISTS a.b.c"); } +#[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::>() + ); + 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");