Skip to content

Commit 6d63c04

Browse files
vasilev-alexMazterQyou
authored andcommitted
feat: Support expression in SET statement (#7)
1 parent b098e2d commit 6d63c04

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
@@ -2193,32 +2193,15 @@ impl fmt::Display for ShowStatementFilter {
21932193
}
21942194
}
21952195

2196-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
2197-
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2198-
pub enum SetVariableValue {
2199-
Ident(Ident),
2200-
Literal(Value),
2201-
}
2202-
22032196
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
22042197
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
22052198
pub struct SetVariableKeyValue {
22062199
pub key: Ident,
2207-
pub value: Vec<SetVariableValue>,
2200+
pub value: Vec<Expr>,
22082201
pub local: bool,
22092202
pub hivevar: bool,
22102203
}
22112204

2212-
impl fmt::Display for SetVariableValue {
2213-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2214-
use SetVariableValue::*;
2215-
match self {
2216-
Ident(ident) => write!(f, "{}", ident),
2217-
Literal(literal) => write!(f, "{}", literal),
2218-
}
2219-
}
2220-
}
2221-
22222205
/// Sqlite specific syntax
22232206
///
22242207
/// 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
@@ -3194,8 +3194,8 @@ impl<'a> Parser<'a> {
31943194
let mut values = vec![];
31953195

31963196
loop {
3197-
let value = if let Ok(value) = self.parse_value() {
3198-
SetVariableValue::Literal(value)
3197+
let value = if let Ok(expr) = self.parse_expr() {
3198+
expr
31993199
} else {
32003200
self.expected("variable value", self.peek_token())?
32013201
};
@@ -3224,8 +3224,8 @@ impl<'a> Parser<'a> {
32243224
let mut values = vec![];
32253225

32263226
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
3227-
let value = if let Ok(value) = self.parse_value() {
3228-
SetVariableValue::Literal(value)
3227+
let value = if let Ok(expr) = self.parse_expr() {
3228+
expr
32293229
} else {
32303230
self.expected("variable value", self.peek_token())?
32313231
};

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
@@ -779,7 +779,10 @@ fn parse_set() {
779779
Statement::SetVariable {
780780
key_values: [SetVariableKeyValue {
781781
key: "a".into(),
782-
value: vec![SetVariableValue::Ident("b".into())],
782+
value: vec![Expr::Identifier(Ident {
783+
value: "b".into(),
784+
quote_style: None
785+
})],
783786
local: false,
784787
hivevar: false,
785788
}]
@@ -795,9 +798,7 @@ fn parse_set() {
795798
local: false,
796799
hivevar: false,
797800
key: "a".into(),
798-
value: vec![SetVariableValue::Literal(Value::SingleQuotedString(
799-
"b".into()
800-
))],
801+
value: vec![Expr::Value(Value::SingleQuotedString("b".into()))],
801802
}]
802803
.to_vec()
803804
}
@@ -811,7 +812,7 @@ fn parse_set() {
811812
local: false,
812813
hivevar: false,
813814
key: "a".into(),
814-
value: vec![SetVariableValue::Literal(number("0"))],
815+
value: vec![Expr::Value(Value::Number("0".into(), false))],
815816
}]
816817
.to_vec()
817818
}
@@ -825,7 +826,10 @@ fn parse_set() {
825826
local: false,
826827
hivevar: false,
827828
key: "a".into(),
828-
value: vec![SetVariableValue::Ident("DEFAULT".into())],
829+
value: vec![Expr::Identifier(Ident {
830+
value: "DEFAULT".into(),
831+
quote_style: None
832+
})],
829833
}]
830834
.to_vec()
831835
}
@@ -839,7 +843,10 @@ fn parse_set() {
839843
local: true,
840844
hivevar: false,
841845
key: "a".into(),
842-
value: vec![SetVariableValue::Ident("b".into())],
846+
value: vec![Expr::Identifier(Ident {
847+
value: "b".into(),
848+
quote_style: None
849+
})],
843850
}]
844851
.to_vec()
845852
}

0 commit comments

Comments
 (0)