Skip to content

Commit ce2e5b9

Browse files
Snowflake: parse top-level UNSET (single / parenthesized session variables)
1 parent 43c42ab commit ce2e5b9

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
/// ```
@@ -6389,6 +6399,13 @@ impl fmt::Display for Statement {
63896399
Ok(())
63906400
}
63916401
Self::Set(set) => write!(f, "{set}"),
6402+
Statement::Unset { names } => {
6403+
if names.len() == 1 {
6404+
write!(f, "UNSET {}", names[0])
6405+
} else {
6406+
write!(f, "UNSET ({})", display_comma_separated(names))
6407+
}
6408+
}
63926409
Statement::ShowVariable { variable } => {
63936410
write!(f, "SHOW")?;
63946411
if !variable.is_empty() {

src/ast/spans.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ impl Spanned for Statement {
440440
Statement::Flush { .. } => Span::empty(),
441441
Statement::Discard { .. } => Span::empty(),
442442
Statement::Set(_) => Span::empty(),
443+
Statement::Unset { .. } => Span::empty(),
443444
Statement::ShowFunctions { .. } => Span::empty(),
444445
Statement::ShowVariable { .. } => Span::empty(),
445446
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),
@@ -15735,6 +15736,20 @@ impl<'a> Parser<'a> {
1573515736
Ok(SetAssignment { scope, name, value })
1573615737
}
1573715738

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

0 commit comments

Comments
 (0)