Add "DROP TYPE" support. (#1461)

This commit is contained in:
David Caldwell 2024-10-09 06:59:00 -07:00 committed by GitHub
parent 7905fb4905
commit c01e054fd8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 59 additions and 1 deletions

View file

@ -5736,6 +5736,7 @@ pub enum ObjectType {
Role, Role,
Sequence, Sequence,
Stage, Stage,
Type,
} }
impl fmt::Display for ObjectType { impl fmt::Display for ObjectType {
@ -5749,6 +5750,7 @@ impl fmt::Display for ObjectType {
ObjectType::Role => "ROLE", ObjectType::Role => "ROLE",
ObjectType::Sequence => "SEQUENCE", ObjectType::Sequence => "SEQUENCE",
ObjectType::Stage => "STAGE", ObjectType::Stage => "STAGE",
ObjectType::Type => "TYPE",
}) })
} }
} }

View file

@ -4889,6 +4889,8 @@ impl<'a> Parser<'a> {
ObjectType::Sequence ObjectType::Sequence
} else if self.parse_keyword(Keyword::STAGE) { } else if self.parse_keyword(Keyword::STAGE) {
ObjectType::Stage ObjectType::Stage
} else if self.parse_keyword(Keyword::TYPE) {
ObjectType::Type
} else if self.parse_keyword(Keyword::FUNCTION) { } else if self.parse_keyword(Keyword::FUNCTION) {
return self.parse_drop_function(); return self.parse_drop_function();
} else if self.parse_keyword(Keyword::POLICY) { } else if self.parse_keyword(Keyword::POLICY) {
@ -4901,7 +4903,7 @@ impl<'a> Parser<'a> {
return self.parse_drop_trigger(); return self.parse_drop_trigger();
} else { } else {
return self.expected( 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(), self.peek_token(),
); );
}; };

View file

@ -9690,6 +9690,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] #[test]
fn parse_call() { fn parse_call() {
all_dialects().verified_stmt("CALL my_procedure()"); all_dialects().verified_stmt("CALL my_procedure()");