From: drh Date: Thu, 12 Apr 2018 12:25:45 +0000 (+0000) Subject: Merge changes from trunk. X-Git-Tag: version-3.24.0~146^2~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=35e86bf15d33d64df8c8618dcc3d49803d1d34b1;p=thirdparty%2Fsqlite.git Merge changes from trunk. FossilOrigin-Name: 9f6f11805eb7cc02f7eb3044250f3981d46d2dbf0c421bd73e7f8b437390db25 --- 35e86bf15d33d64df8c8618dcc3d49803d1d34b1 diff --cc manifest index 4b5d0efffe,d6f09a69bf..a87dd9e7a3 --- a/manifest +++ b/manifest @@@ -1,5 -1,5 +1,5 @@@ - 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 @@@ -480,7 -480,7 +480,7 @@@ F src/os_win.c eb03c6d52f893bcd7fdd4c60 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 @@@ -1645,8 -1645,8 +1645,8 @@@ F tool/max-limits.c cbb635fbb37ae4d05f2 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 @@@ -1717,7 -1717,7 +1717,7 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9 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 diff --cc manifest.uuid index 9fa72ef231,c807fee2e0..ef759a0fc7 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - 7dfd4543da7ef741852252d3c78ba89a919d737787e9e5118579e35fdfdeb24c -d7ec7b5970df9e542401f8299e098a5039d1875e2e3383dad06a0ec998589b6e ++9f6f11805eb7cc02f7eb3044250f3981d46d2dbf0c421bd73e7f8b437390db25 diff --cc src/parse.y index f24b1b6385,26dde6ee24..45ead78665 --- a/src/parse.y +++ b/src/parse.y @@@ -858,47 -839,12 +873,45 @@@ setlist(A) ::= LP idlist(X) RP EQ expr( ////////////////////////// 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}