@@ -264,6 +264,8 @@ module.exports = grammar({
264264 keyword_storage : ( _ ) => make_keyword ( "storage" ) ,
265265 keyword_compression : ( _ ) => make_keyword ( "compression" ) ,
266266
267+ keyword_overriding : ( ) => make_keyword ( "overriding" ) ,
268+ keyword_system : ( ) => make_keyword ( "system" ) ,
267269 keyword_policy : ( _ ) => make_keyword ( "policy" ) ,
268270 keyword_permissive : ( _ ) => make_keyword ( "permissive" ) ,
269271 keyword_restrictive : ( _ ) => make_keyword ( "restrictive" ) ,
@@ -2269,33 +2271,40 @@ module.exports = grammar({
22692271
22702272 insert : ( $ ) =>
22712273 seq (
2272- choice ( $ . keyword_insert , $ . keyword_replace ) ,
2274+ $ . keyword_insert ,
2275+ $ . keyword_into ,
2276+ $ . object_reference ,
2277+ optional ( $ . _alias ) ,
2278+ optional ( paren_list ( $ . column_identifier , true ) ) ,
22732279 optional (
2274- choice (
2275- $ . keyword_low_priority ,
2276- $ . keyword_delayed ,
2277- $ . keyword_high_priority
2280+ seq (
2281+ $ . keyword_overriding ,
2282+ choice ( $ . keyword_user , $ . keyword_system ) ,
2283+ $ . keyword_value
22782284 )
22792285 ) ,
2280- optional ( $ . keyword_ignore ) ,
2281- optional (
2282- choice (
2283- $ . keyword_into ,
2284- $ . keyword_overwrite // Spark SQL
2285- )
2286+ choice (
2287+ seq ( $ . keyword_default , $ . keyword_values ) ,
2288+ $ . insert_values ,
2289+ $ . _select_statement
22862290 ) ,
2287- $ . object_reference ,
2288- optional ( $ . table_partition ) , // Spark SQL
2289- optional ( seq ( $ . keyword_as , field ( "alias" , $ . any_identifier ) ) ) ,
2290- // TODO we need a test for `insert...set`
2291- choice ( $ . _insert_values , $ . _set_values ) ,
2292- optional ( choice ( $ . _on_conflict , $ . _on_duplicate_key_update ) )
2291+ optional ( $ . _on_conflict )
2292+ ) ,
2293+
2294+ insert_values : ( $ ) =>
2295+ comma_list (
2296+ seq (
2297+ $ . keyword_values ,
2298+ paren_list ( choice ( $ . _expression , $ . keyword_default ) , true )
2299+ ) ,
2300+ true
22932301 ) ,
22942302
22952303 _on_conflict : ( $ ) =>
22962304 seq (
22972305 $ . keyword_on ,
22982306 $ . keyword_conflict ,
2307+ // todo: conflict target
22992308 seq (
23002309 $ . keyword_do ,
23012310 choice (
@@ -2305,23 +2314,8 @@ module.exports = grammar({
23052314 )
23062315 ) ,
23072316
2308- _on_duplicate_key_update : ( $ ) =>
2309- seq (
2310- $ . keyword_on ,
2311- $ . keyword_duplicate ,
2312- $ . keyword_key ,
2313- $ . keyword_update ,
2314- $ . assignment_list
2315- ) ,
2316-
23172317 assignment_list : ( $ ) => seq ( $ . assignment , repeat ( seq ( "," , $ . assignment ) ) ) ,
23182318
2319- _insert_values : ( $ ) =>
2320- seq (
2321- optional ( alias ( $ . _column_list , $ . list ) ) ,
2322- choice ( seq ( $ . keyword_values , comma_list ( $ . list , true ) ) , $ . _dml_read )
2323- ) ,
2324-
23252319 _set_values : ( $ ) => seq ( $ . keyword_set , comma_list ( $ . assignment , true ) ) ,
23262320
23272321 _column_list : ( $ ) => paren_list ( alias ( $ . _column , $ . column ) , true ) ,
@@ -2357,10 +2351,31 @@ module.exports = grammar({
23572351 ) ,
23582352 $ . keyword_then ,
23592353 choice (
2360- $ . keyword_delete ,
2354+ // merge_insert
2355+ seq (
2356+ $ . keyword_insert ,
2357+ optional ( paren_list ( $ . column_identifier , true ) ) ,
2358+ optional (
2359+ seq (
2360+ $ . keyword_overriding ,
2361+ choice ( $ . keyword_system , $ . keyword_user ) ,
2362+ $ . keyword_value
2363+ )
2364+ ) ,
2365+ choice (
2366+ seq ( $ . keyword_default , $ . keyword_values ) ,
2367+ seq (
2368+ $ . keyword_values ,
2369+ paren_list ( choice ( $ . _expression , $ . keyword_default ) , true )
2370+ )
2371+ )
2372+ ) ,
2373+ // merge_update
23612374 seq ( $ . keyword_update , $ . _set_values ) ,
2362- seq ( $ . keyword_insert , $ . _insert_values ) ,
2363- optional ( $ . where )
2375+ // merge_delete
2376+ $ . keyword_delete ,
2377+
2378+ seq ( $ . keyword_do , $ . keyword_nothing )
23642379 )
23652380 ) ,
23662381
0 commit comments