From c2c3bacef851bb634248a898e79b6edd559a5087 Mon Sep 17 00:00:00 2001 From: Heran Lin Date: Wed, 25 Sep 2024 21:58:10 +0800 Subject: [PATCH 1/2] Support `DROP DATABASE` --- src/ast/mod.rs | 2 ++ src/parser/mod.rs | 4 +++- tests/sqlparser_common.rs | 18 ++++++++++++++++++ tests/sqlparser_postgres.rs | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) 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..a380cca10 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -6734,6 +6734,24 @@ 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, .. + } => { + assert_eq!( + vec!["mycatalog.mydb"], + names.iter().map(ToString::to_string).collect::>() + ); + assert_eq!(ObjectType::Database, object_type); + } + _ => unreachable!(), + } +} + #[test] fn parse_create_view() { let sql = "CREATE VIEW myschema.myview AS SELECT foo FROM bar"; diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 9ba3e5dbc..43fac35ff 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -893,6 +893,20 @@ fn parse_drop_schema_if_exists() { } } +#[test] +fn parse_drop_database_if_exists() { + let sql = "DROP DATABASE IF EXISTS database_name"; + let ast = pg().verified_stmt(sql); + match ast { + Statement::Drop { + object_type, + if_exists: true, + .. + } => assert_eq!(object_type, ObjectType::Database), + _ => unreachable!(), + } +} + #[test] fn parse_copy_from_stdin() { let sql = r#"COPY public.actor (actor_id, first_name, last_name, last_update, value) FROM stdin; From 0a3576ca6ff879fa21880ff3b8cc06c6b15cb760 Mon Sep 17 00:00:00 2001 From: Heran Lin Date: Sun, 29 Sep 2024 17:06:33 +0800 Subject: [PATCH 2/2] Move test --- tests/sqlparser_common.rs | 23 +++++++++++++++++++++-- tests/sqlparser_postgres.rs | 14 -------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index a380cca10..46ea408c4 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -6734,19 +6734,38 @@ 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, .. + 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!(), } diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 43fac35ff..9ba3e5dbc 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -893,20 +893,6 @@ fn parse_drop_schema_if_exists() { } } -#[test] -fn parse_drop_database_if_exists() { - let sql = "DROP DATABASE IF EXISTS database_name"; - let ast = pg().verified_stmt(sql); - match ast { - Statement::Drop { - object_type, - if_exists: true, - .. - } => assert_eq!(object_type, ObjectType::Database), - _ => unreachable!(), - } -} - #[test] fn parse_copy_from_stdin() { let sql = r#"COPY public.actor (actor_id, first_name, last_name, last_update, value) FROM stdin;