Skip to content

Commit 6d057ef

Browse files
authored
set: allow dots in variables by moving to ObjectName (#484)
Signed-off-by: Maciej Obuchowski <obuchowski.maciej@gmail.com>
1 parent 835bb2f commit 6d057ef

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

src/ast/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ pub enum Statement {
921921
SetVariable {
922922
local: bool,
923923
hivevar: bool,
924-
variable: Ident,
924+
variable: ObjectName,
925925
value: Vec<SetVariableValue>,
926926
},
927927
/// SHOW <variable>

src/parser.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3266,7 +3266,7 @@ impl<'a> Parser<'a> {
32663266
});
32673267
}
32683268

3269-
let variable = self.parse_identifier()?;
3269+
let variable = self.parse_object_name()?;
32703270
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
32713271
let mut values = vec![];
32723272
loop {
@@ -3287,14 +3287,14 @@ impl<'a> Parser<'a> {
32873287
value: values,
32883288
});
32893289
}
3290-
} else if variable.value == "CHARACTERISTICS" {
3290+
} else if variable.to_string() == "CHARACTERISTICS" {
32913291
self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
32923292
Ok(Statement::SetTransaction {
32933293
modes: self.parse_transaction_modes()?,
32943294
snapshot: None,
32953295
session: true,
32963296
})
3297-
} else if variable.value == "TRANSACTION" && modifier.is_none() {
3297+
} else if variable.to_string() == "TRANSACTION" && modifier.is_none() {
32983298
if self.parse_keyword(Keyword::SNAPSHOT) {
32993299
let snaphot_id = self.parse_value()?;
33003300
return Ok(Statement::SetTransaction {

tests/sqlparser_postgres.rs

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
mod test_utils;
1919
use test_utils::*;
2020

21+
use sqlparser::ast::Value::Boolean;
2122
use sqlparser::ast::*;
2223
use sqlparser::dialect::{GenericDialect, PostgreSqlDialect};
2324
use sqlparser::parser::ParserError;
@@ -780,7 +781,7 @@ fn parse_set() {
780781
Statement::SetVariable {
781782
local: false,
782783
hivevar: false,
783-
variable: "a".into(),
784+
variable: ObjectName(vec![Ident::new("a")]),
784785
value: vec![SetVariableValue::Ident("b".into())],
785786
}
786787
);
@@ -791,7 +792,7 @@ fn parse_set() {
791792
Statement::SetVariable {
792793
local: false,
793794
hivevar: false,
794-
variable: "a".into(),
795+
variable: ObjectName(vec![Ident::new("a")]),
795796
value: vec![SetVariableValue::Literal(Value::SingleQuotedString(
796797
"b".into()
797798
))],
@@ -804,7 +805,7 @@ fn parse_set() {
804805
Statement::SetVariable {
805806
local: false,
806807
hivevar: false,
807-
variable: "a".into(),
808+
variable: ObjectName(vec![Ident::new("a")]),
808809
value: vec![SetVariableValue::Literal(number("0"))],
809810
}
810811
);
@@ -815,7 +816,7 @@ fn parse_set() {
815816
Statement::SetVariable {
816817
local: false,
817818
hivevar: false,
818-
variable: "a".into(),
819+
variable: ObjectName(vec![Ident::new("a")]),
819820
value: vec![SetVariableValue::Ident("DEFAULT".into())],
820821
}
821822
);
@@ -826,11 +827,42 @@ fn parse_set() {
826827
Statement::SetVariable {
827828
local: true,
828829
hivevar: false,
829-
variable: "a".into(),
830+
variable: ObjectName(vec![Ident::new("a")]),
830831
value: vec![SetVariableValue::Ident("b".into())],
831832
}
832833
);
833834

835+
let stmt = pg_and_generic().verified_stmt("SET a.b.c = b");
836+
assert_eq!(
837+
stmt,
838+
Statement::SetVariable {
839+
local: false,
840+
hivevar: false,
841+
variable: ObjectName(vec![Ident::new("a"), Ident::new("b"), Ident::new("c")]),
842+
value: vec![SetVariableValue::Ident("b".into())],
843+
}
844+
);
845+
846+
let stmt = pg_and_generic().one_statement_parses_to(
847+
"SET hive.tez.auto.reducer.parallelism=false",
848+
"SET hive.tez.auto.reducer.parallelism = false",
849+
);
850+
assert_eq!(
851+
stmt,
852+
Statement::SetVariable {
853+
local: false,
854+
hivevar: false,
855+
variable: ObjectName(vec![
856+
Ident::new("hive"),
857+
Ident::new("tez"),
858+
Ident::new("auto"),
859+
Ident::new("reducer"),
860+
Ident::new("parallelism")
861+
]),
862+
value: vec![SetVariableValue::Literal(Boolean(false))],
863+
}
864+
);
865+
834866
pg_and_generic().one_statement_parses_to("SET a TO b", "SET a = b");
835867
pg_and_generic().one_statement_parses_to("SET SESSION a = b", "SET a = b");
836868

0 commit comments

Comments
 (0)