-C Fix\stwo\sunreachable\sbranches\sintroduced\sby\sthe\srecent\nsqlite3TriggersExist()\soptimization.
-D 2022-04-07T20:45:38.697
+C Tokenizer\sand\sgrammar\srules\ssufficient\sfor\sthe\sMERGE\scommand.
+D 2022-04-08T10:35:32.552
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 42120492784fc9bcd9082b5c9b5e329b7318c357f9f3574a1bbfcf7418910356
F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3
-F src/parse.y 9130a936927658e7c574e97e5d4f0a747a3f6b9a42bc5c63e455c8e40cc74216
+F src/parse.y ff8f0f6f1086c6c480503f21386422f1dcd3d37dfe1011c9089abc7a14772c50
F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b
F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65
F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8
F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x
F tool/mkctimec.tcl ac96a74f5e6d9dac672d5229f79c583d3357a50e7d098e473e6b2ce2f8ae1704 x
-F tool/mkkeywordhash.c 35bfc41adacc4aa6ef6fca7fd0c63e0ec0534b78daf4d0cfdebe398216bbffc3
+F tool/mkkeywordhash.c eb57113139c6a37d80a3247026c5acc1efa0711678d6f76d54d2c46d39db5a8f
F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33
F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef
F tool/mkopcodeh.tcl 5dab48c49a25452257494e9601702ab63adaba6bd54a9b382615fa52661c8f8c
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c2965fea9df7076b235d3eadaf84f0a36242476d0329030b0e57557b66e2540c
-R 07d0b0c26e9cd2798bbb00ddbafc6a3b
+P 1b5475d212cf9de0bff69eee8c607b4fcd8e04bf4df72171429e7609c4153951
+R 6aa4900a9c6f26de4fb4a6a1056c6eed
+T *branch * merge-statement
+T *sym-merge-statement *
+T -sym-trunk *
U drh
-Z 93237070ff101cf9292ceb1ee884c28a
+Z b59368f7e6309c70d89f64cbb029dfb3
# Remove this line to create a well-formed Fossil manifest.
%endif
MATERIALIZED
REINDEX RENAME CTIME_KW IF
+%ifndef SQLITE_OMIT_MERGE
+ MERGE MATCHED SOURCE TARGET
+%endif
.
%wildcard ANY.
idlist(A) ::= nm(Y).
{A = sqlite3IdListAppend(pParse,0,&Y); /*A-overwrites-Y*/}
+
+////////////////////////// The MERGE command //////////////////////////////////
+//
+%ifndef SQLITE_OMIT_MERGE
+cmd ::= mergecmd.
+mergecmd ::= with MERGE INTO nm dbnm as USING nm dbnm as ON expr whenclause.
+mergecmd ::= with MERGE INTO nm dbnm as USING LP select RP as ON expr whenclause.
+whenclause ::= when.
+whenclause ::= whenclause when.
+when ::= WHEN MATCHED whencond THEN whenaction1.
+when ::= WHEN NOT MATCHED whencond THEN whenaction2.
+when ::= WHEN NOT MATCHED BY TARGET whencond THEN whenaction2.
+when ::= WHEN NOT MATCHED BY SOURCE whencond THEN whenaction1.
+whencond ::= .
+whencond ::= AND expr.
+whenaction1 ::= UPDATE SET setlist.
+whenaction1 ::= DELETE.
+whenaction1 ::= DO NOTHING.
+whenaction2 ::= INSERT DEFAULT VALUES.
+whenaction2 ::= INSERT idlist_opt values.
+whenaction2 ::= DO NOTHING.
+%endif /* SQLITE_OMIT_MERGE */
+
+
/////////////////////////// Expression Processing /////////////////////////////
//
filter_clause(A) ::= FILTER LP WHERE expr(X) RP. { A = X; }
%endif /* SQLITE_OMIT_WINDOWFUNC */
+
/*
** The code generator needs some extra TK_ token values for tokens that
** are synthesized and do not actually appear in the grammar:
#else
# define RETURNING 0x00400000
#endif
+#ifdef SQLITE_OMIT_MERGE
+# define MERGE 0
+#else
+# define MERGE 0x00800000
+#endif
/*
{ "DESC", "TK_DESC", ALWAYS, 3 },
{ "DETACH", "TK_DETACH", ATTACH, 0 },
{ "DISTINCT", "TK_DISTINCT", ALWAYS, 5 },
- { "DO", "TK_DO", UPSERT, 2 },
+ { "DO", "TK_DO", UPSERT|MERGE, 2 },
{ "DROP", "TK_DROP", ALWAYS, 1 },
{ "END", "TK_END", ALWAYS, 1 },
{ "EACH", "TK_EACH", TRIGGER, 1 },
{ "LIKE", "TK_LIKE_KW", ALWAYS, 5 },
{ "LIMIT", "TK_LIMIT", ALWAYS, 3 },
{ "MATCH", "TK_MATCH", ALWAYS, 2 },
+ { "MATCHED", "TK_MATCHED", MERGE, 10 },
{ "MATERIALIZED", "TK_MATERIALIZED", CTE, 12 },
+ { "MERGE", "TK_MERGE", MERGE, 10 },
{ "NATURAL", "TK_JOIN_KW", ALWAYS, 3 },
{ "NO", "TK_NO", FKEY|WINDOWFUNC, 2 },
{ "NOT", "TK_NOT", ALWAYS, 10 },
- { "NOTHING", "TK_NOTHING", UPSERT, 1 },
+ { "NOTHING", "TK_NOTHING", UPSERT|MERGE, 1 },
{ "NOTNULL", "TK_NOTNULL", ALWAYS, 3 },
{ "NULL", "TK_NULL", ALWAYS, 10 },
{ "NULLS", "TK_NULLS", ALWAYS, 3 },
{ "SAVEPOINT", "TK_SAVEPOINT", ALWAYS, 1 },
{ "SELECT", "TK_SELECT", ALWAYS, 10 },
{ "SET", "TK_SET", ALWAYS, 10 },
+ { "SOURCE", "TK_SOURCE", MERGE, 10 },
+ { "TARGET", "TK_TARGET", MERGE, 10 },
{ "TABLE", "TK_TABLE", ALWAYS, 1 },
{ "TEMP", "TK_TEMP", ALWAYS, 1 },
{ "TEMPORARY", "TK_TEMP", ALWAYS, 1 },