@@ -218,6 +218,7 @@ crud_stmt
218218 / update_stmt
219219 / replace_insert_stmt
220220 / insert_no_columns_stmt
221+ / insert_into_set
221222 / delete_stmt
222223 / cmd_stmt
223224 / proc_stmts
@@ -1197,7 +1198,8 @@ replace_insert_stmt
11971198 KW_INTO ? __
11981199 t :table_name __
11991200 p :insert_partition ? __ LPAREN __ c :column_list __ RPAREN __
1200- v :insert_value_clause {
1201+ v :insert_value_clause __
1202+ odp :on_duplicate_update_stmt ? __ {
12011203 if (t) {
12021204 tableList .add (` insert::${ t .db } ::${ t .table } ` )
12031205 t .as = null
@@ -1215,6 +1217,7 @@ replace_insert_stmt
12151217 columns: c,
12161218 values: v,
12171219 partition: p,
1220+ on_duplicate_update: odp,
12181221 }
12191222 };
12201223 }
@@ -1224,7 +1227,8 @@ insert_no_columns_stmt
12241227 KW_INTO __
12251228 t :table_name __
12261229 p :insert_partition ? __
1227- v :insert_value_clause {
1230+ v :insert_value_clause __
1231+ odp : on_duplicate_update_stmt ? __ {
12281232 if (t) {
12291233 tableList .add (` insert::${ t .db } ::${ t .table } ` )
12301234 columnList .add (` insert::${ t .table } ::(.*)` );
@@ -1239,10 +1243,46 @@ insert_no_columns_stmt
12391243 columns: null ,
12401244 values: v,
12411245 partition: p,
1246+ on_duplicate_update: odp,
12421247 }
12431248 };
12441249 }
12451250
1251+ insert_into_set
1252+ = ri :replace_insert __
1253+ KW_INTO __
1254+ t :table_name __
1255+ p :insert_partition ? __
1256+ KW_SET __
1257+ l :set_list __
1258+ odp :on_duplicate_update_stmt ? __ {
1259+ if (t) {
1260+ tableList .add (` insert::${ t .db } ::${ t .table } ` )
1261+ columnList .add (` insert::${ t .table } ::(.*)` );
1262+ t .as = null
1263+ }
1264+ return {
1265+ tableList: Array .from (tableList),
1266+ columnList: columnListTableAlias (columnList),
1267+ ast: {
1268+ type: ri,
1269+ table: [t],
1270+ columns: null ,
1271+ partition: p,
1272+ set: l,
1273+ on_duplicate_update: odp,
1274+ }
1275+ };
1276+ }
1277+
1278+ on_duplicate_update_stmt
1279+ = KW_ON __ 'DUPLICATE' i __ KW_KEY __ KW_UPDATE __ s :set_list {
1280+ return {
1281+ keyword: ' on duplicate key update' ,
1282+ set: s
1283+ }
1284+ }
1285+
12461286replace_insert
12471287 = KW_INSERT { return ' insert' ; }
12481288 / KW_REPLACE { return ' replace' ; }
0 commit comments