Skip to content

Commit 1021d39

Browse files
committed
Support basic DROP TABLE and DROP VIEW
1 parent 908082d commit 1021d39

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

src/sqlast/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ pub enum SQLStatement {
347347
/// VALUES (vector of rows to insert)
348348
values: Vec<Vec<ASTNode>>,
349349
},
350+
/// COPY (PostgreSQL-specific)
350351
SQLCopy {
351352
/// TABLE
352353
table_name: SQLObjectName,
@@ -371,6 +372,11 @@ pub enum SQLStatement {
371372
/// WHERE
372373
selection: Option<ASTNode>,
373374
},
375+
/// DROP
376+
SQLDrop {
377+
object_type: String,
378+
name: SQLObjectName,
379+
},
374380
/// CREATE VIEW
375381
SQLCreateView {
376382
/// View name
@@ -468,6 +474,9 @@ impl ToString for SQLStatement {
468474
}
469475
s
470476
}
477+
SQLStatement::SQLDrop { object_type, name } => {
478+
format!("DROP {} {}", object_type, name.to_string())
479+
}
471480
SQLStatement::SQLCreateView {
472481
name,
473482
query,

src/sqlparser.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ impl Parser {
9999
"CREATE" => Ok(self.parse_create()?),
100100
"DELETE" => Ok(self.parse_delete()?),
101101
"INSERT" => Ok(self.parse_insert()?),
102+
"DROP" => Ok(self.parse_drop()?),
102103
"ALTER" => Ok(self.parse_alter()?),
103104
"COPY" => Ok(self.parse_copy()?),
104105
_ => parser_err!(format!(
@@ -838,6 +839,18 @@ impl Parser {
838839
}
839840
}
840841

842+
pub fn parse_drop(&mut self) -> Result<SQLStatement, ParserError> {
843+
let object_type = if self.parse_keyword("VIEW") {
844+
"VIEW".to_string()
845+
} else if self.parse_keyword("TABLE") {
846+
"TABLE".to_string()
847+
} else {
848+
return self.expected("VIEW or TABLE after DROP", self.peek_token());
849+
};
850+
let name = self.parse_object_name()?;
851+
Ok(SQLStatement::SQLDrop { object_type, name })
852+
}
853+
841854
pub fn parse_alter(&mut self) -> Result<SQLStatement, ParserError> {
842855
self.expect_keyword("TABLE")?;
843856
let _ = self.parse_keyword("ONLY");

tests/sqlparser_common.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,22 @@ fn parse_create_external_table() {
620620
}
621621
}
622622

623+
#[test]
624+
fn parse_drop() {
625+
check_one("DROP TABLE mytable", "TABLE", "mytable");
626+
check_one("DROP VIEW myview", "VIEW", "myview");
627+
628+
fn check_one(sql: &str, expected_type: &str, expected_name: &str) {
629+
match all_dialects().verified_stmt(sql) {
630+
SQLStatement::SQLDrop { name, object_type } => {
631+
assert_eq!(name.to_string(), expected_name);
632+
assert_eq!(object_type, expected_type);
633+
}
634+
_ => unreachable!(),
635+
}
636+
}
637+
}
638+
623639
#[test]
624640
fn parse_alter_table_constraint_primary_key() {
625641
let sql = "ALTER TABLE bazaar.address \

0 commit comments

Comments
 (0)