Skip to content

Commit cc73a24

Browse files
mysql GLOBAL scope/context in SET stmts
1 parent 10cf7c1 commit cc73a24

File tree

7 files changed

+57
-39
lines changed

7 files changed

+57
-39
lines changed

src/ast/mod.rs

+26-7
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use serde::{Deserialize, Serialize};
3737
#[cfg(feature = "visitor")]
3838
use sqlparser_derive::{Visit, VisitMut};
3939

40-
use crate::tokenizer::Span;
40+
use crate::{keywords::Keyword, tokenizer::Span};
4141

4242
pub use self::data_type::{
4343
ArrayElemTypeDef, BinaryLength, CharLengthUnits, CharacterLength, DataType, EnumMember,
@@ -2578,7 +2578,7 @@ pub enum Set {
25782578
/// SQL Standard-style
25792579
/// SET a = 1;
25802580
SingleAssignment {
2581-
local: bool,
2581+
scope: ContextModifier,
25822582
hivevar: bool,
25832583
variable: ObjectName,
25842584
values: Vec<Expr>,
@@ -2660,7 +2660,7 @@ impl Display for Set {
26602660
role_name,
26612661
} => {
26622662
let role_name = role_name.clone().unwrap_or_else(|| Ident::new("NONE"));
2663-
write!(f, "SET{context_modifier} ROLE {role_name}")
2663+
write!(f, "SET {context_modifier}ROLE {role_name}")
26642664
}
26652665
Self::SetSessionParam(kind) => write!(f, "SET {kind}"),
26662666
Self::SetTransaction {
@@ -2707,15 +2707,15 @@ impl Display for Set {
27072707
Ok(())
27082708
}
27092709
Set::SingleAssignment {
2710-
local,
2710+
scope,
27112711
hivevar,
27122712
variable,
27132713
values,
27142714
} => {
27152715
write!(
27162716
f,
27172717
"SET {}{}{} = {}",
2718-
if *local { "LOCAL " } else { "" },
2718+
scope,
27192719
if *hivevar { "HIVEVAR:" } else { "" },
27202720
variable,
27212721
display_comma_separated(values)
@@ -7910,6 +7910,8 @@ pub enum ContextModifier {
79107910
Local,
79117911
/// `SESSION` identifier
79127912
Session,
7913+
/// `GLOBAL` identifier
7914+
Global,
79137915
}
79147916

79157917
impl fmt::Display for ContextModifier {
@@ -7919,11 +7921,28 @@ impl fmt::Display for ContextModifier {
79197921
write!(f, "")
79207922
}
79217923
Self::Local => {
7922-
write!(f, " LOCAL")
7924+
write!(f, "LOCAL ")
79237925
}
79247926
Self::Session => {
7925-
write!(f, " SESSION")
7927+
write!(f, "SESSION ")
79267928
}
7929+
Self::Global => {
7930+
write!(f, "GLOBAL ")
7931+
}
7932+
}
7933+
}
7934+
}
7935+
7936+
impl From<Option<Keyword>> for ContextModifier {
7937+
fn from(kw: Option<Keyword>) -> Self {
7938+
match kw {
7939+
Some(kw) => match kw {
7940+
Keyword::LOCAL => Self::Local,
7941+
Keyword::SESSION => Self::Session,
7942+
Keyword::GLOBAL => Self::Global,
7943+
_ => Self::None,
7944+
},
7945+
None => Self::None,
79277946
}
79287947
}
79297948
}

src/parser/mod.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -11100,11 +11100,7 @@ impl<'a> Parser<'a> {
1110011100
/// Parse a `SET ROLE` statement. Expects SET to be consumed already.
1110111101
fn parse_set_role(&mut self, modifier: Option<Keyword>) -> Result<Statement, ParserError> {
1110211102
self.expect_keyword_is(Keyword::ROLE)?;
11103-
let context_modifier = match modifier {
11104-
Some(Keyword::LOCAL) => ContextModifier::Local,
11105-
Some(Keyword::SESSION) => ContextModifier::Session,
11106-
_ => ContextModifier::None,
11107-
};
11103+
let context_modifier = ContextModifier::from(modifier);
1110811104

1110911105
let role_name = if self.parse_keyword(Keyword::NONE) {
1111011106
None
@@ -11176,8 +11172,12 @@ impl<'a> Parser<'a> {
1117611172
}
1117711173

1117811174
fn parse_set(&mut self) -> Result<Statement, ParserError> {
11179-
let modifier =
11180-
self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
11175+
let modifier = self.parse_one_of_keywords(&[
11176+
Keyword::SESSION,
11177+
Keyword::LOCAL,
11178+
Keyword::HIVEVAR,
11179+
Keyword::GLOBAL,
11180+
]);
1118111181

1118211182
if let Some(Keyword::HIVEVAR) = modifier {
1118311183
self.expect_token(&Token::Colon)?;
@@ -11193,7 +11193,7 @@ impl<'a> Parser<'a> {
1119311193
{
1119411194
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
1119511195
return Ok(Set::SingleAssignment {
11196-
local: modifier == Some(Keyword::LOCAL),
11196+
scope: ContextModifier::from(modifier),
1119711197
hivevar: modifier == Some(Keyword::HIVEVAR),
1119811198
variable: ObjectName::from(vec!["TIMEZONE".into()]),
1119911199
values: self.parse_set_values(false)?,
@@ -11283,7 +11283,7 @@ impl<'a> Parser<'a> {
1128311283
}?;
1128411284

1128511285
Ok(Set::SingleAssignment {
11286-
local: modifier == Some(Keyword::LOCAL),
11286+
scope: ContextModifier::from(modifier),
1128711287
hivevar: modifier == Some(Keyword::HIVEVAR),
1128811288
variable,
1128911289
values,
@@ -11311,7 +11311,7 @@ impl<'a> Parser<'a> {
1131111311
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
1131211312
let stmt = match variables {
1131311313
OneOrManyWithParens::One(var) => Set::SingleAssignment {
11314-
local: modifier == Some(Keyword::LOCAL),
11314+
scope: ContextModifier::from(modifier),
1131511315
hivevar: modifier == Some(Keyword::HIVEVAR),
1131611316
variable: var,
1131711317
values: self.parse_set_values(false)?,

tests/sqlparser_common.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -8627,12 +8627,12 @@ fn parse_set_transaction() {
86278627
fn parse_set_variable() {
86288628
match verified_stmt("SET SOMETHING = '1'") {
86298629
Statement::Set(Set::SingleAssignment {
8630-
local,
8630+
scope,
86318631
hivevar,
86328632
variable,
86338633
values,
86348634
}) => {
8635-
assert!(!local);
8635+
assert_eq!(scope, ContextModifier::None);
86368636
assert!(!hivevar);
86378637
assert_eq!(variable, ObjectName::from(vec!["SOMETHING".into()]));
86388638
assert_eq!(
@@ -8719,12 +8719,12 @@ fn parse_set_variable() {
87198719
fn parse_set_role_as_variable() {
87208720
match verified_stmt("SET role = 'foobar'") {
87218721
Statement::Set(Set::SingleAssignment {
8722-
local,
8722+
scope,
87238723
hivevar,
87248724
variable,
87258725
values,
87268726
}) => {
8727-
assert!(!local);
8727+
assert_eq!(scope, ContextModifier::None);
87288728
assert!(!hivevar);
87298729
assert_eq!(variable, ObjectName::from(vec!["role".into()]));
87308730
assert_eq!(
@@ -8766,12 +8766,12 @@ fn parse_double_colon_cast_at_timezone() {
87668766
fn parse_set_time_zone() {
87678767
match verified_stmt("SET TIMEZONE = 'UTC'") {
87688768
Statement::Set(Set::SingleAssignment {
8769-
local,
8769+
scope,
87708770
hivevar,
87718771
variable,
87728772
values,
87738773
}) => {
8774-
assert!(!local);
8774+
assert_eq!(scope, ContextModifier::None);
87758775
assert!(!hivevar);
87768776
assert_eq!(variable, ObjectName::from(vec!["TIMEZONE".into()]));
87778777
assert_eq!(

tests/sqlparser_hive.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
//! is also tested (on the inputs it can handle).
2222
2323
use sqlparser::ast::{
24-
ClusteredBy, CommentDef, CreateFunction, CreateFunctionBody, CreateFunctionUsing, CreateTable,
25-
Expr, Function, FunctionArgumentList, FunctionArguments, Ident, ObjectName, OrderByExpr,
26-
OrderByOptions, SelectItem, Set, Statement, TableFactor, UnaryOperator, Use, Value,
24+
ClusteredBy, CommentDef, ContextModifier, CreateFunction, CreateFunctionBody,
25+
CreateFunctionUsing, CreateTable, Expr, Function, FunctionArgumentList, FunctionArguments,
26+
Ident, ObjectName, OrderByExpr, OrderByOptions, SelectItem, Set, Statement, TableFactor,
27+
UnaryOperator, Use, Value,
2728
};
2829
use sqlparser::dialect::{GenericDialect, HiveDialect, MsSqlDialect};
2930
use sqlparser::parser::ParserError;
@@ -369,7 +370,7 @@ fn set_statement_with_minus() {
369370
assert_eq!(
370371
hive().verified_stmt("SET hive.tez.java.opts = -Xmx4g"),
371372
Statement::Set(Set::SingleAssignment {
372-
local: false,
373+
scope: ContextModifier::None,
373374
hivevar: false,
374375
variable: ObjectName::from(vec![
375376
Ident::new("hive"),

tests/sqlparser_mssql.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,7 @@ fn parse_mssql_declare() {
12511251
}]
12521252
},
12531253
Statement::Set(Set::SingleAssignment {
1254-
local: false,
1254+
scope: ContextModifier::None,
12551255
hivevar: false,
12561256
variable: ObjectName::from(vec![Ident::new("@bar")]),
12571257
values: vec![Expr::Value(

tests/sqlparser_mysql.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ fn parse_set_variables() {
618618
assert_eq!(
619619
mysql_and_generic().verified_stmt("SET LOCAL autocommit = 1"),
620620
Statement::Set(Set::SingleAssignment {
621-
local: true,
621+
scope: ContextModifier::Local,
622622
hivevar: false,
623623
variable: ObjectName::from(vec!["autocommit".into()]),
624624
values: vec![Expr::value(number("1"))],

tests/sqlparser_postgres.rs

+8-10
Original file line numberDiff line numberDiff line change
@@ -988,8 +988,7 @@ fn parse_create_schema_if_not_exists() {
988988
Statement::CreateSchema {
989989
if_not_exists: true,
990990
schema_name,
991-
options: _,
992-
default_collate_spec: _,
991+
..
993992
} => assert_eq!("schema_name", schema_name.to_string()),
994993
_ => unreachable!(),
995994
}
@@ -1433,7 +1432,7 @@ fn parse_set() {
14331432
assert_eq!(
14341433
stmt,
14351434
Statement::Set(Set::SingleAssignment {
1436-
local: false,
1435+
scope: ContextModifier::None,
14371436
hivevar: false,
14381437
variable: ObjectName::from(vec![Ident::new("a")]),
14391438
values: vec![Expr::Identifier(Ident {
@@ -1448,7 +1447,7 @@ fn parse_set() {
14481447
assert_eq!(
14491448
stmt,
14501449
Statement::Set(Set::SingleAssignment {
1451-
local: false,
1450+
scope: ContextModifier::None,
14521451
hivevar: false,
14531452
variable: ObjectName::from(vec![Ident::new("a")]),
14541453
values: vec![Expr::Value(
@@ -1461,7 +1460,7 @@ fn parse_set() {
14611460
assert_eq!(
14621461
stmt,
14631462
Statement::Set(Set::SingleAssignment {
1464-
local: false,
1463+
scope: ContextModifier::None,
14651464
hivevar: false,
14661465
variable: ObjectName::from(vec![Ident::new("a")]),
14671466
values: vec![Expr::value(number("0"))],
@@ -1472,7 +1471,7 @@ fn parse_set() {
14721471
assert_eq!(
14731472
stmt,
14741473
Statement::Set(Set::SingleAssignment {
1475-
local: false,
1474+
scope: ContextModifier::None,
14761475
hivevar: false,
14771476
variable: ObjectName::from(vec![Ident::new("a")]),
14781477
values: vec![Expr::Identifier(Ident::new("DEFAULT"))],
@@ -1483,7 +1482,7 @@ fn parse_set() {
14831482
assert_eq!(
14841483
stmt,
14851484
Statement::Set(Set::SingleAssignment {
1486-
local: true,
1485+
scope: ContextModifier::Local,
14871486
hivevar: false,
14881487
variable: ObjectName::from(vec![Ident::new("a")]),
14891488
values: vec![Expr::Identifier("b".into())],
@@ -1494,7 +1493,7 @@ fn parse_set() {
14941493
assert_eq!(
14951494
stmt,
14961495
Statement::Set(Set::SingleAssignment {
1497-
local: false,
1496+
scope: ContextModifier::None,
14981497
hivevar: false,
14991498
variable: ObjectName::from(vec![Ident::new("a"), Ident::new("b"), Ident::new("c")]),
15001499
values: vec![Expr::Identifier(Ident {
@@ -1512,7 +1511,7 @@ fn parse_set() {
15121511
assert_eq!(
15131512
stmt,
15141513
Statement::Set(Set::SingleAssignment {
1515-
local: false,
1514+
scope: ContextModifier::None,
15161515
hivevar: false,
15171516
variable: ObjectName::from(vec![
15181517
Ident::new("hive"),
@@ -1526,7 +1525,6 @@ fn parse_set() {
15261525
);
15271526

15281527
pg_and_generic().one_statement_parses_to("SET a TO b", "SET a = b");
1529-
pg_and_generic().one_statement_parses_to("SET SESSION a = b", "SET a = b");
15301528

15311529
assert_eq!(
15321530
pg_and_generic().parse_sql_statements("SET"),

0 commit comments

Comments
 (0)