From 3bddcad85dd3b89deee4c947f3bdb578bd575208 Mon Sep 17 00:00:00 2001 From: David Caldwell Date: Mon, 7 Oct 2024 00:11:07 -0700 Subject: [PATCH] Add "DROP TYPE" support. See: https://www.postgresql.org/docs/current/sql-droptype.html https://learn.microsoft.com/en-us/sql/t-sql/statements/drop-type-transact-sql?view=sql-server-ver16 https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/DROP-TYPE.html --- src/ast/mod.rs | 2 ++ src/parser/mod.rs | 4 ++- tests/sqlparser_common.rs | 54 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index a11fa63f4..b79fc1f71 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -5713,6 +5713,7 @@ pub enum ObjectType { Role, Sequence, Stage, + Type, } impl fmt::Display for ObjectType { @@ -5726,6 +5727,7 @@ impl fmt::Display for ObjectType { ObjectType::Role => "ROLE", ObjectType::Sequence => "SEQUENCE", ObjectType::Stage => "STAGE", + ObjectType::Type => "TYPE", }) } } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a4445e04d..650434a02 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -4887,6 +4887,8 @@ impl<'a> Parser<'a> { ObjectType::Sequence } else if self.parse_keyword(Keyword::STAGE) { ObjectType::Stage + } else if self.parse_keyword(Keyword::TYPE) { + ObjectType::Type } else if self.parse_keyword(Keyword::FUNCTION) { return self.parse_drop_function(); } else if self.parse_keyword(Keyword::POLICY) { @@ -4899,7 +4901,7 @@ impl<'a> Parser<'a> { return self.parse_drop_trigger(); } else { return self.expected( - "TABLE, VIEW, INDEX, ROLE, SCHEMA, DATABASE, FUNCTION, PROCEDURE, STAGE, TRIGGER, SECRET or SEQUENCE after DROP", + "TABLE, VIEW, INDEX, ROLE, SCHEMA, DATABASE, FUNCTION, PROCEDURE, STAGE, TRIGGER, SECRET, SEQUENCE, or TYPE after DROP", self.peek_token(), ); }; diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 2677c193c..86130e84e 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -9648,6 +9648,60 @@ fn parse_create_type() { ); } +#[test] +fn parse_drop_type() { + let sql = "DROP TYPE abc"; + match verified_stmt(sql) { + Statement::Drop { + names, + object_type, + if_exists, + cascade, + .. + } => { + assert_eq_vec(&["abc"], &names); + assert_eq!(ObjectType::Type, object_type); + assert!(!if_exists); + assert!(!cascade); + } + _ => unreachable!(), + }; + + let sql = "DROP TYPE IF EXISTS def, magician, quaternion"; + match verified_stmt(sql) { + Statement::Drop { + names, + object_type, + if_exists, + cascade, + .. + } => { + assert_eq_vec(&["def", "magician", "quaternion"], &names); + assert_eq!(ObjectType::Type, object_type); + assert!(if_exists); + assert!(!cascade); + } + _ => unreachable!(), + } + + let sql = "DROP TYPE IF EXISTS my_type CASCADE"; + match verified_stmt(sql) { + Statement::Drop { + names, + object_type, + if_exists, + cascade, + .. + } => { + assert_eq_vec(&["my_type"], &names); + assert_eq!(ObjectType::Type, object_type); + assert!(if_exists); + assert!(cascade); + } + _ => unreachable!(), + } +} + #[test] fn parse_call() { all_dialects().verified_stmt("CALL my_procedure()");