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!(