From 1e732787dadf6a950efd25e66374825d15ed758e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 Dec 2019 18:12:36 +0000 Subject: [PATCH 01/20] Set the SQLITE_DIRECTONLY flag on the fts3_tokenizer() function of FTS3, thus preventing that function from being called from within a trigger or view. FossilOrigin-Name: f3171dc22e4d3a40ca17fe609391d92fc6a997b775bfefa5947aec69c889aa73 --- ext/fts3/fts3_tokenizer.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3atoken.test | 23 +++++++++++++++++++++++ 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_tokenizer.c b/ext/fts3/fts3_tokenizer.c index 2fb0f0e977..443dc0c52c 100644 --- a/ext/fts3/fts3_tokenizer.c +++ b/ext/fts3/fts3_tokenizer.c @@ -481,7 +481,7 @@ int sqlite3Fts3InitHashTable( ){ int rc = SQLITE_OK; void *p = (void *)pHash; - const int any = SQLITE_ANY; + const int any = SQLITE_ANY|SQLITE_DIRECTONLY; #ifdef SQLITE_TEST char *zTest = 0; diff --git a/manifest b/manifest index 9a5ab15bd7..cbae56a1ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sOP_ResultRow\sopcode\sreleases\sthe\sSCopy\sdependences\son\sall\sits\sregisters,\nas\sthe\svalues\sin\sthose\sregisters\swill\snot\sbe\sreused. -D 2019-12-31T12:18:24.111 +C Set\sthe\sSQLITE_DIRECTONLY\sflag\son\sthe\sfts3_tokenizer()\sfunction\sof\sFTS3,\nthus\spreventing\sthat\sfunction\sfrom\sbeing\scalled\sfrom\swithin\sa\strigger\sor\nview. +D 2019-12-31T18:12:36.978 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -94,7 +94,7 @@ F ext/fts3/fts3_snippet.c d62e40baa6a200586c3a425478109418f44926b1c318c870b59a42 F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 F ext/fts3/fts3_test.c 73b16e229e517c1b1f0fb8e1046182a4e5dbc8dbe6eea8a5d4353fcce7dbbf39 F ext/fts3/fts3_tokenize_vtab.c 1de9a61acfa2a0445ed989310c31839c57f6b6086dd9d5c97177ae734a17fd8b -F ext/fts3/fts3_tokenizer.c a1ca0ab7c9c688ccb1d605645809f74f5df2bf4ca568e4bb37fb51113fd78e45 +F ext/fts3/fts3_tokenizer.c 4a36573c36fae7654de6fc56bd87f39d82100bb6db2cfd23d6e04d2a9c28d51d F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d @@ -929,7 +929,7 @@ F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test bef8a163490098a6b8a6ec5f5407269a3a15b9902c0fcf5e962825a81675b3a0 +F test/fts3atoken.test 2b2b0d7943eccf76e7a4887b557d4abcbb9279fbbb88e2bc2eba31c1817d11c7 F test/fts3auto.test bfe0857bd0b69d68dd685a931b58486411a69f5794a7f6d6fe808bfa31a99614 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f481636f1a0333c6e98906e5d4433bf1d046380bc29c760e8e7e2c2b3530b956 -R 15ea7376c617491daf567615a28d64b4 +P 1dc83c5d54ca2890112e735e336c209adb8d067d2f647e9f8ae5d58f84a52461 +R 118bcebdf9cb66186c065203bfe034a5 U drh -Z 7a15f49ce421e16279acd3846b3f186d +Z 32c0944c14736357fc15eb04e913cd1c diff --git a/manifest.uuid b/manifest.uuid index a743f3e5e9..46f287b521 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1dc83c5d54ca2890112e735e336c209adb8d067d2f647e9f8ae5d58f84a52461 \ No newline at end of file +f3171dc22e4d3a40ca17fe609391d92fc6a997b775bfefa5947aec69c889aa73 \ No newline at end of file diff --git a/test/fts3atoken.test b/test/fts3atoken.test index 1dccf41266..5694dfb9f0 100644 --- a/test/fts3atoken.test +++ b/test/fts3atoken.test @@ -129,6 +129,29 @@ do_test fts3atoken-1.9 { } } {1 blob blob blob blob} +# 2019-12-31: The fts3_tokenizer() function can never be invoked from +# within a trigger or view. +# +do_catchsql_test fts3atoken-1.10 { + CREATE VIEW v110(x) AS + SELECT fts3_tokenizer('tok110', fts3_tokenizer('simple')) IS NULL; +} {0 {}} +do_catchsql_test fts3atoken-1.11 { + SELECT * FROM v110; +} {1 {fts3_tokenizer() prohibited in triggers and views}} +do_catchsql_test fts3atoken-1.12 { + CREATE TABLE t110(a,b); + CREATE TRIGGER r110 AFTER INSERT ON t110 BEGIN + SELECT fts3_tokenizer('tok110', fts3_tokenizer('simple')) IS NULL; + END; +} {0 {}} +do_catchsql_test fts3atoken-1.13 { + INSERT INTO t110(a,b) VALUES(1,2); +} {1 {fts3_tokenizer() prohibited in triggers and views}} +do_catchsql_test fts3atoken-1.14 { + SELECT * FROM t110; +} {0 {}} + #-------------------------------------------------------------------------- # Test cases fts3atoken-2.* test error cases in the scalar function based # API for getting and setting tokenizers. From 64de2a5f7b77ebad6adda5914976ef4ed09c313a Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 Dec 2019 18:39:23 +0000 Subject: [PATCH 02/20] Also set the SQLITE_DIRECTONLY flag on the load_extension() function. FossilOrigin-Name: 3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/func.c | 4 ++-- src/sqliteInt.h | 7 +++++++ 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index cbae56a1ab..c162495ecf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Set\sthe\sSQLITE_DIRECTONLY\sflag\son\sthe\sfts3_tokenizer()\sfunction\sof\sFTS3,\nthus\spreventing\sthat\sfunction\sfrom\sbeing\scalled\sfrom\swithin\sa\strigger\sor\nview. -D 2019-12-31T18:12:36.978 +C Also\sset\sthe\sSQLITE_DIRECTONLY\sflag\son\sthe\sload_extension()\sfunction. +D 2019-12-31T18:39:23.702 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 F src/expr.c 3584e19c222f94cd0bb9070318ad270c3ca0d4fe235a6f70a198f16d8faf976f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 -F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 +F src/func.c 511204091c82bd0f351a64f05359b1b0444f0953de92fa1d37b129e544ed5126 F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -533,7 +533,7 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h dcd5b4b29596cb5969586790ae45f75fe8deaf5fde1a90d572ad12b2f970b318 +F src/sqliteInt.h e526421d44d88f17c397647371e460841c961b27ccf69301177b63d18ebbeead F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1dc83c5d54ca2890112e735e336c209adb8d067d2f647e9f8ae5d58f84a52461 -R 118bcebdf9cb66186c065203bfe034a5 +P f3171dc22e4d3a40ca17fe609391d92fc6a997b775bfefa5947aec69c889aa73 +R 25bc6cfca86f50c6bebf64970cf717c5 U drh -Z 32c0944c14736357fc15eb04e913cd1c +Z 6a954000d634738bb471999423aebba1 diff --git a/manifest.uuid b/manifest.uuid index 46f287b521..266e4c4a56 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f3171dc22e4d3a40ca17fe609391d92fc6a997b775bfefa5947aec69c889aa73 \ No newline at end of file +3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 3201b6df86..d4c6936b10 100644 --- a/src/func.c +++ b/src/func.c @@ -1911,8 +1911,8 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(soundex, 1, 0, 0, soundexFunc ), #endif #ifndef SQLITE_OMIT_LOAD_EXTENSION - VFUNCTION(load_extension, 1, 0, 0, loadExt ), - VFUNCTION(load_extension, 2, 0, 0, loadExt ), + SFUNCTION(load_extension, 1, 0, 0, loadExt ), + SFUNCTION(load_extension, 2, 0, 0, loadExt ), #endif #if SQLITE_USER_AUTHENTICATION FUNCTION(sqlite_crypt, 2, 0, 0, sqlite3CryptFunc ), diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 84f8e1e5c5..0dcb103532 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1733,6 +1733,10 @@ struct FuncDestructor { ** VFUNCTION(zName, nArg, iArg, bNC, xFunc) ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag. ** +** SFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_DIRECTONLY flag. +** ** DFUNCTION(zName, nArg, iArg, bNC, xFunc) ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and ** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions @@ -1772,6 +1776,9 @@ struct FuncDestructor { #define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8|SQLITE_DIRECTONLY, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } #define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ 0, 0, xFunc, 0, 0, 0, #zName, {0} } From 51676fab72dd89450f6c8b8c252703016e005286 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 Dec 2019 23:17:35 +0000 Subject: [PATCH 03/20] Remove an incorrect assert() statement. Ticket [46fcd700b855e6d1] FossilOrigin-Name: eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c162495ecf..7bf247d565 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Also\sset\sthe\sSQLITE_DIRECTONLY\sflag\son\sthe\sload_extension()\sfunction. -D 2019-12-31T18:39:23.702 +C Remove\san\sincorrect\sassert()\sstatement.\s\sTicket\s[46fcd700b855e6d1] +D 2019-12-31T23:17:35.723 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -606,7 +606,7 @@ F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 0a9716e47012ef018038c2e1dab9f701a6fb4429bb3ee1d4d0f49497519ace74 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c fa083086758379b52f8771d69424b273c7bd0f94413802404ee32cd5cc7cd870 +F src/vdbemem.c a5c16cfa5e8ec960cf1ae1226a0718b31bb93de8fba7804fb60217e1dbe28721 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f3171dc22e4d3a40ca17fe609391d92fc6a997b775bfefa5947aec69c889aa73 -R 25bc6cfca86f50c6bebf64970cf717c5 +P 3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 +R 9a290668b8247b93cd51ae150764a4e7 U drh -Z 6a954000d634738bb471999423aebba1 +Z 3a723a31e4b46687e83c27b7c95d8d29 diff --git a/manifest.uuid b/manifest.uuid index 266e4c4a56..fe05dead13 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 \ No newline at end of file +eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index c64901e44d..7d56d1684b 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -964,7 +964,9 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ ** same. */ u16 mFlags = pMem->flags & pX->flags & pX->mScopyFlags; assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); - assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r ); + /* assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r ); */ + /* ^^ */ + /* Cannot reliably compare doubles for equality */ assert( (mFlags&MEM_Str)==0 || (pMem->n==pX->n && pMem->z==pX->z) ); assert( (mFlags&MEM_Blob)==0 || sqlite3BlobCompare(pMem,pX)==0 ); From 6d67aff0e3d613b2decc7d9a9e93d5d6be633edc Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 01:26:05 +0000 Subject: [PATCH 04/20] Issue OP_ReleaseReg opcodes against the array of registers used to compute index records after the index record has been computed. FossilOrigin-Name: e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7bf247d565..f74d206ba8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sincorrect\sassert()\sstatement.\s\sTicket\s[46fcd700b855e6d1] -D 2019-12-31T23:17:35.723 +C Issue\sOP_ReleaseReg\sopcodes\sagainst\sthe\sarray\sof\sregisters\sused\sto\scompute\nindex\srecords\safter\sthe\sindex\srecord\shas\sbeen\scomputed. +D 2020-01-01T01:26:05.547 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 97afb0bf06d7fd7b820f6de3e42cf60beb5cd10131828c29b131b2614bbb1f39 +F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 -R 9a290668b8247b93cd51ae150764a4e7 +P eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f +R 831eba5ca2213a1142c1d3fcf8abb412 U drh -Z 3a723a31e4b46687e83c27b7c95d8d29 +Z d9905a9f70d8f738c4685ad63b39c0a5 diff --git a/manifest.uuid b/manifest.uuid index fe05dead13..6ac57e8761 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f \ No newline at end of file +e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index d778e4b457..3b4ad56403 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1976,6 +1976,7 @@ void sqlite3GenerateConstraintChecks( sqlite3SetMakeRecordP5(v, pIdx->pTable); } #endif + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0); /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the From 25c4296bd97072f7b5a13f4eda021bd2782bcc45 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 13:55:08 +0000 Subject: [PATCH 05/20] Factor out code generation for in-line SQL functions into a separate routine inside of expr.c. FossilOrigin-Name: 586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb --- manifest | 16 ++++---- manifest.uuid | 2 +- src/expr.c | 106 ++++++++++++++++++++++++++++++------------------ src/func.c | 12 +++--- src/sqliteInt.h | 27 +++++++++++- 5 files changed, 107 insertions(+), 56 deletions(-) diff --git a/manifest b/manifest index f74d206ba8..1899d7f3fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Issue\sOP_ReleaseReg\sopcodes\sagainst\sthe\sarray\sof\sregisters\sused\sto\scompute\nindex\srecords\safter\sthe\sindex\srecord\shas\sbeen\scomputed. -D 2020-01-01T01:26:05.547 +C Factor\sout\scode\sgeneration\sfor\sin-line\sSQL\sfunctions\sinto\sa\sseparate\sroutine\ninside\sof\sexpr.c. +D 2020-01-01T13:55:08.668 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,10 +480,10 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 3584e19c222f94cd0bb9070318ad270c3ca0d4fe235a6f70a198f16d8faf976f +F src/expr.c afde0ea1060266338820277d210edc0ed383416c59e5f3472a253f121b5a9de3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 -F src/func.c 511204091c82bd0f351a64f05359b1b0444f0953de92fa1d37b129e544ed5126 +F src/func.c de2641a4763c78b872099649c12adedc638a83df0c41dcb0cb99efc6ceb5f69b F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -533,7 +533,7 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h e526421d44d88f17c397647371e460841c961b27ccf69301177b63d18ebbeead +F src/sqliteInt.h a7d75ef422e07c85eaeb12309b071f3342497d960bf0a353dca8665be6ceb576 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f -R 831eba5ca2213a1142c1d3fcf8abb412 +P e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 +R cfe1bf37072aa553a15293de91196bb1 U drh -Z d9905a9f70d8f738c4685ad63b39c0a5 +Z 1739d48acd97cb5e3553660f1568a9b2 diff --git a/manifest.uuid b/manifest.uuid index 6ac57e8761..82209644bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 \ No newline at end of file +586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e0a03d956f..629768f3a2 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3573,6 +3573,69 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ return iResult; } +/* +** Generate code to implement special SQL functions that are implemented +** in-line rather than by using the usual callbacks. +*/ +static int exprCodeInlineFunction( + Parse *pParse, /* Parsing context */ + ExprList *pFarg, /* List of function arguments */ + int iFuncId, /* Function ID. One of the INTFUNC_... values */ + int target /* Store function result in this register */ +){ + int nFarg; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pFarg!=0 ); + nFarg = pFarg->nExpr; + assert( nFarg>0 ); /* All in-line functions have at least one argument */ + switch( iFuncId ){ + case INLINEFUNC_coalesce: { + /* Attempt a direct implementation of the built-in COALESCE() and + ** IFNULL() functions. This avoids unnecessary evaluation of + ** arguments past the first non-NULL argument. + */ + int endCoalesce = sqlite3VdbeMakeLabel(pParse); + int i; + assert( nFarg>=2 ); + sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); + for(i=1; ia[i].pExpr, target); + } + sqlite3VdbeResolveLabel(v, endCoalesce); + break; + } + + case INLINEFUNC_unlikely: { + /* The UNLIKELY() function is a no-op. The result is the value + ** of the first argument. + */ + assert( nFarg>=1 ); + target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); + break; + } + +#ifdef SQLITE_DEBUG + case INLINEFUNC_affinity: { + /* The AFFINITY() function evaluates to a string that describes + ** the type affinity of the argument. This is used for testing of + ** the SQLite type logic. + */ + const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + char aff; + assert( nFarg==1 ); + aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); + sqlite3VdbeLoadString(v, target, + (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); + break; + } +#endif + } + return target; +} + /* ** Generate code into the current Vdbe to evaluate the given @@ -3953,48 +4016,11 @@ expr_code_doover: sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); break; } - - /* Attempt a direct implementation of the built-in COALESCE() and - ** IFNULL() functions. This avoids unnecessary evaluation of - ** arguments past the first non-NULL argument. - */ - if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){ - int endCoalesce = sqlite3VdbeMakeLabel(pParse); - assert( nFarg>=2 ); - sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); - for(i=1; ia[i].pExpr, target); - } - sqlite3VdbeResolveLabel(v, endCoalesce); - break; + if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ + return exprCodeInlineFunction(pParse, pFarg, + SQLITE_PTR_TO_INT(pDef->pUserData), target); } - /* The UNLIKELY() function is a no-op. The result is the value - ** of the first argument. - */ - if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ - assert( nFarg>=1 ); - return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); - } - -#ifdef SQLITE_DEBUG - /* The AFFINITY() function evaluates to a string that describes - ** the type affinity of the argument. This is used for testing of - ** the SQLite type logic. - */ - if( pDef->funcFlags & SQLITE_FUNC_AFFINITY ){ - const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; - char aff; - assert( nFarg==1 ); - aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); - sqlite3VdbeLoadString(v, target, - (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); - return target; - } -#endif - for(i=0; ia[i].pExpr) ){ testcase( i==31 ); diff --git a/src/func.c b/src/func.c index d4c6936b10..31b548ff93 100644 --- a/src/func.c +++ b/src/func.c @@ -1921,11 +1921,11 @@ void sqlite3RegisterBuiltinFunctions(void){ DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ - FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(unlikely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), #ifdef SQLITE_DEBUG - FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY), + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), #endif #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| @@ -1959,7 +1959,7 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), FUNCTION(hex, 1, 0, 0, hexFunc ), - FUNCTION2(ifnull, 2, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), VFUNCTION(random, 0, 0, 0, randomFunc ), VFUNCTION(randomblob, 1, 0, 0, randomBlob ), FUNCTION(nullif, 2, 0, 1, nullifFunc ), @@ -1999,7 +1999,7 @@ void sqlite3RegisterBuiltinFunctions(void){ #endif FUNCTION(coalesce, 1, 0, 0, 0 ), FUNCTION(coalesce, 0, 0, 0, 0 ), - FUNCTION2(coalesce, -1, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), }; #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0dcb103532..d696ffd3a0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1712,12 +1712,18 @@ struct FuncDestructor { #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ -#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ +#define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ #define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ +#define SQLITE_FUNC_INLINE 0x00200000 /* Functions implemented in-line */ + +/* Identifier numbers for each in-line function */ +#define INLINEFUNC_unlikely 0 /* unlikely(EXPR) and friends */ +#define INLINEFUNC_coalesce 1 /* coalesce(EXPR,...) */ +#define INLINEFUNC_affinity 2 /* affinity(EXPR) */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -1737,6 +1743,18 @@ struct FuncDestructor { ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and ** adds the SQLITE_DIRECTONLY flag. ** +** INLINE_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a function that is implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** +** TEST_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a test-only function implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** ** DFUNCTION(zName, nArg, iArg, bNC, xFunc) ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and ** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions @@ -1779,6 +1797,13 @@ struct FuncDestructor { #define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_UTF8|SQLITE_DIRECTONLY, \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define INLINE_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } +#define TEST_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \ + SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } #define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ 0, 0, xFunc, 0, 0, 0, #zName, {0} } From 171c50ec381c5fb4ff1e8b258a49fbf810917011 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 15:43:30 +0000 Subject: [PATCH 06/20] New test-only SQL functions: implies_nonnull_row(), expr_compare(), and expr_implies_expr(). The SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control is modified to toggle internal function access on and off for a single database connection. FossilOrigin-Name: 473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 --- manifest | 36 +++++++++++++++++------------------ manifest.uuid | 2 +- src/expr.c | 41 ++++++++++++++++++++++++++++++++++++++-- src/func.c | 11 ++++++++--- src/global.c | 1 - src/main.c | 11 +++++------ src/resolve.c | 2 +- src/shell.c.in | 8 ++++++-- src/sqliteInt.h | 11 +++++++---- src/test1.c | 11 ++++++++++- test/alter.test | 4 ++-- test/altercol.test | 4 ++-- test/altertab.test | 4 ++-- test/fkey2.test | 12 ++++++------ test/without_rowid3.test | 12 ++++++------ 15 files changed, 113 insertions(+), 57 deletions(-) diff --git a/manifest b/manifest index 1899d7f3fb..e18705c664 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Factor\sout\scode\sgeneration\sfor\sin-line\sSQL\sfunctions\sinto\sa\sseparate\sroutine\ninside\sof\sexpr.c. -D 2020-01-01T13:55:08.668 +C New\stest-only\sSQL\sfunctions:\simplies_nonnull_row(),\sexpr_compare(),\sand\nexpr_implies_expr().\s\sThe\sSQLITE_TESTCTRL_INTERNAL_FUNCTIONS\stest-control\nis\smodified\sto\stoggle\sinternal\sfunction\saccess\son\sand\soff\sfor\sa\ssingle\ndatabase\sconnection. +D 2020-01-01T15:43:30.603 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,11 +480,11 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c afde0ea1060266338820277d210edc0ed383416c59e5f3472a253f121b5a9de3 +F src/expr.c 971e442fd52c493826a23e993de94e504adb10e5979d69169786af594687911b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 -F src/func.c de2641a4763c78b872099649c12adedc638a83df0c41dcb0cb99efc6ceb5f69b -F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 +F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c +F src/global.c bdd582ba2be6f29ffa5b9b91635c0dbea98101a25c92da15d1caca5ac999c7bb F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -492,7 +492,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb +F src/main.c a76071a978b59055e63d4b5befa1efacc34e985984943251b300e682fee0e776 F src/malloc.c 550021fcae36f0ffe9f8563d83e6385f9df307a854d55d7d0abb7241ee8dbcc6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -526,19 +526,19 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 +F src/resolve.c 17c74d7c180b50c703c404c1be7b80769536d9a1913fee4fc176cd95e445966b F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 2a753ec714703c32e4aade5b0115033bbee8a377b215cb0fbe88ab2fa4b3e028 -F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded +F src/shell.c.in 36fb3732ee465f1a418add45aec616ecc5d936245c616be761f3b6ba7bb3661e F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h a7d75ef422e07c85eaeb12309b071f3342497d960bf0a353dca8665be6ceb576 +F src/sqliteInt.h e6db732b65fa526ceb75183fbb03cd4b00d4a7741485bcb0dc71222323f52166 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 8cd2600e8de23dff6cdf84d39f46ca57139b061b28f6f80b166bace17d52ab1c -F src/test1.c c654981c1d86ebc90dd23fcc0969e6c85e28112f0acc2e2224a97a2a33e7c42f +F src/test1.c 4d0ab2f67053a4fff87d1d3586ecc0e5322a1fc45dd4119ab11dc96de44f17a1 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -626,17 +626,17 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 16ed8d2470193f34bc711e51506ff1211ebfab8025ca3b9510ff2aef139874cb +F test/alter.test 77f0092d137dd9470fc683b64ed92868e188462e713e52f48deae8902ea60b96 F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 F test/alter3.test 9351a9f0c59ff9dddecccaaa2f777ffee5369870c63d30d3a74add815254ec0f F test/alter4.test 74b22251c5e9c48093cfc4921ed9c11b59df84634aeeb00e501773320beb8424 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1a31ad +F test/altercol.test 1d6a6fe698b81e626baea4881f5717f9bc53d7d07f1cd23ee7ad1b931f117ddf F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 4d8b79b0b88b62b90b710390df14fe99e0a3578345526886eaa550e28e3065dc +F test/altertab.test bd61e5b73d495ec4707133db91b07f09d57e339d988de5ec5a76d34a2198e8f2 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f @@ -867,7 +867,7 @@ F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f9339 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test d35d1c81e7569bdd2b872e91750f7098117d2e8291369f70b7e3d50a0e523dc2 +F test/fkey2.test 65c86b11127c11f80c0f450b3480321e0f087edea3031b9daa1978e3c020c91b F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a @@ -1740,7 +1740,7 @@ F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f1982 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691 +F test/without_rowid3.test 392e6e12f275d11d931a8bc4580e573342f391639c87ffb631010a7b3cedfdc0 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 -R cfe1bf37072aa553a15293de91196bb1 +P 586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb +R 3b4f115c4445c4450469f73abe883b1d U drh -Z 1739d48acd97cb5e3553660f1568a9b2 +Z 13c9af33d91ecf550a075017a4801480 diff --git a/manifest.uuid b/manifest.uuid index 82209644bd..d2123d7daa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb \ No newline at end of file +473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 629768f3a2..da7e4bc349 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3608,15 +3608,52 @@ static int exprCodeInlineFunction( break; } - case INLINEFUNC_unlikely: { + default: { /* The UNLIKELY() function is a no-op. The result is the value ** of the first argument. */ - assert( nFarg>=1 ); + assert( nFarg==1 || nFarg==2 ); target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); break; } + /*********************************************************************** + ** Test-only SQL functions that are only usable if enabled + ** via SQLITE_TESTCTRL_INTERNAL_FUNCTIONS + */ + case INLINEFUNC_expr_compare: { + /* Compare two expressions using sqlite3ExprCompare() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprCompare(0,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_expr_implies_expr: { + /* Compare two expressions using sqlite3ExprImpliesExpr() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesExpr(pParse,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_implies_nonnull_row: { + /* REsult of sqlite3ExprImpliesNonNullRow() */ + Expr *pA1; + assert( nFarg==2 ); + pA1 = pFarg->a[1].pExpr; + if( pA1->op==TK_COLUMN ){ + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesNonNullRow(pFarg->a[0].pExpr,pA1->iTable), + target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } + #ifdef SQLITE_DEBUG case INLINEFUNC_affinity: { /* The AFFINITY() function evaluates to a string that describes diff --git a/src/func.c b/src/func.c index 31b548ff93..be4975afcc 100644 --- a/src/func.c +++ b/src/func.c @@ -1907,6 +1907,14 @@ void sqlite3RegisterBuiltinFunctions(void){ ** For peak efficiency, put the most frequently used function last. */ static FuncDef aBuiltinFunc[] = { +/***** Functions only available with SQLITE_TESTCTRL_INTERNAL_FUNCTIONS *****/ + TEST_FUNC(implies_nonnull_row, 2, INLINEFUNC_implies_nonnull_row, 0), + TEST_FUNC(expr_compare, 2, INLINEFUNC_expr_compare, 0), + TEST_FUNC(expr_implies_expr, 2, INLINEFUNC_expr_implies_expr, 0), +#ifdef SQLITE_DEBUG + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), +#endif +/***** Regular functions *****/ #ifdef SQLITE_SOUNDEX FUNCTION(soundex, 1, 0, 0, soundexFunc ), #endif @@ -1924,9 +1932,6 @@ void sqlite3RegisterBuiltinFunctions(void){ INLINE_FUNC(unlikely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), -#ifdef SQLITE_DEBUG - TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), -#endif #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| SQLITE_FUNC_TYPEOF), diff --git a/src/global.c b/src/global.c index 4689e94bb4..d8b3e1d31a 100644 --- a/src/global.c +++ b/src/global.c @@ -258,7 +258,6 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ - 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ 0, /* iPrngSeed */ diff --git a/src/main.c b/src/main.c index 1afeee0bdb..880106a850 100644 --- a/src/main.c +++ b/src/main.c @@ -4044,15 +4044,14 @@ int sqlite3_test_control(int op, ...){ break; } - /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCS, int onoff); + /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, sqlite3*); ** - ** If parameter onoff is non-zero, internal-use-only SQL functions - ** are visible to ordinary SQL. This is useful for testing but is - ** unsafe because invalid parameters to those internal-use-only functions - ** can result in crashes or segfaults. + ** Toggle the ability to use internal functions on or off for + ** the database connection given in the argument. */ case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { - sqlite3GlobalConfig.bInternalFunctions = va_arg(ap, int); + sqlite3 *db = va_arg(ap, sqlite3*); + db->mDbFlags ^= DBFLAG_InternalFunc; break; } diff --git a/src/resolve.c b/src/resolve.c index a0f9c0f22f..ec082ba256 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -874,7 +874,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 && pParse->nested==0 - && sqlite3Config.bInternalFunctions==0 + && (pParse->db->mDbFlags & DBFLAG_InternalFunc)==0 ){ /* Internal-use-only functions are disallowed unless the ** SQL is being compiled using sqlite3NestedParse() */ diff --git a/src/shell.c.in b/src/shell.c.in index e6b6f1a1b3..1143d5309a 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9219,7 +9219,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/ { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, - { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN" }, + { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" }, { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, @@ -9335,7 +9335,6 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(int, int) */ case SQLITE_TESTCTRL_ASSERT: case SQLITE_TESTCTRL_ALWAYS: - case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: if( nArg==3 ){ int opt = booleanValue(azArg[2]); rc2 = sqlite3_test_control(testctrl, opt); @@ -9353,6 +9352,11 @@ static int do_meta_command(char *zLine, ShellState *p){ } break; + /* sqlite3_test_control(sqlite3*) */ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: + rc2 = sqlite3_test_control(testctrl, p->db); + break; + case SQLITE_TESTCTRL_IMPOSTER: if( nArg==5 ){ rc2 = sqlite3_test_control(testctrl, p->db, diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d696ffd3a0..8090f77cc1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1589,6 +1589,7 @@ struct sqlite3 { #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ #define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ #define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ +#define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the @@ -1721,9 +1722,12 @@ struct FuncDestructor { #define SQLITE_FUNC_INLINE 0x00200000 /* Functions implemented in-line */ /* Identifier numbers for each in-line function */ -#define INLINEFUNC_unlikely 0 /* unlikely(EXPR) and friends */ -#define INLINEFUNC_coalesce 1 /* coalesce(EXPR,...) */ -#define INLINEFUNC_affinity 2 /* affinity(EXPR) */ +#define INLINEFUNC_coalesce 0 +#define INLINEFUNC_implies_nonnull_row 1 +#define INLINEFUNC_expr_implies_expr 2 +#define INLINEFUNC_expr_compare 3 +#define INLINEFUNC_affinity 4 +#define INLINEFUNC_unlikely 99 /* Default case */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -3561,7 +3565,6 @@ struct Sqlite3Config { int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ - int bInternalFunctions; /* Internal SQL functions are visible */ int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ diff --git a/src/test1.c b/src/test1.c index b6a39aad5e..5b07aef2d5 100644 --- a/src/test1.c +++ b/src/test1.c @@ -6872,7 +6872,16 @@ static int SQLITE_TCLAPI test_test_control( iFlag = aVerb[iVerb].i; switch( iFlag ){ - case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { + sqlite3 *db = 0; + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 2, objv, "DB"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[2]), &db) ) return TCL_ERROR; + sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, db); + break; + } case SQLITE_TESTCTRL_LOCALTIME_FAULT: { int val; if( objc!=3 ){ diff --git a/test/alter.test b/test/alter.test index a82456d47b..0ec485ef81 100644 --- a/test/alter.test +++ b/test/alter.test @@ -684,7 +684,7 @@ do_test alter-8.2 { # alter-9.X - Special test: Make sure the sqlite_rename_column() and # rename_table() functions do not crash when handed bad input. # -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test alter-9.1 { execsql {SELECT SQLITE_RENAME_COLUMN(0,0,0,0,0,0,0,0,0)} } {{}} @@ -697,7 +697,7 @@ foreach {tn sql} { catch { execsql $sql } } 1 } -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # If the INTERNAL_FUNCTIONS test-control is disabled (which is the default), # then the sqlite_rename_table() SQL function is not accessible to ordinary SQL. diff --git a/test/altercol.test b/test/altercol.test index d71a9b06e4..1479b3a7d3 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -618,7 +618,7 @@ foreach {tn trigger error} { #------------------------------------------------------------------------- # Passing invalid parameters directly to sqlite_rename_column(). # -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_execsql_test 14.1 { CREATE TABLE ddd(sql, type, object, db, tbl, icol, znew, bquote); INSERT INTO ddd VALUES( @@ -641,7 +641,7 @@ do_execsql_test 14.2 { sqlite_rename_column(sql, type, object, db, tbl, icol, znew, bquote, 0) FROM ddd; } {{} {} {} {}} -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # If the INTERNAL_FUNCTIONS test-control is disabled (which is the default) # then the sqlite_rename_table() SQL function is not accessible to diff --git a/test/altertab.test b/test/altertab.test index 3f0398fd5e..7dcf8a5e0d 100644 --- a/test/altertab.test +++ b/test/altertab.test @@ -240,13 +240,13 @@ ifcapable vtab { ); } {} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_execsql_test 7.2 { SELECT sqlite_rename_table(db, 0, 0, sql, zOld, zNew, bTemp) FROM ddd; } {{} {} {}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db } #------------------------------------------------------------------------- diff --git a/test/fkey2.test b/test/fkey2.test index 86316f2936..e7fa7b6457 100644 --- a/test/fkey2.test +++ b/test/fkey2.test @@ -987,7 +987,7 @@ ifcapable altertable { 'main', 'table', 't1', $zCreate, $zOld, $zNew, 0 )} } - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test fkey2-14.2.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -997,7 +997,7 @@ ifcapable altertable { do_test fkey2-14.2.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1070,7 +1070,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test fkey2-14.2tmp.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1080,7 +1080,7 @@ ifcapable altertable { do_test fkey2-14.2tmp.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1154,7 +1154,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test fkey2-14.2aux.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1164,7 +1164,7 @@ ifcapable altertable { do_test fkey2-14.2aux.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # diff --git a/test/without_rowid3.test b/test/without_rowid3.test index b895f06cf3..24ef2304de 100644 --- a/test/without_rowid3.test +++ b/test/without_rowid3.test @@ -953,7 +953,7 @@ ifcapable altertable { 'main', 'table', 't1', $zCreate, $zOld, $zNew, 0 )} } - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test without_rowid3-14.2.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -963,7 +963,7 @@ ifcapable altertable { do_test without_rowid3-14.2.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1039,7 +1039,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test without_rowid3-14.2tmp.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1049,7 +1049,7 @@ ifcapable altertable { do_test without_rowid3-14.2tmp.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1126,7 +1126,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test without_rowid3-14.2aux.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1136,7 +1136,7 @@ ifcapable altertable { do_test without_rowid3-14.2aux.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # From aef81674211ab2f0f93852e3e9ca3bebb7e77c0b Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 16:43:41 +0000 Subject: [PATCH 07/20] Fix the sqlite3ExprImpliesNonNullRow() routine so that it correctly handles a numeric comparison of two AND subexpressions. FossilOrigin-Name: 07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 11 ++++++----- test/expr.test | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index e18705c664..a8574aaf05 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest-only\sSQL\sfunctions:\simplies_nonnull_row(),\sexpr_compare(),\sand\nexpr_implies_expr().\s\sThe\sSQLITE_TESTCTRL_INTERNAL_FUNCTIONS\stest-control\nis\smodified\sto\stoggle\sinternal\sfunction\saccess\son\sand\soff\sfor\sa\ssingle\ndatabase\sconnection. -D 2020-01-01T15:43:30.603 +C Fix\sthe\ssqlite3ExprImpliesNonNullRow()\sroutine\sso\sthat\sit\scorrectly\nhandles\sa\snumeric\scomparison\sof\stwo\sAND\ssubexpressions. +D 2020-01-01T16:43:41.805 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 971e442fd52c493826a23e993de94e504adb10e5979d69169786af594687911b +F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -855,7 +855,7 @@ F test/exclusive.test d6ccc6acc5d660544f8e0cacaec2c620f8ebb42a764d783ab53430e260 F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac -F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea +F test/expr.test 26cd01e8485bc48c8aa6a1add598e9ce1e706b4eb4f3f554e0b0223022e8c2cf F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb -R 3b4f115c4445c4450469f73abe883b1d +P 473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 +R 2d8f123f2e4a8a472445b72603dcb7b0 U drh -Z 13c9af33d91ecf550a075017a4801480 +Z d39001e583054b62fec0d63ed0de45b7 diff --git a/manifest.uuid b/manifest.uuid index d2123d7daa..d44eaabffb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 \ No newline at end of file +07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index da7e4bc349..1c03cf634e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5359,11 +5359,12 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ return WRC_Prune; case TK_AND: - assert( pWalker->eCode==0 ); - sqlite3WalkExpr(pWalker, pExpr->pLeft); - if( pWalker->eCode ){ - pWalker->eCode = 0; - sqlite3WalkExpr(pWalker, pExpr->pRight); + if( pWalker->eCode==0 ){ + sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( pWalker->eCode ){ + pWalker->eCode = 0; + sqlite3WalkExpr(pWalker, pExpr->pRight); + } } return WRC_Prune; diff --git a/test/expr.test b/test/expr.test index 3cdc9180e8..ec5c55c2e4 100644 --- a/test/expr.test +++ b/test/expr.test @@ -1036,4 +1036,24 @@ foreach {tn val} [list 1 NaN 2 -NaN 3 NaN0 4 -NaN0 5 Inf 6 -Inf] { } {0} } +reset_db +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db +do_execsql_test expr-16.1 { + CREATE TABLE t1(a,b,c); + CREATE TABLE dual(dummy); + INSERT INTO dual VALUES('X'); +} {} +do_execsql_test expr-16.100 { + SELECT implies_nonnull_row( (b=1 AND 0)>(b=3 AND 0),a) + FROM dual LEFT JOIN t1; +} {0} +do_execsql_test expr-16.101 { + SELECT implies_nonnull_row( (b=1 AND 0)>(b=3 AND a=4),a) + FROM dual LEFT JOIN t1; +} {1} +do_execsql_test expr-16.102 { + SELECT implies_nonnull_row( (b=1 AND a=2)>(b=3 AND a=4),a) + FROM dual LEFT JOIN t1; +} {1} + finish_test From 4ea562ee7007f184b53faa4a2bbdbfa70d0dbe9c Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 1 Jan 2020 20:17:15 +0000 Subject: [PATCH 08/20] Ensure that when code for a scalar SELECT featuring window functions is generated more than once by the planner, separate ephemeral tables are opened for each instance. FossilOrigin-Name: ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/select.c | 2 +- src/sqliteInt.h | 2 +- src/window.c | 13 ++++++++----- test/window1.test | 23 +++++++++++++++++++++++ 6 files changed, 44 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index a8574aaf05..75b662d105 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\ssqlite3ExprImpliesNonNullRow()\sroutine\sso\sthat\sit\scorrectly\nhandles\sa\snumeric\scomparison\sof\stwo\sAND\ssubexpressions. -D 2020-01-01T16:43:41.805 +C Ensure\sthat\swhen\scode\sfor\sa\sscalar\sSELECT\sfeaturing\swindow\sfunctions\sis\sgenerated\smore\sthan\sonce\sby\sthe\splanner,\sseparate\sephemeral\stables\sare\sopened\sfor\seach\sinstance. +D 2020-01-01T20:17:15.714 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -528,12 +528,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17c74d7c180b50c703c404c1be7b80769536d9a1913fee4fc176cd95e445966b F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 2a753ec714703c32e4aade5b0115033bbee8a377b215cb0fbe88ab2fa4b3e028 +F src/select.c ba1af88f0dc93a03c0d5c379aab518109912cf87f92f1196de52812174e6fc9f F src/shell.c.in 36fb3732ee465f1a418add45aec616ecc5d936245c616be761f3b6ba7bb3661e F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h e6db732b65fa526ceb75183fbb03cd4b00d4a7741485bcb0dc71222323f52166 +F src/sqliteInt.h 52a9d124cf7bc902eeaee8b744f928f38a8ca343f9555a922f3800bbca35533c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -618,7 +618,7 @@ F src/where.c 602e5093556bbd9090c0a9bd834fec0717e3a4b0377a021d38091a6d554a1177 F src/whereInt.h a727b32260e12707a8c1bc29d7f7e9b6dc1a44551a45093d5968fbe570ff0c56 F src/wherecode.c a987d22b42e09b06f3a49596e0953b1cd28e568cc656681776edc0026cfac0cc F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 -F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 +F src/window.c 659d613248f8bb8630f51409dc08235e4494c3c84162a535d9f88b38515f390a F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test cd6e2dafaa14ae26c995547013a9765356d910f473664497c926ea3f47510997 +F test/window1.test 30f38038f2878a28befa66c288099e5da131ba673799d73d0864f08375d503e1 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 -R 2d8f123f2e4a8a472445b72603dcb7b0 -U drh -Z d39001e583054b62fec0d63ed0de45b7 +P 07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb +R ca9b505edc6627c7559e6f132a7a42f0 +U dan +Z 91f49b7c37ac409cb8d99713dae333ea diff --git a/manifest.uuid b/manifest.uuid index d44eaabffb..d2e2d0b759 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb \ No newline at end of file +ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c \ No newline at end of file diff --git a/src/select.c b/src/select.c index 247ccfbaae..1a23b2b26f 100644 --- a/src/select.c +++ b/src/select.c @@ -6177,7 +6177,7 @@ int sqlite3Select( #ifndef SQLITE_OMIT_WINDOWFUNC Window *pWin = p->pWin; /* Master window object (or NULL) */ if( pWin ){ - sqlite3WindowCodeInit(pParse, pWin); + sqlite3WindowCodeInit(pParse, p); } #endif assert( WHERE_USE_LIMIT==SF_FixedLimit ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8090f77cc1..6eb07b7c60 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3727,7 +3727,7 @@ Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); void sqlite3WindowAttach(Parse*, Expr*, Window*); void sqlite3WindowLink(Select *pSel, Window *pWin); int sqlite3WindowCompare(Parse*, Window*, Window*, int); -void sqlite3WindowCodeInit(Parse*, Window*); +void sqlite3WindowCodeInit(Parse*, Select*); void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); int sqlite3WindowRewrite(Parse*, Select*); int sqlite3ExpandSubquery(Parse*, struct SrcList_item*); diff --git a/src/window.c b/src/window.c index 15a49f4423..5fb78ce358 100644 --- a/src/window.c +++ b/src/window.c @@ -1033,10 +1033,6 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc->a[0].pTab = pTab; pTab = pTab2; } - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); - sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); - sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); - sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); }else{ sqlite3SelectDelete(db, pSub); } @@ -1308,10 +1304,17 @@ int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ ** to begin iterating through the sub-query results. It is used to allocate ** and initialize registers and cursors used by sqlite3WindowCodeStep(). */ -void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ +void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ + int nEphExpr = pSelect->pSrc->a[0].pSelect->pEList->nExpr; + Window *pMWin = pSelect->pWin; Window *pWin; Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, nEphExpr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); + /* Allocate registers to use for PARTITION BY values, if any. Initialize ** said registers to NULL. */ if( pMWin->pPartition ){ diff --git a/test/window1.test b/test/window1.test index 0b7884784f..a2d26a2f7b 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1531,4 +1531,27 @@ do_execsql_test 45.2 { ); } {2000 2000 10000} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 46.1 { + CREATE TABLE t1 (a); + CREATE INDEX i1 ON t1(a); + + INSERT INTO t1 VALUES (10); +} + +do_execsql_test 46.2 { + SELECT (SELECT sum(a) OVER(ORDER BY a)) FROM t1 +} 10 + +do_execsql_test 46.3 { + SELECT * FROM t1 WHERE (SELECT sum(a) OVER(ORDER BY a)); +} 10 + +do_execsql_test 46.4 { + SELECT * FROM t1 NATURAL JOIN t1 + WHERE a=1 + OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10) +} 10 + finish_test From fc705da15d0af088db099aa5c8c2b26fa63fe951 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 21:14:30 +0000 Subject: [PATCH 09/20] When generating code for a subquery, make a copy of the Select object and generate the code out of the copy, in case the code generator makes modifications to expression and the Select object needs to be reused. FossilOrigin-Name: 4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 15 ++++++++++++--- test/select1.test | 13 +++++++++++++ 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 75b662d105..dac35a2241 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\swhen\scode\sfor\sa\sscalar\sSELECT\sfeaturing\swindow\sfunctions\sis\sgenerated\smore\sthan\sonce\sby\sthe\splanner,\sseparate\sephemeral\stables\sare\sopened\sfor\seach\sinstance. -D 2020-01-01T20:17:15.714 +C When\sgenerating\scode\sfor\sa\ssubquery,\smake\sa\scopy\sof\sthe\sSelect\sobject\sand\ngenerate\sthe\scode\sout\sof\sthe\scopy,\sin\scase\sthe\scode\sgenerator\smakes\nmodifications\sto\sexpression\sand\sthe\sSelect\sobject\sneeds\sto\sbe\sreused. +D 2020-01-01T21:14:30.174 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 +F src/expr.c 7f3a19d0d400d079bd5e40389c75634a1b6feeb91eadfff5919d5b7d73f0c418 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -1295,7 +1295,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test b887331202618dbdabed92446b661ebd95a55ef3923700af56ed71266e9c1157 +F test/select1.test 0aaefed5e770232effeba2d19b8dde01b639d617b844cb2492a75961e4119549 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 3905450067c28766bc83ee397f6d87342de868baa60f2bcfd00f286dfbd62cb9 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb -R ca9b505edc6627c7559e6f132a7a42f0 -U dan -Z 91f49b7c37ac409cb8d99713dae333ea +P ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c +R 27455ef65ab3880a3c1e4f96d6b4fc0f +U drh +Z c1086ddd18661ca4be21f6cd956e9129 diff --git a/manifest.uuid b/manifest.uuid index d2e2d0b759..0e9ee4f3a6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c \ No newline at end of file +4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 1c03cf634e..b441b9a4f7 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2933,6 +2933,8 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ SelectDest dest; /* How to deal with SELECT result */ int nReg; /* Registers to allocate */ Expr *pLimit; /* New limit expression */ + Select *pCopy; /* Copy of pSel */ + int rc; /* return value from subroutine call */ Vdbe *v = pParse->pVdbe; assert( v!=0 ); @@ -3016,9 +3018,16 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); } pSel->iLimit = 0; - if( sqlite3Select(pParse, pSel, &dest) ){ - return 0; - } + + /* pSel might be reused. So generate code using a copy of pSel, so that + ** if the code generator modifies the underlying structure of the SELECT + ** (for example in whereIndexExprTrans()) the original in pSel will be + ** unchanged. */ + pCopy = sqlite3SelectDup(pParse->db, pSel, 0); + rc = sqlite3Select(pParse, pCopy, &dest); + sqlite3SelectDelete(pParse->db, pCopy); + if( rc ) return 0; + pExpr->iTable = rReg = dest.iSDParm; ExprSetVVAProperty(pExpr, EP_NoReduce); if( addrOnce ){ diff --git a/test/select1.test b/test/select1.test index 47dcd0fe4a..b4d62554ae 100644 --- a/test/select1.test +++ b/test/select1.test @@ -1184,5 +1184,18 @@ do_catchsql_test select-19.21 { ORDER BY 1; } {1 {table t1 has 1 columns but 15 values were supplied}} +# 2020-01-01 Found by Yongheng's fuzzer +# +reset_db +do_execsql_test select-20.10 { + CREATE TABLE t1 ( + a INTEGER PRIMARY KEY, + b AS('Y') UNIQUE + ); + INSERT INTO t1(a) VALUES (10); + SELECT * FROM t1 JOIN t1 USING(a,b) + WHERE ((SELECT t1.a FROM t1 AS x GROUP BY b) AND b=0) + OR a = 10; +} {10 Y} finish_test From 2a83c100728451558b8b3e07e4d172bf9ef9f7fb Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 23:02:35 +0000 Subject: [PATCH 10/20] Provide the -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time option. Fix the ".testctrl internal_function" command in the CLI so that it does not signal an error on a valid input. FossilOrigin-Name: 8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/main.c | 7 +++++++ src/shell.c.in | 1 + 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index dac35a2241..db0f653441 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sgenerating\scode\sfor\sa\ssubquery,\smake\sa\scopy\sof\sthe\sSelect\sobject\sand\ngenerate\sthe\scode\sout\sof\sthe\scopy,\sin\scase\sthe\scode\sgenerator\smakes\nmodifications\sto\sexpression\sand\sthe\sSelect\sobject\sneeds\sto\sbe\sreused. -D 2020-01-01T21:14:30.174 +C Provide\sthe\s-DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1\scompile-time\soption.\s\sFix\nthe\s".testctrl\sinternal_function"\scommand\sin\sthe\sCLI\sso\sthat\sit\sdoes\snot\nsignal\san\serror\son\sa\svalid\sinput. +D 2020-01-01T23:02:35.846 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -492,7 +492,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c a76071a978b59055e63d4b5befa1efacc34e985984943251b300e682fee0e776 +F src/main.c 7b06af0c38abf9720d9a5c49660bff8b7137427bbd513fa069baf8afa15da4d7 F src/malloc.c 550021fcae36f0ffe9f8563d83e6385f9df307a854d55d7d0abb7241ee8dbcc6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -529,7 +529,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17c74d7c180b50c703c404c1be7b80769536d9a1913fee4fc176cd95e445966b F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c ba1af88f0dc93a03c0d5c379aab518109912cf87f92f1196de52812174e6fc9f -F src/shell.c.in 36fb3732ee465f1a418add45aec616ecc5d936245c616be761f3b6ba7bb3661e +F src/shell.c.in 90b002bf0054399cbbfac62dd752a9b05770427ba141bcba75eefbb0098f4280 F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c -R 27455ef65ab3880a3c1e4f96d6b4fc0f +P 4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 +R 7719ca5b06b1882198898d45d0aa33b1 U drh -Z c1086ddd18661ca4be21f6cd956e9129 +Z a96bfaa62b0a101e6ed6e47d09a94ada diff --git a/manifest.uuid b/manifest.uuid index 0e9ee4f3a6..e2f996a6cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 \ No newline at end of file +8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a \ No newline at end of file diff --git a/src/main.c b/src/main.c index 880106a850..8a811f45b0 100644 --- a/src/main.c +++ b/src/main.c @@ -3312,6 +3312,13 @@ static int openDatabase( } #endif +#ifdef SQLITE_ENABLE_INTERNAL_FUNCTIONS + /* Testing use only!!! The -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time + ** option gives access to internal functions by default. + ** Testing use only!!! */ + db->mDbFlags |= DBFLAG_InternalFunc; +#endif + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking ** mode. Doing nothing at all also makes NORMAL the default. diff --git a/src/shell.c.in b/src/shell.c.in index 1143d5309a..da2c78d70e 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9355,6 +9355,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(sqlite3*) */ case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: rc2 = sqlite3_test_control(testctrl, p->db); + isOk = 3; break; case SQLITE_TESTCTRL_IMPOSTER: From 36e678bc398e864ec0806cf381408a57d6dcd4c4 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 00:45:38 +0000 Subject: [PATCH 11/20] The sqlite3WhereEnd() call now unwinds all Expr modifications made by the sqlite3WhereBegin(). FossilOrigin-Name: 7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 --- manifest | 19 ++++++++++--------- manifest.uuid | 2 +- src/expr.c | 15 +++------------ src/where.c | 9 +++++++++ src/whereInt.h | 27 +++++++++++++++++++++------ src/wherecode.c | 19 +++++++++++++++++++ 6 files changed, 63 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index db0f653441..1997e94b95 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\sthe\s-DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1\scompile-time\soption.\s\sFix\nthe\s".testctrl\sinternal_function"\scommand\sin\sthe\sCLI\sso\sthat\sit\sdoes\snot\nsignal\san\serror\son\sa\svalid\sinput. -D 2020-01-01T23:02:35.846 +C The\ssqlite3WhereEnd()\scall\snow\sunwinds\sall\sExpr\smodifications\smade\sby\sthe\nsqlite3WhereBegin(). +D 2020-01-02T00:45:38.107 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 7f3a19d0d400d079bd5e40389c75634a1b6feeb91eadfff5919d5b7d73f0c418 +F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -614,9 +614,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 602e5093556bbd9090c0a9bd834fec0717e3a4b0377a021d38091a6d554a1177 -F src/whereInt.h a727b32260e12707a8c1bc29d7f7e9b6dc1a44551a45093d5968fbe570ff0c56 -F src/wherecode.c a987d22b42e09b06f3a49596e0953b1cd28e568cc656681776edc0026cfac0cc +F src/where.c 9353093c2a444580857006fc959494edc40e2393ac08a1f7e1eefe455c079cdb +F src/whereInt.h d2b771335083070ff82991cc43603e2db27b7ba1313da72de092c50c68f2be9c +F src/wherecode.c b8acf97f95de7398455e238036e96aeda8563d87c6b8108c967396431b6f2307 F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 659d613248f8bb8630f51409dc08235e4494c3c84162a535d9f88b38515f390a F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1853,7 +1853,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 -R 7719ca5b06b1882198898d45d0aa33b1 +P 8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a +Q -4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 +R 78a3f85d954b3a0eb1fce93a6a40c0b8 U drh -Z a96bfaa62b0a101e6ed6e47d09a94ada +Z 7a9eae0197a9672b5fa1c50dd4bf6963 diff --git a/manifest.uuid b/manifest.uuid index e2f996a6cd..10cbba2b95 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a \ No newline at end of file +7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b441b9a4f7..1c03cf634e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2933,8 +2933,6 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ SelectDest dest; /* How to deal with SELECT result */ int nReg; /* Registers to allocate */ Expr *pLimit; /* New limit expression */ - Select *pCopy; /* Copy of pSel */ - int rc; /* return value from subroutine call */ Vdbe *v = pParse->pVdbe; assert( v!=0 ); @@ -3018,16 +3016,9 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); } pSel->iLimit = 0; - - /* pSel might be reused. So generate code using a copy of pSel, so that - ** if the code generator modifies the underlying structure of the SELECT - ** (for example in whereIndexExprTrans()) the original in pSel will be - ** unchanged. */ - pCopy = sqlite3SelectDup(pParse->db, pSel, 0); - rc = sqlite3Select(pParse, pCopy, &dest); - sqlite3SelectDelete(pParse->db, pCopy); - if( rc ) return 0; - + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; + } pExpr->iTable = rReg = dest.iSDParm; ExprSetVVAProperty(pExpr, EP_NoReduce); if( addrOnce ){ diff --git a/src/where.c b/src/where.c index 7c05a58e49..0877b80dd3 100644 --- a/src/where.c +++ b/src/where.c @@ -1942,6 +1942,7 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ pWInfo->pLoops = p->pNextLoop; whereLoopDelete(db, p); } + assert( pWInfo->pExprMods==0 ); sqlite3DbFreeNN(db, pWInfo); } @@ -5440,6 +5441,14 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ } } + /* Undo all Expr node modifications */ + while( pWInfo->pExprMods ){ + WhereExprMod *p = pWInfo->pExprMods; + pWInfo->pExprMods = p->pNext; + memcpy(p->pExpr, &p->orig, sizeof(p->orig)); + sqlite3DbFree(db, p); + } + /* Final cleanup */ pParse->nQueryLoop = pWInfo->savedNQueryLoop; diff --git a/src/whereInt.h b/src/whereInt.h index f500e01d48..ad433652f4 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -433,6 +433,20 @@ struct WhereLoopBuilder { # define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 #endif +/* +** Each instance of this object records a change to a single node +** in an expression tree to cause that node to point to a column +** of an index rather than an expression or a virtual column. All +** such transformations need to be undone at the end of WHERE clause +** processing. +*/ +typedef struct WhereExprMod WhereExprMod; +struct WhereExprMod { + WhereExprMod *pNext; /* Next translation on a list of them all */ + Expr *pExpr; /* The Expr node that was transformed */ + Expr orig; /* Original value of the Expr node */ +}; + /* ** The WHERE clause processing routine has two halves. The ** first part does the start of the WHERE loop and the second @@ -449,24 +463,25 @@ struct WhereInfo { ExprList *pOrderBy; /* The ORDER BY clause or NULL */ ExprList *pResultSet; /* Result set of the query */ Expr *pWhere; /* The complete WHERE clause */ - LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ int iContinue; /* Jump here to continue with next record */ int iBreak; /* Jump here to break out of the loop */ int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ + LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ u8 nLevel; /* Number of nested loop */ i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ - u8 sorted; /* True if really sorted (not just grouped) */ u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ - u8 bDeferredSeek; /* Uses OP_DeferredSeek */ - u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ - u8 bOrderedInnerLoop; /* True if only the inner-most loop is ordered */ + u8 bDeferredSeek : 1; /* Uses OP_DeferredSeek */ + u8 untestedTerms : 1; /* Not all WHERE terms resolved by outer loop */ + u8 bOrderedInnerLoop : 1; /* True if only the inner-most loop is ordered */ + u8 sorted : 1; /* True if really sorted (not just grouped) */ + LogEst nRowOut; /* Estimated number of output rows */ int iTop; /* The very beginning of the WHERE loop */ WhereLoop *pLoops; /* List of all WhereLoop objects */ + WhereExprMod *pExprMods; /* Expression modifications */ Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ - LogEst nRowOut; /* Estimated number of output rows */ WhereClause sWC; /* Decomposition of the WHERE clause */ WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ WhereLevel a[1]; /* Information about each nest loop in WHERE */ diff --git a/src/wherecode.c b/src/wherecode.c index 96c2971a5f..beb23e0c18 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1113,8 +1113,23 @@ typedef struct IdxExprTrans { int iIdxCur; /* The cursor for the index */ int iIdxCol; /* The column for the index */ int iTabCol; /* The column for the table */ + WhereInfo *pWInfo; /* Complete WHERE clause information */ + sqlite3 *db; /* Database connection (for malloc()) */ } IdxExprTrans; +/* +** Preserve pExpr on the WhereETrans list of the WhereInfo. +*/ +static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ + WhereExprMod *pNew; + pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew)); + if( pNew==0 ) return; + pNew->pNext = pTrans->pWInfo->pExprMods; + pTrans->pWInfo->pExprMods = pNew; + pNew->pExpr = pExpr; + memcpy(&pNew->orig, pExpr, sizeof(*pExpr)); +} + /* The walker node callback used to transform matching expressions into ** a reference to an index column for an index on an expression. ** @@ -1124,6 +1139,7 @@ typedef struct IdxExprTrans { static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; @@ -1147,6 +1163,7 @@ static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ assert( pExpr->y.pTab!=0 ); + preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn); pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; @@ -1188,6 +1205,8 @@ static void whereIndexExprTrans( w.u.pIdxTrans = &x; x.iTabCur = iTabCur; x.iIdxCur = iIdxCur; + x.pWInfo = pWInfo; + x.db = pWInfo->pParse->db; for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ i16 iRef = pIdx->aiColumn[iIdxCol]; if( iRef==XN_EXPR ){ From 629b88c683056ad69761cc1ae7e8026dbb4f530f Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 02:50:45 +0000 Subject: [PATCH 12/20] Use OP_Copy instead of OP_SCopy to move the results of a scalar subquery. FossilOrigin-Name: 435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/expr.c | 8 +++++++- test/fuzzdata8.db | Bin 1620992 -> 1720320 bytes 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 1997e94b95..6cf93101f9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3WhereEnd()\scall\snow\sunwinds\sall\sExpr\smodifications\smade\sby\sthe\nsqlite3WhereBegin(). -D 2020-01-02T00:45:38.107 +C Use\sOP_Copy\sinstead\sof\sOP_SCopy\sto\smove\sthe\sresults\sof\sa\sscalar\ssubquery. +D 2020-01-02T02:50:45.152 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 +F src/expr.c 75985a13af1b1d629f5f3c206a2af6250a971dd058d30fce0c0e0ba8d7c899a6 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -1018,7 +1018,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db a0b7151bf505ee9735f6e5a3f7851ecb35121f1cd731ac677a77ee540f358939 +F test/fuzzdata8.db 09733ef4b4246cd97e4513ee315c2900771ead4cc6a5ff83cb511dd43cfc5a43 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1853,8 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a -Q -4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 -R 78a3f85d954b3a0eb1fce93a6a40c0b8 +P 7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 +R d537ec2097ea14e175c328187e686eee U drh -Z 7a9eae0197a9672b5fa1c50dd4bf6963 +Z e19c3a27a330f4b39d07df72e769f17a diff --git a/manifest.uuid b/manifest.uuid index 10cbba2b95..edc96cb1d0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 \ No newline at end of file +435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 1c03cf634e..298843a8ab 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4492,7 +4492,13 @@ void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); if( inReg!=target && pParse->pVdbe ){ - sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); + u8 op; + if( ExprHasProperty(pExpr,EP_Subquery) ){ + op = OP_Copy; + }else{ + op = OP_SCopy; + } + sqlite3VdbeAddOp2(pParse->pVdbe, op, inReg, target); } } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index e103ef27eb0362154219a22b571dbc4e46d10205..108bcad778125ef88bd2f6be47b8203f93c19075 100644 GIT binary patch delta 114124 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 delta 23283 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 From 52f11b885a5580e270fa28cc066b884eea3274b7 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 13:26:49 +0000 Subject: [PATCH 13/20] Add the test_trace_breakpoint() subroutine that is invoked after each instruction is printed while running PRAGMA vdbe_trace=on. Only works for SQLITE_DEBUG builds. Also add parameters "pc" and "pOp" to test_addop_breakpoint() to make it easier to set conditionals. FossilOrigin-Name: 49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 21 +++++++++++++++++++++ src/vdbeaux.c | 13 ++++++++++--- src/vdbemem.c | 4 ++-- 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 6cf93101f9..3a79ec66f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sOP_Copy\sinstead\sof\sOP_SCopy\sto\smove\sthe\sresults\sof\sa\sscalar\ssubquery. -D 2020-01-02T02:50:45.152 +C Add\sthe\stest_trace_breakpoint()\ssubroutine\sthat\sis\sinvoked\safter\seach\ninstruction\sis\sprinted\swhile\srunning\sPRAGMA\svdbe_trace=on.\s\sOnly\sworks\sfor\nSQLITE_DEBUG\sbuilds.\s\sAlso\sadd\sparameters\s"pc"\sand\s"pOp"\sto\s\ntest_addop_breakpoint()\sto\smake\sit\seasier\sto\sset\sconditionals. +D 2020-01-02T13:26:49.943 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,13 +600,13 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 119ddfe16b35fbaaf5460c9b58a8eeb0cc5d43058342af36925411dfc73f9862 +F src/vdbe.c 9d432abf6c7979dc8661572ed5d61773be72a6b7475c0e97901309dc611fe4bd F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 0a9716e47012ef018038c2e1dab9f701a6fb4429bb3ee1d4d0f49497519ace74 +F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c a5c16cfa5e8ec960cf1ae1226a0718b31bb93de8fba7804fb60217e1dbe28721 +F src/vdbemem.c 4029cb6a5a4d94f95e63e29c998791534788ce64ffb0f3bdfd373aba04a7169f F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 -R d537ec2097ea14e175c328187e686eee +P 435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b +R 012a47d79081ec029afe02cb3190d8b3 U drh -Z e19c3a27a330f4b39d07df72e769f17a +Z 44bc6f6389cf28eb8f2cfc35d7778fbb diff --git a/manifest.uuid b/manifest.uuid index edc96cb1d0..06232d4889 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b \ No newline at end of file +49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index cc999a3ebb..ca737ffccb 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -117,6 +117,26 @@ int sqlite3_found_count = 0; # define UPDATE_MAX_BLOBSIZE(P) #endif +#ifdef SQLITE_DEBUG +/* This routine provides a convenient place to set a breakpoint during +** tracing with PRAGMA vdbe_trace=on. The breakpoint fires right after +** each opcode is printed. Variables "pc" (program counter) and pOp are +** available to add conditionals to the breakpoint. GDB example: +** +** break test_trace_breakpoint if pc=22 +** +** Other useful labels for breakpoints include: +** test_addop_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) +*/ +static void test_trace_breakpoint(int pc, Op *pOp){ + static int n = 0; + n++; +} +#endif + /* ** Invoke the VDBE coverage callback, if that callback is defined. This ** feature is used for test suite validation only and does not appear an @@ -738,6 +758,7 @@ int sqlite3VdbeExec( #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); + test_trace_breakpoint((int)(pOp - aOp),pOp); } #endif diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9d04c160a2..ced3ec24c4 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -194,9 +194,16 @@ static int growOpArray(Vdbe *v, int nOp){ #ifdef SQLITE_DEBUG /* This routine is just a convenient place to set a breakpoint that will ** fire after each opcode is inserted and displayed using -** "PRAGMA vdbe_addoptrace=on". +** "PRAGMA vdbe_addoptrace=on". Parameters "pc" (program counter) and +** pOp are available to make the breakpoint conditional. +** +** Other useful labels for breakpoints include: +** test_trace_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) */ -static void test_addop_breakpoint(void){ +static void test_addop_breakpoint(int pc, Op *pOp){ static int n = 0; n++; } @@ -249,7 +256,7 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ #ifdef SQLITE_DEBUG if( p->db->flags & SQLITE_VdbeAddopTrace ){ sqlite3VdbePrintOp(0, i, &p->aOp[i]); - test_addop_breakpoint(); + test_addop_breakpoint(i, &p->aOp[i]); } #endif #ifdef VDBE_PROFILE diff --git a/src/vdbemem.c b/src/vdbemem.c index 7d56d1684b..faf555af90 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -948,8 +948,8 @@ int sqlite3VdbeMemTooBig(Mem *p){ ** its link to a shallow copy and by marking any current shallow ** copies of this cell as invalid. ** -** This is used for testing and debugging only - to make sure shallow -** copies are not misused. +** This is used for testing and debugging only - to help ensure that shallow +** copies (created by OP_SCopy) are not misused. */ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ int i; From 22e95fbd741dd492471db39450a149cc1e23a12c Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 14:42:42 +0000 Subject: [PATCH 14/20] Enhancements to aid testing and debugging: In PRAGMA vdbe_trace=on output, show pScopyFrom dependencies on register values. Add the sqlite3VdbeRegisterDump() procedure, callable from a debugger, that shows the values of all registers. Pass the VDBE pointer into test_trace_breakpoint() so that sqlite3VdbeRegisterDump() is callable from the breakpoint. FossilOrigin-Name: 9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 21 ++++++++++++++++++--- src/vdbemem.c | 5 ++++- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 3a79ec66f3..7ebefd3b60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\stest_trace_breakpoint()\ssubroutine\sthat\sis\sinvoked\safter\seach\ninstruction\sis\sprinted\swhile\srunning\sPRAGMA\svdbe_trace=on.\s\sOnly\sworks\sfor\nSQLITE_DEBUG\sbuilds.\s\sAlso\sadd\sparameters\s"pc"\sand\s"pOp"\sto\s\ntest_addop_breakpoint()\sto\smake\sit\seasier\sto\sset\sconditionals. -D 2020-01-02T13:26:49.943 +C Enhancements\sto\said\stesting\sand\sdebugging:\nIn\sPRAGMA\svdbe_trace=on\soutput,\sshow\spScopyFrom\sdependencies\son\sregister\nvalues.\s\sAdd\sthe\ssqlite3VdbeRegisterDump()\sprocedure,\scallable\sfrom\sa\ndebugger,\sthat\sshows\sthe\svalues\sof\sall\sregisters.\s\sPass\sthe\sVDBE\spointer\ninto\stest_trace_breakpoint()\sso\sthat\ssqlite3VdbeRegisterDump()\sis\scallable\nfrom\sthe\sbreakpoint. +D 2020-01-02T14:42:42.874 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,13 +600,13 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 9d432abf6c7979dc8661572ed5d61773be72a6b7475c0e97901309dc611fe4bd +F src/vdbe.c 62f0a6d1d5685b65530f93e5ad4fc852fe7ce8225b8852c67f7177f4748c72d0 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 4029cb6a5a4d94f95e63e29c998791534788ce64ffb0f3bdfd373aba04a7169f +F src/vdbemem.c e5c0fbadf3ad9e45623a63825dc45a30ef0b9b9137ba5351b57d15a3a17aff5d F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b -R 012a47d79081ec029afe02cb3190d8b3 +P 49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 +R cbc77bfc0e90f07a788c6fc62ef01b63 U drh -Z 44bc6f6389cf28eb8f2cfc35d7778fbb +Z 908b39c48323f7d785aae70d03f5f0a5 diff --git a/manifest.uuid b/manifest.uuid index 06232d4889..4406375c59 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 \ No newline at end of file +9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ca737ffccb..ab5e4c8048 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -131,7 +131,7 @@ int sqlite3_found_count = 0; ** sqlite3MisuseError(lineno) ** sqlite3CantopenError(lineno) */ -static void test_trace_breakpoint(int pc, Op *pOp){ +static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ static int n = 0; n++; } @@ -586,13 +586,28 @@ static void memTracePrint(Mem *p){ if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype); } static void registerTrace(int iReg, Mem *p){ - printf("REG[%d] = ", iReg); + printf("R[%d] = ", iReg); memTracePrint(p); + if( p->pScopyFrom ){ + printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); + } printf("\n"); sqlite3VdbeCheckMemInvariants(p); } #endif +#ifdef SQLITE_DEBUG +/* +** Show the values of all registers in the virtual machine. Used for +** interactive debugging. +*/ +void sqlite3VdbeRegisterDump(Vdbe *v){ + int i; + for(i=1; inMem; i++) registerTrace(i, v->aMem+i); +} +#endif /* SQLITE_DEBUG */ + + #ifdef SQLITE_DEBUG # define REGISTER_TRACE(R,M) if(db->flags&SQLITE_VdbeTrace)registerTrace(R,M) #else @@ -758,7 +773,7 @@ int sqlite3VdbeExec( #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); - test_trace_breakpoint((int)(pOp - aOp),pOp); + test_trace_breakpoint((int)(pOp - aOp),pOp,p); } #endif diff --git a/src/vdbemem.c b/src/vdbemem.c index faf555af90..aaeda24253 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -956,6 +956,10 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ Mem *pX; for(i=0, pX=pVdbe->aMem; inMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ + if( pVdbe->db->flags & SQLITE_VdbeTrace ){ + sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", + (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); + } /* If pX is marked as a shallow copy of pMem, then verify that ** no significant changes have been made to pX since the OP_SCopy. ** A significant change would indicated a missed call to this @@ -980,7 +984,6 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ } #endif /* SQLITE_DEBUG */ - /* ** Make an shallow copy of pFrom into pTo. Prior contents of ** pTo are freed. The pFrom->z field is not duplicated. If From 4cbd847a910091a2da56b0bc0a631b240ff52784 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 15:02:08 +0000 Subject: [PATCH 15/20] Fix the OP_Move opcode so that it correctly manages dependency tracking. This change impacts debugging builds only. FossilOrigin-Name: 5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 9 +++++++-- src/vdbemem.c | 2 +- test/fuzzdata8.db | Bin 1720320 -> 1720320 bytes 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 7ebefd3b60..e09aa20a60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\said\stesting\sand\sdebugging:\nIn\sPRAGMA\svdbe_trace=on\soutput,\sshow\spScopyFrom\sdependencies\son\sregister\nvalues.\s\sAdd\sthe\ssqlite3VdbeRegisterDump()\sprocedure,\scallable\sfrom\sa\ndebugger,\sthat\sshows\sthe\svalues\sof\sall\sregisters.\s\sPass\sthe\sVDBE\spointer\ninto\stest_trace_breakpoint()\sso\sthat\ssqlite3VdbeRegisterDump()\sis\scallable\nfrom\sthe\sbreakpoint. -D 2020-01-02T14:42:42.874 +C Fix\sthe\sOP_Move\sopcode\sso\sthat\sit\scorrectly\smanages\sdependency\stracking.\nThis\schange\simpacts\sdebugging\sbuilds\sonly. +D 2020-01-02T15:02:08.865 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,13 +600,13 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 62f0a6d1d5685b65530f93e5ad4fc852fe7ce8225b8852c67f7177f4748c72d0 +F src/vdbe.c af35d7adef9dcb23fb7b379453eadcf5c5840037a540924c3cac9b4328e09c9a F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c e5c0fbadf3ad9e45623a63825dc45a30ef0b9b9137ba5351b57d15a3a17aff5d +F src/vdbemem.c 30c13916dd6516a52330540a3e4bf15ac9886940cf6c6a6a6c66273a1c6b5176 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -1018,7 +1018,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 09733ef4b4246cd97e4513ee315c2900771ead4cc6a5ff83cb511dd43cfc5a43 +F test/fuzzdata8.db d702762f8bf21456a6b69d15dde3e3023733da01ed6f1c06fe50d0b2d161199f F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 -R cbc77bfc0e90f07a788c6fc62ef01b63 +P 9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 +R 24a07003701b78db81971cb6840d91ff U drh -Z 908b39c48323f7d785aae70d03f5f0a5 +Z 4a934f9df899c177f571c59121e59bde diff --git a/manifest.uuid b/manifest.uuid index 4406375c59..7638175920 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 \ No newline at end of file +5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ab5e4c8048..e11564b17c 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1371,8 +1371,13 @@ case OP_Move: { memAboutToChange(p, pOut); sqlite3VdbeMemMove(pOut, pIn1); #ifdef SQLITE_DEBUG - if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrompScopyFrom += pOp->p2 - p1; + pIn1->pScopyFrom = 0; + { int i; + for(i=1; inMem; i++){ + if( aMem[i].pScopyFrom==pIn1 ){ + aMem[i].pScopyFrom = pOut; + } + } } #endif Deephemeralize(pOut); diff --git a/src/vdbemem.c b/src/vdbemem.c index aaeda24253..e817996950 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -954,7 +954,7 @@ int sqlite3VdbeMemTooBig(Mem *p){ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ int i; Mem *pX; - for(i=0, pX=pVdbe->aMem; inMem; i++, pX++){ + for(i=1, pX=pVdbe->aMem+1; inMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ if( pVdbe->db->flags & SQLITE_VdbeTrace ){ sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 108bcad778125ef88bd2f6be47b8203f93c19075..05f07ad4bb424cd0629552f0530cf1a2855acffc 100644 GIT binary patch delta 5708 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 K#e%@H_CEkUd$oQ5 delta 5394 zcmeI0X;f85w#RGNsXBLrI{*3l3MkG4ii#R1s2f|2BMQ&T zOT-}|rW50s#Bv~s8uOkpy^KlQ>FCnc*iTL3h>00AsBa$zvpT)rx7RCQ`hNIvPVL&e zs?Ire&i_wI$<&gPsionrPYBUV$*;dY8{2e(Pxj|cHW#<1u{4tUsGHiUP6<4KdvF`R zfxp8=_!7>-X*dZVz#%vQZ^KU54lhGFtcO()fF&>=X2Ud?06CBe!(b5fg;eMPouM7H zf@a2OT9xR7d|f<)+#phsYeX_~rRa$)6iLPSXQJqa%n@CXnIaLHAvz;_icZM3q64yp zXp8iUHb{$TjRet(5c;!diM%UXAg_oxGJw$PEI z1V;`P4B1amu$-+ugs@xZ88K};$H^ouN zQ;$ncH5!alHRYxk85_^YYI*mTJyq_FwD@Jh7p9KN{IY3+74p^0N|VN6f+~E|*%+V6$cxW6Hu~kG9zL@yndx!L)YB%fa$PVTcd!CR4#}8G zNBvBtGZ)&coa?4U%4gwP>&L;hhN$Z|O*c(^HX~d5)s>8n_4#G|A&)~Ht?)JlmHVS< zH05&{*)aUqc-@eZ_e~Z)hmnm@{~XXwWcjp0oTr4#tdp$y+0??g{_!gOf$0}3pNGpD z^_#3;SMVw~zZSxa7&%?PbevLzdfjhc*Iu8`i8zwnm|389&M`j+vNY1~kxd4fcd6Pm z^X^!_h>;!LrR%b}kNj@7IgUNg$oBdNA-mArnlEIex~Q>6tg%%hKb^1uE6cRT*1F0i z&?3BfCMmk}YGE_n|r721NBXTP`_)swltZDsW)roou7Sbh*!LS*2>jEiIxs zW8|ZFxnr$mmpqhg>14)vW>n-0O$8-e_JniJ$lFCm_?Ft8Wr=rk9dCJ8g$===a*8Y= zplYXE(#_n&$exkEwx@W(qAJ!}P69JC@@3t1QPpcLqp<%5%YXW~m67+m8~qQ1bbd&O z%9=se_R@BS{!u0@umn`?F3Utaw=?oxKV$gAGU~9!#BGcm_5LR7l&U>yIn|m6G4gJ< z5$l9wd~I24<_<>w_LQ;Wd|6Y2*};tLTKb#ppH%JlmV`KPskVM=M*yeFYhu0X=OK(7 z9B1@B2%EcDP2A0hs#{@3|ubLu4RcV^_cs%zp^40)jb~Ds}32PTBOU_WHY8P0uEZmQ=-cMq^Y&;xq zUWW06jF36&tUI8|!S&Xc!g&NEhdUX~8S3_%)@vr-6!&|Y(U7KM4_FH#c_bqbql|`B z_1Cl3u~9sVkw@8b$0b{aT3uu9Yk_F>`F-nV8;`*;n;L;kIdnOM$=&aRSzYF~DjPIY zTV1wQNqY182eq+Jtoq|%TdQ6WCqG|ndxOVf^nU#gsJ>)tA?Jl#Tlt$Veo zef#Z?dO#<&_oh7sprg8d%ie9c-ns5_U!5i?|(H8Ct7d_kB;?D4QxGXrdj$Jb)<;2Wp3{5coa9u6 zNp8G=;lU+#NLEW*1;;vBDsCp@_Vkxqx0*vGbPpcLd*Py|8bjpc8%itPk|SZ zlQBOjc+E)t87x^cTyCs%jF)#d2AlM!u^}+gXjmk-5Aj-L@uuLR&|96|6zs|7eHi(= z*a+^FsoBmdIrO2{L)IjFi&X8M;PF1_Cv(k?xvVcEck5>pX>l~?&*H5bpfD?j%G5_e z(K6v&FlN{sy+-l@jQlj&h*_v{Aub+vi2f=g-!UKlwXzKg|1H~of7zzqnB>R>y(6ke zy|m13jxXM^CO;6Gf=plN5zD;-1?et|@PS?{_G(eZo`E)j&Mkml5nn{Pz zL9{PTr9Eh8+K#rO&1l3B>Y+|*r3@ay&+r}GglkX@7vLP6fm3h-s^B2(gSVg(w!%xW z3D&|2D1k*V4+>xkjE6Ds91Mkl&<9eW8+0slIXf2XD*~v#^(BEO$Tq7{U0j%9iVPd}d%3WT1{?PO=fV!oa5U`( zX)?0XQ2+zgx=KezDhyJ8yW&WT;)79x%rZU^v&(8GnN{{x#}2wF-7SlcXs@bTle3+V z4`Jl?0;5Z&vTgLtN z)QwDMHt-Ba?ijA?8M%J6vn3yjpU!bcZhu9yo#li12>e{7)nzHnDu=RtX%V<>SepX_ z#c)QhHb{=+U^c3LqW0`^Mt6Xb>a&Z^Z)4afMrs-)PeYFg8U5I4;?Lp77KL-eWL{LY zkDcY+AX9DZ=91Aoi;)K?8!=ixsEl6dyr*ijT{|OqHh%4FPhzhC8_mcM^?tA#$1oCF zqM%sp+SP-PK}}RYiqUMrX63r><6{}QQT(JtIT+<WizFH>S&r+E_+->4$ zgHNTPLb_jx$Qx$YTujwbimvyJ^@<=GOffd;uMv9YbL`j0IP zzx$`Ke`w4CHSaBVG#I}5Y<^=X7A=EYk1?$9wR(qTj45%7n`F`%_iBz-_+*32Z3vXA z+Rxl+Z4Fa=;mKU`)$NDw??V`x;!}0^er23HM8&y7J$<1-_RI|ZSf9zs>do~|-Z{){ zS(%;{s?xK-Eh3SlH}z~Pr91n@&x=)sP44(EcY9Z_SQs& z0UK2>^z~%9VXnHA=}8GST>PLU-MjWajg-i-G0MsngCRQ4X{7-hU? zx`L{B+Z~SqHT@&sWh3?d0GWeKT9>Zj{O|C9C7-eMwaP@{aFV9E7N<^FGl6!rn{qF9ALD zA9`s1V*|jWss{TXw^T<5`} Date: Thu, 2 Jan 2020 16:24:22 +0000 Subject: [PATCH 16/20] Handle blobs that are the return values of functions being cast to text in utf16 databases in the same way as blobs read directly from the database. Fix for [771fe617]. FossilOrigin-Name: e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a --- ext/fts5/test/fts5integrity.test | 27 +++++++++++++++++++++++++++ manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbemem.c | 11 +++++++++-- test/cast.test | 12 ++++++++++++ 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/ext/fts5/test/fts5integrity.test b/ext/fts5/test/fts5integrity.test index 72cdeb3e30..38dff21f79 100644 --- a/ext/fts5/test/fts5integrity.test +++ b/ext/fts5/test/fts5integrity.test @@ -255,4 +255,31 @@ do_execsql_test 8.1 { INSERT INTO vt0(vt0, rank) VALUES('usermerge', 2); } +#------------------------------------------------------------------------- +# Ticket [771fe617] +# +reset_db +do_execsql_test 9.0 { + PRAGMA encoding = 'UTF16'; + CREATE VIRTUAL TABLE vt0 USING fts5(c0); +} + +#explain_i { SELECT quote(SUBSTR(x'37', 0)); } +#execsql { PRAGMA vdbe_trace = 1 } +do_execsql_test 9.1.1 { + SELECT quote(SUBSTR(x'37', 0)); +} {X'37'} +do_execsql_test 9.1.2 { + SELECT quote(x'37'); +} {X'37'} + +breakpoint +do_execsql_test 9.2 { + INSERT INTO vt0 VALUES (SUBSTR(x'37', 0)); +-- INSERT INTO vt0 VALUES (x'37'); +} +do_execsql_test 9.3 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index e09aa20a60..6cfd7bc1a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_Move\sopcode\sso\sthat\sit\scorrectly\smanages\sdependency\stracking.\nThis\schange\simpacts\sdebugging\sbuilds\sonly. -D 2020-01-02T15:02:08.865 +C Handle\sblobs\sthat\sare\sthe\sreturn\svalues\sof\sfunctions\sbeing\scast\sto\stext\sin\sutf16\sdatabases\sin\sthe\ssame\sway\sas\sblobs\sread\sdirectly\sfrom\sthe\sdatabase.\sFix\sfor\s[771fe617]. +D 2020-01-02T16:24:22.013 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -182,7 +182,7 @@ F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b99 F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test c354fd693d9fb14018b33113aa2331265d915d51f67067a2cfa7873894c9ecf0 +F ext/fts5/test/fts5integrity.test 8ffabcd91b058d812aba3e3e0a06f76ce165ba402a18cca20e34204a7feec92e F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad @@ -606,7 +606,7 @@ F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 30c13916dd6516a52330540a3e4bf15ac9886940cf6c6a6a6c66273a1c6b5176 +F src/vdbemem.c d0e294c0f4fa1ac90d7f7f33b3ca4717db271d1550a870f5819cae384bec4610 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -727,7 +727,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca5155895 +F test/cast.test 2906ccab6a3ebd147ffa63304b635be903ce58264110d0a0eb4fd9939422bb53 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test b21a76546c2115af2674280566a8eba577e72adfec330c3d9a8a466d41f8eb0d F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 -R 24a07003701b78db81971cb6840d91ff -U drh -Z 4a934f9df899c177f571c59121e59bde +P 5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 +R 240c23e2f5654f0233016450faf6070c +U dan +Z 4d0f2df52a6bba7041a9460fa8e92429 diff --git a/manifest.uuid b/manifest.uuid index 7638175920..e4fe5ccca1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 \ No newline at end of file +e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index e817996950..5c17669492 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1129,10 +1129,17 @@ int sqlite3VdbeMemSetStr( pMem->n = nByte; pMem->flags = flags; - pMem->enc = (enc==0 ? SQLITE_UTF8 : enc); + if( enc ){ + pMem->enc = enc; + }else if( pMem->db ){ + pMem->enc = ENC(pMem->db); + }else{ + pMem->enc = SQLITE_UTF8; + } + #ifndef SQLITE_OMIT_UTF16 - if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ + if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ return SQLITE_NOMEM_BKPT; } #endif diff --git a/test/cast.test b/test/cast.test index e6795ce456..d2eaffcbb5 100644 --- a/test/cast.test +++ b/test/cast.test @@ -461,6 +461,18 @@ do_execsql_test cast-7.43 { SELECT CAST('-1.0' AS numeric); } -1 +ifcapable utf16 { + reset_db + execsql { PRAGMA encoding='utf16' } + + do_execsql_test cast-8.1 { + SELECT quote(X'310032003300')==quote(substr(X'310032003300', 1)) + } 1 + do_execsql_test cast-8.2 { + SELECT CAST(X'310032003300' AS TEXT) + ==CAST(substr(X'310032003300', 1) AS TEXT) + } 1 +} finish_test From 3aef2fb1b43eb391472b74174cdbae69241ecf8d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 17:46:02 +0000 Subject: [PATCH 17/20] Have the OP_ReleaseReg opcode also invalidate the registers if P5 is non-zero. FossilOrigin-Name: 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/expr.c | 6 +++--- src/insert.c | 4 ++-- src/vdbe.c | 12 +++++++----- src/vdbe.h | 4 ++-- src/vdbeaux.c | 12 +++++++++++- 7 files changed, 37 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 6cfd7bc1a8..cf25a77c8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\sblobs\sthat\sare\sthe\sreturn\svalues\sof\sfunctions\sbeing\scast\sto\stext\sin\sutf16\sdatabases\sin\sthe\ssame\sway\sas\sblobs\sread\sdirectly\sfrom\sthe\sdatabase.\sFix\sfor\s[771fe617]. -D 2020-01-02T16:24:22.013 +C Have\sthe\sOP_ReleaseReg\sopcode\salso\sinvalidate\sthe\sregisters\sif\sP5\sis\snon-zero. +D 2020-01-02T17:46:02.719 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 75985a13af1b1d629f5f3c206a2af6250a971dd058d30fce0c0e0ba8d7c899a6 +F src/expr.c d74209d6abec71609a64329726df5d003b6fb2897f5bbde77c35882e5d482e7c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 +F src/insert.c 7bbb7dec1d69f961f21d75bd83ed00ceee48d5aa71c794b1cce3205470c8a48f F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 7b06af0c38abf9720d9a5c49660bff8b7137427bbd513fa069baf8afa15da4d7 @@ -600,11 +600,11 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c af35d7adef9dcb23fb7b379453eadcf5c5840037a540924c3cac9b4328e09c9a -F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 +F src/vdbe.c a8c88ee06d3510d8dc9a5cee594ec46f2ef476bd0c9be834e7e664b76ca2c179 +F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 +F src/vdbeaux.c 3b2076c59217f964ff5fca348fa3f69c3157cbd5cafc549e9ea3252d8613c6a9 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d0e294c0f4fa1ac90d7f7f33b3ca4717db271d1550a870f5819cae384bec4610 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 -R 240c23e2f5654f0233016450faf6070c -U dan -Z 4d0f2df52a6bba7041a9460fa8e92429 +P e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a +R 03e3fe8bf73f136f9929ea1e989495c3 +U drh +Z a92746a6d0d3821fb326cef80fc59b0c diff --git a/manifest.uuid b/manifest.uuid index e4fe5ccca1..cf9c08cbe6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a \ No newline at end of file +937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 298843a8ab..88500b066b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4140,7 +4140,7 @@ expr_code_doover: if( constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); }else{ - sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask); + sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask, 1); } } return target; @@ -5799,7 +5799,7 @@ int sqlite3GetTempReg(Parse *pParse){ */ void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ if( iReg ){ - sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0); + sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0); if( pParse->nTempRegaTempReg) ){ pParse->aTempReg[pParse->nTempReg++] = iReg; } @@ -5828,7 +5828,7 @@ void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ sqlite3ReleaseTempReg(pParse, iReg); return; } - sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0); + sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0, 0); if( nReg>pParse->nRangeReg ){ pParse->nRangeReg = nReg; pParse->iRangeReg = iReg; diff --git a/src/insert.c b/src/insert.c index 3b4ad56403..87e9c7ead3 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1020,7 +1020,7 @@ void sqlite3Insert( ** goto C ** D: ... */ - sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0); + sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0, 0); addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); if( ipkColumn>=0 ){ @@ -1976,7 +1976,7 @@ void sqlite3GenerateConstraintChecks( sqlite3SetMakeRecordP5(v, pIdx->pTable); } #endif - sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0); + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0, 0); /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the diff --git a/src/vdbe.c b/src/vdbe.c index e11564b17c..971b37d5d0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7811,7 +7811,7 @@ case OP_Abortable: { #endif #ifdef SQLITE_DEBUG -/* Opcode: ReleaseReg P1 P2 P3 * * +/* Opcode: ReleaseReg P1 P2 P3 * P5 ** Synopsis: release r[P1@P2] mask P3 ** ** Release registers from service. Any content that was in the @@ -7826,10 +7826,12 @@ case OP_Abortable: { ** a change to the value of the source register for the OP_SCopy will no longer ** generate an assertion fault in sqlite3VdbeMemAboutToChange(). ** -** TODO: Released registers ought to also have their datatype set to -** MEM_Undefined so that any subsequent attempt to read the released +** If P5 is set, then all released registers have their type set +** to MEM_Undefined so that any subsequent attempt to read the released ** register (before it is reinitialized) will generate an assertion fault. -** However, there are places in the code generator which release registers +** +** P5 ought to be set on every call to this opcode. +** However, there are places in the code generator will release registers ** before their are used, under the (valid) assumption that the registers ** will not be reallocated for some other purpose before they are used and ** hence are safe to release. @@ -7850,7 +7852,7 @@ case OP_ReleaseReg: { for(i=0; ip2; i++, pMem++){ if( i>=32 || (constMask & MASKBIT32(i))==0 ){ pMem->pScopyFrom = 0; - /* MemSetTypeFlag(pMem, MEM_Undefined); // See the TODO */ + if( i<32 && pOp->p5 ) MemSetTypeFlag(pMem, MEM_Undefined); } } break; diff --git a/src/vdbe.h b/src/vdbe.h index 9b25452e2f..bfde25873f 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -233,9 +233,9 @@ void sqlite3VdbeJumpHere(Vdbe*, int addr); int sqlite3VdbeChangeToNoop(Vdbe*, int addr); int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); #ifdef SQLITE_DEBUG - void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask); + void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); #else -# define sqlite3VdbeReleaseRegisters(P,A,N,M) +# define sqlite3VdbeReleaseRegisters(P,A,N,M,F) #endif void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index ced3ec24c4..8b01fdec60 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1198,8 +1198,17 @@ int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ ** Generate an OP_ReleaseReg opcode to indicate that a range of ** registers, except any identified by mask, are no longer in use. */ -void sqlite3VdbeReleaseRegisters(Parse *pParse, int iFirst, int N, u32 mask){ +void sqlite3VdbeReleaseRegisters( + Parse *pParse, /* Parsing context */ + int iFirst, /* Index of first register to be released */ + int N, /* Number of registers to release */ + u32 mask, /* Mask of registers to NOT release */ + int bUndefine /* If true, mark registers as undefined */ +){ + if( N==0 ) return; assert( pParse->pVdbe ); + assert( iFirst>=1 ); + assert( iFirst+N-1<=pParse->nMem ); while( N>0 && (mask&1)!=0 ){ mask >>= 1; iFirst++; @@ -1211,6 +1220,7 @@ void sqlite3VdbeReleaseRegisters(Parse *pParse, int iFirst, int N, u32 mask){ } if( N>0 ){ sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); + if( bUndefine ) sqlite3VdbeChangeP5(pParse->pVdbe, 1); } } #endif /* SQLITE_DEBUG */ From 1b39aab08d371123b7a83bc0162dc9a1c29984b0 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 18:37:04 +0000 Subject: [PATCH 18/20] Ifdef-out code that is only possible with the sessions extension. FossilOrigin-Name: 4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 10 ++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index cf25a77c8b..451786ba48 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sthe\sOP_ReleaseReg\sopcode\salso\sinvalidate\sthe\sregisters\sif\sP5\sis\snon-zero. -D 2020-01-02T17:46:02.719 +C Ifdef-out\scode\sthat\sis\sonly\spossible\swith\sthe\ssessions\sextension. +D 2020-01-02T18:37:04.704 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -606,7 +606,7 @@ F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 3b2076c59217f964ff5fca348fa3f69c3157cbd5cafc549e9ea3252d8613c6a9 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c d0e294c0f4fa1ac90d7f7f33b3ca4717db271d1550a870f5819cae384bec4610 +F src/vdbemem.c 05668cc1b44845736784f1ce9da46403dbf202c7c6d1a02205285cfc30e78f0d F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a -R 03e3fe8bf73f136f9929ea1e989495c3 +P 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e +R 3a024adb421e4e36e63a5af385fc2fb7 U drh -Z a92746a6d0d3821fb326cef80fc59b0c +Z 3efc973945bc1da091c431612275c1f5 diff --git a/manifest.uuid b/manifest.uuid index cf9c08cbe6..8632123cd4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e \ No newline at end of file +4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 5c17669492..5b911f2f01 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1131,13 +1131,15 @@ int sqlite3VdbeMemSetStr( pMem->flags = flags; if( enc ){ pMem->enc = enc; - }else if( pMem->db ){ - pMem->enc = ENC(pMem->db); - }else{ +#ifdef SQLITE_ENABLE_SESSION + }else if( pMem->db==0 ){ pMem->enc = SQLITE_UTF8; +#endif + }else{ + assert( pMem->db!=0 ); + pMem->enc = ENC(pMem->db); } - #ifndef SQLITE_OMIT_UTF16 if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ return SQLITE_NOMEM_BKPT; From 6b559f3033b1352c369ad551a09b336d8a655593 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 19:50:50 +0000 Subject: [PATCH 19/20] Fix some test logic in the OP_Delete opcode so that it works after a cursor-trip. FossilOrigin-Name: 28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 451786ba48..0e63864694 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ifdef-out\scode\sthat\sis\sonly\spossible\swith\sthe\ssessions\sextension. -D 2020-01-02T18:37:04.704 +C Fix\ssome\stest\slogic\sin\sthe\sOP_Delete\sopcode\sso\sthat\sit\sworks\safter\sa\ncursor-trip. +D 2020-01-02T19:50:50.203 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c a8c88ee06d3510d8dc9a5cee594ec46f2ef476bd0c9be834e7e664b76ca2c179 +F src/vdbe.c 459a233a60aba8b8b2462f42bd6e93623e13beafc5e0c40c6646e0527e444fd0 F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e -R 3a024adb421e4e36e63a5af385fc2fb7 +P 4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 +R 23c2d910f0f8167283a76ba9540e77df U drh -Z 3efc973945bc1da091c431612275c1f5 +Z 335647452bacbb554070cabfbe244c03 diff --git a/manifest.uuid b/manifest.uuid index 8632123cd4..e2a7ccfb80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 \ No newline at end of file +28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 971b37d5d0..5479a311b1 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4995,7 +4995,11 @@ case OP_Delete: { sqlite3VdbeIncrWriteCounter(p, pC); #ifdef SQLITE_DEBUG - if( pOp->p4type==P4_TABLE && HasRowid(pOp->p4.pTab) && pOp->p5==0 ){ + if( pOp->p4type==P4_TABLE + && HasRowid(pOp->p4.pTab) + && pOp->p5==0 + && sqlite3BtreeCursorIsValidNN(pC->uc.pCursor) + ){ /* If p5 is zero, the seek operation that positioned the cursor prior to ** OP_Delete will have also set the pC->movetoTarget field to the rowid of ** the row that is being deleted */ From 0c4f82051c7ff301ea78cf1d279005d2dc26ad19 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 21:30:13 +0000 Subject: [PATCH 20/20] Do not allow the zipfile virtual table to start a transaction if no filename has been specified. FossilOrigin-Name: 7405e982257611803792617f5d8142c54f9831b4a030f4de8607888c525e6289 --- ext/misc/zipfile.c | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- test/zipfile.test | 5 +++++ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 3262283377..ef02d88d17 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -1444,6 +1444,7 @@ static int zipfileBegin(sqlite3_vtab *pVtab){ int rc = SQLITE_OK; assert( pTab->pWriteFd==0 ); + if( pTab->zFile==0 ) return SQLITE_OK; /* Open a write fd on the file. Also load the entire central directory ** structure into memory. During the transaction any new file data is diff --git a/manifest b/manifest index 0e63864694..e7281ec469 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssome\stest\slogic\sin\sthe\sOP_Delete\sopcode\sso\sthat\sit\sworks\safter\sa\ncursor-trip. -D 2020-01-02T19:50:50.203 +C Do\snot\sallow\sthe\szipfile\svirtual\stable\sto\sstart\sa\stransaction\sif\sno\nfilename\shas\sbeen\sspecified. +D 2020-01-02T21:30:13.891 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -325,7 +325,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 185d060a595c79ebbec904e9d73b97b400dca94d2f910d351d6a8b5fcfe2c3d0 +F ext/misc/zipfile.c 442bd056690ceb82a125f2be53738c721357612b3ba5d9249220d4c1f85b2e3a F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1749,7 +1749,7 @@ F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912ade F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test aab99dc488586842bed415a1ce1a2327948064aa660c00243e3f14a1ff1cf282 +F test/zipfile.test 42603fac7f7d6fdb3e8690da9fd1492b89b2325b3946fcff683cc88437d84ce4 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 -R 23c2d910f0f8167283a76ba9540e77df +P 28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 +R 03baaef710a83490f407e9d1a4367e2e U drh -Z 335647452bacbb554070cabfbe244c03 +Z 36e9c165e34c3938dc7f6f92537f7688 diff --git a/manifest.uuid b/manifest.uuid index e2a7ccfb80..ed83f643ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 \ No newline at end of file +7405e982257611803792617f5d8142c54f9831b4a030f4de8607888c525e6289 \ No newline at end of file diff --git a/test/zipfile.test b/test/zipfile.test index 6ea9ac6a01..da853e0aed 100644 --- a/test/zipfile.test +++ b/test/zipfile.test @@ -834,6 +834,11 @@ do_execsql_test 15.20 { REPLACE INTO t2 values(null,null,null,null,null,10,null); } {} +# 2020-01-02 Yongheng fuzzer discovery +# +do_catchsql_test 16.10 { + DELETE FROM zipfile; +} {1 {zipfile() function requires an argument}} finish_test