Skip to content

Commit 8777585

Browse files
Add GLOBAL context/modifier to SET statements
1 parent 6ec5223 commit 8777585

File tree

7 files changed

+58
-41
lines changed

7 files changed

+58
-41
lines changed

src/ast/mod.rs

+26-10
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,
@@ -2942,7 +2942,7 @@ pub enum Statement {
29422942
/// least MySQL and PostgreSQL. Not all MySQL-specific syntactic forms are
29432943
/// supported yet.
29442944
SetVariable {
2945-
local: bool,
2945+
scope: ContextModifier,
29462946
hivevar: bool,
29472947
variables: OneOrManyWithParens<ObjectName>,
29482948
value: Vec<Expr>,
@@ -4649,22 +4649,19 @@ impl fmt::Display for Statement {
46494649
role_name,
46504650
} => {
46514651
let role_name = role_name.clone().unwrap_or_else(|| Ident::new("NONE"));
4652-
write!(f, "SET{context_modifier} ROLE {role_name}")
4652+
write!(f, "SET {context_modifier}ROLE {role_name}",)
46534653
}
46544654
Statement::SetVariable {
4655-
local,
4655+
scope,
46564656
variables,
46574657
hivevar,
46584658
value,
46594659
} => {
46604660
f.write_str("SET ")?;
4661-
if *local {
4662-
f.write_str("LOCAL ")?;
4663-
}
46644661
let parenthesized = matches!(variables, OneOrManyWithParens::Many(_));
46654662
write!(
46664663
f,
4667-
"{hivevar}{name} = {l_paren}{value}{r_paren}",
4664+
"{scope}{hivevar}{name} = {l_paren}{value}{r_paren}",
46684665
hivevar = if *hivevar { "HIVEVAR:" } else { "" },
46694666
name = variables,
46704667
l_paren = parenthesized.then_some("(").unwrap_or_default(),
@@ -7624,6 +7621,8 @@ pub enum ContextModifier {
76247621
Local,
76257622
/// `SESSION` identifier
76267623
Session,
7624+
/// `GLOBAL` identifier
7625+
Global,
76277626
}
76287627

76297628
impl fmt::Display for ContextModifier {
@@ -7633,15 +7632,32 @@ impl fmt::Display for ContextModifier {
76337632
write!(f, "")
76347633
}
76357634
Self::Local => {
7636-
write!(f, " LOCAL")
7635+
write!(f, "LOCAL ")
76377636
}
76387637
Self::Session => {
7639-
write!(f, " SESSION")
7638+
write!(f, "SESSION ")
7639+
}
7640+
Self::Global => {
7641+
write!(f, "GLOBAL ")
76407642
}
76417643
}
76427644
}
76437645
}
76447646

7647+
impl From<Option<Keyword>> for ContextModifier {
7648+
fn from(kw: Option<Keyword>) -> Self {
7649+
match kw {
7650+
Some(kw) => match kw {
7651+
Keyword::LOCAL => Self::Local,
7652+
Keyword::SESSION => Self::Session,
7653+
Keyword::GLOBAL => Self::Global,
7654+
_ => Self::None,
7655+
},
7656+
None => Self::None,
7657+
}
7658+
}
7659+
}
7660+
76457661
/// Function describe in DROP FUNCTION.
76467662
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
76477663
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]

src/parser/mod.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -10944,26 +10944,28 @@ impl<'a> Parser<'a> {
1094410944
/// Parse a `SET ROLE` statement. Expects SET to be consumed already.
1094510945
fn parse_set_role(&mut self, modifier: Option<Keyword>) -> Result<Statement, ParserError> {
1094610946
self.expect_keyword_is(Keyword::ROLE)?;
10947-
let context_modifier = match modifier {
10948-
Some(Keyword::LOCAL) => ContextModifier::Local,
10949-
Some(Keyword::SESSION) => ContextModifier::Session,
10950-
_ => ContextModifier::None,
10951-
};
10947+
let context_modifier = ContextModifier::from(modifier);
1095210948

1095310949
let role_name = if self.parse_keyword(Keyword::NONE) {
1095410950
None
1095510951
} else {
1095610952
Some(self.parse_identifier()?)
1095710953
};
10954+
1095810955
Ok(Statement::SetRole {
1095910956
context_modifier,
1096010957
role_name,
1096110958
})
1096210959
}
1096310960

1096410961
pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
10965-
let modifier =
10966-
self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
10962+
let modifier = self.parse_one_of_keywords(&[
10963+
Keyword::SESSION,
10964+
Keyword::LOCAL,
10965+
Keyword::HIVEVAR,
10966+
Keyword::GLOBAL,
10967+
]);
10968+
1096710969
if let Some(Keyword::HIVEVAR) = modifier {
1096810970
self.expect_token(&Token::Colon)?;
1096910971
} else if let Some(set_role_stmt) =
@@ -11035,7 +11037,7 @@ impl<'a> Parser<'a> {
1103511037
self.expect_token(&Token::RParen)?;
1103611038
}
1103711039
return Ok(Statement::SetVariable {
11038-
local: modifier == Some(Keyword::LOCAL),
11040+
scope: ContextModifier::from(modifier),
1103911041
hivevar: Some(Keyword::HIVEVAR) == modifier,
1104011042
variables,
1104111043
value: values,

tests/sqlparser_common.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -8552,12 +8552,12 @@ fn parse_set_transaction() {
85528552
fn parse_set_variable() {
85538553
match verified_stmt("SET SOMETHING = '1'") {
85548554
Statement::SetVariable {
8555-
local,
8555+
scope,
85568556
hivevar,
85578557
variables,
85588558
value,
85598559
} => {
8560-
assert!(!local);
8560+
assert_eq!(scope, ContextModifier::None);
85618561
assert!(!hivevar);
85628562
assert_eq!(
85638563
variables,
@@ -8577,12 +8577,12 @@ fn parse_set_variable() {
85778577
let sql = r#"SET (a, b, c) = (1, 2, 3)"#;
85788578
match multi_variable_dialects.verified_stmt(sql) {
85798579
Statement::SetVariable {
8580-
local,
8580+
scope,
85818581
hivevar,
85828582
variables,
85838583
value,
85848584
} => {
8585-
assert!(!local);
8585+
assert_eq!(scope, ContextModifier::None);
85868586
assert!(!hivevar);
85878587
assert_eq!(
85888588
variables,
@@ -8654,12 +8654,12 @@ fn parse_set_variable() {
86548654
fn parse_set_role_as_variable() {
86558655
match verified_stmt("SET role = 'foobar'") {
86568656
Statement::SetVariable {
8657-
local,
8657+
scope,
86588658
hivevar,
86598659
variables,
86608660
value,
86618661
} => {
8662-
assert!(!local);
8662+
assert_eq!(scope, ContextModifier::None);
86638663
assert!(!hivevar);
86648664
assert_eq!(
86658665
variables,
@@ -8704,12 +8704,12 @@ fn parse_double_colon_cast_at_timezone() {
87048704
fn parse_set_time_zone() {
87058705
match verified_stmt("SET TIMEZONE = 'UTC'") {
87068706
Statement::SetVariable {
8707-
local,
8707+
scope,
87088708
hivevar,
87098709
variables: variable,
87108710
value,
87118711
} => {
8712-
assert!(!local);
8712+
assert_eq!(scope, ContextModifier::None);
87138713
assert!(!hivevar);
87148714
assert_eq!(
87158715
variable,

tests/sqlparser_hive.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,10 +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,
26-
OneOrManyWithParens, OrderByExpr, OrderByOptions, SelectItem, Statement, TableFactor,
27-
UnaryOperator, Use, Value,
24+
ClusteredBy, CommentDef, ContextModifier, CreateFunction, CreateFunctionBody,
25+
CreateFunctionUsing, CreateTable, Expr, Function, FunctionArgumentList, FunctionArguments,
26+
Ident, ObjectName, OneOrManyWithParens, OrderByExpr, OrderByOptions, SelectItem, Statement,
27+
TableFactor, UnaryOperator, Use, Value,
2828
};
2929
use sqlparser::dialect::{GenericDialect, HiveDialect, MsSqlDialect};
3030
use sqlparser::parser::ParserError;
@@ -370,7 +370,7 @@ fn set_statement_with_minus() {
370370
assert_eq!(
371371
hive().verified_stmt("SET hive.tez.java.opts = -Xmx4g"),
372372
Statement::SetVariable {
373-
local: false,
373+
scope: ContextModifier::None,
374374
hivevar: false,
375375
variables: OneOrManyWithParens::One(ObjectName::from(vec![
376376
Ident::new("hive"),

tests/sqlparser_mssql.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,7 @@ fn parse_mssql_declare() {
12551255
}]
12561256
},
12571257
Statement::SetVariable {
1258-
local: false,
1258+
scope: ContextModifier::None,
12591259
hivevar: false,
12601260
variables: OneOrManyWithParens::One(ObjectName::from(vec![Ident::new("@bar")])),
12611261
value: 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::SetVariable {
621-
local: true,
621+
scope: ContextModifier::Local,
622622
hivevar: false,
623623
variables: OneOrManyWithParens::One(ObjectName::from(vec!["autocommit".into()])),
624624
value: vec![Expr::value(number("1"))],

tests/sqlparser_postgres.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -1433,7 +1433,7 @@ fn parse_set() {
14331433
assert_eq!(
14341434
stmt,
14351435
Statement::SetVariable {
1436-
local: false,
1436+
scope: ContextModifier::None,
14371437
hivevar: false,
14381438
variables: OneOrManyWithParens::One(ObjectName::from(vec![Ident::new("a")])),
14391439
value: vec![Expr::Identifier(Ident {
@@ -1448,7 +1448,7 @@ fn parse_set() {
14481448
assert_eq!(
14491449
stmt,
14501450
Statement::SetVariable {
1451-
local: false,
1451+
scope: ContextModifier::None,
14521452
hivevar: false,
14531453
variables: OneOrManyWithParens::One(ObjectName::from(vec![Ident::new("a")])),
14541454
value: vec![Expr::Value(
@@ -1461,7 +1461,7 @@ fn parse_set() {
14611461
assert_eq!(
14621462
stmt,
14631463
Statement::SetVariable {
1464-
local: false,
1464+
scope: ContextModifier::None,
14651465
hivevar: false,
14661466
variables: OneOrManyWithParens::One(ObjectName::from(vec![Ident::new("a")])),
14671467
value: vec![Expr::value(number("0"))],
@@ -1472,7 +1472,7 @@ fn parse_set() {
14721472
assert_eq!(
14731473
stmt,
14741474
Statement::SetVariable {
1475-
local: false,
1475+
scope: ContextModifier::None,
14761476
hivevar: false,
14771477
variables: OneOrManyWithParens::One(ObjectName::from(vec![Ident::new("a")])),
14781478
value: vec![Expr::Identifier(Ident::new("DEFAULT"))],
@@ -1483,7 +1483,7 @@ fn parse_set() {
14831483
assert_eq!(
14841484
stmt,
14851485
Statement::SetVariable {
1486-
local: true,
1486+
scope: ContextModifier::Local,
14871487
hivevar: false,
14881488
variables: OneOrManyWithParens::One(ObjectName::from(vec![Ident::new("a")])),
14891489
value: vec![Expr::Identifier("b".into())],
@@ -1494,7 +1494,7 @@ fn parse_set() {
14941494
assert_eq!(
14951495
stmt,
14961496
Statement::SetVariable {
1497-
local: false,
1497+
scope: ContextModifier::None,
14981498
hivevar: false,
14991499
variables: OneOrManyWithParens::One(ObjectName::from(vec![
15001500
Ident::new("a"),
@@ -1516,7 +1516,7 @@ fn parse_set() {
15161516
assert_eq!(
15171517
stmt,
15181518
Statement::SetVariable {
1519-
local: false,
1519+
scope: ContextModifier::None,
15201520
hivevar: false,
15211521
variables: OneOrManyWithParens::One(ObjectName::from(vec![
15221522
Ident::new("hive"),
@@ -1530,7 +1530,6 @@ fn parse_set() {
15301530
);
15311531

15321532
pg_and_generic().one_statement_parses_to("SET a TO b", "SET a = b");
1533-
pg_and_generic().one_statement_parses_to("SET SESSION a = b", "SET a = b");
15341533

15351534
assert_eq!(
15361535
pg_and_generic().parse_sql_statements("SET"),

0 commit comments

Comments
 (0)