diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 9b7a66650..4beb9a04f 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -5580,6 +5580,7 @@ pub enum ObjectType { View, Index, Schema, + Database, Role, Sequence, Stage, @@ -5592,6 +5593,7 @@ impl fmt::Display for ObjectType { ObjectType::View => "VIEW", ObjectType::Index => "INDEX", ObjectType::Schema => "SCHEMA", + ObjectType::Database => "DATABASE", ObjectType::Role => "ROLE", ObjectType::Sequence => "SEQUENCE", ObjectType::Stage => "STAGE", diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 5d57347cf..3e5cd1751 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -4779,6 +4779,8 @@ impl<'a> Parser<'a> { ObjectType::Role } else if self.parse_keyword(Keyword::SCHEMA) { ObjectType::Schema + } else if self.parse_keyword(Keyword::DATABASE) { + ObjectType::Database } else if self.parse_keyword(Keyword::SEQUENCE) { ObjectType::Sequence } else if self.parse_keyword(Keyword::STAGE) { @@ -4793,7 +4795,7 @@ impl<'a> Parser<'a> { return self.parse_drop_trigger(); } else { return self.expected( - "TABLE, VIEW, INDEX, ROLE, SCHEMA, FUNCTION, PROCEDURE, STAGE, TRIGGER, SECRET or SEQUENCE after DROP", + "TABLE, VIEW, INDEX, ROLE, SCHEMA, DATABASE, FUNCTION, PROCEDURE, STAGE, TRIGGER, SECRET or SEQUENCE after DROP", self.peek_token(), ); }; diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 9aa76882a..46ea408c4 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -6734,6 +6734,43 @@ fn parse_create_database_ine() { } } +#[test] +fn parse_drop_database() { + let sql = "DROP DATABASE mycatalog.mydb"; + match verified_stmt(sql) { + Statement::Drop { + names, + object_type, + if_exists, + .. + } => { + assert_eq!( + vec!["mycatalog.mydb"], + names.iter().map(ToString::to_string).collect::>() + ); + assert_eq!(ObjectType::Database, object_type); + assert!(!if_exists); + } + _ => unreachable!(), + } +} + +#[test] +fn parse_drop_database_if_exists() { + let sql = "DROP DATABASE IF EXISTS mydb"; + match verified_stmt(sql) { + Statement::Drop { + object_type, + if_exists, + .. + } => { + assert_eq!(ObjectType::Database, object_type); + assert!(if_exists); + } + _ => unreachable!(), + } +} + #[test] fn parse_create_view() { let sql = "CREATE VIEW myschema.myview AS SELECT foo FROM bar";