Skip to content

Commit 4ca1508

Browse files
Added support for DROP DOMAIN
1 parent 7703fd0 commit 4ca1508

File tree

5 files changed

+105
-0
lines changed

5 files changed

+105
-0
lines changed

src/ast/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3319,6 +3319,18 @@ pub enum Statement {
33193319
drop_behavior: Option<DropBehavior>,
33203320
},
33213321
/// ```sql
3322+
/// DROP DOMAIN
3323+
/// ```
3324+
/// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-dropdomain.html)
3325+
///
3326+
/// DROP DOMAIN [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
3327+
///
3328+
DropDomain {
3329+
if_exists: bool,
3330+
name: ObjectName,
3331+
drop_behavior: Option<DropBehavior>,
3332+
},
3333+
/// ```sql
33223334
/// DROP PROCEDURE
33233335
/// ```
33243336
DropProcedure {
@@ -5092,6 +5104,21 @@ impl fmt::Display for Statement {
50925104
}
50935105
Ok(())
50945106
}
5107+
Statement::DropDomain {
5108+
if_exists,
5109+
name,
5110+
drop_behavior,
5111+
} => {
5112+
write!(
5113+
f,
5114+
"DROP DOMAIN{} {name}",
5115+
if *if_exists { " IF EXISTS" } else { "" },
5116+
)?;
5117+
if let Some(op) = drop_behavior {
5118+
write!(f, " {op}")?;
5119+
}
5120+
Ok(())
5121+
}
50955122
Statement::DropProcedure {
50965123
if_exists,
50975124
proc_desc,

src/ast/spans.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ impl Spanned for Statement {
454454
Statement::DetachDuckDBDatabase { .. } => Span::empty(),
455455
Statement::Drop { .. } => Span::empty(),
456456
Statement::DropFunction { .. } => Span::empty(),
457+
Statement::DropDomain { .. } => Span::empty(),
457458
Statement::DropProcedure { .. } => Span::empty(),
458459
Statement::DropSecret { .. } => Span::empty(),
459460
Statement::Declare { .. } => Span::empty(),

src/keywords.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ define_keywords!(
286286
DISTRIBUTE,
287287
DIV,
288288
DO,
289+
DOMAIN,
289290
DOUBLE,
290291
DOW,
291292
DOY,

src/parser/mod.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6051,6 +6051,8 @@ impl<'a> Parser<'a> {
60516051
return self.parse_drop_policy();
60526052
} else if self.parse_keyword(Keyword::CONNECTOR) {
60536053
return self.parse_drop_connector();
6054+
} else if self.parse_keyword(Keyword::DOMAIN) {
6055+
return self.parse_drop_domain();
60546056
} else if self.parse_keyword(Keyword::PROCEDURE) {
60556057
return self.parse_drop_procedure();
60566058
} else if self.parse_keyword(Keyword::SECRET) {
@@ -6146,6 +6148,20 @@ impl<'a> Parser<'a> {
61466148
Ok(Statement::DropConnector { if_exists, name })
61476149
}
61486150

6151+
/// ```sql
6152+
/// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
6153+
/// ```
6154+
fn parse_drop_domain(&mut self) -> Result<Statement, ParserError> {
6155+
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6156+
let name = self.parse_object_name(false)?;
6157+
let drop_behavior = self.parse_optional_drop_behavior();
6158+
Ok(Statement::DropDomain {
6159+
if_exists,
6160+
name,
6161+
drop_behavior,
6162+
})
6163+
}
6164+
61496165
/// ```sql
61506166
/// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
61516167
/// [ CASCADE | RESTRICT ]

tests/sqlparser_postgres.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4239,6 +4239,66 @@ fn parse_drop_function() {
42394239
);
42404240
}
42414241

4242+
#[test]
4243+
fn parse_drop_domain() {
4244+
let sql = "DROP DOMAIN IF EXISTS jpeg_domain";
4245+
assert_eq!(
4246+
pg().verified_stmt(sql),
4247+
Statement::DropDomain {
4248+
if_exists: true,
4249+
name: ObjectName::from(vec![Ident {
4250+
value: "jpeg_domain".to_string(),
4251+
quote_style: None,
4252+
span: Span::empty(),
4253+
}]),
4254+
drop_behavior: None
4255+
}
4256+
);
4257+
4258+
let sql = "DROP DOMAIN jpeg_domain";
4259+
assert_eq!(
4260+
pg().verified_stmt(sql),
4261+
Statement::DropDomain {
4262+
if_exists: false,
4263+
name: ObjectName::from(vec![Ident {
4264+
value: "jpeg_domain".to_string(),
4265+
quote_style: None,
4266+
span: Span::empty(),
4267+
}]),
4268+
drop_behavior: None
4269+
}
4270+
);
4271+
4272+
let sql = "DROP DOMAIN IF EXISTS jpeg_domain CASCADE";
4273+
assert_eq!(
4274+
pg().verified_stmt(sql),
4275+
Statement::DropDomain {
4276+
if_exists: true,
4277+
name: ObjectName::from(vec![Ident {
4278+
value: "jpeg_domain".to_string(),
4279+
quote_style: None,
4280+
span: Span::empty(),
4281+
}]),
4282+
drop_behavior: Some(DropBehavior::Cascade)
4283+
}
4284+
);
4285+
4286+
let sql = "DROP DOMAIN IF EXISTS jpeg_domain RESTRICT";
4287+
4288+
assert_eq!(
4289+
pg().verified_stmt(sql),
4290+
Statement::DropDomain {
4291+
if_exists: true,
4292+
name: ObjectName::from(vec![Ident {
4293+
value: "jpeg_domain".to_string(),
4294+
quote_style: None,
4295+
span: Span::empty(),
4296+
}]),
4297+
drop_behavior: Some(DropBehavior::Restrict)
4298+
}
4299+
);
4300+
}
4301+
42424302
#[test]
42434303
fn parse_drop_procedure() {
42444304
let sql = "DROP PROCEDURE IF EXISTS test_proc";

0 commit comments

Comments
 (0)