@@ -1822,12 +1822,12 @@ impl<'a> Parser<'a> {
1822
1822
})
1823
1823
}
1824
1824
1825
- fn keyword_to_modifier(k: Option< Keyword> ) -> ContextModifier {
1825
+ fn keyword_to_modifier(k: Keyword) -> Option< ContextModifier> {
1826
1826
match k {
1827
- Some( Keyword::LOCAL) => ContextModifier::Local,
1828
- Some( Keyword::GLOBAL) => ContextModifier::Global,
1829
- Some( Keyword::SESSION) => ContextModifier::Session,
1830
- _ => ContextModifier:: None,
1827
+ Keyword::LOCAL => Some( ContextModifier::Local) ,
1828
+ Keyword::GLOBAL => Some( ContextModifier::Global) ,
1829
+ Keyword::SESSION => Some( ContextModifier::Session) ,
1830
+ _ => None,
1831
1831
}
1832
1832
}
1833
1833
@@ -11157,17 +11157,19 @@ impl<'a> Parser<'a> {
11157
11157
}
11158
11158
11159
11159
/// Parse a `SET ROLE` statement. Expects SET to be consumed already.
11160
- fn parse_set_role(&mut self, modifier: Option<Keyword>) -> Result<Statement, ParserError> {
11160
+ fn parse_set_role(
11161
+ &mut self,
11162
+ modifier: Option<ContextModifier>,
11163
+ ) -> Result<Statement, ParserError> {
11161
11164
self.expect_keyword_is(Keyword::ROLE)?;
11162
- let context_modifier = Self::keyword_to_modifier(modifier);
11163
11165
11164
11166
let role_name = if self.parse_keyword(Keyword::NONE) {
11165
11167
None
11166
11168
} else {
11167
11169
Some(self.parse_identifier()?)
11168
11170
};
11169
11171
Ok(Statement::Set(Set::SetRole {
11170
- context_modifier,
11172
+ context_modifier: modifier ,
11171
11173
role_name,
11172
11174
}))
11173
11175
}
@@ -11203,46 +11205,52 @@ impl<'a> Parser<'a> {
11203
11205
}
11204
11206
}
11205
11207
11206
- fn parse_set_assignment(
11207
- &mut self,
11208
- ) -> Result<(OneOrManyWithParens<ObjectName>, Expr), ParserError> {
11209
- let variables = if self.dialect.supports_parenthesized_set_variables()
11208
+ fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
11209
+ let modifier =
11210
+ self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
11211
+
11212
+ Self::keyword_to_modifier(modifier)
11213
+ }
11214
+
11215
+ /// Parse a single SET statement assignment `var = expr`.
11216
+ fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
11217
+ let scope = self.parse_context_modifier();
11218
+
11219
+ let name = if self.dialect.supports_parenthesized_set_variables()
11210
11220
&& self.consume_token(&Token::LParen)
11211
11221
{
11212
- let vars = OneOrManyWithParens::Many(
11213
- self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
11214
- .into_iter()
11215
- .map(|ident| ObjectName::from(vec![ident]))
11216
- .collect(),
11217
- );
11218
- self.expect_token(&Token::RParen)?;
11219
- vars
11222
+ // Parenthesized assignments are handled in the `parse_set` function after
11223
+ // trying to parse list of assignments using this function.
11224
+ // If a dialect supports both, and we find a LParen, we early exit from this function.
11225
+ self.expected("Unparenthesized assignment", self.peek_token())?
11220
11226
} else {
11221
- OneOrManyWithParens::One( self.parse_object_name(false)?)
11227
+ self.parse_object_name(false)?
11222
11228
};
11223
11229
11224
11230
if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
11225
11231
return self.expected("assignment operator", self.peek_token());
11226
11232
}
11227
11233
11228
- let values = self.parse_expr()?;
11234
+ let value = self.parse_expr()?;
11229
11235
11230
- Ok((variables, values) )
11236
+ Ok(SetAssignment { scope, name, value } )
11231
11237
}
11232
11238
11233
11239
fn parse_set(&mut self) -> Result<Statement, ParserError> {
11234
- let modifier = self.parse_one_of_keywords(&[
11235
- Keyword::SESSION,
11236
- Keyword::LOCAL,
11237
- Keyword::HIVEVAR,
11238
- Keyword::GLOBAL,
11239
- ]);
11240
-
11241
- if let Some(Keyword::HIVEVAR) = modifier {
11240
+ let hivevar = self.parse_keyword(Keyword::HIVEVAR);
11241
+
11242
+ // Modifier is either HIVEVAR: or a ContextModifier (LOCAL, SESSION, etc), not both
11243
+ let scope = if !hivevar {
11244
+ self.parse_context_modifier()
11245
+ } else {
11246
+ None
11247
+ };
11248
+
11249
+ if hivevar {
11242
11250
self.expect_token(&Token::Colon)?;
11243
11251
}
11244
11252
11245
- if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(modifier ))? {
11253
+ if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope ))? {
11246
11254
return Ok(set_role_stmt);
11247
11255
}
11248
11256
@@ -11252,8 +11260,8 @@ impl<'a> Parser<'a> {
11252
11260
{
11253
11261
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
11254
11262
return Ok(Set::SingleAssignment {
11255
- scope: Self::keyword_to_modifier(modifier) ,
11256
- hivevar: modifier == Some(Keyword::HIVEVAR) ,
11263
+ scope,
11264
+ hivevar,
11257
11265
variable: ObjectName::from(vec!["TIMEZONE".into()]),
11258
11266
values: self.parse_set_values(false)?,
11259
11267
}
@@ -11263,7 +11271,7 @@ impl<'a> Parser<'a> {
11263
11271
// the assignment operator. It's originally PostgreSQL specific,
11264
11272
// but we allow it for all the dialects
11265
11273
return Ok(Set::SetTimeZone {
11266
- local: modifier == Some(Keyword::LOCAL ),
11274
+ local: scope == Some(ContextModifier::Local ),
11267
11275
value: self.parse_expr()?,
11268
11276
}
11269
11277
.into());
@@ -11311,41 +11319,26 @@ impl<'a> Parser<'a> {
11311
11319
}
11312
11320
11313
11321
if self.dialect.supports_comma_separated_set_assignments() {
11322
+ if scope.is_some() {
11323
+ self.prev_token();
11324
+ }
11325
+
11314
11326
if let Some(assignments) = self
11315
11327
.maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
11316
11328
{
11317
11329
return if assignments.len() > 1 {
11318
- let assignments = assignments
11319
- .into_iter()
11320
- .map(|(var, val)| match var {
11321
- OneOrManyWithParens::One(v) => Ok(SetAssignment {
11322
- name: v,
11323
- value: val,
11324
- }),
11325
- OneOrManyWithParens::Many(_) => {
11326
- self.expected("List of single identifiers", self.peek_token())
11327
- }
11328
- })
11329
- .collect::<Result<_, _>>()?;
11330
-
11331
11330
Ok(Set::MultipleAssignments { assignments }.into())
11332
11331
} else {
11333
- let (vars, values): (Vec<_>, Vec<_>) = assignments.into_iter().unzip();
11334
-
11335
- let variable = match vars.into_iter().next() {
11336
- Some(OneOrManyWithParens::One(v)) => Ok(v),
11337
- Some(OneOrManyWithParens::Many(_)) => self.expected(
11338
- "Single assignment or list of assignments",
11339
- self.peek_token(),
11340
- ),
11341
- None => self.expected("At least one identifier", self.peek_token()),
11342
- }?;
11332
+ let SetAssignment { scope, name, value } =
11333
+ assignments.into_iter().next().ok_or_else(|| {
11334
+ ParserError::ParserError("Expected at least one assignment".to_string())
11335
+ })?;
11343
11336
11344
11337
Ok(Set::SingleAssignment {
11345
- scope: Self::keyword_to_modifier(modifier) ,
11346
- hivevar: modifier == Some(Keyword::HIVEVAR) ,
11347
- variable,
11348
- values,
11338
+ scope,
11339
+ hivevar,
11340
+ variable: name ,
11341
+ values: vec![value] ,
11349
11342
}
11350
11343
.into())
11351
11344
};
@@ -11370,8 +11363,8 @@ impl<'a> Parser<'a> {
11370
11363
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
11371
11364
let stmt = match variables {
11372
11365
OneOrManyWithParens::One(var) => Set::SingleAssignment {
11373
- scope: Self::keyword_to_modifier(modifier) ,
11374
- hivevar: modifier == Some(Keyword::HIVEVAR) ,
11366
+ scope,
11367
+ hivevar,
11375
11368
variable: var,
11376
11369
values: self.parse_set_values(false)?,
11377
11370
},
0 commit comments