Skip to content

Commit 8117163

Browse files
vasilev-alexmcheshkov
authored andcommitted
feat: Support expression in SET statement (#7)
Can drop this after rebase on commit 6d8aacd "feat: Support expression in SET statement (apache#574)", first released in 0.21.0
1 parent ec917e3 commit 8117163

File tree

5 files changed

+52
-32
lines changed

5 files changed

+52
-32
lines changed

src/ast/mod.rs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,7 @@ pub enum Statement {
10751075
local: bool,
10761076
hivevar: bool,
10771077
variable: ObjectName,
1078-
value: Vec<SetVariableValue>,
1078+
value: Vec<Expr>,
10791079
},
10801080
/// SET NAMES 'charset_name' [COLLATE 'collation_name']
10811081
///
@@ -2666,23 +2666,6 @@ impl fmt::Display for ShowStatementFilter {
26662666
}
26672667
}
26682668

2669-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
2670-
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2671-
pub enum SetVariableValue {
2672-
Ident(Ident),
2673-
Literal(Value),
2674-
}
2675-
2676-
impl fmt::Display for SetVariableValue {
2677-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2678-
use SetVariableValue::*;
2679-
match self {
2680-
Ident(ident) => write!(f, "{}", ident),
2681-
Literal(literal) => write!(f, "{}", literal),
2682-
}
2683-
}
2684-
}
2685-
26862669
/// Sqlite specific syntax
26872670
///
26882671
/// 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 & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3561,11 +3561,10 @@ impl<'a> Parser<'a> {
35613561
} else if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
35623562
let mut values = vec![];
35633563
loop {
3564-
let token = self.peek_token();
3565-
let value = match (self.parse_value(), token) {
3566-
(Ok(value), _) => SetVariableValue::Literal(value),
3567-
(Err(_), Token::Word(ident)) => SetVariableValue::Ident(ident.to_ident()),
3568-
(Err(_), unexpected) => self.expected("variable value", unexpected)?,
3564+
let value = if let Ok(expr) = self.parse_expr() {
3565+
expr
3566+
} else {
3567+
self.expected("variable value", self.peek_token())?
35693568
};
35703569
values.push(value);
35713570
if self.consume_token(&Token::Comma) {

tests/sqlparser_mysql.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,27 @@ fn parse_show_create() {
215215
}
216216
}
217217

218+
#[test]
219+
fn parse_set_variables() {
220+
mysql_and_generic().verified_stmt("SET sql_mode = CONCAT(@@sql_mode, ',STRICT_TRANS_TABLES')");
221+
222+
assert_eq!(
223+
mysql_and_generic().verified_stmt("SET LOCAL autocommit = 1"),
224+
Statement::SetVariable {
225+
local: true,
226+
hivevar: false,
227+
variable: ObjectName(vec![Ident::new("autocommit")]),
228+
value: vec![Expr::Value(Value::Number(
229+
#[cfg(not(feature = "bigdecimal"))]
230+
"1".into(),
231+
#[cfg(feature = "bigdecimal")]
232+
bigdecimal::BigDecimal::from(1),
233+
false
234+
))],
235+
}
236+
);
237+
}
238+
218239
#[test]
219240
fn parse_create_table_auto_increment() {
220241
let sql = "CREATE TABLE foo (bar INT PRIMARY KEY AUTO_INCREMENT)";

tests/sqlparser_postgres.rs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,10 @@ fn parse_set() {
782782
local: false,
783783
hivevar: false,
784784
variable: ObjectName(vec![Ident::new("a")]),
785-
value: vec![SetVariableValue::Ident("b".into())],
785+
value: vec![Expr::Identifier(Ident {
786+
value: "b".into(),
787+
quote_style: None
788+
})],
786789
}
787790
);
788791

@@ -793,9 +796,7 @@ fn parse_set() {
793796
local: false,
794797
hivevar: false,
795798
variable: ObjectName(vec![Ident::new("a")]),
796-
value: vec![SetVariableValue::Literal(Value::SingleQuotedString(
797-
"b".into()
798-
))],
799+
value: vec![Expr::Value(Value::SingleQuotedString("b".into()))],
799800
}
800801
);
801802

@@ -806,7 +807,13 @@ fn parse_set() {
806807
local: false,
807808
hivevar: false,
808809
variable: ObjectName(vec![Ident::new("a")]),
809-
value: vec![SetVariableValue::Literal(number("0"))],
810+
value: vec![Expr::Value(Value::Number(
811+
#[cfg(not(feature = "bigdecimal"))]
812+
"0".into(),
813+
#[cfg(feature = "bigdecimal")]
814+
bigdecimal::BigDecimal::from(0),
815+
false,
816+
))],
810817
}
811818
);
812819

@@ -817,7 +824,10 @@ fn parse_set() {
817824
local: false,
818825
hivevar: false,
819826
variable: ObjectName(vec![Ident::new("a")]),
820-
value: vec![SetVariableValue::Ident("DEFAULT".into())],
827+
value: vec![Expr::Identifier(Ident {
828+
value: "DEFAULT".into(),
829+
quote_style: None
830+
})],
821831
}
822832
);
823833

@@ -828,7 +838,10 @@ fn parse_set() {
828838
local: true,
829839
hivevar: false,
830840
variable: ObjectName(vec![Ident::new("a")]),
831-
value: vec![SetVariableValue::Ident("b".into())],
841+
value: vec![Expr::Identifier(Ident {
842+
value: "b".into(),
843+
quote_style: None
844+
})],
832845
}
833846
);
834847

@@ -839,7 +852,10 @@ fn parse_set() {
839852
local: false,
840853
hivevar: false,
841854
variable: ObjectName(vec![Ident::new("a"), Ident::new("b"), Ident::new("c")]),
842-
value: vec![SetVariableValue::Ident("b".into())],
855+
value: vec![Expr::Identifier(Ident {
856+
value: "b".into(),
857+
quote_style: None
858+
})],
843859
}
844860
);
845861

@@ -859,7 +875,7 @@ fn parse_set() {
859875
Ident::new("reducer"),
860876
Ident::new("parallelism")
861877
]),
862-
value: vec![SetVariableValue::Literal(Boolean(false))],
878+
value: vec![Expr::Value(Boolean(false))],
863879
}
864880
);
865881

0 commit comments

Comments
 (0)