- C Update\sthe\stop-level\sREADME.md\sfile\sto\spoint\sto\sthe\swhynotget.html\sdocument.
- D 2018-04-10T00:30:47.835
-C Help\sthe\sparser\srun\sfaster\sby\savoiding\sthe\s"explain\s::=\s."\sproduction.
-D 2018-04-11T17:10:54.632
++C Merge\schanges\sfrom\strunk.
++D 2018-04-12T12:25:45.560
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 7016fc56c6b9bfe5daac4f34be8be38d8c0b5fab79ccbfb764d3b23bf1c6fff3
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 1bb6a57fa0465296a4d6109a1a64610a0e7adde1f3acf3ef539a9d972908ce8f
F src/pager.h c571b064df842ec8f2e90855dead9acf4cbe0d1b2c05afe0ef0d0145f7fd0388
- F src/parse.y 2779b5f1a24508825b7b883d73ba1632f9cc1715ffbf7b0b864b98f867742aa9
-F src/parse.y e3c4116efb7d693df412bd42a96c88c6463704d31a29342c2fa671f6e91ecb26
++F src/parse.y 306ece8a7ccc4d38e29d6b86d8707dfcc62c85901e32ffe30f8e4909c3d768b8
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e
F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x
F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3
-F tool/mkkeywordhash.c 2e852ac0dfdc5af18886dc1ce7e9676d11714ae3df0a282dc7d90b3a0fe2033c
+F tool/mkkeywordhash.c 9f5fee138b7f8d0ccde7baad1564db8de36e76e1bd1ee7a417a1fe6cecf599fb
- F tool/mkmsvcmin.tcl 8baf26690b80d861d0ac341b29880eec6ade39e4f11fe690271ded9cb90563a3
+ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6a13ea
F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c
F tool/mkopcodeh.tcl 4ee2a30ccbd900dc4d5cdb61bdab87cd2166cd2affcc78c9cc0b8d22a65b2eee
F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 5cc2a5a315a2f26b392811de45b3dc352873a173c2c6c65f37ce2e5f88a71cd2
- R 016bd43547f1b597517ec5be295b6171
-P b7178209152452e82f5908513385018524472640d67547927d6b4c0aa0c15a46
-R 12b886afc6216ee0a5a2b22cc4bff5a5
++P 7dfd4543da7ef741852252d3c78ba89a919d737787e9e5118579e35fdfdeb24c d7ec7b5970df9e542401f8299e098a5039d1875e2e3383dad06a0ec998589b6e
++R 22c0de7699239b37705a12f37b4c7dac
U drh
- Z 9f4176f366ae165e6c012c7b6ab0f60d
-Z 93376c77c8408e036fdadd56852c955d
++Z 5bc8368030e26095e5c80de69174e4cd
////////////////////////// The INSERT command /////////////////////////////////
//
- cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S)
-cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). {
- sqlite3Insert(pParse, X, S, F, R);
++cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S)
+ upsert(U). {
- sqlite3WithPush(pParse, W, 1);
+ sqlite3Insert(pParse, X, S, F, upsertType(pParse, R, U.e), U.p);
}
- cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
+ cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
{
- sqlite3WithPush(pParse, W, 1);
- sqlite3Insert(pParse, X, 0, F, R);
+ sqlite3Insert(pParse, X, 0, F, R, 0);
+}
+
+%type upsert {struct Upsert}
+%destructor upsert {sqlite3ExprListDelete(pParse->db,$$.p);}
+upsert(A) ::= . {
+ A.p = 0;
+ A.e = OE_None;
+}
+upsert(A) ::= ON CONFLICT DO UPDATE SET setlist(X). {
+ A.p = X; /*A-overwrites-X*/
+ A.e = OE_Update;
+}
+upsert(A) ::= ON CONFLICT DO NOTHING. {
+ A.p = 0;
+ A.e = OE_Ignore;
+}
+
+%include {
+ /* Compute and return the correct conflict resolution strategy for an
+ ** INSERT statement. If the statement begins with REPLACE or with
+ ** INSERT OR, and it contains an ON CONFLICT clause, throw an error.
+ */
+ static int upsertType(Parse *pParse, int orconf, int upsertType){
+ if( upsertType!=OE_None ){
+ if( orconf!=OE_Default ){
+ sqlite3ErrorMsg(pParse, "ON CONFLICT clause not allowed");
+ }
+ return upsertType;
+ }else{
+ return orconf;
+ }
+ }
}
%type insert_cmd {int}