diff --git a/src/cst/Merge.ts b/src/cst/Merge.ts index cd902fc9..caebc10f 100644 --- a/src/cst/Merge.ts +++ b/src/cst/Merge.ts @@ -1,7 +1,7 @@ import { Alias } from "./Alias"; import { BaseNode, Keyword } from "./Base"; import { Expr, Identifier, ListExpr, ParenExpr, EntityName } from "./Expr"; -import { DefaultValues, ValuesClause } from "./Insert"; +import { DefaultValues, OverridingClause, ValuesClause } from "./Insert"; import { SelectStmt, WithClause } from "./Select"; import { SetClause } from "./Update"; @@ -82,7 +82,12 @@ export interface MergeActionInsert extends BaseNode { type: "merge_action_insert"; insertKw: Keyword<"INSERT">; columns?: ParenExpr>; - clauses: (ValuesClause | DefaultValues | MergeActionInsertRowClause)[]; + clauses: ( + | OverridingClause + | ValuesClause + | DefaultValues + | MergeActionInsertRowClause + )[]; } // BigQuery diff --git a/src/parser.pegjs b/src/parser.pegjs index e4e8af16..0cef7325 100644 --- a/src/parser.pegjs +++ b/src/parser.pegjs @@ -1733,12 +1733,16 @@ merge_action_update merge_action_insert = insertKw:(INSERT __) columns:(paren$list$column __)? + overriding:(overriding_clause __)? values:(values_clause / default_values / merge_action_insert_row_clause) { return loc({ type: "merge_action_insert", insertKw: read(insertKw), columns: read(columns), - clauses: [values], + clauses: [ + read(overriding), + values + ].filter(identity), }); } diff --git a/test/dml/merge.test.ts b/test/dml/merge.test.ts index bd4eefc6..3bf01271 100644 --- a/test/dml/merge.test.ts +++ b/test/dml/merge.test.ts @@ -105,6 +105,19 @@ describe("merge into", () => { it("supports INSERT DEFAULT VALUES", () => { testWc("MERGE INTO foo USING bar ON x=y WHEN NOT MATCHED THEN INSERT DEFAULT VALUES"); }); + + it("supports INSERT OVERRIDING SYSTEM/USER VALUE", () => { + testWc(` + MERGE INTO foo USING bar ON x=y + WHEN NOT MATCHED THEN + INSERT OVERRIDING SYSTEM VALUE VALUES (1, 2) + `); + testWc(` + MERGE INTO foo USING bar ON x=y + WHEN NOT MATCHED THEN + INSERT OVERRIDING USER VALUE VALUES (1, 2) + `); + }); }); dialect("bigquery", () => {