mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-04 14:28:22 +00:00
Added support for DROP DOMAIN
(#1828)
This commit is contained in:
parent
e5d2215267
commit
483394cd1a
5 changed files with 114 additions and 0 deletions
|
@ -3321,6 +3321,14 @@ pub enum Statement {
|
||||||
drop_behavior: Option<DropBehavior>,
|
drop_behavior: Option<DropBehavior>,
|
||||||
},
|
},
|
||||||
/// ```sql
|
/// ```sql
|
||||||
|
/// DROP DOMAIN
|
||||||
|
/// ```
|
||||||
|
/// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-dropdomain.html)
|
||||||
|
///
|
||||||
|
/// DROP DOMAIN [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
|
||||||
|
///
|
||||||
|
DropDomain(DropDomain),
|
||||||
|
/// ```sql
|
||||||
/// DROP PROCEDURE
|
/// DROP PROCEDURE
|
||||||
/// ```
|
/// ```
|
||||||
DropProcedure {
|
DropProcedure {
|
||||||
|
@ -5094,6 +5102,21 @@ impl fmt::Display for Statement {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Statement::DropDomain(DropDomain {
|
||||||
|
if_exists,
|
||||||
|
name,
|
||||||
|
drop_behavior,
|
||||||
|
}) => {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"DROP DOMAIN{} {name}",
|
||||||
|
if *if_exists { " IF EXISTS" } else { "" },
|
||||||
|
)?;
|
||||||
|
if let Some(op) = drop_behavior {
|
||||||
|
write!(f, " {op}")?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Statement::DropProcedure {
|
Statement::DropProcedure {
|
||||||
if_exists,
|
if_exists,
|
||||||
proc_desc,
|
proc_desc,
|
||||||
|
@ -6829,6 +6852,19 @@ impl fmt::Display for CloseCursor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A Drop Domain statement
|
||||||
|
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
||||||
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
|
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
|
||||||
|
pub struct DropDomain {
|
||||||
|
/// Whether to drop the domain if it exists
|
||||||
|
pub if_exists: bool,
|
||||||
|
/// The name of the domain to drop
|
||||||
|
pub name: ObjectName,
|
||||||
|
/// The behavior to apply when dropping the domain
|
||||||
|
pub drop_behavior: Option<DropBehavior>,
|
||||||
|
}
|
||||||
|
|
||||||
/// A function call
|
/// A function call
|
||||||
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
||||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
|
|
|
@ -455,6 +455,7 @@ impl Spanned for Statement {
|
||||||
Statement::DetachDuckDBDatabase { .. } => Span::empty(),
|
Statement::DetachDuckDBDatabase { .. } => Span::empty(),
|
||||||
Statement::Drop { .. } => Span::empty(),
|
Statement::Drop { .. } => Span::empty(),
|
||||||
Statement::DropFunction { .. } => Span::empty(),
|
Statement::DropFunction { .. } => Span::empty(),
|
||||||
|
Statement::DropDomain { .. } => Span::empty(),
|
||||||
Statement::DropProcedure { .. } => Span::empty(),
|
Statement::DropProcedure { .. } => Span::empty(),
|
||||||
Statement::DropSecret { .. } => Span::empty(),
|
Statement::DropSecret { .. } => Span::empty(),
|
||||||
Statement::Declare { .. } => Span::empty(),
|
Statement::Declare { .. } => Span::empty(),
|
||||||
|
|
|
@ -288,6 +288,7 @@ define_keywords!(
|
||||||
DISTRIBUTE,
|
DISTRIBUTE,
|
||||||
DIV,
|
DIV,
|
||||||
DO,
|
DO,
|
||||||
|
DOMAIN,
|
||||||
DOUBLE,
|
DOUBLE,
|
||||||
DOW,
|
DOW,
|
||||||
DOY,
|
DOY,
|
||||||
|
|
|
@ -6070,6 +6070,8 @@ impl<'a> Parser<'a> {
|
||||||
return self.parse_drop_policy();
|
return self.parse_drop_policy();
|
||||||
} else if self.parse_keyword(Keyword::CONNECTOR) {
|
} else if self.parse_keyword(Keyword::CONNECTOR) {
|
||||||
return self.parse_drop_connector();
|
return self.parse_drop_connector();
|
||||||
|
} else if self.parse_keyword(Keyword::DOMAIN) {
|
||||||
|
return self.parse_drop_domain();
|
||||||
} else if self.parse_keyword(Keyword::PROCEDURE) {
|
} else if self.parse_keyword(Keyword::PROCEDURE) {
|
||||||
return self.parse_drop_procedure();
|
return self.parse_drop_procedure();
|
||||||
} else if self.parse_keyword(Keyword::SECRET) {
|
} else if self.parse_keyword(Keyword::SECRET) {
|
||||||
|
@ -6165,6 +6167,20 @@ impl<'a> Parser<'a> {
|
||||||
Ok(Statement::DropConnector { if_exists, name })
|
Ok(Statement::DropConnector { if_exists, name })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ```sql
|
||||||
|
/// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
|
||||||
|
/// ```
|
||||||
|
fn parse_drop_domain(&mut self) -> Result<Statement, ParserError> {
|
||||||
|
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
||||||
|
let name = self.parse_object_name(false)?;
|
||||||
|
let drop_behavior = self.parse_optional_drop_behavior();
|
||||||
|
Ok(Statement::DropDomain(DropDomain {
|
||||||
|
if_exists,
|
||||||
|
name,
|
||||||
|
drop_behavior,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
/// ```sql
|
/// ```sql
|
||||||
/// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
|
/// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
|
||||||
/// [ CASCADE | RESTRICT ]
|
/// [ CASCADE | RESTRICT ]
|
||||||
|
|
|
@ -4241,6 +4241,66 @@ fn parse_drop_function() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_drop_domain() {
|
||||||
|
let sql = "DROP DOMAIN IF EXISTS jpeg_domain";
|
||||||
|
assert_eq!(
|
||||||
|
pg().verified_stmt(sql),
|
||||||
|
Statement::DropDomain(DropDomain {
|
||||||
|
if_exists: true,
|
||||||
|
name: ObjectName::from(vec![Ident {
|
||||||
|
value: "jpeg_domain".to_string(),
|
||||||
|
quote_style: None,
|
||||||
|
span: Span::empty(),
|
||||||
|
}]),
|
||||||
|
drop_behavior: None
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let sql = "DROP DOMAIN jpeg_domain";
|
||||||
|
assert_eq!(
|
||||||
|
pg().verified_stmt(sql),
|
||||||
|
Statement::DropDomain(DropDomain {
|
||||||
|
if_exists: false,
|
||||||
|
name: ObjectName::from(vec![Ident {
|
||||||
|
value: "jpeg_domain".to_string(),
|
||||||
|
quote_style: None,
|
||||||
|
span: Span::empty(),
|
||||||
|
}]),
|
||||||
|
drop_behavior: None
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let sql = "DROP DOMAIN IF EXISTS jpeg_domain CASCADE";
|
||||||
|
assert_eq!(
|
||||||
|
pg().verified_stmt(sql),
|
||||||
|
Statement::DropDomain(DropDomain {
|
||||||
|
if_exists: true,
|
||||||
|
name: ObjectName::from(vec![Ident {
|
||||||
|
value: "jpeg_domain".to_string(),
|
||||||
|
quote_style: None,
|
||||||
|
span: Span::empty(),
|
||||||
|
}]),
|
||||||
|
drop_behavior: Some(DropBehavior::Cascade)
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let sql = "DROP DOMAIN IF EXISTS jpeg_domain RESTRICT";
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
pg().verified_stmt(sql),
|
||||||
|
Statement::DropDomain(DropDomain {
|
||||||
|
if_exists: true,
|
||||||
|
name: ObjectName::from(vec![Ident {
|
||||||
|
value: "jpeg_domain".to_string(),
|
||||||
|
quote_style: None,
|
||||||
|
span: Span::empty(),
|
||||||
|
}]),
|
||||||
|
drop_behavior: Some(DropBehavior::Restrict)
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_drop_procedure() {
|
fn parse_drop_procedure() {
|
||||||
let sql = "DROP PROCEDURE IF EXISTS test_proc";
|
let sql = "DROP PROCEDURE IF EXISTS test_proc";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue