Skip to content

Commit 238b64a

Browse files
vasilev-alexMazterQyou
authored andcommitted
feat: Support expression in SET statement (#7)
1 parent 1d88900 commit 238b64a

File tree

5 files changed

+26
-39
lines changed

5 files changed

+26
-39
lines changed

src/ast/mod.rs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,32 +2159,15 @@ impl fmt::Display for ShowStatementFilter {
21592159
}
21602160
}
21612161

2162-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
2163-
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2164-
pub enum SetVariableValue {
2165-
Ident(Ident),
2166-
Literal(Value),
2167-
}
2168-
21692162
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
21702163
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
21712164
pub struct SetVariableKeyValue {
21722165
pub key: Ident,
2173-
pub value: Vec<SetVariableValue>,
2166+
pub value: Vec<Expr>,
21742167
pub local: bool,
21752168
pub hivevar: bool,
21762169
}
21772170

2178-
impl fmt::Display for SetVariableValue {
2179-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2180-
use SetVariableValue::*;
2181-
match self {
2182-
Ident(ident) => write!(f, "{}", ident),
2183-
Literal(literal) => write!(f, "{}", literal),
2184-
}
2185-
}
2186-
}
2187-
21882171
/// Sqlite specific syntax
21892172
///
21902173
/// https://sqlite.org/lang_conflict.html

src/dialect/mysql.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ impl Dialect for MySqlDialect {
2424
|| ('A'..='Z').contains(&ch)
2525
|| ch == '_'
2626
|| ch == '$'
27+
|| ch == '@'
2728
|| ('\u{0080}'..='\u{ffff}').contains(&ch)
2829
}
2930

src/parser.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3052,8 +3052,8 @@ impl<'a> Parser<'a> {
30523052
let mut values = vec![];
30533053

30543054
loop {
3055-
let value = if let Ok(value) = self.parse_value() {
3056-
SetVariableValue::Literal(value)
3055+
let value = if let Ok(expr) = self.parse_expr() {
3056+
expr
30573057
} else {
30583058
self.expected("variable value", self.peek_token())?
30593059
};
@@ -3082,8 +3082,8 @@ impl<'a> Parser<'a> {
30823082
let mut values = vec![];
30833083

30843084
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
3085-
let value = if let Ok(value) = self.parse_value() {
3086-
SetVariableValue::Literal(value)
3085+
let value = if let Ok(expr) = self.parse_expr() {
3086+
expr
30873087
} else {
30883088
self.expected("variable value", self.peek_token())?
30893089
};

tests/sqlparser_mysql.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -131,41 +131,37 @@ fn parse_set_transaction() {
131131

132132
#[test]
133133
fn parse_set_variables() {
134-
let stmt = mysql_and_generic().verified_stmt("SET autocommit = 1, sql_mode = 'test'");
135-
136134
assert_eq!(
137-
stmt,
135+
mysql_and_generic().verified_stmt("SET autocommit = 1, sql_mode = 'test'"),
138136
Statement::SetVariable {
139137
key_values: [
140138
SetVariableKeyValue {
141139
local: false,
142140
hivevar: false,
143141
key: "autocommit".into(),
144-
value: vec![SetVariableValue::Literal(number("1"))],
142+
value: vec![Expr::Value(Value::Number("1".into(), false))],
145143
},
146144
SetVariableKeyValue {
147145
local: false,
148146
hivevar: false,
149147
key: "sql_mode".into(),
150-
value: vec![SetVariableValue::Literal(Value::SingleQuotedString(
151-
"test".into()
152-
))],
148+
value: vec![Expr::Value(Value::SingleQuotedString("test".into()))],
153149
}
154150
]
155151
.to_vec()
156152
}
157153
);
158154

159-
let stmt = mysql_and_generic().verified_stmt("SET LOCAL autocommit = 1");
155+
mysql_and_generic().verified_stmt("SET sql_mode = CONCAT(@@sql_mode, ',STRICT_TRANS_TABLES')");
160156

161157
assert_eq!(
162-
stmt,
158+
mysql_and_generic().verified_stmt("SET LOCAL autocommit = 1"),
163159
Statement::SetVariable {
164160
key_values: [SetVariableKeyValue {
165161
local: true,
166162
hivevar: false,
167163
key: "autocommit".into(),
168-
value: vec![SetVariableValue::Literal(number("1"))],
164+
value: vec![Expr::Value(Value::Number("1".into(), false))],
169165
},]
170166
.to_vec()
171167
}

tests/sqlparser_postgres.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,10 @@ fn parse_set() {
466466
Statement::SetVariable {
467467
key_values: [SetVariableKeyValue {
468468
key: "a".into(),
469-
value: vec![SetVariableValue::Ident("b".into())],
469+
value: vec![Expr::Identifier(Ident {
470+
value: "b".into(),
471+
quote_style: None
472+
})],
470473
local: false,
471474
hivevar: false,
472475
}]
@@ -482,9 +485,7 @@ fn parse_set() {
482485
local: false,
483486
hivevar: false,
484487
key: "a".into(),
485-
value: vec![SetVariableValue::Literal(Value::SingleQuotedString(
486-
"b".into()
487-
))],
488+
value: vec![Expr::Value(Value::SingleQuotedString("b".into()))],
488489
}]
489490
.to_vec()
490491
}
@@ -498,7 +499,7 @@ fn parse_set() {
498499
local: false,
499500
hivevar: false,
500501
key: "a".into(),
501-
value: vec![SetVariableValue::Literal(number("0"))],
502+
value: vec![Expr::Value(Value::Number("0".into(), false))],
502503
}]
503504
.to_vec()
504505
}
@@ -512,7 +513,10 @@ fn parse_set() {
512513
local: false,
513514
hivevar: false,
514515
key: "a".into(),
515-
value: vec![SetVariableValue::Ident("DEFAULT".into())],
516+
value: vec![Expr::Identifier(Ident {
517+
value: "DEFAULT".into(),
518+
quote_style: None
519+
})],
516520
}]
517521
.to_vec()
518522
}
@@ -526,7 +530,10 @@ fn parse_set() {
526530
local: true,
527531
hivevar: false,
528532
key: "a".into(),
529-
value: vec![SetVariableValue::Ident("b".into())],
533+
value: vec![Expr::Identifier(Ident {
534+
value: "b".into(),
535+
quote_style: None
536+
})],
530537
}]
531538
.to_vec()
532539
}

0 commit comments

Comments
 (0)