diff --git a/src/ast/mod.rs b/src/ast/mod.rs index c39a77c64..ea6925535 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1184,6 +1184,9 @@ pub enum Statement { /// Whether `CASCADE` was specified. This will be `false` when /// `RESTRICT` or no drop behavior at all was specified. cascade: bool, + /// Whether `RESTRICT` was specified. This will be `false` when + /// `CASCADE` or no drop behavior at all was specified. + restrict: bool, /// Hive allows you specify whether the table's stored data will be /// deleted along with the dropped table purge: bool, @@ -2143,14 +2146,16 @@ impl fmt::Display for Statement { if_exists, names, cascade, + restrict, purge, } => write!( f, - "DROP {}{} {}{}{}", + "DROP {}{} {}{}{}{}", object_type, if *if_exists { " IF EXISTS" } else { "" }, display_comma_separated(names), if *cascade { " CASCADE" } else { "" }, + if *restrict { " RESTRICT" } else { "" }, if *purge { " PURGE" } else { "" } ), Statement::Discard { object_type } => { @@ -2910,6 +2915,7 @@ pub enum ObjectType { Index, Schema, Role, + Sequence, } impl fmt::Display for ObjectType { @@ -2920,6 +2926,7 @@ impl fmt::Display for ObjectType { ObjectType::Index => "INDEX", ObjectType::Schema => "SCHEMA", ObjectType::Role => "ROLE", + ObjectType::Sequence => "SEQUENCE", }) } } diff --git a/src/parser.rs b/src/parser.rs index 787a0c638..045f7fa23 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2441,9 +2441,11 @@ impl<'a> Parser<'a> { ObjectType::Role } else if self.parse_keyword(Keyword::SCHEMA) { ObjectType::Schema + } else if self.parse_keyword(Keyword::SEQUENCE) { + ObjectType::Sequence } else { return self.expected( - "TABLE, VIEW, INDEX, ROLE, or SCHEMA after DROP", + "TABLE, VIEW, INDEX, ROLE, SCHEMA, or SEQUENCE after DROP", self.peek_token(), ); }; @@ -2465,6 +2467,7 @@ impl<'a> Parser<'a> { if_exists, names, cascade, + restrict, purge, }) } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index e34daed65..9e5a5cdd1 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -4469,6 +4469,7 @@ fn parse_drop_table() { names, cascade, purge: _, + .. } => { assert!(!if_exists); assert_eq!(ObjectType::Table, object_type); @@ -4489,6 +4490,7 @@ fn parse_drop_table() { names, cascade, purge: _, + .. } => { assert!(if_exists); assert_eq!(ObjectType::Table, object_type); diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 93be8e4ad..7b6828ae4 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -22,6 +22,25 @@ use sqlparser::ast::*; use sqlparser::dialect::{GenericDialect, PostgreSqlDialect}; use sqlparser::parser::ParserError; +#[test] +fn parse_drop_sequence() { + // SimpleLogger::new().init().unwrap(); + let sql1 = "DROP SEQUENCE IF EXISTS name0 CASCADE"; + pg().one_statement_parses_to(sql1, "DROP SEQUENCE IF EXISTS name0 CASCADE"); + let sql2 = "DROP SEQUENCE IF EXISTS name1 RESTRICT"; + pg().one_statement_parses_to(sql2, "DROP SEQUENCE IF EXISTS name1 RESTRICT"); + let sql3 = "DROP SEQUENCE name2 CASCADE"; + pg().one_statement_parses_to(sql3, "DROP SEQUENCE name2 CASCADE"); + let sql4 = "DROP SEQUENCE name2"; + pg().one_statement_parses_to(sql4, "DROP SEQUENCE name2"); + let sql5 = "DROP SEQUENCE name0 CASCADE"; + pg().one_statement_parses_to(sql5, "DROP SEQUENCE name0 CASCADE"); + let sql6 = "DROP SEQUENCE name1 RESTRICT"; + pg().one_statement_parses_to(sql6, "DROP SEQUENCE name1 RESTRICT"); + let sql7 = "DROP SEQUENCE name1, name2, name3"; + pg().one_statement_parses_to(sql7, "DROP SEQUENCE name1, name2, name3"); +} + #[test] fn parse_create_table_with_defaults() { let sql = "CREATE TABLE public.customer (