Skip to content

Commit 819cf4d

Browse files
committed
update merge test
1 parent c8f3487 commit 819cf4d

8 files changed

Lines changed: 50 additions & 88 deletions

File tree

src/ast/dml.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ pub enum MergeInsertKind {
649649
/// ```
650650
/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_statement)
651651
Row,
652-
/// The insert expression uses the `*` shorthand to insert all columns.
652+
/// The insert expression uses the `*` wildcard to insert all columns.
653653
///
654654
/// Example:
655655
/// ```sql
@@ -668,7 +668,7 @@ impl Display for MergeInsertKind {
668668
MergeInsertKind::Row => {
669669
write!(f, "ROW")
670670
}
671-
MergeInsertKind::Star => {
671+
MergeInsertKind::Wildcard => {
672672
write!(f, "*")
673673
}
674674
}
@@ -733,14 +733,14 @@ pub enum MergeUpdateKind {
733733
/// UPDATE SET quantity = source.quantity, name = source.name
734734
/// ```
735735
Set(Vec<Assignment>),
736-
/// The `*` shorthand to update all columns from the source.
736+
/// The `*` wildcard to update all columns from the source.
737737
///
738738
/// Example:
739739
/// ```sql
740740
/// UPDATE SET *
741741
/// ```
742742
/// [Databricks](https://docs.databricks.com/en/sql/language-manual/delta-merge-into.html)
743-
Star,
743+
Wildcard,
744744
}
745745

746746
impl Display for MergeUpdateKind {
@@ -749,7 +749,7 @@ impl Display for MergeUpdateKind {
749749
MergeUpdateKind::Set(assignments) => {
750750
write!(f, "SET {}", display_comma_separated(assignments))
751751
}
752-
MergeUpdateKind::Star => {
752+
MergeUpdateKind::Wildcard => {
753753
write!(f, "SET *")
754754
}
755755
}

src/ast/spans.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2531,7 +2531,7 @@ impl Spanned for MergeInsertExpr {
25312531
self.kind_token.0.span,
25322532
match self.kind {
25332533
MergeInsertKind::Values(ref values) => values.span(),
2534-
MergeInsertKind::Row | MergeInsertKind::Star => Span::empty(),
2534+
MergeInsertKind::Row | MergeInsertKind::Wildcard => Span::empty(),
25352535
},
25362536
]
25372537
.into_iter()
@@ -2545,7 +2545,7 @@ impl Spanned for MergeUpdateExpr {
25452545
fn span(&self) -> Span {
25462546
let kind_span = match &self.kind {
25472547
MergeUpdateKind::Set(assignments) => union_spans(assignments.iter().map(Spanned::span)),
2548-
MergeUpdateKind::Star => Span::empty(),
2548+
MergeUpdateKind::Wildcard => Span::empty(),
25492549
};
25502550
union_spans(
25512551
core::iter::once(self.update_token.0.span)

src/dialect/databricks.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,4 @@ impl Dialect for DatabricksDialect {
108108
fn supports_select_item_multi_column_alias(&self) -> bool {
109109
true
110110
}
111-
112-
/// See <https://docs.databricks.com/en/sql/language-manual/delta-merge-into.html>
113-
fn supports_merge_star_syntax(&self) -> bool {
114-
true
115-
}
116111
}

src/dialect/generic.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,4 @@ impl Dialect for GenericDialect {
304304
fn supports_xml_expressions(&self) -> bool {
305305
true
306306
}
307-
308-
fn supports_merge_star_syntax(&self) -> bool {
309-
true
310-
}
311307
}

src/dialect/mod.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,13 +1164,6 @@ pub trait Dialect: Debug + Any {
11641164
false
11651165
}
11661166

1167-
/// Returns true if the dialect supports `UPDATE SET *` and `INSERT *`
1168-
/// shorthand syntax in `MERGE` statements.
1169-
/// <https://docs.databricks.com/en/sql/language-manual/delta-merge-into.html>
1170-
fn supports_merge_star_syntax(&self) -> bool {
1171-
false
1172-
}
1173-
11741167
/// Returns true if the dialect supports the `LISTEN`, `UNLISTEN` and `NOTIFY` statements
11751168
fn supports_listen_notify(&self) -> bool {
11761169
false

src/parser/merge.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,8 @@ impl Parser<'_> {
121121

122122
let update_token = self.get_current_token().clone();
123123
self.expect_keyword_is(Keyword::SET)?;
124-
let kind = if self.dialect.supports_merge_star_syntax()
125-
&& self.consume_token(&Token::Mul)
126-
{
127-
MergeUpdateKind::Star
124+
let kind = if self.consume_token(&Token::Mul) {
125+
MergeUpdateKind::Wildcard
128126
} else {
129127
MergeUpdateKind::Set(self.parse_comma_separated(Parser::parse_assignment)?)
130128
};
@@ -175,14 +173,13 @@ impl Parser<'_> {
175173

176174
let insert_token = self.get_current_token().clone();
177175

178-
if self.dialect.supports_merge_star_syntax() && self.consume_token(&Token::Mul)
179-
{
176+
if self.consume_token(&Token::Mul) {
180177
let star_token = self.get_current_token().clone();
181178
MergeAction::Insert(MergeInsertExpr {
182179
insert_token: insert_token.into(),
183180
columns: vec![],
184181
kind_token: star_token.into(),
185-
kind: MergeInsertKind::Star,
182+
kind: MergeInsertKind::Wildcard,
186183
insert_predicate: None,
187184
})
188185
} else {

tests/sqlparser_common.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10239,6 +10239,45 @@ WHEN NOT MATCHED THEN \
1023910239
INSERT (PLAYGROUND.FOO.ID, PLAYGROUND.FOO.NAME) \
1024010240
VALUES (1, 'abc')";
1024110241
all_dialects().verified_stmt(sql);
10242+
10243+
// MERGE with wildcard (UPDATE SET * and INSERT *)
10244+
let sql = "MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT *";
10245+
match verified_stmt(sql) {
10246+
Statement::Merge(merge) => {
10247+
assert_eq!(merge.clauses.len(), 2);
10248+
10249+
match &merge.clauses[0].action {
10250+
MergeAction::Update(update_expr) => {
10251+
assert!(matches!(update_expr.kind, MergeUpdateKind::Wildcard));
10252+
}
10253+
_ => panic!("Expected UPDATE action"),
10254+
}
10255+
10256+
match &merge.clauses[1].action {
10257+
MergeAction::Insert(insert_expr) => {
10258+
assert!(matches!(insert_expr.kind, MergeInsertKind::Wildcard));
10259+
assert!(insert_expr.columns.is_empty());
10260+
}
10261+
_ => panic!("Expected INSERT action"),
10262+
}
10263+
}
10264+
_ => panic!("Expected MERGE statement"),
10265+
}
10266+
10267+
verified_stmt("MERGE INTO target USING source ON target.id = source.id WHEN MATCHED AND source.active = 1 THEN UPDATE SET *");
10268+
10269+
verified_stmt("MERGE INTO target USING source ON target.id = source.id WHEN NOT MATCHED BY TARGET THEN INSERT *");
10270+
10271+
verified_stmt("MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT (a, b) VALUES (source.a, source.b)");
10272+
10273+
let sql = concat!(
10274+
"MERGE INTO t1 AS target ",
10275+
"USING (SELECT * FROM t2) AS source ",
10276+
"ON target.id = source.id ",
10277+
"WHEN MATCHED THEN UPDATE SET * ",
10278+
"WHEN NOT MATCHED THEN INSERT *"
10279+
);
10280+
verified_stmt(sql);
1024210281
}
1024310282

1024410283
#[test]

tests/sqlparser_databricks.rs

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -738,61 +738,3 @@ fn parse_cte_without_as() {
738738
.parse_sql_statements("WITH cte (SELECT 1) SELECT * FROM cte")
739739
.is_err());
740740
}
741-
742-
#[test]
743-
fn test_merge_update_set_star_and_insert_star() {
744-
let sql = "MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT *";
745-
databricks_and_generic().verified_stmt(sql);
746-
747-
match databricks().verified_stmt(sql) {
748-
Statement::Merge(merge) => {
749-
assert_eq!(merge.clauses.len(), 2);
750-
751-
match &merge.clauses[0].action {
752-
MergeAction::Update(update_expr) => {
753-
assert!(matches!(update_expr.kind, MergeUpdateKind::Star));
754-
}
755-
_ => panic!("Expected UPDATE action"),
756-
}
757-
758-
match &merge.clauses[1].action {
759-
MergeAction::Insert(insert_expr) => {
760-
assert!(matches!(insert_expr.kind, MergeInsertKind::Star));
761-
assert!(insert_expr.columns.is_empty());
762-
}
763-
_ => panic!("Expected INSERT action"),
764-
}
765-
}
766-
_ => panic!("Expected MERGE statement"),
767-
}
768-
}
769-
770-
#[test]
771-
fn test_merge_update_set_star_with_predicate() {
772-
let sql = "MERGE INTO target USING source ON target.id = source.id WHEN MATCHED AND source.active = true THEN UPDATE SET *";
773-
databricks_and_generic().verified_stmt(sql);
774-
}
775-
776-
#[test]
777-
fn test_merge_insert_star_with_not_matched_by_target() {
778-
let sql = "MERGE INTO target USING source ON target.id = source.id WHEN NOT MATCHED BY TARGET THEN INSERT *";
779-
databricks_and_generic().verified_stmt(sql);
780-
}
781-
782-
#[test]
783-
fn test_merge_mixed_star_and_explicit() {
784-
let sql = "MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT (a, b) VALUES (source.a, source.b)";
785-
databricks_and_generic().verified_stmt(sql);
786-
}
787-
788-
#[test]
789-
fn test_merge_star_with_subquery_source() {
790-
let sql = concat!(
791-
"MERGE INTO t1 AS target ",
792-
"USING (SELECT * FROM t2) AS source ",
793-
"ON target.id = source.id ",
794-
"WHEN MATCHED THEN UPDATE SET * ",
795-
"WHEN NOT MATCHED THEN INSERT *"
796-
);
797-
databricks_and_generic().verified_stmt(sql);
798-
}

0 commit comments

Comments
 (0)