Skip to content

Commit 483394c

Browse files
Added support for DROP DOMAIN (#1828)
1 parent e5d2215 commit 483394c

File tree

5 files changed

+114
-0
lines changed

5 files changed

+114
-0
lines changed

src/ast/mod.rs

+36
Original file line numberDiff line numberDiff line change
@@ -3321,6 +3321,14 @@ pub enum Statement {
33213321
drop_behavior: Option<DropBehavior>,
33223322
},
33233323
/// ```sql
3324+
/// DROP DOMAIN
3325+
/// ```
3326+
/// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-dropdomain.html)
3327+
///
3328+
/// DROP DOMAIN [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
3329+
///
3330+
DropDomain(DropDomain),
3331+
/// ```sql
33243332
/// DROP PROCEDURE
33253333
/// ```
33263334
DropProcedure {
@@ -5094,6 +5102,21 @@ impl fmt::Display for Statement {
50945102
}
50955103
Ok(())
50965104
}
5105+
Statement::DropDomain(DropDomain {
5106+
if_exists,
5107+
name,
5108+
drop_behavior,
5109+
}) => {
5110+
write!(
5111+
f,
5112+
"DROP DOMAIN{} {name}",
5113+
if *if_exists { " IF EXISTS" } else { "" },
5114+
)?;
5115+
if let Some(op) = drop_behavior {
5116+
write!(f, " {op}")?;
5117+
}
5118+
Ok(())
5119+
}
50975120
Statement::DropProcedure {
50985121
if_exists,
50995122
proc_desc,
@@ -6829,6 +6852,19 @@ impl fmt::Display for CloseCursor {
68296852
}
68306853
}
68316854

6855+
/// A Drop Domain statement
6856+
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
6857+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
6858+
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
6859+
pub struct DropDomain {
6860+
/// Whether to drop the domain if it exists
6861+
pub if_exists: bool,
6862+
/// The name of the domain to drop
6863+
pub name: ObjectName,
6864+
/// The behavior to apply when dropping the domain
6865+
pub drop_behavior: Option<DropBehavior>,
6866+
}
6867+
68326868
/// A function call
68336869
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
68346870
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]

src/ast/spans.rs

+1
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ impl Spanned for Statement {
455455
Statement::DetachDuckDBDatabase { .. } => Span::empty(),
456456
Statement::Drop { .. } => Span::empty(),
457457
Statement::DropFunction { .. } => Span::empty(),
458+
Statement::DropDomain { .. } => Span::empty(),
458459
Statement::DropProcedure { .. } => Span::empty(),
459460
Statement::DropSecret { .. } => Span::empty(),
460461
Statement::Declare { .. } => Span::empty(),

src/keywords.rs

+1
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ define_keywords!(
288288
DISTRIBUTE,
289289
DIV,
290290
DO,
291+
DOMAIN,
291292
DOUBLE,
292293
DOW,
293294
DOY,

src/parser/mod.rs

+16
Original file line numberDiff line numberDiff line change
@@ -6070,6 +6070,8 @@ impl<'a> Parser<'a> {
60706070
return self.parse_drop_policy();
60716071
} else if self.parse_keyword(Keyword::CONNECTOR) {
60726072
return self.parse_drop_connector();
6073+
} else if self.parse_keyword(Keyword::DOMAIN) {
6074+
return self.parse_drop_domain();
60736075
} else if self.parse_keyword(Keyword::PROCEDURE) {
60746076
return self.parse_drop_procedure();
60756077
} else if self.parse_keyword(Keyword::SECRET) {
@@ -6165,6 +6167,20 @@ impl<'a> Parser<'a> {
61656167
Ok(Statement::DropConnector { if_exists, name })
61666168
}
61676169

6170+
/// ```sql
6171+
/// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
6172+
/// ```
6173+
fn parse_drop_domain(&mut self) -> Result<Statement, ParserError> {
6174+
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6175+
let name = self.parse_object_name(false)?;
6176+
let drop_behavior = self.parse_optional_drop_behavior();
6177+
Ok(Statement::DropDomain(DropDomain {
6178+
if_exists,
6179+
name,
6180+
drop_behavior,
6181+
}))
6182+
}
6183+
61686184
/// ```sql
61696185
/// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
61706186
/// [ CASCADE | RESTRICT ]

tests/sqlparser_postgres.rs

+60
Original file line numberDiff line numberDiff line change
@@ -4241,6 +4241,66 @@ fn parse_drop_function() {
42414241
);
42424242
}
42434243

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

0 commit comments

Comments
 (0)