Skip to content

Commit f69407b

Browse files
authored
Add support for INSERT INTO VALUE (#2085)
1 parent c439ee9 commit f69407b

File tree

8 files changed

+64
-13
lines changed

8 files changed

+64
-13
lines changed

src/ast/query.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3135,12 +3135,18 @@ pub struct Values {
31353135
/// Was there an explicit ROWs keyword (MySQL)?
31363136
/// <https://dev.mysql.com/doc/refman/8.0/en/values.html>
31373137
pub explicit_row: bool,
3138+
// MySql supports both VALUES and VALUE keywords.
3139+
// <https://dev.mysql.com/doc/refman/9.2/en/insert.html>
3140+
pub value_keyword: bool,
31383141
pub rows: Vec<Vec<Expr>>,
31393142
}
31403143

31413144
impl fmt::Display for Values {
31423145
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3143-
f.write_str("VALUES")?;
3146+
match self.value_keyword {
3147+
true => f.write_str("VALUE")?,
3148+
false => f.write_str("VALUES")?,
3149+
};
31443150
let prefix = if self.explicit_row { "ROW" } else { "" };
31453151
let mut delim = "";
31463152
for row in &self.rows {

src/ast/spans.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ impl Spanned for Values {
223223
fn span(&self) -> Span {
224224
let Values {
225225
explicit_row: _, // bool,
226+
value_keyword: _,
226227
rows,
227228
} = self;
228229

src/parser/mod.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12533,7 +12533,10 @@ impl<'a> Parser<'a> {
1253312533
SetExpr::Query(subquery)
1253412534
} else if self.parse_keyword(Keyword::VALUES) {
1253512535
let is_mysql = dialect_of!(self is MySqlDialect);
12536-
SetExpr::Values(self.parse_values(is_mysql)?)
12536+
SetExpr::Values(self.parse_values(is_mysql, false)?)
12537+
} else if self.parse_keyword(Keyword::VALUE) {
12538+
let is_mysql = dialect_of!(self is MySqlDialect);
12539+
SetExpr::Values(self.parse_values(is_mysql, true)?)
1253712540
} else if self.parse_keyword(Keyword::TABLE) {
1253812541
SetExpr::Table(Box::new(self.parse_as_table()?))
1253912542
} else {
@@ -13837,7 +13840,7 @@ impl<'a> Parser<'a> {
1383713840
// Snowflake and Databricks allow syntax like below:
1383813841
// SELECT * FROM VALUES (1, 'a'), (2, 'b') AS t (col1, col2)
1383913842
// where there are no parentheses around the VALUES clause.
13840-
let values = SetExpr::Values(self.parse_values(false)?);
13843+
let values = SetExpr::Values(self.parse_values(false, false)?);
1384113844
let alias = self.maybe_parse_table_alias()?;
1384213845
Ok(TableFactor::Derived {
1384313846
lateral: false,
@@ -16504,7 +16507,11 @@ impl<'a> Parser<'a> {
1650416507
})
1650516508
}
1650616509

16507-
pub fn parse_values(&mut self, allow_empty: bool) -> Result<Values, ParserError> {
16510+
pub fn parse_values(
16511+
&mut self,
16512+
allow_empty: bool,
16513+
value_keyword: bool,
16514+
) -> Result<Values, ParserError> {
1650816515
let mut explicit_row = false;
1650916516

1651016517
let rows = self.parse_comma_separated(|parser| {
@@ -16522,7 +16529,11 @@ impl<'a> Parser<'a> {
1652216529
Ok(exprs)
1652316530
}
1652416531
})?;
16525-
Ok(Values { explicit_row, rows })
16532+
Ok(Values {
16533+
explicit_row,
16534+
rows,
16535+
value_keyword,
16536+
})
1652616537
}
1652716538

1652816539
pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
@@ -16937,7 +16948,7 @@ impl<'a> Parser<'a> {
1693716948
MergeInsertKind::Row
1693816949
} else {
1693916950
self.expect_keyword_is(Keyword::VALUES)?;
16940-
let values = self.parse_values(is_mysql)?;
16951+
let values = self.parse_values(is_mysql, false)?;
1694116952
MergeInsertKind::Values(values)
1694216953
};
1694316954
MergeAction::Insert(MergeInsertExpr { columns, kind })

tests/sqlparser_bigquery.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,6 +1807,7 @@ fn parse_merge() {
18071807
let insert_action = MergeAction::Insert(MergeInsertExpr {
18081808
columns: vec![Ident::new("product"), Ident::new("quantity")],
18091809
kind: MergeInsertKind::Values(Values {
1810+
value_keyword: false,
18101811
explicit_row: false,
18111812
rows: vec![vec![Expr::value(number("1")), Expr::value(number("2"))]],
18121813
}),
@@ -1951,6 +1952,7 @@ fn parse_merge() {
19511952
action: MergeAction::Insert(MergeInsertExpr {
19521953
columns: vec![Ident::new("a"), Ident::new("b"),],
19531954
kind: MergeInsertKind::Values(Values {
1955+
value_keyword: false,
19541956
explicit_row: false,
19551957
rows: vec![vec![
19561958
Expr::value(number("1")),
@@ -1965,6 +1967,7 @@ fn parse_merge() {
19651967
action: MergeAction::Insert(MergeInsertExpr {
19661968
columns: vec![],
19671969
kind: MergeInsertKind::Values(Values {
1970+
value_keyword: false,
19681971
explicit_row: false,
19691972
rows: vec![vec![
19701973
Expr::value(number("1")),

tests/sqlparser_common.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,33 +106,44 @@ fn parse_insert_values() {
106106
let rows2 = vec![row.clone(), row];
107107

108108
let sql = "INSERT customer VALUES (1, 2, 3)";
109-
check_one(sql, "customer", &[], &rows1);
109+
check_one(sql, "customer", &[], &rows1, false);
110110

111111
let sql = "INSERT INTO customer VALUES (1, 2, 3)";
112-
check_one(sql, "customer", &[], &rows1);
112+
check_one(sql, "customer", &[], &rows1, false);
113113

114114
let sql = "INSERT INTO customer VALUES (1, 2, 3), (1, 2, 3)";
115-
check_one(sql, "customer", &[], &rows2);
115+
check_one(sql, "customer", &[], &rows2, false);
116116

117117
let sql = "INSERT INTO public.customer VALUES (1, 2, 3)";
118-
check_one(sql, "public.customer", &[], &rows1);
118+
check_one(sql, "public.customer", &[], &rows1, false);
119119

120120
let sql = "INSERT INTO db.public.customer VALUES (1, 2, 3)";
121-
check_one(sql, "db.public.customer", &[], &rows1);
121+
check_one(sql, "db.public.customer", &[], &rows1, false);
122122

123123
let sql = "INSERT INTO public.customer (id, name, active) VALUES (1, 2, 3)";
124124
check_one(
125125
sql,
126126
"public.customer",
127127
&["id".to_string(), "name".to_string(), "active".to_string()],
128128
&rows1,
129+
false,
130+
);
131+
132+
let sql = r"INSERT INTO t (id, name, active) VALUE (1, 2, 3)";
133+
check_one(
134+
sql,
135+
"t",
136+
&["id".to_string(), "name".to_string(), "active".to_string()],
137+
&rows1,
138+
true,
129139
);
130140

131141
fn check_one(
132142
sql: &str,
133143
expected_table_name: &str,
134144
expected_columns: &[String],
135145
expected_rows: &[Vec<Expr>],
146+
expected_value_keyword: bool,
136147
) {
137148
match verified_stmt(sql) {
138149
Statement::Insert(Insert {
@@ -147,8 +158,13 @@ fn parse_insert_values() {
147158
assert_eq!(column, &Ident::new(expected_columns[index].clone()));
148159
}
149160
match *source.body {
150-
SetExpr::Values(Values { rows, .. }) => {
151-
assert_eq!(rows.as_slice(), expected_rows)
161+
SetExpr::Values(Values {
162+
rows,
163+
value_keyword,
164+
..
165+
}) => {
166+
assert_eq!(rows.as_slice(), expected_rows);
167+
assert!(value_keyword == expected_value_keyword);
152168
}
153169
_ => unreachable!(),
154170
}
@@ -9908,6 +9924,7 @@ fn parse_merge() {
99089924
action: MergeAction::Insert(MergeInsertExpr {
99099925
columns: vec![Ident::new("A"), Ident::new("B"), Ident::new("C")],
99109926
kind: MergeInsertKind::Values(Values {
9927+
value_keyword: false,
99119928
explicit_row: false,
99129929
rows: vec![vec![
99139930
Expr::CompoundIdentifier(vec![

tests/sqlparser_databricks.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ fn test_databricks_lambdas() {
157157
#[test]
158158
fn test_values_clause() {
159159
let values = Values {
160+
value_keyword: false,
160161
explicit_row: false,
161162
rows: vec![
162163
vec![

tests/sqlparser_mysql.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,6 +1885,7 @@ fn parse_simple_insert() {
18851885
Some(Box::new(Query {
18861886
with: None,
18871887
body: Box::new(SetExpr::Values(Values {
1888+
value_keyword: false,
18881889
explicit_row: false,
18891890
rows: vec![
18901891
vec![
@@ -1950,6 +1951,7 @@ fn parse_ignore_insert() {
19501951
Some(Box::new(Query {
19511952
with: None,
19521953
body: Box::new(SetExpr::Values(Values {
1954+
value_keyword: false,
19531955
explicit_row: false,
19541956
rows: vec![vec![
19551957
Expr::Value(
@@ -1999,6 +2001,7 @@ fn parse_priority_insert() {
19992001
Some(Box::new(Query {
20002002
with: None,
20012003
body: Box::new(SetExpr::Values(Values {
2004+
value_keyword: false,
20022005
explicit_row: false,
20032006
rows: vec![vec![
20042007
Expr::Value(
@@ -2045,6 +2048,7 @@ fn parse_priority_insert() {
20452048
Some(Box::new(Query {
20462049
with: None,
20472050
body: Box::new(SetExpr::Values(Values {
2051+
value_keyword: false,
20482052
explicit_row: false,
20492053
rows: vec![vec![
20502054
Expr::Value(
@@ -2097,6 +2101,7 @@ fn parse_insert_as() {
20972101
Some(Box::new(Query {
20982102
with: None,
20992103
body: Box::new(SetExpr::Values(Values {
2104+
value_keyword: false,
21002105
explicit_row: false,
21012106
rows: vec![vec![Expr::Value(
21022107
(Value::SingleQuotedString("2024-01-01".to_string())).with_empty_span()
@@ -2156,6 +2161,7 @@ fn parse_insert_as() {
21562161
Some(Box::new(Query {
21572162
with: None,
21582163
body: Box::new(SetExpr::Values(Values {
2164+
value_keyword: false,
21592165
explicit_row: false,
21602166
rows: vec![vec![
21612167
Expr::value(number("1")),
@@ -2206,6 +2212,7 @@ fn parse_replace_insert() {
22062212
Some(Box::new(Query {
22072213
with: None,
22082214
body: Box::new(SetExpr::Values(Values {
2215+
value_keyword: false,
22092216
explicit_row: false,
22102217
rows: vec![vec![
22112218
Expr::Value(
@@ -2253,6 +2260,7 @@ fn parse_empty_row_insert() {
22532260
Some(Box::new(Query {
22542261
with: None,
22552262
body: Box::new(SetExpr::Values(Values {
2263+
value_keyword: false,
22562264
explicit_row: false,
22572265
rows: vec![vec![], vec![]]
22582266
})),
@@ -2303,6 +2311,7 @@ fn parse_insert_with_on_duplicate_update() {
23032311
Some(Box::new(Query {
23042312
with: None,
23052313
body: Box::new(SetExpr::Values(Values {
2314+
value_keyword: false,
23062315
explicit_row: false,
23072316
rows: vec![vec![
23082317
Expr::Value(

tests/sqlparser_postgres.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5169,6 +5169,7 @@ fn test_simple_postgres_insert_with_alias() {
51695169
source: Some(Box::new(Query {
51705170
with: None,
51715171
body: Box::new(SetExpr::Values(Values {
5172+
value_keyword: false,
51725173
explicit_row: false,
51735174
rows: vec![vec![
51745175
Expr::Identifier(Ident::new("DEFAULT")),
@@ -5238,6 +5239,7 @@ fn test_simple_postgres_insert_with_alias() {
52385239
source: Some(Box::new(Query {
52395240
with: None,
52405241
body: Box::new(SetExpr::Values(Values {
5242+
value_keyword: false,
52415243
explicit_row: false,
52425244
rows: vec![vec![
52435245
Expr::Identifier(Ident::new("DEFAULT")),
@@ -5309,6 +5311,7 @@ fn test_simple_insert_with_quoted_alias() {
53095311
source: Some(Box::new(Query {
53105312
with: None,
53115313
body: Box::new(SetExpr::Values(Values {
5314+
value_keyword: false,
53125315
explicit_row: false,
53135316
rows: vec![vec![
53145317
Expr::Identifier(Ident::new("DEFAULT")),

0 commit comments

Comments
 (0)