Skip to content

Commit 0fa0ace

Browse files
Snowflake: parse top-level UNSET (single / parenthesized session variables)
1 parent b7529a2 commit 0fa0ace

3 files changed

Lines changed: 33 additions & 0 deletions

File tree

src/ast/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3797,6 +3797,16 @@ pub enum Statement {
37973797
Analyze(Analyze),
37983798
/// `SET` statements (session, transaction, timezone, etc.).
37993799
Set(Set),
3800+
/// Snowflake `UNSET` of one or more session variables.
3801+
///
3802+
/// ```sql
3803+
/// UNSET v
3804+
/// UNSET (v1, v2)
3805+
/// ```
3806+
Unset {
3807+
/// Session variable names to remove.
3808+
names: Vec<ObjectName>,
3809+
},
38003810
/// ```sql
38013811
/// TRUNCATE
38023812
/// ```
@@ -6377,6 +6387,13 @@ impl fmt::Display for Statement {
63776387
Ok(())
63786388
}
63796389
Self::Set(set) => write!(f, "{set}"),
6390+
Statement::Unset { names } => {
6391+
if names.len() == 1 {
6392+
write!(f, "UNSET {}", names[0])
6393+
} else {
6394+
write!(f, "UNSET ({})", display_comma_separated(names))
6395+
}
6396+
}
63806397
Statement::ShowVariable { variable } => {
63816398
write!(f, "SHOW")?;
63826399
if !variable.is_empty() {

src/ast/spans.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ impl Spanned for Statement {
439439
Statement::Flush { .. } => Span::empty(),
440440
Statement::Discard { .. } => Span::empty(),
441441
Statement::Set(_) => Span::empty(),
442+
Statement::Unset { .. } => Span::empty(),
442443
Statement::ShowFunctions { .. } => Span::empty(),
443444
Statement::ShowVariable { .. } => Span::empty(),
444445
Statement::ShowStatus { .. } => Span::empty(),

src/parser/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,7 @@ impl<'a> Parser<'a> {
667667
}
668668
Keyword::CLOSE => self.parse_close(),
669669
Keyword::SET => self.parse_set(),
670+
Keyword::UNSET if dialect_of!(self is SnowflakeDialect) => self.parse_unset(),
670671
Keyword::SHOW => self.parse_show(),
671672
Keyword::USE => self.parse_use(),
672673
Keyword::GRANT => self.parse_grant().map(Into::into),
@@ -15740,6 +15741,20 @@ impl<'a> Parser<'a> {
1574015741
Ok(SetAssignment { scope, name, value })
1574115742
}
1574215743

15744+
/// Parse a Snowflake top-level `UNSET v` / `UNSET (v1, v2)` statement.
15745+
fn parse_unset(&mut self) -> Result<Statement, ParserError> {
15746+
let names = if self.consume_token(&Token::LParen) {
15747+
let names = self.parse_comma_separated(|parser: &mut Parser<'a>| {
15748+
Ok(ObjectName::from(vec![parser.parse_identifier()?]))
15749+
})?;
15750+
self.expect_token(&Token::RParen)?;
15751+
names
15752+
} else {
15753+
vec![self.parse_object_name(false)?]
15754+
};
15755+
Ok(Statement::Unset { names })
15756+
}
15757+
1574315758
fn parse_set(&mut self) -> Result<Statement, ParserError> {
1574415759
let hivevar = self.parse_keyword(Keyword::HIVEVAR);
1574515760

0 commit comments

Comments
 (0)