From bdf15bbd6272a26b168983f064db4124194addf6 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 9 Aug 2021 18:13:38 +0000 Subject: [PATCH 001/130] Further improvements to the eOpenState bit values. FossilOrigin-Name: d44f74f14a387960ce105913526b572f4a3d1935351c6aab10cee85946488a9e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 179c9e2568..969df8ecab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\spcache1\scache\ssize\sdoes\snot\sget\sso\sbig\sthat\sit\soverflows\nthe\sinteger\sthat\sis\skeeping\strack\sof\sthe\scache\ssize. -D 2021-08-09T18:07:06.575 +C Further\simprovements\sto\sthe\seOpenState\sbit\svalues. +D 2021-08-09T18:13:38.173 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e82634 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 548e07437d82c9732357d5efdb2d4e0ec403dedd9dab8def66a03d3d42ee9512 +F src/sqliteInt.h a7f02fb629d7657cea714446d8c285d195b0504c31ae843833e44c46f941e3b6 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1920,7 +1920,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 7929dc2f6f304b077c174d41711b49a24120adeb0b29cb6acb4d6a40852d7e00 -R 5ed20c4f6f3dd0873a45a27ab6ba0f51 -U drh -Z c3f298e00599b50c24893f0a3ffdacea +P bf9d70fc2fde06a3f132270a26d4abe321687169066aff26ad9e92757c7f9ee4 +R a9151e310251de143fbd3b8abd808680 +U mistachkin +Z e0914599a10f85fbe60bdb3fef5eb7e0 diff --git a/manifest.uuid b/manifest.uuid index 5e0dd095a8..b870135606 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf9d70fc2fde06a3f132270a26d4abe321687169066aff26ad9e92757c7f9ee4 \ No newline at end of file +d44f74f14a387960ce105913526b572f4a3d1935351c6aab10cee85946488a9e \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 70d44a87ac..e5dd352460 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1765,12 +1765,12 @@ struct sqlite3 { ** The numbers are randomly selected such that a minimum of three bits must ** change to convert any number to another or to zero */ -#define SQLITE_STATE_OPEN 0x3b /* Database is open */ -#define SQLITE_STATE_CLOSED 0x63 /* Database is closed */ -#define SQLITE_STATE_SICK 0x77 /* Error and awaiting close */ -#define SQLITE_STATE_BUSY 0x7d /* Database currently in use */ -#define SQLITE_STATE_ERROR 0xb5 /* An SQLITE_MISUSE error occurred */ -#define SQLITE_STATE_ZOMBIE 0xe5 /* Close with last statement close */ +#define SQLITE_STATE_OPEN 0x76 /* Database is open */ +#define SQLITE_STATE_CLOSED 0xce /* Database is closed */ +#define SQLITE_STATE_SICK 0xba /* Error and awaiting close */ +#define SQLITE_STATE_BUSY 0x6d /* Database currently in use */ +#define SQLITE_STATE_ERROR 0xd5 /* An SQLITE_MISUSE error occurred */ +#define SQLITE_STATE_ZOMBIE 0xa7 /* Close with last statement close */ /* ** Each SQL function is defined by an instance of the following From f9d349a80d3af3702da294e81c54110b056f76a9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 9 Aug 2021 19:54:27 +0000 Subject: [PATCH 002/130] Fix a compiler warning in pcache1. Reduce the maximum size of a pcache1 cache to 2147418112 pages. FossilOrigin-Name: 4bc93658aa563f2fa84f7f85f7f9f336dc80425640140c0fc2aec4a3606fad48 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pcache1.c | 11 +++++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 969df8ecab..fb93aee99c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\simprovements\sto\sthe\seOpenState\sbit\svalues. -D 2021-08-09T18:13:38.173 +C Fix\sa\scompiler\swarning\sin\spcache1.\s\sReduce\sthe\smaximum\ssize\sof\sa\spcache1\ncache\sto\s2147418112\spages. +D 2021-08-09T19:54:27.186 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -536,7 +536,7 @@ F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c 00541fef31d2798dc20308ee1fa46205b76ad1df2c871e9c9bfe9508e59ab54c +F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c af0f43789545622fd5377d71f6d4c0e7c9b9295a3f5d5b1242e4032d38ca12b5 F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 @@ -1920,7 +1920,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 bf9d70fc2fde06a3f132270a26d4abe321687169066aff26ad9e92757c7f9ee4 -R a9151e310251de143fbd3b8abd808680 -U mistachkin -Z e0914599a10f85fbe60bdb3fef5eb7e0 +P d44f74f14a387960ce105913526b572f4a3d1935351c6aab10cee85946488a9e +R 19e90c8b9bdd61fd7709a8e960a3ede7 +U drh +Z 8656b513dcc008313098af5e52544bda diff --git a/manifest.uuid b/manifest.uuid index b870135606..8f201ac54b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d44f74f14a387960ce105913526b572f4a3d1935351c6aab10cee85946488a9e \ No newline at end of file +4bc93658aa563f2fa84f7f85f7f9f336dc80425640140c0fc2aec4a3606fad48 \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index 286a98d36a..a93b146894 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -817,15 +817,18 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ */ static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ PCache1 *pCache = (PCache1 *)p; + u32 n; + assert( nMax>=0 ); if( pCache->bPurgeable ){ PGroup *pGroup = pCache->pGroup; pcache1EnterMutex(pGroup); - if( nMax > 0xffff0000 - pGroup->nMaxPage + pCache->nMax ){ - nMax = 0xffff0000 - pGroup->nMaxPage + pCache->nMax; + n = (u32)nMax; + if( n > 0x7fff0000 - pGroup->nMaxPage + pCache->nMax ){ + n = 0x7fff0000 - pGroup->nMaxPage + pCache->nMax; } - pGroup->nMaxPage += (nMax - pCache->nMax); + pGroup->nMaxPage += (n - pCache->nMax); pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; - pCache->nMax = nMax; + pCache->nMax = n; pCache->n90pct = pCache->nMax*9/10; pcache1EnforceMaxPage(pCache); pcache1LeaveMutex(pGroup); From 834c688171b56931fedd03504561695d2db07a01 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 11 Aug 2021 13:19:13 +0000 Subject: [PATCH 003/130] Improved comment on the OP_OpenDup used to get a new cursor for a reused materialized CTE. FossilOrigin-Name: b1926cc0ab2b81c7df30c4baa6014efcfddb9631f6e46a55c1cec0113ee1afdc --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index fb93aee99c..3de5eafda3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scompiler\swarning\sin\spcache1.\s\sReduce\sthe\smaximum\ssize\sof\sa\spcache1\ncache\sto\s2147418112\spages. -D 2021-08-09T19:54:27.186 +C Improved\scomment\son\sthe\sOP_OpenDup\sused\sto\sget\sa\snew\scursor\sfor\sa\nreused\smaterialized\sCTE. +D 2021-08-11T13:19:13.186 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 63077c0243ded1432d97c90c1a4c3419b3a574b36634c674599a68bfe4c3bdc2 +F src/select.c 082fe06fd0a4a6809013f60a8e1e25a646f9461cfc375c6bb06b0ed123ebe3b2 F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1920,7 +1920,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 d44f74f14a387960ce105913526b572f4a3d1935351c6aab10cee85946488a9e -R 19e90c8b9bdd61fd7709a8e960a3ede7 +P 4bc93658aa563f2fa84f7f85f7f9f336dc80425640140c0fc2aec4a3606fad48 +R fe3d22d1884ef23f4a46e50bdba59015 U drh -Z 8656b513dcc008313098af5e52544bda +Z 5ce7c4f7680efc3f37d51bc4e04fac8a diff --git a/manifest.uuid b/manifest.uuid index 8f201ac54b..c3b289a00d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4bc93658aa563f2fa84f7f85f7f9f336dc80425640140c0fc2aec4a3606fad48 \ No newline at end of file +b1926cc0ab2b81c7df30c4baa6014efcfddb9631f6e46a55c1cec0113ee1afdc \ No newline at end of file diff --git a/src/select.c b/src/select.c index 375050bdcd..c97871b637 100644 --- a/src/select.c +++ b/src/select.c @@ -6644,6 +6644,7 @@ int sqlite3Select( sqlite3VdbeAddOp2(v, OP_Gosub, pCteUse->regRtn, pCteUse->addrM9e); if( pItem->iCursor!=pCteUse->iCur ){ sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pCteUse->iCur); + VdbeComment((v, "%!S", pItem)); } pSub->nSelectRow = pCteUse->nRowEst; }else if( (pPrior = isSelfJoinView(pTabList, pItem))!=0 ){ From df67ec08ff22f07b1705819781286674d448a3f8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 11 Aug 2021 13:48:56 +0000 Subject: [PATCH 004/130] Do not apply the push-down optimization to CTE subqueries that will be reused in other contexts in where the same optimization is unlikely to be valid. Fix for the bug reported by [forum:/forumpost/d496c3d29bc93736|forum post d496c3d29bc93736]. FossilOrigin-Name: a7ce29a6ef2e0362bbc9b23719d936dce07209b2651153c774682f599bbd888e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 3 ++- test/with2.test | 10 ++++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3de5eafda3..c8fd1d425c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomment\son\sthe\sOP_OpenDup\sused\sto\sget\sa\snew\scursor\sfor\sa\nreused\smaterialized\sCTE. -D 2021-08-11T13:19:13.186 +C Do\snot\sapply\sthe\spush-down\soptimization\sto\sCTE\ssubqueries\sthat\swill\sbe\nreused\sin\sother\scontexts\sin\swhere\sthe\ssame\soptimization\sis\sunlikely\sto\nbe\svalid.\s\sFix\sfor\sthe\sbug\sreported\sby\n[forum:/forumpost/d496c3d29bc93736|forum\spost\sd496c3d29bc93736]. +D 2021-08-11T13:48:56.615 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 082fe06fd0a4a6809013f60a8e1e25a646f9461cfc375c6bb06b0ed123ebe3b2 +F src/select.c 0577308f097363b6ebac223e210418810acf74e677f580597f7d0718476fe3ef F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1797,7 +1797,7 @@ F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3c F test/windowfault.test 21919e601f20b976ea2a73aa401220c89ed0e8d203c4f69476ea55bce3726496 F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df F test/with1.test 7bc5abfe4c80c0cef8a90f5a66d60b9982e8ccd7350c8eb70611323a3b8e07ba -F test/with2.test bbf82609bbacc0a7a01d822022aed7b2fa702436dd3d0ecf942023564d2bba13 +F test/with2.test f803743b2c746ecdd0b638783c7235654b947b0f1c4bb551ca10e1d813317153 F test/with3.test ad32d13ad50661e6fa305f62a0717649c348792e7b658bf2644976227a9e0373 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8 @@ -1920,7 +1920,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 4bc93658aa563f2fa84f7f85f7f9f336dc80425640140c0fc2aec4a3606fad48 -R fe3d22d1884ef23f4a46e50bdba59015 +P b1926cc0ab2b81c7df30c4baa6014efcfddb9631f6e46a55c1cec0113ee1afdc +R ce3e16b5ef20fdbd2e2ef5054d8e9088 U drh -Z 5ce7c4f7680efc3f37d51bc4e04fac8a +Z 7a699911270175239ae2f5d37d476399 diff --git a/manifest.uuid b/manifest.uuid index c3b289a00d..a7391f2332 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1926cc0ab2b81c7df30c4baa6014efcfddb9631f6e46a55c1cec0113ee1afdc \ No newline at end of file +a7ce29a6ef2e0362bbc9b23719d936dce07209b2651153c774682f599bbd888e \ No newline at end of file diff --git a/src/select.c b/src/select.c index c97871b637..8ad177f54f 100644 --- a/src/select.c +++ b/src/select.c @@ -6583,7 +6583,8 @@ int sqlite3Select( ** inside the subquery. This can help the subquery to run more efficiently. */ if( OptimizationEnabled(db, SQLITE_PushDown) - && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) + && (pItem->fg.isCte==0 + || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2)) && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor, (pItem->fg.jointype & JT_OUTER)!=0) ){ diff --git a/test/with2.test b/test/with2.test index 02f808ea23..93be6a6a10 100644 --- a/test/with2.test +++ b/test/with2.test @@ -611,4 +611,14 @@ do_execsql_test 12.1 { SELECT quote(c) FROM v3; } {1 'hello' 4.25 NULL X'3C626C6F623E'} +# 2021-08-11 https://sqlite.org/forum/forumpost/d496c3d29bc93736 +reset_db +do_execsql_test 13.1 { + WITH + t1(x) AS (SELECT 111), + t2(y) AS (SELECT 222), + t3(z) AS (SELECT * FROM t2 WHERE false UNION ALL SELECT * FROM t2) + SELECT * FROM t1, t3; +} {111 222} + finish_test From a76b151dab4b7d0b1d5f3ca39bbb118065de1356 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 11 Aug 2021 18:43:54 +0000 Subject: [PATCH 005/130] During DELETE, if an index entry is missing, do not raise the SQLITE_CORRUPT_INDEX error (added by [f339f31f9e9a856b]) if in "PRAGMA writable_schema=ON" mode. FossilOrigin-Name: 19e56291a7344c7aa69e2845f11cb865ee10a6b89a00bbe74b3babbeebe0357b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c8fd1d425c..2c0fb8b457 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sapply\sthe\spush-down\soptimization\sto\sCTE\ssubqueries\sthat\swill\sbe\nreused\sin\sother\scontexts\sin\swhere\sthe\ssame\soptimization\sis\sunlikely\sto\nbe\svalid.\s\sFix\sfor\sthe\sbug\sreported\sby\n[forum:/forumpost/d496c3d29bc93736|forum\spost\sd496c3d29bc93736]. -D 2021-08-11T13:48:56.615 +C During\sDELETE,\sif\san\sindex\sentry\sis\smissing,\sdo\snot\sraise\sthe\nSQLITE_CORRUPT_INDEX\serror\s(added\sby\s[f339f31f9e9a856b])\sif\sin\n"PRAGMA\swritable_schema=ON"\smode. +D 2021-08-11T18:43:54.254 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c e9fd5c474691a7c913dfc971f01cf6d3a3d5954db04e0764a6426f845505e692 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c b73a5ec9940185eb001ff8cff2cfd429bb438c7e89f2885e0bfdb56c3ff13386 +F src/vdbe.c e5cdac52d7163c032ae3c54f1cff9391acd23ba79cea0d5a9524c00cc0a856e8 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1920,7 +1920,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 b1926cc0ab2b81c7df30c4baa6014efcfddb9631f6e46a55c1cec0113ee1afdc -R ce3e16b5ef20fdbd2e2ef5054d8e9088 +P a7ce29a6ef2e0362bbc9b23719d936dce07209b2651153c774682f599bbd888e +R 43c6201fd4576d5a109613a7fb8568cd U drh -Z 7a699911270175239ae2f5d37d476399 +Z c3a9195ab1a5e06373a1e61b14ff61dd diff --git a/manifest.uuid b/manifest.uuid index a7391f2332..80c0cd4ab3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7ce29a6ef2e0362bbc9b23719d936dce07209b2651153c774682f599bbd888e \ No newline at end of file +19e56291a7344c7aa69e2845f11cb865ee10a6b89a00bbe74b3babbeebe0357b \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index cfcd62266a..a07e34f5ff 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5920,7 +5920,8 @@ case OP_SorterInsert: { /* in2 */ ** an UPDATE or DELETE statement and the index entry to be updated ** or deleted is not found. For some uses of IdxDelete ** (example: the EXCEPT operator) it does not matter that no matching -** entry is found. For those cases, P5 is zero. +** entry is found. For those cases, P5 is zero. Also, do not raise +** this (self-correcting and non-critical) error if in writable_schema mode. */ case OP_IdxDelete: { VdbeCursor *pC; @@ -5946,7 +5947,7 @@ case OP_IdxDelete: { if( res==0 ){ rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); if( rc ) goto abort_due_to_error; - }else if( pOp->p5 ){ + }else if( pOp->p5 && !sqlite3WritableSchema(db) ){ rc = sqlite3ReportError(SQLITE_CORRUPT_INDEX, __LINE__, "index corruption"); goto abort_due_to_error; } From 0546027cd7ca147197c2e93b0cbec6d5b079fe41 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 12 Aug 2021 14:22:30 +0000 Subject: [PATCH 006/130] By default, do not use memory mapping to access the temporary files used for external sorts. The old behaviour (to use memory mapping by default) may be restored by building with SQLITE_ENABLE_SORTER_MMAP defined. FossilOrigin-Name: 306694dfb462f9d1f128461e7a8f15a0bb9b21fbc696caa1832f4b20749490d1 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 7 +++++++ test/releasetest_data.tcl | 1 + 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2c0fb8b457..85a11e2e85 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C During\sDELETE,\sif\san\sindex\sentry\sis\smissing,\sdo\snot\sraise\sthe\nSQLITE_CORRUPT_INDEX\serror\s(added\sby\s[f339f31f9e9a856b])\sif\sin\n"PRAGMA\swritable_schema=ON"\smode. -D 2021-08-11T18:43:54.254 +C By\sdefault,\sdo\snot\suse\smemory\smapping\sto\saccess\sthe\stemporary\sfiles\sused\sfor\sexternal\ssorts.\sThe\sold\sbehaviour\s(to\suse\smemory\smapping\sby\sdefault)\smay\sbe\srestored\sby\sbuilding\swith\sSQLITE_ENABLE_SORTER_MMAP\sdefined. +D 2021-08-12T14:22:30.797 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 4ebff642574d3866316439b3dfce165f80e130e8969853c656d71b2afc5dd73c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c 9abeb9f542008eca3db9eb4d863be6c9eb778a07ff48d97d0af5fe98374055f3 +F src/main.c aab8cefb6bfbdbecc53fd19058fa053c0c5e591b2e5067d883ef999d019dcd29 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1297,7 +1297,7 @@ F test/regexp1.test 0c3ff80f66b0eff80e623eb5db7a3dad512095c573d78ac23009785f6d8f F test/regexp2.test 55ed41da802b0e284ac7e2fe944be3948f93ff25abbca0361a609acfed1368b5 F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 6f803ef0b896f8f3f4c26eb072c0399963a5987a509a64d45f5dfbc1ebae2951 x -F test/releasetest_data.tcl f88ed29aa18366ed3956ace36c96ec6868ef5b9ee04cc05d32f4d81031e19e28 +F test/releasetest_data.tcl 1673991f780277748a0c7524969ae9d6f7cfb21d8c790f6081ee5c0d96ea0f28 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/returning1.test f96c7245f6ac16038e802760cd90b93479369939a8a7a44e2329ee5aed28239c @@ -1920,7 +1920,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 a7ce29a6ef2e0362bbc9b23719d936dce07209b2651153c774682f599bbd888e -R 43c6201fd4576d5a109613a7fb8568cd -U drh -Z c3a9195ab1a5e06373a1e61b14ff61dd +P 19e56291a7344c7aa69e2845f11cb865ee10a6b89a00bbe74b3babbeebe0357b +R 224fc103b7931c8813beab0567c100a0 +U dan +Z fd2758fadab57227710ff616e01294ef diff --git a/manifest.uuid b/manifest.uuid index 80c0cd4ab3..f6522eea2f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -19e56291a7344c7aa69e2845f11cb865ee10a6b89a00bbe74b3babbeebe0357b \ No newline at end of file +306694dfb462f9d1f128461e7a8f15a0bb9b21fbc696caa1832f4b20749490d1 \ No newline at end of file diff --git a/src/main.c b/src/main.c index c34fbcc6cf..e0dcf39230 100644 --- a/src/main.c +++ b/src/main.c @@ -3205,7 +3205,14 @@ static int openDatabase( db->nextAutovac = -1; db->szMmap = sqlite3GlobalConfig.szMmap; db->nextPagesize = 0; +#ifdef SQLITE_ENABLE_SORTER_MMAP + /* Beginning with version 3.37.0, using the VFS xFetch() API to memory-map + ** the temporary files used to do external sorts (see code in vdbesort.c) + ** is disabled. It can still be used either by defining + ** SQLITE_ENABLE_SORTER_MMAP at compile time or by using the + ** SQLITE_TESTCTRL_SORTER_MMAP test-control at runtime. */ db->nMaxSorterMmap = 0x7FFFFFFF; +#endif db->flags |= SQLITE_ShortColNames | SQLITE_EnableTrigger | SQLITE_EnableView diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index 00be202286..d90ae2c74f 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -149,6 +149,7 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_RBU -DSQLITE_MAX_ATTACHED=125 -DSQLITE_MAX_MMAP_SIZE=12884901888 + -DSQLITE_ENABLE_SORTER_MMAP=1 -DLONGDOUBLE_TYPE=double --enable-session } From d519bbdf5c724b079e5e9bbf36173ad8272c53c0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 17 Aug 2021 19:59:09 +0000 Subject: [PATCH 007/130] Fix an off-by-one error in the error-handling logic of the Lemon parser-generator. This does not affect SQLite. [forum:/forumpost/cff80737bf|Forum cff80737bf]. FossilOrigin-Name: 7cca80808cef192fe0479477056a028e230a164fd368e72100def065d424ca2c --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/lempar.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 85a11e2e85..be220778a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C By\sdefault,\sdo\snot\suse\smemory\smapping\sto\saccess\sthe\stemporary\sfiles\sused\sfor\sexternal\ssorts.\sThe\sold\sbehaviour\s(to\suse\smemory\smapping\sby\sdefault)\smay\sbe\srestored\sby\sbuilding\swith\sSQLITE_ENABLE_SORTER_MMAP\sdefined. -D 2021-08-12T14:22:30.797 +C Fix\san\soff-by-one\serror\sin\sthe\serror-handling\slogic\sof\sthe\sLemon\nparser-generator.\s\sThis\sdoes\snot\saffect\sSQLite.\n[forum:/forumpost/cff80737bf|Forum\scff80737bf]. +D 2021-08-17T19:59:09.232 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1839,7 +1839,7 @@ F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c f62a0c701b2c7ff2f3e21d206f093c123f222dbf07136a10ffd1ca15a5c706c5 F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c a5acddd3eec6a388872aae6efc7563336348a9c45e5563642f77e8e3a50e859d -F tool/lempar.c 1d3d075da18681c67ecc66c1f171e7094e18cd2cfba6a8a1bd4f3f639d6656e1 +F tool/lempar.c bbabd74a36513a4376a6b26a35804b11adae6f335d47aab29cc3bbaaa85fa4d5 F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1920,7 +1920,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 19e56291a7344c7aa69e2845f11cb865ee10a6b89a00bbe74b3babbeebe0357b -R 224fc103b7931c8813beab0567c100a0 -U dan -Z fd2758fadab57227710ff616e01294ef +P 306694dfb462f9d1f128461e7a8f15a0bb9b21fbc696caa1832f4b20749490d1 +R 54304cbb37b751a39391e2ab31ad143d +U drh +Z 050cb126e33da7c9d6a4f79c296a4a65 diff --git a/manifest.uuid b/manifest.uuid index f6522eea2f..67afe2ca30 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -306694dfb462f9d1f128461e7a8f15a0bb9b21fbc696caa1832f4b20749490d1 \ No newline at end of file +7cca80808cef192fe0479477056a028e230a164fd368e72100def065d424ca2c \ No newline at end of file diff --git a/tool/lempar.c b/tool/lempar.c index 35c3768bb9..cf61553a15 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -981,14 +981,14 @@ void Parse( yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); yymajor = YYNOCODE; }else{ - while( yypParser->yytos >= yypParser->yystack + while( yypParser->yytos > yypParser->yystack && (yyact = yy_find_reduce_action( yypParser->yytos->stateno, YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE ){ yy_pop_parser_stack(yypParser); } - if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ + if( yypParser->yytos <= yypParser->yystack || yymajor==0 ){ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); yy_parse_failed(yypParser); #ifndef YYNOERRORRECOVERY From b70f2eabb49dc672bb0bdb75c1da155b5f769f78 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 18 Aug 2021 12:05:22 +0000 Subject: [PATCH 008/130] Rename the Column.eType field to Column.eCType - with an extra "C". FossilOrigin-Name: b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 4 ++-- src/sqliteInt.h | 4 ++-- src/util.c | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index be220778a8..5fab331f65 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soff-by-one\serror\sin\sthe\serror-handling\slogic\sof\sthe\sLemon\nparser-generator.\s\sThis\sdoes\snot\saffect\sSQLite.\n[forum:/forumpost/cff80737bf|Forum\scff80737bf]. -D 2021-08-17T19:59:09.232 +C Rename\sthe\sColumn.eType\sfield\sto\sColumn.eCType\s-\swith\san\sextra\s"C". +D 2021-08-18T12:05:22.798 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c ac4c6990ff076676bf172442c7098d2ae8370adf8c3ac6280aef23d05336ec9c +F src/build.c 0374faa35f0920c51147a20bb3462fae22310f2acaf29721ca99821fc7232548 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -549,7 +549,7 @@ F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e82634 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h a7f02fb629d7657cea714446d8c285d195b0504c31ae843833e44c46f941e3b6 +F src/sqliteInt.h a65ddfb177549c82dcd1374a2f23260328eb65ced55b50843419386177e159be F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -614,7 +614,7 @@ F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c e9fd5c474691a7c913dfc971f01cf6d3a3d5954db04e0764a6426f845505e692 +F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c e5cdac52d7163c032ae3c54f1cff9391acd23ba79cea0d5a9524c00cc0a856e8 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe @@ -1920,7 +1920,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 306694dfb462f9d1f128461e7a8f15a0bb9b21fbc696caa1832f4b20749490d1 -R 54304cbb37b751a39391e2ab31ad143d +P 7cca80808cef192fe0479477056a028e230a164fd368e72100def065d424ca2c +R b66c8f57a17fe88d4036ed4eb83a05fb U drh -Z 050cb126e33da7c9d6a4f79c296a4a65 +Z 2628ebdae9db72c0a61ecc0e228d76e8 diff --git a/manifest.uuid b/manifest.uuid index 67afe2ca30..e1f9e77716 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cca80808cef192fe0479477056a028e230a164fd368e72100def065d424ca2c \ No newline at end of file +b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba \ No newline at end of file diff --git a/src/build.c b/src/build.c index 6343da4f58..69717edd23 100644 --- a/src/build.c +++ b/src/build.c @@ -1554,7 +1554,7 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ /* If there is no type specified, columns have the default affinity ** 'BLOB' with a default size of 4 bytes. */ pCol->affinity = affinity; - pCol->eType = eType; + pCol->eCType = eType; pCol->szEst = szEst; #ifdef SQLITE_ENABLE_SORTER_REFERENCES if( affinity==SQLITE_AFF_BLOB ){ @@ -1849,7 +1849,7 @@ void sqlite3AddPrimaryKey( } if( nTerm==1 && pCol - && pCol->eType==COLTYPE_INTEGER + && pCol->eCType==COLTYPE_INTEGER && sortOrder!=SQLITE_SO_DESC ){ if( IN_RENAME_OBJECT && pList ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e5dd352460..ade7399d85 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2039,7 +2039,7 @@ struct Module { struct Column { char *zCnName; /* Name of this column */ unsigned notNull :4; /* An OE_ code for handling a NOT NULL constraint */ - unsigned eType :4; /* One of the standard types */ + unsigned eCType :4; /* One of the standard types */ char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Est size of value in this column. sizeof(INT)==1 */ u8 hName; /* Column name hash for faster lookup */ @@ -2047,7 +2047,7 @@ struct Column { u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; -/* Allowed values for Column.eType. +/* Allowed values for Column.eCType. ** ** Values must match entries in the global constant arrays ** sqlite3StdTypeLen[] and sqlite3StdType[]. Each value is one more diff --git a/src/util.c b/src/util.c index 89e3e56f1f..2d1c64ad13 100644 --- a/src/util.c +++ b/src/util.c @@ -91,9 +91,9 @@ int sqlite3Strlen30(const char *z){ char *sqlite3ColumnType(Column *pCol, char *zDflt){ if( pCol->colFlags & COLFLAG_HASTYPE ){ return pCol->zCnName + strlen(pCol->zCnName) + 1; - }else if( pCol->eType ){ - assert( pCol->eType<=SQLITE_N_STDTYPE ); - return (char*)sqlite3StdType[pCol->eType-1]; + }else if( pCol->eCType ){ + assert( pCol->eCType<=SQLITE_N_STDTYPE ); + return (char*)sqlite3StdType[pCol->eCType-1]; }else{ return zDflt; } From 44183f83d0fbbc1e092b990afd2ede033759574f Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 18 Aug 2021 13:13:58 +0000 Subject: [PATCH 009/130] What would it be like if you could add the keyword "STRICT" after a CREATE TABLE statement to cause the table to (1) allow only a few well-defined datatypes, (2) rigidly enforce those types, (3) require NOT NULL on PK columns, (4) always enforce foreign key constraint, and so forth? This branch seeks to explore that question. FossilOrigin-Name: 78732b9f98936693ae29c85a692c35a84c7d065aec79903af34b08d18f10a5e6 --- manifest | 20 ++++++++++++-------- manifest.uuid | 2 +- src/build.c | 17 ++++++++++++++++- src/parse.y | 19 +++++++++++++++---- src/sqliteInt.h | 3 ++- test/strict1.test | 41 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 15 deletions(-) create mode 100644 test/strict1.test diff --git a/manifest b/manifest index 5fab331f65..ef7cc85598 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rename\sthe\sColumn.eType\sfield\sto\sColumn.eCType\s-\swith\san\sextra\s"C". -D 2021-08-18T12:05:22.798 +C What\swould\sit\sbe\slike\sif\syou\scould\sadd\sthe\skeyword\s"STRICT"\safter\sa\sCREATE\nTABLE\sstatement\sto\scause\sthe\stable\sto\s(1)\sallow\sonly\sa\sfew\swell-defined\ndatatypes,\s(2)\srigidly\senforce\sthose\stypes,\s(3)\srequire\sNOT\sNULL\son\sPK\ncolumns,\s(4)\salways\senforce\sforeign\skey\sconstraint,\sand\sso\sforth?\s\sThis\nbranch\sseeks\sto\sexplore\sthat\squestion. +D 2021-08-18T13:13:58.021 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 0374faa35f0920c51147a20bb3462fae22310f2acaf29721ca99821fc7232548 +F src/build.c bf8b4f6f4fb9620eedadaa9513a2682b9ff80c643285f56d9ea34105dc3c2e2b F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -533,7 +533,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb +F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -549,7 +549,7 @@ F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e82634 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h a65ddfb177549c82dcd1374a2f23260328eb65ced55b50843419386177e159be +F src/sqliteInt.h 25581e591444d7be1eda83890a8828b28b8ff4c65ffd85a15acd4f0820260821 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1425,6 +1425,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 +F test/strict1.test d84d23c8b2e2742277d943db3a56d2cf0d886ad9bb4de46228aa6c7c676f6553 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 @@ -1920,7 +1921,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7cca80808cef192fe0479477056a028e230a164fd368e72100def065d424ca2c -R b66c8f57a17fe88d4036ed4eb83a05fb +P b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba +R d1aed29af5d2a129b155039aa4e933b3 +T *branch * strict-tables +T *sym-strict-tables * +T -sym-trunk * U drh -Z 2628ebdae9db72c0a61ecc0e228d76e8 +Z d972776960407c2f55c8c38fcd2522b6 diff --git a/manifest.uuid b/manifest.uuid index e1f9e77716..cbd5beb27c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba \ No newline at end of file +78732b9f98936693ae29c85a692c35a84c7d065aec79903af34b08d18f10a5e6 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 69717edd23..72520cc79a 100644 --- a/src/build.c +++ b/src/build.c @@ -2554,7 +2554,7 @@ void sqlite3EndTable( Parse *pParse, /* Parse context */ Token *pCons, /* The ',' token after the last column defn. */ Token *pEnd, /* The ')' before options in the CREATE TABLE */ - u8 tabOpts, /* Extra table options. Usually 0. */ + u32 tabOpts, /* Extra table options. Usually 0. */ Select *pSelect /* Select from a "CREATE ... AS SELECT" */ ){ Table *p; /* The new table */ @@ -2590,6 +2590,21 @@ void sqlite3EndTable( if( p->tnum==1 ) p->tabFlags |= TF_Readonly; } + /* Do not allow COLTYPE_CUSTOM in STRICT mode */ + if( tabOpts & TF_Strict ){ + int ii; + p->tabFlags |= TF_Strict; + for(ii=0; iinCol; ii++){ + if( p->aCol[ii].eCType==COLTYPE_CUSTOM ){ + sqlite3ErrorMsg(pParse, + "unknown datatype for %s.%s: \"%s\"", + p->zName, p->aCol[ii].zCnName, sqlite3ColumnType(p->aCol+ii, "") + ); + return; + } + } + } + assert( (p->tabFlags & TF_HasPrimaryKey)==0 || p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 ); assert( (p->tabFlags & TF_HasPrimaryKey)!=0 diff --git a/src/parse.y b/src/parse.y index 24c539bdb3..08657f93be 100644 --- a/src/parse.y +++ b/src/parse.y @@ -196,16 +196,19 @@ ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} temp(A) ::= TEMP. {A = pParse->db->init.busy==0;} %endif SQLITE_OMIT_TEMPDB temp(A) ::= . {A = 0;} -create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). { +create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_option_set(F). { sqlite3EndTable(pParse,&X,&E,F,0); } create_table_args ::= AS select(S). { sqlite3EndTable(pParse,0,0,0,S); sqlite3SelectDelete(pParse->db, S); } -%type table_options {int} -table_options(A) ::= . {A = 0;} -table_options(A) ::= WITHOUT nm(X). { +%type table_option_set {u32} +%type table_option {u32} +table_option_set(A) ::= . {A = 0;} +table_option_set(A) ::= table_option(A). +table_option_set(A) ::= table_option_set(X) COMMA table_option(Y). {A = X|Y;} +table_option(A) ::= WITHOUT nm(X). { if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){ A = TF_WithoutRowid | TF_NoVisibleRowid; }else{ @@ -213,6 +216,14 @@ table_options(A) ::= WITHOUT nm(X). { sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); } } +table_option(A) ::= nm(X). { + if( X.n==6 && sqlite3_strnicmp(X.z,"strict",6)==0 ){ + A = TF_Strict; + }else{ + A = 0; + sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); + } +} columnlist ::= columnlist COMMA columnname carglist. columnlist ::= columnname carglist. columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,A,Y);} diff --git a/src/sqliteInt.h b/src/sqliteInt.h index ade7399d85..5a3acfd035 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2284,6 +2284,7 @@ struct Table { #define TF_HasStat4 0x00002000 /* STAT4 info available for this table */ #define TF_Ephemeral 0x00004000 /* An ephemeral table */ #define TF_Eponymous 0x00008000 /* An eponymous virtual table */ +#define TF_Strict 0x00010000 /* STRICT mode */ /* ** Allowed values for Table.eTabType @@ -4435,7 +4436,7 @@ void sqlite3AddCheckConstraint(Parse*, Expr*, const char*, const char*); void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); void sqlite3AddCollateType(Parse*, Token*); void sqlite3AddGenerated(Parse*,Expr*,Token*); -void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); +void sqlite3EndTable(Parse*,Token*,Token*,u32,Select*); void sqlite3AddReturning(Parse*,ExprList*); int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); diff --git a/test/strict1.test b/test/strict1.test new file mode 100644 index 0000000000..303ec30922 --- /dev/null +++ b/test/strict1.test @@ -0,0 +1,41 @@ +# 2021-08-18 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file implements regression tests for SQLite library. The +# focus of this file is testing STRICT tables. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix strict1 + +# STRICT tables have on a limited number of allowed datatypes. +# +do_catchsql_test strict1-1.1 { + CREATE TABLE t1(a) STRICT; +} {1 {unknown datatype for t1.a: ""}} +do_catchsql_test strict1-1.2 { + CREATE TABLE t1(a PRIMARY KEY) STRICT, WITHOUT ROWID; +} {1 {unknown datatype for t1.a: ""}} +do_catchsql_test strict1-1.3 { + CREATE TABLE t1(a PRIMARY KEY) WITHOUT ROWID, STRICT; +} {1 {unknown datatype for t1.a: ""}} +do_catchsql_test strict1-1.4 { + CREATE TABLE t1(a BANJO PRIMARY KEY) WITHOUT ROWID, STRICT; +} {1 {unknown datatype for t1.a: "BANJO"}} +do_catchsql_test strict1-1.5 { + CREATE TABLE t1(a TEXT PRIMARY KEY, b INT, c INTEGER, d REAL, e BLOB, f DATE) strict; +} {1 {unknown datatype for t1.f: "DATE"}} +do_catchsql_test strict1-1.6 { + CREATE TABLE t1(a TEXT PRIMARY KEY, b INT, c INTEGER, d REAL, e BLOB, f TEXT(50)) WITHOUT ROWID, STRICT; +} {1 {unknown datatype for t1.f: "TEXT(50)"}} + +finish_test From 72532f52bce548348cff66b6113776e11d6d7f3f Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 18 Aug 2021 19:22:27 +0000 Subject: [PATCH 010/130] Trying to insert an incorrect datatype into a STRICT table raises an SQLITE_CONSTRAINT_DATATYPE error. Seems to work, though lots more testing is needed. FossilOrigin-Name: a19305e5cfedf5c472200d6e05c1396443e348f052a40a0979f860f2ff06851d --- manifest | 23 ++++++-------- manifest.uuid | 2 +- src/insert.c | 20 +++++++++++- src/sqlite.h.in | 1 + src/sqliteInt.h | 2 +- src/vdbe.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ test/strict1.test | 53 ++++++++++++++++++++++++++++++- 7 files changed, 163 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index ef7cc85598..b57c86b471 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C What\swould\sit\sbe\slike\sif\syou\scould\sadd\sthe\skeyword\s"STRICT"\safter\sa\sCREATE\nTABLE\sstatement\sto\scause\sthe\stable\sto\s(1)\sallow\sonly\sa\sfew\swell-defined\ndatatypes,\s(2)\srigidly\senforce\sthose\stypes,\s(3)\srequire\sNOT\sNULL\son\sPK\ncolumns,\s(4)\salways\senforce\sforeign\skey\sconstraint,\sand\sso\sforth?\s\sThis\nbranch\sseeks\sto\sexplore\sthat\squestion. -D 2021-08-18T13:13:58.021 +C Trying\sto\sinsert\san\sincorrect\sdatatype\sinto\sa\sSTRICT\stable\sraises\san\nSQLITE_CONSTRAINT_DATATYPE\serror.\s\sSeems\sto\swork,\sthough\slots\smore\stesting\nis\sneeded. +D 2021-08-18T19:22:27.620 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -505,7 +505,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 4ebff642574d3866316439b3dfce165f80e130e8969853c656d71b2afc5dd73c +F src/insert.c dbf6ed6c070661691a50ec135bff47700a01c71ce9987819860c3a992dda8b95 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c aab8cefb6bfbdbecc53fd19058fa053c0c5e591b2e5067d883ef999d019dcd29 @@ -546,10 +546,10 @@ F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 0577308f097363b6ebac223e210418810acf74e677f580597f7d0718476fe3ef F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346 -F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 +F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 25581e591444d7be1eda83890a8828b28b8ff4c65ffd85a15acd4f0820260821 +F src/sqliteInt.h 732ef4ade4ea3e95ddc0a6be657c5f9eb1e4b8ede3105395fe0161c15fab9214 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c e5cdac52d7163c032ae3c54f1cff9391acd23ba79cea0d5a9524c00cc0a856e8 +F src/vdbe.c 0e70bef8e65fc217beb7909235502ce132d231fb656554205e0c13927b4140d1 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1425,7 +1425,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test d84d23c8b2e2742277d943db3a56d2cf0d886ad9bb4de46228aa6c7c676f6553 +F test/strict1.test 36a24e127e2cdc65ecf23d03c9a4fbe6d8f7cb80f4c4bf09eb220c1ce4c84daf F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 @@ -1921,10 +1921,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 b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba -R d1aed29af5d2a129b155039aa4e933b3 -T *branch * strict-tables -T *sym-strict-tables * -T -sym-trunk * +P 78732b9f98936693ae29c85a692c35a84c7d065aec79903af34b08d18f10a5e6 +R 1fff96359c6ac1b1e05dcf91c71ba789 U drh -Z d972776960407c2f55c8c38fcd2522b6 +Z 89d8d7739872c2c88b7cdfc8d1469967 diff --git a/manifest.uuid b/manifest.uuid index cbd5beb27c..0b2954cae8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -78732b9f98936693ae29c85a692c35a84c7d065aec79903af34b08d18f10a5e6 \ No newline at end of file +a19305e5cfedf5c472200d6e05c1396443e348f052a40a0979f860f2ff06851d \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 0692198b1e..1148257ad2 100644 --- a/src/insert.c +++ b/src/insert.c @@ -131,7 +131,25 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ */ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ int i, j; - char *zColAff = pTab->zColAff; + char *zColAff; + if( pTab->tabFlags & TF_Strict ){ + if( iReg==0 ){ + /* Move the previous opcode (which should be OP_MakeRecord) forward + ** by one slot and insert a new OP_TypeCheck where the current + ** OP_MakeRecord is found */ + VdbeOp *pPrev; + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + pPrev = sqlite3VdbeGetOp(v, -1); + pPrev->opcode = OP_TypeCheck; + sqlite3VdbeAddOp3(v, OP_MakeRecord, pPrev->p1, pPrev->p2, pPrev->p3); + }else{ + /* Insert an isolated OP_Typecheck */ + sqlite3VdbeAddOp2(v, OP_TypeCheck, iReg, pTab->nNVCol); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + } + return; + } + zColAff = pTab->zColAff; if( zColAff==0 ){ sqlite3 *db = sqlite3VdbeDb(v); zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index e4ea66a725..6fab852b69 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -561,6 +561,7 @@ int sqlite3_exec( #define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) #define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) #define SQLITE_CONSTRAINT_PINNED (SQLITE_CONSTRAINT |(11<<8)) +#define SQLITE_CONSTRAINT_DATATYPE (SQLITE_CONSTRAINT |(12<<8)) #define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) #define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) #define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5a3acfd035..0a01179090 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2039,7 +2039,7 @@ struct Module { struct Column { char *zCnName; /* Name of this column */ unsigned notNull :4; /* An OE_ code for handling a NOT NULL constraint */ - unsigned eCType :4; /* One of the standard types */ + unsigned eCType :4; /* One of the standard types */ char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Est size of value in this column. sizeof(INT)==1 */ u8 hName; /* Column name hash for faster lookup */ diff --git a/src/vdbe.c b/src/vdbe.c index a07e34f5ff..d7def8a79f 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2870,6 +2870,85 @@ op_column_corrupt: } } +/* Opcode: TypeCheck P1 P2 * P4 * +** Synopsis: typecheck(r[P1@P2]) +** +** Apply affinities to the range of P2 registers beginning with P1. +** Take the affinities from the Table object in P4. If any value +** cannot be coerced into the correct type, then raise an error. +** +** This opcode is similar to OP_Affinity except that this opcode +** forces the register type to the Table column type. This is used +** to implement "strict affinity". +*/ +case OP_TypeCheck: { + Table *pTab; + Column *aCol; + int i; + + assert( pOp->p4type==P4_TABLE ); + pTab = pOp->p4.pTab; + assert( pTab->tabFlags & TF_Strict ); + aCol = pTab->aCol; + pIn1 = &aMem[pOp->p1]; + for(i=0; inCol; i++){ + if( aCol[i].colFlags & COLFLAG_VIRTUAL ) continue; + assert( pIn1 < &aMem[pOp->p1+pOp->p2] ); + applyAffinity(pIn1, aCol[i].affinity, encoding); + if( (pIn1->flags & MEM_Null)==0 ){ + switch( aCol[i].eCType ){ + case COLTYPE_BLOB: { + if( (pIn1->flags & MEM_Blob)==0 ) goto vdbe_type_error; + break; + } + case COLTYPE_INTEGER: + case COLTYPE_INT: { + if( (pIn1->flags & MEM_Int)==0 ) goto vdbe_type_error; + break; + } + case COLTYPE_TEXT: { + if( (pIn1->flags & MEM_Str)==0 ) goto vdbe_type_error; + break; + } + default: { + assert( aCol[i].eCType==COLTYPE_REAL ); + if( pIn1->flags & MEM_Int ){ + /* When applying REAL affinity, if the result is still an MEM_Int + ** that will fit in 6 bytes, then change the type to MEM_IntReal + ** so that we keep the high-resolution integer value but know that + ** the type really wants to be REAL. */ + testcase( pIn1->u.i==140737488355328LL ); + testcase( pIn1->u.i==140737488355327LL ); + testcase( pIn1->u.i==-140737488355328LL ); + testcase( pIn1->u.i==-140737488355329LL ); + if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL){ + pIn1->flags |= MEM_IntReal; + pIn1->flags &= ~MEM_Int; + }else{ + pIn1->u.r = (double)pIn1->u.i; + pIn1->flags |= MEM_Real; + pIn1->flags &= ~MEM_Int; + } + }else if( (pIn1->flags & MEM_Real)==0 ){ + goto vdbe_type_error; + } + break; + } + } + } + REGISTER_TRACE((int)(pIn1-aMem), pIn1); + pIn1++; + } + assert( pIn1 == &aMem[pOp->p1+pOp->p2] ); + break; + +vdbe_type_error: + sqlite3VdbeError(p, "%s.%s holds only %s values", + pTab->zName, aCol[i].zCnName, sqlite3StdType[aCol[i].eCType-1]); + rc = SQLITE_CONSTRAINT_DATATYPE; + goto abort_due_to_error; +} + /* Opcode: Affinity P1 P2 * P4 * ** Synopsis: affinity(r[P1@P2]) ** diff --git a/test/strict1.test b/test/strict1.test index 303ec30922..9e395955d1 100644 --- a/test/strict1.test +++ b/test/strict1.test @@ -37,5 +37,56 @@ do_catchsql_test strict1-1.5 { do_catchsql_test strict1-1.6 { CREATE TABLE t1(a TEXT PRIMARY KEY, b INT, c INTEGER, d REAL, e BLOB, f TEXT(50)) WITHOUT ROWID, STRICT; } {1 {unknown datatype for t1.f: "TEXT(50)"}} - + +do_execsql_test strict1-2.0 { + CREATE TABLE t1( + a INT, + b INTEGER, + c BLOB, + d TEXT, + e REAL + ) STRICT; +} {} +do_catchsql_test strict1-2.1 { + INSERT INTO t1(a) VALUES('xyz'); +} {1 {t1.a holds only INT values}} +do_catchsql_test strict1-2.2 { + INSERT INTO t1(b) VALUES('xyz'); +} {1 {t1.b holds only INTEGER values}} +do_catchsql_test strict1-2.3 { + INSERT INTO t1(c) VALUES('xyz'); +} {1 {t1.c holds only BLOB values}} +do_catchsql_test strict1-2.4 { + INSERT INTO t1(d) VALUES(x'3142536475'); +} {1 {t1.d holds only TEXT values}} +do_catchsql_test strict1-2.5 { + INSERT INTO t1(e) VALUES('xyz'); +} {1 {t1.e holds only REAL values}} + +do_execsql_test strict1-3.1 { + INSERT INTO t1(a, b) VALUES(1,2),('3','4'),(5.0, 6.0),(null,null); + SELECT a, b, '|' FROM t1; +} {1 2 | 3 4 | 5 6 | {} {} |} +do_catchsql_test strict1-3.2 { + INSERT INTO t1(a) VALUES(1.2); +} {1 {t1.a holds only INT values}} +do_catchsql_test strict1-3.3 { + INSERT INTO t1(a) VALUES(x'313233'); +} {1 {t1.a holds only INT values}} +do_catchsql_test strict1-3.4 { + INSERT INTO t1(b) VALUES(1.2); +} {1 {t1.b holds only INTEGER values}} +do_catchsql_test strict1-3.5 { + INSERT INTO t1(b) VALUES(x'313233'); +} {1 {t1.b holds only INTEGER values}} + +do_execsql_test strict1-4.1 { + DELETE FROM t1; + INSERT INTO t1(c) VALUES(x'313233'), (NULL); + SELECT typeof(c), c FROM t1; +} {blob 123 null {}} +do_catchsql_test strict1-4.2 { + INSERT INTO t1(c) VALUES('456'); +} {1 {t1.c holds only BLOB values}} + finish_test From fd46ec6476e2270e0e8dc114e698d82dc20fad05 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 18 Aug 2021 22:26:51 +0000 Subject: [PATCH 011/130] Fix ON CONFLICT clause processing for NOT NULL constraints of PRIMARY KEY columns on WITHOUT ROWID tables. Ticket [f2be158c57aaa8c6] FossilOrigin-Name: 13abba0941a724eb62455650976b03678e4455b6b3090c84a2ab2f4a7656b4d8 --- manifest | 14 +++---- manifest.uuid | 2 +- src/build.c | 4 +- test/without_rowid5.test | 81 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5fab331f65..6e4b8ae466 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rename\sthe\sColumn.eType\sfield\sto\sColumn.eCType\s-\swith\san\sextra\s"C". -D 2021-08-18T12:05:22.798 +C Fix\sON\sCONFLICT\sclause\sprocessing\sfor\sNOT\sNULL\sconstraints\sof\sPRIMARY\sKEY\ncolumns\son\sWITHOUT\sROWID\stables.\nTicket\s[f2be158c57aaa8c6] +D 2021-08-18T22:26:51.356 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 0374faa35f0920c51147a20bb3462fae22310f2acaf29721ca99821fc7232548 +F src/build.c 69cddb20437f5608d026409281a3f6b8064d324d009bd22eb6acba4202e38770 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1807,7 +1807,7 @@ F test/without_rowid1.test 6abc5d497f634520944dac0a89a6c240a48d2ee0f8353356a750e F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053d68d4b2f67b F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a -F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a +F test/without_rowid5.test f058a97600c09c7c8754733b9d8adc428e055f815d8926d74b59b872e20d0e2b F test/without_rowid6.test efbd7add62c59bf5ca97bf8da674e734e6a70ef979234e816166824b4d258f68 F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 @@ -1920,7 +1920,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 7cca80808cef192fe0479477056a028e230a164fd368e72100def065d424ca2c -R b66c8f57a17fe88d4036ed4eb83a05fb +P b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba +R f57d6ed5153ac1a3784cf20c59f627b9 U drh -Z 2628ebdae9db72c0a61ecc0e228d76e8 +Z 19e6156db8fe8743846e026420e0b856 diff --git a/manifest.uuid b/manifest.uuid index e1f9e77716..e76a74f795 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9b0dcd5af072c22f2ce71cf9584b5b572fbcfbce6410a7d703b586adb8938ba \ No newline at end of file +13abba0941a724eb62455650976b03678e4455b6b3090c84a2ab2f4a7656b4d8 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 69717edd23..93bb3419ed 100644 --- a/src/build.c +++ b/src/build.c @@ -2321,7 +2321,9 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ */ if( !db->init.imposterTable ){ for(i=0; inCol; i++){ - if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 ){ + if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 + && (pTab->aCol[i].notNull==OE_None) + ){ pTab->aCol[i].notNull = OE_Abort; } } diff --git a/test/without_rowid5.test b/test/without_rowid5.test index 31a440ad87..29d226a757 100644 --- a/test/without_rowid5.test +++ b/test/without_rowid5.test @@ -186,6 +186,87 @@ do_execsql_test without_rowid5-5.9 { SELECT count(*) FROM nnw; } {1} +# Ticket f2be158c57aaa8c6 (2021-08-18) +# NOT NULL ON CONFLICT clauses work on WITHOUT ROWID tables now. +# +do_test without_rowid5-5.100 { + db eval { + DROP TABLE IF EXISTS t5; + CREATE TABLE t5( + a INT NOT NULL ON CONFLICT ROLLBACK, + b TEXT, + c TEXT, + PRIMARY KEY(a,b) + ) WITHOUT ROWID; + BEGIN; + INSERT INTO t5(a,b,c) VALUES(1,2,3); + } + catch {db eval {INSERT INTO t5(a,b,c) VALUES(NULL,6,7);}} + db eval { + SELECT * FROM t5; + } +} {} +do_test without_rowid5-5.101 { + db eval { + DROP TABLE IF EXISTS t5; + CREATE TABLE t5( + a INT NOT NULL ON CONFLICT ABORT, + b TEXT, + c TEXT, + PRIMARY KEY(a,b) + ) WITHOUT ROWID; + BEGIN; + INSERT INTO t5(a,b,c) VALUES(1,2,3); + } + catch {db eval {INSERT INTO t5(a,b,c) VALUES(NULL,6,7);}} + db eval { + COMMIT; + SELECT * FROM t5; + } +} {1 2 3} +do_test without_rowid5-5.102 { + db eval { + DROP TABLE IF EXISTS t5; + CREATE TABLE t5( + a INT NOT NULL ON CONFLICT FAIL, + b TEXT, + c TEXT, + PRIMARY KEY(a,b) + ) WITHOUT ROWID; + } + catch {db eval {INSERT INTO t5(a,b,c) VALUES(1,2,3),(NULL,4,5),(6,7,8);}} + db eval { + SELECT * FROM t5; + } +} {1 2 3} +do_test without_rowid5-5.103 { + db eval { + DROP TABLE IF EXISTS t5; + CREATE TABLE t5( + a INT NOT NULL ON CONFLICT IGNORE, + b TEXT, + c TEXT, + PRIMARY KEY(a,b) + ) WITHOUT ROWID; + INSERT INTO t5(a,b,c) VALUES(1,2,3),(NULL,4,5),(6,7,8); + SELECT * FROM t5; + } +} {1 2 3 6 7 8} +do_test without_rowid5-5.104 { + db eval { + DROP TABLE IF EXISTS t5; + CREATE TABLE t5( + a INT NOT NULL ON CONFLICT REPLACE DEFAULT 3, + b TEXT, + c TEXT, + PRIMARY KEY(a,b) + ) WITHOUT ROWID; + INSERT INTO t5(a,b,c) VALUES(1,2,3),(NULL,4,5),(6,7,8); + SELECT * FROM t5; + } +} {1 2 3 3 4 5 6 7 8} + + # EVIDENCE-OF: R-12643-30541 The incremental blob I/O mechanism does not # work for WITHOUT ROWID tables. # From ab16578b722469ecc835b55b0e7f65481118559d Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 19 Aug 2021 00:24:43 +0000 Subject: [PATCH 012/130] STRICT tables require all fields of the PRIMARY KEY to be NOT NULL. FossilOrigin-Name: 5efdf9acad9d54783f5134b7e9338f44336862d87dc324d315b8d55e44df1923 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 14 ++++++++++++-- test/strict1.test | 21 +++++++++++++++++++++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6a19c5a170..8fec01b5ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\sWITHOUT\sROWID,\sNOT\sNULL\sON\sCONFLICT\sbug\sfix\sinto\sthe\sstrict-tables\nbranch. -D 2021-08-18T23:00:43.920 +C STRICT\stables\srequire\sall\sfields\sof\sthe\sPRIMARY\sKEY\sto\sbe\sNOT\sNULL. +D 2021-08-19T00:24:43.029 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 25adabcbe538ce25c577c3f6815c0a83c483a700984d784a69ed6883cbbd7a98 +F src/build.c c55bec6a37b3b521c10ac6ae2f73328e3a49c12a1b8c87ca151d81c5e1095142 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1425,7 +1425,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test 36a24e127e2cdc65ecf23d03c9a4fbe6d8f7cb80f4c4bf09eb220c1ce4c84daf +F test/strict1.test dab7a84f5445e696beb3e2eedda9b3a28fb16bf3092be1917b3f1a6163916197 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 @@ -1921,7 +1921,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 a19305e5cfedf5c472200d6e05c1396443e348f052a40a0979f860f2ff06851d 13abba0941a724eb62455650976b03678e4455b6b3090c84a2ab2f4a7656b4d8 -R fda99db412e4d20b77fa444be1944106 +P 7ee01ee47da247a80bcf16f88eb187b8c0928024536435ed20797a1a90495511 +R 9431b5ba9e76c466e3043738fddec247 U drh -Z 59e849481af66370dc20d95e87531af1 +Z 0e5e6ca613f5601fc51663462528d032 diff --git a/manifest.uuid b/manifest.uuid index 33b9ab83f7..c53f8de72d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ee01ee47da247a80bcf16f88eb187b8c0928024536435ed20797a1a90495511 \ No newline at end of file +5efdf9acad9d54783f5134b7e9338f44336862d87dc324d315b8d55e44df1923 \ No newline at end of file diff --git a/src/build.c b/src/build.c index fbf619cc80..bf9746de04 100644 --- a/src/build.c +++ b/src/build.c @@ -2597,13 +2597,23 @@ void sqlite3EndTable( int ii; p->tabFlags |= TF_Strict; for(ii=0; iinCol; ii++){ - if( p->aCol[ii].eCType==COLTYPE_CUSTOM ){ + Column *pCol = &p->aCol[ii]; + if( pCol->eCType==COLTYPE_CUSTOM ){ sqlite3ErrorMsg(pParse, "unknown datatype for %s.%s: \"%s\"", - p->zName, p->aCol[ii].zCnName, sqlite3ColumnType(p->aCol+ii, "") + p->zName, pCol->zCnName, sqlite3ColumnType(pCol, "") ); return; } + if( (pCol->colFlags & COLFLAG_PRIMKEY)!=0 + && p->iPKey!=ii + && pCol->notNull == OE_None + ){ + /* Primary key columns other than the IPK may not be NULL + ** in strict mode */ + pCol->notNull = OE_Abort; + p->tabFlags |= TF_HasNotNull; + } } } diff --git a/test/strict1.test b/test/strict1.test index 9e395955d1..fcd908b854 100644 --- a/test/strict1.test +++ b/test/strict1.test @@ -89,4 +89,25 @@ do_catchsql_test strict1-4.2 { INSERT INTO t1(c) VALUES('456'); } {1 {t1.c holds only BLOB values}} +do_execsql_test strict1-5.1 { + DELETE FROM t1; + INSERT INTO t1(d) VALUES('xyz'),(4),(5.5),(NULL); + SELECT typeof(d), d FROM t1; +} {text xyz text 4 text 5.5 null {}} +do_catchsql_test strict1-5.2 { + INSERT INTO t1(d) VALUES(x'4567'); +} {1 {t1.d holds only TEXT values}} + +do_execsql_test strict1-6.1 { + DELETE FROM t1; + INSERT INTO t1(e) VALUES(1),(2.5),('3'),('4.5'),(6.0),(NULL); + SELECT typeof(e), e FROM t1; +} {real 1.0 real 2.5 real 3.0 real 4.5 real 6.0 null {}} +do_catchsql_test strict1-6.2 { + INSERT INTO t1(e) VALUES('xyz'); +} {1 {t1.e holds only REAL values}} +do_catchsql_test strict1-6.3 { + INSERT INTO t1(e) VALUES(x'3456'); +} {1 {t1.e holds only REAL values}} + finish_test From 9e1209d111aab64242aec299b347e60492556761 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 19 Aug 2021 02:58:15 +0000 Subject: [PATCH 013/130] Enhance PRAGMA integrity_check so that it verifies the datatype of all columns in STRICT tables. FossilOrigin-Name: 97c9248b3b81facce569bfa3fb405d44a1d1041e87132e8f649458c95620ccb2 --- manifest | 19 +++--- manifest.uuid | 2 +- src/global.c | 7 +++ src/pragma.c | 41 ++++++++++--- src/sqliteInt.h | 1 + src/vdbe.c | 16 ++++++ test/strict2.test | 143 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 210 insertions(+), 19 deletions(-) create mode 100644 test/strict2.test diff --git a/manifest b/manifest index 8fec01b5ec..961317c00d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C STRICT\stables\srequire\sall\sfields\sof\sthe\sPRIMARY\sKEY\sto\sbe\sNOT\sNULL. -D 2021-08-19T00:24:43.029 +C Enhance\sPRAGMA\sintegrity_check\sso\sthat\sit\sverifies\sthe\sdatatype\sof\nall\scolumns\sin\sSTRICT\stables. +D 2021-08-19T02:58:15.725 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -500,7 +500,7 @@ F src/expr.c e98375fc63552cc8cdd36a41bdca3039cb603d9fe67abd9c9f40adae8405fbc5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c -F src/global.c 5eba017ebbd887e2365e6e6e815e1619e41406b8946d17594e94116174787df5 +F src/global.c 436d4819e48d0272ef1ed72bd5fe44fed06ff5f83f54eebe8c74123771f7ad0b F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -537,7 +537,7 @@ F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c af0f43789545622fd5377d71f6d4c0e7c9b9295a3f5d5b1242e4032d38ca12b5 +F src/pragma.c b6ba4aa11ad3e21a07cfb7be5dad4bdae7e733dd4f91e3f586dfc0ea703c0178 F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b @@ -549,7 +549,7 @@ F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e82634 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 732ef4ade4ea3e95ddc0a6be657c5f9eb1e4b8ede3105395fe0161c15fab9214 +F src/sqliteInt.h a0e00a52b90f236c77fd0c0b839cc091d9926aca7627eb6ad8cf3f55a9847a71 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c 0e70bef8e65fc217beb7909235502ce132d231fb656554205e0c13927b4140d1 +F src/vdbe.c db2033468624757c7560456d0935d7bac6732c626b193ed865da93a4ee6bd3e2 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1426,6 +1426,7 @@ F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 F test/strict1.test dab7a84f5445e696beb3e2eedda9b3a28fb16bf3092be1917b3f1a6163916197 +F test/strict2.test fe1928b3768f51b39774d753ac7e71727718d1c3305eead0e5ea60f75e9e6b4c F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 @@ -1921,7 +1922,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 7ee01ee47da247a80bcf16f88eb187b8c0928024536435ed20797a1a90495511 -R 9431b5ba9e76c466e3043738fddec247 +P 5efdf9acad9d54783f5134b7e9338f44336862d87dc324d315b8d55e44df1923 +R b81ba137d5fbe2c27e5bf73bf8e1c01f U drh -Z 0e5e6ca613f5601fc51663462528d032 +Z cb07934ea9a1c0a07dfc699c730ff260 diff --git a/manifest.uuid b/manifest.uuid index c53f8de72d..7844f9394f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5efdf9acad9d54783f5134b7e9338f44336862d87dc324d315b8d55e44df1923 \ No newline at end of file +97c9248b3b81facce569bfa3fb405d44a1d1041e87132e8f649458c95620ccb2 \ No newline at end of file diff --git a/src/global.c b/src/global.c index a1398fef5d..98793fbd3f 100644 --- a/src/global.c +++ b/src/global.c @@ -360,6 +360,13 @@ const char sqlite3StdTypeAffinity[] = { SQLITE_AFF_REAL, SQLITE_AFF_TEXT }; +const char sqlite3StdTypeMap[] = { + SQLITE_BLOB, + SQLITE_INTEGER, + SQLITE_INTEGER, + SQLITE_FLOAT, + SQLITE_TEXT +}; const char *sqlite3StdType[] = { "BLOB", "INT", diff --git a/src/pragma.c b/src/pragma.c index c931dd2acb..39095d82d7 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1653,6 +1653,7 @@ void sqlite3Pragma( int loopTop; int iDataCur, iIdxCur; int r1 = -1; + int bStrict; if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */ if( pObjTab && pObjTab!=pTab ) continue; @@ -1675,22 +1676,44 @@ void sqlite3Pragma( sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nNVCol-1,3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); } - /* Verify that all NOT NULL columns really are NOT NULL */ + /* Verify that all NOT NULL columns really are NOT NULL. At the + ** same time verify the type of the content of STRICT tables */ + bStrict = (pTab->tabFlags & TF_Strict)!=0; for(j=0; jnCol; j++){ char *zErr; - int jmp2; + Column *pCol = pTab->aCol + j; + int endLabel; if( j==pTab->iPKey ) continue; - if( pTab->aCol[j].notNull==0 ) continue; + if( pCol->notNull==0 && !bStrict ) continue; + endLabel = bStrict ? sqlite3VdbeMakeLabel(pParse) : 0; sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); if( sqlite3VdbeGetOp(v,-1)->opcode==OP_Column ){ sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); } - jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); - zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, - pTab->aCol[j].zCnName); - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); - integrityCheckResultRow(v); - sqlite3VdbeJumpHere(v, jmp2); + if( pCol->notNull ){ + int jmp2; + jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); + zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, + pCol->zCnName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + integrityCheckResultRow(v); + if( bStrict ) sqlite3VdbeGoto(v, endLabel); + sqlite3VdbeJumpHere(v, jmp2); + } + if( pTab->tabFlags & TF_Strict ){ + if( pCol->notNull==0 ){ + sqlite3VdbeAddOp2(v, OP_IsNull, 3, endLabel); VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_IfType, 3, endLabel, + sqlite3StdTypeMap[pCol->eCType-1]); + VdbeCoverage(v); + zErr = sqlite3MPrintf(db, "non-%s value in %s.%s", + sqlite3StdType[pCol->eCType-1], + pTab->zName, pTab->aCol[j].zCnName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + integrityCheckResultRow(v); + sqlite3VdbeResolveLabel(v, endLabel); + } } /* Verify CHECK constraints */ if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0a01179090..348a41393d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4841,6 +4841,7 @@ extern const unsigned char sqlite3OpcodeProperty[]; extern const char sqlite3StrBINARY[]; extern const unsigned char sqlite3StdTypeLen[]; extern const char sqlite3StdTypeAffinity[]; +extern const char sqlite3StdTypeMap[]; extern const char *sqlite3StdType[]; extern const unsigned char sqlite3UpperToLower[]; extern const unsigned char *sqlite3aLTb; diff --git a/src/vdbe.c b/src/vdbe.c index d7def8a79f..01da0a9568 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2534,6 +2534,22 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ break; } +/* Opcode: IfType P1 P2 P3 * * +** Synopsis: if typeof(r[P1])!=P3 goto P2 +** +** Jump to P2 if the value in register has a datatype given by P3. +** P3 is an integer which should be one of SQLITE_INTEGER, SQLITE_FLOAT, +** SQLITE_BLOB, SQLITE_NULL, or SQLITE_TEXT. +*/ +case OP_IfType: { /* jump, in1 */ + int doTheJump; + pIn1 = &aMem[pOp->p1]; + doTheJump = sqlite3_value_type(pIn1)==pOp->p3; + VdbeBranchTaken( doTheJump, 2); + if( doTheJump ) goto jump_to_p2; + break; +} + /* Opcode: IfNullRow P1 P2 P3 * * ** Synopsis: if P1.nullRow then r[P3]=NULL, goto P2 ** diff --git a/test/strict2.test b/test/strict2.test new file mode 100644 index 0000000000..854d1c59fd --- /dev/null +++ b/test/strict2.test @@ -0,0 +1,143 @@ +# 2021-08-19 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file implements regression tests for SQLite library. The +# focus of this file is testing STRICT tables. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix strict2 + +# PRAGMA integrity_check on a STRICT table should verify that +# all of the values are of the correct type. +# +do_execsql_test strict2-1.1 { + CREATE TABLE t1( + a INT, + b INTEGER, + c TEXT, + d REAL, + e BLOB + ) STRICT; + CREATE TABLE t1nn( + a INT NOT NULL, + b INTEGER NOT NULL, + c TEXT NOT NULL, + d REAL NOT NULL, + e BLOB NOT NULL + ) STRICT; + CREATE TABLE t2(a,b,c,d,e); + INSERT INTO t1(a,b,c,d,e) VALUES(1,1,'one',1.0,x'b1'),(2,2,'two',2.25,x'b2b2b2'); + PRAGMA writable_schema=on; + UPDATE sqlite_schema SET rootpage=(SELECT rootpage FROM sqlite_schema WHERE name='t1'); +} {} +db close +sqlite3 db test.db +do_execsql_test strict2-1.2 { + PRAGMA quick_check('t1'); +} {ok} +do_execsql_test strict2-1.3 { + UPDATE t2 SET a=2.5 WHERE b=2; + PRAGMA quick_check('t1'); +} {{non-INT value in t1.a}} +do_execsql_test strict2-1.4 { + UPDATE t2 SET a='xyz' WHERE b=2; + PRAGMA quick_check('t1'); +} {{non-INT value in t1.a}} +do_execsql_test strict2-1.5 { + UPDATE t2 SET a=x'445566' WHERE b=2; + PRAGMA quick_check('t1'); +} {{non-INT value in t1.a}} +do_execsql_test strict2-1.6 { + UPDATE t2 SET a=2.5 WHERE b=2; + PRAGMA quick_check('t1nn'); +} {{non-INT value in t1nn.a}} +do_execsql_test strict2-1.7 { + UPDATE t2 SET a='xyz' WHERE b=2; + PRAGMA quick_check('t1nn'); +} {{non-INT value in t1nn.a}} +do_execsql_test strict2-1.8 { + UPDATE t2 SET a=x'445566' WHERE b=2; + PRAGMA quick_check('t1nn'); +} {{non-INT value in t1nn.a}} + +do_execsql_test strict2-1.13 { + UPDATE t2 SET a=2 WHERE b=2; + UPDATE t2 SET b=2.5 WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-INTEGER value in t1.b}} +do_execsql_test strict2-1.14 { + UPDATE t2 SET b='two' WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-INTEGER value in t1.b}} +do_execsql_test strict2-1.15 { + UPDATE t2 SET b=x'b0b1b2b3b4' WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-INTEGER value in t1.b}} +do_execsql_test strict2-1.16 { + UPDATE t2 SET b=NULL WHERE a=2; + PRAGMA quick_check('t1'); +} {ok} +do_execsql_test strict2-1.17 { + UPDATE t2 SET b=2.5 WHERE a=2; + PRAGMA quick_check('t1nn'); +} {{non-INTEGER value in t1nn.b}} +do_execsql_test strict2-1.18 { + UPDATE t2 SET b=NULL WHERE a=2; + PRAGMA quick_check('t1nn'); +} {{NULL value in t1nn.b}} + +do_execsql_test strict2-1.23 { + UPDATE t2 SET b=2 WHERE a=2; + UPDATE t2 SET c=9 WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-TEXT value in t1.c}} +do_execsql_test strict2-1.24 { + UPDATE t2 SET c=9.5 WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-TEXT value in t1.c}} +do_execsql_test strict2-1.25 { + UPDATE t2 SET c=x'b0b1b2b3b4' WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-TEXT value in t1.c}} + +do_execsql_test strict2-1.33 { + UPDATE t2 SET c='two' WHERE a=2; + UPDATE t2 SET d=9 WHERE a=2; + PRAGMA quick_check('t1'); +} {ok} +do_execsql_test strict2-1.34 { + UPDATE t2 SET d='nine' WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-REAL value in t1.d}} +do_execsql_test strict2-1.35 { + UPDATE t2 SET d=x'b0b1b2b3b4' WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-REAL value in t1.d}} + +do_execsql_test strict2-1.43 { + UPDATE t2 SET d=2.5 WHERE a=2; + UPDATE t2 SET e=9 WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-BLOB value in t1.e}} +do_execsql_test strict2-1.44 { + UPDATE t2 SET e=9.5 WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-BLOB value in t1.e}} +do_execsql_test strict2-1.45 { + UPDATE t2 SET e='hello' WHERE a=2; + PRAGMA quick_check('t1'); +} {{non-BLOB value in t1.e}} + + + +finish_test From 71c770fbda6683780c314ad5ebfa3be3c0c2c718 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 19 Aug 2021 16:29:33 +0000 Subject: [PATCH 014/130] Improved comments. Fewer opcodes for integrity_check on strict tables. FossilOrigin-Name: 4ee57fb588b41ab76649c605f57c7bcf5b7b638435af458d69f69a8ccbb121e8 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/build.c | 12 +++++++++--- src/global.c | 12 ++++++++++++ src/insert.c | 44 ++++++++++++++++++++++++++++++++++---------- src/pragma.c | 21 +++++++++++---------- src/vdbe.c | 43 +++++++++++++++++++++++++++---------------- 7 files changed, 104 insertions(+), 50 deletions(-) diff --git a/manifest b/manifest index 961317c00d..faa664cdb0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sPRAGMA\sintegrity_check\sso\sthat\sit\sverifies\sthe\sdatatype\sof\nall\scolumns\sin\sSTRICT\stables. -D 2021-08-19T02:58:15.725 +C Improved\scomments.\s\sFewer\sopcodes\sfor\sintegrity_check\son\sstrict\stables. +D 2021-08-19T16:29:33.914 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c c55bec6a37b3b521c10ac6ae2f73328e3a49c12a1b8c87ca151d81c5e1095142 +F src/build.c 4f58fcdf5b8a7f273edd2fb07a8b7afa91f34cea4396d9b5fc438cbfe1c6b87e F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -500,12 +500,12 @@ F src/expr.c e98375fc63552cc8cdd36a41bdca3039cb603d9fe67abd9c9f40adae8405fbc5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c -F src/global.c 436d4819e48d0272ef1ed72bd5fe44fed06ff5f83f54eebe8c74123771f7ad0b +F src/global.c 24ba3b3e88dd2a70389388c3bc46fd55a44bfae3c44f76dad1ca00556f1c769a 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 dbf6ed6c070661691a50ec135bff47700a01c71ce9987819860c3a992dda8b95 +F src/insert.c d2a3f90a4bdfb98c8f1dc30b6449e400acec689d731ec408324466342302232b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c aab8cefb6bfbdbecc53fd19058fa053c0c5e591b2e5067d883ef999d019dcd29 @@ -537,7 +537,7 @@ F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c b6ba4aa11ad3e21a07cfb7be5dad4bdae7e733dd4f91e3f586dfc0ea703c0178 +F src/pragma.c c482a8d529d91e48ebdd5aa3bbbc15edd7f1cd4f4858613be9146866741ad2b8 F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b @@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c db2033468624757c7560456d0935d7bac6732c626b193ed865da93a4ee6bd3e2 +F src/vdbe.c d2e395271e57203b1b929bfaa8ea8d8305fcf12c1d251954adee9bd492272060 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1922,7 +1922,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 5efdf9acad9d54783f5134b7e9338f44336862d87dc324d315b8d55e44df1923 -R b81ba137d5fbe2c27e5bf73bf8e1c01f +P 97c9248b3b81facce569bfa3fb405d44a1d1041e87132e8f649458c95620ccb2 +R f9caa21161816acea3d561e69ac639dc U drh -Z cb07934ea9a1c0a07dfc699c730ff260 +Z 247f6cbc04db0661f0c32539094ce344 diff --git a/manifest.uuid b/manifest.uuid index 7844f9394f..9e6477632c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97c9248b3b81facce569bfa3fb405d44a1d1041e87132e8f649458c95620ccb2 \ No newline at end of file +4ee57fb588b41ab76649c605f57c7bcf5b7b638435af458d69f69a8ccbb121e8 \ No newline at end of file diff --git a/src/build.c b/src/build.c index bf9746de04..783b9b7ec5 100644 --- a/src/build.c +++ b/src/build.c @@ -2592,7 +2592,15 @@ void sqlite3EndTable( if( p->tnum==1 ) p->tabFlags |= TF_Readonly; } - /* Do not allow COLTYPE_CUSTOM in STRICT mode */ + /* Special processing for tables that include the STRICT keyword: + ** + ** * Do not allow custom column datatypes. Every column must have + ** a datatype that is one of INT, INTEGER, REAL, TEXT, or BLOB. + ** + ** * If a PRIMARY KEY is defined, other than the INTEGER PRIMARY KEY, + ** then all columns of the PRIMARY KEY must have a NOT NULL + ** constraint. + */ if( tabOpts & TF_Strict ){ int ii; p->tabFlags |= TF_Strict; @@ -2609,8 +2617,6 @@ void sqlite3EndTable( && p->iPKey!=ii && pCol->notNull == OE_None ){ - /* Primary key columns other than the IPK may not be NULL - ** in strict mode */ pCol->notNull = OE_Abort; p->tabFlags |= TF_HasNotNull; } diff --git a/src/global.c b/src/global.c index 98793fbd3f..091310c934 100644 --- a/src/global.c +++ b/src/global.c @@ -351,6 +351,18 @@ const char sqlite3StrBINARY[] = "BINARY"; /* ** Standard typenames. These names must match the COLTYPE_* definitions. ** Adjust the SQLITE_N_STDTYPE value if adding or removing entries. +** +** sqlite3StdType[] The actual names of the datatypes. +** +** sqlite3StdTypeLen[] The length (in bytes) of each entry +** in sqlite3StdType[]. +** +** sqlite3StdTypeAffinity[] The affinity associated with each entry +** in sqlite3StdType[]. +** +** sqlite3StdTypeMap[] The type value (as returned from +** sqlite3_column_type() or sqlite3_value_type()) +** for each entry in sqlite3StdType[]. */ const unsigned char sqlite3StdTypeLen[] = { 4, 3, 7, 4, 4 }; const char sqlite3StdTypeAffinity[] = { diff --git a/src/insert.c b/src/insert.c index 1148257ad2..9617e54e7c 100644 --- a/src/insert.c +++ b/src/insert.c @@ -110,24 +110,44 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ } /* +** Make changes to the evolving bytecode to do affinity transformations +** of values that are about to be gathered into a row for table pTab. +** +** For ordinary (legacy, non-strict) tables: +** ----------------------------------------- +** ** Compute the affinity string for table pTab, if it has not already been ** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. ** -** If the affinity exists (if it is not entirely SQLITE_AFF_BLOB values) and -** if iReg>0 then code an OP_Affinity opcode that will set the affinities -** for register iReg and following. Or if affinities exists and iReg==0, +** If the affinity string is empty (because it was all SQLITE_AFF_BLOB entries +** which were then optimized out) then this routine becomes a no-op. +** +** Otherwise if iReg>0 then code an OP_Affinity opcode that will set the +** affinities for register iReg and following. Or if iReg==0, ** then just set the P4 operand of the previous opcode (which should be ** an OP_MakeRecord) to the affinity string. ** ** A column affinity string has one character per column: ** -** Character Column affinity -** ------------------------------ -** 'A' BLOB -** 'B' TEXT -** 'C' NUMERIC -** 'D' INTEGER -** 'E' REAL +** Character Column affinity +** --------- --------------- +** 'A' BLOB +** 'B' TEXT +** 'C' NUMERIC +** 'D' INTEGER +** 'E' REAL +** +** For STRICT tables: +** ------------------ +** +** Generate an appropropriate OP_TypeCheck opcode that will verify the +** datatypes against the column definitions in pTab. If iReg==0, that +** means an OP_MakeRecord opcode has already been generated and should be +** the last opcode generated. The new OP_TypeCheck needs to be inserted +** before the OP_MakeRecord. The new OP_TypeCheck should use the same +** register set as the OP_MakeRecord. If iReg>0 then register iReg is +** the first of a series of registers that will form the new record. +** Apply the type checking to that array of registers. */ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ int i, j; @@ -140,6 +160,8 @@ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ VdbeOp *pPrev; sqlite3VdbeAppendP4(v, pTab, P4_TABLE); pPrev = sqlite3VdbeGetOp(v, -1); + assert( pPrev!=0 ); + assert( pPrev->opcode==OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed ); pPrev->opcode = OP_TypeCheck; sqlite3VdbeAddOp3(v, OP_MakeRecord, pPrev->p1, pPrev->p2, pPrev->p3); }else{ @@ -175,6 +197,8 @@ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ if( iReg ){ sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); }else{ + assert( sqlite3VdbeGetOp(v, -1)->opcode==OP_MakeRecord + || sqlite3VdbeDb(v)->mallocFailed ); sqlite3VdbeChangeP4(v, -1, zColAff, i); } } diff --git a/src/pragma.c b/src/pragma.c index 39095d82d7..dd1aaf9784 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1675,6 +1675,7 @@ void sqlite3Pragma( /* Sanity check on record header decoding */ sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nNVCol-1,3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + VdbeComment((v, "(right-most column)")); } /* Verify that all NOT NULL columns really are NOT NULL. At the ** same time verify the type of the content of STRICT tables */ @@ -1682,37 +1683,37 @@ void sqlite3Pragma( for(j=0; jnCol; j++){ char *zErr; Column *pCol = pTab->aCol + j; - int endLabel; + int doError, jmp2; if( j==pTab->iPKey ) continue; if( pCol->notNull==0 && !bStrict ) continue; - endLabel = bStrict ? sqlite3VdbeMakeLabel(pParse) : 0; + doError = bStrict ? sqlite3VdbeMakeLabel(pParse) : 0; sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); if( sqlite3VdbeGetOp(v,-1)->opcode==OP_Column ){ sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); } if( pCol->notNull ){ - int jmp2; jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, pCol->zCnName); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); - integrityCheckResultRow(v); - if( bStrict ) sqlite3VdbeGoto(v, endLabel); + if( bStrict ){ + sqlite3VdbeGoto(v, doError); + }else{ + integrityCheckResultRow(v); + } sqlite3VdbeJumpHere(v, jmp2); } if( pTab->tabFlags & TF_Strict ){ - if( pCol->notNull==0 ){ - sqlite3VdbeAddOp2(v, OP_IsNull, 3, endLabel); VdbeCoverage(v); - } - sqlite3VdbeAddOp3(v, OP_IfType, 3, endLabel, + jmp2 = sqlite3VdbeAddOp3(v, OP_IsNullOrType, 3, 0, sqlite3StdTypeMap[pCol->eCType-1]); VdbeCoverage(v); zErr = sqlite3MPrintf(db, "non-%s value in %s.%s", sqlite3StdType[pCol->eCType-1], pTab->zName, pTab->aCol[j].zCnName); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + sqlite3VdbeResolveLabel(v, doError); integrityCheckResultRow(v); - sqlite3VdbeResolveLabel(v, endLabel); + sqlite3VdbeJumpHere(v, jmp2); } } /* Verify CHECK constraints */ diff --git a/src/vdbe.c b/src/vdbe.c index 01da0a9568..690687a059 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2502,6 +2502,22 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ break; } +/* Opcode: IsNullOrType P1 P2 P3 * * +** Synopsis: if typeof(r[P1]) IN (P3,5) goto P2 +** +** Jump to P2 if the value in register P1 is NULL or has a datatype P3. +** P3 is an integer which should be one of SQLITE_INTEGER, SQLITE_FLOAT, +** SQLITE_BLOB, SQLITE_NULL, or SQLITE_TEXT. +*/ +case OP_IsNullOrType: { /* jump, in1 */ + int doTheJump; + pIn1 = &aMem[pOp->p1]; + doTheJump = (pIn1->flags & MEM_Null)!=0 || sqlite3_value_type(pIn1)==pOp->p3; + VdbeBranchTaken( doTheJump, 2); + if( doTheJump ) goto jump_to_p2; + break; +} + /* Opcode: ZeroOrNull P1 P2 P3 * * ** Synopsis: r[P2] = 0 OR NULL ** @@ -2534,22 +2550,6 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ break; } -/* Opcode: IfType P1 P2 P3 * * -** Synopsis: if typeof(r[P1])!=P3 goto P2 -** -** Jump to P2 if the value in register has a datatype given by P3. -** P3 is an integer which should be one of SQLITE_INTEGER, SQLITE_FLOAT, -** SQLITE_BLOB, SQLITE_NULL, or SQLITE_TEXT. -*/ -case OP_IfType: { /* jump, in1 */ - int doTheJump; - pIn1 = &aMem[pOp->p1]; - doTheJump = sqlite3_value_type(pIn1)==pOp->p3; - VdbeBranchTaken( doTheJump, 2); - if( doTheJump ) goto jump_to_p2; - break; -} - /* Opcode: IfNullRow P1 P2 P3 * * ** Synopsis: if P1.nullRow then r[P3]=NULL, goto P2 ** @@ -2896,6 +2896,16 @@ op_column_corrupt: ** This opcode is similar to OP_Affinity except that this opcode ** forces the register type to the Table column type. This is used ** to implement "strict affinity". +** +** Preconditions: +** +**
    +**
  • P2 should be the number of non-virtual columns in the +** table of P4. +**
  • Table P4 should be a STRICT table. +**
+** +** If any precondition is false, an assertion fault occurs. */ case OP_TypeCheck: { Table *pTab; @@ -2905,6 +2915,7 @@ case OP_TypeCheck: { assert( pOp->p4type==P4_TABLE ); pTab = pOp->p4.pTab; assert( pTab->tabFlags & TF_Strict ); + assert( pTab->nNVCol==pOp->p2 ); aCol = pTab->aCol; pIn1 = &aMem[pOp->p1]; for(i=0; inCol; i++){ From 7b4b74acc7301ca60dd052cdb5bee63414354fb1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 20 Aug 2021 01:12:39 +0000 Subject: [PATCH 015/130] Do not allow the xfer-optimization to move the content of an ordinary table into a strict table. FossilOrigin-Name: 1ed1b594d3c03ced68eb2b1285dfd8b9641cda20db1b1b7ae1afee217a3a9fe2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index faa664cdb0..93d912786e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomments.\s\sFewer\sopcodes\sfor\sintegrity_check\son\sstrict\stables. -D 2021-08-19T16:29:33.914 +C Do\snot\sallow\sthe\sxfer-optimization\sto\smove\sthe\scontent\sof\san\sordinary\ntable\sinto\sa\sstrict\stable. +D 2021-08-20T01:12:39.171 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -505,7 +505,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 d2a3f90a4bdfb98c8f1dc30b6449e400acec689d731ec408324466342302232b +F src/insert.c 16fa4b66709db6db5bb31475f2321d0a839269765aa2461a520c151c385e8b9d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c aab8cefb6bfbdbecc53fd19058fa053c0c5e591b2e5067d883ef999d019dcd29 @@ -1922,7 +1922,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 97c9248b3b81facce569bfa3fb405d44a1d1041e87132e8f649458c95620ccb2 -R f9caa21161816acea3d561e69ac639dc +P 4ee57fb588b41ab76649c605f57c7bcf5b7b638435af458d69f69a8ccbb121e8 +R 7461fae7c9e91c53b266760ec73eefb6 U drh -Z 247f6cbc04db0661f0c32539094ce344 +Z f75e39c2709cda22cb0c40b7515a051c diff --git a/manifest.uuid b/manifest.uuid index 9e6477632c..8e02472d31 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4ee57fb588b41ab76649c605f57c7bcf5b7b638435af458d69f69a8ccbb121e8 \ No newline at end of file +1ed1b594d3c03ced68eb2b1285dfd8b9641cda20db1b1b7ae1afee217a3a9fe2 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 9617e54e7c..acaafa0239 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2837,6 +2837,9 @@ static int xferOptimization( if( pDest->iPKey!=pSrc->iPKey ){ return 0; /* Both tables must have the same INTEGER PRIMARY KEY */ } + if( (pDest->tabFlags & TF_Strict)!=0 && (pSrc->tabFlags & TF_Strict)==0 ){ + return 0; /* Cannot feed from a non-strict into a strict table */ + } for(i=0; inCol; i++){ Column *pDestCol = &pDest->aCol[i]; Column *pSrcCol = &pSrc->aCol[i]; From faf9c77b4bdf396dca0e930aa553e5a9b76d19e3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 20 Aug 2021 08:05:42 +0000 Subject: [PATCH 016/130] Improved error messages for the SQLITE_CONSTRAINT_DATATYPE error. FossilOrigin-Name: 39abca01479c0f4f747b7b21fa05181896b00ed7559f0ab74aa575c23097ac21 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 18 ++++++++++++++++-- test/strict1.test | 26 +++++++++++++------------- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 93d912786e..d44d5b10d6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\sthe\sxfer-optimization\sto\smove\sthe\scontent\sof\san\sordinary\ntable\sinto\sa\sstrict\stable. -D 2021-08-20T01:12:39.171 +C Improved\serror\smessages\sfor\sthe\sSQLITE_CONSTRAINT_DATATYPE\serror. +D 2021-08-20T08:05:42.509 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c d2e395271e57203b1b929bfaa8ea8d8305fcf12c1d251954adee9bd492272060 +F src/vdbe.c bf2d58ee9d12767e3aca7c29fe8c10eeea1844d5b16865d280743aee54d8c86d F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1425,7 +1425,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test dab7a84f5445e696beb3e2eedda9b3a28fb16bf3092be1917b3f1a6163916197 +F test/strict1.test 314971e166395f8d736d9ecd25c75565e6aac103f9346018c1f78df602e6e2d0 F test/strict2.test fe1928b3768f51b39774d753ac7e71727718d1c3305eead0e5ea60f75e9e6b4c F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f @@ -1922,7 +1922,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 4ee57fb588b41ab76649c605f57c7bcf5b7b638435af458d69f69a8ccbb121e8 -R 7461fae7c9e91c53b266760ec73eefb6 +P 1ed1b594d3c03ced68eb2b1285dfd8b9641cda20db1b1b7ae1afee217a3a9fe2 +R 1becdbd72e9bc3a6d98c91082fba4b52 U drh -Z f75e39c2709cda22cb0c40b7515a051c +Z c26092e6de7efa8875b0da24f3b94164 diff --git a/manifest.uuid b/manifest.uuid index 8e02472d31..3cd58a8639 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ed1b594d3c03ced68eb2b1285dfd8b9641cda20db1b1b7ae1afee217a3a9fe2 \ No newline at end of file +39abca01479c0f4f747b7b21fa05181896b00ed7559f0ab74aa575c23097ac21 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 690687a059..b8ff3b5fac 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -671,6 +671,19 @@ static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ } } +/* +** Return the symbolic name for the data type of a pMem +*/ +static const char *vdbeMemTypeName(Mem *pMem){ + static const char *azTypes[] = { + /* SQLITE_INTEGER */ "INT", + /* SQLITE_FLOAT */ "REAL", + /* SQLITE_TEXT */ "TEXT", + /* SQLITE_BLOB */ "BLOB", + /* SQLITE_NULL */ "NULL" + }; + return azTypes[sqlite3_value_type(pMem)-1]; +} /* ** Execute as much of a VDBE program as we can. @@ -2970,8 +2983,9 @@ case OP_TypeCheck: { break; vdbe_type_error: - sqlite3VdbeError(p, "%s.%s holds only %s values", - pTab->zName, aCol[i].zCnName, sqlite3StdType[aCol[i].eCType-1]); + sqlite3VdbeError(p, "cannot store %s value in %s column %s.%s", + vdbeMemTypeName(pIn1), sqlite3StdType[aCol[i].eCType-1], + pTab->zName, aCol[i].zCnName); rc = SQLITE_CONSTRAINT_DATATYPE; goto abort_due_to_error; } diff --git a/test/strict1.test b/test/strict1.test index fcd908b854..23f38ad2fa 100644 --- a/test/strict1.test +++ b/test/strict1.test @@ -49,19 +49,19 @@ do_execsql_test strict1-2.0 { } {} do_catchsql_test strict1-2.1 { INSERT INTO t1(a) VALUES('xyz'); -} {1 {t1.a holds only INT values}} +} {1 {cannot store TEXT value in INT column t1.a}} do_catchsql_test strict1-2.2 { INSERT INTO t1(b) VALUES('xyz'); -} {1 {t1.b holds only INTEGER values}} +} {1 {cannot store TEXT value in INTEGER column t1.b}} do_catchsql_test strict1-2.3 { INSERT INTO t1(c) VALUES('xyz'); -} {1 {t1.c holds only BLOB values}} +} {1 {cannot store TEXT value in BLOB column t1.c}} do_catchsql_test strict1-2.4 { INSERT INTO t1(d) VALUES(x'3142536475'); -} {1 {t1.d holds only TEXT values}} +} {1 {cannot store BLOB value in TEXT column t1.d}} do_catchsql_test strict1-2.5 { INSERT INTO t1(e) VALUES('xyz'); -} {1 {t1.e holds only REAL values}} +} {1 {cannot store TEXT value in REAL column t1.e}} do_execsql_test strict1-3.1 { INSERT INTO t1(a, b) VALUES(1,2),('3','4'),(5.0, 6.0),(null,null); @@ -69,16 +69,16 @@ do_execsql_test strict1-3.1 { } {1 2 | 3 4 | 5 6 | {} {} |} do_catchsql_test strict1-3.2 { INSERT INTO t1(a) VALUES(1.2); -} {1 {t1.a holds only INT values}} +} {1 {cannot store REAL value in INT column t1.a}} do_catchsql_test strict1-3.3 { INSERT INTO t1(a) VALUES(x'313233'); -} {1 {t1.a holds only INT values}} +} {1 {cannot store BLOB value in INT column t1.a}} do_catchsql_test strict1-3.4 { INSERT INTO t1(b) VALUES(1.2); -} {1 {t1.b holds only INTEGER values}} +} {1 {cannot store REAL value in INTEGER column t1.b}} do_catchsql_test strict1-3.5 { INSERT INTO t1(b) VALUES(x'313233'); -} {1 {t1.b holds only INTEGER values}} +} {1 {cannot store BLOB value in INTEGER column t1.b}} do_execsql_test strict1-4.1 { DELETE FROM t1; @@ -87,7 +87,7 @@ do_execsql_test strict1-4.1 { } {blob 123 null {}} do_catchsql_test strict1-4.2 { INSERT INTO t1(c) VALUES('456'); -} {1 {t1.c holds only BLOB values}} +} {1 {cannot store TEXT value in BLOB column t1.c}} do_execsql_test strict1-5.1 { DELETE FROM t1; @@ -96,7 +96,7 @@ do_execsql_test strict1-5.1 { } {text xyz text 4 text 5.5 null {}} do_catchsql_test strict1-5.2 { INSERT INTO t1(d) VALUES(x'4567'); -} {1 {t1.d holds only TEXT values}} +} {1 {cannot store BLOB value in TEXT column t1.d}} do_execsql_test strict1-6.1 { DELETE FROM t1; @@ -105,9 +105,9 @@ do_execsql_test strict1-6.1 { } {real 1.0 real 2.5 real 3.0 real 4.5 real 6.0 null {}} do_catchsql_test strict1-6.2 { INSERT INTO t1(e) VALUES('xyz'); -} {1 {t1.e holds only REAL values}} +} {1 {cannot store TEXT value in REAL column t1.e}} do_catchsql_test strict1-6.3 { INSERT INTO t1(e) VALUES(x'3456'); -} {1 {t1.e holds only REAL values}} +} {1 {cannot store BLOB value in REAL column t1.e}} finish_test From 8eaf6c620e36c718a6579028f1e7f724228ecb40 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 20 Aug 2021 19:51:22 +0000 Subject: [PATCH 017/130] Improvement to error handling in Lemon. No impact on SQLite. [forum:/forumpost/2f468f43cbc48d7f|Forum post 2f468f43cbc48d7f] FossilOrigin-Name: 18cc2f85744a18b6810d30baebe07a7a1bd332348e13b1a50d779edc616fb0c1 --- manifest | 13 ++++++------- manifest.uuid | 2 +- tool/lempar.c | 13 ++++++++----- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index f20da31d29..bf9d83baac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Support\sfor\sSTRICT\stables.\s\sA\stable\swith\sthe\sSTRICT\soption\sonly\sallows\sa\sfew\ncore\sdatatypes\son\scolumns\sand\senforces\sthose\stypes\srigidly.\s\sAlso,\sPRIMARY\sKEY\ncolumns\smust\sbe\sNOT\sNULL. -D 2021-08-20T15:44:48.339 +C Improvement\sto\serror\shandling\sin\sLemon.\s\sNo\simpact\son\sSQLite.\n[forum:/forumpost/2f468f43cbc48d7f|Forum\spost\s2f468f43cbc48d7f] +D 2021-08-20T19:51:22.252 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1841,7 +1841,7 @@ F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c f62a0c701b2c7ff2f3e21d206f093c123f222dbf07136a10ffd1ca15a5c706c5 F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c a5acddd3eec6a388872aae6efc7563336348a9c45e5563642f77e8e3a50e859d -F tool/lempar.c bbabd74a36513a4376a6b26a35804b11adae6f335d47aab29cc3bbaaa85fa4d5 +F tool/lempar.c 757e4ec699b99e0b7e78ffd8ec2063d9fa198b9102d2009dbe08369dc5775dcb F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1922,8 +1922,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 13abba0941a724eb62455650976b03678e4455b6b3090c84a2ab2f4a7656b4d8 39abca01479c0f4f747b7b21fa05181896b00ed7559f0ab74aa575c23097ac21 -R 1becdbd72e9bc3a6d98c91082fba4b52 -T +closed 39abca01479c0f4f747b7b21fa05181896b00ed7559f0ab74aa575c23097ac21 +P f9c1d3441b87ee296542faa724410d16a348143cba24fe74292eefc48e038a55 +R 3829f57b5af884ac6a3eac174eaf41b9 U drh -Z 79dbee5e99fe8860b2834d21eb986cdc +Z 207405ca15399b499fa1775f00fc4a3a diff --git a/manifest.uuid b/manifest.uuid index 1c37aec781..15165e4bdb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f9c1d3441b87ee296542faa724410d16a348143cba24fe74292eefc48e038a55 \ No newline at end of file +18cc2f85744a18b6810d30baebe07a7a1bd332348e13b1a50d779edc616fb0c1 \ No newline at end of file diff --git a/tool/lempar.c b/tool/lempar.c index cf61553a15..bbb0cc367d 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -981,11 +981,14 @@ void Parse( yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); yymajor = YYNOCODE; }else{ - while( yypParser->yytos > yypParser->yystack - && (yyact = yy_find_reduce_action( - yypParser->yytos->stateno, - YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE - ){ + while( yypParser->yytos > yypParser->yystack ){ + yyact = yy_find_reduce_action(yypParser->yytos->stateno, + YYERRORSYMBOL); + if( yyact<=YY_MAX_SHIFTREDUCE ) break; + if( yyact>=YY_MIN_REDUCE && yyRuleInfoNRhs[yyact-YY_MIN_REDUCE] ){ + yyact -= YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; + break; + } yy_pop_parser_stack(yypParser); } if( yypParser->yytos <= yypParser->yystack || yymajor==0 ){ From ce68b6bfeb8325eb805f039a259d88c3d113c6e6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 21 Aug 2021 16:42:58 +0000 Subject: [PATCH 018/130] Defer deleting subqueries in the compound-SELECT code generator until the end of code generation, in order to avoid deleting expressions out from under the aggregation function sanity checking assert()s that occur near the end of SELECT code generation. This fixes the assertion fault described by [forum:/forumpost/cfcb4b461d|forum post cfcb4b461d]. FossilOrigin-Name: 600f1991e5c0a5d89cd8776a157b6fd72c7489791085876925e8dd7ab146fe1f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 6 +++++- test/minmax.test | 12 +++++++++++- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index bf9d83baac..ca1f99de26 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvement\sto\serror\shandling\sin\sLemon.\s\sNo\simpact\son\sSQLite.\n[forum:/forumpost/2f468f43cbc48d7f|Forum\spost\s2f468f43cbc48d7f] -D 2021-08-20T19:51:22.252 +C Defer\sdeleting\ssubqueries\sin\sthe\scompound-SELECT\scode\sgenerator\suntil\sthe\nend\sof\scode\sgeneration,\sin\sorder\sto\savoid\sdeleting\sexpressions\sout\sfrom\sunder\nthe\saggregation\sfunction\ssanity\schecking\sassert()s\sthat\soccur\snear\sthe\nend\sof\sSELECT\scode\sgeneration.\s\sThis\sfixes\sthe\sassertion\sfault\sdescribed\sby\n[forum:/forumpost/cfcb4b461d|forum\spost\scfcb4b461d]. +D 2021-08-21T16:42:58.444 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 0577308f097363b6ebac223e210418810acf74e677f580597f7d0718476fe3ef +F src/select.c cf72265a344201647348fd15ce943185bf634287787030c1ddcf07306516e8b8 F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1196,7 +1196,7 @@ F test/memjournal.test 70f3a00c7f84ee2978ad14e831231caa1e7f23915a2c54b4f775a021d F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 -F test/minmax.test 0015e5cd5e7af48bb3364f26d9f3a9cdbea2a442d4774281c39e2229591b7351 +F test/minmax.test fe638b55d77d2375531a8f549b338eafcd9adfbd2f72df37ed77d9b26ca0a71a F test/minmax2.test cf9311babb6f0518d04e42fd6a42c619531c4309a9dd790a2c4e9b3bc595e0de F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 @@ -1922,7 +1922,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 f9c1d3441b87ee296542faa724410d16a348143cba24fe74292eefc48e038a55 -R 3829f57b5af884ac6a3eac174eaf41b9 +P 18cc2f85744a18b6810d30baebe07a7a1bd332348e13b1a50d779edc616fb0c1 +R 863979ca99363723562a0c75fdd1d6ba U drh -Z 207405ca15399b499fa1775f00fc4a3a +Z 648d8b4016ae6c490e2d3154fbaf6a59 diff --git a/manifest.uuid b/manifest.uuid index 15165e4bdb..a9e1470ed8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -18cc2f85744a18b6810d30baebe07a7a1bd332348e13b1a50d779edc616fb0c1 \ No newline at end of file +600f1991e5c0a5d89cd8776a157b6fd72c7489791085876925e8dd7ab146fe1f \ No newline at end of file diff --git a/src/select.c b/src/select.c index 8ad177f54f..1045c8f1db 100644 --- a/src/select.c +++ b/src/select.c @@ -3015,7 +3015,11 @@ static int multiSelect( multi_select_end: pDest->iSdst = dest.iSdst; pDest->nSdst = dest.nSdst; - sqlite3SelectDelete(db, pDelete); + if( pDelete ){ + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3SelectDelete, + pDelete); + } return rc; } #endif /* SQLITE_OMIT_COMPOUND_SELECT */ diff --git a/test/minmax.test b/test/minmax.test index 295fac4e93..81bd46dbe2 100644 --- a/test/minmax.test +++ b/test/minmax.test @@ -646,6 +646,16 @@ do_execsql_test 14.2 { SELECT min(a) FROM t14 WHERE b='2' AND a>'50'; } {100} - +# 2021-08-21. https://sqlite.org/forum/forumpost/cfcb4b461d +# +reset_db +do_execsql_test 15.1 { + CREATE TABLE t1(a); + CREATE TABLE t2(b); + CREATE TABLE t3(c); + INSERT INTO t1 VALUES(0); + INSERT INTO t2 VALUES(5); + SELECT MIN((SELECT b FROM t2 UNION SELECT x FROM (SELECT x FROM (SELECT 1 AS x WHERE t1.a=1) UNION ALL SELECT c FROM t3))) FROM t1; +} {5} finish_test From 2a0eefd66536fea7ac7f57d67ce97aa0b1da7338 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 21 Aug 2021 20:54:19 +0000 Subject: [PATCH 019/130] Allow typeless columns in STRICT tables that are able to accept any data type. FossilOrigin-Name: 1e2dcc2d4ee88c0aed40d1472b1c7d43fd43822891729ad6a2c55d5b912e7ad7 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 2 +- src/vdbe.c | 7 +++++-- test/strict1.test | 12 ++++++------ 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index ca1f99de26..1f41b59dd0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Defer\sdeleting\ssubqueries\sin\sthe\scompound-SELECT\scode\sgenerator\suntil\sthe\nend\sof\scode\sgeneration,\sin\sorder\sto\savoid\sdeleting\sexpressions\sout\sfrom\sunder\nthe\saggregation\sfunction\ssanity\schecking\sassert()s\sthat\soccur\snear\sthe\nend\sof\sSELECT\scode\sgeneration.\s\sThis\sfixes\sthe\sassertion\sfault\sdescribed\sby\n[forum:/forumpost/cfcb4b461d|forum\spost\scfcb4b461d]. -D 2021-08-21T16:42:58.444 +C Allow\stypeless\scolumns\sin\sSTRICT\stables\sthat\sare\sable\sto\saccept\sany\ndata\stype. +D 2021-08-21T20:54:19.283 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 4f58fcdf5b8a7f273edd2fb07a8b7afa91f34cea4396d9b5fc438cbfe1c6b87e +F src/build.c f9246c633829153bb6d41f03eeb5a121a6e618b48e20a5e9c18927c381df072d F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c bf2d58ee9d12767e3aca7c29fe8c10eeea1844d5b16865d280743aee54d8c86d +F src/vdbe.c b228d775c269c4f44284ca9f855329f7cb429159d0f79e54408e4506c932b712 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1425,7 +1425,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test 314971e166395f8d736d9ecd25c75565e6aac103f9346018c1f78df602e6e2d0 +F test/strict1.test c5848830ebbf96b5126c41b16974d76110a50f8877dec42e222527cd292c47f5 F test/strict2.test fe1928b3768f51b39774d753ac7e71727718d1c3305eead0e5ea60f75e9e6b4c F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f @@ -1922,7 +1922,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 18cc2f85744a18b6810d30baebe07a7a1bd332348e13b1a50d779edc616fb0c1 -R 863979ca99363723562a0c75fdd1d6ba +P 600f1991e5c0a5d89cd8776a157b6fd72c7489791085876925e8dd7ab146fe1f +R 1fec1fd4fd154dec8605720039e4eeb3 U drh -Z 648d8b4016ae6c490e2d3154fbaf6a59 +Z 8c2a8dfd9ff7ca38c0c83e9da4b64c4b diff --git a/manifest.uuid b/manifest.uuid index a9e1470ed8..472ade95b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -600f1991e5c0a5d89cd8776a157b6fd72c7489791085876925e8dd7ab146fe1f \ No newline at end of file +1e2dcc2d4ee88c0aed40d1472b1c7d43fd43822891729ad6a2c55d5b912e7ad7 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 783b9b7ec5..b80eef8dc8 100644 --- a/src/build.c +++ b/src/build.c @@ -2606,7 +2606,7 @@ void sqlite3EndTable( p->tabFlags |= TF_Strict; for(ii=0; iinCol; ii++){ Column *pCol = &p->aCol[ii]; - if( pCol->eCType==COLTYPE_CUSTOM ){ + if( pCol->eCType==COLTYPE_CUSTOM && pCol->colFlags & COLFLAG_HASTYPE ){ sqlite3ErrorMsg(pParse, "unknown datatype for %s.%s: \"%s\"", p->zName, pCol->zCnName, sqlite3ColumnType(pCol, "") diff --git a/src/vdbe.c b/src/vdbe.c index b8ff3b5fac..92d9041357 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2950,8 +2950,7 @@ case OP_TypeCheck: { if( (pIn1->flags & MEM_Str)==0 ) goto vdbe_type_error; break; } - default: { - assert( aCol[i].eCType==COLTYPE_REAL ); + case COLTYPE_REAL: { if( pIn1->flags & MEM_Int ){ /* When applying REAL affinity, if the result is still an MEM_Int ** that will fit in 6 bytes, then change the type to MEM_IntReal @@ -2974,6 +2973,10 @@ case OP_TypeCheck: { } break; } + default: { + /* anything goes */ + break; + } } } REGISTER_TRACE((int)(pIn1-aMem), pIn1); diff --git a/test/strict1.test b/test/strict1.test index 23f38ad2fa..819c7e5c6f 100644 --- a/test/strict1.test +++ b/test/strict1.test @@ -20,14 +20,14 @@ set testprefix strict1 # STRICT tables have on a limited number of allowed datatypes. # do_catchsql_test strict1-1.1 { - CREATE TABLE t1(a) STRICT; -} {1 {unknown datatype for t1.a: ""}} + CREATE TABLE t1ok0(a) STRICT; +} {0 {}} do_catchsql_test strict1-1.2 { - CREATE TABLE t1(a PRIMARY KEY) STRICT, WITHOUT ROWID; -} {1 {unknown datatype for t1.a: ""}} + CREATE TABLE t1ok1(a PRIMARY KEY) STRICT, WITHOUT ROWID; +} {0 {}} do_catchsql_test strict1-1.3 { - CREATE TABLE t1(a PRIMARY KEY) WITHOUT ROWID, STRICT; -} {1 {unknown datatype for t1.a: ""}} + CREATE TABLE t1ok2(a PRIMARY KEY) WITHOUT ROWID, STRICT; +} {0 {}} do_catchsql_test strict1-1.4 { CREATE TABLE t1(a BANJO PRIMARY KEY) WITHOUT ROWID, STRICT; } {1 {unknown datatype for t1.a: "BANJO"}} From b9fd0101bd350b5256a72bf3567fd9ad2e60c4b3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 23 Aug 2021 10:28:02 +0000 Subject: [PATCH 020/130] Back out the change that allows typeless columns in strict tables. Replace that capability with an ANY type for strict tables that will accept any datatype with BLOB affinity. FossilOrigin-Name: d8fd1a2bfd51848ea612142d23475b268b3f5269e558f2e09713d1ac18b18274 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/build.c | 17 ++++++++++++----- src/global.c | 5 ++++- src/sqliteInt.h | 13 +++++++------ src/vdbe.c | 2 +- test/strict1.test | 12 ++++++------ 7 files changed, 41 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index 1f41b59dd0..9b371f4613 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\stypeless\scolumns\sin\sSTRICT\stables\sthat\sare\sable\sto\saccept\sany\ndata\stype. -D 2021-08-21T20:54:19.283 +C Back\sout\sthe\schange\sthat\sallows\stypeless\scolumns\sin\sstrict\stables.\s\sReplace\nthat\scapability\swith\san\sANY\stype\sfor\sstrict\stables\sthat\swill\saccept\sany\ndatatype\swith\sBLOB\saffinity. +D 2021-08-23T10:28:02.736 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c f9246c633829153bb6d41f03eeb5a121a6e618b48e20a5e9c18927c381df072d +F src/build.c 8fa6deebf8726339a5aafb322e9d79c48950b994f33f17460c5393ef593d202e F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -500,7 +500,7 @@ F src/expr.c e98375fc63552cc8cdd36a41bdca3039cb603d9fe67abd9c9f40adae8405fbc5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c -F src/global.c 24ba3b3e88dd2a70389388c3bc46fd55a44bfae3c44f76dad1ca00556f1c769a +F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -549,7 +549,7 @@ F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e82634 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h a0e00a52b90f236c77fd0c0b839cc091d9926aca7627eb6ad8cf3f55a9847a71 +F src/sqliteInt.h 4cb73cc4b9b7705ccfd5bdfb9c248a9772a90ba52f743dbab90d13123babe36b F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c b228d775c269c4f44284ca9f855329f7cb429159d0f79e54408e4506c932b712 +F src/vdbe.c 39755f468a623af5e805c65a9ad7edb7c45fd78239fd58a319c7db8dfacc302b F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1425,7 +1425,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test c5848830ebbf96b5126c41b16974d76110a50f8877dec42e222527cd292c47f5 +F test/strict1.test 1e80c6ae71702c7cebacbc9c61d0c58e270b4cc8004c187296e39432015bf2be F test/strict2.test fe1928b3768f51b39774d753ac7e71727718d1c3305eead0e5ea60f75e9e6b4c F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f @@ -1922,7 +1922,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 600f1991e5c0a5d89cd8776a157b6fd72c7489791085876925e8dd7ab146fe1f -R 1fec1fd4fd154dec8605720039e4eeb3 +P 1e2dcc2d4ee88c0aed40d1472b1c7d43fd43822891729ad6a2c55d5b912e7ad7 +R bc0e3fa5395544f8414a9f2fc5c4a24f U drh -Z 8c2a8dfd9ff7ca38c0c83e9da4b64c4b +Z 6df95366126c115ab64940da7d4c5f2b diff --git a/manifest.uuid b/manifest.uuid index 472ade95b5..8c812008cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1e2dcc2d4ee88c0aed40d1472b1c7d43fd43822891729ad6a2c55d5b912e7ad7 \ No newline at end of file +d8fd1a2bfd51848ea612142d23475b268b3f5269e558f2e09713d1ac18b18274 \ No newline at end of file diff --git a/src/build.c b/src/build.c index b80eef8dc8..f2b3d2544d 100644 --- a/src/build.c +++ b/src/build.c @@ -2606,12 +2606,19 @@ void sqlite3EndTable( p->tabFlags |= TF_Strict; for(ii=0; iinCol; ii++){ Column *pCol = &p->aCol[ii]; - if( pCol->eCType==COLTYPE_CUSTOM && pCol->colFlags & COLFLAG_HASTYPE ){ - sqlite3ErrorMsg(pParse, - "unknown datatype for %s.%s: \"%s\"", - p->zName, pCol->zCnName, sqlite3ColumnType(pCol, "") - ); + if( pCol->eCType==COLTYPE_CUSTOM ){ + if( pCol->colFlags & COLFLAG_HASTYPE ){ + sqlite3ErrorMsg(pParse, + "unknown datatype for %s.%s: \"%s\"", + p->zName, pCol->zCnName, sqlite3ColumnType(pCol, "") + ); + }else{ + sqlite3ErrorMsg(pParse, "missing datatype for %s.%s", + p->zName, pCol->zCnName); + } return; + }else if( pCol->eCType==COLTYPE_ANY ){ + pCol->affinity = SQLITE_AFF_BLOB; } if( (pCol->colFlags & COLFLAG_PRIMKEY)!=0 && p->iPKey!=ii diff --git a/src/global.c b/src/global.c index 091310c934..675cdec236 100644 --- a/src/global.c +++ b/src/global.c @@ -364,8 +364,9 @@ const char sqlite3StrBINARY[] = "BINARY"; ** sqlite3_column_type() or sqlite3_value_type()) ** for each entry in sqlite3StdType[]. */ -const unsigned char sqlite3StdTypeLen[] = { 4, 3, 7, 4, 4 }; +const unsigned char sqlite3StdTypeLen[] = { 3, 4, 3, 7, 4, 4 }; const char sqlite3StdTypeAffinity[] = { + SQLITE_AFF_NUMERIC, SQLITE_AFF_BLOB, SQLITE_AFF_INTEGER, SQLITE_AFF_INTEGER, @@ -373,6 +374,7 @@ const char sqlite3StdTypeAffinity[] = { SQLITE_AFF_TEXT }; const char sqlite3StdTypeMap[] = { + 0, SQLITE_BLOB, SQLITE_INTEGER, SQLITE_INTEGER, @@ -380,6 +382,7 @@ const char sqlite3StdTypeMap[] = { SQLITE_TEXT }; const char *sqlite3StdType[] = { + "ANY", "BLOB", "INT", "INTEGER", diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 348a41393d..5308ca95c0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2055,12 +2055,13 @@ struct Column { ** Adjust the SQLITE_N_STDTYPE value if adding or removing entries. */ #define COLTYPE_CUSTOM 0 /* Type appended to zName */ -#define COLTYPE_BLOB 1 -#define COLTYPE_INT 2 -#define COLTYPE_INTEGER 3 -#define COLTYPE_REAL 4 -#define COLTYPE_TEXT 5 -#define SQLITE_N_STDTYPE 5 /* Number of standard types */ +#define COLTYPE_ANY 1 +#define COLTYPE_BLOB 2 +#define COLTYPE_INT 3 +#define COLTYPE_INTEGER 4 +#define COLTYPE_REAL 5 +#define COLTYPE_TEXT 6 +#define SQLITE_N_STDTYPE 6 /* Number of standard types */ /* Allowed values for Column.colFlags. ** diff --git a/src/vdbe.c b/src/vdbe.c index 92d9041357..5ac770c05c 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2974,7 +2974,7 @@ case OP_TypeCheck: { break; } default: { - /* anything goes */ + /* COLTYPE_ANY. Accept anything. */ break; } } diff --git a/test/strict1.test b/test/strict1.test index 819c7e5c6f..da3d33856d 100644 --- a/test/strict1.test +++ b/test/strict1.test @@ -20,14 +20,14 @@ set testprefix strict1 # STRICT tables have on a limited number of allowed datatypes. # do_catchsql_test strict1-1.1 { - CREATE TABLE t1ok0(a) STRICT; -} {0 {}} + CREATE TABLE t1(a) STRICT; +} {1 {missing datatype for t1.a}} do_catchsql_test strict1-1.2 { - CREATE TABLE t1ok1(a PRIMARY KEY) STRICT, WITHOUT ROWID; -} {0 {}} + CREATE TABLE t1(a PRIMARY KEY) STRICT, WITHOUT ROWID; +} {1 {missing datatype for t1.a}} do_catchsql_test strict1-1.3 { - CREATE TABLE t1ok2(a PRIMARY KEY) WITHOUT ROWID, STRICT; -} {0 {}} + CREATE TABLE t1(a PRIMARY KEY) WITHOUT ROWID, STRICT; +} {1 {missing datatype for t1.a}} do_catchsql_test strict1-1.4 { CREATE TABLE t1(a BANJO PRIMARY KEY) WITHOUT ROWID, STRICT; } {1 {unknown datatype for t1.a: "BANJO"}} From 0ccda5294fee4e27461f03eef6447bb1fcf9ef65 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 23 Aug 2021 15:56:01 +0000 Subject: [PATCH 021/130] Fix a typo in a comment. No changes to code. FossilOrigin-Name: d953646a63bf96a8e6e57fefaa60ae1487e5e4eb776fb38cd9c4ce002e74d016 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9b371f4613..d4e47d739a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\sthe\schange\sthat\sallows\stypeless\scolumns\sin\sstrict\stables.\s\sReplace\nthat\scapability\swith\san\sANY\stype\sfor\sstrict\stables\sthat\swill\saccept\sany\ndatatype\swith\sBLOB\saffinity. -D 2021-08-23T10:28:02.736 +C Fix\sa\stypo\sin\sa\scomment.\s\sNo\schanges\sto\scode. +D 2021-08-23T15:56:01.620 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 +F src/btree.c 441e7643b0c891adf1e7ae9f110d17337313e6e0b3bd6ff4605d9ab5e485c98e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c 8fa6deebf8726339a5aafb322e9d79c48950b994f33f17460c5393ef593d202e @@ -1922,7 +1922,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 1e2dcc2d4ee88c0aed40d1472b1c7d43fd43822891729ad6a2c55d5b912e7ad7 -R bc0e3fa5395544f8414a9f2fc5c4a24f +P d8fd1a2bfd51848ea612142d23475b268b3f5269e558f2e09713d1ac18b18274 +R 89d093ae6c463bdde72fba650ddc5cd9 U drh -Z 6df95366126c115ab64940da7d4c5f2b +Z 57d25b972b62d1c317fad89dafdbc1b4 diff --git a/manifest.uuid b/manifest.uuid index 8c812008cf..0fd4decd65 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d8fd1a2bfd51848ea612142d23475b268b3f5269e558f2e09713d1ac18b18274 \ No newline at end of file +d953646a63bf96a8e6e57fefaa60ae1487e5e4eb776fb38cd9c4ce002e74d016 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 57c556cc26..68e7bbf715 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3142,7 +3142,7 @@ static int lockBtree(BtShared *pBt){ goto page1_init_failed; } - /* If the write version is set to 2, this database should be accessed + /* If the read version is set to 2, this database should be accessed ** in WAL mode. If the log is not already open, open it now. Then ** return SQLITE_OK and return without populating BtShared.pPage1. ** The caller detects this and calls this function again. This is From 5ced0a914e1701bf92c860d9f55e8f0a72d353e2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 24 Aug 2021 17:07:44 +0000 Subject: [PATCH 022/130] Correctly preserve the collating sequence for a column when changing its datatype. Fix for the problem reported by [forum:/forumpost/e5c76b738e|forum post e5c76b738e]. Test cases in TH3. FossilOrigin-Name: c7f0813cabf9d8ab367bead5ba8cf20132b8bb9274d8e47b76ad66a10517dd2a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d4e47d739a..e206e9ae54 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sa\scomment.\s\sNo\schanges\sto\scode. -D 2021-08-23T15:56:01.620 +C Correctly\spreserve\sthe\scollating\ssequence\sfor\sa\scolumn\swhen\schanging\nits\sdatatype.\s\sFix\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/e5c76b738e|forum\spost\se5c76b738e].\s\sTest\scases\nin\sTH3. +D 2021-08-24T17:07:44.447 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c cf72265a344201647348fd15ce943185bf634287787030c1ddcf07306516e8b8 +F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1922,7 +1922,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 d8fd1a2bfd51848ea612142d23475b268b3f5269e558f2e09713d1ac18b18274 -R 89d093ae6c463bdde72fba650ddc5cd9 +P d953646a63bf96a8e6e57fefaa60ae1487e5e4eb776fb38cd9c4ce002e74d016 +R d53f561ead2efd21aac670378e59272f U drh -Z 57d25b972b62d1c317fad89dafdbc1b4 +Z c6e1ab5b9f0457c342ae407c84026d23 diff --git a/manifest.uuid b/manifest.uuid index 0fd4decd65..f00b8ef6b2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d953646a63bf96a8e6e57fefaa60ae1487e5e4eb776fb38cd9c4ce002e74d016 \ No newline at end of file +c7f0813cabf9d8ab367bead5ba8cf20132b8bb9274d8e47b76ad66a10517dd2a \ No newline at end of file diff --git a/src/select.c b/src/select.c index 1045c8f1db..78e5f5cf09 100644 --- a/src/select.c +++ b/src/select.c @@ -2193,7 +2193,7 @@ void sqlite3SelectAddColumnTypeAndCollation( } if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; pColl = sqlite3ExprCollSeq(pParse, p); - if( pColl && (pCol->colFlags & COLFLAG_HASCOLL)==0 ){ + if( pColl ){ assert( pTab->pIndex==0 ); sqlite3ColumnSetColl(db, pCol, pColl->zName); } From b97e2ad10a2332d06039c76ba3641d4167a9359a Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 26 Aug 2021 18:31:39 +0000 Subject: [PATCH 023/130] Add the --safe to the CLI. Also the --nonce option and the .nonce command. FossilOrigin-Name: c76870cb1a8e2e1389ad864c51b9f596dff21df8bb58f438f0a2cacfa63b22a4 --- manifest | 12 ++--- manifest.uuid | 2 +- src/shell.c.in | 124 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 129 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e206e9ae54..7e071f28fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correctly\spreserve\sthe\scollating\ssequence\sfor\sa\scolumn\swhen\schanging\nits\sdatatype.\s\sFix\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/e5c76b738e|forum\spost\se5c76b738e].\s\sTest\scases\nin\sTH3. -D 2021-08-24T17:07:44.447 +C Add\sthe\s--safe\sto\sthe\sCLI.\s\sAlso\sthe\s--nonce\soption\sand\sthe\s.nonce\scommand. +D 2021-08-26T18:31:39.329 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 -F src/shell.c.in f795a4ae3c35631f5edcfa754c7824ff1d8a75b23a07e22e664b50f82e826346 +F src/shell.c.in 34cc533f27d522c7c93fe38c99867c460b0b08be9c1c315dbd360ba5d865b19f F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1922,7 +1922,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 d953646a63bf96a8e6e57fefaa60ae1487e5e4eb776fb38cd9c4ce002e74d016 -R d53f561ead2efd21aac670378e59272f +P c7f0813cabf9d8ab367bead5ba8cf20132b8bb9274d8e47b76ad66a10517dd2a +R 96ba0fa0400f19ae37fbb446bcbce223 U drh -Z c6e1ab5b9f0457c342ae407c84026d23 +Z c0d94ba9195f86107b44ea4e3e28e613 diff --git a/manifest.uuid b/manifest.uuid index f00b8ef6b2..bf8ee8bbc8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7f0813cabf9d8ab367bead5ba8cf20132b8bb9274d8e47b76ad66a10517dd2a \ No newline at end of file +c76870cb1a8e2e1389ad864c51b9f596dff21df8bb58f438f0a2cacfa63b22a4 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 2ca88c02bb..10844ddeb9 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1104,6 +1104,8 @@ struct ShellState { u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ u8 nEqpLevel; /* Depth of the EQP output graph */ u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ + u8 bSafeMode; /* True to prohibit unsafe operations */ + u8 bSafeModePersist; /* The long-term value of bSafeMode */ unsigned statsOn; /* True to display memory stats before each finalize */ unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ int outCount; /* Revert to stdout when reaching zero */ @@ -1155,8 +1157,9 @@ struct ShellState { int *aiIndent; /* Array of indents used in MODE_Explain */ int nIndent; /* Size of array aiIndent[] */ int iIndent; /* Index of current op in aiIndent[] */ + char *zNonce; /* Nonce for temporary safe-mode excapes */ EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ - ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ + ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ }; @@ -1292,6 +1295,27 @@ static void shellPutsFunc( sqlite3_result_value(pCtx, apVal[0]); } +/* +** If in safe mode, print an error message described by the arguments +** and exit immediately. +*/ +static void failIfSafeMode( + ShellState *p, + const char *zErrMsg, + ... +){ + if( p->bSafeMode ){ + va_list ap; + char *zMsg; + va_start(ap, zErrMsg); + zMsg = sqlite3_vmprintf(zErrMsg, ap); + va_end(ap); + raw_printf(stderr, "line %d: ", p->lineno); + utf8_printf(stderr, "%s\n", zMsg); + exit(1); + } +} + /* ** SQL function: edit(VALUE) ** edit(VALUE,EDITOR) @@ -1769,6 +1793,49 @@ static BOOL WINAPI ConsoleCtrlHandler( #endif #ifndef SQLITE_OMIT_AUTHORIZATION +/* +** This authorizer runs in safe mode. +*/ +static int safeModeAuth( + void *pClientData, + int op, + const char *zA1, + const char *zA2, + const char *zA3, + const char *zA4 +){ + ShellState *p = (ShellState*)pClientData; + static const char *azProhibitedFunctions[] = { + "edit", + "fts3_tokenizer", + "load_extension", + "readfile", + "writefile", + "zipfile", + "zipfile_cds", + }; + UNUSED_PARAMETER(zA2); + UNUSED_PARAMETER(zA3); + UNUSED_PARAMETER(zA4); + switch( op ){ + case SQLITE_ATTACH: { + failIfSafeMode(p, "cannot run ATTACH in safe mode"); + break; + } + case SQLITE_FUNCTION: { + int i; + for(i=0; iout, "\n"); + if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4); return SQLITE_OK; } #endif @@ -3984,6 +4052,7 @@ static const char *(azHelp[]) = { " table ASCII-art table", " tabs Tab-separated values", " tcl TCL list elements", + ".nonce STRING Disable safe mode for one command if the nonce matches", ".nullvalue STRING Use STRING in place of NULL values", ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", " If FILE begins with '|' then open as a pipe", @@ -4698,6 +4767,9 @@ static void open_db(ShellState *p, int openFlags){ } #endif } + if( p->bSafeModePersist && p->db!=0 ){ + sqlite3_set_authorizer(p->db, safeModeAuth, p); + } } /* @@ -7461,6 +7533,8 @@ static int do_meta_command(char *zLine, ShellState *p){ open_db(p, 0); if( booleanValue(azArg[1]) ){ sqlite3_set_authorizer(p->db, shellAuth, p); + }else if( p->bSafeModePersist ){ + sqlite3_set_authorizer(p->db, safeModeAuth, p); }else{ sqlite3_set_authorizer(p->db, 0, 0); } @@ -7470,6 +7544,7 @@ static int do_meta_command(char *zLine, ShellState *p){ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ open_db(p, 0); + failIfSafeMode(p, "cannot run .archive in safe mode"); rc = arDotCommand(p, 0, azArg, nArg); }else #endif @@ -7484,6 +7559,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int j; int bAsync = 0; const char *zVfs = 0; + failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); for(j=1; jmode==MODE_Ascii ){ xRead = ascii_read_one_field; @@ -8637,6 +8716,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ const char *zFile, *zProc; char *zErrMsg = 0; + failIfSafeMode(p, "cannot run .load in safe mode"); if( nArg<2 ){ raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); rc = 1; @@ -8655,6 +8735,7 @@ static int do_meta_command(char *zLine, ShellState *p){ #endif if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ + failIfSafeMode(p, "cannot run .log in safe mode"); if( nArg!=2 ){ raw_printf(stderr, "Usage: .log FILENAME\n"); rc = 1; @@ -8725,6 +8806,19 @@ static int do_meta_command(char *zLine, ShellState *p){ p->cMode = p->mode; }else + if( c=='n' && strcmp(azArg[0], "nonce")==0 ){ + if( nArg!=2 ){ + raw_printf(stderr, "Usage: .nonce NONCE\n"); + rc = 1; + }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){ + raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n", p->lineno, azArg[1]); + exit(1); + } + p->bSafeMode = 0; + return 0; /* Return immediately to bypass the safe mode reset + ** at the end of this procedure */ + }else + if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ if( nArg==2 ){ sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, @@ -8816,7 +8910,14 @@ static int do_meta_command(char *zLine, ShellState *p){ } /* If a filename is specified, try to open it first */ if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ - if( newFlag ) shellDeleteFile(zNewFilename); + if( newFlag && !p->bSafeMode ) shellDeleteFile(zNewFilename); + if( p->bSafeMode + && p->openMode!=SHELL_OPEN_HEXDB + && zNewFilename + && strcmp(zNewFilename,":memory:")!=0 + ){ + failIfSafeMode(p, "cannot open disk-based database files in safe mode"); + } p->pAuxDb->zDbFilename = zNewFilename; open_db(p, OPEN_DB_KEEPALIVE); if( p->db==0 ){ @@ -8844,6 +8945,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int bBOM = 0; int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ + failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); if( c=='e' ){ eMode = 'x'; bOnce = 2; @@ -9116,6 +9218,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ FILE *inSaved = p->in; int savedLineno = p->lineno; + failIfSafeMode(p, "cannot run .read in safe mode"); if( nArg!=2 ){ raw_printf(stderr, "Usage: .read FILE\n"); rc = 1; @@ -9154,6 +9257,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_backup *pBackup; int nTimeout = 0; + failIfSafeMode(p, "cannot run .restore in safe mode"); if( nArg==2 ){ zSrcFile = azArg[1]; zDb = "main"; @@ -9403,6 +9507,7 @@ static int do_meta_command(char *zLine, ShellState *p){ */ if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ FILE *out = 0; + failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]); if( nCmd!=2 ) goto session_syntax_error; if( pSession->p==0 ) goto session_not_open; out = fopen(azCmd[1], "wb"); @@ -9817,6 +9922,7 @@ static int do_meta_command(char *zLine, ShellState *p){ ){ char *zCmd; int i, x; + failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); if( nArg<2 ){ raw_printf(stderr, "Usage: .system COMMAND\n"); rc = 1; @@ -10488,6 +10594,7 @@ meta_command_exit: p->outCount--; if( p->outCount==0 ) output_reset(p); } + p->bSafeMode = p->bSafeModePersist; return rc; } @@ -10685,6 +10792,7 @@ static int process_input(ShellState *p){ }else{ clearTempFile(p); } + p->bSafeMode = p->bSafeModePersist; }else if( nSql && _all_whitespace(zSql) ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); nSql = 0; @@ -10851,10 +10959,12 @@ static const char zOptions[] = #endif " -newline SEP set output row separator. Default: '\\n'\n" " -nofollow refuse to open symbolic links to database files\n" + " -nonce STRING set the safe-mode escape nonce\n" " -nullvalue TEXT set text string for NULL values. Default ''\n" " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" " -quote set output mode to 'quote'\n" " -readonly open the database read-only\n" + " -safe enable safe-mode\n" " -separator SEP set output column separator. Default: '|'\n" #ifdef SQLITE_ENABLE_SORTER_REFERENCES " -sorterref SIZE sorter references threshold size\n" @@ -11200,6 +11310,11 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ sqlite3MemTraceActivate(stderr); }else if( strcmp(z,"-bail")==0 ){ bail_on_error = 1; + }else if( strcmp(z,"-nonce")==0 ){ + free(data.zNonce); + data.zNonce = strdup(argv[++i]); + }else if( strcmp(z,"-safe")==0 ){ + /* no-op - catch this on the second pass */ } } verify_uninitialized(); @@ -11362,6 +11477,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ i+=2; }else if( strcmp(z,"-threadsafe")==0 ){ i+=2; + }else if( strcmp(z,"-nonce")==0 ){ + i += 2; }else if( strcmp(z,"-mmap")==0 ){ i++; }else if( strcmp(z,"-memtrace")==0 ){ @@ -11420,6 +11537,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ readStdin = 0; break; #endif + }else if( strcmp(z,"-safe")==0 ){ + data.bSafeMode = data.bSafeModePersist = 1; }else{ utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); raw_printf(stderr,"Use -help for a list of options.\n"); @@ -11522,6 +11641,7 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ free(argvToFree); #endif free(data.colWidth); + free(data.zNonce); /* Clear the global data structure so that valgrind will detect memory ** leaks */ memset(&data, 0, sizeof(data)); From 6d77a2948e86f8975c1e2ff63580dc9dcc806ee4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 27 Aug 2021 11:26:37 +0000 Subject: [PATCH 024/130] Patch lemon to fix "error" token handling, according ot [forum:/forumpost/e680f42f53090061|forum post e680f42f53090061]. FossilOrigin-Name: 106b5e5355a3836a9756333e6dcbb13f0878a5352dab00973b8f0900879bd724 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/lemon.c | 4 +++- tool/lempar.c | 4 ---- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 7e071f28fb..bd49b608f7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--safe\sto\sthe\sCLI.\s\sAlso\sthe\s--nonce\soption\sand\sthe\s.nonce\scommand. -D 2021-08-26T18:31:39.329 +C Patch\slemon\sto\sfix\s"error"\stoken\shandling,\saccording\sot\n[forum:/forumpost/e680f42f53090061|forum\spost\se680f42f53090061]. +D 2021-08-27T11:26:37.146 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1840,8 +1840,8 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c f62a0c701b2c7ff2f3e21d206f093c123f222dbf07136a10ffd1ca15a5c706c5 F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c a5acddd3eec6a388872aae6efc7563336348a9c45e5563642f77e8e3a50e859d -F tool/lempar.c 757e4ec699b99e0b7e78ffd8ec2063d9fa198b9102d2009dbe08369dc5775dcb +F tool/lemon.c dabeb66806057235fdca34d77e077a554396d8b8c2e1982dfd292b9dba3be13c +F tool/lempar.c 7d4b1c863a6c7f75f0a04bfa7000b7388898c9ee9c906adc675bc40590ad0abe F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1922,7 +1922,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 c7f0813cabf9d8ab367bead5ba8cf20132b8bb9274d8e47b76ad66a10517dd2a -R 96ba0fa0400f19ae37fbb446bcbce223 +P c76870cb1a8e2e1389ad864c51b9f596dff21df8bb58f438f0a2cacfa63b22a4 +R c18392e64d5f9a64cf0c5ede682cfbfb U drh -Z c0d94ba9195f86107b44ea4e3e28e613 +Z 30473933374c4aa8bce1a958333c8a4a diff --git a/manifest.uuid b/manifest.uuid index bf8ee8bbc8..25d36a2c85 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c76870cb1a8e2e1389ad864c51b9f596dff21df8bb58f438f0a2cacfa63b22a4 \ No newline at end of file +106b5e5355a3836a9756333e6dcbb13f0878a5352dab00973b8f0900879bd724 \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index 75fc7aa2fb..edf17cae74 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -3571,7 +3571,9 @@ PRIVATE int compute_action(struct lemon *lemp, struct action *ap) /* Since a SHIFT is inherient after a prior REDUCE, convert any ** SHIFTREDUCE action with a nonterminal on the LHS into a simple ** REDUCE action: */ - if( ap->sp->index>=lemp->nterminal ){ + if( ap->sp->index>=lemp->nterminal + && (lemp->errsym==0 || ap->sp->index!=lemp->errsym->index) + ){ act = lemp->minReduce + ap->x.rp->iRule; }else{ act = lemp->minShiftReduce + ap->x.rp->iRule; diff --git a/tool/lempar.c b/tool/lempar.c index bbb0cc367d..d5ebe69424 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -985,10 +985,6 @@ void Parse( yyact = yy_find_reduce_action(yypParser->yytos->stateno, YYERRORSYMBOL); if( yyact<=YY_MAX_SHIFTREDUCE ) break; - if( yyact>=YY_MIN_REDUCE && yyRuleInfoNRhs[yyact-YY_MIN_REDUCE] ){ - yyact -= YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; - break; - } yy_pop_parser_stack(yypParser); } if( yypParser->yytos <= yypParser->yystack || yymajor==0 ){ From beed24d57e9b0a622d66f54e612f83281b9cef22 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 30 Aug 2021 17:02:48 +0000 Subject: [PATCH 025/130] =?UTF-8?q?Do=20not=20disable=20a=20rowid=3D=3F=20?= =?UTF-8?q?term=20used=20to=20drive=20an=20IPK=20index=20if=20it=20is=20a?= =?UTF-8?q?=20transitive=20constraint.?= FossilOrigin-Name: 46e28cbcf6044b36aa4ddcda09adb49a46c6c6a8d41d558467ede3091304aa8c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/wherecode.c | 3 --- test/transitive1.test | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index bd49b608f7..e3f4374658 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Patch\slemon\sto\sfix\s"error"\stoken\shandling,\saccording\sot\n[forum:/forumpost/e680f42f53090061|forum\spost\se680f42f53090061]. -D 2021-08-27T11:26:37.146 +C Do\snot\sdisable\sa\srowid=?\sterm\sused\sto\sdrive\san\sIPK\sindex\sif\sit\sis\sa\stransitive\sconstraint. +D 2021-08-30T17:02:48.783 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 99b6e13664a7bd9a553c554978d0e253066995dade621f44cffa8928c8b493b5 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c 9b33f463a279feeee69622b747b0050f0b836eb8b5ac48599ba3a6bfbea798a7 +F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e F src/whereexpr.c 3a9144a9d52e110efdc012a73b1574e7b2b4df4bf98949387cb620295eba0975 F src/window.c 420167512050a0dfc0f0115b9f0c7d299da9759c9bb2ae83a61fb8d730a5707f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1622,7 +1622,7 @@ F test/trace3.test ae2004df24b585fed9046cc0bae4601762bc6fc4aa321d475f1350bba5047 F test/trans.test 45f6f9ab6f66a7b5744f1caac06b558f95da62501916906cf55586a896f9f439 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 -F test/transitive1.test 06bcfeeb2ed719abf6ae582f9f65a6b07642dd1363fa648ae9a74a35e83a825c +F test/transitive1.test 7dcd1f263813688cb5433c15c758dcab9a62b3c4ec72edd96c0255e0b322d470 F test/trigger1.test d30cd09ae8ac365a088f09daba583cc5c0b8fc7d4e1d70809d0b4be3bf6ae2ab F test/trigger2.test 6e35bd7321c49e63d540aee980eb95dec63e1d1caca175224101045bcc80871f F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 @@ -1922,7 +1922,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 c76870cb1a8e2e1389ad864c51b9f596dff21df8bb58f438f0a2cacfa63b22a4 -R c18392e64d5f9a64cf0c5ede682cfbfb -U drh -Z 30473933374c4aa8bce1a958333c8a4a +P 106b5e5355a3836a9756333e6dcbb13f0878a5352dab00973b8f0900879bd724 +R 390ae46cb67974ab5b963609771fe7af +U dan +Z 277d9ab62dc946ab2c8cb8f1af415f95 diff --git a/manifest.uuid b/manifest.uuid index 25d36a2c85..c3656e5ee1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -106b5e5355a3836a9756333e6dcbb13f0878a5352dab00973b8f0900879bd724 \ No newline at end of file +46e28cbcf6044b36aa4ddcda09adb49a46c6c6a8d41d558467ede3091304aa8c \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 28b417c9ae..5d9bed27c9 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1500,9 +1500,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; - if( (pTerm->prereqAll & pLevel->notReady)==0 ){ - pTerm->wtFlags |= TERM_CODED; - } }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ diff --git a/test/transitive1.test b/test/transitive1.test index 8755338492..9e2b2e6f81 100644 --- a/test/transitive1.test +++ b/test/transitive1.test @@ -380,4 +380,22 @@ do_execsql_test transitive1-630 { SELECT ALL * FROM t1,t0 WHERE (likely(t1.c0=t0.c1) AND t1.c0=t0.c0); } {} +#------------------------------------------------------------------------- +# 2021-08-31 forum https://sqlite.org/forum/forumpost/8d1b58f112 +reset_db +do_execsql_test transitive1-700 { + CREATE TABLE t1(a INT PRIMARY KEY); + INSERT INTO t1(a) VALUES(1),(2),(3); + CREATE TABLE t2(x INTEGER PRIMARY KEY,y INT); + INSERT INTO t2(y) VALUES(2),(3); +} + +do_execsql_test transitive1-710 { + SELECT * FROM t1 CROSS JOIN t2 WHERE t2.y=t1.a AND t1.a=t2.x +} {} + +do_execsql_test transitive1-720 { + SELECT * FROM t1 CROSS JOIN t2 WHERE likely(t2.y=t1.a) AND unlikely(t1.a=t2.x) +} {} + finish_test From 748d8b9cdd9abda680017953401318a40eefc6ee Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 31 Aug 2021 15:53:58 +0000 Subject: [PATCH 026/130] Have the planner ensure that if one scan uses a subset of the WHERE clause of another, that scan is estimated to cost less and return fewer rows. FossilOrigin-Name: c7b34930e27597e7f634ad76be55fc436dcb84ea48d5b41b5d7f3596285dd672 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 28 +++++++++++++++------------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index e3f4374658..733ac0b71b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sdisable\sa\srowid=?\sterm\sused\sto\sdrive\san\sIPK\sindex\sif\sit\sis\sa\stransitive\sconstraint. -D 2021-08-30T17:02:48.783 +C Have\sthe\splanner\sensure\sthat\sif\sone\sscan\suses\sa\ssubset\sof\sthe\sWHERE\sclause\sof\sanother,\sthat\sscan\sis\sestimated\sto\scost\sless\sand\sreturn\sfewer\srows. +D 2021-08-31T15:53:58.805 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -631,7 +631,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 99b6e13664a7bd9a553c554978d0e253066995dade621f44cffa8928c8b493b5 +F src/where.c da3981a12e9eb5a71d32bab60ac1957fd4aa337aaea07ca8019b01f8788f442a F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e F src/whereexpr.c 3a9144a9d52e110efdc012a73b1574e7b2b4df4bf98949387cb620295eba0975 @@ -1922,7 +1922,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 106b5e5355a3836a9756333e6dcbb13f0878a5352dab00973b8f0900879bd724 -R 390ae46cb67974ab5b963609771fe7af +P 46e28cbcf6044b36aa4ddcda09adb49a46c6c6a8d41d558467ede3091304aa8c +R 7a7a4eb3153f412c9a6ad188811a1057 U dan -Z 277d9ab62dc946ab2c8cb8f1af415f95 +Z 5dffd43884b54fa608822427de1e26e7 diff --git a/manifest.uuid b/manifest.uuid index c3656e5ee1..6819c3efb8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46e28cbcf6044b36aa4ddcda09adb49a46c6c6a8d41d558467ede3091304aa8c \ No newline at end of file +c7b34930e27597e7f634ad76be55fc436dcb84ea48d5b41b5d7f3596285dd672 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 5073b6c82c..4157d17b4c 100644 --- a/src/where.c +++ b/src/where.c @@ -2011,7 +2011,8 @@ static void whereUndoExprMods(WhereInfo *pWInfo){ /* ** Return TRUE if all of the following are true: ** -** (1) X has the same or lower cost that Y +** (1) X has the same or lower cost, or returns the same or fewer rows, +** than Y. ** (2) X uses fewer WHERE clause terms than Y ** (3) Every WHERE clause term used by X is also used by Y ** (4) X skips at least as many columns as Y @@ -2034,11 +2035,8 @@ static int whereLoopCheaperProperSubset( if( pX->nLTerm-pX->nSkip >= pY->nLTerm-pY->nSkip ){ return 0; /* X is not a subset of Y */ } + if( pX->rRun>pY->rRun && pX->nOut>pY->nOut ) return 0; if( pY->nSkip > pX->nSkip ) return 0; - if( pX->rRun >= pY->rRun ){ - if( pX->rRun > pY->rRun ) return 0; /* X costs more than Y */ - if( pX->nOut > pY->nOut ) return 0; /* X costs more than Y */ - } for(i=pX->nLTerm-1; i>=0; i--){ if( pX->aLTerm[i]==0 ) continue; for(j=pY->nLTerm-1; j>=0; j--){ @@ -2054,8 +2052,8 @@ static int whereLoopCheaperProperSubset( } /* -** Try to adjust the cost of WhereLoop pTemplate upwards or downwards so -** that: +** Try to adjust the cost and number of output rows of WhereLoop pTemplate +** upwards or downwards so that: ** ** (1) pTemplate costs less than any other WhereLoops that are a proper ** subset of pTemplate @@ -2076,16 +2074,20 @@ static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ /* Adjust pTemplate cost downward so that it is cheaper than its ** subset p. */ WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", - pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut-1)); - pTemplate->rRun = p->rRun; - pTemplate->nOut = p->nOut - 1; + pTemplate->rRun, pTemplate->nOut, + MIN(p->rRun, pTemplate->rRun), + MIN(p->nOut - 1, pTemplate->nOut))); + pTemplate->rRun = MIN(p->rRun, pTemplate->rRun); + pTemplate->nOut = MIN(p->nOut - 1, pTemplate->nOut); }else if( whereLoopCheaperProperSubset(pTemplate, p) ){ /* Adjust pTemplate cost upward so that it is costlier than p since ** pTemplate is a proper subset of p */ WHERETRACE(0x80,("subset cost adjustment %d,%d to %d,%d\n", - pTemplate->rRun, pTemplate->nOut, p->rRun, p->nOut+1)); - pTemplate->rRun = p->rRun; - pTemplate->nOut = p->nOut + 1; + pTemplate->rRun, pTemplate->nOut, + MAX(p->rRun, pTemplate->rRun), + MAX(p->nOut + 1, pTemplate->nOut))); + pTemplate->rRun = MAX(p->rRun, pTemplate->rRun); + pTemplate->nOut = MAX(p->nOut + 1, pTemplate->nOut); } } } From e7e9539d99b2cdc63d354bc31933f3be7b4bbc4c Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 3 Sep 2021 18:11:12 +0000 Subject: [PATCH 027/130] Fix an assertion fault in pcache introduced by [4bc93658aa563f2f] and detected by OSSFuzz. Test case in TH3. FossilOrigin-Name: 2262a49467fa56c386080dac3e99a66e16c1700e138dba74db66e7b93ae76bf5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pcache.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 733ac0b71b..2d5ab988b3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sthe\splanner\sensure\sthat\sif\sone\sscan\suses\sa\ssubset\sof\sthe\sWHERE\sclause\sof\sanother,\sthat\sscan\sis\sestimated\sto\scost\sless\sand\sreturn\sfewer\srows. -D 2021-08-31T15:53:58.805 +C Fix\san\sassertion\sfault\sin\spcache\sintroduced\sby\s[4bc93658aa563f2f]\sand\ndetected\sby\sOSSFuzz.\s\sTest\scase\sin\sTH3. +D 2021-09-03T18:11:12.688 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 -F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 +F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c c482a8d529d91e48ebdd5aa3bbbc15edd7f1cd4f4858613be9146866741ad2b8 @@ -1922,7 +1922,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 46e28cbcf6044b36aa4ddcda09adb49a46c6c6a8d41d558467ede3091304aa8c -R 7a7a4eb3153f412c9a6ad188811a1057 -U dan -Z 5dffd43884b54fa608822427de1e26e7 +P c7b34930e27597e7f634ad76be55fc436dcb84ea48d5b41b5d7f3596285dd672 +R 4f7910f5f5ef11dddc7f6d21ffbd4cd3 +U drh +Z 3eac870735d941254d467d34517d396e diff --git a/manifest.uuid b/manifest.uuid index 6819c3efb8..765bf80e50 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7b34930e27597e7f634ad76be55fc436dcb84ea48d5b41b5d7f3596285dd672 \ No newline at end of file +2262a49467fa56c386080dac3e99a66e16c1700e138dba74db66e7b93ae76bf5 \ No newline at end of file diff --git a/src/pcache.c b/src/pcache.c index 36829be415..14d1e7cde0 100644 --- a/src/pcache.c +++ b/src/pcache.c @@ -243,11 +243,14 @@ static int numberOfCachePages(PCache *p){ ** suggested cache size is set to N. */ return p->szCache; }else{ + i64 n; /* IMPLEMANTATION-OF: R-59858-46238 If the argument N is negative, then the ** number of cache pages is adjusted to be a number of pages that would ** use approximately abs(N*1024) bytes of memory based on the current ** page size. */ - return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); + n = ((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); + if( n>1000000000 ) n = 1000000000; + return (int)n; } } From e534c7b97fcb8a6283b9c42da56b2dd1a99e12de Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 6 Sep 2021 11:44:19 +0000 Subject: [PATCH 028/130] Restore the use of system isnan() that was removed by check-in [ea748edecb261f2b]. See [forum:/forumpost/d7c530ac587f59e6|forum thread d7c530ac587f59e6]. FossilOrigin-Name: b3cfe23bec0b95ca673802526704200e2396df715fdded72aa71addd7f47e0e1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/util.c | 12 +++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2d5ab988b3..6cc0bc8031 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassertion\sfault\sin\spcache\sintroduced\sby\s[4bc93658aa563f2f]\sand\ndetected\sby\sOSSFuzz.\s\sTest\scase\sin\sTH3. -D 2021-09-03T18:11:12.688 +C Restore\sthe\suse\sof\ssystem\sisnan()\sthat\swas\sremoved\sby\ncheck-in\s[ea748edecb261f2b].\s\sSee\n[forum:/forumpost/d7c530ac587f59e6|forum\sthread\sd7c530ac587f59e6]. +D 2021-09-06T11:44:19.557 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e +F src/util.c 3f27a1eae01c8bbbb8cdef2f26bd8e6a2a7db08106ef7c3dcc990787a5da6e86 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c 39755f468a623af5e805c65a9ad7edb7c45fd78239fd58a319c7db8dfacc302b F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe @@ -1922,7 +1922,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 c7b34930e27597e7f634ad76be55fc436dcb84ea48d5b41b5d7f3596285dd672 -R 4f7910f5f5ef11dddc7f6d21ffbd4cd3 +P 2262a49467fa56c386080dac3e99a66e16c1700e138dba74db66e7b93ae76bf5 +R d8ba99d74275c13962c86910c5d71eaf U drh -Z 3eac870735d941254d467d34517d396e +Z b03f3a58c51480d14c4f0272dcd9a510 diff --git a/manifest.uuid b/manifest.uuid index 765bf80e50..203532855e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2262a49467fa56c386080dac3e99a66e16c1700e138dba74db66e7b93ae76bf5 \ No newline at end of file +b3cfe23bec0b95ca673802526704200e2396df715fdded72aa71addd7f47e0e1 \ No newline at end of file diff --git a/src/util.c b/src/util.c index 2d1c64ad13..44c0195caf 100644 --- a/src/util.c +++ b/src/util.c @@ -60,11 +60,21 @@ int sqlite3FaultSim(int iTest){ #ifndef SQLITE_OMIT_FLOATING_POINT /* ** Return true if the floating point value is Not a Number (NaN). +** +** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. +** Otherwise, we have our own implementation that works on most systems. */ int sqlite3IsNaN(double x){ + int rc; /* The value return */ +#if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN u64 y; memcpy(&y,&x,sizeof(y)); - return IsNaN(y); + rc = IsNaN(y); +#else + rc = isnan(x); +#endif /* HAVE_ISNAN */ + testcase( rc ); + return rc; } #endif /* SQLITE_OMIT_FLOATING_POINT */ From 905b82d5f5f6ed9a60ead53bc6a177239056564e Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 6 Sep 2021 15:59:32 +0000 Subject: [PATCH 029/130] Fix an issue in the "shrink.test" test script reported by [forum:/forumpost/90a74bd61861f58f|forum post 90a74bd618]. FossilOrigin-Name: 6c3734edb2ecabd85a715c853ef58da39381af26d3dd32e53c068b4fcf6fb98f --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/shrink.test | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6cc0bc8031..7965b5f847 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Restore\sthe\suse\sof\ssystem\sisnan()\sthat\swas\sremoved\sby\ncheck-in\s[ea748edecb261f2b].\s\sSee\n[forum:/forumpost/d7c530ac587f59e6|forum\sthread\sd7c530ac587f59e6]. -D 2021-09-06T11:44:19.557 +C Fix\san\sissue\sin\sthe\s"shrink.test"\stest\sscript\sreported\sby\n[forum:/forumpost/90a74bd61861f58f|forum\spost\s90a74bd618]. +D 2021-09-06T15:59:32.983 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1382,7 +1382,7 @@ F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941 F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 -F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce +F test/shrink.test 9521e5e0d74c0b6192794f3de3a3e5e3190d465527ae365d96763ef753c7229c F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 F test/skipscan1.test 1a9972e1dc15ca3887f306d3cd9a29679afb382eca0f3539f3b746f3c2ccaf68 F test/skipscan2.test c588cb7ed947db724d300f2a0dc537dd2ad292b0f812641d8481bc0b95dd3f49 @@ -1922,7 +1922,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 2262a49467fa56c386080dac3e99a66e16c1700e138dba74db66e7b93ae76bf5 -R d8ba99d74275c13962c86910c5d71eaf +P b3cfe23bec0b95ca673802526704200e2396df715fdded72aa71addd7f47e0e1 +R d804c1fe9dfdd55c91d9dd7be30deb33 U drh -Z b03f3a58c51480d14c4f0272dcd9a510 +Z c12e0d7a856c0cabe2857d56a3d90a01 diff --git a/manifest.uuid b/manifest.uuid index 203532855e..27bc78395c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b3cfe23bec0b95ca673802526704200e2396df715fdded72aa71addd7f47e0e1 \ No newline at end of file +6c3734edb2ecabd85a715c853ef58da39381af26d3dd32e53c068b4fcf6fb98f \ No newline at end of file diff --git a/test/shrink.test b/test/shrink.test index 7c9bed08b0..bc4a707bff 100644 --- a/test/shrink.test +++ b/test/shrink.test @@ -24,7 +24,7 @@ do_test shrink-1.1 { CREATE TABLE t1(x,y); INSERT INTO t1 VALUES(randomblob(1000000),1); } - set ::baseline sqlite3_memory_used + set ::baseline [sqlite3_memory_used] # EVIDENCE-OF: R-58814-63508 The sqlite3_db_release_memory(D) interface # attempts to free as much heap memory as possible from database # connection D. From fb8ca7de0cf8d6acf8899922cfd63b25e72594e8 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 6 Sep 2021 16:15:23 +0000 Subject: [PATCH 030/130] Fix a use-after-free error that could occur if an fts5 table is written while scanning it using an fts5vocab cursor. FossilOrigin-Name: e751c2ec786b5c1a1c9640fdc3fde036879a2c32db2bd67fe7c72604780f67b8 --- ext/fts5/fts5_index.c | 38 ++++++++++++++++++++++++++++++++++- ext/fts5/test/fts5vocab2.test | 21 +++++++++++++++++++ manifest | 16 +++++++-------- manifest.uuid | 2 +- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 613ceaf2b6..ea10b357c7 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -837,6 +837,40 @@ int sqlite3Fts5StructureTest(Fts5Index *p, void *pStruct){ return SQLITE_OK; } +/* +** Ensure that structure object (*pp) is writable. +** +** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. If +** an error occurs, (*pRc) is set to an SQLite error code before returning. +*/ +static void fts5StructureMakeWritable(int *pRc, Fts5Structure **pp){ + Fts5Structure *p = *pp; + if( *pRc==SQLITE_OK && p->nRef>1 ){ + int nByte = sizeof(Fts5Structure)+(p->nLevel-1)*sizeof(Fts5StructureLevel); + Fts5Structure *pNew; + pNew = (Fts5Structure*)sqlite3Fts5MallocZero(pRc, nByte); + if( pNew ){ + int i; + memcpy(pNew, p, nByte); + for(i=0; inLevel; i++) pNew->aLevel[i].aSeg = 0; + for(i=0; inLevel; i++){ + Fts5StructureLevel *pLvl = &pNew->aLevel[i]; + int nByte = sizeof(Fts5StructureSegment) * pNew->aLevel[i].nSeg; + pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(pRc, nByte); + if( pLvl->aSeg==0 ){ + for(i=0; inLevel; i++){ + sqlite3_free(pNew->aLevel[i].aSeg); + } + sqlite3_free(pNew); + return; + } + memcpy(pLvl->aSeg, p->aLevel[i].aSeg, nByte); + } + } + *pp = pNew; + } +} + /* ** Deserialize and return the structure record currently stored in serialized ** form within buffer pData/nData. @@ -938,9 +972,11 @@ static int fts5StructureDecode( } /* -** +** Add a level to the Fts5Structure.aLevel[] array of structure object +** (*ppStruct). */ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ + fts5StructureMakeWritable(pRc, ppStruct); if( *pRc==SQLITE_OK ){ Fts5Structure *pStruct = *ppStruct; int nLevel = pStruct->nLevel; diff --git a/ext/fts5/test/fts5vocab2.test b/ext/fts5/test/fts5vocab2.test index e736303cf4..baef718879 100644 --- a/ext/fts5/test/fts5vocab2.test +++ b/ext/fts5/test/fts5vocab2.test @@ -255,6 +255,27 @@ do_test 5.1 { do_execsql_test 5.2 { SELECT * FROM t1 } {one two three four five} + +#------------------------------------------------------------------------- +# Check that the fts5 table cannot be written while there are vocab +# cursors open. +reset_db +do_execsql_test 5.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a); + CREATE VIRTUAL TABLE v1 USING fts5vocab(t1, instance); + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<10000 + ) + INSERT INTO t1 SELECT + 'State Emergency Service (SES), Rural Fire Service (RFS) and Volunteers' + FROM s; +} + +do_catchsql_test 5.1 { + INSERT INTO t1 SELECT rowid FROM v1 +} {1 {query aborted}} + + finish_test diff --git a/manifest b/manifest index 7965b5f847..66b85e99c2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\sin\sthe\s"shrink.test"\stest\sscript\sreported\sby\n[forum:/forumpost/90a74bd61861f58f|forum\spost\s90a74bd618]. -D 2021-09-06T15:59:32.983 +C Fix\sa\suse-after-free\serror\sthat\scould\soccur\sif\san\sfts5\stable\sis\swritten\swhile\sscanning\sit\susing\san\sfts5vocab\scursor. +D 2021-09-06T16:15:23.416 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938d F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 75249b8218dac9c9e7d62362e2be414c1399fdc380c838e5512e2042967b38c8 +F ext/fts5/fts5_index.c 99d3242d8416c2bb0c8e6e44e9259aac4386ea9e4f6fd0c740733583b72a4a60 F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -229,7 +229,7 @@ F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db638 F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a F ext/fts5/test/fts5vocab.test 7ed80d9af1ddaaa1637da05e406327b5aac250848bc604c1c1cc667908b87760 -F ext/fts5/test/fts5vocab2.test c0a8397523561eb780b4f439e75d4969fade0ac40bc73e0c8fd2f3e065111161 +F ext/fts5/test/fts5vocab2.test c9674cf0ffc0384162cdc78828189bb4ed4d54e2798063b5d737e50704a2db5c F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl c0d43c8590656f8240e622b00957b3a0facc49482411a9fdc2870b45c0c82f9f F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 @@ -1922,7 +1922,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 b3cfe23bec0b95ca673802526704200e2396df715fdded72aa71addd7f47e0e1 -R d804c1fe9dfdd55c91d9dd7be30deb33 -U drh -Z c12e0d7a856c0cabe2857d56a3d90a01 +P 6c3734edb2ecabd85a715c853ef58da39381af26d3dd32e53c068b4fcf6fb98f +R b61370b93af0502187f5ca4ecbb0c1a4 +U dan +Z 47ef5fcc5dc27245bda95f4b4ccf3ea9 diff --git a/manifest.uuid b/manifest.uuid index 27bc78395c..b1870860c7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6c3734edb2ecabd85a715c853ef58da39381af26d3dd32e53c068b4fcf6fb98f \ No newline at end of file +e751c2ec786b5c1a1c9640fdc3fde036879a2c32db2bd67fe7c72604780f67b8 \ No newline at end of file From eb61630b400f436b2fc6a54438ba2846e29b843c Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Sep 2021 15:41:25 +0000 Subject: [PATCH 031/130] Fix a potential NULL pointer deference in the LIKE optimization. The problem was introduced by the addition of generated columns in check-in [b855acf1831943b3] (SQLite version 3.31.0, 2020-01-22). Reported by Wang Ke in [forum/forumpost/699b44b3ee|forum post 699b44b3ee]. FossilOrigin-Name: b9417d400f4585004f434837022709f818044d5844fe208fe01595a6b226ef7d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/whereexpr.c | 2 +- test/gencol1.test | 11 +++++++++++ 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 66b85e99c2..1ba2fdf00e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\suse-after-free\serror\sthat\scould\soccur\sif\san\sfts5\stable\sis\swritten\swhile\sscanning\sit\susing\san\sfts5vocab\scursor. -D 2021-09-06T16:15:23.416 +C Fix\sa\spotential\sNULL\spointer\sdeference\sin\sthe\sLIKE\soptimization.\s\sThe\nproblem\swas\sintroduced\sby\sthe\saddition\sof\sgenerated\scolumns\nin\scheck-in\s[b855acf1831943b3]\s(SQLite\sversion\s3.31.0,\s2020-01-22).\nReported\sby\sWang\sKe\sin\n[forum/forumpost/699b44b3ee|forum\spost\s699b44b3ee]. +D 2021-09-07T15:41:25.656 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -634,7 +634,7 @@ F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c da3981a12e9eb5a71d32bab60ac1957fd4aa337aaea07ca8019b01f8788f442a F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e -F src/whereexpr.c 3a9144a9d52e110efdc012a73b1574e7b2b4df4bf98949387cb620295eba0975 +F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 F src/window.c 420167512050a0dfc0f0115b9f0c7d299da9759c9bb2ae83a61fb8d730a5707f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1062,7 +1062,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 6912c4280d0ad26d6e3d133a93c5abd6db0e00bc5c95d6159131a62ab4e6f586 +F test/gencol1.test 1b63f8c00154e58714b1a04554304ffdaae0bac71a23935fe308fb1715068b6c F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test a89236dd8d55aa50c4805f82ac9daf64d477a44d712d8209c118978d0ca21ec9 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1922,7 +1922,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 6c3734edb2ecabd85a715c853ef58da39381af26d3dd32e53c068b4fcf6fb98f -R b61370b93af0502187f5ca4ecbb0c1a4 -U dan -Z 47ef5fcc5dc27245bda95f4b4ccf3ea9 +P e751c2ec786b5c1a1c9640fdc3fde036879a2c32db2bd67fe7c72604780f67b8 +R f37ba84945d9bce14013653d370e48c8 +U drh +Z 4944ee0b1d475ff5a31f598f9aa7b030 diff --git a/manifest.uuid b/manifest.uuid index b1870860c7..e07db5394c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e751c2ec786b5c1a1c9640fdc3fde036879a2c32db2bd67fe7c72604780f67b8 \ No newline at end of file +b9417d400f4585004f434837022709f818044d5844fe208fe01595a6b226ef7d \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index 3492769db9..9b5d2cce9d 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -263,7 +263,7 @@ static int isLikeOrGlob( */ if( pLeft->op!=TK_COLUMN || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT - || IsVirtual(pLeft->y.pTab) /* Value might be numeric */ + || (pLeft->y.pTab && IsVirtual(pLeft->y.pTab)) /* Might be numeric */ ){ int isNum; double rDummy; diff --git a/test/gencol1.test b/test/gencol1.test index f09b880d67..0d72615435 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -602,4 +602,15 @@ do_execsql_test gencol1-21.1 { SELECT name, type FROM pragma_table_xinfo('t1'); } {a INTEGER b INT c TEXT d {} e INT} +# 2021-09-07 forum https://sqlite.org/forum/forumpost/699b44b3ee +# +reset_db +do_execsql_test gencol1-22.1 { + CREATE TABLE t0(a PRIMARY KEY,b TEXT AS ('2') UNIQUE); + INSERT INTO t0(a) VALUES(2); + SELECT * FROM t0 AS x JOIN t0 AS y + WHERE x.b='2' + AND (y.a=2 OR (x.b LIKE '2*' AND y.a=x.b)); +} {2 2 2 2} + finish_test From eb84c6ef35896fb6c269115ff9fb67e5e3fb8e35 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 7 Sep 2021 16:05:48 +0000 Subject: [PATCH 032/130] Fix a memory leak in fts5 that could occur when writing to an fts5 table that is being scanned by an fts5vocab cursor. FossilOrigin-Name: 1183552de10b64a776874a23be8962c0693e5e0cd1a191ea8fa5d6a02b691e4a --- ext/fts5/fts5_index.c | 2 ++ ext/fts5/test/fts5vocab2.test | 5 +++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index ea10b357c7..e35bcf0807 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -866,6 +866,8 @@ static void fts5StructureMakeWritable(int *pRc, Fts5Structure **pp){ } memcpy(pLvl->aSeg, p->aLevel[i].aSeg, nByte); } + p->nRef--; + pNew->nRef = 1; } *pp = pNew; } diff --git a/ext/fts5/test/fts5vocab2.test b/ext/fts5/test/fts5vocab2.test index baef718879..6f7aad329c 100644 --- a/ext/fts5/test/fts5vocab2.test +++ b/ext/fts5/test/fts5vocab2.test @@ -275,6 +275,11 @@ do_catchsql_test 5.1 { INSERT INTO t1 SELECT rowid FROM v1 } {1 {query aborted}} +do_catchsql_test 5.2 { + DELETE FROM t1 WHERE rowid>100; + INSERT INTO t1 SELECT randomblob(3000) FROM v1 +} {1 {query aborted}} + finish_test diff --git a/manifest b/manifest index 1ba2fdf00e..4245c2aced 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sNULL\spointer\sdeference\sin\sthe\sLIKE\soptimization.\s\sThe\nproblem\swas\sintroduced\sby\sthe\saddition\sof\sgenerated\scolumns\nin\scheck-in\s[b855acf1831943b3]\s(SQLite\sversion\s3.31.0,\s2020-01-22).\nReported\sby\sWang\sKe\sin\n[forum/forumpost/699b44b3ee|forum\spost\s699b44b3ee]. -D 2021-09-07T15:41:25.656 +C Fix\sa\smemory\sleak\sin\sfts5\sthat\scould\soccur\swhen\swriting\sto\san\sfts5\stable\sthat\sis\sbeing\sscanned\sby\san\sfts5vocab\scursor. +D 2021-09-07T16:05:48.374 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938d F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 99d3242d8416c2bb0c8e6e44e9259aac4386ea9e4f6fd0c740733583b72a4a60 +F ext/fts5/fts5_index.c 742ba7ecfbd2dc24fe1204fc9c8ed0b77b05d5c29d120f1f00dac44beb788d75 F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -229,7 +229,7 @@ F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db638 F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a F ext/fts5/test/fts5vocab.test 7ed80d9af1ddaaa1637da05e406327b5aac250848bc604c1c1cc667908b87760 -F ext/fts5/test/fts5vocab2.test c9674cf0ffc0384162cdc78828189bb4ed4d54e2798063b5d737e50704a2db5c +F ext/fts5/test/fts5vocab2.test 681980e92e031c9f3fe8d9c149189e876c108da2fb0fb3a25bd8a9b94bff8f68 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl c0d43c8590656f8240e622b00957b3a0facc49482411a9fdc2870b45c0c82f9f F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 @@ -1922,7 +1922,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 e751c2ec786b5c1a1c9640fdc3fde036879a2c32db2bd67fe7c72604780f67b8 -R f37ba84945d9bce14013653d370e48c8 -U drh -Z 4944ee0b1d475ff5a31f598f9aa7b030 +P b9417d400f4585004f434837022709f818044d5844fe208fe01595a6b226ef7d +R fbfb27d03a48669f1ac219704fa7775a +U dan +Z 18191cfbc7f1ec5803fe525828e4b53c diff --git a/manifest.uuid b/manifest.uuid index e07db5394c..0375c6ec5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9417d400f4585004f434837022709f818044d5844fe208fe01595a6b226ef7d \ No newline at end of file +1183552de10b64a776874a23be8962c0693e5e0cd1a191ea8fa5d6a02b691e4a \ No newline at end of file From a933ec4c25bd3f7cfd64fb4a14581adbea5dd41e Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 7 Sep 2021 19:04:42 +0000 Subject: [PATCH 033/130] Make sqldiff able to compare sqlite_schema tables (for detailed schema differences.) FossilOrigin-Name: 7ff92da9f183bc24a0d93996df771df7a712df1122ad897cb9143cde7d57ef7d --- manifest | 14 +++++----- manifest.uuid | 2 +- tool/sqldiff.c | 73 ++++++++++++++++++++++++++++++++++---------------- 3 files changed, 58 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 4245c2aced..624dbdb66e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\sfts5\sthat\scould\soccur\swhen\swriting\sto\san\sfts5\stable\sthat\sis\sbeing\sscanned\sby\san\sfts5vocab\scursor. -D 2021-09-07T16:05:48.374 +C Make\ssqldiff\sable\sto\scompare\ssqlite_schema\stables\s(for\sdetailed\sschema\sdifferences.) +D 2021-09-07T19:04:42.342 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1887,7 +1887,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c a94207d8a8b8ae20973012756362a850ba1f95bb4ed02cf950fd469eb556717c +F tool/sqldiff.c 76381d75e306e3d8cb8bd16dee9e5f752861442898166899749a645db9463e63 F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 @@ -1922,7 +1922,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 b9417d400f4585004f434837022709f818044d5844fe208fe01595a6b226ef7d -R fbfb27d03a48669f1ac219704fa7775a -U dan -Z 18191cfbc7f1ec5803fe525828e4b53c +P 1183552de10b64a776874a23be8962c0693e5e0cd1a191ea8fa5d6a02b691e4a +R 5fc0569834e7e1f42b0c0df267678b2d +U larrybr +Z 0fa72ab31716f5d6918e2bf803ce3e1a diff --git a/manifest.uuid b/manifest.uuid index 0375c6ec5d..830550a845 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1183552de10b64a776874a23be8962c0693e5e0cd1a191ea8fa5d6a02b691e4a \ No newline at end of file +7ff92da9f183bc24a0d93996df771df7a712df1122ad897cb9143cde7d57ef7d \ No newline at end of file diff --git a/tool/sqldiff.c b/tool/sqldiff.c index b8b9e005b9..9bd2c446fe 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -35,6 +35,7 @@ struct GlobalVars { int bSchemaPK; /* Use the schema-defined PK, not the true PK */ int bHandleVtab; /* Handle fts3, fts4, fts5 and rtree vtabs */ unsigned fDebug; /* Debug flags */ + int bSchemaCompare; /* Doing single-table sqlite_schema compare */ sqlite3 *db; /* The database connection */ } g; @@ -192,7 +193,7 @@ static void namelistFree(char **az){ } /* -** Return a list of column names for the table zDb.zTab. Space to +** Return a list of column names [a] for the table zDb.zTab. Space to ** hold the list is obtained from sqlite3_malloc() and should released ** using namelistFree() when no longer needed. ** @@ -209,6 +210,8 @@ static void namelistFree(char **az){ ** If the primary key for a table is the rowid but rowid is inaccessible, ** then this routine returns a NULL pointer. ** +** [a. If the named table is sqlite_schema, omits the "rootpage" column.] + ** Examples: ** CREATE TABLE t1(a INT UNIQUE, b INTEGER, c TEXT, PRIMARY KEY(c)); ** *pnPKey = 1; @@ -305,13 +308,16 @@ static char **columnNames( if( az==0 ) runtimeError("out of memory"); memset(az, 0, sizeof(char*)*(nPK+1)); while( SQLITE_ROW==sqlite3_step(pStmt) ){ + char * sid = safeId((char*)sqlite3_column_text(pStmt,1)); int iPKey; if( truePk && (iPKey = sqlite3_column_int(pStmt,5))>0 ){ - az[iPKey-1] = safeId((char*)sqlite3_column_text(pStmt,1)); + az[iPKey-1] = sid; }else{ - az = sqlite3_realloc(az, sizeof(char*)*(naz+2) ); - if( az==0 ) runtimeError("out of memory"); - az[naz++] = safeId((char*)sqlite3_column_text(pStmt,1)); + if( !g.bSchemaCompare || strcmp(sid,"rootpage")!=0 ){ + az = sqlite3_realloc(az, sizeof(char*)*(naz+2) ); + if( az==0 ) runtimeError("out of memory"); + az[naz++] = sid; + } } } sqlite3_finalize(pStmt); @@ -322,18 +328,24 @@ static char **columnNames( if( pbRowid ) *pbRowid = (az[0]==0); /* If this table has an implicit rowid for a PK, figure out how to refer - ** to it. There are three options - "rowid", "_rowid_" and "oid". Any - ** of these will work, unless the table has an explicit column of the - ** same name. */ + ** to it. There are usually three options - "rowid", "_rowid_" and "oid". + ** Any of these will work, unless the table has an explicit column of the + ** same name or the sqlite_schema tables are to be compared. In the latter + ** case, pretend that the "true" primary key is the name column, which + ** avoids extraneous diffs against the schemas due to rowid variance. */ if( az[0]==0 ){ const char *azRowid[] = { "rowid", "_rowid_", "oid" }; - for(i=0; i=naz ){ - az[0] = sqlite3_mprintf("%s", azRowid[i]); - break; + if( g.bSchemaCompare ){ + az[0] = sqlite3_mprintf("%s", "name"); + }else { + for(i=0; i=naz ){ + az[0] = sqlite3_mprintf("%s", azRowid[i]); + break; + } } } if( az[0]==0 ){ @@ -494,7 +506,8 @@ static void dump_table(const char *zTab, FILE *out){ /* -** Compute all differences for a single table. +** Compute all differences for a single table, except if the +** table name is sqlite_schema, ignore the rootpage column. */ static void diff_one_table(const char *zTab, FILE *out){ char *zId = safeId(zTab); /* Name of table (translated for us in SQL) */ @@ -509,6 +522,8 @@ static void diff_one_table(const char *zTab, FILE *out){ const char *zSep; /* Separator string */ Str sql; /* Comparison query */ sqlite3_stmt *pStmt; /* Query statement to do the diff */ + const char *zLead = /* Becomes line-comment for sqlite_schema */ + (g.bSchemaCompare)? "-- " : ""; strInit(&sql); if( g.fDebug==DEBUG_COLUMN_NAMES ){ @@ -529,19 +544,24 @@ static void diff_one_table(const char *zTab, FILE *out){ } goto end_diff_one_table; } - if( sqlite3_table_column_metadata(g.db,"aux",zTab,0,0,0,0,0,0) ){ if( !sqlite3_table_column_metadata(g.db,"main",zTab,0,0,0,0,0,0) ){ /* Table missing from second database. */ - fprintf(out, "DROP TABLE %s;\n", zId); + if( g.bSchemaCompare ) + fprintf(out, "-- 2nd DB has no %s table\n", zTab); + else + fprintf(out, "DROP TABLE %s;\n", zId); } goto end_diff_one_table; } if( sqlite3_table_column_metadata(g.db,"main",zTab,0,0,0,0,0,0) ){ /* Table missing from source */ - dump_table(zTab, out); + if( g.bSchemaCompare ) + fprintf(out, "-- 1st DB has no %s table\n", zTab); + else + dump_table(zTab, out); goto end_diff_one_table; } @@ -558,7 +578,7 @@ static void diff_one_table(const char *zTab, FILE *out){ || az[n] ){ /* Schema mismatch */ - fprintf(out, "DROP TABLE %s; -- due to schema mismatch\n", zId); + fprintf(out, "%sDROP TABLE %s; -- due to schema mismatch\n", zLead, zId); dump_table(zTab, out); goto end_diff_one_table; } @@ -677,7 +697,7 @@ static void diff_one_table(const char *zTab, FILE *out){ int iType = sqlite3_column_int(pStmt, nPk); if( iType==1 || iType==2 ){ if( iType==1 ){ /* Change the content of a row */ - fprintf(out, "UPDATE %s", zId); + fprintf(out, "%sUPDATE %s", zLead, zId); zSep = " SET"; for(i=nPk+1; i Date: Tue, 7 Sep 2021 19:23:32 +0000 Subject: [PATCH 034/130] New test cases added to fuzzdata8.db. No code changes. FossilOrigin-Name: 51e5aadafe1a4ba6a0be7fc1732d1ec940cbc5e23723b76267c2abf887d713ac --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2504704 -> 2600960 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 624dbdb66e..6a1ef0d656 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssqldiff\sable\sto\scompare\ssqlite_schema\stables\s(for\sdetailed\sschema\sdifferences.) -D 2021-09-07T19:04:42.342 +C New\stest\scases\sadded\sto\sfuzzdata8.db.\s\sNo\scode\schanges. +D 2021-09-07T19:23:32.687 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1057,7 +1057,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 4581978d13472885cf33c0bbebb236a69f73f1b7316678d266422f4b96cfdf2c +F test/fuzzdata8.db 595ab116cf5dab27d9d0170815ea55932adc7664ca0d7a58ecc3cc57106f891f F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1922,7 +1922,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 1183552de10b64a776874a23be8962c0693e5e0cd1a191ea8fa5d6a02b691e4a -R 5fc0569834e7e1f42b0c0df267678b2d -U larrybr -Z 0fa72ab31716f5d6918e2bf803ce3e1a +P 7ff92da9f183bc24a0d93996df771df7a712df1122ad897cb9143cde7d57ef7d +R 13319b6ed34117906bc5e784808c9a4f +U drh +Z 6d5eaeab927eb4f20a0418089bf7ab3c diff --git a/manifest.uuid b/manifest.uuid index 830550a845..787ba9d670 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ff92da9f183bc24a0d93996df771df7a712df1122ad897cb9143cde7d57ef7d \ No newline at end of file +51e5aadafe1a4ba6a0be7fc1732d1ec940cbc5e23723b76267c2abf887d713ac \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 5273e5883c28846a9f5935e5e385964f1d17c43f..f41e9f56be0b5c3c3cafb23526825493b59a7269 100644 GIT binary patch delta 61763 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%0DULKEe+N~U-BVV8;aER~O!|Vw&U~`X9^^ZDk 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 E2U3c}zyJUM delta 47964 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 From 2c09a8ad6f6308c47a1ce22b5b499244ceeeb17a Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 7 Sep 2021 20:58:49 +0000 Subject: [PATCH 035/130] For sqldiff, sqlite_schema comparisons must use compound (synthesized) PK. FossilOrigin-Name: 5bdd8466129b8e477c8349847f19f2a5adea3f650cca6dbafa3b835e5a538d09 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/sqldiff.c | 45 ++++++++++++++++++++++++++++----------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 6a1ef0d656..f14da5c726 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\sfuzzdata8.db.\s\sNo\scode\schanges. -D 2021-09-07T19:23:32.687 +C For\ssqldiff,\ssqlite_schema\scomparisons\smust\suse\scompound\s(synthesized)\sPK. +D 2021-09-07T20:58:49.103 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1887,7 +1887,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c 76381d75e306e3d8cb8bd16dee9e5f752861442898166899749a645db9463e63 +F tool/sqldiff.c 9c639de9fa541a947ea9776435c84adf00f43945e262556e15219ef09f0d912c F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 @@ -1922,7 +1922,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 7ff92da9f183bc24a0d93996df771df7a712df1122ad897cb9143cde7d57ef7d -R 13319b6ed34117906bc5e784808c9a4f -U drh -Z 6d5eaeab927eb4f20a0418089bf7ab3c +P 51e5aadafe1a4ba6a0be7fc1732d1ec940cbc5e23723b76267c2abf887d713ac +R 17b6b23653b2d1c22cf2c809d09a9c4a +U larrybr +Z 07a4f44349ac85e50a32dd7e3855976b diff --git a/manifest.uuid b/manifest.uuid index 787ba9d670..dabcc52258 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -51e5aadafe1a4ba6a0be7fc1732d1ec940cbc5e23723b76267c2abf887d713ac \ No newline at end of file +5bdd8466129b8e477c8349847f19f2a5adea3f650cca6dbafa3b835e5a538d09 \ No newline at end of file diff --git a/tool/sqldiff.c b/tool/sqldiff.c index 9bd2c446fe..da444bf9af 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -200,7 +200,7 @@ static void namelistFree(char **az){ ** Primary key columns are listed first, followed by data columns. ** The number of columns in the primary key is returned in *pnPkey. ** -** Normally, the "primary key" in the previous sentence is the true +** Normally [a], the "primary key" in the previous sentence is the true ** primary key - the rowid or INTEGER PRIMARY KEY for ordinary tables ** or the declared PRIMARY KEY for WITHOUT ROWID tables. However, if ** the g.bSchemaPK flag is set, then the schema-defined PRIMARY KEY is @@ -210,8 +210,9 @@ static void namelistFree(char **az){ ** If the primary key for a table is the rowid but rowid is inaccessible, ** then this routine returns a NULL pointer. ** -** [a. If the named table is sqlite_schema, omits the "rootpage" column.] - +** [a. If the lone, named table is "sqlite_schema", "rootpage" column is +** omitted and the "type" and "name" columns are made to be the PK.] +** ** Examples: ** CREATE TABLE t1(a INT UNIQUE, b INTEGER, c TEXT, PRIMARY KEY(c)); ** *pnPKey = 1; @@ -302,18 +303,32 @@ static char **columnNames( if( nPK==0 ) nPK = 1; truePk = 1; } + if( g.bSchemaCompare ){ + assert( sqlite3_stricmp(zTab,"sqlite_schema")==0 + || sqlite3_stricmp(zTab,"sqlite_master")==0 ); + /* For sqlite_schema, will use type and name as the PK. */ + nPK = 2; + truePk = 0; + } *pnPKey = nPK; naz = nPK; az = sqlite3_malloc( sizeof(char*)*(nPK+1) ); if( az==0 ) runtimeError("out of memory"); memset(az, 0, sizeof(char*)*(nPK+1)); + if( g.bSchemaCompare ){ + az[0] = sqlite3_mprintf("%s", "type"); + az[1] = sqlite3_mprintf("%s", "name"); + } while( SQLITE_ROW==sqlite3_step(pStmt) ){ char * sid = safeId((char*)sqlite3_column_text(pStmt,1)); int iPKey; if( truePk && (iPKey = sqlite3_column_int(pStmt,5))>0 ){ az[iPKey-1] = sid; }else{ - if( !g.bSchemaCompare || strcmp(sid,"rootpage")!=0 ){ + if( !g.bSchemaCompare + || !(strcmp(sid,"rootpage")==0 + ||strcmp(sid,"name")==0 + ||strcmp(sid,"type")==0)){ az = sqlite3_realloc(az, sizeof(char*)*(naz+2) ); if( az==0 ) runtimeError("out of memory"); az[naz++] = sid; @@ -335,17 +350,13 @@ static char **columnNames( ** avoids extraneous diffs against the schemas due to rowid variance. */ if( az[0]==0 ){ const char *azRowid[] = { "rowid", "_rowid_", "oid" }; - if( g.bSchemaCompare ){ - az[0] = sqlite3_mprintf("%s", "name"); - }else { - for(i=0; i=naz ){ - az[0] = sqlite3_mprintf("%s", azRowid[i]); - break; - } + for(i=0; i=naz ){ + az[0] = sqlite3_mprintf("%s", azRowid[i]); + break; } } if( az[0]==0 ){ @@ -1979,8 +1990,8 @@ int main(int argc, char **argv){ if( i==argc-1 ) cmdlineError("missing argument to %s", argv[i]); zTab = argv[++i]; g.bSchemaCompare = - sqlite3_stricmp(zTab, "sqlite_schema") - || sqlite3_stricmp(zTab, "sqlite_master"); + sqlite3_stricmp(zTab, "sqlite_schema")==0 + || sqlite3_stricmp(zTab, "sqlite_master")==0; }else if( strcmp(z,"transaction")==0 ){ useTransaction = 1; From 94b70d8343dd1ef14223b0b58ce6771d0e1c9e65 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 8 Sep 2021 19:25:21 +0000 Subject: [PATCH 036/130] Fix PRAGMA integrity_check so that it does not try to enforce types on ANY columns in a STRICT table. FossilOrigin-Name: 57384fda8db43964871be5e48ae1c72c67533046b523f161d60a41fdc8e96b9e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pragma.c | 4 +++- test/strict2.test | 7 ++++++- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index f14da5c726..18e937f8e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\ssqldiff,\ssqlite_schema\scomparisons\smust\suse\scompound\s(synthesized)\sPK. -D 2021-09-07T20:58:49.103 +C Fix\sPRAGMA\sintegrity_check\sso\sthat\sit\sdoes\snot\stry\sto\senforce\stypes\son\nANY\scolumns\sin\sa\sSTRICT\stable. +D 2021-09-08T19:25:21.930 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -537,7 +537,7 @@ F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c c482a8d529d91e48ebdd5aa3bbbc15edd7f1cd4f4858613be9146866741ad2b8 +F src/pragma.c 2b31671ff0cc1653e5e0544adfc80f46a8165c3f6d1c014dfc62c922859df85a F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b @@ -1426,7 +1426,7 @@ F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 F test/strict1.test 1e80c6ae71702c7cebacbc9c61d0c58e270b4cc8004c187296e39432015bf2be -F test/strict2.test fe1928b3768f51b39774d753ac7e71727718d1c3305eead0e5ea60f75e9e6b4c +F test/strict2.test e78cedd56eb1c3e0b09b16c594dbfcb7e95bc6d85f68f0fd6501c243be28e219 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 @@ -1922,7 +1922,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 51e5aadafe1a4ba6a0be7fc1732d1ec940cbc5e23723b76267c2abf887d713ac -R 17b6b23653b2d1c22cf2c809d09a9c4a -U larrybr -Z 07a4f44349ac85e50a32dd7e3855976b +P 5bdd8466129b8e477c8349847f19f2a5adea3f650cca6dbafa3b835e5a538d09 +R 0519abc6cb0d46b652034c6e6c65f10c +U drh +Z a82d94c048de23aeaa07149c70618cf1 diff --git a/manifest.uuid b/manifest.uuid index dabcc52258..84c4ea9f5e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5bdd8466129b8e477c8349847f19f2a5adea3f650cca6dbafa3b835e5a538d09 \ No newline at end of file +57384fda8db43964871be5e48ae1c72c67533046b523f161d60a41fdc8e96b9e \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index dd1aaf9784..34d2d4c05c 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1703,7 +1703,9 @@ void sqlite3Pragma( } sqlite3VdbeJumpHere(v, jmp2); } - if( pTab->tabFlags & TF_Strict ){ + if( (pTab->tabFlags & TF_Strict)!=0 + && pCol->eCType!=COLTYPE_ANY + ){ jmp2 = sqlite3VdbeAddOp3(v, OP_IsNullOrType, 3, 0, sqlite3StdTypeMap[pCol->eCType-1]); VdbeCoverage(v); diff --git a/test/strict2.test b/test/strict2.test index 854d1c59fd..0a6d3a2965 100644 --- a/test/strict2.test +++ b/test/strict2.test @@ -138,6 +138,11 @@ do_execsql_test strict2-1.45 { PRAGMA quick_check('t1'); } {{non-BLOB value in t1.e}} - +do_execsql_test strict2-2.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INT, b ANY) STRICT; + INSERT INTO t2(a,b) VALUES(1,2),(3,4.5),(5,'six'),(7,x'8888'),(9,NULL); + PRAGMA integrity_check(t2); +} {ok} finish_test From 31bffb44fa3694e1ed0c74ba4befd095aaf86048 Mon Sep 17 00:00:00 2001 From: larrybr Date: Wed, 8 Sep 2021 21:49:03 +0000 Subject: [PATCH 037/130] Speedup CLI's gulping of many huge block SQL comments. FossilOrigin-Name: 729620c5c0c642243be2fdda98f18d04efaf78ce365092e655cf60c9fee0874f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 19 +++++++++++++------ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 18e937f8e5..5f1b58b7d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sPRAGMA\sintegrity_check\sso\sthat\sit\sdoes\snot\stry\sto\senforce\stypes\son\nANY\scolumns\sin\sa\sSTRICT\stable. -D 2021-09-08T19:25:21.930 +C Speedup\sCLI's\sgulping\sof\smany\shuge\sblock\sSQL\scomments. +D 2021-09-08T21:49:03.998 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 -F src/shell.c.in 34cc533f27d522c7c93fe38c99867c460b0b08be9c1c315dbd360ba5d865b19f +F src/shell.c.in af6c3a4942c17a5e28cd47cc111d2f6d6946388c1ff0f5a402208e3f28b666bf F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1922,7 +1922,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 5bdd8466129b8e477c8349847f19f2a5adea3f650cca6dbafa3b835e5a538d09 -R 0519abc6cb0d46b652034c6e6c65f10c -U drh -Z a82d94c048de23aeaa07149c70618cf1 +P 57384fda8db43964871be5e48ae1c72c67533046b523f161d60a41fdc8e96b9e +R 2b022e2a0396b3f75d5529f12b4e770c +U larrybr +Z ed2b484e69af4b239fb95ba99431cfdf diff --git a/manifest.uuid b/manifest.uuid index 84c4ea9f5e..12da571559 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57384fda8db43964871be5e48ae1c72c67533046b523f161d60a41fdc8e96b9e \ No newline at end of file +729620c5c0c642243be2fdda98f18d04efaf78ce365092e655cf60c9fee0874f \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 10844ddeb9..438119c08f 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10729,6 +10729,7 @@ static int process_input(ShellState *p){ int rc; /* Error code */ int errCnt = 0; /* Number of errors seen */ int startline = 0; /* Line number for start of current input */ + int bAllWhite = 1; /* Accumulated line empty or all whitespace */ p->lineno = 0; while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ @@ -10744,9 +10745,14 @@ static int process_input(ShellState *p){ seenInterrupt = 0; } p->lineno++; - if( nSql==0 && _all_whitespace(zLine) ){ - if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); - continue; + if( _all_whitespace(zLine) ){ + if( nSql==0 ){ + if( ShellHasFlag(p, SHFLG_Echo) ) + printf("%s\n", zLine); + continue; + } + }else{ + bAllWhite = 0; } if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); @@ -10765,7 +10771,8 @@ static int process_input(ShellState *p){ } nLine = strlen30(zLine); if( nSql+nLine+2>=nAlloc ){ - nAlloc = nSql+nLine+100; + /* Grow buffer by half-again increments when big. */ + nAlloc = nSql+(nSql>>1)+nLine+100; zSql = realloc(zSql, nAlloc); if( zSql==0 ) shell_out_of_memory(); } @@ -10793,12 +10800,12 @@ static int process_input(ShellState *p){ clearTempFile(p); } p->bSafeMode = p->bSafeModePersist; - }else if( nSql && _all_whitespace(zSql) ){ + }else if( nSql && bAllWhite ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); nSql = 0; } } - if( nSql && !_all_whitespace(zSql) ){ + if( nSql && !bAllWhite ){ errCnt += runOneSqlLine(p, zSql, p->in, startline); } free(zSql); From 30ad4a69320cb721acd19487156b96e7297f3fff Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 9 Sep 2021 14:03:55 +0000 Subject: [PATCH 038/130] Improved database corruption detection in the editPage() subroutine of the btree rebalancer. dbsqlfuzz f035b1b5a100a5f0cffb95c958b6c67d7c5eaf1f. FossilOrigin-Name: 00286ca5d998d80214d5e8d501a3b305f432cda1c0ef67ca530e1219565909b7 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 1 + test/fuzzdata8.db | Bin 2600960 -> 2605056 bytes 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5f1b58b7d1..bde18a43d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Speedup\sCLI's\sgulping\sof\smany\shuge\sblock\sSQL\scomments. -D 2021-09-08T21:49:03.998 +C Improved\sdatabase\scorruption\sdetection\sin\sthe\seditPage()\ssubroutine\nof\sthe\sbtree\srebalancer.\ndbsqlfuzz\sf035b1b5a100a5f0cffb95c958b6c67d7c5eaf1f. +D 2021-09-09T14:03:55.844 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 441e7643b0c891adf1e7ae9f110d17337313e6e0b3bd6ff4605d9ab5e485c98e +F src/btree.c ad8eacc83db82bb50665ea6ce4ac921e8b1e4bd796d17e5c0e4ef76f4daf450e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c 8fa6deebf8726339a5aafb322e9d79c48950b994f33f17460c5393ef593d202e @@ -1057,7 +1057,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 595ab116cf5dab27d9d0170815ea55932adc7664ca0d7a58ecc3cc57106f891f +F test/fuzzdata8.db 63809e2650b083f1d987649c9d00d554e493f5a4fb921e42ca3333966ac0e92d F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1922,7 +1922,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 57384fda8db43964871be5e48ae1c72c67533046b523f161d60a41fdc8e96b9e -R 2b022e2a0396b3f75d5529f12b4e770c -U larrybr -Z ed2b484e69af4b239fb95ba99431cfdf +P 729620c5c0c642243be2fdda98f18d04efaf78ce365092e655cf60c9fee0874f +R d24f12b0a3a095265f0452c5add6ac01 +U drh +Z bf88d01600b1449561c283b3d5c4c92b diff --git a/manifest.uuid b/manifest.uuid index 12da571559..8e741d6e97 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -729620c5c0c642243be2fdda98f18d04efaf78ce365092e655cf60c9fee0874f \ No newline at end of file +00286ca5d998d80214d5e8d501a3b305f432cda1c0ef67ca530e1219565909b7 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 68e7bbf715..de445b2375 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7327,6 +7327,7 @@ static int editPage( pData = &aData[get2byteNotZero(&aData[hdr+5])]; if( pDatapPg->aDataEnd ) goto editpage_fail; /* Add cells to the start of the page */ if( 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 delta 39413 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 Date: Thu, 9 Sep 2021 18:06:07 +0000 Subject: [PATCH 039/130] Avoid masking off an OOM fault in rtreecheck(). FossilOrigin-Name: 3ebfe7128a20b270de65ebf4620f62e34ea6cc46b472cc52aed96af504eb9637 --- ext/rtree/rtree.c | 4 +++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 2151d5af04..4cd8ff3315 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -4265,8 +4265,10 @@ static int rtreeCheckTable( if( pStmt ){ nAux = sqlite3_column_count(pStmt) - 2; sqlite3_finalize(pStmt); + }else + if( check.rc!=SQLITE_NOMEM ){ + check.rc = SQLITE_OK; } - check.rc = SQLITE_OK; } /* Find number of dimensions in the rtree table. */ diff --git a/manifest b/manifest index bde18a43d9..0160134dc4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdatabase\scorruption\sdetection\sin\sthe\seditPage()\ssubroutine\nof\sthe\sbtree\srebalancer.\ndbsqlfuzz\sf035b1b5a100a5f0cffb95c958b6c67d7c5eaf1f. -D 2021-09-09T14:03:55.844 +C Avoid\smasking\soff\san\sOOM\sfault\sin\srtreecheck(). +D 2021-09-09T18:06:07.044 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c f1ce6a86f7cbff634900653bec2dfeba732dd4450eec921c0ac3851d41f462b9 +F ext/rtree/rtree.c 0d1ef309e2bfbe469e3ee363ff9ea0420d5f7b9fcf15b5d9abb9d48a789c26f5 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1922,7 +1922,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 729620c5c0c642243be2fdda98f18d04efaf78ce365092e655cf60c9fee0874f -R d24f12b0a3a095265f0452c5add6ac01 +P 00286ca5d998d80214d5e8d501a3b305f432cda1c0ef67ca530e1219565909b7 +R 0666d4d2e0b84497831e127b6ace8fa3 U drh -Z bf88d01600b1449561c283b3d5c4c92b +Z 57ed03abac45e02a29a971e69e4fb22a diff --git a/manifest.uuid b/manifest.uuid index 8e741d6e97..c5b2c770fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -00286ca5d998d80214d5e8d501a3b305f432cda1c0ef67ca530e1219565909b7 \ No newline at end of file +3ebfe7128a20b270de65ebf4620f62e34ea6cc46b472cc52aed96af504eb9637 \ No newline at end of file From 3acb3b784545935eebabe2dc0d5cd9d1ee368490 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 9 Sep 2021 19:19:02 +0000 Subject: [PATCH 040/130] Remove a NEVER() in btree that is sometimes reachable. dbsqlfuzz b9140023005430654c8fe544cf0a082ef8d561c1. FossilOrigin-Name: 6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 2605056 -> 2609152 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0160134dc4..34f8d53906 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\smasking\soff\san\sOOM\sfault\sin\srtreecheck(). -D 2021-09-09T18:06:07.044 +C Remove\sa\sNEVER()\sin\sbtree\sthat\sis\ssometimes\sreachable.\ndbsqlfuzz\sb9140023005430654c8fe544cf0a082ef8d561c1. +D 2021-09-09T19:19:02.452 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c ad8eacc83db82bb50665ea6ce4ac921e8b1e4bd796d17e5c0e4ef76f4daf450e +F src/btree.c 742425ddcc06b2fef621b26edded28f77c7f9a9e96bdb3cb5217eb91444d99cf F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c 8fa6deebf8726339a5aafb322e9d79c48950b994f33f17460c5393ef593d202e @@ -1057,7 +1057,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 63809e2650b083f1d987649c9d00d554e493f5a4fb921e42ca3333966ac0e92d +F test/fuzzdata8.db 270cbd5fc46e1bf05e1d8a9ca8a6283df2b9a6d204c6135b51a11f39db21e0da F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1922,7 +1922,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 00286ca5d998d80214d5e8d501a3b305f432cda1c0ef67ca530e1219565909b7 -R 0666d4d2e0b84497831e127b6ace8fa3 +P 3ebfe7128a20b270de65ebf4620f62e34ea6cc46b472cc52aed96af504eb9637 +R 18891cf2bf7f46de337f5e14da9a6bc6 U drh -Z 57ed03abac45e02a29a971e69e4fb22a +Z 418794be93dd5023a367639347086d0f diff --git a/manifest.uuid b/manifest.uuid index c5b2c770fe..377fbd2779 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ebfe7128a20b270de65ebf4620f62e34ea6cc46b472cc52aed96af504eb9637 \ No newline at end of file +6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index de445b2375..727727a2ab 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7096,7 +7096,7 @@ static int rebuildPage( assert( i(u32)usableSize) ){ j = 0; } + if( j>(u32)usableSize ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kvNSe`Cb0_|S!yhh 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 OM-gqnKcd|P#s3HF&94an delta 39497 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 A5C8xG From 8bc4cbce6b454a174ee0cfc955da66125f31f789 Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 10 Sep 2021 00:58:46 +0000 Subject: [PATCH 041/130] Speed-up CLI's processing for huge block comments, for any content FossilOrigin-Name: c4568f9f458bad16bd4481f1f6f5e7b6f39f5ccf23f2b05890078577ce2ab9a2 --- manifest | 17 +++-- manifest.uuid | 2 +- src/shell.c.in | 169 ++++++++++++++++++++++++++++++++++--------------- 3 files changed, 130 insertions(+), 58 deletions(-) diff --git a/manifest b/manifest index 34f8d53906..79ef6d71e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sin\sbtree\sthat\sis\ssometimes\sreachable.\ndbsqlfuzz\sb9140023005430654c8fe544cf0a082ef8d561c1. -D 2021-09-09T19:19:02.452 +C Speed-up\sCLI's\sprocessing\sfor\shuge\sblock\scomments,\sfor\sany\scontent +D 2021-09-10T00:58:46.038 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 -F src/shell.c.in af6c3a4942c17a5e28cd47cc111d2f6d6946388c1ff0f5a402208e3f28b666bf +F src/shell.c.in a9db850f1254f281a59042d180d2c6c8f3208cc8455e140600c3d95481c6c168 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1922,7 +1922,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3ebfe7128a20b270de65ebf4620f62e34ea6cc46b472cc52aed96af504eb9637 -R 18891cf2bf7f46de337f5e14da9a6bc6 -U drh -Z 418794be93dd5023a367639347086d0f +P 6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 +R 5477d1fa459b11493c202e9f0cfe1148 +T *branch * speedy_cli +T *sym-speedy_cli * +T -sym-trunk * +U larrybr +Z b7d7b6be2bca4895f81d545876286c4b diff --git a/manifest.uuid b/manifest.uuid index 377fbd2779..13f0ec0131 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 \ No newline at end of file +c4568f9f458bad16bd4481f1f6f5e7b6f39f5ccf23f2b05890078577ce2ab9a2 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 438119c08f..dd261613d5 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10598,38 +10598,109 @@ meta_command_exit: return rc; } -/* -** Return TRUE if a semicolon occurs anywhere in the first N characters -** of string z[]. +/* Line scan result and intermediate states (supporting scan resumption) */ -static int line_contains_semicolon(const char *z, int N){ - int i; - for(i=0; ilineno = 0; while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ @@ -10745,14 +10815,17 @@ static int process_input(ShellState *p){ seenInterrupt = 0; } p->lineno++; - if( _all_whitespace(zLine) ){ - if( nSql==0 ){ - if( ShellHasFlag(p, SHFLG_Echo) ) - printf("%s\n", zLine); - continue; - } - }else{ - bAllWhite = 0; + if( QSS_STATE(qss)==QSS_InPlain + && line_is_command_terminator(zLine) + && line_is_complete(zSql, nSql) ){ + memcpy(zLine,";",2); + } + qss = quickscan(zLine, qss); + if( QSS_PLAINWHITE(qss) && nSql==0 ){ + if( ShellHasFlag(p, SHFLG_Echo) ) + printf("%s\n", zLine); + /* Just swallow leading whitespace */ + continue; } if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); @@ -10766,9 +10839,6 @@ static int process_input(ShellState *p){ } continue; } - if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){ - memcpy(zLine,";",2); - } nLine = strlen30(zLine); if( nSql+nLine+2>=nAlloc ){ /* Grow buffer by half-again increments when big. */ @@ -10789,8 +10859,7 @@ static int process_input(ShellState *p){ memcpy(zSql+nSql, zLine, nLine+1); nSql += nLine; } - if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) - && sqlite3_complete(zSql) ){ + if( nSql && QSS_STATE(qss)==QSS_EndingSemi && sqlite3_complete(zSql) ){ errCnt += runOneSqlLine(p, zSql, p->in, startline); nSql = 0; if( p->outCount ){ @@ -10800,12 +10869,12 @@ static int process_input(ShellState *p){ clearTempFile(p); } p->bSafeMode = p->bSafeModePersist; - }else if( nSql && bAllWhite ){ + }else if( nSql && QSS_PLAINWHITE(qss) ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); nSql = 0; } } - if( nSql && !bAllWhite ){ + if( nSql && QSS_PLAINDARK(qss) ){ errCnt += runOneSqlLine(p, zSql, p->in, startline); } free(zSql); From 7f58117921d0029168b1bbe3c1da77fd90edea80 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 10 Sep 2021 01:02:42 +0000 Subject: [PATCH 042/130] Back out changes [00286ca5d998d802] and [6844ede29e1dac93] (replacing the associated branches with NEVER()) and add a single new test to btreeOverwriteCell() that detects when an overflow pages is also mapped into a b-tree page and raises and immediate SQLITE_CORRUPT error before making any changes. dbsqlfuzz 81791bd980fe6935ff2c7334ec8bef11c1c12b82 and others. FossilOrigin-Name: 32210fa4ac4f06e1705ef808731c7be040a23f9a8630986440100c5d4e76dc07 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 6 +++--- test/fuzzdata8.db | Bin 2609152 -> 2630656 bytes 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 34f8d53906..0623eca37b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sin\sbtree\sthat\sis\ssometimes\sreachable.\ndbsqlfuzz\sb9140023005430654c8fe544cf0a082ef8d561c1. -D 2021-09-09T19:19:02.452 +C Back\sout\schanges\s[00286ca5d998d802]\sand\s[6844ede29e1dac93]\s(replacing\sthe\nassociated\sbranches\swith\sNEVER())\sand\sadd\sa\ssingle\snew\stest\sto\nbtreeOverwriteCell()\sthat\sdetects\swhen\san\soverflow\spages\sis\salso\smapped\ninto\sa\sb-tree\spage\sand\sraises\sand\simmediate\sSQLITE_CORRUPT\serror\sbefore\nmaking\sany\schanges.\ndbsqlfuzz\s81791bd980fe6935ff2c7334ec8bef11c1c12b82\sand\sothers. +D 2021-09-10T01:02:42.266 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 742425ddcc06b2fef621b26edded28f77c7f9a9e96bdb3cb5217eb91444d99cf +F src/btree.c bed4239e31772ed5486e947d8eaf3d38fcc76136e19d0383bad15609198419c2 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c 8fa6deebf8726339a5aafb322e9d79c48950b994f33f17460c5393ef593d202e @@ -1057,7 +1057,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 270cbd5fc46e1bf05e1d8a9ca8a6283df2b9a6d204c6135b51a11f39db21e0da +F test/fuzzdata8.db 81c9cfdd1c9dad84c1dbefb0a22cf31b685b8255031bc3827a6926412b0dc6f1 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1922,7 +1922,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 3ebfe7128a20b270de65ebf4620f62e34ea6cc46b472cc52aed96af504eb9637 -R 18891cf2bf7f46de337f5e14da9a6bc6 +P 6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 +R c7edda4bf8c5cd37a2071fe54c9ca0b9 U drh -Z 418794be93dd5023a367639347086d0f +Z 09e56d520fbccbfbbf9b532c35be723e diff --git a/manifest.uuid b/manifest.uuid index 377fbd2779..c3b2d962a4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 \ No newline at end of file +32210fa4ac4f06e1705ef808731c7be040a23f9a8630986440100c5d4e76dc07 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 727727a2ab..74e60d98de 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7096,7 +7096,7 @@ static int rebuildPage( assert( i(u32)usableSize ){ j = 0; } + if( NEVER(j>(u32)usableSize) ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kpPg->aDataEnd ) goto editpage_fail; + if( NEVER(pData>pPg->aDataEnd) ) goto editpage_fail; /* Add cells to the start of the page */ if( iNewpDbPage)!=1 ){ + if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){ rc = SQLITE_CORRUPT_BKPT; }else{ if( iOffset+ovflPageSize<(u32)nTotal ){ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 6a37fc490a976dbbb6609e2c16600cce8c7023eb..311aae543ca0be9146e125bfd9b66fabfafc5364 100644 GIT binary patch delta 41275 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 From ae509121d039203f5e2222aee0e71a6304990c7a Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 10 Sep 2021 01:45:20 +0000 Subject: [PATCH 043/130] When showHeader set at CLI invocation, do not auto-set it later. FossilOrigin-Name: 733b7d4f95a4e2f0df323974f323c40c2486b188d442e74306a4b580fd8a8bd8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 6 ++++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 0623eca37b..4fb709ccf3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\schanges\s[00286ca5d998d802]\sand\s[6844ede29e1dac93]\s(replacing\sthe\nassociated\sbranches\swith\sNEVER())\sand\sadd\sa\ssingle\snew\stest\sto\nbtreeOverwriteCell()\sthat\sdetects\swhen\san\soverflow\spages\sis\salso\smapped\ninto\sa\sb-tree\spage\sand\sraises\sand\simmediate\sSQLITE_CORRUPT\serror\sbefore\nmaking\sany\schanges.\ndbsqlfuzz\s81791bd980fe6935ff2c7334ec8bef11c1c12b82\sand\sothers. -D 2021-09-10T01:02:42.266 +C When\sshowHeader\sset\sat\sCLI\sinvocation,\sdo\snot\sauto-set\sit\slater. +D 2021-09-10T01:45:20.943 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 -F src/shell.c.in af6c3a4942c17a5e28cd47cc111d2f6d6946388c1ff0f5a402208e3f28b666bf +F src/shell.c.in 2c063d07127aa59e45806ae7911fa6963664901f9fdccfba71b926195d34be36 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1922,7 +1922,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 6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 -R c7edda4bf8c5cd37a2071fe54c9ca0b9 -U drh -Z 09e56d520fbccbfbbf9b532c35be723e +P 32210fa4ac4f06e1705ef808731c7be040a23f9a8630986440100c5d4e76dc07 +R f6c26ef1bf4f79ec99d050527daa9305 +U larrybr +Z d665dd22a5a71bf376be8412530b7279 diff --git a/manifest.uuid b/manifest.uuid index c3b2d962a4..743b8dfa77 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32210fa4ac4f06e1705ef808731c7be040a23f9a8630986440100c5d4e76dc07 \ No newline at end of file +733b7d4f95a4e2f0df323974f323c40c2486b188d442e74306a4b580fd8a8bd8 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 438119c08f..bf3bf97ed0 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1203,7 +1203,7 @@ struct ShellState { #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ #define SHFLG_CountChanges 0x00000020 /* .changes setting */ #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ -#define SHFLG_HeaderSet 0x00000080 /* .header has been used */ +#define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */ #define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */ #define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */ @@ -11448,8 +11448,10 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ "%s",cmdline_option_value(argc,argv,++i)); }else if( strcmp(z,"-header")==0 ){ data.showHeader = 1; - }else if( strcmp(z,"-noheader")==0 ){ + ShellSetFlag(&data, SHFLG_HeaderSet); + }else if( strcmp(z,"-noheader")==0 ){ data.showHeader = 0; + ShellSetFlag(&data, SHFLG_HeaderSet); }else if( strcmp(z,"-echo")==0 ){ ShellSetFlag(&data, SHFLG_Echo); }else if( strcmp(z,"-eqp")==0 ){ From 3a9793e40fd30795589fa1e5ec1909e33a2d556e Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 10 Sep 2021 18:35:59 +0000 Subject: [PATCH 044/130] Fix (luckily harmless) typo in memdb.c per https://sqlite.org/forum/forumpost/15af8872d5999df1 FossilOrigin-Name: d577030cdad165474b082afbe64782e2eb3290331b0e3045b1e85ee6fe011504 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/memdb.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4fb709ccf3..f85626cf2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sshowHeader\sset\sat\sCLI\sinvocation,\sdo\snot\sauto-set\sit\slater. -D 2021-09-10T01:45:20.943 +C Fix\s(luckily\sharmless)\stypo\sin\smemdb.c\sper\shttps://sqlite.org/forum/forumpost/15af8872d5999df1 +D 2021-09-10T18:35:59.336 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 73622017aa03a3cabd1c4d6fca97eedada2155817dd0d74d6c1aeb42573b515d +F src/memdb.c cd8cf3ee965db4a4ab4b5423b49a4ef810490b8ba828911e523325f2cce3ed1a F src/memjournal.c a85f0dc5c02a42453d0bc3819ecfb5666cb6433e5deefcd93ccbe05c9f088b83 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -1922,7 +1922,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 32210fa4ac4f06e1705ef808731c7be040a23f9a8630986440100c5d4e76dc07 -R f6c26ef1bf4f79ec99d050527daa9305 +P 733b7d4f95a4e2f0df323974f323c40c2486b188d442e74306a4b580fd8a8bd8 +R bf19e79ff40640b01f2973dda8410fff U larrybr -Z d665dd22a5a71bf376be8412530b7279 +Z 5d6be29a69cdd0f15d2296fc562161c5 diff --git a/manifest.uuid b/manifest.uuid index 743b8dfa77..b2dae2564a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -733b7d4f95a4e2f0df323974f323c40c2486b188d442e74306a4b580fd8a8bd8 \ No newline at end of file +d577030cdad165474b082afbe64782e2eb3290331b0e3045b1e85ee6fe011504 \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index dc29a2db7f..0d970b6ca3 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -508,7 +508,7 @@ static int memdbOpen( if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFd, flags, pOutFlags); } - memset(pFile, 0, sizeof(*p)); + memset(pFile, 0, sizeof(*pFile)); szName = sqlite3Strlen30(zName); if( szName>1 && zName[0]=='/' ){ int i; From a96bbe9af6c8a68d36de13ebfe18fd31bc3d968d Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 10 Sep 2021 19:45:22 +0000 Subject: [PATCH 045/130] Make CLI prescan handle goofy identifier delimiters too. Streamline code. FossilOrigin-Name: 968aed690ba7240f8a256f5ba679cc971f432ff9af0ff99744824af79b952545 --- manifest | 15 ++++------ manifest.uuid | 2 +- src/shell.c.in | 81 ++++++++++++++++++++------------------------------ 3 files changed, 39 insertions(+), 59 deletions(-) diff --git a/manifest b/manifest index 79ef6d71e9..d55b456136 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Speed-up\sCLI's\sprocessing\sfor\shuge\sblock\scomments,\sfor\sany\scontent -D 2021-09-10T00:58:46.038 +C Make\sCLI\sprescan\shandle\sgoofy\sidentifier\sdelimiters\stoo.\sStreamline\scode. +D 2021-09-10T19:45:22.999 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 -F src/shell.c.in a9db850f1254f281a59042d180d2c6c8f3208cc8455e140600c3d95481c6c168 +F src/shell.c.in f857f13def27b87c6759a537b4d53b30c5c232736b8b31040ba3eb49714a0de3 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1922,10 +1922,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 6844ede29e1dac93a392dfb1e7e676bb9d0a2e7bbec0a4a5804ffc2025a99b66 -R 5477d1fa459b11493c202e9f0cfe1148 -T *branch * speedy_cli -T *sym-speedy_cli * -T -sym-trunk * +P c4568f9f458bad16bd4481f1f6f5e7b6f39f5ccf23f2b05890078577ce2ab9a2 +R eb5e78e09aa48719a67382400efc7d61 U larrybr -Z b7d7b6be2bca4895f81d545876286c4b +Z d182a98bc0a685d688796d8bc75a9046 diff --git a/manifest.uuid b/manifest.uuid index 13f0ec0131..b2cde8ca43 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4568f9f458bad16bd4481f1f6f5e7b6f39f5ccf23f2b05890078577ce2ab9a2 \ No newline at end of file +968aed690ba7240f8a256f5ba679cc971f432ff9af0ff99744824af79b952545 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index dd261613d5..9ea31a0926 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10601,15 +10601,18 @@ meta_command_exit: /* Line scan result and intermediate states (supporting scan resumption) */ typedef enum { - QSS_InPlain = 0, QSS_InString, QSS_InDquote, - QSS_InBlockComment, QSS_EndingSemi, - QSS_NoDark = 0, QSS_HasDark = 1<<3, - QSS_ScanMask = 0x7, QSS_DarkMask = 1<<3 + QSS_InPlain = 0, QSS_InQuote = 1, QSS_InBlockComment = 2, + QSS_NoDark = 0, QSS_HasDark = 1<<2, QSS_EndingSemi = 1<<3, + QSS_ScanMask = 0x3, QSS_DarkMask = 1<<2, + QSS_CharShift = 4, QSS_StateMask = ((1<> QSS_CharShift; + while (cin = *zLine++){ + if( cin==cLeave ){ goto InPlainSet; - }else{ - ++zLine; - } - } - } - break; - case QSS_InDquote: - InDquote: - while (cin = *zLine++){ - if( cin=='"' ){ - if( *zLine!='"' ){ - goto InPlainSet; - }else{ - ++zLine; } } } @@ -10689,16 +10681,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss){ } } break; - case QSS_EndingSemi: - EndingSemi: - while (cin = *zLine++){ - if( !IsSpace(cin) && cin!=';' ){ - --zLine; - goto InPlain; - } - } - break; - default: assert(0); + default:; } return qss; } @@ -10716,7 +10699,7 @@ static int line_is_command_terminator(char *zLine){ zLine += 2; /* SQL Server */ else return 0; - return quickscan(zLine,QSS_NoDark)==QSS_NoDark; + return quickscan(zLine,QSS_Start)==QSS_Start; } /* @@ -10859,7 +10842,7 @@ static int process_input(ShellState *p){ memcpy(zSql+nSql, zLine, nLine+1); nSql += nLine; } - if( nSql && QSS_STATE(qss)==QSS_EndingSemi && sqlite3_complete(zSql) ){ + if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){ errCnt += runOneSqlLine(p, zSql, p->in, startline); nSql = 0; if( p->outCount ){ From 31aa366293757e845ddbe7742958d17f148b987a Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 10 Sep 2021 22:00:43 +0000 Subject: [PATCH 046/130] Make replace.tcl useful with TCL 8.4 FossilOrigin-Name: 2dd61dd97b0326b59b0bc3c83b4d4b9acf811c5acae4d1003e7525ba7a26daf5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/replace.tcl | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f85626cf2d..8e2c3d6acc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\s(luckily\sharmless)\stypo\sin\smemdb.c\sper\shttps://sqlite.org/forum/forumpost/15af8872d5999df1 -D 2021-09-10T18:35:59.336 +C Make\sreplace.tcl\suseful\swith\sTCL\s8.4 +D 2021-09-10T22:00:43.203 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1868,7 +1868,7 @@ F tool/offsets.c 8ed2b344d33f06e71366a9b93ccedaa38c096cc1dbd4c3c26ad08c611528584 F tool/omittest.tcl 3d222272b1d840b4e3d67bff0cb743ce3f633faddadb3702b2056b726775db8f F tool/opcodesum.tcl 740ed206ba8c5040018988129abbf3089a0ccf4a F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b -F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 +F tool/replace.tcl 937c931ad560688e85bdd6258bdc754371bb1e2732e1fb28ef441e44c9228fce F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 @@ -1922,7 +1922,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 733b7d4f95a4e2f0df323974f323c40c2486b188d442e74306a4b580fd8a8bd8 -R bf19e79ff40640b01f2973dda8410fff +P d577030cdad165474b082afbe64782e2eb3290331b0e3045b1e85ee6fe011504 +R e11d4d0cf2b693b49f8aa8017ef21f60 U larrybr -Z 5d6be29a69cdd0f15d2296fc562161c5 +Z c88549a8ac5b53702887ce858b5cfbe8 diff --git a/manifest.uuid b/manifest.uuid index b2dae2564a..47e65984cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d577030cdad165474b082afbe64782e2eb3290331b0e3045b1e85ee6fe011504 \ No newline at end of file +2dd61dd97b0326b59b0bc3c83b4d4b9acf811c5acae4d1003e7525ba7a26daf5 \ No newline at end of file diff --git a/tool/replace.tcl b/tool/replace.tcl index 5a1ac5983c..e87cb922f2 100644 --- a/tool/replace.tcl +++ b/tool/replace.tcl @@ -9,7 +9,7 @@ fconfigure stderr -translation binary -encoding binary set mode [string tolower [lindex $argv 0]] set from [lindex $argv 1] set to [lindex $argv 2] -if {$mode ni [list exact regsub include]} {exit 1} +if {-1 == [lsearch -exact [list exact regsub include] $mode]} {exit 1} if {[string length $from]==0} {exit 2} while {![eof stdin]} { set line [gets stdin] From 8d463ce13537245c906ed68ec599e29e0e217e9f Mon Sep 17 00:00:00 2001 From: larrybr Date: Sat, 11 Sep 2021 02:42:04 +0000 Subject: [PATCH 047/130] CLI prescanner made to match SQLite's rules for delimited identifiers. Tests begun. FossilOrigin-Name: 15b105c520968855ad960d8929f80af9e9bedc155237af9af1956f7b546947f2 --- manifest | 17 +++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 6 ++++-- test/shell3.test | 37 +++++++++++++++++++++++++++++++++++++ tool/replace.tcl | 2 +- 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index d55b456136..fcc91d8197 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sCLI\sprescan\shandle\sgoofy\sidentifier\sdelimiters\stoo.\sStreamline\scode. -D 2021-09-10T19:45:22.999 +C CLI\sprescanner\smade\sto\smatch\sSQLite's\srules\sfor\sdelimited\sidentifiers.\sTests\sbegun. +D 2021-09-11T02:42:04.707 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 -F src/shell.c.in f857f13def27b87c6759a537b4d53b30c5c232736b8b31040ba3eb49714a0de3 +F src/shell.c.in be7cd92c042b5e16bfd727404c5b2ec72c8e177ee2e092da6fe3ea031bbf8ece F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1373,7 +1373,7 @@ F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/shell1.test 56a7358a2a05e850e9e4aa24629db9c8975e8038dbe8debd2d95be22a5f03612 F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b -F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 +F test/shell3.test 1586a163e7918775d3c25530bf84200453f30a77cc338490389114a67352f4d9 F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f48be F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 @@ -1868,7 +1868,7 @@ F tool/offsets.c 8ed2b344d33f06e71366a9b93ccedaa38c096cc1dbd4c3c26ad08c611528584 F tool/omittest.tcl 3d222272b1d840b4e3d67bff0cb743ce3f633faddadb3702b2056b726775db8f F tool/opcodesum.tcl 740ed206ba8c5040018988129abbf3089a0ccf4a F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b -F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 +F tool/replace.tcl 937c931ad560688e85bdd6258bdc754371bb1e2732e1fb28ef441e44c9228fce F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 @@ -1922,7 +1922,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 c4568f9f458bad16bd4481f1f6f5e7b6f39f5ccf23f2b05890078577ce2ab9a2 -R eb5e78e09aa48719a67382400efc7d61 +P 968aed690ba7240f8a256f5ba679cc971f432ff9af0ff99744824af79b952545 +Q +2dd61dd97b0326b59b0bc3c83b4d4b9acf811c5acae4d1003e7525ba7a26daf5 +R 646f691d304e0a026b7432ed79848447 U larrybr -Z d182a98bc0a685d688796d8bc75a9046 +Z d0aaf8bc6b08262fe824a57812c4fb12 diff --git a/manifest.uuid b/manifest.uuid index b2cde8ca43..75e634258e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -968aed690ba7240f8a256f5ba679cc971f432ff9af0ff99744824af79b952545 \ No newline at end of file +15b105c520968855ad960d8929f80af9e9bedc155237af9af1956f7b546947f2 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 9ea31a0926..712169cde6 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10625,7 +10625,6 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss){ case QSS_InPlain: InPlainSet: qss = QSS_SETV(qss, QSS_InPlain); - InPlain: while (cin = *zLine++){ if( IsSpace(cin) ) continue; @@ -10667,7 +10666,10 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss){ char cLeave = qss >> QSS_CharShift; while (cin = *zLine++){ if( cin==cLeave ){ - goto InPlainSet; + if(*zLine==cLeave && cLeave!=']') + ++zLine; + else + goto InPlainSet; } } } diff --git a/test/shell3.test b/test/shell3.test index 63c30a2682..714a4781ea 100644 --- a/test/shell3.test +++ b/test/shell3.test @@ -18,6 +18,7 @@ # # shell3-1.*: Basic tests for running SQL statments from command line. # shell3-2.*: Basic tests for running SQL file from command line. +# shell3-3.*: Basic tests for processing odd SQL constructs. # set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -26,6 +27,7 @@ db close forcedelete test.db test.db-journal test.db-wal sqlite3 db test.db + # There are inconsistencies in command-line argument quoting on Windows. # In particular, individual applications are responsible for command-line # parsing in Windows, not the shell. Depending on whether the sqlite3.exe @@ -98,4 +100,39 @@ do_test shell3-2.7 { catchcmd "foo.db" "CREATE TABLE" } {1 {Error: near line 1: incomplete input}} + +#---------------------------------------------------------------------------- +# shell3-3.*: Basic tests for processing odd SQL constructs. +# + +# Run combinations of odd identifiers, comments, semicolon placement +do_test shell3-3.1 { + forcedelete foo.db + set rc [ catchcmd "foo.db" {CREATE TABLE t1(" +a--. +" --x +); CREATE TABLE t2("a[""b""]"); +.header on +INSERT INTO t1 VALUES (' +x''y'); +INSERT INTO t2 VALUES (' +/*. +.*/ x +''y'); +SELECT * from t1 limit 1; +SELECT * from t2 limit 1; +} ] + set fexist [file exist foo.db] + list $rc $fexist +} {{0 { +a--. + + +x'y +a["b"] + +/*. +.*/ x +'y}} 1} + finish_test diff --git a/tool/replace.tcl b/tool/replace.tcl index 5a1ac5983c..e87cb922f2 100644 --- a/tool/replace.tcl +++ b/tool/replace.tcl @@ -9,7 +9,7 @@ fconfigure stderr -translation binary -encoding binary set mode [string tolower [lindex $argv 0]] set from [lindex $argv 1] set to [lindex $argv 2] -if {$mode ni [list exact regsub include]} {exit 1} +if {-1 == [lsearch -exact [list exact regsub include] $mode]} {exit 1} if {[string length $from]==0} {exit 2} while {![eof stdin]} { set line [gets stdin] From 57dd7e6ad87781d3e37890925b599b72f273154a Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 13 Sep 2021 13:53:13 +0000 Subject: [PATCH 048/130] Fix an incorrect comment and possible integer overflow in pager resulting from check-in [23ca23894af352ea]. Problem reported by [forum:/forumpost/e2ea1a3f61|forum post e2ea1a3f61]. Also change the datatype of Pager.pageSize to i64 even though page size never exceeds 65536, in order to help prevent future problems of this kind. FossilOrigin-Name: f4a552ed9f4ab35520b634954c39748cc7bda535f426280b79da1b99f70599ac --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 8e2c3d6acc..4edb55e3db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sreplace.tcl\suseful\swith\sTCL\s8.4 -D 2021-09-10T22:00:43.203 +C Fix\san\sincorrect\scomment\sand\spossible\sinteger\soverflow\sin\spager\nresulting\sfrom\scheck-in\s[23ca23894af352ea].\s\sProblem\sreported\sby\n[forum:/forumpost/e2ea1a3f61|forum\spost\se2ea1a3f61].\s\sAlso\schange\nthe\sdatatype\sof\sPager.pageSize\sto\si64\seven\sthough\spage\ssize\snever\nexceeds\s65536,\sin\sorder\sto\shelp\sprevent\sfuture\sproblems\sof\sthis\skind. +D 2021-09-13T13:53:13.560 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -531,7 +531,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 +F src/pager.c 1d22bb9081167b2e27a64bf49c7a22ad70b50dedeb78cf22cfe8d8370afa0be5 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -1922,7 +1922,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 d577030cdad165474b082afbe64782e2eb3290331b0e3045b1e85ee6fe011504 -R e11d4d0cf2b693b49f8aa8017ef21f60 -U larrybr -Z c88549a8ac5b53702887ce858b5cfbe8 +P 2dd61dd97b0326b59b0bc3c83b4d4b9acf811c5acae4d1003e7525ba7a26daf5 +R 66cc359b5bd82ddca4b6f4fbb9050fa7 +U drh +Z 3e25a183a096e34ec8d9ba775c31b648 diff --git a/manifest.uuid b/manifest.uuid index 47e65984cd..98e404b1e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2dd61dd97b0326b59b0bc3c83b4d4b9acf811c5acae4d1003e7525ba7a26daf5 \ No newline at end of file +f4a552ed9f4ab35520b634954c39748cc7bda535f426280b79da1b99f70599ac \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 12a78cde80..a72ae73ea4 100644 --- a/src/pager.c +++ b/src/pager.c @@ -679,8 +679,8 @@ struct Pager { i16 nReserve; /* Number of unused bytes at end of each page */ u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ u32 sectorSize; /* Assumed sector size during rollback */ - int pageSize; /* Number of bytes in a page */ Pgno mxPgno; /* Maximum allowed size of the database */ + i64 pageSize; /* Number of bytes in a page */ i64 journalSizeLimit; /* Size limit for persistent journal files */ char *zFilename; /* Name of the database file */ char *zJournal; /* Name of the journal file */ @@ -6932,14 +6932,14 @@ int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ } pPager->nSavepoint = nNew; - /* If this is a release of the outermost savepoint, truncate - ** the sub-journal to zero bytes in size. */ + /* Truncate the sub-journal so that it only includes the parts + ** that are still in use. */ if( op==SAVEPOINT_RELEASE ){ PagerSavepoint *pRel = &pPager->aSavepoint[nNew]; if( pRel->bTruncateOnRelease && isOpen(pPager->sjfd) ){ /* Only truncate if it is an in-memory sub-journal. */ if( sqlite3JournalIsInMemory(pPager->sjfd) ){ - i64 sz = (pPager->pageSize+4)*pRel->iSubRec; + i64 sz = (pPager->pageSize+4)*(i64)pRel->iSubRec; rc = sqlite3OsTruncate(pPager->sjfd, sz); assert( rc==SQLITE_OK ); } From 30918bfb0beca65d8522308d374f9700161d286a Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 13 Sep 2021 16:36:20 +0000 Subject: [PATCH 049/130] Add new test file rtreedoc.test. FossilOrigin-Name: 8c4b1482eeb31856bce20eda1ce74959e19da11962f74d406a608747a92fe429 --- ext/rtree/rtreedoc.test | 257 ++++++++++++++++++++++++++++++++++++++++ manifest | 13 +- manifest.uuid | 2 +- 3 files changed, 265 insertions(+), 7 deletions(-) create mode 100644 ext/rtree/rtreedoc.test diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test new file mode 100644 index 0000000000..f8aeecedaa --- /dev/null +++ b/ext/rtree/rtreedoc.test @@ -0,0 +1,257 @@ +# 2021 September 13 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# The focus of this file is testing the r-tree extension. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] rtree_util.tcl] +source $testdir/tester.tcl +set testprefix rtreedoc + +# This command returns the number of columns in table $tbl within the +# database opened by database handle $db +proc column_count {db tbl} { + set nCol 0 + $db eval "PRAGMA table_info = $tbl" { incr nCol } + return $nCol +} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 3 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- + +# EVIDENCE-OF: R-15060-13876 A 1-dimensional R*Tree thus has 3 columns. +do_execsql_test 1.1.1 { CREATE VIRTUAL TABLE rt1 USING rtree(id, x1,x2) } +do_test 1.1.2 { column_count db rt1 } 3 + +# EVIDENCE-OF: R-19353-19546 A 2-dimensional R*Tree has 5 columns. +do_execsql_test 1.2.1 { CREATE VIRTUAL TABLE rt2 USING rtree(id,x1,x2, y1,y2) } +do_test 1.2.2 { column_count db rt2 } 5 + +# EVIDENCE-OF: R-13615-19528 A 3-dimensional R*Tree has 7 columns. +do_execsql_test 1.3.1 { + CREATE VIRTUAL TABLE rt3 USING rtree(id, x1,x2, y1,y2, z1,z2) +} +do_test 1.3.2 { column_count db rt3 } 7 + +# EVIDENCE-OF: R-53479-41922 A 4-dimensional R*Tree has 9 columns. +do_execsql_test 1.4.1 { + CREATE VIRTUAL TABLE rt4 USING rtree(id, x1,x2, y1,y2, z1,z2, v1,v2) +} +do_test 1.4.2 { column_count db rt4 } 9 + +# EVIDENCE-OF: R-13981-28768 And a 5-dimensional R*Tree has 11 columns. +do_execsql_test 1.5.1 { + CREATE VIRTUAL TABLE rt5 USING rtree(id, x1,x2, y1,y2, z1,z2, v1,v2, w1,w2) +} +do_test 1.5.2 { column_count db rt5 } 11 + + +# Attempt to create r-tree tables with 6 and 7 dimensions. +# +# EVIDENCE-OF: R-61533-25862 The SQLite R*Tree implementation does not +# support R*Trees wider than 5 dimensions. +do_catchsql_test 2.1.1 { + CREATE VIRTUAL TABLE rt6 USING rtree( + id, x1,x2, y1,y2, z1,z2, v1,v2, w1,w2, a1,a2 + ) +} {1 {Too many columns for an rtree table}} +do_catchsql_test 2.1.2 { + CREATE VIRTUAL TABLE rt6 USING rtree( + id, x1,x2, y1,y2, z1,z2, v1,v2, w1,w2, a1,a2, b1, b2 + ) +} {1 {Too many columns for an rtree table}} + +# Attempt to create r-tree tables with no columns, a single column, or +# an even number of columns. This and the tests above establish that: +# +# EVIDENCE-OF: R-16717-50504 Each R*Tree index is a virtual table with +# an odd number of columns between 3 and 11. +foreach {tn cols err} { + 1 "" "Too few columns for an rtree table" + 2 "x" "Too few columns for an rtree table" + 3 "x,y" "Too few columns for an rtree table" + 4 "a,b,c,d" "Wrong number of columns for an rtree table" + 5 "a,b,c,d,e,f" "Wrong number of columns for an rtree table" + 6 "a,b,c,d,e,f,g,h" "Wrong number of columns for an rtree table" + 7 "a,b,c,d,e,f,g,h,i,j" "Wrong number of columns for an rtree table" + 8 "a,b,c,d,e,f,g,h,i,j,k,l" "Too many columns for an rtree table" +} { + do_catchsql_test 3.$tn " + CREATE VIRTUAL TABLE xyz USING rtree($cols) + " [list 1 $err] +} + +# EVIDENCE-OF: R-46619-65417 The first column is always a 64-bit signed +# integer primary key. +# +# EVIDENCE-OF: R-46866-24036 It may only store a 64-bit signed integer +# value. +# +# EVIDENCE-OF: R-00250-64843 If an attempt is made to insert any other +# non-integer value into this column, the r-tree module silently +# converts it to an integer before writing it into the database. +# +do_execsql_test 4.0 { CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2) } +foreach {tn val res} { + 1 10 10 + 2 10.6 10 + 3 10.99 10 + 4 '123' 123 + 5 X'313233' 123 + 6 -10 -10 + 7 9223372036854775807 9223372036854775807 + 8 -9223372036854775808 -9223372036854775808 + 9 '9223372036854775807' 9223372036854775807 + 10 '-9223372036854775808' -9223372036854775808 + 11 'hello+world' 0 +} { + do_execsql_test 4.$tn.1 " + DELETE FROM rt; + INSERT INTO rt VALUES($val, 10, 20); + " + do_execsql_test 4.$tn.2 { + SELECT typeof(id), id FROM rt + } [list integer $res] +} + +# EVIDENCE-OF: R-15544-29079 Inserting a NULL value into this column +# causes SQLite to automatically generate a new unique primary key +# value. +do_execsql_test 5.1 { + DELETE FROM rt; + INSERT INTO rt VALUES(100, 1, 2); + INSERT INTO rt VALUES(NULL, 1, 2); +} +do_execsql_test 5.2 { SELECT id FROM rt } {100 101} +do_execsql_test 5.3 { + INSERT INTO rt VALUES(9223372036854775807, 1, 2); + INSERT INTO rt VALUES(NULL, 1, 2); +} +do_execsql_test 5.4 { + SELECT count(*) FROM rt; +} 4 +do_execsql_test 5.5 { + SELECT id IN(100, 101, 9223372036854775807) FROM rt ORDER BY 1; +} {0 1 1 1} + + +# EVIDENCE-OF: R-64317-38978 The other columns are pairs, one pair per +# dimension, containing the minimum and maximum values for that +# dimension, respectively. +# +# Show this by observing that attempts to insert rows with max>min fail. +# +do_execsql_test 6.1 { + CREATE VIRTUAL TABLE rtF USING rtree(id, x1,x2, y1,y2); + CREATE VIRTUAL TABLE rtI USING rtree_i32(id, x1,x2, y1,y2, z1,z2); +} +foreach {tn x1 x2 y1 y2 ok} { + 1 10.3 20.1 30.9 40.2 1 + 2 10.3 20.1 40.2 30.9 0 + 3 10.3 30.9 20.1 40.2 1 + 4 20.1 10.3 30.9 40.2 0 +} { + do_test 6.2.$tn { + catch { db eval { INSERT INTO rtF VALUES(NULL, $x1, $x2, $y1, $y2) } } + } [expr $ok==0] +} +foreach {tn x1 x2 y1 y2 z1 z2 ok} { + 1 10 20 30 40 50 60 1 + 2 10 20 30 40 60 50 0 + 3 10 20 30 50 40 60 1 + 4 10 20 40 30 50 60 0 + 5 10 30 20 40 50 60 1 + 6 20 10 30 40 50 60 0 +} { + do_test 6.3.$tn { + catch { db eval { INSERT INTO rtI VALUES(NULL,$x1,$x2,$y1,$y2,$z1,$z2) } } + } [expr $ok==0] +} + +# EVIDENCE-OF: R-08054-15429 The min/max-value pair columns are stored +# as 32-bit floating point values for "rtree" virtual tables or as +# 32-bit signed integers in "rtree_i32" virtual tables. +# +# Show this by showing that large values are rounded in ways consistent +# with those two 32-bit types. +do_execsql_test 7.1 { + DELETE FROM rtI; + INSERT INTO rtI VALUES( + 0, -2000000000, 2000000000, -5000000000, 5000000000, + -1000000000000, 10000000000000 + ); + SELECT * FROM rtI; +} { + 0 -2000000000 2000000000 -705032704 705032704 727379968 1316134912 +} +do_execsql_test 7.2 { + DELETE FROM rtF; + INSERT INTO rtF VALUES( + 0, -2000000000, 2000000000, + -1000000000000, 10000000000000 + ); + SELECT * FROM rtF; +} { + 0 -2000000000.0 2000000000.0 -1000000126976.0 10000000876544.0 +} + +# EVIDENCE-OF: R-47371-54529 Unlike regular SQLite tables which can +# store data in a variety of datatypes and formats, the R*Tree rigidly +# enforce these storage types. +# +# EVIDENCE-OF: R-39153-14977 If any other type of value is inserted into +# such a column, the r-tree module silently converts it to the required +# type before writing the new record to the database. +do_execsql_test 8.1 { + DELETE FROM rtI; + INSERT INTO rtI VALUES( + 1, 'hello world', X'616263', NULL, 44.5, 1000, 9999.9999 + ); + SELECT * FROM rtI; +} { + 1 0 0 0 44 1000 9999 +} + +do_execsql_test 8.2 { + SELECT + typeof(x1), typeof(x2), typeof(y1), typeof(y2), typeof(z1), typeof(z2) + FROM rtI +} {integer integer integer integer integer integer} + +do_execsql_test 8.3 { + DELETE FROM rtF; + INSERT INTO rtF VALUES( + 1, 'hello world', X'616263', NULL, 44 + ); + SELECT * FROM rtF; +} { + 1 0.0 0.0 0.0 44.0 +} +do_execsql_test 8.4 { + SELECT + typeof(x1), typeof(x2), typeof(y1), typeof(y2) + FROM rtF +} {real real real real} + + + + +#------------------------------------------------------------------------- + +finish_test + + diff --git a/manifest b/manifest index 4edb55e3db..5fe7aa9ace 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\scomment\sand\spossible\sinteger\soverflow\sin\spager\nresulting\sfrom\scheck-in\s[23ca23894af352ea].\s\sProblem\sreported\sby\n[forum:/forumpost/e2ea1a3f61|forum\spost\se2ea1a3f61].\s\sAlso\schange\nthe\sdatatype\sof\sPager.pageSize\sto\si64\seven\sthough\spage\ssize\snever\nexceeds\s65536,\sin\sorder\sto\shelp\sprevent\sfuture\sproblems\sof\sthis\skind. -D 2021-09-13T13:53:13.560 +C Add\snew\stest\sfile\srtreedoc.test. +D 2021-09-13T16:36:20.763 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,6 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d +F ext/rtree/rtreedoc.test 99e1bac95df108f3bdae6c09cd08c27eca20c20ed70d989a4df73799540305df F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1922,7 +1923,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 2dd61dd97b0326b59b0bc3c83b4d4b9acf811c5acae4d1003e7525ba7a26daf5 -R 66cc359b5bd82ddca4b6f4fbb9050fa7 -U drh -Z 3e25a183a096e34ec8d9ba775c31b648 +P f4a552ed9f4ab35520b634954c39748cc7bda535f426280b79da1b99f70599ac +R f99597bfa8634077950c96867f36ea09 +U dan +Z 062a262734dac9852988b18115d599fe diff --git a/manifest.uuid b/manifest.uuid index 98e404b1e5..ed943b18a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f4a552ed9f4ab35520b634954c39748cc7bda535f426280b79da1b99f70599ac \ No newline at end of file +8c4b1482eeb31856bce20eda1ce74959e19da11962f74d406a608747a92fe429 \ No newline at end of file From 82456a661d6f8ccde40c9bc685d3d67c303fbed9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 13 Sep 2021 18:16:15 +0000 Subject: [PATCH 050/130] Add assert() statements to refute [forum:/forumpost/9f4e7f58fbb66ddd|forum post 9f4e7f58fbb66ddd]. FossilOrigin-Name: 83a83475c5064ea62016a03e9173ecd2a1fec7f6296f1ee99896fa0a38b4196a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 3 +++ src/window.c | 3 +++ 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5fe7aa9ace..58efd916f7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\stest\sfile\srtreedoc.test. -D 2021-09-13T16:36:20.763 +C Add\sassert()\sstatements\sto\srefute\s\n[forum:/forumpost/9f4e7f58fbb66ddd|forum\spost\s9f4e7f58fbb66ddd]. +D 2021-09-13T18:16:15.976 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c b2c48dfc02b486fd2da2be1605503615958ba1997d40d994c2946975d0150a31 +F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 F src/shell.c.in 2c063d07127aa59e45806ae7911fa6963664901f9fdccfba71b926195d34be36 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -636,7 +636,7 @@ F src/where.c da3981a12e9eb5a71d32bab60ac1957fd4aa337aaea07ca8019b01f8788f442a F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 -F src/window.c 420167512050a0dfc0f0115b9f0c7d299da9759c9bb2ae83a61fb8d730a5707f +F src/window.c a5417de85a13e1f47bfb33c0bae5ae0ded5d68b146f4986c3d89d10a04f2c262 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 @@ -1923,7 +1923,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 f4a552ed9f4ab35520b634954c39748cc7bda535f426280b79da1b99f70599ac -R f99597bfa8634077950c96867f36ea09 -U dan -Z 062a262734dac9852988b18115d599fe +P 8c4b1482eeb31856bce20eda1ce74959e19da11962f74d406a608747a92fe429 +R 31122d38ddbc232dcbd8f2a1a089a76e +U drh +Z 2f8fa553907508fe78dd100f7c6194fd diff --git a/manifest.uuid b/manifest.uuid index ed943b18a2..530c60dd86 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c4b1482eeb31856bce20eda1ce74959e19da11962f74d406a608747a92fe429 \ No newline at end of file +83a83475c5064ea62016a03e9173ecd2a1fec7f6296f1ee99896fa0a38b4196a \ No newline at end of file diff --git a/src/select.c b/src/select.c index 78e5f5cf09..ba82d624d0 100644 --- a/src/select.c +++ b/src/select.c @@ -347,6 +347,9 @@ static void addWhereTerm( pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); + assert( pE2!=0 || pEq==0 ); /* Due to db->mallocFailed test + ** in sqlite3DbMallocRawNN() called from + ** sqlite3PExpr(). */ if( pEq && isOuterJoin ){ ExprSetProperty(pEq, EP_FromJoin); assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); diff --git a/src/window.c b/src/window.c index 4a05392ad8..423ad2db8a 100644 --- a/src/window.c +++ b/src/window.c @@ -1066,6 +1066,9 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ ("New window-function subquery in FROM clause of (%u/%p)\n", p->selId, p)); p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + assert( pSub!=0 || p->pSrc==0 ); /* Due to db->mallocFailed test inside + ** of sqlite3DbMallocRawNN() called from + ** sqlite3SrcListAppend() */ if( p->pSrc ){ Table *pTab2; p->pSrc->a[0].pSelect = pSub; From db45212a359affe91b323510fe735960bd67f07e Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 13 Sep 2021 18:32:02 +0000 Subject: [PATCH 051/130] Add test cases to rtreedoc.test. FossilOrigin-Name: 4ee99d315487a3aa09911191a74c6a12693784c5359243eb1396d8868566e80a --- ext/rtree/rtreedoc.test | 174 ++++++++++++++++++++++++++++++++++++++++ manifest | 14 ++-- manifest.uuid | 2 +- 3 files changed, 182 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index f8aeecedaa..b86ae81e91 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -27,11 +27,20 @@ proc column_count {db tbl} { return $nCol } +proc column_name_list {db tbl} { + set lCol [list] + $db eval "PRAGMA table_info = $tbl" { + lappend lCol $name + } + return $lCol +} + #------------------------------------------------------------------------- #------------------------------------------------------------------------- # Section 3 of documentation. #------------------------------------------------------------------------- #------------------------------------------------------------------------- +set testprefix rtreedoc-1 # EVIDENCE-OF: R-15060-13876 A 1-dimensional R*Tree thus has 3 columns. do_execsql_test 1.1.1 { CREATE VIRTUAL TABLE rt1 USING rtree(id, x1,x2) } @@ -251,6 +260,171 @@ do_execsql_test 8.4 { #------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 3.1 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-2 +reset_db + +foreach {tn name clist} { + 1 t1 "id x1 x2" + 2 t2 "id x1 x2 y1 y2 z1 z2" +} { +# EVIDENCE-OF: R-15142-18077 A new R*Tree index is created as follows: +# CREATE VIRTUAL TABLE USING rtree(); + do_execsql_test 1.$tn.1 " + CREATE VIRTUAL TABLE $name USING rtree([join $clist ,]) + " + +# EVIDENCE-OF: R-51698-09302 The is the name your +# application chooses for the R*Tree index and is a +# comma separated list of between 3 and 11 columns. + do_test 1.$tn.2 { column_name_list db $name } [list {*}$clist] + +# EVIDENCE-OF: R-50130-53472 The virtual table creates +# three shadow tables to actually store its content. + do_execsql_test 1.$tn.3 { + SELECT count(*) FROM sqlite_schema + } [expr 1+3] + +# EVIDENCE-OF: R-45256-35998 The names of these shadow tables are: +# _node _rowid _parent + do_execsql_test 1.$tn.4 { + SELECT name FROM sqlite_schema WHERE rootpage>0 ORDER BY 1 + } [list ${name}_node ${name}_parent ${name}_rowid] + + do_execsql_test 1.$tn.5 "DROP TABLE $name" +} + +# EVIDENCE-OF: R-11241-54478 As an example, consider creating a +# two-dimensional R*Tree index for use in spatial queries: CREATE +# VIRTUAL TABLE demo_index USING rtree( id, -- Integer primary key minX, +# maxX, -- Minimum and maximum X coordinate minY, maxY -- Minimum and +# maximum Y coordinate ); +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE demo_index USING rtree( + id, -- Integer primary key + minX, maxX, -- Minimum and maximum X coordinate + minY, maxY -- Minimum and maximum Y coordinate + ); + INSERT INTO demo_index VALUES(1,2,3,4,5); + INSERT INTO demo_index VALUES(6,7,8,9,10); +} + +# EVIDENCE-OF: R-02287-33529 The shadow tables are ordinary SQLite data +# tables. +# +# Ordinary tables. With ordinary sqlite_schema entries. +do_execsql_test 2.1 { + SELECT * FROM sqlite_schema WHERE sql NOT LIKE '%virtual%' +} { + table demo_index_rowid demo_index_rowid 2 + {CREATE TABLE "demo_index_rowid"(rowid INTEGER PRIMARY KEY,nodeno)} + table demo_index_node demo_index_node 3 + {CREATE TABLE "demo_index_node"(nodeno INTEGER PRIMARY KEY,data)} + table demo_index_parent demo_index_parent 4 + {CREATE TABLE "demo_index_parent"(nodeno INTEGER PRIMARY KEY,parentnode)} +} + +# EVIDENCE-OF: R-10863-13089 You can query them directly if you like, +# though this unlikely to reveal anything particularly useful. +# +# Querying: +do_execsql_test 2.2 { + SELECT count(*) FROM demo_index_node; + SELECT count(*) FROM demo_index_rowid; + SELECT count(*) FROM demo_index_parent; +} {1 2 0} + +# EVIDENCE-OF: R-05650-46070 And you can UPDATE, DELETE, INSERT or even +# DROP the shadow tables, though doing so will corrupt your R*Tree +# index. +do_execsql_test 2.3 { + DELETE FROM demo_index_rowid; + INSERT INTO demo_index_parent VALUES(2, 3); + UPDATE demo_index_node SET data = 'hello world' +} +do_catchsql_test 2.4 { + SELECT * FROM demo_index WHERE minX>10 AND maxX<30 +} {1 {database disk image is malformed}} +do_execsql_test 2.5 { + DROP TABLE demo_index_rowid +} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 3.1.1 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-3 +reset_db + +# EVIDENCE-OF: R-44253-50720 In the argments to "rtree" in the CREATE +# VIRTUAL TABLE statement, the names of the columns are taken from the +# first token of each argument. All subsequent tokens within each +# argument are silently ignored. +# +foreach {tn cols lCol} { + 1 {(id TEXT, x1 TEXT, x2 TEXT, y1 TEXT, y2 TEXT)} {id x1 x2 y1 y2} + 2 {(id TEXT, x1 UNIQUE, x2 TEXT, y1 NOT NULL, y2 TEXT)} {id x1 x2 y1 y2} + 3 {(id, x1 DEFAULT 4, x2 TEXT, y1 NOT NULL, y2 TEXT)} {id x1 x2 y1 y2} +} { + do_execsql_test 1.$tn.1 " CREATE VIRTUAL TABLE abc USING rtree $cols " + do_test 1.$tn.2 { column_name_list db abc } $lCol + +# EVIDENCE-OF: R-52032-06717 This means, for example, that if you try to +# give a column a type affinity or add a constraint such as UNIQUE or +# NOT NULL or DEFAULT to a column, those extra tokens are accepted as +# valid, but they do not change the behavior of the rtree. + + # Show there are no UNIQUE constraints + do_execsql_test 1.$tn.3 { + INSERT INTO abc VALUES(1, 10.0, 20.0, 10.0, 20.0); + INSERT INTO abc VALUES(2, 10.0, 20.0, 10.0, 20.0); + } + + # Show the default values have not been modified + do_execsql_test 1.$tn.4 { + INSERT INTO abc DEFAULT VALUES; + SELECT * FROM abc WHERE rowid NOT IN (1,2) + } {3 0.0 0.0 0.0 0.0} + + # Show that there are no NOT NULL constraints + do_execsql_test 1.$tn.5 { + INSERT INTO abc VALUES(NULL, NULL, NULL, NULL, NULL); + SELECT * FROM abc WHERE rowid NOT IN (1,2,3) + } {4 0.0 0.0 0.0 0.0} + +# EVIDENCE-OF: R-06893-30579 In an RTREE virtual table, the first column +# always has a type affinity of INTEGER and all other data columns have +# a type affinity of REAL. + do_execsql_test 1.$tn.5 { + INSERT INTO abc VALUES('5', '5', '5', '5', '5'); + SELECT * FROM abc WHERE rowid NOT IN (1,2,3,4) + } {5 5.0 5.0 5.0 5.0} + do_execsql_test 1.$tn.6 { + SELECT type FROM pragma_table_info('abc') ORDER BY cid + } {INT REAL REAL REAL REAL} + + do_execsql_test 1.$tn.7 " CREATE VIRTUAL TABLE abc2 USING rtree_i32 $cols " + +# EVIDENCE-OF: R-06224-52418 In an RTREE_I32 virtual table, all columns +# have type affinity of INTEGER. + do_execsql_test 1.$tn.8 { + INSERT INTO abc2 VALUES('6.0', '6.0', '6.0', '6.0', '6.0'); + SELECT * FROM abc2 + } {6 6 6 6 6} + do_execsql_test 1.$tn.9 { + SELECT type FROM pragma_table_info('abc2') ORDER BY cid + } {INT INT INT INT INT} + + + do_execsql_test 1.$tn.10 { + DROP TABLE abc; + DROP TABLE abc2; + } +} finish_test diff --git a/manifest b/manifest index 58efd916f7..72d785301b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sassert()\sstatements\sto\srefute\s\n[forum:/forumpost/9f4e7f58fbb66ddd|forum\spost\s9f4e7f58fbb66ddd]. -D 2021-09-13T18:16:15.976 +C Add\stest\scases\sto\srtreedoc.test. +D 2021-09-13T18:32:02.389 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,7 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 99e1bac95df108f3bdae6c09cd08c27eca20c20ed70d989a4df73799540305df +F ext/rtree/rtreedoc.test a1e5199edd7ddb1f3ac20b720f908cffe85cbaa28924c50415de09ce01b478b7 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1923,7 +1923,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 8c4b1482eeb31856bce20eda1ce74959e19da11962f74d406a608747a92fe429 -R 31122d38ddbc232dcbd8f2a1a089a76e -U drh -Z 2f8fa553907508fe78dd100f7c6194fd +P 83a83475c5064ea62016a03e9173ecd2a1fec7f6296f1ee99896fa0a38b4196a +R a1c3bdb5fd69f05f7096cf73daf4f563 +U dan +Z 525d49d8fabd36744cc1fce5e4c65380 diff --git a/manifest.uuid b/manifest.uuid index 530c60dd86..59e5b8af73 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83a83475c5064ea62016a03e9173ecd2a1fec7f6296f1ee99896fa0a38b4196a \ No newline at end of file +4ee99d315487a3aa09911191a74c6a12693784c5359243eb1396d8868566e80a \ No newline at end of file From d000785d405635704614a345877011427d7ea049 Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 13 Sep 2021 23:11:46 +0000 Subject: [PATCH 052/130] Shell to .read any named character source file/device (again.) FossilOrigin-Name: c6fe4f8d639db25f0a339f4071f0ae34b90dcfec8dcc2c571f969e2614a38e05 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 23 +++++++++++++---------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 72d785301b..14571b8c76 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sto\srtreedoc.test. -D 2021-09-13T18:32:02.389 +C Shell\sto\s.read\sany\snamed\scharacter\ssource\sfile/device\s(again.) +D 2021-09-13T23:11:46.739 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -546,7 +546,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 -F src/shell.c.in 2c063d07127aa59e45806ae7911fa6963664901f9fdccfba71b926195d34be36 +F src/shell.c.in 714fb58faf675ec7cc1b84a3e15a0791a6e2e376784c4f8d8ddf2135b64476ee F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1923,7 +1923,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 83a83475c5064ea62016a03e9173ecd2a1fec7f6296f1ee99896fa0a38b4196a -R a1c3bdb5fd69f05f7096cf73daf4f563 -U dan -Z 525d49d8fabd36744cc1fce5e4c65380 +P 4ee99d315487a3aa09911191a74c6a12693784c5359243eb1396d8868566e80a +R 885748239c9ba7ea32d59abcd4f96e9c +U larrybr +Z 606740ffbbc223c1ab0dc9aba575ab96 diff --git a/manifest.uuid b/manifest.uuid index 59e5b8af73..eb835cbb94 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4ee99d315487a3aa09911191a74c6a12693784c5359243eb1396d8868566e80a \ No newline at end of file +c6fe4f8d639db25f0a339f4071f0ae34b90dcfec8dcc2c571f969e2614a38e05 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index bf3bf97ed0..a5ebfda330 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -635,19 +635,22 @@ static int strlenChar(const char *z){ } /* -** Return true if zFile does not exist or if it is not an ordinary file. +** Return true if zFile does not exist or if it is not either +** an ordinary file or an openable character stream source. */ +static int notChrSource(const char *zFile){ #ifdef _WIN32 -# define notNormalFile(X) 0 + struct _stat x = {0}; + int rc = _stat(zFile, &x); +# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) #else -static int notNormalFile(const char *zFile){ - struct stat x; - int rc; - memset(&x, 0, sizeof(x)); - rc = stat(zFile, &x); - return rc || !S_ISREG(x.st_mode); -} + struct stat x = {0}; + int rc = stat(zFile, &x); +# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode)) #endif + return rc || !STAT_CHR_SRC(x.st_mode); +#undef STAT_CHR_SRC +} /* ** This routine reads a line of text from FILE in, stores @@ -9239,7 +9242,7 @@ static int do_meta_command(char *zLine, ShellState *p){ pclose(p->in); } #endif - }else if( notNormalFile(azArg[1]) || (p->in = fopen(azArg[1], "rb"))==0 ){ + }else if( notChrSource(azArg[1]) || (p->in = fopen(azArg[1], "rb"))==0 ){ utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); rc = 1; }else{ From 6962d78c4dc8d91630976d9447b55cc6cc7d954c Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 14 Sep 2021 11:27:20 +0000 Subject: [PATCH 053/130] Minor updates to rtreedoc.test. FossilOrigin-Name: b22c75e41ded29afd026b32b73b87f6427340a9ac1d46147db8edac20eb7beb5 --- ext/rtree/rtreedoc.test | 62 +++++++++++++++++++++++++++++++++++++++++ manifest | 14 +++++----- manifest.uuid | 2 +- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index b86ae81e91..93fab4ba7a 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -426,6 +426,68 @@ foreach {tn cols lCol} { } } +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 3.2 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-4 +reset_db + +# EVIDENCE-OF: R-36195-31555 The usual INSERT, UPDATE, and DELETE +# commands work on an R*Tree index just like on regular tables. +# +# Create a regular table and an rtree table. Perform INSERT, UPDATE and +# DELETE operations, then observe that the contents of the two tables +# are identical. +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2); + CREATE TABLE t1(id INTEGER PRIMARY KEY, x1 REAL, x2 REAL); +} +foreach {tn sql} { + 1 "INSERT INTO %TBL% VALUES(5, 11,12)" + 2 "INSERT INTO %TBL% VALUES(11, -11,14.5)" + 3 "UPDATE %TBL% SET x1=-99 WHERE id=11" + 4 "DELETE FROM %TBL% WHERE x2=14.5" + 5 "DELETE FROM %TBL%" +} { + set sql1 [string map {%TBL% rt} $sql] + set sql2 [string map {%TBL% t1} $sql] + do_execsql_test 1.$tn.0 $sql1 + do_execsql_test 1.$tn.1 $sql2 + + set data1 [execsql {SELECT * FROM rt ORDER BY 1}] + set data2 [execsql {SELECT * FROM t1 ORDER BY 1}] + + set res [expr {$data1==$data2}] + do_test 1.$tn.2 {set res} 1 +} + +# EVIDENCE-OF: R-56987-45305 +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE demo_index USING rtree( + id, -- Integer primary key + minX, maxX, -- Minimum and maximum X coordinate + minY, maxY -- Minimum and maximum Y coordinate + ); + + INSERT INTO demo_index VALUES + (28215, -80.781227, -80.604706, 35.208813, 35.297367), + (28216, -80.957283, -80.840599, 35.235920, 35.367825), + (28217, -80.960869, -80.869431, 35.133682, 35.208233), + (28226, -80.878983, -80.778275, 35.060287, 35.154446), + (28227, -80.745544, -80.555382, 35.130215, 35.236916), + (28244, -80.844208, -80.841988, 35.223728, 35.225471), + (28262, -80.809074, -80.682938, 35.276207, 35.377747), + (28269, -80.851471, -80.735718, 35.272560, 35.407925), + (28270, -80.794983, -80.728966, 35.059872, 35.161823), + (28273, -80.994766, -80.875259, 35.074734, 35.172836), + (28277, -80.876793, -80.767586, 35.001709, 35.101063), + (28278, -81.058029, -80.956375, 35.044701, 35.223812), + (28280, -80.844208, -80.841972, 35.225468, 35.227203), + (28282, -80.846382, -80.844193, 35.223972, 35.225655); +} + finish_test diff --git a/manifest b/manifest index 14571b8c76..2cd701cff0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Shell\sto\s.read\sany\snamed\scharacter\ssource\sfile/device\s(again.) -D 2021-09-13T23:11:46.739 +C Minor\supdates\sto\srtreedoc.test. +D 2021-09-14T11:27:20.759 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,7 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test a1e5199edd7ddb1f3ac20b720f908cffe85cbaa28924c50415de09ce01b478b7 +F ext/rtree/rtreedoc.test 8d17a759fa7ec2d5ee7adeea2e76730b73b85da3780f54c5f85a8f34c8a4e680 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1923,7 +1923,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 4ee99d315487a3aa09911191a74c6a12693784c5359243eb1396d8868566e80a -R 885748239c9ba7ea32d59abcd4f96e9c -U larrybr -Z 606740ffbbc223c1ab0dc9aba575ab96 +P c6fe4f8d639db25f0a339f4071f0ae34b90dcfec8dcc2c571f969e2614a38e05 +R 715a98323bbc975e7c4f1d1a5d2bcf0c +U dan +Z 982f83ec2a8a606749b6b709d36561e9 diff --git a/manifest.uuid b/manifest.uuid index eb835cbb94..0474beaba8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c6fe4f8d639db25f0a339f4071f0ae34b90dcfec8dcc2c571f969e2614a38e05 \ No newline at end of file +b22c75e41ded29afd026b32b73b87f6427340a9ac1d46147db8edac20eb7beb5 \ No newline at end of file From a2fef2f031079159492b723b6157a07fd6039f42 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 14 Sep 2021 14:16:36 +0000 Subject: [PATCH 054/130] Add test cases to rtreedoc.test. FossilOrigin-Name: b62de1269f17fcc944ff404a20c4f705ffe99c44d6c54f42c29e69753aac8092 --- ext/rtree/rtreedoc.test | 225 +++++++++++++++++++++++++++++++++++++++- manifest | 12 +-- manifest.uuid | 2 +- 3 files changed, 231 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index 93fab4ba7a..4df6e64df4 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -488,6 +488,229 @@ do_execsql_test 2.0 { (28282, -80.846382, -80.844193, 35.223972, 35.225655); } +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 3.3 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-5 +reset_db + + + + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 3.4 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-6 + +# EVIDENCE-OF: R-08327-00674 By default, coordinates are stored in an +# R*Tree using 32-bit floating point values. +# +# Show this by showing that rounding is consistent with 32-bit float +# rounding. +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree(id, a,b); +} +do_execsql_test 1.1 { + INSERT INTO rt VALUES(14, -1000000000000, 1000000000000); + SELECT * FROM rt; +} {14 -1000000126976.0 1000000126976.0} + +# EVIDENCE-OF: R-39127-51288 When a coordinate cannot be exactly +# represented by a 32-bit floating point number, the lower-bound +# coordinates are rounded down and the upper-bound coordinates are +# rounded up. +foreach {tn val} { + 1 100000000000 + 2 200000000000 + 3 300000000000 + 4 400000000000 + + 5 -100000000000 + 6 -200000000000 + 7 -300000000000 + 8 -400000000000 +} { + set val [expr $val] + do_execsql_test 2.$tn.0 {DELETE FROM rt} + do_execsql_test 2.$tn.1 {INSERT INTO rt VALUES(23, $val, $val)} + do_execsql_test 2.$tn.2 { + SELECT $val>=a, $val<=b, a!=b FROM rt + } {1 1 1} +} + +do_execsql_test 3.0 { + DROP TABLE rt; + CREATE VIRTUAL TABLE rt USING rtree(id, x1,x2, y1,y2); +} + +# EVIDENCE-OF: R-45870-62834 Thus, bounding boxes might be slightly +# larger than specified, but will never be any smaller. +foreach {tn x1 x2 y1 y2} { + 1 100000000000 200000000000 300000000000 400000000000 +} { + set val [expr $val] + do_execsql_test 3.$tn.0 {DELETE FROM rt} + do_execsql_test 3.$tn.1 {INSERT INTO rt VALUES(23, $x1, $x2, $y1, $y2)} + do_execsql_test 3.$tn.2 { + SELECT (x2-x1)*(y2-y1) >= ($x2-$x1)*($y2-$y1) FROM rt + } {1} +} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 3.5 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-7 +reset_db + +# EVIDENCE-OF: R-55979-39402 It is the nature of the Guttman R-Tree +# algorithm that any write might radically restructure the tree, and in +# the process change the scan order of the nodes. +# +# In the test below, the INSERT marked "THIS INSERT!!" does not affect +# the results of queries with an ORDER BY, but does affect the results +# of one without an ORDER BY. Therefore the INSERT changed the scan +# order. +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree(id, minX, maxX); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<51 + ) + INSERT INTO rt SELECT NULL, i%10, (i%10)+5 FROM s +} +do_execsql_test 1.1 { SELECT count(*) FROM rt_node } 1 +do_test 1.2 { + set res1 [db eval {SELECT * FROM rt WHERE maxX < 30}] + set res1o [db eval {SELECT * FROM rt WHERE maxX < 30 ORDER BY +id}] + + db eval { INSERT INTO rt VALUES(NULL, 50, 50) } ;# THIS INSERT!! + + set res2 [db eval {SELECT * FROM rt WHERE maxX < 30}] + set res2o [db eval {SELECT * FROM rt WHERE maxX < 30 ORDER BY +id}] + list [expr {$res1==$res2}] [expr {$res1o==$res2o}] +} {0 1} + +do_execsql_test 1.3 { SELECT count(*) FROM rt_node } 3 + +# EVIDENCE-OF: R-00683-48865 For this reason, it is not generally +# possible to modify the R-Tree in the middle of a query of the R-Tree. +# Attempts to do so will fail with a SQLITE_LOCKED "database table is +# locked" error. +# +# SQLITE_LOCKED==6 +# +do_test 1.4 { + set nCnt 3 + db eval { SELECT * FROM rt WHERE minX>0 AND maxX<12 } { + incr nCnt -1 + if {$nCnt==0} { + set rc [catch {db eval { + INSERT INTO rt VALUES(NULL, 51, 51); + }} msg] + set errorcode [db errorcode] + break + } + } + + list $errorcode $rc $msg +} {6 1 {database table is locked}} + +# EVIDENCE-OF: R-19740-29710 So, for example, suppose an application +# runs one query against an R-Tree like this: SELECT id FROM demo_index +# WHERE maxY>=35.0 AND minY<=35.0; Then for each "id" value +# returned, suppose the application creates an UPDATE statement like the +# following and binds the "id" value returned against the "?1" +# parameter: UPDATE demo_index SET maxY=maxY+0.5 WHERE id=?1; +# +# EVIDENCE-OF: R-52919-32711 Then the UPDATE might fail with an +# SQLITE_LOCKED error. +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE demo_index USING rtree( + id, -- Integer primary key + minX, maxX, -- Minimum and maximum X coordinate + minY, maxY -- Minimum and maximum Y coordinate + ); + INSERT INTO demo_index VALUES + (28215, -80.781227, -80.604706, 35.208813, 35.297367), + (28216, -80.957283, -80.840599, 35.235920, 35.367825), + (28217, -80.960869, -80.869431, 35.133682, 35.208233), + (28226, -80.878983, -80.778275, 35.060287, 35.154446); +} +do_test 2.1 { + db eval { SELECT id FROM demo_index WHERE maxY>=35.0 AND minY<=35.0 } { + set rc [catch { + db eval { UPDATE demo_index SET maxY=maxY+0.5 WHERE id=$id } + } msg] + set errorcode [db errorcode] + break + } + list $errorcode $rc $msg +} {6 1 {database table is locked}} + +# EVIDENCE-OF: R-32604-49843 Ordinary tables in SQLite are able to read +# and write at the same time. +# +do_execsql_test 3.0 { + CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c); + INSERT INTO x1 VALUES(1, 1, 1); + INSERT INTO x1 VALUES(2, 2, 2); + INSERT INTO x1 VALUES(3, 3, 3); + INSERT INTO x1 VALUES(4, 4, 4); +} +do_test 3.1 { + set res [list] + db eval { SELECT * FROM x1 } { + lappend res $a $b $c + switch -- $a { + 1 { + db eval { INSERT INTO x1 VALUES(5, 5, 5) } + } + 2 { + db eval { UPDATE x1 SET c=20 WHERE a=2 } + } + 3 { + db eval { DELETE FROM x1 WHERE c IN (3,4) } + } + } + } + set res +} {1 1 1 2 2 2 3 3 3 5 5 5} +do_execsql_test 3.2 { + SELECT * FROM x1 +} {1 1 1 2 2 20 5 5 5} + +# EVIDENCE-OF: R-06177-00576 And R-Tree can appear to read and write at +# the same time in some circumstances, if it can figure out how to +# reliably run the query to completion before starting the update. +# +# In 8.2, it can, it 8.1, it cannot. +do_test 8.1 { + db eval { SELECT * FROM rt } { + set rc [catch { db eval { INSERT INTO rt VALUES(53,53,53) } } msg] + break; + } + list $rc $msg +} {1 {database table is locked}} +do_test 8.2 { + db eval { SELECT * FROM rt ORDER BY +id } { + set rc [catch { db eval { INSERT INTO rt VALUES(53,53,53) } } msg] + break + } + list $rc $msg +} {0 {}} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 4 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-8 + + finish_test - diff --git a/manifest b/manifest index 2cd701cff0..f334d4989d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\supdates\sto\srtreedoc.test. -D 2021-09-14T11:27:20.759 +C Add\stest\scases\sto\srtreedoc.test. +D 2021-09-14T14:16:36.338 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,7 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 8d17a759fa7ec2d5ee7adeea2e76730b73b85da3780f54c5f85a8f34c8a4e680 +F ext/rtree/rtreedoc.test f42439945e7df07b37ea7fc74b6cba13aa785c1238d43d7b87774686e2c4c283 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1923,7 +1923,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 c6fe4f8d639db25f0a339f4071f0ae34b90dcfec8dcc2c571f969e2614a38e05 -R 715a98323bbc975e7c4f1d1a5d2bcf0c +P b22c75e41ded29afd026b32b73b87f6427340a9ac1d46147db8edac20eb7beb5 +R 1866a3f94f57729184dfa2515b8c64cb U dan -Z 982f83ec2a8a606749b6b709d36561e9 +Z 2dec751d84ad8354d68db627a51d0e4c diff --git a/manifest.uuid b/manifest.uuid index 0474beaba8..13e15991fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b22c75e41ded29afd026b32b73b87f6427340a9ac1d46147db8edac20eb7beb5 \ No newline at end of file +b62de1269f17fcc944ff404a20c4f705ffe99c44d6c54f42c29e69753aac8092 \ No newline at end of file From c0bd26a23a8a00cafeee8d6cad1b2f411777d692 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 14 Sep 2021 18:57:30 +0000 Subject: [PATCH 055/130] Update requirements marks to reflect recent documentation changes. FossilOrigin-Name: 08cab8921e670a0d1758b505fe8c7455f6194cec69d1b7b77de91688be1028a6 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/func.c | 10 +++++----- test/e_changes.test | 10 +++++----- test/e_expr.test | 10 +++++----- test/e_totalchanges.test | 7 +++---- 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index f334d4989d..52abddd787 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sto\srtreedoc.test. -D 2021-09-14T14:16:36.338 +C Update\srequirements\smarks\sto\sreflect\srecent\sdocumentation\schanges. +D 2021-09-14T18:57:30.913 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -500,7 +500,7 @@ F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c e98375fc63552cc8cdd36a41bdca3039cb603d9fe67abd9c9f40adae8405fbc5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c -F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c +F src/func.c 54b059e0f847ca48460e353fd96278f3179585c5cf9f0ee2eff01b449b4bb88d F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -854,12 +854,12 @@ F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145 F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14 -F test/e_changes.test fd66105385153dbf21fdb35eb8ef6c3e1eade579 +F test/e_changes.test 6ba336a796db32f890e50197ab6a8fe5e6017e431fc9082702c246120cd58d55 F test/e_createtable.test 7997c0106c181243e0ac7db7ba8b9ae7233d0bfb0188605650322a7a02ea326e F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 235c610f8bf8ec44513e222b9085c7e49fad65ad0c1975ac2577109dd06fd8fa F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 -F test/e_expr.test 6ba7a51ece7b3e7fc145f14f924eed25ebb5a24e7b8596c78f3838d372cf0385 +F test/e_expr.test e164550b9f8fd9c130283d1eae692dff9e2ba67f4dbd35f7325021f5d4b8851c F test/e_fkey.test 351c7b989e5aefcc339ef5fc78dc4738442bd247a392cd67d81c2881000c369e F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e @@ -867,7 +867,7 @@ F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a42 F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 F test/e_select.test c5425a423da06d0494119db8361ebfc6de302929f7546ca596d56224137e0360 F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f -F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 +F test/e_totalchanges.test 1daded1db6867991c10b53a18436b2602f41ad82a2b8c2e1ed5eb7d1ad15edaf F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 F test/e_uri.test 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72 F test/e_vacuum.test 0d8832a2ce92350db0d0cff47b419465fd9772562e1f77ff7d9478c07a4980d2 @@ -1923,7 +1923,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 b22c75e41ded29afd026b32b73b87f6427340a9ac1d46147db8edac20eb7beb5 -R 1866a3f94f57729184dfa2515b8c64cb -U dan -Z 2dec751d84ad8354d68db627a51d0e4c +P b62de1269f17fcc944ff404a20c4f705ffe99c44d6c54f42c29e69753aac8092 +R 37198e5ddf3da4758f4d4e62aeb19355 +U drh +Z 99b875f988ff2c6c7243066e6a647fe8 diff --git a/manifest.uuid b/manifest.uuid index 13e15991fe..6462d5e975 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b62de1269f17fcc944ff404a20c4f705ffe99c44d6c54f42c29e69753aac8092 \ No newline at end of file +08cab8921e670a0d1758b505fe8c7455f6194cec69d1b7b77de91688be1028a6 \ No newline at end of file diff --git a/src/func.c b/src/func.c index f79b541718..292db73e87 100644 --- a/src/func.c +++ b/src/func.c @@ -571,9 +571,9 @@ static void last_insert_rowid( /* ** Implementation of the changes() SQL function. ** -** IMP: R-62073-11209 The changes() SQL function is a wrapper -** around the sqlite3_changes64() C/C++ function and hence follows the same -** rules for counting changes. +** IMP: R-32760-32347 The changes() SQL function is a wrapper +** around the sqlite3_changes64() C/C++ function and hence follows the +** same rules for counting changes. */ static void changes( sqlite3_context *context, @@ -596,8 +596,8 @@ static void total_changes( ){ sqlite3 *db = sqlite3_context_db_handle(context); UNUSED_PARAMETER2(NotUsed, NotUsed2); - /* IMP: R-52756-41993 This function was a wrapper around the - ** sqlite3_total_changes() C/C++ interface. */ + /* IMP: R-11217-42568 This function is a wrapper around the + ** sqlite3_total_changes64() C/C++ interface. */ sqlite3_result_int64(context, sqlite3_total_changes64(db)); } diff --git a/test/e_changes.test b/test/e_changes.test index a77e22a2ee..9d49115b53 100644 --- a/test/e_changes.test +++ b/test/e_changes.test @@ -25,10 +25,10 @@ proc do_changes_test {tn sql res} { #-------------------------------------------------------------------------- -# EVIDENCE-OF: R-15996-49369 This function returns the number of rows -# modified, inserted or deleted by the most recently completed INSERT, -# UPDATE or DELETE statement on the database connection specified by the -# only parameter. +# EVIDENCE-OF: R-58361-29089 The changes() function returns the number +# of database rows that were changed or inserted or deleted by the most +# recently completed INSERT, DELETE, or UPDATE statement, exclusive of +# statements in lower-level triggers. # do_execsql_test 1.0 { CREATE TABLE t1(a, b); @@ -108,7 +108,7 @@ foreach {tn schema} { #-------------------------------------------------------------------------- -# EVIDENCE-OF: R-44877-05564 Executing any other type of SQL statement +# X-EVIDENCE-OF: R-44877-05564 Executing any other type of SQL statement # does not modify the value returned by this function. # reset_db diff --git a/test/e_expr.test b/test/e_expr.test index 242c503dc6..93ca0268c8 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -84,12 +84,12 @@ db func regexp -argcount 2 regexfunc # in the documentation exist and that the relative precedences of the # operators are also as the documentation suggests. # -# EVIDENCE-OF: R-15514-65163 SQLite understands the following binary +# X-EVIDENCE-OF: R-15514-65163 SQLite understands the following binary # operators, in order from highest to lowest precedence: || * / % + - # << >> & | < <= > >= = == != <> IS IS # NOT IN LIKE GLOB MATCH REGEXP AND OR # -# EVIDENCE-OF: R-38759-38789 Operators IS and IS NOT have the same +# X-EVIDENCE-OF: R-38759-38789 Operators IS and IS NOT have the same # precedence as =. # @@ -180,7 +180,7 @@ do_execsql_test e_expr-1.6 { # Check that the four unary prefix operators mentioned in the # documentation exist. # -# EVIDENCE-OF: R-13958-53419 Supported unary prefix operators are these: +# X-EVIDENCE-OF: R-13958-53419 Supported unary prefix operators are these: # - + ~ NOT # do_execsql_test e_expr-2.1 { SELECT - 10 } {-10} @@ -368,7 +368,7 @@ db collate reverse reverse_collate # EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix # operator that assigns a collating sequence to an expression. # -# EVIDENCE-OF: R-36231-30731 The COLLATE operator has a higher +# X-EVIDENCE-OF: R-36231-30731 The COLLATE operator has a higher # precedence (binds more tightly) than any binary operator and any unary # prefix operator except "~". # @@ -860,7 +860,7 @@ foreach {tn x expr res nEval} { } [list $nEval $res] } -# EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is +# X-EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is # the same as the precedence as operators == and != and LIKE and groups # left to right. # diff --git a/test/e_totalchanges.test b/test/e_totalchanges.test index ee163c914f..d1666acfa0 100644 --- a/test/e_totalchanges.test +++ b/test/e_totalchanges.test @@ -32,10 +32,9 @@ do_execsql_test 1.0 { #-------------------------------------------------------------------------- -# EVIDENCE-OF: R-65438-26258 This function returns the total number of -# rows inserted, modified or deleted by all INSERT, UPDATE or DELETE -# statements completed since the database connection was opened, -# including those executed as part of trigger programs. +# EVIDENCE-OF: R-38914-26427 The total_changes() function returns the +# number of row changes caused by INSERT, UPDATE or DELETE statements +# since the current database connection was opened. # # 1.1.*: different types of I/U/D statements, # 1.2.*: trigger programs. From f159323c42bea23298de9f10679b4de47faa7271 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 14 Sep 2021 20:07:58 +0000 Subject: [PATCH 056/130] Add test cases to rtreedoc.test. FossilOrigin-Name: afe0ec4d589d87a07c0daf3fc4de884b82a8bceed593ba4e44caa1cf033a6715 --- ext/rtree/rtreedoc.test | 413 ++++++++++++++++++++++++++++++++++++++++ manifest | 14 +- manifest.uuid | 2 +- 3 files changed, 421 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index 4df6e64df4..18ad89b0d0 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -509,6 +509,9 @@ set testprefix rtreedoc-6 # EVIDENCE-OF: R-08327-00674 By default, coordinates are stored in an # R*Tree using 32-bit floating point values. # +# EVIDENCE-OF: R-22000-53613 The default virtual table ("rtree") stores +# coordinates as single-precision (4-byte) floating point numbers. +# # Show this by showing that rounding is consistent with 32-bit float # rounding. do_execsql_test 1.0 { @@ -711,6 +714,416 @@ do_test 8.2 { #------------------------------------------------------------------------- set testprefix rtreedoc-8 +# EVIDENCE-OF: R-21062-30088 For the example above, one might create an +# auxiliary table as follows: CREATE TABLE demo_data( id INTEGER PRIMARY +# KEY, -- primary key objname TEXT, -- name of the object objtype TEXT, +# -- object type boundary BLOB -- detailed boundary of object ); +# +# One might. +# +do_execsql_test 1.0 { + CREATE TABLE demo_data( + id INTEGER PRIMARY KEY, -- primary key + objname TEXT, -- name of the object + objtype TEXT, -- object type + boundary BLOB -- detailed boundary of object + ); +} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 4.1 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-9 +reset_db + +# EVIDENCE-OF: R-46566-43213 Beginning with SQLite version 3.24.0 +# (2018-06-04), r-tree tables can have auxiliary columns that store +# arbitrary data. Auxiliary columns can be used in place of secondary +# tables such as "demo_data". +# +# EVIDENCE-OF: R-41287-48160 Auxiliary columns are marked with a "+" +# symbol before the column name. +# +# This interface cannot conveniently be used to prove anything about +# versions of SQLite prior to 3.24.0. +# +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rta USING rtree( + id, u1,u2, v1,v2, +aux + ); + + INSERT INTO rta(aux) VALUES(NULL); + INSERT INTO rta(aux) VALUES(45); + INSERT INTO rta(aux) VALUES(22.3); + INSERT INTO rta(aux) VALUES('hello'); + INSERT INTO rta(aux) VALUES(X'ABCD'); + + SELECT typeof(aux), quote(aux) FROM rta; +} { + null NULL + integer 45 + real 22.3 + text 'hello' + blob X'ABCD' +} + +# EVIDENCE-OF: R-30514-26093 Auxiliary columns must come after all of +# the coordinate boundary columns. +foreach {tn cols} { + 1 "id x1,x2, +extra, y1,y2" + 2 "extra, +id x1,x2, y1,y2" + 3 "id, x1,+x2, extra, y1,y2" +} { + do_catchsql_test 2.$tn " + CREATE VIRTUAL TABLE rrr USING rtree($cols) + " {1 {Auxiliary rtree columns must be last}} +} +do_catchsql_test 3.0 { + CREATE VIRTUAL TABLE rrr USING rtree(+id, extra, x1, x2); +} {1 {near "+": syntax error}} + +# EVIDENCE-OF: R-01280-03635 An RTREE table can have no more than 100 +# columns total. In other words, the count of columns including the +# integer primary key column, the coordinate boundary columns, and all +# auxiliary columns must be 100 or less. +do_catchsql_test 3.1 { + CREATE VIRTUAL TABLE r1 USING rtree(intid, u1,u2, + +c00, +c01, +c02, +c03, +c04, +c05, +c06, +c07, +c08, +c09, + +c10, +c11, +c12, +c13, +c14, +c15, +c16, +c17, +c18, +c19, + +c20, +c21, +c22, +c23, +c24, +c25, +c26, +c27, +c28, +c29, + +c30, +c31, +c32, +c33, +c34, +c35, +c36, +c37, +c38, +c39, + +c40, +c41, +c42, +c43, +c44, +c45, +c46, +c47, +c48, +c49, + +c50, +c51, +c52, +c53, +c54, +c55, +c56, +c57, +c58, +c59, + +c60, +c61, +c62, +c63, +c64, +c65, +c66, +c67, +c68, +c69, + +c70, +c71, +c72, +c73, +c74, +c75, +c76, +c77, +c78, +c79, + +c80, +c81, +c82, +c83, +c84, +c85, +c86, +c87, +c88, +c89, + +c90, +c91, +c92, +c93, +c94, +c95, +c96 + ); +} {0 {}} +do_catchsql_test 3.2 { + DROP TABLE r1; + CREATE VIRTUAL TABLE r1 USING rtree(intid, u1,u2, + +c00, +c01, +c02, +c03, +c04, +c05, +c06, +c07, +c08, +c09, + +c10, +c11, +c12, +c13, +c14, +c15, +c16, +c17, +c18, +c19, + +c20, +c21, +c22, +c23, +c24, +c25, +c26, +c27, +c28, +c29, + +c30, +c31, +c32, +c33, +c34, +c35, +c36, +c37, +c38, +c39, + +c40, +c41, +c42, +c43, +c44, +c45, +c46, +c47, +c48, +c49, + +c50, +c51, +c52, +c53, +c54, +c55, +c56, +c57, +c58, +c59, + +c60, +c61, +c62, +c63, +c64, +c65, +c66, +c67, +c68, +c69, + +c70, +c71, +c72, +c73, +c74, +c75, +c76, +c77, +c78, +c79, + +c80, +c81, +c82, +c83, +c84, +c85, +c86, +c87, +c88, +c89, + +c90, +c91, +c92, +c93, +c94, +c95, +c96, +c97 + ); +} {1 {Too many columns for an rtree table}} +do_catchsql_test 3.3 { + CREATE VIRTUAL TABLE r1 USING rtree(intid, u1,u2, v1,v2, + +c00, +c01, +c02, +c03, +c04, +c05, +c06, +c07, +c08, +c09, + +c10, +c11, +c12, +c13, +c14, +c15, +c16, +c17, +c18, +c19, + +c20, +c21, +c22, +c23, +c24, +c25, +c26, +c27, +c28, +c29, + +c30, +c31, +c32, +c33, +c34, +c35, +c36, +c37, +c38, +c39, + +c40, +c41, +c42, +c43, +c44, +c45, +c46, +c47, +c48, +c49, + +c50, +c51, +c52, +c53, +c54, +c55, +c56, +c57, +c58, +c59, + +c60, +c61, +c62, +c63, +c64, +c65, +c66, +c67, +c68, +c69, + +c70, +c71, +c72, +c73, +c74, +c75, +c76, +c77, +c78, +c79, + +c80, +c81, +c82, +c83, +c84, +c85, +c86, +c87, +c88, +c89, + +c90, +c91, +c92, +c93, +c94, + ); +} {0 {}} +do_catchsql_test 3.4 { + DROP TABLE r1; + CREATE VIRTUAL TABLE r1 USING rtree(intid, u1,u2, v1,v2, + +c00, +c01, +c02, +c03, +c04, +c05, +c06, +c07, +c08, +c09, + +c10, +c11, +c12, +c13, +c14, +c15, +c16, +c17, +c18, +c19, + +c20, +c21, +c22, +c23, +c24, +c25, +c26, +c27, +c28, +c29, + +c30, +c31, +c32, +c33, +c34, +c35, +c36, +c37, +c38, +c39, + +c40, +c41, +c42, +c43, +c44, +c45, +c46, +c47, +c48, +c49, + +c50, +c51, +c52, +c53, +c54, +c55, +c56, +c57, +c58, +c59, + +c60, +c61, +c62, +c63, +c64, +c65, +c66, +c67, +c68, +c69, + +c70, +c71, +c72, +c73, +c74, +c75, +c76, +c77, +c78, +c79, + +c80, +c81, +c82, +c83, +c84, +c85, +c86, +c87, +c88, +c89, + +c90, +c91, +c92, +c93, +c94, +c95, + ); +} {1 {Too many columns for an rtree table}} + +# EVIDENCE-OF: R-05552-15084 +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE demo_index2 USING rtree( + id, -- Integer primary key + minX, maxX, -- Minimum and maximum X coordinate + minY, maxY, -- Minimum and maximum Y coordinate + +objname TEXT, -- name of the object + +objtype TEXT, -- object type + +boundary BLOB -- detailed boundary of object + ); +} +do_execsql_test 4.1 { + CREATE VIRTUAL TABLE demo_index USING rtree( + id, -- Integer primary key + minX, maxX, -- Minimum and maximum X coordinate + minY, maxY -- Minimum and maximum Y coordinate + ); + CREATE TABLE demo_data( + id INTEGER PRIMARY KEY, -- primary key + objname TEXT, -- name of the object + objtype TEXT, -- object type + boundary BLOB -- detailed boundary of object + ); + + INSERT INTO demo_index2(id) VALUES(1); + INSERT INTO demo_index(id) VALUES(1); + INSERT INTO demo_data(id) VALUES(1); +} +do_test 4.2 { + catch { array unset R } + db eval {SELECT * FROM demo_index2} R { set r1 [array names R] } + catch { array unset R } + db eval {SELECT * FROM demo_index NATURAL JOIN demo_data } R { + set r2 [array names R] + } + expr {$r1==$r2} +} {1} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 4.1.1 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-9 +reset_db + +# EVIDENCE-OF: R-24021-02490 For auxiliary columns, only the name of the +# column matters. The type affinity is ignored. +# +# EVIDENCE-OF: R-39906-44154 Constraints such as NOT NULL, UNIQUE, +# REFERENCES, or CHECK are also ignored. +do_execsql_test 1.0 { PRAGMA foreign_keys = on } +foreach {tn auxcol nm} { + 1 "+extra INTEGER" extra + 2 "+extra TEXT" extra + 3 "+extra BLOB" extra + 4 "+extra REAL" extra + + 5 "+col NOT NULL" col + 6 "+col CHECK (col IS NOT NULL)" col + 7 "+col REFERENCES tbl(x)" col +} { + do_execsql_test 1.$tn.1 " + CREATE VIRTUAL TABLE rt USING rtree_i32(k, a,b, $auxcol) + " + + # Check that the aux column has no affinity. Or NOT NULL constraint. + # And that the aux column is the child key of an FK constraint. + # + do_execsql_test 1.$tn.2 " + INSERT INTO rt($nm) VALUES(NULL), (45), (-123.2), ('456'), (X'ABCD'); + SELECT typeof($nm), quote($nm) FROM rt; + " { + null NULL + integer 45 + real -123.2 + text '456' + blob X'ABCD' + } + + # Check that there is no UNIQUE constraint either. + # + do_execsql_test 1.$tn.3 " + INSERT INTO rt($nm) VALUES('xyz'), ('xyz'), ('xyz'); + " + + do_execsql_test 1.$tn.2 { + DROP TABLE rt + } +} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 5 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-10 + +# EVIDENCE-OF: R-21011-43790 If integer coordinates are desired, declare +# the table using "rtree_i32" instead: CREATE VIRTUAL TABLE intrtree +# USING rtree_i32(id,x0,x1,y0,y1,z0,z1); +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE intrtree USING rtree_i32(id,x0,x1,y0,y1,z0,z1); + INSERT INTO intrtree DEFAULT VALUES; + SELECT typeof(x0) FROM intrtree; +} {integer} + +# EVIDENCE-OF: R-09193-49806 An rtree_i32 stores coordinates as 32-bit +# signed integers. +# +# Show that coordinates are cast in a way consistent with casting to +# a signed 32-bit integer. +do_execsql_test 1.1 { + DELETE FROM intrtree; + INSERT INTO intrtree VALUES(333, + 1<<44, (1<<44)+1, + 10000000000, 10000000001, + -10000000001, -10000000000 + ); + SELECT * FROM intrtree; +} { + 333 0 1 1410065408 1410065409 -1410065409 -1410065408 +} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 7.1 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-11 +reset_db + +# This command assumes that the argument is a node blob for a 2 dimensional +# i32 r-tree table. It decodes and returns a list of cells from the node +# as a list. Each cell is itself a list of the following form: +# +# {$rowid $minX $maxX $minY $maxY} +# +# For internal (non-leaf) nodes, the rowid is replaced by the child node +# number. +# +proc rnode {aData} { + set nDim 2 + + set nData [string length $aData] + set nBytePerCell [expr (8 + 2*$nDim*4)] + binary scan [string range $aData 2 3] S nCell + + set res [list] + for {set i 0} {$i < $nCell} {incr i} { + set iOff [expr $i*$nBytePerCell+4] + set cell [string range $aData $iOff [expr $iOff+$nBytePerCell-1]] + binary scan $cell WIIII rowid x1 x2 y1 y2 + lappend res [list $rowid $x1 $x2 $y1 $y2] + } + + return $res +} + +# aData must be a node blob. This command returns true if the node contains +# rowid $rowid, or false otherwise. +# +proc rnode_contains {aData rowid} { + set L [rnode $aData] + foreach cell $L { + set r [lindex $cell 0] + if {$r==$rowid} { return 1 } + } + return 0 +} + +db function rnode rnode +db function rnode_contains rnode_contains + +foreach {tn nm} { + 1 x1 + 2 asdfghjkl + 3 hello_world +} { + do_execsql_test 1.$tn.1 " + CREATE VIRTUAL TABLE $nm USING rtree(a,b,c,d,e); + " + + # EVIDENCE-OF: R-37699-54000 This is their schema: CREATE TABLE + # %_node(nodeno INTEGER PRIMARY KEY, data BLOB) CREATE TABLE + # %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) CREATE TABLE + # %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER) + # + # EVIDENCE-OF: R-07489-10051 The "%" in the name of each shadow table is + # replaced by the name of the R*Tree virtual table. So, if the name of + # the R*Tree table is "xyz" then the three shadow tables would be + # "xyz_node", "xyz_parent", and "xyz_rowid". + do_execsql_test 1.$tn.2 { + SELECT sql FROM sqlite_schema WHERE name!=$nm ORDER BY 1 + } [string map [list % $nm] " + {CREATE TABLE \"%_node\"(nodeno INTEGER PRIMARY KEY,data)} + {CREATE TABLE \"%_parent\"(nodeno INTEGER PRIMARY KEY,parentnode)} + {CREATE TABLE \"%_rowid\"(rowid INTEGER PRIMARY KEY,nodeno)} + "] + + do_execsql_test 1.$tn "DROP TABLE $nm" +} + + +# EVIDENCE-OF: R-51070-59303 There is one entry in the %_node table for +# each R*Tree node. +# +# The following creates a 6 node r-tree structure. +# +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE r1 USING rtree_i32(i, x1,x2, y1,y2); + WITH t(i) AS ( + VALUES(1) UNION SELECT i+1 FROM t WHERE i<110 + ) + INSERT INTO r1 SELECT i, (i%10), (i%10)+2, (i%6), (i%7)+6 FROM t; +} +do_execsql_test 2.1 { + SELECT count(*) FROM r1_node; +} 6 + +do_execsql_test 2.2 { SELECT nodeno, rnode(data) FROM r1_node WHERE nodeno=1 } 6 + +# EVIDENCE-OF: R-27261-09153 All nodes other than the root have an entry +# in the %_parent shadow table that identifies the parent node. +# +# In this case nodes 2-6 are the children of node 1. +# +do_execsql_test 2.3 { + SELECT nodeno, parentnode FROM r1_parent +} {2 1 3 1 4 1 5 1 6 1} + +# EVIDENCE-OF: R-02358-35037 The %_rowid shadow table maps entry rowids +# to the node that contains that entry. +# +do_execsql_test 2.4 { + SELECT 'failed' FROM r1_rowid WHERE 0==rnode_contains( + (SELECT data FROM r1_node WHERE nodeno=r1_rowid.nodeno), rowid + ) +} +do_test 2.5 { + db eval { SELECT nodeno, data FROM r1_node WHERE nodeno!=1 } { + set L [rnode $data] + foreach cell $L { + set rowid [lindex $cell 0] + set rowid_nodeno 0 + db eval {SELECT nodeno AS rowid_nodeno FROM r1_rowid WHERE rowid=$rowid} { + break + } + if {$rowid_nodeno!=$nodeno} { error "data mismatch!" } + } + } +} {} + +# EVIDENCE-OF: R-65201-22208 Extra columns appended to the %_rowid table +# hold the content of auxiliary columns. +# +# EVIDENCE-OF: R-44161-28345 The names of these extra %_rowid columns +# are probably not the same as the actual auxiliary column names. +# +# In this case, the auxiliary columns are named "e1" and "e2". The +# extra %_rowid columns are named "a0" and "a1". +# +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE rtaux USING rtree(id, x1,x2, y1,y2, +e1, +e2); + SELECT sql FROM sqlite_schema WHERE name='rtaux_rowid'; +} { + {CREATE TABLE "rtaux_rowid"(rowid INTEGER PRIMARY KEY,nodeno,a0,a1)} +} +do_execsql_test 3.1 { + INSERT INTO rtaux(e1, e2) VALUES('hello', 'world'), (123, 456); +} +do_execsql_test 3.2 { + SELECT a0, a1 FROM rtaux_rowid; +} { + hello world 123 456 +} + finish_test diff --git a/manifest b/manifest index 52abddd787..c687e345fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\srequirements\smarks\sto\sreflect\srecent\sdocumentation\schanges. -D 2021-09-14T18:57:30.913 +C Add\stest\scases\sto\srtreedoc.test. +D 2021-09-14T20:07:58.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,7 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test f42439945e7df07b37ea7fc74b6cba13aa785c1238d43d7b87774686e2c4c283 +F ext/rtree/rtreedoc.test 96a8ba02be159e0c5609436088554a8334ae6915ed7c7c6d253d5805bc635797 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1923,7 +1923,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 b62de1269f17fcc944ff404a20c4f705ffe99c44d6c54f42c29e69753aac8092 -R 37198e5ddf3da4758f4d4e62aeb19355 -U drh -Z 99b875f988ff2c6c7243066e6a647fe8 +P 08cab8921e670a0d1758b505fe8c7455f6194cec69d1b7b77de91688be1028a6 +R 5be907d2a923f63a4c3d70b386c4aa09 +U dan +Z ea31cce18f18a49bc61bfa81b5109a46 diff --git a/manifest.uuid b/manifest.uuid index 6462d5e975..448b14da93 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -08cab8921e670a0d1758b505fe8c7455f6194cec69d1b7b77de91688be1028a6 \ No newline at end of file +afe0ec4d589d87a07c0daf3fc4de884b82a8bceed593ba4e44caa1cf033a6715 \ No newline at end of file From 5f835b78477781a7e8d12d47e8350751fc2a142b Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 15 Sep 2021 10:49:31 +0000 Subject: [PATCH 057/130] Ensure rtreedoc.test is not run for builds without the rtree extension. FossilOrigin-Name: 42dff223470e9c096b8486ef232ac41b70d0875d8ae07630bfaaea1515ffa8d0 --- ext/rtree/rtreedoc.test | 69 +++++++++++++++++++++++++++++++++++++++-- manifest | 12 +++---- manifest.uuid | 2 +- 3 files changed, 74 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index 18ad89b0d0..c19a336ae2 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -19,6 +19,11 @@ source [file join [file dirname [info script]] rtree_util.tcl] source $testdir/tester.tcl set testprefix rtreedoc +ifcapable !rtree { + finish_test + return +} + # This command returns the number of columns in table $tbl within the # database opened by database handle $db proc column_count {db tbl} { @@ -1067,8 +1072,6 @@ do_execsql_test 2.1 { SELECT count(*) FROM r1_node; } 6 -do_execsql_test 2.2 { SELECT nodeno, rnode(data) FROM r1_node WHERE nodeno=1 } 6 - # EVIDENCE-OF: R-27261-09153 All nodes other than the root have an entry # in the %_parent shadow table that identifies the parent node. # @@ -1124,6 +1127,68 @@ do_execsql_test 3.2 { hello world 123 456 } +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 7.2 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc-12 +reset_db +forcedelete test.db2 + +# EVIDENCE-OF: R-13571-45795 The scalar SQL function rtreecheck(R) or +# rtreecheck(S,R) runs an integrity check on the rtree table named R +# contained within database S. +# +# EVIDENCE-OF: R-36011-59963 The function returns a human-language +# description of any problems found, or the string 'ok' if everything is +# ok. +# +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt1 USING rtree(id, a, b); + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<200 + ) + INSERT INTO rt1 SELECT i, i, i FROM s; + + ATTACH 'test.db2' AS 'aux'; + CREATE VIRTUAL TABLE aux.rt1 USING rtree(id, a, b); + INSERT INTO aux.rt1 SELECT * FROM rt1; +} + +do_execsql_test 1.1.1 { SELECT rtreecheck('rt1'); } {ok} +do_execsql_test 1.1.2 { SELECT rtreecheck('main', 'rt1'); } {ok} +do_execsql_test 1.1.3 { SELECT rtreecheck('aux', 'rt1'); } {ok} +do_catchsql_test 1.1.4 { + SELECT rtreecheck('nosuchdb', 'rt1'); +} {1 {SQL logic error}} + +# Corrupt the table in database 'main': +do_execsql_test 1.2.1 { UPDATE rt1_node SET nodeno=21 WHERE nodeno=3; } +do_execsql_test 1.2.1 { SELECT rtreecheck('rt1')=='ok'; } {0} +do_execsql_test 1.2.2 { SELECT rtreecheck('main', 'rt1')=='ok'; } {0} +do_execsql_test 1.2.3 { SELECT rtreecheck('aux', 'rt1')=='ok'; } {1} +do_execsql_test 1.2.4 { UPDATE rt1_node SET nodeno=3 WHERE nodeno=21; } + +# Corrupt the table in database 'aux': +do_execsql_test 1.2.1 { UPDATE aux.rt1_node SET nodeno=21 WHERE nodeno=3; } +do_execsql_test 1.2.1 { SELECT rtreecheck('rt1')=='ok'; } {1} +do_execsql_test 1.2.2 { SELECT rtreecheck('main', 'rt1')=='ok'; } {1} +do_execsql_test 1.2.3 { SELECT rtreecheck('aux', 'rt1')=='ok'; } {0} +do_execsql_test 1.2.4 { UPDATE rt1_node SET nodeno=3 WHERE nodeno=21; } + +# EVIDENCE-OF: R-45759-33459 Example: To verify that an R*Tree named +# "demo_index" is well-formed and internally consistent, run: SELECT +# rtreecheck('demo_index'); +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE demo_index USING rtree(id, x1,x2, y1,y2); + INSERT INTO demo_index SELECT id, a, b, a, b FROM rt1; +} +do_execsql_test 2.1 { SELECT rtreecheck('demo_index') } {ok} +do_execsql_test 2.2 { + UPDATE demo_index_rowid SET nodeno=44 WHERE rowid=44; + SELECT rtreecheck('demo_index'); +} {{Found (44 -> 44) in %_rowid table, expected (44 -> 4)}} finish_test diff --git a/manifest b/manifest index c687e345fc..84ea4b1cdd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sto\srtreedoc.test. -D 2021-09-14T20:07:58.871 +C Ensure\srtreedoc.test\sis\snot\srun\sfor\sbuilds\swithout\sthe\srtree\sextension. +D 2021-09-15T10:49:31.090 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,7 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 96a8ba02be159e0c5609436088554a8334ae6915ed7c7c6d253d5805bc635797 +F ext/rtree/rtreedoc.test 91293ef6c10524d8c945ffc5be20732f62eb8b98f84615b44d46a20a74e9a561 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1923,7 +1923,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 08cab8921e670a0d1758b505fe8c7455f6194cec69d1b7b77de91688be1028a6 -R 5be907d2a923f63a4c3d70b386c4aa09 +P afe0ec4d589d87a07c0daf3fc4de884b82a8bceed593ba4e44caa1cf033a6715 +R 728a755bef19edd9fdf994a23836ae11 U dan -Z ea31cce18f18a49bc61bfa81b5109a46 +Z 0702556107dd7dc6065447ebc315749b diff --git a/manifest.uuid b/manifest.uuid index 448b14da93..4d51c72358 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -afe0ec4d589d87a07c0daf3fc4de884b82a8bceed593ba4e44caa1cf033a6715 \ No newline at end of file +42dff223470e9c096b8486ef232ac41b70d0875d8ae07630bfaaea1515ffa8d0 \ No newline at end of file From b01f1389f29d4d9d03cdf09300c393e871320b3c Mon Sep 17 00:00:00 2001 From: larrybr Date: Wed, 15 Sep 2021 11:15:03 +0000 Subject: [PATCH 058/130] Squelch needless narrowing warning. FossilOrigin-Name: 5540e6abc1a2a8540113ec9bfebe1fb78d6a044f45396dd1926b65ff17ff236b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 84ea4b1cdd..970d949d98 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\srtreedoc.test\sis\snot\srun\sfor\sbuilds\swithout\sthe\srtree\sextension. -D 2021-09-15T10:49:31.090 +C Squelch\sneedless\snarrowing\swarning. +D 2021-09-15T11:15:03.010 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -532,7 +532,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 1d22bb9081167b2e27a64bf49c7a22ad70b50dedeb78cf22cfe8d8370afa0be5 +F src/pager.c 1ba6a843148282895d800aa69919553079946ef9a198a97e5d7c64442d10ed4c F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -1923,7 +1923,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 afe0ec4d589d87a07c0daf3fc4de884b82a8bceed593ba4e44caa1cf033a6715 -R 728a755bef19edd9fdf994a23836ae11 -U dan -Z 0702556107dd7dc6065447ebc315749b +P 42dff223470e9c096b8486ef232ac41b70d0875d8ae07630bfaaea1515ffa8d0 +R cd2321accfa2a1c1c2cbd5bcccd763fe +U larrybr +Z 203491c4b5ae5f0ef9b8da4470751daa diff --git a/manifest.uuid b/manifest.uuid index 4d51c72358..157373a700 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -42dff223470e9c096b8486ef232ac41b70d0875d8ae07630bfaaea1515ffa8d0 \ No newline at end of file +5540e6abc1a2a8540113ec9bfebe1fb78d6a044f45396dd1926b65ff17ff236b \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index a72ae73ea4..87aaa163bd 100644 --- a/src/pager.c +++ b/src/pager.c @@ -6737,8 +6737,8 @@ int sqlite3PagerRefcount(Pager *pPager){ ** used by the pager and its associated cache. */ int sqlite3PagerMemUsed(Pager *pPager){ - int perPageSize = pPager->pageSize + pPager->nExtra + sizeof(PgHdr) - + 5*sizeof(void*); + int perPageSize = pPager->pageSize + pPager->nExtra + + (int)(sizeof(PgHdr) + 5*sizeof(void*)); return perPageSize*sqlite3PcachePagecount(pPager->pPCache) + sqlite3MallocSize(pPager) + pPager->pageSize; From 83569e2e9e3f747256fe6bf4d1d37e57caffb585 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Sep 2021 13:09:55 +0000 Subject: [PATCH 059/130] Simplify some of the corrupt shadow-table detection logic in rtree. FossilOrigin-Name: 0c4f37aa475bd4bd17c20c02ab2d9f63d0a6a08b0e2bbfa559f7b972ece6f4fc --- ext/rtree/rtree.c | 21 +-------------------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 28 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 4cd8ff3315..b591057189 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -666,18 +666,6 @@ static void nodeBlobReset(Rtree *pRtree){ } } -/* -** Check to see if pNode is the same as pParent or any of the parents -** of pParent. -*/ -static int nodeInParentChain(const RtreeNode *pNode, const RtreeNode *pParent){ - do{ - if( pNode==pParent ) return 1; - pParent = pParent->pParent; - }while( pParent ); - return 0; -} - /* ** Obtain a reference to an r-tree node. */ @@ -694,14 +682,7 @@ static int nodeAcquire( ** increase its reference count and return it. */ if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ - if( pParent && !pNode->pParent ){ - if( nodeInParentChain(pNode, pParent) ){ - RTREE_IS_CORRUPT(pRtree); - return SQLITE_CORRUPT_VTAB; - } - pParent->nRef++; - pNode->pParent = pParent; - }else if( pParent && pNode->pParent && pParent!=pNode->pParent ){ + if( pParent && pParent!=pNode->pParent ){ RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } diff --git a/manifest b/manifest index 970d949d98..f12ba13b64 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Squelch\sneedless\snarrowing\swarning. -D 2021-09-15T11:15:03.010 +C Simplify\ssome\sof\sthe\scorrupt\sshadow-table\sdetection\slogic\sin\srtree. +D 2021-09-15T13:09:55.282 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 0d1ef309e2bfbe469e3ee363ff9ea0420d5f7b9fcf15b5d9abb9d48a789c26f5 +F ext/rtree/rtree.c 494767ec24dd29582037a813e977a67738cfb6c83501c5e8cc9187f0427e5e84 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 42dff223470e9c096b8486ef232ac41b70d0875d8ae07630bfaaea1515ffa8d0 -R cd2321accfa2a1c1c2cbd5bcccd763fe -U larrybr -Z 203491c4b5ae5f0ef9b8da4470751daa +P 5540e6abc1a2a8540113ec9bfebe1fb78d6a044f45396dd1926b65ff17ff236b +R e97145a8fdfc31275c7c5f207f632c01 +U drh +Z 1c8b00346da6638e920bab0d18b60999 diff --git a/manifest.uuid b/manifest.uuid index 157373a700..f418cdaf07 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5540e6abc1a2a8540113ec9bfebe1fb78d6a044f45396dd1926b65ff17ff236b \ No newline at end of file +0c4f37aa475bd4bd17c20c02ab2d9f63d0a6a08b0e2bbfa559f7b972ece6f4fc \ No newline at end of file From 998e91034693fd394a1ef00ee3d8020db846f49a Mon Sep 17 00:00:00 2001 From: larrybr Date: Wed, 15 Sep 2021 14:48:02 +0000 Subject: [PATCH 060/130] Fix non-build for a test configuration FossilOrigin-Name: c9a4ab059050a83d811149ff196ff16ea9e4c301627482800982b87cd30ddbbc --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f12ba13b64..cfc7426a61 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\ssome\sof\sthe\scorrupt\sshadow-table\sdetection\slogic\sin\srtree. -D 2021-09-15T13:09:55.282 +C Fix\snon-build\sfor\sa\stest\sconfiguration +D 2021-09-15T14:48:02.836 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/shell.c.in 714fb58faf675ec7cc1b84a3e15a0791a6e2e376784c4f8d8ddf2135b64476e F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 4cb73cc4b9b7705ccfd5bdfb9c248a9772a90ba52f743dbab90d13123babe36b +F src/sqliteInt.h b62ee1fc9da3634616b969abe8b55fafcb540e4e7e5637ee2a2bb5fa477f4a38 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1923,7 +1923,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 5540e6abc1a2a8540113ec9bfebe1fb78d6a044f45396dd1926b65ff17ff236b -R e97145a8fdfc31275c7c5f207f632c01 -U drh -Z 1c8b00346da6638e920bab0d18b60999 +P 0c4f37aa475bd4bd17c20c02ab2d9f63d0a6a08b0e2bbfa559f7b972ece6f4fc +R 95a882d3b488c7d33842ae8cf3c458d0 +U larrybr +Z d4230adb6305c9ccf882c75e49e654d2 diff --git a/manifest.uuid b/manifest.uuid index f418cdaf07..d9bf78c939 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c4f37aa475bd4bd17c20c02ab2d9f63d0a6a08b0e2bbfa559f7b972ece6f4fc \ No newline at end of file +c9a4ab059050a83d811149ff196ff16ea9e4c301627482800982b87cd30ddbbc \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5308ca95c0..d10d02f749 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4985,7 +4985,7 @@ void sqlite3AutoLoadExtensions(sqlite3*); #endif #ifdef SQLITE_OMIT_VIRTUALTABLE -# define sqlite3VtabClear(Y) +# define sqlite3VtabClear(D,T) # define sqlite3VtabSync(X,Y) SQLITE_OK # define sqlite3VtabRollback(X) # define sqlite3VtabCommit(X) From f02c324bc19af3e3f5372ae8e58d0ac61da9f1ea Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 15 Sep 2021 15:53:01 +0000 Subject: [PATCH 061/130] Further updates to rtreedoc.test. FossilOrigin-Name: e66727837ddd5d1344c252323d52600b6138f5a2471f63d09b5a28ea2c22e595 --- ext/rtree/rtreedoc.test | 121 ++++++++++++++++++++++++++++++++++++++++ manifest | 14 ++--- manifest.uuid | 2 +- 3 files changed, 129 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index c19a336ae2..b2d37d6c1f 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -1023,8 +1023,23 @@ proc rnode_contains {aData rowid} { return 0 } +proc rnode_replace_cell {aData iCell cell} { + set aCell [binary format WIIII {*}$cell] + set nDim 2 + set nBytePerCell [expr (8 + 2*$nDim*4)] + set iOff [expr $iCell*$nBytePerCell+4] + + set aNew [binary format a*a*a* \ + [string range $aData 0 $iOff-1] \ + $aCell \ + [string range $aData $iOff+$nBytePerCell end] \ + ] + return $aNew +} + db function rnode rnode db function rnode_contains rnode_contains +db function rnode_replace_cell rnode_replace_cell foreach {tn nm} { 1 x1 @@ -1136,6 +1151,10 @@ set testprefix rtreedoc-12 reset_db forcedelete test.db2 +db function rnode rnode +db function rnode_contains rnode_contains +db function rnode_replace_cell rnode_replace_cell + # EVIDENCE-OF: R-13571-45795 The scalar SQL function rtreecheck(R) or # rtreecheck(S,R) runs an integrity check on the rtree table named R # contained within database S. @@ -1190,5 +1209,107 @@ do_execsql_test 2.2 { SELECT rtreecheck('demo_index'); } {{Found (44 -> 44) in %_rowid table, expected (44 -> 4)}} + +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE rt2 USING rtree_i32(id, a, b, c, d); + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<200 + ) + INSERT INTO rt2 SELECT i, i, i+2, i, i+2 FROM s; +} + +# EVIDENCE-OF: R-02555-31045 for each dimension, (coord1 <= coord2). +# +execsql BEGIN +do_test 3.1 { + set cell [ + lindex [execsql {SELECT rnode(data) FROM rt2_node WHERE nodeno=3}] 0 3 + ] + set cell [list [lindex $cell 0] \ + [lindex $cell 2] [lindex $cell 1] \ + [lindex $cell 3] [lindex $cell 4] \ + ] + execsql { + UPDATE rt2_node SET data=rnode_replace_cell(data, 3, $cell) WHERE nodeno=3 + } + execsql { SELECT rtreecheck('rt2') } +} {{Dimension 0 of cell 3 on node 3 is corrupt}} +execsql ROLLBACK + +# EVIDENCE-OF: R-13844-15873 unless the cell is on the root node, that +# the cell is bounded by the parent cell on the parent node. +# +execsql BEGIN +do_test 3.2 { + set cell [ + lindex [execsql {SELECT rnode(data) FROM rt2_node WHERE nodeno=3}] 0 3 + ] + lset cell 3 450 + lset cell 4 451 + execsql { + UPDATE rt2_node SET data=rnode_replace_cell(data, 3, $cell) WHERE nodeno=3 + } + execsql { SELECT rtreecheck('rt2') } +} {{Dimension 1 of cell 3 on node 3 is corrupt relative to parent}} +execsql ROLLBACK + +# EVIDENCE-OF: R-02505-03621 for leaf nodes, that there is an entry in +# the %_rowid table corresponding to the cell's rowid value that points +# to the correct node. +# +execsql BEGIN +do_test 3.3 { + execsql { + UPDATE rt2_rowid SET rowid=452 WHERE rowid=100 + } + execsql { SELECT rtreecheck('rt2') } +} {{Mapping (100 -> 6) missing from %_rowid table}} +execsql ROLLBACK + +# EVIDENCE-OF: R-50927-02218 for cells on non-leaf nodes, that there is +# an entry in the %_parent table mapping from the cell's child node to +# the node that it resides on. +# +execsql BEGIN +do_test 3.4.1 { + execsql { + UPDATE rt2_parent SET parentnode=123 WHERE nodeno=3 + } + execsql { SELECT rtreecheck('rt2') } +} {{Found (3 -> 123) in %_parent table, expected (3 -> 1)}} +execsql ROLLBACK +execsql BEGIN +do_test 3.4.2 { + execsql { + UPDATE rt2_parent SET nodeno=123 WHERE nodeno=3 + } + execsql { SELECT rtreecheck('rt2') } +} {{Mapping (3 -> 1) missing from %_parent table}} +execsql ROLLBACK + +# EVIDENCE-OF: R-23235-09153 That there are the same number of entries +# in the %_rowid table as there are leaf cells in the r-tree structure, +# and that there is a leaf cell that corresponds to each entry in the +# %_rowid table. +execsql BEGIN +do_test 3.5 { + execsql { INSERT INTO rt2_rowid VALUES(1000, 1000) } + execsql { SELECT rtreecheck('rt2') } +} {{Wrong number of entries in %_rowid table - expected 200, actual 201}} +execsql ROLLBACK + +# EVIDENCE-OF: R-62800-43436 That there are the same number of entries +# in the %_parent table as there are non-leaf cells in the r-tree +# structure, and that there is a non-leaf cell that corresponds to each +# entry in the %_parent table. +execsql BEGIN +do_test 3.6 { + execsql { INSERT INTO rt2_parent VALUES(1000, 1000) } + execsql { SELECT rtreecheck('rt2') } +} {{Wrong number of entries in %_parent table - expected 9, actual 10}} +execsql ROLLBACK + + + finish_test diff --git a/manifest b/manifest index cfc7426a61..ee491ae1c0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\snon-build\sfor\sa\stest\sconfiguration -D 2021-09-15T14:48:02.836 +C Further\supdates\sto\srtreedoc.test. +D 2021-09-15T15:53:01.779 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,7 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 91293ef6c10524d8c945ffc5be20732f62eb8b98f84615b44d46a20a74e9a561 +F ext/rtree/rtreedoc.test c914acfbb0b9ce23352c1d1218cb02ec0770db476af5e36d310a3a8d1950c5e1 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1923,7 +1923,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 0c4f37aa475bd4bd17c20c02ab2d9f63d0a6a08b0e2bbfa559f7b972ece6f4fc -R 95a882d3b488c7d33842ae8cf3c458d0 -U larrybr -Z d4230adb6305c9ccf882c75e49e654d2 +P c9a4ab059050a83d811149ff196ff16ea9e4c301627482800982b87cd30ddbbc +R 643f236de9623efc217e1a933b077826 +U dan +Z e83a55511fb15637419b1c82774942f2 diff --git a/manifest.uuid b/manifest.uuid index d9bf78c939..e1cf80a26e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c9a4ab059050a83d811149ff196ff16ea9e4c301627482800982b87cd30ddbbc \ No newline at end of file +e66727837ddd5d1344c252323d52600b6138f5a2471f63d09b5a28ea2c22e595 \ No newline at end of file From 04bd2c837bb8899944c5cae94b1b6142ce02e272 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Sep 2021 15:56:00 +0000 Subject: [PATCH 062/130] Add ALWAYS() macros on some unreachable branches in rtree. FossilOrigin-Name: 9123f680ae3100f4c781ac4f5b8afac49bb5d4231b5931ad112b1b615f22f613 --- ext/rtree/rtree.c | 28 ++++++++++++++++++++++------ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index b591057189..18ac3d9eb7 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -64,7 +64,11 @@ #endif int sqlite3GetToken(const unsigned char*,int*); /* In the SQLite core */ -#ifndef SQLITE_AMALGAMATION +/* +** If building separately, we will need some setup that is normally +** found in sqliteInt.h +*/ +#if !defined(SQLITE_AMALGAMATION) #include "sqlite3rtree.h" typedef sqlite3_int64 i64; typedef sqlite3_uint64 u64; @@ -77,7 +81,17 @@ typedef unsigned int u32; #if defined(NDEBUG) && defined(SQLITE_DEBUG) # undef NDEBUG #endif +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) #endif +#endif /* !defined(SQLITE_AMALGAMATION) */ #include #include @@ -1346,11 +1360,12 @@ static int nodeRowidIndex( */ static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode, int *piIndex){ RtreeNode *pParent = pNode->pParent; - if( pParent ){ + if( ALWAYS(pParent) ){ return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex); + }else{ + *piIndex = -1; + return SQLITE_OK; } - *piIndex = -1; - return SQLITE_OK; } /* @@ -1473,7 +1488,8 @@ static RtreeSearchPoint *rtreeSearchPointNew( pNew = rtreeEnqueue(pCur, rScore, iLevel); if( pNew==0 ) return 0; ii = (int)(pNew - pCur->aPoint) + 1; - if( iiaNode[ii]==0 ); pCur->aNode[ii] = pCur->aNode[0]; }else{ @@ -1534,7 +1550,7 @@ static void rtreeSearchPointPop(RtreeCursor *p){ if( p->bPoint ){ p->anQueue[p->sPoint.iLevel]--; p->bPoint = 0; - }else if( p->nPoint ){ + }else if( ALWAYS(p->nPoint) ){ p->anQueue[p->aPoint[0].iLevel]--; n = --p->nPoint; p->aPoint[0] = p->aPoint[n]; diff --git a/manifest b/manifest index ee491ae1c0..3ad3f1dacd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\supdates\sto\srtreedoc.test. -D 2021-09-15T15:53:01.779 +C Add\sALWAYS()\smacros\son\ssome\sunreachable\sbranches\sin\srtree. +D 2021-09-15T15:56:00.093 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 494767ec24dd29582037a813e977a67738cfb6c83501c5e8cc9187f0427e5e84 +F ext/rtree/rtree.c c9fa4fbe94b81cba5ef59bb29455f69883466acf18f42d4c4c4cbfb24b45e1c1 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 c9a4ab059050a83d811149ff196ff16ea9e4c301627482800982b87cd30ddbbc -R 643f236de9623efc217e1a933b077826 -U dan -Z e83a55511fb15637419b1c82774942f2 +P e66727837ddd5d1344c252323d52600b6138f5a2471f63d09b5a28ea2c22e595 +R a513462136e6f0bd93657ca06b3577a5 +U drh +Z 846aaeee8ebb566018839ebc85ef258d diff --git a/manifest.uuid b/manifest.uuid index e1cf80a26e..2872cd6f48 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e66727837ddd5d1344c252323d52600b6138f5a2471f63d09b5a28ea2c22e595 \ No newline at end of file +9123f680ae3100f4c781ac4f5b8afac49bb5d4231b5931ad112b1b615f22f613 \ No newline at end of file From 8038cb99b0b6cdaa67a7599224ac2e6b1fae9827 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Sep 2021 16:20:15 +0000 Subject: [PATCH 063/130] =?UTF-8?q?Fix=20the=20xBestIndex=20method=20on=20?= =?UTF-8?q?rtree=20so=20that=20it=20correctly=20recognizes=20that=20rowid?= =?UTF-8?q?=3D=3F=20works=20the=20same=20as=20id=3D=3F.?= FossilOrigin-Name: c74c07cc86443057d34284ae31eb68470741592b0e61072fd5e120e82919169b --- ext/rtree/rtree.c | 2 +- ext/rtree/rtreeA.test | 12 ++++++------ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 18ac3d9eb7..5a2062d562 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1986,7 +1986,7 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; if( bMatch==0 && p->usable - && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ + && p->iColumn<=0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ /* We have an equality constraint on the rowid. Use strategy 1. */ int jj; diff --git a/ext/rtree/rtreeA.test b/ext/rtree/rtreeA.test index 8344863df0..921ba0b510 100644 --- a/ext/rtree/rtreeA.test +++ b/ext/rtree/rtreeA.test @@ -145,7 +145,7 @@ populate_t1 do_test rtreeA-2.2.0 { truncate_node 1 200 } {} do_corruption_tests rtreeA-2.2 { 1 "SELECT * FROM t1" - 2 "SELECT * FROM t1 WHERE rowid=5" + 2 "SELECT * FROM t1 WHERE +rowid=5" 3 "INSERT INTO t1 VALUES(1000, 1, 2, 3, 4)" 4 "SELECT * FROM t1 WHERE x1<10 AND x2>12" } @@ -160,7 +160,7 @@ do_test rtreeA-3.1.0.1 { set_tree_depth t1 } {1} do_test rtreeA-3.1.0.2 { set_tree_depth t1 3 } {3} do_corruption_tests rtreeA-3.1 { 1 "SELECT * FROM t1" - 2 "SELECT * FROM t1 WHERE rowid=5" + 2 "SELECT * FROM t1 WHERE +rowid=5" 3 "INSERT INTO t1 VALUES(1000, 1, 2, 3, 4)" } @@ -171,7 +171,7 @@ do_execsql_test rtreeA-3.1.0.3 { do_test rtreeA-3.2.0 { set_tree_depth t1 1000 } {1000} do_corruption_tests rtreeA-3.2 { 1 "SELECT * FROM t1" - 2 "SELECT * FROM t1 WHERE rowid=5" + 2 "SELECT * FROM t1 WHERE +rowid=5" 3 "INSERT INTO t1 VALUES(1000, 1, 2, 3, 4)" } @@ -183,7 +183,7 @@ do_test rtreeA-3.3.0 { } {65535} do_corruption_tests rtreeA-3.3 { 1 "SELECT * FROM t1" - 2 "SELECT * FROM t1 WHERE rowid=5" + 2 "SELECT * FROM t1 WHERE +rowid=5" 3 "INSERT INTO t1 VALUES(1000, 1, 2, 3, 4)" } @@ -203,7 +203,7 @@ do_test rtreeA-4.1.0 { } {4000} do_corruption_tests rtreeA-4.1 { 1 "SELECT * FROM t1" - 2 "SELECT * FROM t1 WHERE rowid=5" + 2 "SELECT * FROM t1 WHERE +rowid=5" 3 "INSERT INTO t1 VALUES(1000, 1, 2, 3, 4)" 4 "SELECT * FROM t1 WHERE x1<10 AND x2>12" } @@ -216,7 +216,7 @@ create_t1 populate_t1 do_execsql_test rtreeA-5.1.0 { DELETE FROM t1_parent } {} do_corruption_tests rtreeA-5.1 { - 1 "DELETE FROM t1 WHERE rowid = 5" + 1 "DELETE FROM t1 WHERE +rowid = 5" 2 "DELETE FROM t1" } diff --git a/manifest b/manifest index 3ad3f1dacd..6454e97831 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sALWAYS()\smacros\son\ssome\sunreachable\sbranches\sin\srtree. -D 2021-09-15T15:56:00.093 +C Fix\sthe\sxBestIndex\smethod\son\srtree\sso\sthat\sit\scorrectly\srecognizes\sthat\nrowid=?\sworks\sthe\ssame\sas\sid=?. +D 2021-09-15T16:20:15.282 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c c9fa4fbe94b81cba5ef59bb29455f69883466acf18f42d4c4c4cbfb24b45e1c1 +F ext/rtree/rtree.c 28e41882843e1e8702e29c83c5cc94a6e5bf40c1046623922f4cd743740efcc9 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -404,7 +404,7 @@ F ext/rtree/rtree6.test 9ce3691c1aac43070a9f194f0ebf54372db346c5a82241fd11b525ed F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf -F ext/rtree/rtreeA.test ed2f1be9c06dde0b1ab93a95dd9e87eeaa02db2d30bcb4b9179b69ee3dc3319b +F ext/rtree/rtreeA.test c0d8e91e25052d5f3fbda17632ca843b82ca13c4181fb6000a0d63bd2d7e70ce F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 F ext/rtree/rtreeC.test c4bfa9a61c6788c03e4a9ce40ab2cfc6100982559effd9842d1b658e1d47aa5f F ext/rtree/rtreeD.test fe46aa7f012e137bd58294409b16c0d43976c3bb92c8f710481e577c4a1100dc @@ -1923,7 +1923,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 e66727837ddd5d1344c252323d52600b6138f5a2471f63d09b5a28ea2c22e595 -R a513462136e6f0bd93657ca06b3577a5 +P 9123f680ae3100f4c781ac4f5b8afac49bb5d4231b5931ad112b1b615f22f613 +R aa32b780c45fbdfaa5c4a0c43e497966 U drh -Z 846aaeee8ebb566018839ebc85ef258d +Z 5cf9ad391dbbe3a117e87c8cd398587f diff --git a/manifest.uuid b/manifest.uuid index 2872cd6f48..e3c694974d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9123f680ae3100f4c781ac4f5b8afac49bb5d4231b5931ad112b1b615f22f613 \ No newline at end of file +c74c07cc86443057d34284ae31eb68470741592b0e61072fd5e120e82919169b \ No newline at end of file From 750f2331c4322413fb0832748765b164b8844a77 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Sep 2021 19:13:24 +0000 Subject: [PATCH 064/130] Add more ALWAYS() macros on unreachable branches in rtree.c FossilOrigin-Name: fbba89dac9591c56da81bd0808910fbc64640f3ccfd95845ecab4d3aea46ca61 --- ext/rtree/rtree.c | 17 +++++++++++++---- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 5a2062d562..2a054b961d 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2239,12 +2239,19 @@ static int AdjustTree( ){ RtreeNode *p = pNode; int cnt = 0; + int rc; while( p->pParent ){ RtreeNode *pParent = p->pParent; RtreeCell cell; int iCell; - if( (++cnt)>1000 || nodeParentIndex(pRtree, p, &iCell) ){ + cnt++; + if( NEVER(cnt>100) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + rc = nodeParentIndex(pRtree, p, &iCell); + if( NEVER(rc!=SQLITE_OK) ){ RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -2628,11 +2635,12 @@ static int SplitNode( RtreeNode *pParent = pLeft->pParent; int iCell; rc = nodeParentIndex(pRtree, pLeft, &iCell); - if( rc==SQLITE_OK ){ + if( ALWAYS(rc==SQLITE_OK) ){ nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell); rc = AdjustTree(pRtree, pParent, &leftbbox); + assert( rc==SQLITE_OK ); } - if( rc!=SQLITE_OK ){ + if( NEVER(rc!=SQLITE_OK) ){ goto splitnode_out; } } @@ -2707,8 +2715,9 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ */ iNode = sqlite3_column_int64(pRtree->pReadParent, 0); for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent); - if( !pTest ){ + if( ALWAYS(pTest==0) ){ rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent); + assert( rc2==SQLITE_OK ); } } rc = sqlite3_reset(pRtree->pReadParent); diff --git a/manifest b/manifest index 6454e97831..38c31dcfa4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sxBestIndex\smethod\son\srtree\sso\sthat\sit\scorrectly\srecognizes\sthat\nrowid=?\sworks\sthe\ssame\sas\sid=?. -D 2021-09-15T16:20:15.282 +C Add\smore\sALWAYS()\smacros\son\sunreachable\sbranches\sin\srtree.c +D 2021-09-15T19:13:24.273 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 28e41882843e1e8702e29c83c5cc94a6e5bf40c1046623922f4cd743740efcc9 +F ext/rtree/rtree.c d106f223d23401ec353531de2429b41e6bc9dfba85049d2bd4dec0e0f44316b3 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 9123f680ae3100f4c781ac4f5b8afac49bb5d4231b5931ad112b1b615f22f613 -R aa32b780c45fbdfaa5c4a0c43e497966 +P c74c07cc86443057d34284ae31eb68470741592b0e61072fd5e120e82919169b +R 4923ac24d6c3e1ab46abc7fb252aa8ec U drh -Z 5cf9ad391dbbe3a117e87c8cd398587f +Z efd8646b80e7db2b7d1ed86dbeee5059 diff --git a/manifest.uuid b/manifest.uuid index e3c694974d..1132ef58d7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c74c07cc86443057d34284ae31eb68470741592b0e61072fd5e120e82919169b \ No newline at end of file +fbba89dac9591c56da81bd0808910fbc64640f3ccfd95845ecab4d3aea46ca61 \ No newline at end of file From 5f9c7ba9d879ad78d0c153165ac44c1bdfaafe5e Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Sep 2021 19:53:22 +0000 Subject: [PATCH 065/130] In rtree.c, remove an incorrect ALWAYS(). Add other ALWAYS() and NEVER(). FossilOrigin-Name: cbaac8878aac0623beb5af3bc79a5b1c0179213206fd658b8c4fcc3531889480 --- ext/rtree/rtree.c | 7 +++---- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 2a054b961d..8f81757ff2 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1691,7 +1691,7 @@ static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); int rc = SQLITE_OK; RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); - if( rc==SQLITE_OK && p ){ + if( rc==SQLITE_OK && ALWAYS(p) ){ *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); } return rc; @@ -1709,7 +1709,7 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); if( rc ) return rc; - if( p==0 ) return SQLITE_OK; + if( NEVER(p==0) ) return SQLITE_OK; if( i==0 ){ sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell)); }else if( i<=pRtree->nDim2 ){ @@ -2715,9 +2715,8 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ */ iNode = sqlite3_column_int64(pRtree->pReadParent, 0); for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent); - if( ALWAYS(pTest==0) ){ + if( pTest==0 ){ rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent); - assert( rc2==SQLITE_OK ); } } rc = sqlite3_reset(pRtree->pReadParent); diff --git a/manifest b/manifest index 38c31dcfa4..8361f120b0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\smore\sALWAYS()\smacros\son\sunreachable\sbranches\sin\srtree.c -D 2021-09-15T19:13:24.273 +C In\srtree.c,\sremove\san\sincorrect\sALWAYS().\s\sAdd\sother\sALWAYS()\sand\sNEVER(). +D 2021-09-15T19:53:22.421 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c d106f223d23401ec353531de2429b41e6bc9dfba85049d2bd4dec0e0f44316b3 +F ext/rtree/rtree.c 4470c4fd405c1ec35f7aac6ab0f59891f594683b0c4f83568ffddcef1dcf67b9 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 c74c07cc86443057d34284ae31eb68470741592b0e61072fd5e120e82919169b -R 4923ac24d6c3e1ab46abc7fb252aa8ec +P fbba89dac9591c56da81bd0808910fbc64640f3ccfd95845ecab4d3aea46ca61 +R 2c69388bcd2c3f1462a992a8816f99b5 U drh -Z efd8646b80e7db2b7d1ed86dbeee5059 +Z c5f4368b0b32f822020a893f9117fc36 diff --git a/manifest.uuid b/manifest.uuid index 1132ef58d7..466cb6a019 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbba89dac9591c56da81bd0808910fbc64640f3ccfd95845ecab4d3aea46ca61 \ No newline at end of file +cbaac8878aac0623beb5af3bc79a5b1c0179213206fd658b8c4fcc3531889480 \ No newline at end of file From c464ec67107b0655244073c2749b7e51d8625496 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 05:24:40 +0000 Subject: [PATCH 066/130] New ALWAYS() and assert() to mark unreachable branches in rtree.c. FossilOrigin-Name: f7ad73c49507c9436adc7fe1b865f801eefcc7ea6b3ba35e83e63029beb03016 --- ext/rtree/rtree.c | 7 ++++--- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 8f81757ff2..72623e0751 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2742,13 +2742,14 @@ static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ /* Remove the entry in the parent cell. */ rc = nodeParentIndex(pRtree, pNode, &iCell); - if( rc==SQLITE_OK ){ + if( ALWAYS(rc==SQLITE_OK) ){ pParent = pNode->pParent; pNode->pParent = 0; rc = deleteCell(pRtree, pParent, iCell, iHeight+1); + assert( rc==SQLITE_OK ); } rc2 = nodeRelease(pRtree, pParent); - if( rc==SQLITE_OK ){ + if( ALWAYS(rc==SQLITE_OK) ){ rc = rc2; } if( rc!=SQLITE_OK ){ @@ -2968,7 +2969,7 @@ static int rtreeInsertCell( } }else{ rc = AdjustTree(pRtree, pNode, pCell); - if( rc==SQLITE_OK ){ + if( ALWAYS(rc==SQLITE_OK) ){ if( iHeight==0 ){ rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode); }else{ diff --git a/manifest b/manifest index 8361f120b0..e29199bb75 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\srtree.c,\sremove\san\sincorrect\sALWAYS().\s\sAdd\sother\sALWAYS()\sand\sNEVER(). -D 2021-09-15T19:53:22.421 +C New\sALWAYS()\sand\sassert()\sto\smark\sunreachable\sbranches\sin\srtree.c. +D 2021-09-16T05:24:40.469 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 4470c4fd405c1ec35f7aac6ab0f59891f594683b0c4f83568ffddcef1dcf67b9 +F ext/rtree/rtree.c 7898027fcf24e9648755c84aee477a5cf36e56f783f55d02d053c0409d57b30a F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 fbba89dac9591c56da81bd0808910fbc64640f3ccfd95845ecab4d3aea46ca61 -R 2c69388bcd2c3f1462a992a8816f99b5 +P cbaac8878aac0623beb5af3bc79a5b1c0179213206fd658b8c4fcc3531889480 +R 37a433ae96b1c5a938d63509ab7d490e U drh -Z c5f4368b0b32f822020a893f9117fc36 +Z d12f96c6d48b6f5bf9c6c89486ebfbc1 diff --git a/manifest.uuid b/manifest.uuid index 466cb6a019..3251ebd008 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cbaac8878aac0623beb5af3bc79a5b1c0179213206fd658b8c4fcc3531889480 \ No newline at end of file +f7ad73c49507c9436adc7fe1b865f801eefcc7ea6b3ba35e83e63029beb03016 \ No newline at end of file From 162f153579172480555b67dd0d020ff38dff14e9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 07:32:24 +0000 Subject: [PATCH 067/130] Simplify the routine that attempts to estimate the size of an rtree index by looking at the sqlite_stat1 entry for the %_rowid table. FossilOrigin-Name: 06c329c17c2c2de8bc1ca7f3b0b929055675761a8be7a7e8b4a9fc5cca0d1679 --- ext/rtree/rtree.c | 14 ++------------ manifest | 13 ++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 72623e0751..fb11851073 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -3410,7 +3410,7 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ char *zSql; sqlite3_stmt *p; int rc; - i64 nRow = 0; + i64 nRow = RTREE_MIN_ROWEST; rc = sqlite3_table_column_metadata( db, pRtree->zDb, "sqlite_stat1",0,0,0,0,0,0 @@ -3427,20 +3427,10 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ if( rc==SQLITE_OK ){ if( sqlite3_step(p)==SQLITE_ROW ) nRow = sqlite3_column_int64(p, 0); rc = sqlite3_finalize(p); - }else if( rc!=SQLITE_NOMEM ){ - rc = SQLITE_OK; - } - - if( rc==SQLITE_OK ){ - if( nRow==0 ){ - pRtree->nRowEst = RTREE_DEFAULT_ROWEST; - }else{ - pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST); - } } sqlite3_free(zSql); } - + pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST); return rc; } diff --git a/manifest b/manifest index f303ec17eb..05ff5d8e17 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\svarious\sunreachable\sbranches\sin\srtree.c\swith\sALWAYS()\sor\sNEVER(). -D 2021-09-16T05:39:07.773 +C Simplify\sthe\sroutine\sthat\sattempts\sto\sestimate\sthe\ssize\sof\san\srtree\sindex\nby\slooking\sat\sthe\ssqlite_stat1\sentry\sfor\sthe\s%_rowid\stable. +D 2021-09-16T07:32:24.179 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 7898027fcf24e9648755c84aee477a5cf36e56f783f55d02d053c0409d57b30a +F ext/rtree/rtree.c 2b1b062db00ffe1c23b02a41bd87a41e7fa48045b117d1a018086bdff4307012 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,8 +1923,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 c74c07cc86443057d34284ae31eb68470741592b0e61072fd5e120e82919169b f7ad73c49507c9436adc7fe1b865f801eefcc7ea6b3ba35e83e63029beb03016 -R 37a433ae96b1c5a938d63509ab7d490e -T +closed f7ad73c49507c9436adc7fe1b865f801eefcc7ea6b3ba35e83e63029beb03016 +P 4fab9089868bbb05a192da09bc201f0a84c5b9bef39dcb063afc1d7658299fdd +R 928648a0ed48b62d45ae4ba163d95e7e U drh -Z 72919531593fe5f120dc25a5a4b2d7d0 +Z a20a445e37b9e3e0394873e1f6259d3c diff --git a/manifest.uuid b/manifest.uuid index 9299df9e26..158f7c62cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4fab9089868bbb05a192da09bc201f0a84c5b9bef39dcb063afc1d7658299fdd \ No newline at end of file +06c329c17c2c2de8bc1ca7f3b0b929055675761a8be7a7e8b4a9fc5cca0d1679 \ No newline at end of file From 11eb9c6a28f6cc2c18cf74995d75e31e39996bcc Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 12:33:53 +0000 Subject: [PATCH 068/130] Under SQLITE_DEBUG with PRAGMA vdbe_trace=ON, show an output line if the VDBE aborts for any reason. FossilOrigin-Name: 7e3d6810039ca4563aa68dfa3671f570792a10f75c8eea68aa7dfd02d17702ca --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 05ff5d8e17..60edd3a9d8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\sroutine\sthat\sattempts\sto\sestimate\sthe\ssize\sof\san\srtree\sindex\nby\slooking\sat\sthe\ssqlite_stat1\sentry\sfor\sthe\s%_rowid\stable. -D 2021-09-16T07:32:24.179 +C Under\sSQLITE_DEBUG\swith\sPRAGMA\svdbe_trace=ON,\sshow\san\soutput\sline\sif\sthe\nVDBE\saborts\sfor\sany\sreason. +D 2021-09-16T12:33:53.147 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -617,7 +617,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 3f27a1eae01c8bbbb8cdef2f26bd8e6a2a7db08106ef7c3dcc990787a5da6e86 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c 39755f468a623af5e805c65a9ad7edb7c45fd78239fd58a319c7db8dfacc302b +F src/vdbe.c a4b6736b22ccb9e875dea4350ea1666276500b4d6a27eed9c7d000faa1fea163 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1923,7 +1923,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 4fab9089868bbb05a192da09bc201f0a84c5b9bef39dcb063afc1d7658299fdd -R 928648a0ed48b62d45ae4ba163d95e7e +P 06c329c17c2c2de8bc1ca7f3b0b929055675761a8be7a7e8b4a9fc5cca0d1679 +R 6dfcd8ffaed19859d868ffff4b66b890 U drh -Z a20a445e37b9e3e0394873e1f6259d3c +Z b89610ebb549109e13a60adefcff4b4f diff --git a/manifest.uuid b/manifest.uuid index 158f7c62cd..2fe172b035 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -06c329c17c2c2de8bc1ca7f3b0b929055675761a8be7a7e8b4a9fc5cca0d1679 \ No newline at end of file +7e3d6810039ca4563aa68dfa3671f570792a10f75c8eea68aa7dfd02d17702ca \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5ac770c05c..e4995bbcf9 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -8367,6 +8367,11 @@ abort_due_to_error: rc = SQLITE_CORRUPT_BKPT; } assert( rc ); +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_VdbeTrace ){ + printf("ABORT-due-to-error. rc=%d\n", rc); + } +#endif if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){ sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); } From e73e957c1e15ab8a583f732122e06862219e950f Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 13:20:29 +0000 Subject: [PATCH 069/130] For ALTER TABLE RENAME COLUMN, do not try to filter virtual tables out of calls to sqlite_rename_column(). Let the function filter them itself. The WHERE clause can mistakenly let virtual tables through if the sqlite_schema table is corrupt. The sqlite_rename_column() function must deal with them. We might as well let it deal with them always. FossilOrigin-Name: 7c82b43b7cdb825f431d3a778f8b34e32666ccb3b067f1f2533d3b3dcca7bdc9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 60edd3a9d8..e9bd941a6a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Under\sSQLITE_DEBUG\swith\sPRAGMA\svdbe_trace=ON,\sshow\san\soutput\sline\sif\sthe\nVDBE\saborts\sfor\sany\sreason. -D 2021-09-16T12:33:53.147 +C For\sALTER\sTABLE\sRENAME\sCOLUMN,\sdo\snot\stry\sto\sfilter\svirtual\stables\sout\sof\ncalls\sto\ssqlite_rename_column().\s\sLet\sthe\sfunction\sfilter\sthem\sitself.\nThe\sWHERE\sclause\scan\smistakenly\slet\svirtual\stables\sthrough\sif\sthe\nsqlite_schema\stable\sis\scorrupt.\s\sThe\ssqlite_rename_column()\sfunction\smust\ndeal\swith\sthem.\s\sWe\smight\sas\swell\slet\sit\sdeal\swith\sthem\salways. +D 2021-09-16T13:20:29.202 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 38975b971a4c36dbcc8004c74b492213a851ab368d29238c531a22636508a5d4 +F src/alter.c a4e20094bb7e6ca5fa832779dc0b6aedfed4cab92144d3bc754fc6dfe6f26f34 F src/analyze.c abbaaf7dca79d1c31c713500324fc0b55bf3eeac5b7b07001452a3d0f210de4f F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -1923,7 +1923,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 06c329c17c2c2de8bc1ca7f3b0b929055675761a8be7a7e8b4a9fc5cca0d1679 -R 6dfcd8ffaed19859d868ffff4b66b890 +P 7e3d6810039ca4563aa68dfa3671f570792a10f75c8eea68aa7dfd02d17702ca +R 378205b2666eaba7b023c1032e333fa8 U drh -Z b89610ebb549109e13a60adefcff4b4f +Z 5124dd372b8dc8ce068a8819461c7507 diff --git a/manifest.uuid b/manifest.uuid index 2fe172b035..229bc51420 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7e3d6810039ca4563aa68dfa3671f570792a10f75c8eea68aa7dfd02d17702ca \ No newline at end of file +7c82b43b7cdb825f431d3a778f8b34e32666ccb3b067f1f2533d3b3dcca7bdc9 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index c059a62ecd..2e3b25b1de 100644 --- a/src/alter.c +++ b/src/alter.c @@ -647,8 +647,7 @@ void sqlite3AlterRenameColumn( "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " - " AND (type != 'index' OR tbl_name = %Q)" - " AND sql NOT LIKE 'create virtual%%'", + " AND (type != 'index' OR tbl_name = %Q)", zDb, zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, pTab->zName @@ -1498,7 +1497,7 @@ static void renameColumnFunc( sqlite3WalkSelect(&sWalker, pSelect); } if( rc!=SQLITE_OK ) goto renameColumnFunc_done; - }else if( ALWAYS(IsOrdinaryTable(sParse.pNewTable)) ){ + }else if( IsOrdinaryTable(sParse.pNewTable) ){ /* A regular table */ int bFKOnly = sqlite3_stricmp(zTable, sParse.pNewTable->zName); FKey *pFKey; From 86b262ecfaa2bc2817c5aa71f296fa0030914c9e Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 13:52:28 +0000 Subject: [PATCH 070/130] Back out a couple of ALWAYS() macros from [4fab9089868bbb05]. Test case added to TH3. FossilOrigin-Name: d26963a530ccbe36a174823d2f0bd7e06c6fca4f38ecdd04cd700c4000cc3719 --- ext/rtree/rtree.c | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index fb11851073..9882e72988 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2742,14 +2742,14 @@ static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ /* Remove the entry in the parent cell. */ rc = nodeParentIndex(pRtree, pNode, &iCell); - if( ALWAYS(rc==SQLITE_OK) ){ + if( rc==SQLITE_OK ){ pParent = pNode->pParent; pNode->pParent = 0; rc = deleteCell(pRtree, pParent, iCell, iHeight+1); assert( rc==SQLITE_OK ); } rc2 = nodeRelease(pRtree, pParent); - if( ALWAYS(rc==SQLITE_OK) ){ + if( rc==SQLITE_OK ){ rc = rc2; } if( rc!=SQLITE_OK ){ diff --git a/manifest b/manifest index e9bd941a6a..cc80ea1a86 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sALTER\sTABLE\sRENAME\sCOLUMN,\sdo\snot\stry\sto\sfilter\svirtual\stables\sout\sof\ncalls\sto\ssqlite_rename_column().\s\sLet\sthe\sfunction\sfilter\sthem\sitself.\nThe\sWHERE\sclause\scan\smistakenly\slet\svirtual\stables\sthrough\sif\sthe\nsqlite_schema\stable\sis\scorrupt.\s\sThe\ssqlite_rename_column()\sfunction\smust\ndeal\swith\sthem.\s\sWe\smight\sas\swell\slet\sit\sdeal\swith\sthem\salways. -D 2021-09-16T13:20:29.202 +C Back\sout\sa\scouple\sof\sALWAYS()\smacros\sfrom\s[4fab9089868bbb05].\s\sTest\scase\nadded\sto\sTH3. +D 2021-09-16T13:52:28.954 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 2b1b062db00ffe1c23b02a41bd87a41e7fa48045b117d1a018086bdff4307012 +F ext/rtree/rtree.c 0b29e4c22dc77624e6a34ad7bc2f4a87134c9f969181c8e810730eff3d6ecfcb F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 7e3d6810039ca4563aa68dfa3671f570792a10f75c8eea68aa7dfd02d17702ca -R 378205b2666eaba7b023c1032e333fa8 +P 7c82b43b7cdb825f431d3a778f8b34e32666ccb3b067f1f2533d3b3dcca7bdc9 +R bd2ea363c50ccc047d220f195374da1e U drh -Z 5124dd372b8dc8ce068a8819461c7507 +Z 3d12fcb6b240ab06f67671311946d4f3 diff --git a/manifest.uuid b/manifest.uuid index 229bc51420..9f6a2edd6b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c82b43b7cdb825f431d3a778f8b34e32666ccb3b067f1f2533d3b3dcca7bdc9 \ No newline at end of file +d26963a530ccbe36a174823d2f0bd7e06c6fca4f38ecdd04cd700c4000cc3719 \ No newline at end of file From eb56e2905360d199dc48f352cb155e3080c38a16 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 14:07:09 +0000 Subject: [PATCH 071/130] Mark an unreachable branch in rtree. FossilOrigin-Name: e6c4afd5b365b8dea8c0742352a09029da0f9715dd2407d4ccf53f1e0a4ce625 --- ext/rtree/rtree.c | 5 ++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 9882e72988..8e1eddc1f2 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1908,8 +1908,11 @@ static int rtreeFilter( } if( rc==SQLITE_OK ){ RtreeSearchPoint *pNew; + assert( pCsr->bPoint==0 ); /* Due to the resetCursor() call above */ pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1)); - if( pNew==0 ) return SQLITE_NOMEM; + if( NEVER(pNew==0) ){ /* Because pCsr->bPoint was FALSE */ + return SQLITE_NOMEM; + } pNew->id = 1; pNew->iCell = 0; pNew->eWithin = PARTLY_WITHIN; diff --git a/manifest b/manifest index cc80ea1a86..a7780cc0b2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\sa\scouple\sof\sALWAYS()\smacros\sfrom\s[4fab9089868bbb05].\s\sTest\scase\nadded\sto\sTH3. -D 2021-09-16T13:52:28.954 +C Mark\san\sunreachable\sbranch\sin\srtree. +D 2021-09-16T14:07:09.331 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 0b29e4c22dc77624e6a34ad7bc2f4a87134c9f969181c8e810730eff3d6ecfcb +F ext/rtree/rtree.c 0b6aa4fc1b4529c84c9d62702b28aa2b59bed87696cdec9bb83612b7fbc6ec8d F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 7c82b43b7cdb825f431d3a778f8b34e32666ccb3b067f1f2533d3b3dcca7bdc9 -R bd2ea363c50ccc047d220f195374da1e +P d26963a530ccbe36a174823d2f0bd7e06c6fca4f38ecdd04cd700c4000cc3719 +R 46d60b2ce92f695e97622b11cd163c23 U drh -Z 3d12fcb6b240ab06f67671311946d4f3 +Z bd29d46e35cb4f2d20bb44fb2445a352 diff --git a/manifest.uuid b/manifest.uuid index 9f6a2edd6b..e0e0600d9b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d26963a530ccbe36a174823d2f0bd7e06c6fca4f38ecdd04cd700c4000cc3719 \ No newline at end of file +e6c4afd5b365b8dea8c0742352a09029da0f9715dd2407d4ccf53f1e0a4ce625 \ No newline at end of file From bea28c73a3c8a1372488ba8f35411f0f17f1c15f Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 16 Sep 2021 14:17:14 +0000 Subject: [PATCH 072/130] Add a reference counter to a structure used internally by the Tcl interface so that it does not segfault if the database connection is closed from any of the various callback scripts that may be invoked. FossilOrigin-Name: e54a33ce56432b23947583d34cf12fc64a55bbc49eb77c7f33cff5926df51070 --- manifest | 16 +++--- manifest.uuid | 2 +- src/tclsqlite.c | 130 ++++++++++++++++++++++++++------------------ test/tclsqlite.test | 36 ++++++++++++ 4 files changed, 123 insertions(+), 61 deletions(-) diff --git a/manifest b/manifest index a7780cc0b2..022a259127 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\san\sunreachable\sbranch\sin\srtree. -D 2021-09-16T14:07:09.331 +C Add\sa\sreference\scounter\sto\sa\sstructure\sused\sinternally\sby\sthe\sTcl\sinterface\sso\sthat\sit\sdoes\snot\ssegfault\sif\sthe\sdatabase\sconnection\sis\sclosed\sfrom\sany\sof\sthe\svarious\scallback\sscripts\sthat\smay\sbe\sinvoked. +D 2021-09-16T14:17:14.659 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/sqliteInt.h b62ee1fc9da3634616b969abe8b55fafcb540e4e7e5637ee2a2bb5fa477f4a F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 05663f6b5010b044eac0ef22fc8fb5ea3406d2502700a898261683258042c88b +F src/tclsqlite.c 428e813dabf82804bc13196af35a0c3c6ef4347fe557fa6717c5c66bba6e8520 F src/test1.c 63761c2be2607f1b425fde991beda48aed384f8d67f2b4ee549174c88b433009 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1449,7 +1449,7 @@ F test/tabfunc01.test d6821e7042e5653104dac0c63d75eff24a2415ab1889fc68b5db7fde59 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 316c96f974f0e6d7480186e3f5bb53413e5ee5480596544a97484888912a365c +F test/tclsqlite.test 97cda6e4843e9f3e06c56f656d9b77ee0178fe1ee33fb09a6eeae8f125757ac1 F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1923,7 +1923,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 d26963a530ccbe36a174823d2f0bd7e06c6fca4f38ecdd04cd700c4000cc3719 -R 46d60b2ce92f695e97622b11cd163c23 -U drh -Z bd29d46e35cb4f2d20bb44fb2445a352 +P e6c4afd5b365b8dea8c0742352a09029da0f9715dd2407d4ccf53f1e0a4ce625 +R 2bba8a7e10b47ebc6a75449daec54256 +U dan +Z 6227cb06cae79681b47e5b13e50e774e diff --git a/manifest.uuid b/manifest.uuid index e0e0600d9b..ad44cfcfeb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e6c4afd5b365b8dea8c0742352a09029da0f9715dd2407d4ccf53f1e0a4ce625 \ No newline at end of file +e54a33ce56432b23947583d34cf12fc64a55bbc49eb77c7f33cff5926df51070 \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 8874ab7699..b9b78b42b9 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -181,6 +181,7 @@ struct SqliteDb { int nVMStep; /* Another statistic for most recent operation */ int nTransaction; /* Number of nested [transaction] methods */ int openFlags; /* Flags used to open. (SQLITE_OPEN_URI) */ + int nRef; /* Delete object when this reaches 0 */ #ifdef SQLITE_TEST int bLegacyPrepare; /* True to use sqlite3_prepare() */ #endif @@ -517,64 +518,84 @@ static void flushStmtCache(SqliteDb *pDb){ pDb->stmtList = 0; } +/* +** Increment the reference counter on the SqliteDb object. The reference +** should be released by calling delDatabaseRef(). +*/ +static void addDatabaseRef(SqliteDb *pDb){ + pDb->nRef++; +} + +/* +** Decrement the reference counter associated with the SqliteDb object. +** If it reaches zero, delete the object. +*/ +static void delDatabaseRef(SqliteDb *pDb){ + assert( pDb->nRef>0 ); + pDb->nRef--; + if( pDb->nRef==0 ){ + flushStmtCache(pDb); + closeIncrblobChannels(pDb); + sqlite3_close(pDb->db); + while( pDb->pFunc ){ + SqlFunc *pFunc = pDb->pFunc; + pDb->pFunc = pFunc->pNext; + assert( pFunc->pDb==pDb ); + Tcl_DecrRefCount(pFunc->pScript); + Tcl_Free((char*)pFunc); + } + while( pDb->pCollate ){ + SqlCollate *pCollate = pDb->pCollate; + pDb->pCollate = pCollate->pNext; + Tcl_Free((char*)pCollate); + } + if( pDb->zBusy ){ + Tcl_Free(pDb->zBusy); + } + if( pDb->zTrace ){ + Tcl_Free(pDb->zTrace); + } + if( pDb->zTraceV2 ){ + Tcl_Free(pDb->zTraceV2); + } + if( pDb->zProfile ){ + Tcl_Free(pDb->zProfile); + } + if( pDb->zBindFallback ){ + Tcl_Free(pDb->zBindFallback); + } + if( pDb->zAuth ){ + Tcl_Free(pDb->zAuth); + } + if( pDb->zNull ){ + Tcl_Free(pDb->zNull); + } + if( pDb->pUpdateHook ){ + Tcl_DecrRefCount(pDb->pUpdateHook); + } + if( pDb->pPreUpdateHook ){ + Tcl_DecrRefCount(pDb->pPreUpdateHook); + } + if( pDb->pRollbackHook ){ + Tcl_DecrRefCount(pDb->pRollbackHook); + } + if( pDb->pWalHook ){ + Tcl_DecrRefCount(pDb->pWalHook); + } + if( pDb->pCollateNeeded ){ + Tcl_DecrRefCount(pDb->pCollateNeeded); + } + Tcl_Free((char*)pDb); + } +} + /* ** TCL calls this procedure when an sqlite3 database command is ** deleted. */ static void SQLITE_TCLAPI DbDeleteCmd(void *db){ SqliteDb *pDb = (SqliteDb*)db; - flushStmtCache(pDb); - closeIncrblobChannels(pDb); - sqlite3_close(pDb->db); - while( pDb->pFunc ){ - SqlFunc *pFunc = pDb->pFunc; - pDb->pFunc = pFunc->pNext; - assert( pFunc->pDb==pDb ); - Tcl_DecrRefCount(pFunc->pScript); - Tcl_Free((char*)pFunc); - } - while( pDb->pCollate ){ - SqlCollate *pCollate = pDb->pCollate; - pDb->pCollate = pCollate->pNext; - Tcl_Free((char*)pCollate); - } - if( pDb->zBusy ){ - Tcl_Free(pDb->zBusy); - } - if( pDb->zTrace ){ - Tcl_Free(pDb->zTrace); - } - if( pDb->zTraceV2 ){ - Tcl_Free(pDb->zTraceV2); - } - if( pDb->zProfile ){ - Tcl_Free(pDb->zProfile); - } - if( pDb->zBindFallback ){ - Tcl_Free(pDb->zBindFallback); - } - if( pDb->zAuth ){ - Tcl_Free(pDb->zAuth); - } - if( pDb->zNull ){ - Tcl_Free(pDb->zNull); - } - if( pDb->pUpdateHook ){ - Tcl_DecrRefCount(pDb->pUpdateHook); - } - if( pDb->pPreUpdateHook ){ - Tcl_DecrRefCount(pDb->pPreUpdateHook); - } - if( pDb->pRollbackHook ){ - Tcl_DecrRefCount(pDb->pRollbackHook); - } - if( pDb->pWalHook ){ - Tcl_DecrRefCount(pDb->pWalHook); - } - if( pDb->pCollateNeeded ){ - Tcl_DecrRefCount(pDb->pCollateNeeded); - } - Tcl_Free((char*)pDb); + delDatabaseRef(pDb); } /* @@ -1246,6 +1267,7 @@ static int SQLITE_TCLAPI DbTransPostCmd( } pDb->disableAuth--; + delDatabaseRef(pDb); return rc; } @@ -1579,6 +1601,7 @@ static void dbEvalInit( Tcl_IncrRefCount(pArray); } p->evalFlags = evalFlags; + addDatabaseRef(p->pDb); } /* @@ -1719,6 +1742,7 @@ static void dbEvalFinalize(DbEvalContext *p){ } Tcl_DecrRefCount(p->pSql); dbReleaseColumnNames(p); + delDatabaseRef(p->pDb); } /* @@ -3435,6 +3459,7 @@ deserialize_error: ** opened above. If not using NRE, evaluate the script directly, then ** call function DbTransPostCmd() to commit (or rollback) the transaction ** or savepoint. */ + addDatabaseRef(pDb); /* DbTransPostCmd() calls delDatabaseRef() */ if( DbUseNre() ){ Tcl_NRAddCallback(interp, DbTransPostCmd, cd, 0, 0, 0); (void)Tcl_NREvalObj(interp, pScript, 0); @@ -3842,6 +3867,7 @@ static int SQLITE_TCLAPI DbMain( }else{ Tcl_CreateObjCommand(interp, zArg, DbObjCmd, (char*)p, DbDeleteCmd); } + p->nRef = 1; return TCL_OK; } diff --git a/test/tclsqlite.test b/test/tclsqlite.test index b7e160e07e..c2fa522e64 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -848,4 +848,40 @@ do_catchsql_test 19.911 { } {1 {invalid command name "bind_fallback_does_not_exist"}} db bind_fallback {} +#------------------------------------------------------------------------- +do_test 20.0 { + db transaction { + db close + } +} {} + +do_test 20.1 { + sqlite3 db test.db + set rc [catch { + db eval {SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3} { db close } + } msg] + list $rc $msg +} {1 {invalid command name "db"}} + + +proc closedb {} { + db close + return 10 +} +proc func1 {} { return 1 } + +sqlite3 db test.db +db func closedb closedb +db func func1 func1 + +do_test 20.2 { + set rc [catch { + db eval { + SELECT closedb(),func1() UNION ALL SELECT 20,30 UNION ALL SELECT 30,40 + } + } msg] + list $rc $msg +} {0 {10 1 20 30 30 40}} + finish_test + From 495f78d8510566d2b42409c0044be44e78212bf6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 16:41:59 +0000 Subject: [PATCH 073/130] Add a tag comment in rtree.c. No changes to code. FossilOrigin-Name: 213410fa9cceb4ce34bf590ba65648ebeb94cc8d0c29a8881222208097162a95 --- ext/rtree/rtree.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 8e1eddc1f2..86080034db 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -3078,7 +3078,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ int rc2; RtreeNode *pChild = 0; i64 iChild = nodeGetRowid(pRtree, pRoot, 0); - rc = nodeAcquire(pRtree, iChild, pRoot, &pChild); + rc = nodeAcquire(pRtree, iChild, pRoot, &pChild); /* tag-20210916a */ if( rc==SQLITE_OK ){ rc = removeNode(pRtree, pChild, pRtree->iDepth-1); } diff --git a/manifest b/manifest index 022a259127..cc2636ca7d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sreference\scounter\sto\sa\sstructure\sused\sinternally\sby\sthe\sTcl\sinterface\sso\sthat\sit\sdoes\snot\ssegfault\sif\sthe\sdatabase\sconnection\sis\sclosed\sfrom\sany\sof\sthe\svarious\scallback\sscripts\sthat\smay\sbe\sinvoked. -D 2021-09-16T14:17:14.659 +C Add\sa\stag\scomment\sin\srtree.c.\s\sNo\schanges\sto\scode. +D 2021-09-16T16:41:59.880 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 0b6aa4fc1b4529c84c9d62702b28aa2b59bed87696cdec9bb83612b7fbc6ec8d +F ext/rtree/rtree.c c11785b7ba6c8ac24104fd06adac1fdb7209717cfa661ea94faf38d271ea216c F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 e6c4afd5b365b8dea8c0742352a09029da0f9715dd2407d4ccf53f1e0a4ce625 -R 2bba8a7e10b47ebc6a75449daec54256 -U dan -Z 6227cb06cae79681b47e5b13e50e774e +P e54a33ce56432b23947583d34cf12fc64a55bbc49eb77c7f33cff5926df51070 +R 0f426986a95a79cde4e578a0d0df1ebf +U drh +Z 9c4125bd62e8a7798b0a4bb99a1d21ed diff --git a/manifest.uuid b/manifest.uuid index ad44cfcfeb..b14aaf362d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e54a33ce56432b23947583d34cf12fc64a55bbc49eb77c7f33cff5926df51070 \ No newline at end of file +213410fa9cceb4ce34bf590ba65648ebeb94cc8d0c29a8881222208097162a95 \ No newline at end of file From 051c9ba1be8710c02dbf82fb733099ebc0188bef Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 17:02:59 +0000 Subject: [PATCH 074/130] Add a single new ALWAYS() to rtree.c, with justification. FossilOrigin-Name: 778e4499cdf2083d5431738099dedf0aade9271f661e09ca3278e0109bb1e720 --- ext/rtree/rtree.c | 4 +++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 86080034db..6d67cc8234 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2800,7 +2800,9 @@ static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ } box.iRowid = pNode->iNode; rc = nodeParentIndex(pRtree, pNode, &ii); - if( rc==SQLITE_OK ){ + /* When we are fixing up a bounding box, we've already + ** vvvvvv--- decended down through the tree so we know it is correct */ + if( ALWAYS(rc==SQLITE_OK) ){ nodeOverwriteCell(pRtree, pParent, &box, ii); rc = fixBoundingBox(pRtree, pParent); } diff --git a/manifest b/manifest index cc2636ca7d..b7d456fff2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\stag\scomment\sin\srtree.c.\s\sNo\schanges\sto\scode. -D 2021-09-16T16:41:59.880 +C Add\sa\ssingle\snew\sALWAYS()\sto\srtree.c,\swith\sjustification. +D 2021-09-16T17:02:59.528 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c c11785b7ba6c8ac24104fd06adac1fdb7209717cfa661ea94faf38d271ea216c +F ext/rtree/rtree.c c9e2c4b76254948c71843e97409f3b6f10a7f7b275d3a28cbd68a81eba9fcfe1 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 e54a33ce56432b23947583d34cf12fc64a55bbc49eb77c7f33cff5926df51070 -R 0f426986a95a79cde4e578a0d0df1ebf +P 213410fa9cceb4ce34bf590ba65648ebeb94cc8d0c29a8881222208097162a95 +R 06089782d82474a82865a82e74d66a14 U drh -Z 9c4125bd62e8a7798b0a4bb99a1d21ed +Z 53f2756b94560157f28ee71e2faea628 diff --git a/manifest.uuid b/manifest.uuid index b14aaf362d..e76545cb17 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -213410fa9cceb4ce34bf590ba65648ebeb94cc8d0c29a8881222208097162a95 \ No newline at end of file +778e4499cdf2083d5431738099dedf0aade9271f661e09ca3278e0109bb1e720 \ No newline at end of file From 72fb42d5700f9c23cf3d83b3e20bf455eac2cbef Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 16 Sep 2021 19:50:54 +0000 Subject: [PATCH 075/130] Add tests to rtreedoc.test. FossilOrigin-Name: b18c6ec46079520e0db8b42586ce9370a4038d0b4f719cfb98488037883e2537 --- ext/rtree/rtreedoc.test | 259 +++++++++++++++++++++++++++++++++++++++- manifest | 14 +-- manifest.uuid | 2 +- 3 files changed, 266 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index b2d37d6c1f..711b2e4a60 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -109,6 +109,9 @@ foreach {tn cols err} { " [list 1 $err] } +# EVIDENCE-OF: R-17874-21123 The first column of an SQLite R*Tree is +# similar to an integer primary key column of a normal SQLite table. +# # EVIDENCE-OF: R-46619-65417 The first column is always a 64-bit signed # integer primary key. # @@ -499,9 +502,126 @@ do_execsql_test 2.0 { #------------------------------------------------------------------------- #------------------------------------------------------------------------- set testprefix rtreedoc-5 -reset_db +do_execsql_test 1.0 { + INSERT INTO demo_index + SELECT NULL, minX, maxX, minY+0.2, maxY+0.2 FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX+0.2, maxX+0.2, minY, maxY FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX, maxX, minY+0.4, maxY+0.4 FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX+0.4, maxX+0.4, minY, maxY FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX, maxX, minY+0.8, maxY+0.8 FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX+0.8, maxX+0.8, minY, maxY FROM demo_index; + SELECT count(*) FROM demo_index; +} {896} + +proc do_vmstep_test {tn sql expr} { + execsql $sql + set step [db status vmstep] + do_test $tn.$step "expr {[subst $expr]}" 1 +} + +# EVIDENCE-OF: R-45880-07724 Any valid query will work against an R*Tree +# index. +do_execsql_test 1.1.0 { + CREATE TABLE demo_tbl AS SELECT * FROM demo_index; +} +foreach {tn sql} { + 1 {SELECT * FROM %TBL% ORDER BY 1} + 2 {SELECT max(minX) FROM %TBL% ORDER BY 1} + 3 {SELECT max(minX) FROM %TBL% GROUP BY round(minY) ORDER BY 1} +} { + set sql1 [string map {%TBL% demo_index} $sql] + set sql2 [string map {%TBL% demo_tbl} $sql] + + do_execsql_test 1.1.$tn $sql1 [execsql $sql2] +} + +# EVIDENCE-OF: R-60814-18273 The R*Tree implementation just makes some +# kinds of queries especially efficient. +# +# The second query is more efficient than the first. +do_vmstep_test 1.2.1 {SELECT * FROM demo_index WHERE +rowid=28269} {$step>2000} +do_vmstep_test 1.2.2 {SELECT * FROM demo_index WHERE rowid=28269} {$step<100} + +# EVIDENCE-OF: R-37800-50174 Queries against the primary key are +# efficient: SELECT * FROM demo_index WHERE id=28269; +do_vmstep_test 2.2 { SELECT * FROM demo_index WHERE id=28269 } {$step < 100} + +# EVIDENCE-OF: R-35847-18866 The big reason for using an R*Tree is so +# that you can efficiently do range queries against the coordinate +# ranges. +# +# EVIDENCE-OF: R-49927-54202 +do_vmstep_test 2.3 { + SELECT id FROM demo_index + WHERE minX<=-80.77470 AND maxX>=-80.77470 + AND minY<=35.37785 AND maxY>=35.37785; +} {$step < 100} + +# EVIDENCE-OF: R-12823-37176 The query above will quickly locate all +# zipcodes that contain the SQLite main office in their bounding box, +# even if the R*Tree contains many entries. +# +do_execsql_test 2.4 { + SELECT id FROM demo_index + WHERE minX<=-80.77470 AND maxX>=-80.77470 + AND minY<=35.37785 AND maxY>=35.37785; +} { + 28322 28269 +} + +# EVIDENCE-OF: R-07351-00257 For example, to find all zipcode bounding +# boxes that overlap with the 28269 zipcode: SELECT A.id FROM demo_index +# AS A, demo_index AS B WHERE A.maxX>=B.minX AND A.minX<=B.maxX +# AND A.maxY>=B.minY AND A.minY<=B.maxY AND B.id=28269; +# +# Also check that it is efficient +# +# EVIDENCE-OF: R-39094-01937 This second query will find both 28269 +# entry (since every bounding box overlaps with itself) and also other +# zipcode that is close enough to 28269 that their bounding boxes +# overlap. +# +# 28269 is there in the result. +# +do_vmstep_test 2.5.1 { + SELECT A.id FROM demo_index AS A, demo_index AS B + WHERE A.maxX>=B.minX AND A.minX<=B.maxX + AND A.maxY>=B.minY AND A.minY<=B.maxY + AND B.id=28269 +} {$step < 100} +do_execsql_test 2.5.2 { + SELECT A.id FROM demo_index AS A, demo_index AS B + WHERE A.maxX>=B.minX AND A.minX<=B.maxX + AND A.maxY>=B.minY AND A.minY<=B.maxY + AND B.id=28269; +} { + 28293 28216 28322 28286 28269 + 28215 28336 28262 28291 28320 + 28313 28298 28287 +} + +# EVIDENCE-OF: R-02723-34107 Note that it is not necessary for all +# coordinates in an R*Tree index to be constrained in order for the +# index search to be efficient. +# +# EVIDENCE-OF: R-22490-27246 One might, for example, want to query all +# objects that overlap with the 35th parallel: SELECT id FROM demo_index +# WHERE maxY>=35.0 AND minY<=35.0; +do_vmstep_test 2.6.1 { + SELECT id FROM demo_index + WHERE maxY>=35.0 AND minY<=35.0; +} {$step < 100} +do_execsql_test 2.6.2 { + SELECT id FROM demo_index + WHERE maxY>=35.0 AND minY<=35.0; +} {} #------------------------------------------------------------------------- @@ -510,6 +630,7 @@ reset_db #------------------------------------------------------------------------- #------------------------------------------------------------------------- set testprefix rtreedoc-6 +reset_db # EVIDENCE-OF: R-08327-00674 By default, coordinates are stored in an # R*Tree using 32-bit floating point values. @@ -718,6 +839,7 @@ do_test 8.2 { #------------------------------------------------------------------------- #------------------------------------------------------------------------- set testprefix rtreedoc-8 +reset_db # EVIDENCE-OF: R-21062-30088 For the example above, one might create an # auxiliary table as follows: CREATE TABLE demo_data( id INTEGER PRIMARY @@ -735,6 +857,94 @@ do_execsql_test 1.0 { ); } +do_execsql_test 1.1 { + CREATE VIRTUAL TABLE demo_index USING rtree( + id, -- Integer primary key + minX, maxX, -- Minimum and maximum X coordinate + minY, maxY -- Minimum and maximum Y coordinate + ); + + INSERT INTO demo_index VALUES + (28215, -80.781227, -80.604706, 35.208813, 35.297367), + (28216, -80.957283, -80.840599, 35.235920, 35.367825), + (28217, -80.960869, -80.869431, 35.133682, 35.208233), + (28226, -80.878983, -80.778275, 35.060287, 35.154446), + (28227, -80.745544, -80.555382, 35.130215, 35.236916), + (28244, -80.844208, -80.841988, 35.223728, 35.225471), + (28262, -80.809074, -80.682938, 35.276207, 35.377747), + (28269, -80.851471, -80.735718, 35.272560, 35.407925), + (28270, -80.794983, -80.728966, 35.059872, 35.161823), + (28273, -80.994766, -80.875259, 35.074734, 35.172836), + (28277, -80.876793, -80.767586, 35.001709, 35.101063), + (28278, -81.058029, -80.956375, 35.044701, 35.223812), + (28280, -80.844208, -80.841972, 35.225468, 35.227203), + (28282, -80.846382, -80.844193, 35.223972, 35.225655); + + INSERT INTO demo_index + SELECT NULL, minX, maxX, minY+0.2, maxY+0.2 FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX+0.2, maxX+0.2, minY, maxY FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX, maxX, minY+0.4, maxY+0.4 FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX+0.4, maxX+0.4, minY, maxY FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX, maxX, minY+0.8, maxY+0.8 FROM demo_index; + INSERT INTO demo_index + SELECT NULL, minX+0.8, maxX+0.8, minY, maxY FROM demo_index; + + INSERT INTO demo_data(id) SELECT id FROM demo_index; + + SELECT count(*) FROM demo_index; +} {896} + +set ::contained_in 0 +proc contained_in {args} {incr ::contained_in ; return 0} +db func contained_in contained_in + +do_vmstep_test 1.2 { + SELECT objname FROM demo_data, demo_index + WHERE demo_data.id=demo_index.id + AND contained_in(demo_data.boundary, 35.37785, -80.77470) + AND minX<=-80.77470 AND maxX>=-80.77470 + AND minY<=35.37785 AND maxY>=35.37785; +} {$step<100} +set ::contained_in1 $::contained_in + +# EVIDENCE-OF: R-32761-23915 One would get the same answer without the +# use of the R*Tree index using the following simpler query: SELECT +# objname FROM demo_data WHERE contained_in(demo_data.boundary, +# 35.37785, -80.77470); +set ::contained_in 0 +do_vmstep_test 1.3 { + SELECT objname FROM demo_data + WHERE contained_in(demo_data.boundary, 35.37785, -80.77470); +} {$step>4000} + +# EVIDENCE-OF: R-40261-32799 The problem with this latter query is that +# it must apply the contained_in() function to all entries in the +# demo_data table. +# +# 896 of them, IIRC. +do_test 1.4 { + set ::contained_in +} 896 + +# EVIDENCE-OF: R-24212-52761 The use of the R*Tree in the penultimate +# query reduces the number of calls to contained_in() function to a +# small subset of the entire table. +# +# 2 is a small subset of 896. +# +# EVIDENCE-OF: R-39057-63901 The R*Tree index did not find the exact +# answer itself, it merely limited the search space. +# +# contained_in() filtered out those 2 rows. +do_test 1.5 { + set ::contained_in1 +} {2} + + #------------------------------------------------------------------------- #------------------------------------------------------------------------- # Section 4.1 of documentation. @@ -890,6 +1100,53 @@ do_test 4.2 { expr {$r1==$r2} } {1} +# EVIDENCE-OF: R-26099-32169 SELECT objname FROM demo_index2 WHERE +# contained_in(boundary, 35.37785, -80.77470) AND minX<=-80.77470 AND +# maxX>=-80.77470 AND minY<=35.37785 AND maxY>=35.37785; +do_execsql_test 4.3.1 { + DELETE FROM demo_index2; + INSERT INTO demo_index2(id,minX,maxX,minY,maxY) VALUES + (28215, -80.781227, -80.604706, 35.208813, 35.297367), + (28216, -80.957283, -80.840599, 35.235920, 35.367825), + (28217, -80.960869, -80.869431, 35.133682, 35.208233), + (28226, -80.878983, -80.778275, 35.060287, 35.154446), + (28227, -80.745544, -80.555382, 35.130215, 35.236916), + (28244, -80.844208, -80.841988, 35.223728, 35.225471), + (28262, -80.809074, -80.682938, 35.276207, 35.377747), + (28269, -80.851471, -80.735718, 35.272560, 35.407925), + (28270, -80.794983, -80.728966, 35.059872, 35.161823), + (28273, -80.994766, -80.875259, 35.074734, 35.172836), + (28277, -80.876793, -80.767586, 35.001709, 35.101063), + (28278, -81.058029, -80.956375, 35.044701, 35.223812), + (28280, -80.844208, -80.841972, 35.225468, 35.227203), + (28282, -80.846382, -80.844193, 35.223972, 35.225655); +} +set ::contained_in 0 +proc contained_in {args} { + incr ::contained_in + return 0 +} +db func contained_in contained_in +do_execsql_test 4.3.2 { + SELECT objname FROM demo_index2 + WHERE contained_in(boundary, 35.37785, -80.77470) + AND minX<=-80.77470 AND maxX>=-80.77470 + AND minY<=35.37785 AND maxY>=35.37785; +} +do_test 4.3.3 { + # Function invoked only once because r-tree filtering happened first. + set ::contained_in +} 1 +set ::contained_in 0 +do_execsql_test 4.3.4 { + SELECT objname FROM demo_index2 + WHERE contained_in(boundary, 35.37785, -80.77470) +} +do_test 4.3.3 { + # Function invoked 14 times because no r-tree filtering. Inefficient. + set ::contained_in +} 14 + #------------------------------------------------------------------------- #------------------------------------------------------------------------- # Section 4.1.1 of documentation. diff --git a/manifest b/manifest index b7d456fff2..63815faf16 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\ssingle\snew\sALWAYS()\sto\srtree.c,\swith\sjustification. -D 2021-09-16T17:02:59.528 +C Add\stests\sto\srtreedoc.test. +D 2021-09-16T19:50:54.219 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -418,7 +418,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test c914acfbb0b9ce23352c1d1218cb02ec0770db476af5e36d310a3a8d1950c5e1 +F ext/rtree/rtreedoc.test 07e76da2148aa9aa46951060d15e16023d3d822118704057c7f153517217a318 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de @@ -1923,7 +1923,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 213410fa9cceb4ce34bf590ba65648ebeb94cc8d0c29a8881222208097162a95 -R 06089782d82474a82865a82e74d66a14 -U drh -Z 53f2756b94560157f28ee71e2faea628 +P 778e4499cdf2083d5431738099dedf0aade9271f661e09ca3278e0109bb1e720 +R 92f596b0c2b55c4ff0e3043aa7947d4f +U dan +Z 5c7af90e72a7c8251816ff925369f022 diff --git a/manifest.uuid b/manifest.uuid index e76545cb17..19fdc7ffff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -778e4499cdf2083d5431738099dedf0aade9271f661e09ca3278e0109bb1e720 \ No newline at end of file +b18c6ec46079520e0db8b42586ce9370a4038d0b4f719cfb98488037883e2537 \ No newline at end of file From 8e4616c2808f6ef36cb65c534d6683ac00a7092e Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 20:16:39 +0000 Subject: [PATCH 076/130] Minor changes to rtree.c so that we can get full branch coverage even when it is compiled without geopoly. FossilOrigin-Name: f05ae9b5864459493154037d2c902d203c4a43007b5d61bd4beb1eed56e06d13 --- ext/rtree/rtree.c | 14 +++++++++++--- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 6d67cc8234..f79759a97a 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -149,7 +149,9 @@ struct Rtree { u8 nBytesPerCell; /* Bytes consumed per cell */ u8 inWrTrans; /* True if inside write transaction */ u8 nAux; /* # of auxiliary columns in %_rowid */ +#ifdef SQLITE_ENABLE_GEOPOLY u8 nAuxNotNull; /* Number of initial not-null aux columns */ +#endif #ifdef SQLITE_DEBUG u8 bCorrupt; /* Shadow table corruption detected */ #endif @@ -754,7 +756,7 @@ static int nodeAcquire( ** are the leaves, and so on. If the depth as specified on the root node ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt. */ - if( pNode && rc==SQLITE_OK && iNode==1 ){ + if( rc==SQLITE_OK && pNode && iNode==1 ){ pRtree->iDepth = readInt16(pNode->zData); if( pRtree->iDepth>RTREE_MAX_DEPTH ){ rc = SQLITE_CORRUPT_VTAB; @@ -3585,9 +3587,12 @@ static int rtreeSqlInit( sqlite3_str_appendf(p, "UPDATE \"%w\".\"%w_rowid\"SET ", zDb, zPrefix); for(ii=0; iinAux; ii++){ if( ii ) sqlite3_str_append(p, ",", 1); +#ifdef SQLITE_ENABLE_GEOPOLY if( iinAuxNotNull ){ sqlite3_str_appendf(p,"a%d=coalesce(?%d,a%d)",ii,ii+2,ii); - }else{ + }else +#endif + { sqlite3_str_appendf(p,"a%d=?%d",ii,ii+2); } } @@ -4526,7 +4531,10 @@ int sqlite3_rtree_query_callback( /* Allocate and populate the context object. */ pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback)); - if( !pGeomCtx ) return SQLITE_NOMEM; + if( !pGeomCtx ){ + if( xDestructor ) xDestructor(pContext); + return SQLITE_NOMEM; + } pGeomCtx->xGeom = 0; pGeomCtx->xQueryFunc = xQueryFunc; pGeomCtx->xDestructor = xDestructor; diff --git a/manifest b/manifest index 63815faf16..8a4f34bf3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sto\srtreedoc.test. -D 2021-09-16T19:50:54.219 +C Minor\schanges\sto\srtree.c\sso\sthat\swe\scan\sget\sfull\sbranch\scoverage\seven\swhen\nit\sis\scompiled\swithout\sgeopoly. +D 2021-09-16T20:16:39.322 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c c9e2c4b76254948c71843e97409f3b6f10a7f7b275d3a28cbd68a81eba9fcfe1 +F ext/rtree/rtree.c 6355ecf9a7c2f03501b654ce4dab0051407fc89fb952eec62cd0269287bd9076 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 778e4499cdf2083d5431738099dedf0aade9271f661e09ca3278e0109bb1e720 -R 92f596b0c2b55c4ff0e3043aa7947d4f -U dan -Z 5c7af90e72a7c8251816ff925369f022 +P b18c6ec46079520e0db8b42586ce9370a4038d0b4f719cfb98488037883e2537 +R 2ef66f05e1dd549dbc74c3eeb808a314 +U drh +Z a0503148f3351d6802e79a654b59f6d6 diff --git a/manifest.uuid b/manifest.uuid index 19fdc7ffff..fd4160bac2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b18c6ec46079520e0db8b42586ce9370a4038d0b4f719cfb98488037883e2537 \ No newline at end of file +f05ae9b5864459493154037d2c902d203c4a43007b5d61bd4beb1eed56e06d13 \ No newline at end of file From 89b1715415fc8663d817e4415a1c87d53ff5041e Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Sep 2021 22:23:36 +0000 Subject: [PATCH 077/130] The dbsqlfuzz fuzzer found a refutation for a recent ALWAYS() macro. FossilOrigin-Name: ebfc18aaa6506ccac80f297a1792e726972bb39c0b5c8706faadeb8df94a45e9 --- ext/rtree/rtree.c | 4 +--- manifest | 13 +++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index f79759a97a..8507558206 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2802,9 +2802,7 @@ static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ } box.iRowid = pNode->iNode; rc = nodeParentIndex(pRtree, pNode, &ii); - /* When we are fixing up a bounding box, we've already - ** vvvvvv--- decended down through the tree so we know it is correct */ - if( ALWAYS(rc==SQLITE_OK) ){ + if( rc==SQLITE_OK ){ nodeOverwriteCell(pRtree, pParent, &box, ii); rc = fixBoundingBox(pRtree, pParent); } diff --git a/manifest b/manifest index 8a4f34bf3c..96f5e2c6e0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schanges\sto\srtree.c\sso\sthat\swe\scan\sget\sfull\sbranch\scoverage\seven\swhen\nit\sis\scompiled\swithout\sgeopoly. -D 2021-09-16T20:16:39.322 +C The\sdbsqlfuzz\sfuzzer\sfound\sa\srefutation\sfor\sa\srecent\sALWAYS()\smacro. +D 2021-09-16T22:23:36.631 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c 6355ecf9a7c2f03501b654ce4dab0051407fc89fb952eec62cd0269287bd9076 +F ext/rtree/rtree.c fb930d5bee9deb9efbfbed72be56a0d4e4950ab216284fb5ec1c9863d32a32fa F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1923,7 +1923,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 b18c6ec46079520e0db8b42586ce9370a4038d0b4f719cfb98488037883e2537 -R 2ef66f05e1dd549dbc74c3eeb808a314 +P f05ae9b5864459493154037d2c902d203c4a43007b5d61bd4beb1eed56e06d13 +Q -778e4499cdf2083d5431738099dedf0aade9271f661e09ca3278e0109bb1e720 +R 412d8988f40528aa27ca17db7091e339 U drh -Z a0503148f3351d6802e79a654b59f6d6 +Z c4a079140a41c7dc2bd45282be1ee73a diff --git a/manifest.uuid b/manifest.uuid index fd4160bac2..c5b51dccb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f05ae9b5864459493154037d2c902d203c4a43007b5d61bd4beb1eed56e06d13 \ No newline at end of file +ebfc18aaa6506ccac80f297a1792e726972bb39c0b5c8706faadeb8df94a45e9 \ No newline at end of file From 3780f9a4aa4a2c4a08c15d9d17cb2de8ad6d2bb5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Sep 2021 13:07:15 +0000 Subject: [PATCH 078/130] Make the affinity() function available even if compiled without SQLITE_DEBUG. Surround the implementation of all test-only SQL functions with #ifndef SQLITE_UNTESTABLE. FossilOrigin-Name: b7e00ef8059f6fb5658c6ad6f337cfdf065a5f1b1130452122282f3a69e98a93 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/expr.c | 4 ++-- src/func.c | 6 +++--- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 96f5e2c6e0..ef566fa2f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sdbsqlfuzz\sfuzzer\sfound\sa\srefutation\sfor\sa\srecent\sALWAYS()\smacro. -D 2021-09-16T22:23:36.631 +C Make\sthe\saffinity()\sfunction\savailable\seven\sif\scompiled\swithout\nSQLITE_DEBUG.\s\sSurround\sthe\simplementation\sof\sall\stest-only\sSQL\sfunctions\nwith\s#ifndef\sSQLITE_UNTESTABLE. +D 2021-09-17T13:07:15.263 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,10 +497,10 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c e98375fc63552cc8cdd36a41bdca3039cb603d9fe67abd9c9f40adae8405fbc5 +F src/expr.c ce736caaf1cf6d69789511e9fc5ed31013d9570d5d773cce909d396112d83843 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c -F src/func.c 54b059e0f847ca48460e353fd96278f3179585c5cf9f0ee2eff01b449b4bb88d +F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1 F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -1923,8 +1923,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 f05ae9b5864459493154037d2c902d203c4a43007b5d61bd4beb1eed56e06d13 -Q -778e4499cdf2083d5431738099dedf0aade9271f661e09ca3278e0109bb1e720 -R 412d8988f40528aa27ca17db7091e339 +P ebfc18aaa6506ccac80f297a1792e726972bb39c0b5c8706faadeb8df94a45e9 +R 2b89e9e309868e78306907ed116b8c82 U drh -Z c4a079140a41c7dc2bd45282be1ee73a +Z 9f5272dd467b9f232b6577a308d23359 diff --git a/manifest.uuid b/manifest.uuid index c5b51dccb3..2a2dbbf111 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ebfc18aaa6506ccac80f297a1792e726972bb39c0b5c8706faadeb8df94a45e9 \ No newline at end of file +b7e00ef8059f6fb5658c6ad6f337cfdf065a5f1b1130452122282f3a69e98a93 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 34f14e3687..d85d21eb18 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3866,6 +3866,7 @@ static int exprCodeInlineFunction( ** Test-only SQL functions that are only usable if enabled ** via SQLITE_TESTCTRL_INTERNAL_FUNCTIONS */ +#if !defined(SQLITE_UNTESTABLE) case INLINEFUNC_expr_compare: { /* Compare two expressions using sqlite3ExprCompare() */ assert( nFarg==2 ); @@ -3899,7 +3900,6 @@ static int exprCodeInlineFunction( 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 @@ -3913,7 +3913,7 @@ static int exprCodeInlineFunction( (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); break; } -#endif +#endif /* !defined(SQLITE_UNTESTABLE) */ } return target; } diff --git a/src/func.c b/src/func.c index 292db73e87..b47378a3be 100644 --- a/src/func.c +++ b/src/func.c @@ -2123,12 +2123,12 @@ void sqlite3RegisterBuiltinFunctions(void){ */ static FuncDef aBuiltinFunc[] = { /***** Functions only available with SQLITE_TESTCTRL_INTERNAL_FUNCTIONS *****/ +#if !defined(SQLITE_UNTESTABLE) 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 + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), +#endif /* !defined(SQLITE_UNTESTABLE) */ /***** Regular functions *****/ #ifdef SQLITE_SOUNDEX FUNCTION(soundex, 1, 0, 0, soundexFunc ), From 01ed72f2c5aa61ae0a6158dbc07f1a09c3cd5d41 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 17 Sep 2021 20:43:27 +0000 Subject: [PATCH 079/130] Add tests for legacy geometry callbacks to rtreedoc2.test. FossilOrigin-Name: 6ad00e52eda5bc4cb8e6fffbd7538bcd4c6b22f84b837a746eba6bf8c91eb55a --- Makefile.in | 3 +- Makefile.msc | 1 + ext/rtree/rtreedoc.test | 6 + ext/rtree/rtreedoc2.test | 249 ++++++++++++++++++++++++++++++++++++++ ext/rtree/test_rtreedoc.c | 192 +++++++++++++++++++++++++++++ main.mk | 3 +- manifest | 24 ++-- manifest.uuid | 2 +- src/test_tclsh.c | 2 + 9 files changed, 468 insertions(+), 14 deletions(-) create mode 100644 ext/rtree/rtreedoc2.test create mode 100644 ext/rtree/test_rtreedoc.c diff --git a/Makefile.in b/Makefile.in index c771b5bada..9adcf6296f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -468,7 +468,8 @@ TESTSRC += \ $(TOP)/ext/misc/unionvtab.c \ $(TOP)/ext/misc/wholenumber.c \ $(TOP)/ext/misc/zipfile.c \ - $(TOP)/ext/userauth/userauth.c + $(TOP)/ext/userauth/userauth.c \ + $(TOP)/ext/rtree/test_rtreedoc.c # Source code to the library files needed by the test fixture # diff --git a/Makefile.msc b/Makefile.msc index 6a7f2a3a75..b83a0906bb 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1586,6 +1586,7 @@ TESTEXT = \ $(TOP)\ext\misc\totype.c \ $(TOP)\ext\misc\unionvtab.c \ $(TOP)\ext\misc\wholenumber.c \ + $(TOP)\ext\rtree\test_rtreedoc.c \ fts5.c # If use of zlib is enabled, add the "zipfile.c" source file. diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index 711b2e4a60..f22349628d 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -902,6 +902,12 @@ set ::contained_in 0 proc contained_in {args} {incr ::contained_in ; return 0} db func contained_in contained_in +# EVIDENCE-OF: R-32671-43888 Then an efficient way to find the specific +# ZIP code for the main SQLite office would be to run a query like this: +# SELECT objname FROM demo_data, demo_index WHERE +# demo_data.id=demo_index.id AND contained_in(demo_data.boundary, +# 35.37785, -80.77470) AND minX<=-80.77470 AND maxX>=-80.77470 AND +# minY<=35.37785 AND maxY>=35.37785; do_vmstep_test 1.2 { SELECT objname FROM demo_data, demo_index WHERE demo_data.id=demo_index.id diff --git a/ext/rtree/rtreedoc2.test b/ext/rtree/rtreedoc2.test new file mode 100644 index 0000000000..f9246a1043 --- /dev/null +++ b/ext/rtree/rtreedoc2.test @@ -0,0 +1,249 @@ +# 2021 September 13 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# The focus of this file is testing the r-tree extension. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] rtree_util.tcl] +source $testdir/tester.tcl +set testprefix rtreedoc2 + +ifcapable !rtree { + finish_test + return +} + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 6 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc2-1 + +# EVIDENCE-OF: R-35254-48865 A call to one of the above APIs creates a +# new SQL function named by the second parameter (zQueryFunc or zGeom). +# +# [register_circle_geom db] registers new geometry callback "Qcircle" +# and legacy implementation "circle". Test that these do actually appear. +# +do_execsql_test 1.1.0 { + SELECT * FROM pragma_function_list WHERE name IN('circle', 'qcircle'); +} { +} +do_test 1.1 { + register_circle_geom db +} {SQLITE_OK} +do_execsql_test 1.1.2 { + SELECT * FROM pragma_function_list WHERE name = 'circle' AND enc='utf8'; +} { + circle 0 s utf8 -1 0 +} +do_execsql_test 1.1.3 { + SELECT * FROM pragma_function_list WHERE name = 'qcircle' AND enc='utf8'; +} { + qcircle 0 s utf8 -1 0 +} + +do_execsql_test 1.2.0 { SELECT circle(1, 2, 3); } {{}} +do_execsql_test 1.2.1 { SELECT qcircle(1, 2, 3); } {{}} + +# EVIDENCE-OF: R-61427-46983 +do_execsql_test 1.3.0 { + CREATE VIRTUAL TABLE demo_index USING rtree(id, x1,x2, y1,y2); + INSERT INTO demo_index VALUES(10, 45,45, 24,24); + INSERT INTO demo_index VALUES(20, 50,50, 28,28); + INSERT INTO demo_index VALUES(30, 43,43, 22,22); +} +do_execsql_test 1.3.1 { + SELECT id FROM demo_index WHERE id MATCH circle(45.3, 22.9, 5.0) +} {10 30} + +# EVIDENCE-OF: R-16907-50223 The SQL syntax for custom queries is the +# same regardless of which interface, sqlite3_rtree_geometry_callback() +# or sqlite3_rtree_query_callback(), is used to register the SQL +# function. +do_execsql_test 1.3.2 { + SELECT id FROM demo_index WHERE id MATCH qcircle(45.3, 22.9, 5.0, 1) +} {10 30} + + +# EVIDENCE-OF: R-59634-51678 When that SQL function appears on the +# right-hand side of the MATCH operator and the left-hand side of the +# MATCH operator is any column in the R*Tree virtual table, then the +# callback defined by the third argument (xQueryFunc or xGeom) is +# invoked to determine if a particular object or subtree overlaps the +# desired region. +proc box_geom {args} { + lappend ::box_geom [concat [lindex $args 0] [lrange $args 2 end-1]] + return "" +} +register_box_geom db box_geom +set box_geom [list] +do_execsql_test 1.3.2 { + SELECT id FROM demo_index WHERE id MATCH box(43,46, 21,25); +} {10 30} +do_test 1.3.3 { + set ::box_geom +} [list {*}{ + {box {43.0 46.0 21.0 25.0} {45.0 45.0 24.0 24.0}} + {box {43.0 46.0 21.0 25.0} {50.0 50.0 28.0 28.0}} + {box {43.0 46.0 21.0 25.0} {43.0 43.0 22.0 22.0}} +}] + +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# Section 6 of documentation. +#------------------------------------------------------------------------- +#------------------------------------------------------------------------- +set testprefix rtreedoc2-2 + +# EVIDENCE-OF: R-02424-24769 The second argument is the number of +# coordinates in each r-tree entry, and is always the same for any given +# R*Tree. +# +# EVIDENCE-OF: R-40260-16838 The number of coordinates is 2 for a +# 1-dimensional R*Tree, 4 for a 2-dimensional R*Tree, 6 for a +# 3-dimensional R*Tree, and so forth. +# +# The second argument refered to above is the length of the list passed +# as the 3rd parameter to the Tcl script. +# +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt1 USING rtree(id, x1,x2); + CREATE VIRTUAL TABLE rt2 USING rtree(id, x1,x2, y1,y2); + CREATE VIRTUAL TABLE rt3 USING rtree(id, x1,x2, y1,y2, z1,z2); + + INSERT INTO rt1 DEFAULT VALUES; + INSERT INTO rt2 DEFAULT VALUES; + INSERT INTO rt3 DEFAULT VALUES; +} +foreach {tn tbl nCoord} { + 1 rt1 2 + 2 rt2 4 + 3 rt3 6 +} { + set ::box_geom [list] + do_catchsql_test 1.$tn.1 " + SELECT id FROM $tbl WHERE id MATCH box(); + " {1 {SQL logic error}} + + do_test 1.$tn.2 { + llength [lindex $::box_geom 0 2] + } $nCoord +} + +# EVIDENCE-OF: R-28051-48608 If xGeom returns anything other than +# SQLITE_OK, then the r-tree query will abort with an error. +proc box_geom {args} { + error "an error!" +} +do_catchsql_test 2.0 { + SELECT * FROM rt2 WHERE id MATCH box(22,23, 24,25); +} {1 {SQL logic error}} + +do_execsql_test 3.0 { + INSERT INTO rt1 VALUES(10, 10, 10); + INSERT INTO rt1 VALUES(11, 11, 11); + INSERT INTO rt1 VALUES(12, 12, 12); + INSERT INTO rt1 VALUES(13, 13, 13); + INSERT INTO rt1 VALUES(14, 14, 14); +} + +# EVIDENCE-OF: R-53759-57366 The exact same sqlite3_rtree_geometry +# structure is used for every callback for same MATCH operator in the +# same query. +proc box_geom {args} { + lappend ::ptr_list [lindex $args 4] + return 0 +} +set ::ptr_list [list] +do_execsql_test 3.1 { + SELECT * FROM rt1 WHERE id MATCH box(1,1); +} +do_test 3.2 { + set val [lindex $::ptr_list 0] + foreach p $::ptr_list { + if {$p!=$val} {error "pointer mismatch"} + } +} {} + +# EVIDENCE-OF: R-60247-35692 The contents of the sqlite3_rtree_geometry +# structure are initialized by SQLite but are not subsequently modified. +proc box_geom {args} { + lappend ::box_geom [concat [lindex $args 0] [lrange $args 2 end-1]] + if {[llength $::box_geom]==3} { + return "zero" + } + return "" +} +set ::box_geom [list] +do_catchsql_test 3.2 { + SELECT * FROM rt1 WHERE id MATCH box(1,1); +} {1 {SQL logic error}} +do_test 3.3 { + set ::box_geom +} [list {*}{ + {box {1.0 1.0} {0.0 0.0}} + {box {1.0 1.0} {10.0 10.0}} + {box {1.0 1.0} {11.0 11.0}} + {box 0.0 {12.0 12.0}} +}] + +# EVIDENCE-OF: R-31246-29731 The pContext member of the +# sqlite3_rtree_geometry structure is always set to a copy of the +# pContext argument passed to sqlite3_rtree_geometry_callback() when the +# callback is registered. +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE r1 USING rtree(id, minX,maxX, minY,maxY); + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<120 + ) + INSERT INTO r1 SELECT i,i,i+1, 200,201 FROM s; +} +set ctx [register_box_geom db box_geom] +set ::box_geom [list] +proc box_geom {args} { + lappend ::box_geom [lindex $args 1] + return "" +} +do_execsql_test 4.1 { + SELECT count(*) FROM r1 WHERE id MATCH box(0,150,199,201) +} 120 +do_test 4.2 { + foreach g $::box_geom { + if {$g!=$ctx} {error "pointer mismatch"} + } +} {} + +# EVIDENCE-OF: R-09904-19077 The aParam[] array (size nParam) contains +# the parameter values passed to the SQL function on the right-hand side +# of the MATCH operator. +proc box_geom {args} { + set ::box_geom [lindex $args 2] +} +foreach {tn q vals} { + 1 "SELECT count(*) FROM r1 WHERE id MATCH box(1,2,3)" {1.0 2.0 3.0} + 2 "SELECT count(*) FROM r1 WHERE id MATCH box(10001)" {10001.0} + 3 "SELECT count(*) FROM r1 WHERE id MATCH box(-10001)" {-10001.0} +} { + do_catchsql_test 5.$tn.1 $q {1 {SQL logic error}} + do_test 5.$tn.2 { set ::box_geom } $vals +} + + + + +finish_test + diff --git a/ext/rtree/test_rtreedoc.c b/ext/rtree/test_rtreedoc.c new file mode 100644 index 0000000000..b19639e025 --- /dev/null +++ b/ext/rtree/test_rtreedoc.c @@ -0,0 +1,192 @@ +/* +** 2010 August 28 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Code for testing all sorts of SQLite interfaces. This code +** is not included in the SQLite library. +*/ + +#include "sqlite3.h" +#if defined(INCLUDE_SQLITE_TCL_H) +# include "sqlite_tcl.h" +#else +# include "tcl.h" +#endif + +/* Solely for the UNUSED_PARAMETER() macro. */ +#include "sqliteInt.h" + +#ifdef SQLITE_ENABLE_RTREE + +typedef struct BoxGeomCtx BoxGeomCtx; +struct BoxGeomCtx { + Tcl_Interp *interp; + Tcl_Obj *pScript; +}; + +static int invokeTclGeomCb( + const char *zName, + sqlite3_rtree_geometry *p, + int nCoord, + sqlite3_rtree_dbl *aCoord +){ + int rc = SQLITE_OK; + if( p->pContext ){ + char aPtr[64]; + BoxGeomCtx *pCtx = (BoxGeomCtx*)p->pContext; + Tcl_Interp *interp = pCtx->interp; + Tcl_Obj *pScript = 0; + Tcl_Obj *pParam = 0; + Tcl_Obj *pCoord = 0; + int ii; + Tcl_Obj *pRes; + + pScript = Tcl_DuplicateObj(pCtx->pScript); + Tcl_IncrRefCount(pScript); + Tcl_ListObjAppendElement(interp, pScript, Tcl_NewStringObj(zName,-1)); + + sqlite3_snprintf(sizeof(aPtr)-1, aPtr, "%p", (void*)p->pContext); + Tcl_ListObjAppendElement(interp, pScript, Tcl_NewStringObj(aPtr,-1)); + + pParam = Tcl_NewObj(); + for(ii=0; iinParam; ii++){ + Tcl_ListObjAppendElement( + interp, pParam, Tcl_NewDoubleObj(p->aParam[ii]) + ); + } + Tcl_ListObjAppendElement(interp, pScript, pParam); + + pCoord = Tcl_NewObj(); + for(ii=0; iiaParam[0] = 0.0; + p->nParam = 1; + } + } + return rc; +} + +/* +# EVIDENCE-OF: R-00693-36727 The legacy xGeom callback is invoked with +# four arguments. + +# EVIDENCE-OF: R-50437-53270 The first argument is a pointer to an +# sqlite3_rtree_geometry structure which provides information about how +# the SQL function was invoked. + +# EVIDENCE-OF: R-40260-16838 The number of coordinates is 2 for a +# 1-dimensional R*Tree, 4 for a 2-dimensional R*Tree, 6 for a +# 3-dimensional R*Tree, and so forth. + +# EVIDENCE-OF: R-00090-24248 The third argument, aCoord[], is an array +# of nCoord coordinates that defines a bounding box to be tested. + +# EVIDENCE-OF: R-28207-40885 The last argument is a pointer into which +# the callback result should be written. + +*/ +static int box_geom( + sqlite3_rtree_geometry *p, /* R-50437-53270 */ + int nCoord, /* R-02424-24769 */ + sqlite3_rtree_dbl *aCoord, /* R-00090-24248 */ + int *pRes /* R-28207-40885 */ +){ + int ii; + + if( p->nParam!=nCoord ){ + invokeTclGeomCb("box", p, nCoord, aCoord); + return SQLITE_ERROR; + } + if( invokeTclGeomCb("box", p, nCoord, aCoord) ) return SQLITE_ERROR; + + for(ii=0; iip->aParam[ii+1] || aCoord[ii+1]aParam[ii] ){ + /* R-28207-40885 */ + *pRes = 0; + return SQLITE_OK; + } + } + + /* R-28207-40885 */ + *pRes = 1; + + return SQLITE_OK; +} + +static int SQLITE_TCLAPI register_box_geom( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); + extern const char *sqlite3ErrName(int); + sqlite3 *db; + int rc; + BoxGeomCtx *pCtx; + char aPtr[64]; + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB SCRIPT"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + + pCtx = (BoxGeomCtx*)ckalloc(sizeof(BoxGeomCtx*)); + pCtx->interp = interp; + pCtx->pScript = Tcl_DuplicateObj(objv[2]); + Tcl_IncrRefCount(pCtx->pScript); + + rc = sqlite3_rtree_geometry_callback(db, "box", box_geom, (void*)pCtx); + + sqlite3_snprintf(64, aPtr, "%p", (void*)pCtx); + Tcl_SetObjResult(interp, Tcl_NewStringObj(aPtr, -1)); + return TCL_OK; +} + +static int SQLITE_TCLAPI register_box_query( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); + extern const char *sqlite3ErrName(int); + sqlite3 *db; + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB SCRIPT"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + + return TCL_OK; +} +#endif /* SQLITE_ENABLE_RTREE */ + + +int Sqlitetestrtreedoc_Init(Tcl_Interp *interp){ +#ifdef SQLITE_ENABLE_RTREE + Tcl_CreateObjCommand(interp, "register_box_geom", register_box_geom, 0, 0); + Tcl_CreateObjCommand(interp, "register_box_query", register_box_query, 0, 0); +#endif /* SQLITE_ENABLE_RTREE */ + return TCL_OK; +} diff --git a/main.mk b/main.mk index eb45de8238..f1a4660a8d 100644 --- a/main.mk +++ b/main.mk @@ -387,7 +387,8 @@ TESTSRC += \ $(TOP)/ext/misc/zipfile.c \ $(TOP)/ext/fts5/fts5_tcl.c \ $(TOP)/ext/fts5/fts5_test_mi.c \ - $(TOP)/ext/fts5/fts5_test_tok.c + $(TOP)/ext/fts5/fts5_test_tok.c \ + $(TOP)/ext/rtree/test_rtreedoc.c #TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c diff --git a/manifest b/manifest index ef566fa2f3..5c89b75679 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Make\sthe\saffinity()\sfunction\savailable\seven\sif\scompiled\swithout\nSQLITE_DEBUG.\s\sSurround\sthe\simplementation\sof\sall\stest-only\sSQL\sfunctions\nwith\s#ifndef\sSQLITE_UNTESTABLE. -D 2021-09-17T13:07:15.263 +C Add\stests\sfor\slegacy\sgeometry\scallbacks\sto\srtreedoc2.test. +D 2021-09-17T20:43:27.549 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 83c348515cb62f6f2a2ddf3fd014113ff20564b776e1a614079722c88c6ff43d +F Makefile.in 2a6e71e91f29e9eb0cb800b6500bbbfef31730d5c37eaadb6e8ea8a45e6ead21 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 7dc32ba195639311ef4fa3d8f8ec218de37fde12d7ef5a33e9a7de921b0025ca +F Makefile.msc b18738be47ba9293dbea2048fe1d5a737456fdc630361cc98ef2c2f73bf3395c F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -418,9 +418,11 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 07e76da2148aa9aa46951060d15e16023d3d822118704057c7f153517217a318 +F ext/rtree/rtreedoc.test 243cd3fdee1cb89e290e908ddde0cc0cfda0ccb85473c6d1b3c43e6260b14cac +F ext/rtree/rtreedoc2.test ae13849b390f6878434896ecee113cc44bb2bcbcd868f6c47b5d80a73e3e4ab1 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 +F ext/rtree/test_rtreedoc.c 72f78e9930e861ba2a780f36cb6ecbf02ebda350111ecab9594c564c10a30b1c F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 @@ -467,7 +469,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 4e075c9618c06c55d1cc723087b0722f384247b6b8db1ac2cb161f864c953c97 +F main.mk 002e77acdfeb08d1d8f4d360b01e130aa243fb5701728e81fac9085794f27155 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -598,7 +600,7 @@ F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe F src/test_sqllog.c 540feaea7280cd5f926168aee9deb1065ae136d0bbbe7361e2ef3541783e187a F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 -F src/test_tclsh.c eeafce33ad2136d57e5dec10f1e9a4347447eb72ffd504a1c7b9c6bfe2e71578 +F src/test_tclsh.c c4065ced25126e25c40122c5ff62dc89902ea617d72cdd27765151cdd7fcc477 F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc F src/test_thread.c 269ea9e1fa5828dba550eb26f619aa18aedbc29fd92f8a5f6b93521fbb74a61c F src/test_vdbecov.c f60c6f135ec42c0de013a1d5136777aa328a776d33277f92abac648930453d43 @@ -1923,7 +1925,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 ebfc18aaa6506ccac80f297a1792e726972bb39c0b5c8706faadeb8df94a45e9 -R 2b89e9e309868e78306907ed116b8c82 -U drh -Z 9f5272dd467b9f232b6577a308d23359 +P b7e00ef8059f6fb5658c6ad6f337cfdf065a5f1b1130452122282f3a69e98a93 +R 0b7caecd3af74a3c80ac98749a9df12e +U dan +Z 75db5feff0f016247e2a2ef39c35bcd5 diff --git a/manifest.uuid b/manifest.uuid index 2a2dbbf111..536f28d9f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b7e00ef8059f6fb5658c6ad6f337cfdf065a5f1b1130452122282f3a69e98a93 \ No newline at end of file +6ad00e52eda5bc4cb8e6fffbd7538bcd4c6b22f84b837a746eba6bf8c91eb55a \ No newline at end of file diff --git a/src/test_tclsh.c b/src/test_tclsh.c index 9988214b08..707c16812c 100644 --- a/src/test_tclsh.c +++ b/src/test_tclsh.c @@ -87,6 +87,7 @@ const char *sqlite3TestInit(Tcl_Interp *interp){ extern int Sqlitetestintarray_Init(Tcl_Interp*); extern int Sqlitetestvfs_Init(Tcl_Interp *); extern int Sqlitetestrtree_Init(Tcl_Interp*); + extern int Sqlitetestrtreedoc_Init(Tcl_Interp*); extern int Sqlitequota_Init(Tcl_Interp*); extern int Sqlitemultiplex_Init(Tcl_Interp*); extern int SqliteSuperlock_Init(Tcl_Interp*); @@ -156,6 +157,7 @@ const char *sqlite3TestInit(Tcl_Interp *interp){ Sqlitetestintarray_Init(interp); Sqlitetestvfs_Init(interp); Sqlitetestrtree_Init(interp); + Sqlitetestrtreedoc_Init(interp); Sqlitequota_Init(interp); Sqlitemultiplex_Init(interp); SqliteSuperlock_Init(interp); From d96bcc75e8c35fc5838a5cead3a1f31deaeee1ed Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 17 Sep 2021 21:12:47 +0000 Subject: [PATCH 080/130] Shell's .read pipe now works for Windows too. FossilOrigin-Name: 929bcc4098549692c573779d65c4c28027b0a2f48ebbf5b3f038deee24374b67 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 28 ++++++++++++++++++++++------ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 5c89b75679..0fc98d5964 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\slegacy\sgeometry\scallbacks\sto\srtreedoc2.test. -D 2021-09-17T20:43:27.549 +C Shell's\s.read\spipe\snow\sworks\sfor\sWindows\stoo. +D 2021-09-17T21:12:47.392 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -548,7 +548,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 -F src/shell.c.in 714fb58faf675ec7cc1b84a3e15a0791a6e2e376784c4f8d8ddf2135b64476ee +F src/shell.c.in b6cf46c676e89a21dd70b2dfb1312116ae4411fc8140af56c794192c1c8270f2 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1925,7 +1925,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 b7e00ef8059f6fb5658c6ad6f337cfdf065a5f1b1130452122282f3a69e98a93 -R 0b7caecd3af74a3c80ac98749a9df12e -U dan -Z 75db5feff0f016247e2a2ef39c35bcd5 +P 6ad00e52eda5bc4cb8e6fffbd7538bcd4c6b22f84b837a746eba6bf8c91eb55a +R 4272cac65b9ce52e86aa091f7c699703 +U larrybr +Z f2dab7d439a0b553d4ffc2b434c528dd diff --git a/manifest.uuid b/manifest.uuid index 536f28d9f4..d0c60f0e49 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ad00e52eda5bc4cb8e6fffbd7538bcd4c6b22f84b837a746eba6bf8c91eb55a \ No newline at end of file +929bcc4098549692c573779d65c4c28027b0a2f48ebbf5b3f038deee24374b67 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index a5ebfda330..cd8cd0bfad 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -635,20 +635,36 @@ static int strlenChar(const char *z){ } /* -** Return true if zFile does not exist or if it is not either -** an ordinary file or an openable character stream source. +** Return open FILE * if zFile exists, can be opened for read +** and is an ordinary file or a character stream source. +** Otherwise return 0. */ -static int notChrSource(const char *zFile){ +static FILE * openChrSource(const char *zFile){ #ifdef _WIN32 struct _stat x = {0}; - int rc = _stat(zFile, &x); # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) + /* On Windows, open first, then check the stream nature. This order + ** is necessary because _stat() and sibs, when checking a named pipe, + ** effectively break the pipe as its supplier sees it. */ + FILE *rv = fopen(zFile, "rb"); + if( rv==0 ) return 0; + if( _fstat(_fileno(rv), &x) != 0 + || !STAT_CHR_SRC(x.st_mode)){ + fclose(rv); + rv = 0; + } + return rv; #else struct stat x = {0}; int rc = stat(zFile, &x); # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode)) + if( rc!=0 ) return 0; + if( STAT_CHR_SRC(x.st_mode) ){ + return fopen(zFile, "rb"); + }else{ + return 0; + } #endif - return rc || !STAT_CHR_SRC(x.st_mode); #undef STAT_CHR_SRC } @@ -9242,7 +9258,7 @@ static int do_meta_command(char *zLine, ShellState *p){ pclose(p->in); } #endif - }else if( notChrSource(azArg[1]) || (p->in = fopen(azArg[1], "rb"))==0 ){ + }else if( (p->in = openChrSource(azArg[1]))==0 ){ utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); rc = 1; }else{ From 5488e0827a89699e35c0cfc75111f275e003d5df Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 18 Sep 2021 16:15:54 +0000 Subject: [PATCH 081/130] Further tests for legacy rtree geom callbacks. FossilOrigin-Name: 99d6bb22e8735681443bfe67287aa15ce2c57d0d63e304abf8aa01fde50dd021 --- ext/rtree/rtreedoc2.test | 99 ++++++++++++++++++++++++++++++++++++++- ext/rtree/test_rtreedoc.c | 50 +++++++++++++++++--- manifest | 16 +++---- manifest.uuid | 2 +- 4 files changed, 150 insertions(+), 17 deletions(-) diff --git a/ext/rtree/rtreedoc2.test b/ext/rtree/rtreedoc2.test index f9246a1043..ca0c6b31bd 100644 --- a/ext/rtree/rtreedoc2.test +++ b/ext/rtree/rtreedoc2.test @@ -242,7 +242,104 @@ foreach {tn q vals} { do_test 5.$tn.2 { set ::box_geom } $vals } - +do_execsql_test 5.0 { + CREATE VIRTUAL TABLE myrtree USING rtree(id, x1,x2); + INSERT INTO myrtree VALUES(1, 1, 1); + INSERT INTO myrtree VALUES(2, 2, 2); + INSERT INTO myrtree VALUES(3, 3, 3); +} + +# EVIDENCE-OF: R-44448-00687 The pUser and xDelUser members of the +# sqlite3_rtree_geometry structure are initially set to NULL. +set ::box_geom_calls 0 +proc box_geom {args} { + incr ::box_geom_calls + return user_is_zero +} +do_execsql_test 5.1.1 { + SELECT * FROM myrtree WHERE id MATCH box(4, 5); +} +do_test 5.1.2 { set ::box_geom_calls } 3 + + +# EVIDENCE-OF: R-55837-00155 The pUser variable may be set by the +# callback implementation to any arbitrary value that may be useful to +# subsequent invocations of the callback within the same query (for +# example, a pointer to a complicated data structure used to test for +# region intersection). +# +# EVIDENCE-OF: R-34745-08839 If the xDelUser variable is set to a +# non-NULL value, then after the query has finished running SQLite +# automatically invokes it with the value of the pUser variable as the +# only argument. +# +set ::box_geom_calls 0 +proc box_geom {args} { + incr ::box_geom_calls + switch -- $::box_geom_calls { + 1 { + return user_is_zero + } + 2 { + return [list user box_geom_finalizer] + } + } + return "" +} +proc box_geom_finalizer {} { + set ::box_geom_finalizer "::box_geom_calls is $::box_geom_calls" +} +do_execsql_test 5.1.1 { + SELECT * FROM myrtree WHERE id MATCH box(4, 5); +} +do_test 5.1.2 { set ::box_geom_calls } 3 +do_test 5.1.3 { + set ::box_geom_finalizer +} {::box_geom_calls is 3} + + +# EVIDENCE-OF: R-28176-28813 The xGeom callback always does a +# depth-first search of the r-tree. +# +# For a breadth first search, final test case would return "B L" only. +# +do_execsql_test 6.0 { + CREATE VIRTUAL TABLE xyz USING rtree(x, x1,x2, y1,y2); + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<15 + ) + INSERT INTO xyz SELECT NULL, one.i,one.i+1, two.i,two.i+1 FROM s one, s two; +} +do_execsql_test 6.1 { + SELECT count(*) FROM xyz_node +} {10} +proc box_geom {args} { + set coords [lindex $args 3] + set area [expr { + ([lindex $coords 1]-[lindex $coords 0]) * + ([lindex $coords 3]-[lindex $coords 2]) + }] + if {$area==1} { + lappend ::box_geom_calls L + } else { + lappend ::box_geom_calls B + } +} +set ::box_geom_calls [list] +do_execsql_test 6.2 { + SELECT count(*) FROM xyz WHERE x MATCH box(0,20,0,20) +} 225 +do_test 6.3 { + set prev "" + set box_calls [list] + foreach c $::box_geom_calls { + if {$c!=$prev} { + lappend ::box_calls $c + set prev $c + } + } + set ::box_calls +} {B L B L B L B L B L B L B L B L B L} finish_test diff --git a/ext/rtree/test_rtreedoc.c b/ext/rtree/test_rtreedoc.c index b19639e025..6eafef806f 100644 --- a/ext/rtree/test_rtreedoc.c +++ b/ext/rtree/test_rtreedoc.c @@ -31,6 +31,13 @@ struct BoxGeomCtx { Tcl_Obj *pScript; }; +static void testDelUser(void *pCtx){ + BoxGeomCtx *p = (BoxGeomCtx*)pCtx; + Tcl_EvalObjEx(p->interp, p->pScript, 0); + Tcl_DecrRefCount(p->pScript); + sqlite3_free(p); +} + static int invokeTclGeomCb( const char *zName, sqlite3_rtree_geometry *p, @@ -48,6 +55,7 @@ static int invokeTclGeomCb( int ii; Tcl_Obj *pRes; + pScript = Tcl_DuplicateObj(pCtx->pScript); Tcl_IncrRefCount(pScript); Tcl_ListObjAppendElement(interp, pScript, Tcl_NewStringObj(zName,-1)); @@ -73,12 +81,41 @@ static int invokeTclGeomCb( Tcl_ListObjAppendElement(interp, pScript, Tcl_NewStringObj(aPtr,-1)); rc = Tcl_EvalObjEx(interp, pScript, 0); - if( rc!=TCL_OK ) rc = SQLITE_ERROR; + if( rc!=TCL_OK ){ + rc = SQLITE_ERROR; + }else{ + int nObj = 0; + Tcl_Obj **aObj = 0; - pRes = Tcl_GetObjResult(interp); - if( 0==sqlite3_stricmp(Tcl_GetString(pRes), "zero") ){ - p->aParam[0] = 0.0; - p->nParam = 1; + pRes = Tcl_GetObjResult(interp); + if( Tcl_ListObjGetElements(interp, pRes, &nObj, &aObj) ) return TCL_ERROR; + if( nObj>0 ){ + const char *zCmd = Tcl_GetString(aObj[0]); + if( 0==sqlite3_stricmp(zCmd, "zero") ){ + p->aParam[0] = 0.0; + p->nParam = 1; + } + else if( 0==sqlite3_stricmp(zCmd, "user") ){ + if( p->pUser || p->xDelUser ){ + rc = SQLITE_ERROR; + }else{ + BoxGeomCtx *pCtx = sqlite3_malloc(sizeof(BoxGeomCtx)); + if( pCtx==0 ){ + rc = SQLITE_NOMEM; + }else{ + pCtx->interp = interp; + pCtx->pScript = Tcl_DuplicateObj(pRes); + Tcl_IncrRefCount(pCtx->pScript); + Tcl_ListObjReplace(interp, pCtx->pScript, 0, 1, 0, 0); + p->pUser = (void*)pCtx; + p->xDelUser = testDelUser; + } + } + } + else if( 0==sqlite3_stricmp(zCmd, "user_is_zero") ){ + if( p->pUser || p->xDelUser ) rc = SQLITE_ERROR; + } + } } } return rc; @@ -140,7 +177,6 @@ static int SQLITE_TCLAPI register_box_geom( extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); extern const char *sqlite3ErrName(int); sqlite3 *db; - int rc; BoxGeomCtx *pCtx; char aPtr[64]; @@ -155,7 +191,7 @@ static int SQLITE_TCLAPI register_box_geom( pCtx->pScript = Tcl_DuplicateObj(objv[2]); Tcl_IncrRefCount(pCtx->pScript); - rc = sqlite3_rtree_geometry_callback(db, "box", box_geom, (void*)pCtx); + sqlite3_rtree_geometry_callback(db, "box", box_geom, (void*)pCtx); sqlite3_snprintf(64, aPtr, "%p", (void*)pCtx); Tcl_SetObjResult(interp, Tcl_NewStringObj(aPtr, -1)); diff --git a/manifest b/manifest index 0fc98d5964..d3509e1aa8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Shell's\s.read\spipe\snow\sworks\sfor\sWindows\stoo. -D 2021-09-17T21:12:47.392 +C Further\stests\sfor\slegacy\srtree\sgeom\scallbacks. +D 2021-09-18T16:15:54.996 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -419,10 +419,10 @@ F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d F ext/rtree/rtreedoc.test 243cd3fdee1cb89e290e908ddde0cc0cfda0ccb85473c6d1b3c43e6260b14cac -F ext/rtree/rtreedoc2.test ae13849b390f6878434896ecee113cc44bb2bcbcd868f6c47b5d80a73e3e4ab1 +F ext/rtree/rtreedoc2.test 194ebb7d561452dcdc10bf03f44e30c082c2f0c14efeb07f5e02c7daf8284d93 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/test_rtreedoc.c 72f78e9930e861ba2a780f36cb6ecbf02ebda350111ecab9594c564c10a30b1c +F ext/rtree/test_rtreedoc.c 216f988e0b56474a3d42905653777772d3bdd413a7fe09a79e466b19296853b0 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 @@ -1925,7 +1925,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 6ad00e52eda5bc4cb8e6fffbd7538bcd4c6b22f84b837a746eba6bf8c91eb55a -R 4272cac65b9ce52e86aa091f7c699703 -U larrybr -Z f2dab7d439a0b553d4ffc2b434c528dd +P 929bcc4098549692c573779d65c4c28027b0a2f48ebbf5b3f038deee24374b67 +R b53a2568f9f1adf1f421cbce84f79cd1 +U dan +Z 0f8167edfa350ba64179ebda312bfead diff --git a/manifest.uuid b/manifest.uuid index d0c60f0e49..bd0f76d7b3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -929bcc4098549692c573779d65c4c28027b0a2f48ebbf5b3f038deee24374b67 \ No newline at end of file +99d6bb22e8735681443bfe67287aa15ce2c57d0d63e304abf8aa01fde50dd021 \ No newline at end of file From 6b7e47fa585d2fc9e63bada61e0da8b929523e9e Mon Sep 17 00:00:00 2001 From: larrybr Date: Sun, 19 Sep 2021 18:31:55 +0000 Subject: [PATCH 082/130] Adjust shell tests for *Nix and Windows test platform anomaly FossilOrigin-Name: 577544c5a2f193e00e5ca55b7feae96568198019573b9b0b37e2bf4300d6d524 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/shell2.test | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 2524fc7ae7..990a0ef0bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Sync\sw/trunk,\sfurther\sstreamline\sshell's\sresumable\sprescan. -D 2021-09-18T21:35:22.366 +C Adjust\sshell\stests\sfor\s*Nix\sand\sWindows\stest\splatform\sanomaly +D 2021-09-19T18:31:55.750 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1375,7 +1375,7 @@ F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/shell1.test 56a7358a2a05e850e9e4aa24629db9c8975e8038dbe8debd2d95be22a5f03612 -F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b +F test/shell2.test a03b835a9e7dcc1f79b471e4d62e0c85bdc4cb954a00820702603f1409553caf F test/shell3.test 1586a163e7918775d3c25530bf84200453f30a77cc338490389114a67352f4d9 F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f48be F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe @@ -1925,7 +1925,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 15b105c520968855ad960d8929f80af9e9bedc155237af9af1956f7b546947f2 99d6bb22e8735681443bfe67287aa15ce2c57d0d63e304abf8aa01fde50dd021 -R 49a56387d26f2bce27d3217e1e0550b1 +P 9e00f9f7c03c192a3fb6b22851db0626515c59daac5ce6520229c42c838bf5b7 +R a262f509a9bdc0e9fae37cb35e7b774a U larrybr -Z f54f51b048cd8993f1718034d535befc +Z c20e0c055c38369d11323498c4dfd701 diff --git a/manifest.uuid b/manifest.uuid index 0573cfc715..3d8514f057 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e00f9f7c03c192a3fb6b22851db0626515c59daac5ce6520229c42c838bf5b7 \ No newline at end of file +577544c5a2f193e00e5ca55b7feae96568198019573b9b0b37e2bf4300d6d524 \ No newline at end of file diff --git a/test/shell2.test b/test/shell2.test index 2de6bf7514..4f2f4f3f63 100644 --- a/test/shell2.test +++ b/test/shell2.test @@ -43,10 +43,10 @@ do_test shell2-1.1.1 { # Shell silently ignores extra parameters. # Ticket [f5cb008a65]. do_test shell2-1.2.1 { - set rc [catch { eval exec $CLI \":memory:\" \"select+3\" \"select+4\" } msg] - list $rc $msg + catchcmdex {:memory: "select+3" "select+4"} } {0 {3 -4}} +4 +}} # Test a problem reported on the mailing list. The shell was at one point # returning the generic SQLITE_ERROR message ("SQL error or missing database") @@ -123,7 +123,7 @@ SELECT * FROM foo;} # NB. whitespace is important do_test shell2-1.4.5 { forcedelete foo.db - catchcmd "foo.db" {.echo ON + catchcmdex "foo.db" {.echo ON CREATE TABLE foo1(a); INSERT INTO foo1(a) VALUES(1); CREATE TABLE foo2(b); @@ -155,7 +155,7 @@ SELECT * FROM foo2; # NB. whitespace is important do_test shell2-1.4.6 { forcedelete foo.db - catchcmd "foo.db" {.echo ON + catchcmdex "foo.db" {.echo ON .headers ON CREATE TABLE foo1(a); INSERT INTO foo1(a) VALUES(1); From 3d9974342345fc159b0053e0a51adb48f6366e23 Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 20 Sep 2021 20:15:28 +0000 Subject: [PATCH 083/130] Allow fileio extension to be a stand-alone DLL for Win32 FossilOrigin-Name: d1cc3105b2baceb9f426fd6bc8d8317de3af09a0f02517715bd292c68e282fa1 --- ext/misc/fileio.c | 35 +++++++++++++++++++++++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index d977d41ddc..deb714cee8 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -72,6 +72,11 @@ ** $path is a relative path, then $path is interpreted relative to $dir. ** And the paths returned in the "name" column of the table are also ** relative to directory $dir. +** +** Notes on building this extension for Windows: +** Unless linked statically with the SQLite library, a preprocessor +** symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone +** DLL form of this extension for WIN32. See its use below for details. */ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 @@ -225,6 +230,22 @@ static sqlite3_uint64 fileTimeToUnixTime( return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000; } + +#if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32)) +# /* To allow a standalone DLL, use this next replacement function: */ +# undef sqlite3_win32_utf8_to_unicode +# define sqlite3_win32_utf8_to_unicode utf8_to_utf16 +# +LPWSTR utf8_to_utf16(const char *z){ + int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0); + LPWSTR rv = malloc(nAllot * sizeof(WCHAR)); + if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) ) + return rv; + free(rv); + return 0; +} +#endif + /* ** This function attempts to normalize the time values found in the stat() ** buffer to UTC. This is necessary on Win32, where the runtime library @@ -998,3 +1019,17 @@ int sqlite3_fileio_init( } return rc; } + +#if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32)) + /* To allow a standalone DLL, make test_windirent.c take these next + * 3 functions from C runtime instead of from SQLite library: */ +# undef sqlite3_malloc +# define sqlite3_malloc malloc +# undef sqlite3_free +# define sqlite3_free free +# undef sqlite3_stricmp +# define sqlite3_stricmp stricmp + /* Just pull in this .c so above redefines take said effect. As a + * side-effect, this extension becomes a single translation unit. */ +# include "test_windirent.c" +#endif diff --git a/manifest b/manifest index d3509e1aa8..33f095e45c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\stests\sfor\slegacy\srtree\sgeom\scallbacks. -D 2021-09-18T16:15:54.996 +C Allow\sfileio\sextension\sto\sbe\sa\sstand-alone\sDLL\sfor\sWin32 +D 2021-09-20T20:15:28.135 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -301,7 +301,7 @@ F ext/misc/dbdump.c b8592f6f2da292c62991a13864a60d6c573c47a9cc58362131b9e6a64f82 F ext/misc/decimal.c 09f967dcf4a1ee35a76309829308ec278d3648168733f4a1147820e11ebefd12 F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 F ext/misc/explain.c 0086fab288d4352ea638cf40ac382aad3b0dc5e845a1ea829a694c015fd970fe -F ext/misc/fileio.c 9b69e25da3b51d4a1d905a464ccb96709792ad627a742ba09215bc0d1447e7bd +F ext/misc/fileio.c 896dcad10a0c584647995b4aa2be7f5802b02fb237171f6a394ea89f264d7053 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c cd6ab89f85fda8a020559b3f4d03001a8a62dd856beda5af3f558621d12be913 @@ -1925,7 +1925,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 929bcc4098549692c573779d65c4c28027b0a2f48ebbf5b3f038deee24374b67 -R b53a2568f9f1adf1f421cbce84f79cd1 -U dan -Z 0f8167edfa350ba64179ebda312bfead +P 99d6bb22e8735681443bfe67287aa15ce2c57d0d63e304abf8aa01fde50dd021 +R afb4d54eb24c4692fcc97528588cab39 +U larrybr +Z 5b9c18b20b82047bc497d18ca81df306 diff --git a/manifest.uuid b/manifest.uuid index bd0f76d7b3..9a59a58df5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -99d6bb22e8735681443bfe67287aa15ce2c57d0d63e304abf8aa01fde50dd021 \ No newline at end of file +d1cc3105b2baceb9f426fd6bc8d8317de3af09a0f02517715bd292c68e282fa1 \ No newline at end of file From b3e44231379c2977b845621d10486ca416c60b8b Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 20 Sep 2021 21:42:39 +0000 Subject: [PATCH 084/130] Accomplish fileio standalone for Win32 with less intervention. FossilOrigin-Name: af5dcc9c2a3a45d10b985f6b7ea18d39c75502ed10fa6496aad787dbe8c8c3fb --- ext/misc/fileio.c | 18 ++++++------------ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index deb714cee8..c9988f6078 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -238,10 +238,10 @@ static sqlite3_uint64 fileTimeToUnixTime( # LPWSTR utf8_to_utf16(const char *z){ int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0); - LPWSTR rv = malloc(nAllot * sizeof(WCHAR)); + LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR)); if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) ) return rv; - free(rv); + sqlite3_free(rv); return 0; } #endif @@ -1021,15 +1021,9 @@ int sqlite3_fileio_init( } #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32)) - /* To allow a standalone DLL, make test_windirent.c take these next - * 3 functions from C runtime instead of from SQLite library: */ -# undef sqlite3_malloc -# define sqlite3_malloc malloc -# undef sqlite3_free -# define sqlite3_free free -# undef sqlite3_stricmp -# define sqlite3_stricmp stricmp - /* Just pull in this .c so above redefines take said effect. As a - * side-effect, this extension becomes a single translation unit. */ +/* To allow a standalone DLL, make test_windirent.c use the same + * redefined SQLite API calls as the above extension code does. + * Just pull in this .c to accomplish this. As a beneficial side + * effect, this extension becomes a single translation unit. */ # include "test_windirent.c" #endif diff --git a/manifest b/manifest index 33f095e45c..6cdb72f974 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sfileio\sextension\sto\sbe\sa\sstand-alone\sDLL\sfor\sWin32 -D 2021-09-20T20:15:28.135 +C Accomplish\sfileio\sstandalone\sfor\sWin32\swith\sless\sintervention. +D 2021-09-20T21:42:39.389 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -301,7 +301,7 @@ F ext/misc/dbdump.c b8592f6f2da292c62991a13864a60d6c573c47a9cc58362131b9e6a64f82 F ext/misc/decimal.c 09f967dcf4a1ee35a76309829308ec278d3648168733f4a1147820e11ebefd12 F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 F ext/misc/explain.c 0086fab288d4352ea638cf40ac382aad3b0dc5e845a1ea829a694c015fd970fe -F ext/misc/fileio.c 896dcad10a0c584647995b4aa2be7f5802b02fb237171f6a394ea89f264d7053 +F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab90058e0 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c cd6ab89f85fda8a020559b3f4d03001a8a62dd856beda5af3f558621d12be913 @@ -1925,7 +1925,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 99d6bb22e8735681443bfe67287aa15ce2c57d0d63e304abf8aa01fde50dd021 -R afb4d54eb24c4692fcc97528588cab39 +P d1cc3105b2baceb9f426fd6bc8d8317de3af09a0f02517715bd292c68e282fa1 +R b25569838c321c8a1dce73819376c2fc U larrybr -Z 5b9c18b20b82047bc497d18ca81df306 +Z 29bd4bd5979c45d391558f5226ed2e5b diff --git a/manifest.uuid b/manifest.uuid index 9a59a58df5..6ec998e465 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1cc3105b2baceb9f426fd6bc8d8317de3af09a0f02517715bd292c68e282fa1 \ No newline at end of file +af5dcc9c2a3a45d10b985f6b7ea18d39c75502ed10fa6496aad787dbe8c8c3fb \ No newline at end of file From 2e50f6707385af215c77dbaf4edc68dc3d0a601a Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 21 Sep 2021 17:26:23 +0000 Subject: [PATCH 085/130] Add the "PRAGMA table_list" command with its corresponding eponymous table-valued function: "pragma_table_list". FossilOrigin-Name: 2c0e7ae541e9ecb86aa58fa7e7057def8aac1b1af1af1aa80b8bf2d260f9a2f9 --- ext/rtree/rtree1.test | 5 +- manifest | 26 ++++---- manifest.uuid | 2 +- src/pragma.c | 48 +++++++++++++++ src/pragma.h | 128 +++++++++++++++++++++------------------ test/strict1.test | 4 +- test/view.test | 3 + test/without_rowid1.test | 3 + tool/mkpragmatab.tcl | 6 ++ 9 files changed, 151 insertions(+), 74 deletions(-) diff --git a/ext/rtree/rtree1.test b/ext/rtree/rtree1.test index c37a2a77d5..0423bf557c 100644 --- a/ext/rtree/rtree1.test +++ b/ext/rtree/rtree1.test @@ -57,9 +57,12 @@ ifcapable !rtree { do_test rtree-1.1.1 { execsql { CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2) } } {} -do_test rtree-1.1.2 { +do_test rtree-1.1.2a { execsql { SELECT name FROM sqlite_master ORDER BY name } } {t1 t1_node t1_parent t1_rowid} +do_execsql_test rtree-1.1.2b { + SELECT name FROM pragma_table_list WHERE type='shadow' ORDER BY name; +} {t1_node t1_parent t1_rowid} do_test rtree-1.1.3 { execsql { DROP TABLE t1; diff --git a/manifest b/manifest index 6cdb72f974..1fc3e72396 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Accomplish\sfileio\sstandalone\sfor\sWin32\swith\sless\sintervention. -D 2021-09-20T21:42:39.389 +C Add\sthe\s"PRAGMA\stable_list"\scommand\swith\sits\scorresponding\seponymous\ntable-valued\sfunction:\s"pragma_table_list". +D 2021-09-21T17:26:23.956 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -395,7 +395,7 @@ F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b F ext/rtree/rtree.c fb930d5bee9deb9efbfbed72be56a0d4e4950ab216284fb5ec1c9863d32a32fa F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e +F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b @@ -540,8 +540,8 @@ F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c 2b31671ff0cc1653e5e0544adfc80f46a8165c3f6d1c014dfc62c922859df85a -F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 +F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c +F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c @@ -1428,7 +1428,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test 1e80c6ae71702c7cebacbc9c61d0c58e270b4cc8004c187296e39432015bf2be +F test/strict1.test ac29180be09313af1d5086420e8b7a832f9bf777653c4cbc64d7fd478000b3f0 F test/strict2.test e78cedd56eb1c3e0b09b16c594dbfcb7e95bc6d85f68f0fd6501c243be28e219 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f @@ -1689,7 +1689,7 @@ F test/vacuum6.test d3173a54edc81d13d99e4cf4972232b3cbb52f1d56ed48c3a939ef4e751c F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test ea88361d5e9bc8eabf9f573185a16aea73a885be9b6c6a95ae84908913416a80 +F test/view.test 798cf7936dda022d3ab0a4871685410d1c3b2a525b6b213915abc836e82a1078 F test/view2.test db32c8138b5b556f610b35dfddd38c5a58a292f07fda5281eedb0851b2672679 F test/vtab1.test 772c94825d455dffc5da34dcf4b648d8a23887616185fa024a472bf745e56df8 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 @@ -1808,7 +1808,7 @@ F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f1982 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8 F test/with6.test 661d7e416bef6c0a2556b2c9f0c8178a5b15932bed65246abed99723a8d4e7c0 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 6abc5d497f634520944dac0a89a6c240a48d2ee0f8353356a750eb70dc1db41a +F test/without_rowid1.test a1c144156d1d21eea7b2b0db62ad0aaed37d4e163eb5758ae6b6647cc0b4412f F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053d68d4b2f67b F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a @@ -1858,7 +1858,7 @@ F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a89 F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef F tool/mkopcodeh.tcl 130b88697da6ec5b89b41844d955d08fb62c2552e889dec8c7bcecb28d8f50bd F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl 7f6db47d1995bc08247255622524567b2ab8962d98063f8aef97e35c3c54e3b8 +F tool/mkpragmatab.tcl 056338994c2a816076342dc1035294db3980152f514050067659af3ea4526361 F tool/mkshellc.tcl df5d249617f9cc94d5c48eb0401673eb3f31f383ecbc54e8a13ca3dd97e89450 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1925,7 +1925,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 d1cc3105b2baceb9f426fd6bc8d8317de3af09a0f02517715bd292c68e282fa1 -R b25569838c321c8a1dce73819376c2fc -U larrybr -Z 29bd4bd5979c45d391558f5226ed2e5b +P af5dcc9c2a3a45d10b985f6b7ea18d39c75502ed10fa6496aad787dbe8c8c3fb +R b7f36cbc91c6a24f15ccb096ef89f4e1 +U drh +Z cb33f0f0128d5123d146e61157efe535 diff --git a/manifest.uuid b/manifest.uuid index 6ec998e465..544944c85b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -af5dcc9c2a3a45d10b985f6b7ea18d39c75502ed10fa6496aad787dbe8c8c3fb \ No newline at end of file +2c0e7ae541e9ecb86aa58fa7e7057def8aac1b1af1af1aa80b8bf2d260f9a2f9 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 34d2d4c05c..8abbeb92ea 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1194,6 +1194,54 @@ void sqlite3Pragma( } break; + /* + ** PRAGMA table_list + ** + ** Return a single row for each table, virtual table, or view in the + ** entire schema. + ** + ** schema: Name of attached database hold this table + ** name: Name of the table itself + ** type: "table", "view", "virtual", "shadow" + ** ncol: Number of columns + ** wr: True for a WITHOUT ROWID table + ** strict: True for a STRICT table + */ + case PragTyp_TABLE_LIST: { + int ii; + pParse->nMem = 6; + sqlite3CodeVerifyNamedSchema(pParse, zDb); + for(ii=0; iinDb; ii++){ + HashElem *k; + Hash *pHash; + if( zDb && sqlite3_stricmp(zDb, db->aDb[ii].zDbSName)!=0 ) continue; + pHash = &db->aDb[ii].pSchema->tblHash; + for(k=sqliteHashFirst(pHash); k; k=sqliteHashNext(k) ){ + Table *pTab = sqliteHashData(k); + const char *zType; + if( zRight && sqlite3_stricmp(zRight, pTab->zName)!=0 ) continue; + if( IsView(pTab) ){ + zType = "view"; + }else if( IsVirtual(pTab) ){ + zType = "virtual"; + }else if( pTab->tabFlags & TF_Shadow ){ + zType = "shadow"; + }else{ + zType = "table"; + } + sqlite3VdbeMultiLoad(v, 1, "sssiii", + db->aDb[ii].zDbSName, + pTab->zName, + zType, + pTab->nCol, + (pTab->tabFlags & TF_WithoutRowid)!=0, + (pTab->tabFlags & TF_Strict)!=0 + ); + } + } + } + break; + #ifdef SQLITE_DEBUG case PragTyp_STATS: { Index *pIdx; diff --git a/src/pragma.h b/src/pragma.h index fe3cdf1e32..f90de7c77b 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -43,13 +43,14 @@ #define PragTyp_SOFT_HEAP_LIMIT 35 #define PragTyp_SYNCHRONOUS 36 #define PragTyp_TABLE_INFO 37 -#define PragTyp_TEMP_STORE 38 -#define PragTyp_TEMP_STORE_DIRECTORY 39 -#define PragTyp_THREADS 40 -#define PragTyp_WAL_AUTOCHECKPOINT 41 -#define PragTyp_WAL_CHECKPOINT 42 -#define PragTyp_LOCK_STATUS 43 -#define PragTyp_STATS 44 +#define PragTyp_TABLE_LIST 38 +#define PragTyp_TEMP_STORE 39 +#define PragTyp_TEMP_STORE_DIRECTORY 40 +#define PragTyp_THREADS 41 +#define PragTyp_WAL_AUTOCHECKPOINT 42 +#define PragTyp_WAL_CHECKPOINT 43 +#define PragTyp_LOCK_STATUS 44 +#define PragTyp_STATS 45 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -82,45 +83,51 @@ static const char *const pragCName[] = { /* 13 */ "pk", /* 14 */ "hidden", /* table_info reuses 8 */ - /* 15 */ "seqno", /* Used by: index_xinfo */ - /* 16 */ "cid", - /* 17 */ "name", - /* 18 */ "desc", - /* 19 */ "coll", - /* 20 */ "key", - /* 21 */ "name", /* Used by: function_list */ - /* 22 */ "builtin", - /* 23 */ "type", - /* 24 */ "enc", - /* 25 */ "narg", - /* 26 */ "flags", - /* 27 */ "tbl", /* Used by: stats */ - /* 28 */ "idx", - /* 29 */ "wdth", - /* 30 */ "hght", - /* 31 */ "flgs", - /* 32 */ "seq", /* Used by: index_list */ - /* 33 */ "name", - /* 34 */ "unique", - /* 35 */ "origin", - /* 36 */ "partial", - /* 37 */ "table", /* Used by: foreign_key_check */ - /* 38 */ "rowid", - /* 39 */ "parent", - /* 40 */ "fkid", - /* index_info reuses 15 */ - /* 41 */ "seq", /* Used by: database_list */ - /* 42 */ "name", - /* 43 */ "file", - /* 44 */ "busy", /* Used by: wal_checkpoint */ - /* 45 */ "log", - /* 46 */ "checkpointed", - /* collation_list reuses 32 */ - /* 47 */ "database", /* Used by: lock_status */ - /* 48 */ "status", - /* 49 */ "cache_size", /* Used by: default_cache_size */ + /* 15 */ "schema", /* Used by: table_list */ + /* 16 */ "name", + /* 17 */ "type", + /* 18 */ "ncol", + /* 19 */ "wr", + /* 20 */ "strict", + /* 21 */ "seqno", /* Used by: index_xinfo */ + /* 22 */ "cid", + /* 23 */ "name", + /* 24 */ "desc", + /* 25 */ "coll", + /* 26 */ "key", + /* 27 */ "name", /* Used by: function_list */ + /* 28 */ "builtin", + /* 29 */ "type", + /* 30 */ "enc", + /* 31 */ "narg", + /* 32 */ "flags", + /* 33 */ "tbl", /* Used by: stats */ + /* 34 */ "idx", + /* 35 */ "wdth", + /* 36 */ "hght", + /* 37 */ "flgs", + /* 38 */ "seq", /* Used by: index_list */ + /* 39 */ "name", + /* 40 */ "unique", + /* 41 */ "origin", + /* 42 */ "partial", + /* 43 */ "table", /* Used by: foreign_key_check */ + /* 44 */ "rowid", + /* 45 */ "parent", + /* 46 */ "fkid", + /* index_info reuses 21 */ + /* 47 */ "seq", /* Used by: database_list */ + /* 48 */ "name", + /* 49 */ "file", + /* 50 */ "busy", /* Used by: wal_checkpoint */ + /* 51 */ "log", + /* 52 */ "checkpointed", + /* collation_list reuses 38 */ + /* 53 */ "database", /* Used by: lock_status */ + /* 54 */ "status", + /* 55 */ "cache_size", /* Used by: default_cache_size */ /* module_list pragma_list reuses 9 */ - /* 50 */ "timeout", /* Used by: busy_timeout */ + /* 56 */ "timeout", /* Used by: busy_timeout */ }; /* Definitions of all built-in pragmas */ @@ -171,7 +178,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "busy_timeout", /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 50, 1, + /* ColNames: */ 56, 1, /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) {/* zName: */ "cache_size", @@ -210,7 +217,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "collation_list", /* ePragTyp: */ PragTyp_COLLATION_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 32, 2, + /* ColNames: */ 38, 2, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) @@ -245,14 +252,14 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "database_list", /* ePragTyp: */ PragTyp_DATABASE_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, - /* ColNames: */ 41, 3, + /* ColNames: */ 47, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "default_cache_size", /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, - /* ColNames: */ 49, 1, + /* ColNames: */ 55, 1, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -282,7 +289,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "foreign_key_check", /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 37, 4, + /* ColNames: */ 43, 4, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) @@ -325,7 +332,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "function_list", /* ePragTyp: */ PragTyp_FUNCTION_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 21, 6, + /* ColNames: */ 27, 6, /* iArg: */ 0 }, #endif #endif @@ -354,17 +361,17 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "index_info", /* ePragTyp: */ PragTyp_INDEX_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 15, 3, + /* ColNames: */ 21, 3, /* iArg: */ 0 }, {/* zName: */ "index_list", /* ePragTyp: */ PragTyp_INDEX_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 32, 5, + /* ColNames: */ 38, 5, /* iArg: */ 0 }, {/* zName: */ "index_xinfo", /* ePragTyp: */ PragTyp_INDEX_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 15, 6, + /* ColNames: */ 21, 6, /* iArg: */ 1 }, #endif #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) @@ -404,7 +411,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "lock_status", /* ePragTyp: */ PragTyp_LOCK_STATUS, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 47, 2, + /* ColNames: */ 53, 2, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) @@ -543,7 +550,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "stats", /* ePragTyp: */ PragTyp_STATS, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, - /* ColNames: */ 27, 5, + /* ColNames: */ 33, 5, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) @@ -559,6 +566,11 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, /* ColNames: */ 8, 6, /* iArg: */ 0 }, + {/* zName: */ "table_list", + /* ePragTyp: */ PragTyp_TABLE_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1, + /* ColNames: */ 15, 6, + /* iArg: */ 1 }, {/* zName: */ "table_xinfo", /* ePragTyp: */ PragTyp_TABLE_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, @@ -634,7 +646,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "wal_checkpoint", /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, /* ePragFlg: */ PragFlg_NeedSchema, - /* ColNames: */ 44, 3, + /* ColNames: */ 50, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -645,4 +657,4 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; -/* Number of pragmas: 67 on by default, 77 total. */ +/* Number of pragmas: 68 on by default, 78 total. */ diff --git a/test/strict1.test b/test/strict1.test index da3d33856d..5e10af889b 100644 --- a/test/strict1.test +++ b/test/strict1.test @@ -46,7 +46,8 @@ do_execsql_test strict1-2.0 { d TEXT, e REAL ) STRICT; -} {} + SELECT strict FROM pragma_table_list('t1'); +} {1} do_catchsql_test strict1-2.1 { INSERT INTO t1(a) VALUES('xyz'); } {1 {cannot store TEXT value in INT column t1.a}} @@ -63,6 +64,7 @@ do_catchsql_test strict1-2.5 { INSERT INTO t1(e) VALUES('xyz'); } {1 {cannot store TEXT value in REAL column t1.e}} + do_execsql_test strict1-3.1 { INSERT INTO t1(a, b) VALUES(1,2),('3','4'),(5.0, 6.0),(null,null); SELECT a, b, '|' FROM t1; diff --git a/test/view.test b/test/view.test index b30d4162d0..68bfcad64d 100644 --- a/test/view.test +++ b/test/view.test @@ -55,6 +55,9 @@ do_test view-1.1.110 { SELECT * FROM v1temp ORDER BY a; } } {0 {1 2 4 5 7 8 1 2 4 5 7 8}} +do_execsql_test view-1.1.120 { + SELECT name, type FROM pragma_table_list('v1'); +} {v1 view} do_test view-1.2 { catchsql { ROLLBACK; diff --git a/test/without_rowid1.test b/test/without_rowid1.test index e4e69eb727..1dd7e10dde 100644 --- a/test/without_rowid1.test +++ b/test/without_rowid1.test @@ -38,6 +38,9 @@ integrity_check without_rowid1-1.0ic do_execsql_test_if_vtab without_rowid1-1.0ixi { SELECT name, key FROM pragma_index_xinfo('t1'); } {c 1 a 1 b 0 d 0} +do_execsql_test_if_vtab without_rowid1-1.0tl { + SELECT wr FROM pragma_table_list('t1'); +} {1} do_execsql_test without_rowid1-1.1 { SELECT *, '|' FROM t1 ORDER BY +c, a; diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index b24706ab95..530b6c2224 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -231,6 +231,12 @@ set pragma_def { COLS: cid name type notnull dflt_value pk hidden IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + NAME: table_list + TYPE: TABLE_LIST + FLAG: NeedSchema Result1 SchemaOpt + COLS: schema name type ncol wr strict + IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) + NAME: stats FLAG: NeedSchema Result0 SchemaReq COLS: tbl idx wdth hght flgs From b565bee66be88201eca940664296854ad5d38d1d Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 21 Sep 2021 20:03:05 +0000 Subject: [PATCH 086/130] Fix .expert name collision bug reported at https://sqlite.org/forum/forumpost/05e6f32984561f57?t=h FossilOrigin-Name: 4a3f98ad0dd2a8c0370042611a041bed2bd8d9ca82d6706e2db349eb97aaf1f0 --- ext/expert/expert1.test | 4 +-- ext/expert/sqlite3expert.c | 63 ++++++++++++++++++++++++++++++++------ manifest | 14 ++++----- manifest.uuid | 2 +- 4 files changed, 63 insertions(+), 20 deletions(-) diff --git a/ext/expert/expert1.test b/ext/expert/expert1.test index 3987d0c910..73541122d8 100644 --- a/ext/expert/expert1.test +++ b/ext/expert/expert1.test @@ -196,7 +196,7 @@ do_setup_rec_test $tn.9.1 { } { SELECT * FROM "t t" WHERE a=? } { - CREATE INDEX 't t_idx_00000061' ON 't t'(a); + CREATE INDEX "t t_idx_00000061" ON "t t"(a); SEARCH t t USING INDEX t t_idx_00000061 (a=?) } @@ -205,7 +205,7 @@ do_setup_rec_test $tn.9.2 { } { SELECT * FROM "t t" WHERE b BETWEEN ? AND ? } { - CREATE INDEX 't t_idx_00000062' ON 't t'(b); + CREATE INDEX "t t_idx_00000062" ON "t t"(b); SEARCH t t USING INDEX t t_idx_00000062 (b>? AND b0 && azResults[0][0]!='0' || azResults[0][1]!=0 ){ + *((int *)pCount) += 1; + } + return 0; +} + static int idxCreateFromCons( sqlite3expert *p, IdxScan *pScan, @@ -940,17 +952,40 @@ static int idxCreateFromCons( if( rc==SQLITE_OK ){ /* Hash the list of columns to come up with a name for the index */ const char *zTable = pScan->pTab->zName; - char *zName; /* Index name */ - int i; - for(i=0; zCols[i]; i++){ - h += ((h<<3) + zCols[i]); - } - zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); - if( zName==0 ){ + int quoteTable = idxIdentifierRequiresQuotes(zTable); + char *zName = 0; /* Index name */ + int collisions = 0; + do{ + int i; + char *zFind; + for(i=0; zCols[i]; i++){ + h += ((h<<3) + zCols[i]); + } + sqlite3_free(zName); + zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); + if( zName==0 ) break; + /* Is is unique among table, view and index names? */ + zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q" + " AND type in ('index','table','view')"; + zFind = sqlite3_mprintf(zFmt, zName); + i = 0; + rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0); + assert(rc==SQLITE_OK); + sqlite3_free(zFind); + if( i==0 ){ + collisions = 0; + break; + } + ++collisions; + }while( collisions<50 && zName!=0 ); + if( collisions ){ + /* This return means "Gave up trying to find a unique index name." */ + rc = SQLITE_BUSY_TIMEOUT; + }else if( zName==0 ){ rc = SQLITE_NOMEM; }else{ - if( idxIdentifierRequiresQuotes(zTable) ){ - zFmt = "CREATE INDEX '%q' ON %Q(%s)"; + if( quoteTable ){ + zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)"; }else{ zFmt = "CREATE INDEX %s ON %s(%s)"; } @@ -959,7 +994,11 @@ static int idxCreateFromCons( rc = SQLITE_NOMEM; }else{ rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg); - idxHashAdd(&rc, &p->hIdx, zName, zIdx); + if( rc!=SQLITE_OK ){ + rc = SQLITE_BUSY_TIMEOUT; + }else{ + idxHashAdd(&rc, &p->hIdx, zName, zIdx); + } } sqlite3_free(zName); sqlite3_free(zIdx); @@ -1883,6 +1922,10 @@ int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){ /* Create candidate indexes within the in-memory database file */ if( rc==SQLITE_OK ){ rc = idxCreateCandidates(p); + }else if ( rc==SQLITE_BUSY_TIMEOUT ){ + if( pzErr ) + *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose."); + return rc; } /* Generate the stat1 data */ diff --git a/manifest b/manifest index ae06b31714..4202f3e506 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Speed\sand\s(slightly)\ssimplify\sshell's\sinput\sline\searly\sprocessing. -D 2021-09-21T19:19:28.756 +C Fix\s.expert\sname\scollision\sbug\sreported\sat\shttps://sqlite.org/forum/forumpost/05e6f32984561f57?t=h +D 2021-09-21T20:03:05.965 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -50,8 +50,8 @@ F ext/async/sqlite3async.c 6f247666b495c477628dd19364d279c78ea48cd90c72d9f9b98ad F ext/async/sqlite3async.h 46b47c79357b97ad85d20d2795942c0020dc20c532114a49808287f04aa5309a F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 -F ext/expert/expert1.test 6703fd74711daf8230240680b0a348d0720e28819b602701adfbd32457fdcddd -F ext/expert/sqlite3expert.c fdcd3bd969351c4e860a1368a6ab64bc4c94d2d89396805b28853a514d06fd92 +F ext/expert/expert1.test 3c642a4e7bbb14f21ddab595436fb465a4733f47a0fe5b2855e1d5ff900ef08e +F ext/expert/sqlite3expert.c 396c9003d6fe94b6a82311bfe7c30fa430ec7efd56417bf6b32d11737c1624fb F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e @@ -1925,7 +1925,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 2c0e7ae541e9ecb86aa58fa7e7057def8aac1b1af1af1aa80b8bf2d260f9a2f9 577544c5a2f193e00e5ca55b7feae96568198019573b9b0b37e2bf4300d6d524 -R 3f0f5d8f4d6753399cf7fbd70ddb9c72 +P a1c7f7f8e1b46440234be96e813e4c2c28150413dd95dcab5d13b9c80a202edf +R 4025a996a7ae646cead16f1b9879d649 U larrybr -Z da72ab7831c9560c80854036f35fcf46 +Z c2e5ece08cc58eb5c76d74654bc5b60e diff --git a/manifest.uuid b/manifest.uuid index e1012aaf49..57b60e08fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1c7f7f8e1b46440234be96e813e4c2c28150413dd95dcab5d13b9c80a202edf \ No newline at end of file +4a3f98ad0dd2a8c0370042611a041bed2bd8d9ca82d6706e2db349eb97aaf1f0 \ No newline at end of file From 6d9f034ba87269e4968e8c40ddd4d2a17b4968ed Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Sep 2021 10:28:50 +0000 Subject: [PATCH 087/130] Use sqlite3_snprintf() for the ".changes" output formatting in the shell because it now uses %lld, and some older C compilers do not understand that construct. FossilOrigin-Name: 53dadf80672a4fe05341fe40873b6cfa73f6bc1e07cc41fcf10fe290c9156363 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4202f3e506..f86734c343 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\s.expert\sname\scollision\sbug\sreported\sat\shttps://sqlite.org/forum/forumpost/05e6f32984561f57?t=h -D 2021-09-21T20:03:05.965 +C Use\ssqlite3_snprintf()\sfor\sthe\s".changes"\soutput\sformatting\sin\sthe\sshell\nbecause\sit\snow\suses\s%lld,\sand\ssome\solder\sC\scompilers\sdo\snot\sunderstand\sthat\nconstruct. +D 2021-09-22T10:28:50.658 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -548,7 +548,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 -F src/shell.c.in 639c01f9a743ed73beb1d4b1e982b07b731c3801811d8344063f43b11008582a +F src/shell.c.in 937934e6f64502b7c33d1cce2a981a5fc34bb906d203186c3fa6aa24c41303d2 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1925,7 +1925,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 a1c7f7f8e1b46440234be96e813e4c2c28150413dd95dcab5d13b9c80a202edf -R 4025a996a7ae646cead16f1b9879d649 -U larrybr -Z c2e5ece08cc58eb5c76d74654bc5b60e +P 4a3f98ad0dd2a8c0370042611a041bed2bd8d9ca82d6706e2db349eb97aaf1f0 +R 51d44ac91d7412651fc030dfe8de96ff +U drh +Z 4a6f83300593abcce49be47ea108877f diff --git a/manifest.uuid b/manifest.uuid index 57b60e08fd..d91103bc4c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a3f98ad0dd2a8c0370042611a041bed2bd8d9ca82d6706e2db349eb97aaf1f0 \ No newline at end of file +53dadf80672a4fe05341fe40873b6cfa73f6bc1e07cc41fcf10fe290c9156363 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 513f9bcaee..3d8f9537dd 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10774,8 +10774,11 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ } return 1; }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ - raw_printf(p->out, "changes: %3lld total_changes: %lld\n", + char zLineBuf[2000]; + sqlite3_snprintf(sizeof(zLineBuf), zLineBuf, + "changes: %lld total_changes: %lld", sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); + raw_printf(p->out, "%s\n", zLineBuf); } return 0; } From 6caccc166099380c823d5d01512a559e592043f0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Sep 2021 10:57:30 +0000 Subject: [PATCH 088/130] Enhance the TCL-based test harness so that it is possible to list multiple test modules on the "testfixture" command-line and have them all run. For example: "./testfixture test/shell*.test" FossilOrigin-Name: 45caf9b85fc75abe80e3d2704fc634e4b103647c912c3fbffb1847d8cb581b62 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/permutations.test | 1 + test/tester.tcl | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f86734c343..81e29ecd28 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\ssqlite3_snprintf()\sfor\sthe\s".changes"\soutput\sformatting\sin\sthe\sshell\nbecause\sit\snow\suses\s%lld,\sand\ssome\solder\sC\scompilers\sdo\snot\sunderstand\sthat\nconstruct. -D 2021-09-22T10:28:50.658 +C Enhance\sthe\sTCL-based\stest\sharness\sso\sthat\sit\sis\spossible\sto\slist\smultiple\ntest\smodules\son\sthe\s"testfixture"\scommand-line\sand\shave\sthem\sall\srun.\nFor\sexample:\s"./testfixture\stest/shell*.test" +D 2021-09-22T10:57:30.139 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1271,7 +1271,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test 63da39a4234eed2ccd10bf7872de58e24d53a50d11014dc8a8ab9f252368e880 +F test/permutations.test dfdb3356ceb66e515193b12e3fd46706d28274142dc46fd37da63fda9cd4a68a F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f F test/pragma.test 30d5bbebd5e9cb5383155cf3f3c81297b98f6642d152e9d4100cf6888630da2c F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1459,7 +1459,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl 0b7957eb669371250008a5e1fef5902257905fd6d560e8834be1ac4a0620063a +F test/tester.tcl 9426f7385393fbb6ba90e12ca51d0caf65e48b6a98c0dd169676d93b8c79d34c F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1925,7 +1925,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 4a3f98ad0dd2a8c0370042611a041bed2bd8d9ca82d6706e2db349eb97aaf1f0 -R 51d44ac91d7412651fc030dfe8de96ff +P 53dadf80672a4fe05341fe40873b6cfa73f6bc1e07cc41fcf10fe290c9156363 +R 5244f50bd3fe05d429a87a51b744ef41 U drh -Z 4a6f83300593abcce49be47ea108877f +Z 29d5ac3e2534c1f9975002934557c543 diff --git a/manifest.uuid b/manifest.uuid index d91103bc4c..85157aca4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -53dadf80672a4fe05341fe40873b6cfa73f6bc1e07cc41fcf10fe290c9156363 \ No newline at end of file +45caf9b85fc75abe80e3d2704fc634e4b103647c912c3fbffb1847d8cb581b62 \ No newline at end of file diff --git a/test/permutations.test b/test/permutations.test index b652f8571c..34404f8876 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -1236,5 +1236,6 @@ if {[file tail $argv0] == "permutations.test"} { } } main $argv + set argv {} finish_test } diff --git a/test/tester.tcl b/test/tester.tcl index d7dc21157a..349a5d1232 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -89,6 +89,9 @@ # verbose # +# Only run this script once. If sourced a second time, make it a no-op +if {[info exists ::tester_tcl_has_run]} return + # Set the precision of FP arithmatic used by the interpreter. And # configure SQLite to take database file locks on the page that begins # 64KB into the database file instead of the one 1GB in. This means @@ -1203,6 +1206,17 @@ proc speed_trial_summary {name} { # Run this routine last # proc finish_test {} { + global argv + if {[llength $argv]>0} { + # If additional test scripts are specified on the command-line, + # run them also, before quitting. + proc finish_test {} {return} + foreach extra $argv { + puts "Running \"$extra\"" + db_delete_and_reopen + uplevel #0 source $extra + } + } catch {db close} catch {db1 close} catch {db2 close} @@ -2497,3 +2511,5 @@ extra_schema_checks 1 source $testdir/thread_common.tcl source $testdir/malloc_common.tcl + +set tester_tcl_has_run 1 From c2f61c18d1f357f3ba8a65e22f2af0a30ccd85ff Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Sep 2021 13:07:10 +0000 Subject: [PATCH 089/130] Fix an incorrect assert() in rtree that was added recently by [f7ad73c49507c943]. Change it to testcase(). FossilOrigin-Name: 3aa0bf3a098ee9a62c79f266f94e4d290056d0f3e91237944893d6bbb686861f --- ext/rtree/rtree.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 8507558206..3dc0a6602a 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2751,7 +2751,7 @@ static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ pParent = pNode->pParent; pNode->pParent = 0; rc = deleteCell(pRtree, pParent, iCell, iHeight+1); - assert( rc==SQLITE_OK ); + testcase( rc!=SQLITE_OK ); } rc2 = nodeRelease(pRtree, pParent); if( rc==SQLITE_OK ){ diff --git a/manifest b/manifest index 81e29ecd28..dc9c49a24e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sTCL-based\stest\sharness\sso\sthat\sit\sis\spossible\sto\slist\smultiple\ntest\smodules\son\sthe\s"testfixture"\scommand-line\sand\shave\sthem\sall\srun.\nFor\sexample:\s"./testfixture\stest/shell*.test" -D 2021-09-22T10:57:30.139 +C Fix\san\sincorrect\sassert()\sin\srtree\sthat\swas\sadded\srecently\nby\s[f7ad73c49507c943].\s\sChange\sit\sto\stestcase(). +D 2021-09-22T13:07:10.230 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c fb930d5bee9deb9efbfbed72be56a0d4e4950ab216284fb5ec1c9863d32a32fa +F ext/rtree/rtree.c e3b689c6a2622c572775f26149c4c30bc4cc9e7ddc19810cbaef7f76032b0475 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1925,7 +1925,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 53dadf80672a4fe05341fe40873b6cfa73f6bc1e07cc41fcf10fe290c9156363 -R 5244f50bd3fe05d429a87a51b744ef41 +P 45caf9b85fc75abe80e3d2704fc634e4b103647c912c3fbffb1847d8cb581b62 +R 18c994158855b99a39b5ecbe11efbe96 U drh -Z 29d5ac3e2534c1f9975002934557c543 +Z fd827f5cffe8a64ecb1c57c1564b8e54 diff --git a/manifest.uuid b/manifest.uuid index 85157aca4a..2fd79c5430 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45caf9b85fc75abe80e3d2704fc634e4b103647c912c3fbffb1847d8cb581b62 \ No newline at end of file +3aa0bf3a098ee9a62c79f266f94e4d290056d0f3e91237944893d6bbb686861f \ No newline at end of file From fd7abcd15b78093f9da6326f59e56ec23786bfdf Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Sep 2021 13:43:16 +0000 Subject: [PATCH 090/130] Fix harmless compiler warnings in shell.c.in, and a compiler warning in sqlite3expert.c which is a real error, though also harmless. FossilOrigin-Name: 56da0e9c0321d1fd3c360722cd6284296f9ba459f6b37ab35c81ecabd18f12e3 --- ext/expert/sqlite3expert.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 6 ++---- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index 87543c9d6f..a59e8a1e6f 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -920,7 +920,7 @@ static int idxFindCompatible( */ static int countNonzeros(void* pCount, int nc, char* azResults[], char* azColumns[]){ - if( nc>0 && azResults[0][0]!='0' || azResults[0][1]!=0 ){ + if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){ *((int *)pCount) += 1; } return 0; diff --git a/manifest b/manifest index dc9c49a24e..d47348ad6c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\sassert()\sin\srtree\sthat\swas\sadded\srecently\nby\s[f7ad73c49507c943].\s\sChange\sit\sto\stestcase(). -D 2021-09-22T13:07:10.230 +C Fix\sharmless\scompiler\swarnings\sin\sshell.c.in,\sand\sa\scompiler\swarning\sin\nsqlite3expert.c\swhich\sis\sa\sreal\serror,\sthough\salso\sharmless. +D 2021-09-22T13:43:16.118 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -51,7 +51,7 @@ F ext/async/sqlite3async.h 46b47c79357b97ad85d20d2795942c0020dc20c532114a4980828 F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 F ext/expert/expert1.test 3c642a4e7bbb14f21ddab595436fb465a4733f47a0fe5b2855e1d5ff900ef08e -F ext/expert/sqlite3expert.c 396c9003d6fe94b6a82311bfe7c30fa430ec7efd56417bf6b32d11737c1624fb +F ext/expert/sqlite3expert.c 73a57faa14d7d627aae18bfc8dfcdcadc9dc48c6133777f61bebbf8b9bdbab39 F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e @@ -548,7 +548,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 -F src/shell.c.in 937934e6f64502b7c33d1cce2a981a5fc34bb906d203186c3fa6aa24c41303d2 +F src/shell.c.in 0d6ddfcc9b49e94d73406baa6121ab050482dbbab8eb5c77ca2cf6e8b9f6ab0b F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1925,7 +1925,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 45caf9b85fc75abe80e3d2704fc634e4b103647c912c3fbffb1847d8cb581b62 -R 18c994158855b99a39b5ecbe11efbe96 +P 3aa0bf3a098ee9a62c79f266f94e4d290056d0f3e91237944893d6bbb686861f +R 02452d96ccf2df8f99cd8b1cd27c57d1 U drh -Z fd827f5cffe8a64ecb1c57c1564b8e54 +Z 6efbe061fb0b8100b00437218a7d30c4 diff --git a/manifest.uuid b/manifest.uuid index 2fd79c5430..47a36a53bf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3aa0bf3a098ee9a62c79f266f94e4d290056d0f3e91237944893d6bbb686861f \ No newline at end of file +56da0e9c0321d1fd3c360722cd6284296f9ba459f6b37ab35c81ecabd18f12e3 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 3d8f9537dd..c996f58027 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10640,7 +10640,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss){ char cWait = (char)qss; /* intentional narrowing loss */ if( cWait==0 ){ PlainScan: - while (cin = *zLine++){ + while( (cin = *zLine++)!=0 ){ if( IsSpace(cin) ) continue; switch (cin){ @@ -10676,7 +10676,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss){ } }else{ TermScan: - while (cin = *zLine++){ + while( (cin = *zLine++)!=0 ){ if( cin==cWait ){ switch( cWait ){ case '*': @@ -10799,7 +10799,6 @@ static int process_input(ShellState *p){ int nLine; /* Length of current line */ int nSql = 0; /* Bytes of zSql[] used */ int nAlloc = 0; /* Allocated zSql[] space */ - int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ int rc; /* Error code */ int errCnt = 0; /* Number of errors seen */ int startline = 0; /* Line number for start of current input */ @@ -10850,7 +10849,6 @@ static int process_input(ShellState *p){ zSql = realloc(zSql, nAlloc); if( zSql==0 ) shell_out_of_memory(); } - nSqlPrior = nSql; if( nSql==0 ){ int i; for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} From 68911c2a2ad7816c770d54771992c754d510996c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Sep 2021 14:26:22 +0000 Subject: [PATCH 091/130] For shell.c.in, define CHAR_BITS to 8 on platforms that do not have that value set by default. This fixes the build on older machines. FossilOrigin-Name: 96610cc8251ad4ff8d7f0536f20f4572a996bfa8d24bec8a7925a333e507da1e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d47348ad6c..fd29271867 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\sshell.c.in,\sand\sa\scompiler\swarning\sin\nsqlite3expert.c\swhich\sis\sa\sreal\serror,\sthough\salso\sharmless. -D 2021-09-22T13:43:16.118 +C For\sshell.c.in,\sdefine\sCHAR_BITS\sto\s8\son\splatforms\sthat\sdo\snot\shave\sthat\nvalue\sset\sby\sdefault.\s\sThis\sfixes\sthe\sbuild\son\solder\smachines. +D 2021-09-22T14:26:22.004 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -548,7 +548,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 -F src/shell.c.in 0d6ddfcc9b49e94d73406baa6121ab050482dbbab8eb5c77ca2cf6e8b9f6ab0b +F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd462 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1925,7 +1925,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 3aa0bf3a098ee9a62c79f266f94e4d290056d0f3e91237944893d6bbb686861f -R 02452d96ccf2df8f99cd8b1cd27c57d1 +P 56da0e9c0321d1fd3c360722cd6284296f9ba459f6b37ab35c81ecabd18f12e3 +R e64df9dd7f9e5649303080820ff5d5a9 U drh -Z 6efbe061fb0b8100b00437218a7d30c4 +Z ab5406251dac07f6df54e51480f60af8 diff --git a/manifest.uuid b/manifest.uuid index 47a36a53bf..7069dc8649 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56da0e9c0321d1fd3c360722cd6284296f9ba459f6b37ab35c81ecabd18f12e3 \ No newline at end of file +96610cc8251ad4ff8d7f0536f20f4572a996bfa8d24bec8a7925a333e507da1e \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index c996f58027..c3544b22e9 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10619,6 +10619,9 @@ meta_command_exit: /* Line scan result and intermediate states (supporting scan resumption) */ +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif typedef enum { QSS_HasDark = 1< Date: Wed, 22 Sep 2021 14:43:35 +0000 Subject: [PATCH 092/130] Fix harmless compiler warnings. FossilOrigin-Name: d678ecca02698753d1b33e072566112e94ea36d0d3a8f4a24d2b09d131968d88 --- ext/expert/sqlite3expert.c | 1 + ext/fts5/fts5_index.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index a59e8a1e6f..a20c4f4e4d 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -920,6 +920,7 @@ static int idxFindCompatible( */ static int countNonzeros(void* pCount, int nc, char* azResults[], char* azColumns[]){ + (void)azColumns; /* Suppress unused parameter warning */ if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){ *((int *)pCount) += 1; } diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index e35bcf0807..0291704f4a 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -855,7 +855,7 @@ static void fts5StructureMakeWritable(int *pRc, Fts5Structure **pp){ for(i=0; inLevel; i++) pNew->aLevel[i].aSeg = 0; for(i=0; inLevel; i++){ Fts5StructureLevel *pLvl = &pNew->aLevel[i]; - int nByte = sizeof(Fts5StructureSegment) * pNew->aLevel[i].nSeg; + nByte = sizeof(Fts5StructureSegment) * pNew->aLevel[i].nSeg; pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(pRc, nByte); if( pLvl->aSeg==0 ){ for(i=0; inLevel; i++){ diff --git a/manifest b/manifest index fd29271867..f515e7d9c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sshell.c.in,\sdefine\sCHAR_BITS\sto\s8\son\splatforms\sthat\sdo\snot\shave\sthat\nvalue\sset\sby\sdefault.\s\sThis\sfixes\sthe\sbuild\son\solder\smachines. -D 2021-09-22T14:26:22.004 +C Fix\sharmless\scompiler\swarnings. +D 2021-09-22T14:43:35.940 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -51,7 +51,7 @@ F ext/async/sqlite3async.h 46b47c79357b97ad85d20d2795942c0020dc20c532114a4980828 F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 F ext/expert/expert1.test 3c642a4e7bbb14f21ddab595436fb465a4733f47a0fe5b2855e1d5ff900ef08e -F ext/expert/sqlite3expert.c 73a57faa14d7d627aae18bfc8dfcdcadc9dc48c6133777f61bebbf8b9bdbab39 +F ext/expert/sqlite3expert.c bee71c524ab33441f0eae46b39691b9d348d1960d9274e834520ea6c573b542e F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938d F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 742ba7ecfbd2dc24fe1204fc9c8ed0b77b05d5c29d120f1f00dac44beb788d75 +F ext/fts5/fts5_index.c 3cdcb62ef0ead4420cd9a5da32d6586e628a4da7adba9fffbfa54626b63ff77c F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -1925,7 +1925,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 56da0e9c0321d1fd3c360722cd6284296f9ba459f6b37ab35c81ecabd18f12e3 -R e64df9dd7f9e5649303080820ff5d5a9 +P 96610cc8251ad4ff8d7f0536f20f4572a996bfa8d24bec8a7925a333e507da1e +R a3b2cf34f41419b8f768542a1a595879 U drh -Z ab5406251dac07f6df54e51480f60af8 +Z 540cae9edc2d1282d2484d063df2a30d diff --git a/manifest.uuid b/manifest.uuid index 7069dc8649..aa790fcd11 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -96610cc8251ad4ff8d7f0536f20f4572a996bfa8d24bec8a7925a333e507da1e \ No newline at end of file +d678ecca02698753d1b33e072566112e94ea36d0d3a8f4a24d2b09d131968d88 \ No newline at end of file From 2a6a72a81cbd0df057be37e4ee514c68c7f64664 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Sep 2021 02:14:35 +0000 Subject: [PATCH 093/130] Ensure that the db->init.azInit array is initialized at all times. dbsqlfuzz 0ad6d441f9bf3dfc32626a9900bc1700495b16f9 FossilOrigin-Name: c7560c1329965ab57cd71393c044b110561b83641d08677bc51044df9e377882 --- manifest | 19 ++++++++------- manifest.uuid | 2 +- src/main.c | 1 + src/prepare.c | 3 ++- src/sqliteInt.h | 2 +- test/fuzzdata8.db | Bin 2630656 -> 2635776 bytes test/vtabK.test | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 test/vtabK.test diff --git a/manifest b/manifest index f515e7d9c4..cbc9df8132 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2021-09-22T14:43:35.940 +C Ensure\sthat\sthe\sdb->init.azInit\sarray\sis\sinitialized\sat\sall\stimes.\ndbsqlfuzz\s0ad6d441f9bf3dfc32626a9900bc1700495b16f9 +D 2021-09-24T02:14:35.733 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 16fa4b66709db6db5bb31475f2321d0a839269765aa2461a520c151c385e8b9d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c aab8cefb6bfbdbecc53fd19058fa053c0c5e591b2e5067d883ef999d019dcd29 +F src/main.c 9b99470c8bffc08b3758dca06a6af0961c919db554b58f2ffad51b05147f1186 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -542,7 +542,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927 -F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 +F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 @@ -552,7 +552,7 @@ F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd46 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h b62ee1fc9da3634616b969abe8b55fafcb540e4e7e5637ee2a2bb5fa477f4a38 +F src/sqliteInt.h 25af7dcb149966262f0fa485262db638e7058a63f9cfeda6b63a3c8334ca7af3 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1060,7 +1060,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 81c9cfdd1c9dad84c1dbefb0a22cf31b685b8255031bc3827a6926412b0dc6f1 +F test/fuzzdata8.db 82a92571f1ce534a7b5edd547ec3dc52ed63ed52343ffbae0c384c9c0a8a83d9 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1709,6 +1709,7 @@ F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f F test/vtabJ.test a6aef49d558af90fae10565b29501f82a95781cb4f797f2d13e2d19f9b6bc77b +F test/vtabK.test b109c112ca23f9fbb4c35395fd5b0aa722cc78edc759a5739fc54a93b4b0385b F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad @@ -1925,7 +1926,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 96610cc8251ad4ff8d7f0536f20f4572a996bfa8d24bec8a7925a333e507da1e -R a3b2cf34f41419b8f768542a1a595879 +P d678ecca02698753d1b33e072566112e94ea36d0d3a8f4a24d2b09d131968d88 +R b533cb60525bfcc9f1f61bf9f8fd7850 U drh -Z 540cae9edc2d1282d2484d063df2a30d +Z 760c440786934b23f1295699ea1847cf diff --git a/manifest.uuid b/manifest.uuid index aa790fcd11..2b6c7ee745 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d678ecca02698753d1b33e072566112e94ea36d0d3a8f4a24d2b09d131968d88 \ No newline at end of file +c7560c1329965ab57cd71393c044b110561b83641d08677bc51044df9e377882 \ No newline at end of file diff --git a/src/main.c b/src/main.c index e0dcf39230..65fe4a6688 100644 --- a/src/main.c +++ b/src/main.c @@ -3205,6 +3205,7 @@ static int openDatabase( db->nextAutovac = -1; db->szMmap = sqlite3GlobalConfig.szMmap; db->nextPagesize = 0; + db->init.azInit = sqlite3StdType; /* Any array of string ptrs will do */ #ifdef SQLITE_ENABLE_SORTER_MMAP /* Beginning with version 3.37.0, using the VFS xFetch() API to memory-map ** the temporary files used to do external sorts (see code in vdbesort.c) diff --git a/src/prepare.c b/src/prepare.c index 6dcb3842ed..62dca01b6b 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -134,7 +134,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ } } db->init.orphanTrigger = 0; - db->init.azInit = argv; + db->init.azInit = (const char**)argv; pStmt = 0; TESTONLY(rcp = ) sqlite3Prepare(db, argv[4], -1, 0, 0, &pStmt, 0); rc = db->errCode; @@ -153,6 +153,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ } } } + db->init.azInit = sqlite3StdType; /* Any array of string ptrs will do */ sqlite3_finalize(pStmt); }else if( argv[1]==0 || (argv[4]!=0 && argv[4][0]!=0) ){ corruptSchema(pData, argv, 0); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d10d02f749..dd19131fca 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1546,7 +1546,7 @@ struct sqlite3 { unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ unsigned imposterTable : 1; /* Building an imposter table */ unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ - char **azInit; /* "type", "name", and "tbl_name" columns */ + const char **azInit; /* "type", "name", and "tbl_name" columns */ } init; int nVdbeActive; /* Number of VDBEs currently running */ int nVdbeRead; /* Number of active VDBEs that read or write */ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 311aae543ca0be9146e125bfd9b66fabfafc5364..641a1128ab71590d9e5dbb11d8709881ab46f328 100644 GIT binary patch delta 50561 zcmeFZcYIXU^EbZdmfd@|-kaXD3u!zu#XEy0dWZx#!HxX>(@Yv$2yY`?(aV{3St|vQ3uj@8#n`Vo24B9_kxGcXYE)k)`Z2gx-5c)>2%yj z&fY}NI#Y?h<4hrX+}VTZ+s^Jpk2<>%J?wm$=mBRJqC1=~5#8$SK(yG|j_4+5644FL zHbmDuTN5pGwj%0wwj^5MY)*8Qvl-D9&iPH~YpJs_(FM+iMDv_+M4iqCMCUu}6P@Oa zB|6zzmuQwVhUi3RG|>spD57JXkwjl{)*?F6=^#4XX(yWD3@19wsfjey8A^1BGlb}1 zXE4!0&LE-#oq_Y|E7ci5w2RY^Xp+;1Xj`Wj(I!rXXo8cp$i+L&MB|)BqOneiXg#M$ zG|DLut>xs1209s0Z>>qwT%C?RoK58JEF!mN5cz5vk?N^LKAlYDQZ|u`^RtMapGf4) z1S0Qb5;-=WNZB|dC1Z)~9z$f?D?~PoCgL7RWW@*~i-r@KlR;#98j*>^h>RXWWaMBX zJq8hJ-=9e9zC>EksIo@Ah%}^;Wf3&6EVPGizK;3RxH6T7m6^H{(b3TA9@3cVzNI16 zeb%1Hg(M4XoPghG(fuMG(Nf*8<7YaBb~!S#7^U+3pWu7qp{NY$wX8G5gL_GUBokY*;z}g z$oQK&{${Ds{BwV;{a|DJULBMBbhP(LZr81&eaeiO88hoZ+&j@hg`cV+5MT}Pg(A1$ z2LnPRGu#M?iexiEITO+i()`1^LiuicSIBmRb+g6)<4*zLCXG$J9s(Qq16T?kZn4YxzwCA$MsAiOIi ze-hF`-!QQe{ejFM?A;)DFO{bKL@o4I!c_S1iM<8PlN?>)9cNfmSlxx%r;ghh5=O^s z|3StNA>IGQ0L@-qC>$6)!Y%thQq_Lj@FQp7HWnq zb3y?eXX#P>S3?8gt4kzT!OGBv@a-5!AoSiq?SxNvwAbF5>F|fjgQ2zHx5WKbz0AANY#>ibg*mnTQ_W!2-iZQqQO0w`9tmuNw$uv8{N|AnWtQT9S5r2+zIV_ zIf*lF^)d>&_v#qy*N2?u!6A^|+Gv2`mqmZ$LIy-4jLzm;N;FJ`*j1Zh31c-XZ(I_X8xg)H2~`j@5Rn^FvDQ z*$I+p6?FT$XwSV%$Id9^McUPMQSLd5LQ5TUzT{0b^!84@dUm%@X#@ubh4{JOTkKof zJa>@9Y^7@!kLN`?3v_ki=2b_iyK>{0(k07h@vNTP31c9=)ZD|}b=`>4(1LF`77Lpe zhqy~&O(xIk!}pTZxwPxLBRp&1?r~vB>57fhctcz-d%J=5jMbk+mc|ub&K>2&I`n?a(qq>qF_^VOut3TE=+M%lsu3J(1?(GTY3a&~Q+d|fo%(5e z%#@?naPIiasypku0{7f67IJNxz{3jjr=?e~M)RyK*jt)I-SO-Fpr%c*H`KH+dqMUE zQ7BEX-paEiclpIaIQMO|4V0CB;iYG84U)>|Q%!jwSm|B&dd{kg!K8I6TF_XLn-8vi1diU(7V{kaf zHZj(*P+)$7pP(y%17Alupryc4g_jm)`(nPp1e@qD=<<8JnZXWSUCa+Ic(ZtsY!+QN zXkll;81BPv@vJ)v0qhyidY}+O--e#?jp7@|H;0evu?TEnXUP%^!0Z^dif3KRV%c_4 z2o!Yd!7;b|7D6IeJW(y6NJgF+(PD6?QFZq3FC{oJF1(AI|4Fp*AQU4N+B&ipVa ziQVPd04x~JvKZL2SP0rjvK-H>8Hfd=wbHOu7KwGnurZ#}K~OM`eT(;ADT+fenSKc~OBFI)Hs+U}-3%Yci(4=>IT2TFpKM2KH4hr$<+1H2)n%qGEuF{%M_ z(cg-d0~p8Sud`WwK@1giJ6`!q``$P-mz`$vEAKW55p~XmS=s}nVL8M^GF)_HPsIKwXCmE~-@#KIwUE$K0HP2(^;xt1kyA{j)w2`H@7Se*!tBR)P*xt^J@_C{81 zVA+t6BKcszHufFQa!}Z*RhtBtN?1H5?qwHvHW}jfuo#RjVW0AB3JQm`8dKrGyUdqF zVMeTdgjMrw8VbkQGf8hJR+lyUO9mBNoMxvvk!&{IOt=9o6k0Z73ivE%r}5`A%))cC zn!|?rEE$R_m^WmfWlG^?Cc>5`OvK6OSU%5YL)9lVuVO0M7d)E-RaGniiaw=*QEsqQ z{OBTU!n3(h^#zNAn)A#6C%zzdhkwS3c{UFg-(WK!_X3NCde!uD`~_yk`q$VFNpuLh zUxWYRQ$hI~_A_HM3h%I3p|+p{$T*?I;D9@9HNChtdM}41TKNmG`%2l@f>@# zP~t|3(SmMebI)UV;Kx~Um&6U?*;2^pV(pB>e68mh23om4M6s@*+tBz$#kx>(+9E+s zu4sakF4p=x%6vFZTD87j9YJ?+@QZ2-49oN9#0a`#P{#%&z=$7D?u~ZV7!> zKx$pvLR=ca&E(liD6X_Lz=k1Qm5CML&0POr9+VIHo7!Hw8Y=Gl_Ji=Xf(^>o`1QpT zv0O)(-WAN}M!-e)-Jj*ZZz)h4`1IX&e%@sDRlxhrnAb&Z{ zhRW+gEOTE_Bpi~;?a;GLm@<-U#9`AxoUEt0o1D%aW5O2qv;d}-5I_)W36pwYYxW#(0A?=X;HCCI!gQ;Aiw9VZ;ffi@@ ziy|X5cqXS6I>cs>yFA(jMH!q3%cgTvSaI15?!H6^)`MJ5;o0`GSGoEkom35$a8;bR zgZS7Dj!1J1D8EOn$J5KX0|ud~Hbf4)e*$Dj@G{g)rN)k~;bNpWmj*QvbZa~_#KVdn z?zA!lK-;z4`_f+bxW>fPz!yyE!FDqu9LE=OYZ%*AwvOWkwh!1ZtTvP{Gz3A(EJ1(^ zzNEG88@VzAD}kbomR6XwjpK}T2$Is;;evhKEXMYim2d|IvALkzWb-tS4-RS494tG+ z6$?TODu;}9mcRHt#5u~2bI&+-sH~iuC5SEQ`TRfGI>gob=Va}JNvFA!oLEMxI10%z zmX)~r441>Rw@^68J>$8z8^Z1cOAD}PTYRxkCAXhv$Kd8(FPw~TY=oQ}Tqs6Vb4(Ij3%WNu{)du+wu*LKe20^H zxuTqJMLSlm{QU9!eVhzme8)wIM~Jz1pddos1WkGxYC%e*YQvB3aR~-?3aU=1E>Jev z#$nAP&YNea;lUF%4;TH)&EeU5Yae*cz&TI2MLc^Ss=~YiVg479gAdQ(uNZ_jg6{f% zDoz{du%otojF9;+IPqQT^(+czo_3KB$%If}$2SyyD9_H}!_%tD(ASs0&#{m2;RkAC zhRp-{vm84Q4?j}rlnmh=l9(ju-st^&#AZbB)0k9QI;pLoyX{$b&u0))hx-|P70ri; zA5e!?P<>h+gPAcr7}zJ6vxc9@VE$1d8A}uR6pmd4_Ru#Gn_UzgWkZaAt@d?Gk){*ACzEB<|+ed@0GDG0-o_%V{$UeMi$ zd#>v(UHE$1t@B1n({_Tcdh$O@uN-E{g6>nIwyWiwLgc{e7`Grts5W3vo9cZ zjo%;~mcno6*;U9HL0e6HAD%3tYfum+1VZ*Fya6Ky@HcpN9hjFtjnNQ(j)7Hct=z$T zBYA(G-PBqcfJ4UcJ9z%f#?7E&1Q{yIZM}%Gnf#}`>8pnEiHV5~8#ij)7>Wn^MPuV^ z{yZ<-YSb(NQZs$q{GAbv!O@@h!Jt=pvTyEU@i0HeP+Y>-H;5f*qGUZ6J}aNk=f$r{_CT9VNTQr_g}2tOS1>4=qY@^PH_ z9d-XBKFswu@lgG}??dfOcm!4VeLMZfnXvB=$;Ezx)R%la;mb$(qdfZ=4s7)M7%v~= z>+|fFvR?kVe;x@X6?|_!`wa_v_@y&Uary6M+F|n}`yHHVzMcQ0)&1xAK0JF2thW$f zc$BWMblP;l<(2$&o;`ttSEwX=kY6HpyT~KY{(ywXzN;`U(>IvmzAJpWmA#BvcX$Uc zGq%{f3mLfeUWhHi+#z%qy#5{U5TB8UgM)&OK5-ZqFMPz4gp5a4;UCU0ys>aivl^KI z#n1fHpgKip0~c=TgV$yUgy3h7_Cor%4$c)j`|;YR!&U?LvsBrV$)JM;*`_?8=uZ!Yx7UD(J47kjBiL zrxTp%>0|j9$JT#yZ2NDHJ$=x{M1h=%LA$gL;^@x(TuFLH?jW+n4zvgfhLVmxilz*@ z%=tjZ;J__VwAg=+rj1)1nSTk@{_Fq2cLWdR^*KRPl;3}8BT4v75W15Dkh9Ovb8twI zRU+syygn%xQs(FdO(=3xu|QP!2L3`iS}TYi9RACnNsZ0wIV&(s7f3 zwNizf91DReIdBthSt`)IF0NSk74k<127}FC|1Cc2Pxl(StJsDLHJnJED>9PRVZu{v zbWr$!Vf9ONiGkZAh}uET6_#WENMSP198l0$Xo+pd2&Z^f3zAp*Ct{Dq!a-hZpDs{3 zI#iQa`!|N3%LN(RWeX={mI7>+@RJmIU|df@_m$^dZUb3~`f^P$@~g5aWWxk2`@8E% zrnMA}b=C^C7zBO(=bo;Kfg!q;?Hhk{%Bz7W4iFkt#df$pAh zP~}4<_PoGxFfU7RLC|tx3KV4rg~Rpez*>+UCHP}ywvb1QHX=F=&JGaBA)%wIeN}+I zAJ!izoMIUEhVV6G33Pc78c1TQpnIC8EwDC7lArL%dXBMrWrqZjiM<5fvYDRchwTpw zCtj6Nk? zsfWFz{+A33Vz{zch@6$58o_poj8jiXK|u5Z)2VXG?eYgd4(#c%fQIG|(j_ z>yj{@)`_r&XYC;C3MnV}p3p=R`_r*DklJVu^`FTWc;gYxkPe&U`(gPbp)D^aQA-^` zttEa3HOr&DG-I(3^gJzFal~&z5yy3E1Sx~K1Ssz+CP7$!v=v`{BFyLYoipMy=qx=j zl=FrBo}viNCF6m^7sWW9y#!T~ScY#2Vi%rufr@akEfftG)x$O7Bo2C(TGqfmgV?KZ zpx7EV4;Q`H)`&uxS)>h#T&OX;F9b!2$MBLOHsHzKmLAK~eZ@z-O_zJPIb5XsUVvCn z(hnlr=-_xb;1Itck1!i>CUzjSb%^7Hp4-|Ez&9OYFHR)yH%U)U=aO{boK+;pP7t*?spbb8db5Q9nPWM#o1y_8&|TC9#2$x7F;zK~-P z6LHr_aW%uDc49gmnHI48Kk76@xf(8FUlBAwR6o1;hI`J4bZ};h+cin))|degmj=(l+%aOF=AI}RCeohrf)OM}j9gi^I9wJ7 z(`7P_=4%pU-Jyf4+@FiXFJ_A5dK*zTM_eR`L&$(1^^Xev9wQ#<#z{A^Q6!J%e-Oz| z9Sd_OtD|w;VsSlB&WI1M*xF#b4y%6?&4dJ;{W(Z`!&*$pxi0X0H+5JevTO zeyRf_*NG)YaTwiO8+$q=>wJWebtG*lIJb)P#8;@RZ2aI3=grW6yLgXdIneTZt`EDhoJ??pNm7u)MazG zIno8)na)}vQsK``oI%C&aP;S5A%j-OY$n`(O&rFt`8e(@6=}VU50wl;U4KM?pI_dbbMSqlI z%b>s@kcFz~$wFNYj<*Befbxk!2B_X5*vYEUCqnC3y#u3s^_LB71pX1C=Xh~3^|}gg z&J)6EfuGhJ@flt2Ij9*Fn4$GGh2_IdmoP=^gRU&;Z}=a;O&f#}Ota7Q+L|i>_Cr)V zcqRo!;`kW-I-actbxuHYq|UxKh$G3!o{ub4|CodLQsEqsF`(DZ>Xr0a3k80G({Xk) z{bHUK0%Jlj6ulWZMzc(Pp!}M?2i|R^58@es8Wz|YyC&($AHEJ$S!joyI_Qt{ruB)9 z>FUrVv2kJ($ju7!$HaPtP4F*Q5<6(~0d zrWaisc(xx>Ck9=4(QiGjY@0qzWMeUWm%f@4_fUTa|E0Oo|Gnl8c{GP4+It>(5C2!| z$MiuW9h(2Gzys9N5xn_R^gxefTRoB;Mdy>C{{Iqco=2#+pkkSS1Fb8%f6}{e|20Ha z`i=&1JoOOwVu%iSh6t(F31ZO8N1FxJJXAj5CGFLdnCuGb{;yu>a+ZE5(DS?;)Nmm} z>#CB6_;^20VFgs(jQ$47HwIqO2CNaSMVnwOyQh~#F_U_4|DyM|J-r{Nj!t3KL~V@h zB>{n$6lpl*5%M%R+<`a1K3JOe&)JyA*n8lBK-w&xXq(0RkTBSM;l)@jpt~Y(ps>ya zRAs|`kIRIe#f&@AeLX7N;c5LtDBv~b|9f)eGQAd1W#{1L4*&2MGvghs@iBPw7b%V*1LlVP;Z)6(D1C3JK$TxZ71RO3qHCdR=dAgPBj z9j_-FX*r$mVra~<&v9;Zql3f99#oTkfkKLb0t?qb`9h2%ABt}%rVKF9%DxT{TPS1z z4>3ep#HnOAkJ5N)0p`^<39pVd9A?tZMU$tHXJP#F2cL{L#ELhl=PzN;0Vxb?Wg0d} z6e~DB#SkfoGX&kX=}@&!Y6ID=eXY=Frs0wFbza};X@S1=80Ic8v@x(*aB{ifi1h86nKK35uIG&-HBLL?dn*mi znRuI+`3{AA1Nj;6#ejO>Kt9AZ2D)8*PeBqY)%+)G3>TmUZ#F~rT7w7!)*ANUs!fI| zdh(zoy&LU-^qmG1#&0vok~o{})u^Az(qcb74f!|Wdns~N`$C_JL~Ik6Tvelj$~roS4_@k|eP14nk~69d_yhQoqH zJxK0Pi)!$ZAkj%7_Hv`EnoW zT~0PT&nR<5U0%NC8Tg+nTC~IF2STD)AYs43AFpyz5e(Y~N~bu{I%U)(@+j7&fQvmu zq9C0O1}jn5;QC|c>%Q@+giq~~sQEgwl_+v@Mo7RL)h?ZT^z7AC94UoOEz&7__@`8QG$<<^+oN_xk@ z2gJui?$PK#4DTS_Ht4_6@deyBs8$DVS^<29!%&dMaV(<%&8M} zMFy=*JMTGy>u|x4wO)#cu<24gOiPir@#NW{FmGGP?-88ny6`KB*;b^Md3J=(_3ku!sffP_=#FnnpDbcDU= z?-2#KAa#(`5#mQkmH%Y63nZ-#Y68S(UCf&$P1K9zDym4+0qz8Dgg&{aKu zm2AV@ZPHmL%7SiT79?+@CO>~e+Qyg}=kJtOF$%KUc1w484Wse8ucv}ccr>n|E6ZuY zf_>5?f;GVHu?F(qlt|>gX$-9oN|~5_L`owZ0#ueuo8+czIj2p~?Upru2I7SZDcTEHU-D(^@U z5cRdJV(Bf(!SLO0r6fjfl>GYgCM>=u4d+>VP}|E7@cJ344+oupl#a0upmvt~;;d%! zV}^ZxmiCLR6Bg8$$1$AvhqRVsoiQ{~F6ZGCFSlhcxs@KxApD%P0WS-3uq@J{e7Zjr z+>yq>4I2gEi*8FpApME7Mw@Og7tM6~(gd9TqJmxQNabD8*+8DnF#Enl@k^Vx{D_>R z)n_C-?+!~3gSLV^5lZ~!-h_krO^|mnd^1q)r)NE}prM?_u%?}?FinQJn#sncU_lcq zhMG?DG))eFt}I4gCx`)p?&K(~=Mi*vbG_a+oP&Fe>054F!>B=gqUak z_n`W{p`s*;@FX_b>=EkkI+Ho_jJ)9Co@NeleP8sx#K8LF{08z|k9ZLb#h{NQAycj0vmiYe1d+mqI z<&5I`#j_0Y5IkFs#q^PKn#{tne1hDTV`+ui@-L#D08yR|q9=CEk!KmSK>o(Dkn^gX zjHa3LBTgJal8i=Sjyy(UwQ$0#@@k%qDqAcc5yVLH{`1;OY71Mwmjhvcwj|jajn-CW z=9&m+grM8m{l#M|&Rij1XY#luAdk22`598v2e{T*Tx(9 za)FtAyg8dl0a|2#Mb?YPJbguhy-%P3*>A`aSf?85z?<)hGE|o+0@#B%J7yKj6rqjL zHW|;7`HRQr?;*YCW5HZ~ zDMr6)!i!oVig9q0#G&yc$v4drHkX?LDbM8A|A>V5L2_;$;t21V(^YH)cEK0|AC0D6 zb7G7b1FK4-o5O_|F${9+i2~FJ#z3@xAb+Lzcur)pE#|}b7JKqnY^j4vR~y~fi3aIifyk`sGzp_fR^2*z4wkxt|S&ynVtViDTnUcS`oOr$9O^J9kkCIG8y zTqG}B9_wsG7W+_7`$!LJ7+X^2WBf!GDeAxYc{yk=;P5bGXM@;`=I^M#xzR=_e_5Kd zsi1@QFC^=VJEDvO7+YBuV+<4pis6&@rNk>qoARMJtG@AqUJKAK`O|FmOtO-|7&}x> zi&pW|MB+lE0RNi5I|_uqo_j&Rrp8_3YU+3`?0?DNz@0A}2GHfMNw6OCnj5>*se)BW z#s<7d{tJ%0A>TyR)+W3N=^Jc=aA61IUQa-NkH_%&a~ay}c_(0bcOxxwC`>WBMGBLz z_)~gf&l|r@G18W@5rsZR3SCl+dmY6puN&LZRmAuulQ+A=oD}4K<8Qrt% z+jIg zG6$MmFn++w$|{Y1qDVo-Wu6godaC2=myC5~iuiqW-Pn+c$B2!SbR8l-jpZ4!!(&IZ zX`Rr}U2(2Grra{pt+oOk%Y)l7>~z=oKrg1yo;aQm560#2UX8J#`0n;BXHWd2#z_9i z6V%ixIQG!^8g6-H9H{|6uHDq+{?)kKz}`PBm`E3AQ1E zfM%=&4ZfE3SgM-3apHT_<~bN*H}%KCJ|=?X^@awa-tB=ZJFqCk)RW2Q*XW!SINK>g z&RJ7BP~lh5GTd}Z{E*(g0Lw-i3B6!9y>AlwYP(GKS<`GNS{)_Aj#$%v>EjilPKt4D z(C|e`TC=sVyuOK+T4h#Yobmk9CS4!`lgHWdxRnvC29%lT@8sY zb&=yynB$5gI>l9=Xof46=s*{x`3SvSb%=I!#Sm@miXs~CiX>X!6+yJFi*CI_gp1() zLWs*wRCQ6}k6?0z5anF+DeZ^<-9_jI{udW{68J|hKce?szC^!u`4Iie`yz5Ivtqn$Vxk zBTeYv&7<@Y{o8q@4}EDK=|jIak5Z!aoAO92`n7qa75$1lJ<)l2wD;+=^LV0z@<=!H z^}SuB7JXM2sYTz$HHT=tYZlS^F4BkI?jn8Y16`y8y_bu0pf|d5i1IGdg!tG+njlH4 zoPCM@pX3vg{Qsv3g-xi-|M&TX+!ZMHGlxU|<^UPey<*;h{mTL*Z1a(6A_w11Gi{{F z#C?v(cA7fyaAB6|i1zO<;MiW16V4`DRzm({OEwa|^E87C^Grub%iPuY;b6PL`9sls zQ+nCA!B1G3%e2UItGL3~zvG z5YEjsEi|xOaKI}j=RY)pq>%u|zQz-krgnrD`i!m!^?{`6rY^8*x+w?B`$!6&uQa{w(clkAlOuuQiHoKWJq14^O@{>L8U8|- z>4L`cBdB;5+|r{7Bu$V5tY@7Nm#6wqP*pD^4tu5tf5>S{;5=IS8LHw!;^660GQjNd zA)yrXHr2=V$4ukM)eaTMO$l$TGBK!Z5<>Iij_D{@cFHtFAaMWCGbRG}|8_RhIS@0? znke_?0rmeoWOOz9d!*K+Bh=wzIMDUq0yWm)iOG{J)8Y7RQ+rJ!0?hvb8JD@CXzyd% z;?c=dOsWYc|J7d;nLHFa?ioC+_Kw2ro5A^9*-{f>-Tq>lT!A`X2Pe~L?h*U1@C1i9 zB^0hQ(X~NGp=jqT!3kJ%Fqk}0|D419%kG&tf#b>hLDn8t`j~5ID$!y^TC5!y^!w4Y zm*C=1p~es*@R6yX2559VGu?o4%0h$niuq+|bIfAE=D(Q;bF7CP7dh2(&zem*{fTKg zZ!&nYI7cKlOdJ7OVdg~0-%Wl;+jvtlZ2HY)JX~PrO&ac`da7o{Y94Q1J6Vi`b~g8v zG{DKej@pwq@kT9kD1&SE2Z z0?oVi8r-6|IjC369bl{7TubuH*EhYVsfgP!g?WC@v%T&*2+763nb29-T~%no`qrY#=z+`nO6qQWsv(tfEJ0RhYY-Mo)ycBsnoC8)qiGeHF$P&L@c7c!su$%PB0m)w=t^_V@z?ADNs%Ldp+ z;n+;`2A)Jafqy3lNA5c`^WFwS3V zepOEx#)nf3K9IS>+#SmE{X$_7^B#}iZ#4U9XvT~+e#uacW;=ZU!0e4Pip6w|zw_W$A|4AV1p2$GvZJ53rp!KgP;^ z=0=pe0XZ=gWcjNnZys{fd_DctW{q)Fk@+=RhCiBV0_ylCFlw85I8>&1hvPTf%#%52 zBl^U{k{#yho}PhvrhB%IZ;GRKn#U7RY=NKIz3OUr_v9x8<^=5MrCnw4ENhY5tVB0v0HvGt1a&T(kDV*Y{C(2IN< zZ1ab?is7Ye<^~*Vi_JL88HVR>nwxSgi2{RW@))+m6y}}ELH1lF0e;_X?gUCpLYH4i zRjiO+qNGFl2cjO1Z_(WRe@gAqt{-cULXEa8IzZfOwF4o4o4M(8xhFp|-!h1F`u^Th zV|h59cw+9u$(@S(Ite83Zk$#)8Hywgc{Ws%VdFFN2r-%X?F__ekHftz2Q+{q@ktRW z!IDS-N4iT}sH>OZ&Rugko-$k7Qf?tAs%1F9BEMEx6kvJEL6Ns*1o`SK11(=ONDK3i zf$?veWeoDO+$97su+5Z0av{m)#A|ty*lMChqHW*;NBP1RxY{r=%hDF7CRkRIqaKoHn+UL%Xd%E}Uu-hXa+X5! z%`Fs??*~n0S%zSGE6Y|5qB!PwMYhS44N&Tkr3Y)oL!CeJbQBC52jae?-)ye z4T30SYNIv+&LmjKKbmc!@a#y<$lFcO{HYd7;HA`v_7>XdW>{#a8x03s7J^o_vzXz2 zYfDQ^n`5C6=qq?F*;1QB68kD6*x|K~mUMh-22kcc~F&Wqt9JbC<%!}iQ--(#8-1;tu?{BuWVtiJ!M09Spj%JuyYyonO zL(U$70EOEu z9+ag9LE~p^8sVIVmeUqm%i8^EX5r6l6c&|RLwH#5p=BOH9V#|iPvX1hEadv04azM` zGi+69d0%s%JH{9Z@V1Ne1ooTCV>&UF25_jaK`9KC9WW%B((&^j2Q-B_do97R<#lTm zl<&1b*=H8=2hAh2f~5|$>1$~R@n+jzNcq5G!86ts!x*lVmTE1Xx5jeJ3n;vdyeN7f;3A!Uqk=~)88D&sJUn9|$7O((9G5HMK(I9m6{~d##o-!TYcVLg zU`dBnKUth`!DVd)Qf(_md3F3MLV1To!-LCSDUg3TA{FxIiESYLdc+VM?XYg*2(jqg zU=D<|de#9rHNqM#vAMV@)>_V_)qC{LIfCx8X0H$i|Igjg3u_u!ZA@HFjk`hlg`n0o zW}5{w;;pY!#w8XhwtXBPY+_9n38YwsTsB_vjMKZZwZ5;fqzbFt=0BCdkw0#SmPkB zr={w}9?}Klimg3pj{kG08}+vSD2nqbsOkT&?#^hPtf$XrU@NQ#;lcYB%RhVCqS^BN z7GMR|;ZXg=nul$^wD>W6mSH6uwy1L*cSV&yT)68KjDuz4bcXv!S$i8qvh{!Htj(6A z+Ft(pwg?wNEY5WQSNG9c_nYXm6_lT8+od(-PXL%nR{EKNZIJwd#fb~1Sm#mdCa7(! z;e|bIbS^8l01n&DvQ{ucJUVJwlic&-Bv_GW4S~%|t%LF1IaXSRJD|#HJ@fA=f;2@E z8QTem=U5{#X`|K7!>XRvhJ~Tl1!aq^wB~lBa@G2jLvEFo0uOs2XS#J2#)nvUaoEaj zUF?Bm92%_2(a1BKcMctq}etNYr-D{ z^`g}uPYxs85+oH_wtFNg3$=cvU9|X8ir!l9l3p#%fF^t(wmD!uO=+Q!;AN%EvqRR? zJUfiS5i4092vwOX{ZPRF&=tj8bo>!G@S&wA*h2_brKE+dMgmx!G!O)P|2b;|CLe!I zap?tJS)`_xbz0gI|JJ&3E|KCV12w@XX>yg(=WTdcmrUOD4VH}r6SLZkv~%3B=7O@& zN++6*KZeeQ*7+2<$q0FgbC)-0T=tnZCMU3>i&do!G}AU3tEX5+PJ1nnorIjnw6PT( z;q=dU1fU(EHKu)O-6m2jpmByabJeCKT2~-VXNAME`_@&W zAQS)3{pz_s*6Tnsai=z1r(PT5A}b#~JJa98)l`$HoIa;f{lGHCGbmFje9Q?iy4s@& z^d8)(wzP)IYU>uQw}lqbBYkCUxOrH-Hk8v3x-(<@Y->3R#A$PsyGrVfHMN`@- z=2)yT+~0FJ7{+?rHfVs!R9k;Y3E>RxrN8^Y#>>%>_?nMxjDelUhre3O7`_#1>q6i~ zP(x|pL+!Svvi55xZ?y#K_%61qYdg-wkEp+op~%c_z|FC?Q9J=7i>F)DfF^rmIOk6X zQ-hn9RQx6079?xHnS#mM+tanty|iJli?WXnKW`6QEp2mIRaq+=jn${X{H+v}NwOW3 z1Pw0p!m6u}@Ab7cp`r65s1G%AnLd<5y2-Ldt38x2OR;?;h^nBgqSbQ6+?ReE$EM0x z*M_+iY9{%)X+cdi=fo@Y>NThs8{h}4#+!4HE>bfH6N$nQ8yPt_=m#UT?`qgG!baJ$ zBW)iV2=k)ssSVZU&%YZ=aKv1PIC4998?clUaqx@x032!ehk(ihU6aPeI7Zn@T^MVO&$MG%d=PqMak+oI8xi|CG4@wc9>&7KzGSYGo)-ccmhbS z3g_!U_Qz@$h^gmw0XrVB5#*fEJAY8F-W78aetN_f!;9Zjd*sUL&J*0>nC-mG{C7M% zZR5nBsQfo5D4@%5z!}@SvIef%*%;I~r5&Vy5Gi5Zk8PKj_$yU=f(h%@-x)r=WD_~^ z#_Zpu(k=co8%0o`!v1141^ZmJ?biU5`?sqiL;0rdH-bg#prlGk$C0;en|V%PaPyLq zj2-XT9vH+xN_ZoyI8I5$r8Tyxy!eM znW*?6HMUt#{)x6eN&`-|7G%2!)U$PzCe;AQ-)l6%6+dN-(Of>x6+|}$XMc~paK>M0 zq8G>sE?A(IuW}hb4^Zlu2)cIi44+lFi828i9y6* z7_jfnZQ$PfHp(yffR6>5k+=Ujz@Ef5Asmh`Qvx8nrP3A$rz<-(R}BqgDCDObx?<)? z1;}56Re#vx$Qdxg5Kj4)%03UDweY~tkv(bEKe4^736zaBKSjDck7`5P$x4N1EVcSQ z4XhU0XDIiW82NTjmjl&V3c2k{6tQ4NNJ^4apeh{+4FuhIDWGQlUH1c!j8Gh z2?Jp$6Gr9wCl+4gw)h;jeV-l;CgG`K}&SJrK#&#XT zH=E6Pe~q$VViCA`lS03ZQIDR+LBeXk!2h|6*S9KOdJUhoi+`c`I@n^ja+-+^=-q~J zA>6w@RDVsIM$!=P{hISsXatq*%yh9VQRrfs2p<`|8$p9WA8&m5km7A5B-XGKN--0) zuv=58dRwgrHMgS;7|y9TS=k1aa4T8wDr+dO^m|ct;lfkOTrID(+vm10*wUBt#Rf%c z4F_Qs^@`S83+Q&;_A!27Rhu%HH=o{EbzYgmSW9&5RC_b%;jJEoqC7PWqd!*YrrHYX zf!GndTvXnoUy8!VfvU(+)|c`-V{Pzps7m&1&^6^QIcA{Bp(3W#D0E*Na$D(vW4}~3 zFqQ;q_Z2#qZz*&xCqwZ*AsLjfm0U>s*fJRHca^U=!cP`#w>V(FucbGXU$TU`b1zyU z`?k^szr3e7G)U#mAWIM?{jQV~DDj~Z$&tS%=M&2+D7m4efc-axQZm1$zf}iXF1@%c zeqZ*hQYnxduj+}iRqphpvn!gG{cq1*sny-pD7duFqT*{cHc5j63lu{VI^$b4w)q@x zC|5klN8zOxDlR}$updWxs`I9+^Ux)!PR*AyZ?;N5qp?bi$CGCjGAI91Zwp4g9ZkVN z3XZ_tiaJnBQvFM{R~SC_RV9vfhs}%B;jr?Ktro7htW2izKq?n|#3wXN!1#k|B`dsd zGsE346n{?P zVowr`yfofkZ$tKCQw#hpQ8j9=n)0g14h%N`!VT9B#(G%iuvpKtMfamoh^z%+TWw#$ zu*aPD+H}fL2yd-YE_Q!7+14wWGF4Rx4wNKRQWya{L~Xyn=Cc zN7X11mTyycbvP&XCLRVug16U)8V?^Moz3xN!Zz`m0Bw4!rzx>Cxs+gaSwC}wAnxPH zOMkNk#MUgR`-V-yv=-`0&&nSP$tbRa8^3cwaH6S~8TPkQv+;T>FPa}e45Hr{p{ zx5Zp2`9OV&uA!=vke85rQapeuQC{S|uE|inIhKy`Rca@OFOO1f1~Haq$2KUsqArG> ze<-zpWl-^PkA3Iuh<5_CtK9|g+|pE#(i!x;-;DEXpa0v+T;P6JYz`V z>X(I9^#cgIVXIsCkz&TV^VEfmy#k6`B=1+QO5U$AaQv2y{_(2zkFmINpE`*ZerxN3 zCzq%lI5rMf-m}ePp7{baU)Es#mFi{kDN(+NN*9(1?ren&-yAgqXRcG1YQLv7Z>o9* zLO->Q#r@ONR60`ri|crn^@498z8Ao6pWBY(jai!U^bh{OX4(HGK_2t00eDtzGeR4; z*d0icXWDK=$;xX)J3duaIvel1R4?Wc4sQ6U3D9tlTE!+6eq&2O*-xFqAb64bwI=UW z#wPzIaWaQ152}0g`ua3_OX=QxMP1|>K5ZfUc-D0$buC z$55k}lj5f%y|xkkL>;1Mak%MQzdgaml7n@dq{kG^UR61GwMTnsonFJ zT%hW`$l-TSC5K-gsz$FBe{uxGQ8~n2R83`%R5G*|V3nEgOU-Yxy^r?a)vp+3)2a%; z7E+3A-$C0J>P-CO4^_{RJ4*H8n;mZDMc%l@s0Q#c3}Z#FPdT;(PIgc~fuv}!a_I4< ztrb=Z{1^re9;zd7v&n0&KoN=%#p`W(S()S_@aa8Yq;ZicT;wZQ@fX#L_P19_)a95k z&Z`c?`o3P5Ikp1SCSK2Q&re(!{r<(rk%fpsUfl=+3I*?~bU=o9(E&-msWx8QG477G zeQ3rylCd77xugm{RK3wZ!s{MS8MA69ukY!HmTb+Tq()tdN9uTWJRoKGBOJp=*(S z9LamO%pTacxz|2U%c;E_IS8tsslq>ZBCQ^<&m+k*p5&FM<Yl3Z>Z-RAW*RgtfC?lW zX@?QKMq6;>$q9obYC9ldpLPk@@(QP9!~@-{+MW=iRs$0b!D&=(i;sc77@W`y5Qrpq zj0YUe&;-EItYjH}xGJ8vOY49!6ZT5lcTf%U&z&u?(3v;G1@k3->HUO$?YC&a6a?=F5aA8yjcI8>i$zK?1?Ply$$V4C;Xdm>@F#E*WFuuzBC+U)zV zzCzI(2I01RrmJ{-C}mB8l~=5eX`;_`7v+4Pu*6utWO6>R$kqedKs-`vj=6c7TJN)j zG>Ja{F`eV;Q+<3>uH{d2-;e&mq)2*i( zQT1_?j;8ud3#s@nlh1HCzhiznfN<*~2g_%g9pY>M4)L{lr=nd{^BFc>ao?Dq*kN7gXENlt$oEJ?`Ju zv{fyANwt}#4|rckQ%AjYlnVC6;@GX5X^mPsMzI$Yrt_h<<61~`X^bhJPU=kog<%Ya zU6G{Y6nikSLyE}laV@3Fsz|vG;CEoS0iFMlU zny6z6m81FSOjA&$JySL|zgy8P)8E=}K-l+Gd({Mpq{mD%)Y1=Bd(G6E+s`q5tk(TF zwslJK7_R?=X}CmtmYL#sMxLoar8?V^3MZNZ-1sL`Ux{ZtWh&4~KT+9bbC{aH71w|} zB$z*x`1(SVUL~EUl2!npEejEnm!S=$6?3x(OSp%T(CIT*XH=nh+0ig$h&6O{u)A!9Y)xnT~NnnW-xP$u+)Jh;T6NwuTr}_}Wxj06qb|S10BlZe z?#W+PnfmJmbXauax^)I4OMl@U5R< zZy09MlJ6MiKRDwj^VTuCJ3RwIeU?56;3EJ z)E>s5-mTJUqmtXSOQG8BaTd`%e4A%X@d!7Tc$(Y105QsB@-sR)M5V%Jd79tcOU3;z znzm|Hh!jd+Z<@;Q#hdF%JogvV(<=B66#k@6rnwe#4zImt8Z9D~@v-~p#(q-;Ro5f{ zedl`pSV%0S+u;d@k43>757T_Bu%XE6hGr9PMcVS*q(b;guH zHTzA6?jT`+)4WBJ8gThv;t4?r|L!r@Q%SL0t}>^=n)(kt&r91vW~?^jdD?PwYb>Qd z(l+6oj}yEqn%~$w53!dga~n2Mbk^r8AhqT7FrVP+WOGmfY5PbEn6y;$Cn8+=^!;WZ zUFvNHj`KxZ9+j4wVyJYJ>2->`*AdUT?aUwRb^WmRr-_U&B|(KHi`G{9L_UHtPCp@r zeldnw3olu%oeMusfU`=~XiY5T^a7~AZ>jlB>T-{HujHUMIcB6UTOd+pg9}e?4IC#r?9(+w>9woS!%Eq2j)3GpF@1-wo4Go;ihkKV;q^!6_>9 zKJ#7NY_hq(0dXU9XPWcXT0g1?!>DY&htsB+`(PTsX{w@(&gOx)`kF(3A57>(PdtIC zn@B0e=IQ+C9P<|j5k&I$M8QF^4AdsAXq7(zhtg98n>z_1uMOd^5oNA3rQH-lSYL1%p>|bNXsw;)$ zz2*+vb5RbH>#x8*)%PNJ$Kz{7_GZoqg8zICa10cf)sE)RD)ZvFtD z!=onmwvR+l+fjwq5~7YL&1JM|gf2S8i`b0U?#YwkkteqtpBqtUaNwWRNVT8I0JE8HtVGfKK*urOA<@>KiH9I`ALGc?DYDE zK3Y^3tVcD^z@LN~7Etm!sL26sp) zrCM4U;J1|7(X!4sWZCTeVK|qbCBBtD+`E%yt77lc-bdL5)_ZwKn&mCw@dUrVo;MLe zlWeQ_k8T#DS{g=q+bvg+TtX91Z{?|(at^C6QSl^O2hL5g;us>O9nii~TeWPN+Nv%3 zJe>006T{Ni0w8f`#X0I4%T$UCwB$-7`1D^EpiTL+5-r?zu;qXb=CH%E zZ9Xp;VR=G;u$5F<;ngyA z{E97O)Nn#eTWc+cYxCWS%_wWXML5U+WAF4Ui9Q;=0cUk>Hdqb{1h@2kEsr506U#GTn@(&is&#I29 zPJHTywx3kA-ujtnbT&z!YOpcbZ?PG*qXDQqPYm8`ls3u!9$+%9o9pADC(4uZM`2`h z0a)m_Js<= zf(KUF4(nUw`_h_2xkIhj*>h3|hmahZn4%U|0TJ6Prq6m zlJpcE?r-}`%(&*9^1J0TmGm^nFR(Pj0%oN8ao%{ta-U)sd%;3mU$IUyYT=vxTN}Zr z*Lh1lYadBq%xRzFyrt>{l^AxTAhnvxf7Ujn%B_~;VicZ7iU##uPHSo{$C3U^mLkC< z81199FVNw9^-?bHZGm5M!N?f+n+-{v%@}>ml$!Y#;k=?>g#*%-5<+6Bh5y>MH@1>j>w)(VrwWW|AYGVT! z-3<%C=pZR**(=tEw)qi>DxA>Ir!zVwL#p&Q`ziT|rA*8N_>=(wGyWUEaTfGVoX)F8 zTAHf3`Yvlw62`SmbuI5MvSL|+uP=-JN30W-sk($x2CIt*AKoC&$P;5;)52tP zS@%$GtZg3O-O5^_f`P5D#4;81OtnPwlkMSQE){X%I#HCi!Fm;`4-#VO(Jt175^>5f zsY2op)2*FV(()zQABUC{`x;X6RELKrce9Q%>K?!(UhcWwk7&__0{p$gWoNBxVU4`Q zd3`E8zbrFu4b(cpu@zKy0Tb*}jRmLP88fVUfYwPJ&wGukpp)W3$ZtE_pqBufbvmS8-A@#*5{wVZv#x*MwT zCgXonNMFaZ$JZ^>S7=Z9HEa^g^AXI1cTr0HcdP*N;`HhR$ zS+n3^eNzmk)0F*I*vg``8^}Kte&lI?Tf-Fly0r-x&9^?RMp*ahi*YzNTwvX)hcB2C zoh$sLxir^ST-QIwwDKxqYa`2BET>@bGzz4RDD7J;Z?_DTUc1kVX`gF}xz&SSN)I-% z{GLUpR_Mmc!D@o##d<=#xS4X=C%$z{euu;XtG4u(FtHo76Y#-4DCUGwS;Cg@h|PbH zrfjlq((c%vkw2c~&DN=gx3~AmAE$|`tvf2jhzQ68?Hl-ehola%j{kHbsB~frRa8Qo z{WCxivr8>Q6#}+WUMo24`iEGn|I?rTN`JOdUOROb#Z60m^0uVEJv6tvcv|#^DgGJt zHri8coy-2o_?W0_hRs8{55%;lsSHkPZ_??gm<$q028BI7L+fOXeV1%q~!_9H6E!uqQG zek@c<@3Uo4+Cs~6h;-|HI`#h6V>o4$r+y={;f zw-rh9PIYrp>n9|IajsuA$(Br2Q=RZeNU^R4+_>$ML3`>NuQ(03~#oJn{ z;DuH)G7&hOH!!oofF$~PhAo!5tg-5g($z6!dsLmw>&&)M0?DuHHA^y1ayr@!5_fdk zPHUxy$m_Q~q^;aNFn=O1^xLMZh5wtjic&gREPQ{q4Ps#Q%9wlO8~!H^QA{Y-p&3IFYI>8;Me={rjMIc0vX zZY;WaL@gZ=AKk0;W2Wsz`f!@V+ zu;v&K={{n(EnloCPi5KsYAsBd+G^krTRJGSV)nne_J%?((!P)d*q=y>z{S065Rm`O zkavV}vV}^Z1=>!lrSB+xl)V$B4NttRFp9yb&MN(xl;jr4$tk>hknL`@n2=ip6TYYP z@%9M$Kh<;+OU_h5T^t)`+X8w4Q2EzXvEax7xTx9izs8#|-m`?j0%oE1ET^B)B>*8a z1;_7k=M!r<`7y^Th4^!veobeG_Ils;6D4o8@8eIOv$d9B*i65!D-y``dP=*TIGCy% zIYX5En0+W$Eq5$ZxPG21h9g#rfqL2wi82`4LWQO1udMj+Xfx@8{pD)m7H7bY@?!jAJ~4Eu2IT& zqGYXevBVF2WGj)R-??H~4CW{puuI|QA6zjK1ynl0QOvQ4KvCINWy{lQroxC@=g0{? z;$U#XtIz^>KkW^UKcT~N={6%UI8&ACV2He?E97M-Y*S!^1URofjnk@~E3n-9))tUd zx+pFj9y1jS)3J`f`N@!7ag4x5r*KrvDZbxe*GYWtoXw$9=~T#=;SfU8_N`u<11Q7M z3Tp%@fCasd0B$XnT-ELTHyOVPGITltyMcHd4wW4Yv3Od!=50p#mF2iOyif&hEX!$gLI zbd(NOgdMiVDqt$v(ZFX1X}7uY-ESaEXcgrJw)~ z%{sFHX#E(He81x?R~0(?C=^%#|LZu#$SL8#2|znLP5`VVj}}EQ*j7oRRR#7|XXA?f zwmg++^aYbJ4VD>+=-X-<%=V;yd}J zO#4G3VMNI|8zjsiJ0y&UQYNc$hBwsyJ?xACQP&|raD@FwwdA8t3n1!Kv+TzV(kyB) z(T<44!uI)((%gym4~JMA7YLfki za2eDEZm;F2G|t|gADnDoA)+u-TG{_zubyUCBlI$*ot^pJnRcAogrS%0usl3whvfnG z#dJHcd*;}29MF(by4xS;Cv)vj!E=vC7ueyCd*E4nTb)c zd(ulc%nj?Teydj4llbuK_GT*Kl&5P!72nxAaLyS=Ull*U$^MuCG?d5bTKyX+`(A7o z?fbd1%$|yrjZ`t-38U^7JB+%m=+cKa_+D(czatVqlr7L<=lY)g13i55rVVl+#n5lg zMttvHdzo;|OHpeOnz7%G(2Vw!qSqjd^`ISLtia4J(H-HVRrbbe9N*%_#Xvz^s(}=Z z(siO~9UKqv_@j2WQH%JRA4ZCfPUb78?e|IAE<57$pP&KX*-M4(P?yHpgB`2jEV)!u zN&c12MWTju&K~A~^}YK$h?pu};(*uO{f4bna9THwD$mry8;H- zF`BYo)x_}B8v9ZaBU!l9(S`2XWxty){jQ!u$9LHu=B!`rYjjc%s!d3^my5r!4_5J; zf7yph(mj+{W=9~T1O4tvd0Xu*xV6UdsW1eVe6I^~+OQayAtwXDP6fE7yfg6PpqlBr zCHzu-$3PKM^s~j0pb}_?x_%VD2~#D*@3gAu;Ajh=>PziQsI|-SDXe|zFFGEhQ++gU zUhZ~GQcDA<;(#5PzeSEm_{k)vvIy5@Q0Hjp`;_*ht~Kp3!Hu+hcubliKId|AGiPh1 z&zXEW$C(a=_O-n&&%Mj>G$J8Mde-qEZ8kYGDJ$CkBKL3Vh*2Vt{)iQWFcn77`VII* zD+kUQ`-0ZN*ws4TrL25p!0?}QRwIsLj1!jLDBTb`{0#;o?VRIDZ0}F$a)gd~Uy5y$ zES3Q+l3OOj1yP5LZT;anoVD7ynLkQ%bP}e+Y0qfzop*EKJ0C{1-!^=PpYQ2dp~MRP zi0r+BinLSpOo%XXUZA+aj%Q)W(Typ;I}(LGaGqW~@qiFv_rKjcf1W1l`#QUJ*1e7v zMFSmwYX{*cINJ_(Fd->dWhf^36OBy+_;-BDvE&Kr-8{m+% zcY-5}=D&zD;1l(X1}>iL7^8y*r@nW#Ko35( zb(gj+aA4>2P~C>^-`y7WB%1=hubae@ySw zkf9^$Li7KOC}Tw56)rcrY1=a*DzQiHO37A7BT+OFf75Rb7$_H?J>#=iOEhw147_2o^}Ret4N%Gm+o^6 zgeTp!v(S@NJYMHesNv^7c08s+*k@)t`+YRU>oD+st<$OE#d~eZk|1ITyy`ML*%dMl z!(-tGU4*MYb712*2T337OK;KgH1;hEH3j_hmkz5iLr%LUnvUS0Fr&h8-?kHu?K+KC z6ID~Ui3htvIL6Y=+tD_Hu(HdK+`(i2Ku3SU%31hB*rxyzQ%n{AofL|6&7;hvnnOaa z{zR2yHHgc*k)6+fTMGfWS>JP z1CEckU3TE4Xg=pPbUN|1B1?@SQ!UTP|vOo(mUh;53ePc8yrz z&Xi`iFrF)4^pT?_MK1U-gJT!Ol#hy-! zT6&rC08jzo2-|M%(a*U{g?LoyyM{YBBggrfqI&wnNb3xWDppWdJy)1={!A>O;w1aM z96i`cdI8q_Tl5_h_#d(Vu#oX9cMgdl?(UbmRV?N`@M>@BhD+KaJg|yNMrjaxpXD5( zmWrw3ciS+Aq zP+63dCZ{Mw$!;^r>%#D z{+&VqJUk?Xz&iYGA~_Q6r`)~vO3K-6$KhasqZ5u^K&rHvQuf=C{j=1uK^XURrId0I zBwb2(z?~^g?S(prop3SQ&glU=Tm&&*2xQ&CnQ_nnw?=CvH~hqjSdX0?|A*Zq zvF%f*Lk|G(lq1eVYV8)Zwu`52bi5317CM&E-^bvxkoB9cSft^I7ya8!d6MHr>iMyK z0w*tZKwaica1Kxg6oIB&9N$stUqEHe(K!mFqDuQ%zVNNnCQ0R-U0*X#qCXGYUuFLf z&hI3Io*o{labf$n%9bP+Aa(lebG%zcj%OycWPpbLZ*^zr(bRs({LMnf4 zbqB{F(x;1c_a1?qsr!&>uiJ6pdCiFf&yOhYH{CqWDs{|N25=wMY8>6R_H?}q*h{MD zu1h8VGrHyQX?DTL_%X>V)lE6Y;M%X`sXvePm&K96{o`F_D(zlWevk$%v6oTla(jr6 znO%3mYDX1bmyJ5wT-&L?+clIMJ6v|X79pLx;WarCd!~hc7tD4C@OBkd4tLGvg6^)_ z68BAY>6DM-Fu;0Ti|T0*zPXiTKwk2fEnJNxZ6)3~0{=NzPw^}xlPPQ3x~3_q)=OjS zz;kz`xf&Y3S{WU|(7flmRVH(jD{3`8nRCSU|x4K}#%N-WIQ4-?kR4TFs zwM!jK*-O+`ma|+>gc^xv-AH;bM7lX@w(V z6VMH}sb^5X1uN38U5P@zoX1}cpz<<2tR? zARu#l9e}jp+HKCb;GdhoUj4`v-032da8*SnL`4~|Mjphq zHZm61i;*$7o{a!l(fC6o3)eG|QMi5=fwO_}bYujsry>AZG=32oj_YTU`*8gvG6dH> zk-@mW9l_qmxG9o}>uZtzxGsBHeI( zFam!V;{%a2Tt`N_;5sDI8Q086M_l_xfL>(m8flMf=Lmc^jHwZ9&y9^Et#A!TTH-24 zuv#>FA_(p?IwJ5vGTI}}akWHXnJ_#Vnb#Emdm?fdu8ks%qN4O)MUrrB8EJ@XqevLn zP$Y<}JtE^88}Z?)jd*a4inzej>k(nI`R)HJo+J=4b^kvACI5fpNzRMXUKMbp+Mn|u z#`TB%$+(`($869Z$_EUNwk#iWLR*}V*`R$XAM-%FI6oWL1^Ji_+Q;)p<2oi^xSkBo z#|+Tkn?DrSKKYmj+V1(70owF@%m8hN{DHW(&c7Gemid?s+J^ZVQBj?>!F)^#tu-H$ zLUTPIlR|ST{~lbw%f~#>oXGErYgInxf#%bE%mdAye9QpN&V0-Oy_zdj?k)?v^WSY?|#RJTiwv@ zGwN2_BW{TGR=0n+{SjTDtcLEURP(p1fljYNOZr=4K6YE!JyVfEw;zHNC_oqm^dRS3bo;zru4Yw?NyrIbM_pdzCGM-zL2#^+vx3?iaVEZNO& zEZLFtri*(wzi)S^tEC2%($$?r&A$i6v+pz4V7~5lKc*K^)(0*B?pc+}7`LH$1lyRZ zF}Hug?$hnl!aY(S&nf#|m1@db4-Ii~hYRa~D18E!WG+AHI=i!YeiQdRH5^Q{2fG0Y znCu>+$L=n7w(BGQq^-N1NP!biF2t!n>3V<%cXA`5$Hv)tuBRk^Hr+j2NzCv=pF3KH z{6t_;Z}-y%$LhogVyySp0U`XO1RyF19aV?@Mx4Q}b{XIY&@ur7M7DkVTu#Ry*NmH-j!0D%9Zih

IJk&W41L;hKA17FW^vtAoSP)z-QGa-heXS>@P!*BT` z0py*$bEbkthdBFj_ex1C#8D#eSmf>s!nd2X+;^^KlCqj(&)j>1dk0|isO%Y7%sLgDJ)FAHeO@m$Wd9cTNVOq# z!}v%dur%rh7WBY6#qOXm7VBHVChb41ra52u?fQBGL0sROeM^<1V}7W&D196DEm!Wp z@f+#l2W|_@!0`v&ux9UdpMeFqXp9dB82jBgr*6-_waTOCl-kDQ?GEhQAd0HuJUXge z=fhGcO5c&>BW^S2j`iiL>A26ENV~sscSkt3uhjoCPFaq*$El>w++d6UGENa)vX+vQ zys&*l>AO(vH|`M6%kkwQ!Q1CP4Gt9j@pP%NH@;|yCy9z{+}KP;>C-54k=KgOdC_*w z_ip9obSi5r`?*=U|1%_vuJ&Qe6s1S3c0;)(`;z33#qwF-l^g8$zpdhx&E($7WbQ_p zXWU+Ha?n3e;zxdQFH%X}xj~g6ZL`X&)X{?*91-^q?{+Kq_t2^SzNVD+m0!zgNBvf; zge4EFq@LX1gz{bkZ#^sy^u1C^YU6Qp<7)pGYHB>FuD0Gl-}GR>`%vcnJ_qt7dEW*) zugQ~&aO+bK_?mKu3;qvb68WsIv3}g3MpW8(Y~AbqxxrQCenQ>-0B&$i+-FVlYN+{S zuQ+|uXHfP&w~hNw_HIGl4N-UI)&{buWoF%5_fi9mjHuiu9z^91Uu9_H*O$`e20iJCKR3*|iK!-_OY zKb*3Yz3=mHOT9*%m!;NKct2;SipMh=d0SCIW3Pd#2YQ0=AkA*8)N)1C@~s=b#|Qnw z^-({PvVZg;Wap5-2@Qz&w49YJ7pv*Q{T>@|`Ru8(TE+TNp6e34OtZ5+W*BSbDmATq z+Jhx?ls=0pI>;&9ucQ2qn$AAxacQz){ic-Bo>qwI@nBbvY*&*!L8^JfYvaz7Js%3> zy=gfZbbpQqpUhb7d;QJ0cVBrMda>QB)H;sc8S)ua_=Lv=uhRI*K0kLHB=5zHo99WW z*DB?KcpGuk`5r_mO{9v+^4&Zt zOI{7XB%j;>QI&O%J;d&@qA~ySx-KDuPFvZ>9VW<_WM`Lvg2`0TQAT>!rJj#Og5dP_ zaysQs^u+U&9Qj2IcXr*2QxpbK@=WcQ>wq8D;xg9mbCI=Sb|_i*l2FJwaQR~{G;Hhb*UiJxF zp`Lz9#%bUd&yUC`%I>@3k&K#>Xi886P^g zLUb-VUAF2{1tZ}|y3cbLRqv7Y+^<-SAc#1mhQeCwcq&l*Qcw+WoHkZlMu&D$?;;gjUNQ`g)H$EYw0>;d8Y61M$#`oA=Mt z?tS9E_~!i!wEKYjZYno=>T!nIi&Mpgw7XI~vEk+ui)i=f;(p`J`^9wH=Y<>GX1@-Y zRo)-eQUO(djc+%(i$}*@s(cmDD9?Lg_>R&SQr^dYGk4DMz5gGTV1{9}SG@|(C*f$sy1-TUqs+Vi#FDJXfFvS0S6kl*M*D$S+768!v;TcPn4s?>W@ z=+qD&bW-)rR#s5M4Njk50dA+&O+7xQZ6vRcex z&j`WQRg}HSpThTV@U4R)9^-8U`)Q>MbN2p?O38yLDFMifC@ED+CZS|CRR%@L7Nuk= zO4bM+f|Bi`q=gSlCDD*HUF;kX!wtFNU2Od5_ZXb;wMN!d$&<=?ZcEk%wwhOMJ{`Qm= zfoO-`*r3+qiQR46Af9N1&&;k9-m_|H50w;n;A2GhJ{jLC>8LnlBR8x z5wGL-omFeA0IAc8vfhMl4sE&lX385qv`}*f zWE8BEO*}f;w^n#Nrk9J(ruy&!d_j31qBj5jo1OfUvOo0uD66rrCAT{$zoFii=KC5D zM0}!~FQ}Y_>5tLoujGC-nuWM5@Gn&eKdxvIh8Ds6{hFE|^S7m{J?>*(gW^{Tl(WUrHND2{G1=3NS0`#n$q7F zAMQx6m#RJ&?QFc+&S@-myyiMh;+-I#{gyH(`OTEJ*Xy8ad>oYas3%V76b1WV{~Z;& z!akqEgV3jfg>)0M&> zsj#tlv+d0{&r;bB*w-Ig$YUI_@l#}Q_6voTS&p(lW zr(o?1Vtme%f43Veu>#*m$dsH+$qmrq;V*-`|7Z$~=+8n|VAPjm)U_8|CXcU2T~_Z-v;5R2;G2^o0?&R zT6LujmAnWIop#-?fz0wjW?iM@lkiZL*Aqiu2R&h-AMoxkbbP9K_ojY8$***LhA6pH zFTAAm^*1^`3%|tO<*7%0}ZGf?R&gb`J(67O~N9#Rq1!(R|I1{JNk z-;*u&7E0xauaHN`LE1gqb2k-ygTCCWcl=nIru+@^_UJsirI5Iy(vSFKZ|UH|M%<39>{}6?>DZW{StL zwV!_*BCaWOrx#cV8vijQjK(J_eti_nw9W=>F_APn^K0x9T`~T%YM90fEB#?ApXW(q z_fVMxV+=7=bpY>_=Xvzp!R+5J3}aF!IfKqW(HXWmsx6#v6csp$|bjau=KjwJ?9ezj-(Vka4 z>4I-I&TZn42-{eEmLG~B*$+hkg>oKm6nerfR)9Bv29T@=$g$mZ_!hW2f}>K2P}HN@u+C7ThL3@nHN$i17nx=jV|B zRh8)TKWgTAV07fURGIHTY|u5*Mm<+F z71%?*UxZJo{wVm2aO|GG&9}ENEd}!tj@?%j7F4)(RIT^=Y4;v?L-9*f&ddVAGbVD*{j!+(lA|fav zrO6b|%o2rj*7>0GK6eX)m!Sn`j#cWoY3ou*XvvuqMB%1qy#2&OsocEEcUaljG#2-* zI5S85{(qRcl($=R=1lP`Y$7sMF7b+0ub~ZRKBiPjbyc?I%sIF(dc}*a#Xf&GsU2tL z`rcD<`6vFa66|%E^Tp%;C?KWc4v1?Pg+lER)J_XgaYw|pi^3CMx}#yN^9y5LW`Xk9 z&239J80<2aDkac91nmf0!Z|+o-CekUhSZwjnirIZP zU_+EAz7(6HOQ5_fXKqj`x~Ykjin?*;My2pUQM<3M_U-`ZQ3~%=N5Yh8=)sv=lwWRY zB&7}@lx!D;|7=@&z)Y9K{O5iIXjUYb{TKa%DB;$CPUg7&du+hG`$+^z+@@#Ie2WWGmP&=^LuTqT|p znn#?n7_wMCqExiFuA*#~kBa-OY)^fmfK1W@ET0f1X<2nojA6N2dE+Km#*%!-dxND% zWR+SP2T?3GDv!z7sEp^#RKFP6JGG1=E*@mLMycb?x;iJ2eAPRe$IOSpQJTo|HSyy= z3MIOzSca{$#_Q#b>)ujuitFB*v{m-uIar^dzur~MJxEV4YeXSLrZSKZvuqIe2R^8~ zpTcsCxc^642#cCwD&(3%s0qTh`hw772Ry=NV8{{c2mmmzm4AYf4(S%eyO*p!rS9o0 zyT!fG4bdrW#;1%)9*1{kuDJkD}Qai4YxL-2d0{H{iK z7u3UYqfien$YEHv8q`Z3+iJX+qvGUwF73*Qfd~Ild6QniEIw5+gHAUIcYzOfVmJlSS?pYfB*ERa0DQlFCY(4%C~YC+IU)?qn)?po=9VE`mOw#q@9D>a*?t}hP6JA zHD~evW$J*5Pv`<6ct`yqFQQ^?pauW&vuspJ5h}X^!)n?mfpWNdt_jSc@+&X~CSR5n zUopdcV9NxysCfIYavu@8opwP+(B(CGjT(rCnHS_{lyL#mdg^s~sakr5Q$_?Uq3$lr zO$BckAi-?_WIRh{7v%@3Mi&?+nnkcoX)PK>BQ~kXAIRdYn7|q}t3!c#h(!NY?g_W4 zpRnRW)qM$#9WP1>v?O#OP*(){?R@EXIbOw|SOe`OQa1^FL^ZYYc|uJZzWA4n;5tyz zTH2Nzh()ijz%+~IHUZtw8)zm0;Sk-nY|RLCP|?OV0T1EF_Tpdh;<0YRU}7i`&$MKJ z$DncuV<_a5PyoF{Wr+X2EGse-#=Kgr_i$T6y~hSa3j0v+Z^}Ar2|ywP(Gtg|1g@&2 zrJOe;I8UJ_PBc>i=guR6jiRk(qMFvCEoI+tDB_g1qAl>rC@K#X4GK6!-3j8wm2iI^ z9;jAoQb@@x8X9O*_jB=xKo+D^uRw@$@&YZ3Mg;27`dT?b)B;pvU9cV(^a|#{RJ<-w zjO=uQ)zZtX=_`im70L_*{GytGphPj-7!aQgPKoXn$|AxAo)fIPAeQ^aBPVR=DhUmz&P@Z34F&O4rgSq zvwT@@0|)h(z=x`$;((F1U6GSG?h(PrZ#D<&^QJ|C!6F|Am=#1LF)BgWr&7^|K=2k} ziv7d@>s_sEzRgg$kwzIdiNY3wNz?BbS~1qs6?Sf>ipwy|gYX(<)a|$VNi}(aBchH{ zO1}rKx^12C?gtDO+S#Xzr+8l65 z?{He*K)IUwP78Dt)o%Ikv@bds(9s$&Q}p4ex~K|MO_?+QYi5e@bptDN2n{7DGvo`U zOWQduOKIn+x^{L@+PMI7&+HEzQo~C!-5uPcOt`w4E2?={FbNLvwSgNf9}ax0lHQ}! zivmELJrWqCCiR6oCc%DX671&8jsZ6&!KuJ^u=RljVNlUonE@|}D$5nN+%W^Vwb7*i!y%>d-Zq`)PmkBaX5NYH{%?0>#AaXf6;NAd3k zri)qJfai_~*6j!PQ(29?gCJGxg7eB`SRgvlfWJx%HiD1ChCnyQw{DW)Te&GafN#(c ze1}SV1&Zi=V^CRjR}h}Xxl@96-dit-e0-mX#@m5lqcT5sN=2byoM^FbZYZ4_s5#g! zr3I&N3=B~Jr&pqXcL{nw74^uX6JIMMaEK323^a#Rt0uUPv&IIKl(Da5aPlM2sdVeQ zoTRY4N-!-MG<<_t;s4#YCX#fRYH!F&?}Xp#J%KpFWVim04z`qFYgD@EZW4qo2>C;5 zGPpgjVvIM4+y&NBnMR7DvaWC0?LpHg0L&O3 zxF-5|l+z~!`Y4mAOxz#iiXM3P)==CQvxtj4P8Gc&XwzN`Y~^A7f^Vo`daMWpj*4j% zQWs4KdQf@Y47!&yh6LY{5HIb&ECYxZ(^`QFH=GniG!qmZQWwn(YPrP-{OgvQt*)EI zxg~)l?lU$B_gjQa-;fvnPjSHz7fN7?;ae&-1V0dyB3F@hbfIr>3NN1$oFqx#arTD5 zDlG1Qkw=OyB1jR!7L)=p7owsY=gta7G|~@ra7FMTs+^Cx^5mT0Q|fv@woYjSEG2;i zn)!S%iAtXjx+!CI5CP#wf_fg68^qQdCdXCK3-vz>BAe5qU_6yp1sjsT7(JUgKe$-< zjFznlc0+!8V6wlE9}Lo|BdEr)A!tS>(x8XZ-p5M?&!WN;3xW;R(oaUCd*y}EsNd>PNy4X zK__Ls7t~PkqM(k;mj}B7Ig&Lif`6;Em(Z{ARJtMP;c#*Aq_9(#tO~+Pvo;8$Wi1_k z3Qd7TEKe`9W+Prf`1FdUL4=W&1|Jiq$oQRNeXu+@iJVJ<^|^RUaEvfT-q;#!OQnmT zn0ssw?oz9MZB4a{&{KsyZ@nCZC8Q|mr30&j4d~%*K@-JNFoEg4;AAzzsB3-?!r)vU z{9bLmmO3W26=K|Qi10x$nLF+c?t?XwHTwlEe^C5_AgpQ!gRrXoNpb7IqO4WHX56a^ znjZOQTlX}AsC?IqZq!$KR}vv ztj4m%XpCyrdR&{-R3yRtE!dpfpTT#gG9qZ>Vh{)ZXM-jggJm!!EBpv$ z4G1GHW>ctj(Y+yLW6BQOsM$O{jC*?<0CQ$)ED)}Q$wJ^V;VbW9r$2Un47He@zxfuZqc z2l3+op4=;h1&(!F-_S`(O6F7jLLn85d-AK{Hk8#RRF4*)2{qt>8KF`&BA;{a4Fkh; zQ0Q5MHU$omCQ-*@JZ@y@Wt9k1Hu@;NYxrHtm>GVEPQ4sj$@{WHK+g43e_t4JdSgRV zjZzCf{cy;u(t7cHkWQZo$&~X-s2LB;5p9HE1q;mtvUezs7t9QOpx44)wY#5aXdYM2 z2_>tw0lbJP=9nbJ?dFCMx0^(Tv%;OJuP?lXGR}rJ^6IBT*(#|KO*tQWk#Zgk$MEU} zp=@>ZUDKzJn=*6s%!v;JKkZ7$!oe3pql^NL8-9*xL8KNoHhFVaB$aEIg&L@|iMVe{ zg&jj)%GnwEfekN(0GNm^jwjrMS8NK6g@c_htPxF5;n^XF@Fiz8pG4a6D z!fheIjy6~q`bCG%XLb(@5d617S5%02&dm(Z5HG&2m)gMC5c*IuwpyW$V3D*vR#243 zXm_!s5w6NqG9WaFE=&by26PUE5!Lu|Xe`(43Yk<=8>$!+>LS>jL+gseqd2}IbXkYM z=aT+m#N;kiB^M0{kL7*)Lmfo~bjiKpZ~2FVA&-cF_J0_Fn zhx_o`heMevsUu}~2mIUOvKXMa9!)TC){)Q}q$OEWdl`WtCqvkF`nj>k26LuO&J;K;0o)K@RQ{G>pPx#Q;P%GHbsAxe5U-gjiV5fWCK@;_1cR|8rDGtr`#9x0rjQ?;LoY^Jxrl6#RGBQJY9_W5r<9vBfhTxqH*LqW7)C;n(yUtilh{v`v5+Lhq|pTH!iBP<(XFxn**= zN-Yhd__Lvx_|??#cw`)*>;<88N}Cm$ME}$@7lwL zAR`R3-3XFY;fBk~!^|TJ!xP~K-62-P1BQev3{n@0A056JJq$ID7QAVNbGn(~AjRzt z4X1+rq59@~0~kq}zBP}8 z+AAZ%7?EBQy*no?b{ocQuALLk!0Pt3@Lck(4Z-7bS=gc4HaR>*qfOI99cnK6y@0A5 zNwE}rI@FQ7JRRPJ7|^cazJjeEirF*@e`6`-kI-J)JR{tX3f>B7+4)EqNqEL_%A&9z zlpYKX23L|u+AiP8kU%0ZNAqyRv8=l6`Ee+4sOH-)u zt+4Mu(j%51d^Nm6B~7Knn?uco6r0YF9)B97ZdCGm_#y4ISF$2qIqr=xGLs_|z&M@K zCng|M+Q#sCwQ)vra%;rT!;!EsC7i~6OT(;30CQ%(!9vL^472&g?O~fy)BP5rYr$e; zeLi0iHmjtWMSH{Dv^dUKglrx&^=&zCZ+MPgbaXm<8faglofTpWgKdYrQ36N;$n z35|y<`^PuM5`Uj|BNrSB&yWzboP2NmIsUmSY!$g{(@I2&mLuW$YWT3Ft&4q@7ak2i zDty?|UXPWR?NL80@)=kV5BW_P`9gBJUW;gf;{AR24ZXG(^2OdKh-t&RpTobavwkqeNg~y( z@frHtZ1`mBp+pF|1>D79s8G=>xO=#)yX}c2vd&iDWk{p;?>969bJq6wDA_T2m5*Yy#0WZSf75ETIC{AQe8;Vw#{JP#*oC!J^O)vu4ei zd*|%C?>%$w*>~^X-!X`Wr0`RAY4WxzepW6BYp=^kx=kldAIG;bwqE-09XLS2?ouf?i~rRMpkPTgzLDXj zrj1&%d7*_#3SZH4k(K{-LJ4h}z&mt34+VwU5ueh!NxY63FYo(R;2|yQhkn-^iyq)0 z(!K-_HAr8c^&VyCaiB;Z=BF5Yg+hC^GF%^{EXDG%4lQ2UooQjOLY3G&c8j4BhMs@` z1K-Rx%Fthce(1^MakBFr6BBn9_ak%peN8Q3jZL!kYjdP5uja+HWEx+De6(QeIXq!4 z=a9GvZ3~*1|H{lqBam6DoWnO*kbCBzVJ68n9U5r8(u5)sSXHv6Ct1y= z&0Wf>bFArR2R32){n3uOk-xev6#l&#WHS3MzEIg!Ot1#E9$V?t>D&hoPP8V{>yU_&PPo5N629V#k|1Jvj{WL9CyR|ct+Eg@@*FO z2K5zigi3F+^=GGAd9X@3=#R2*3SS_9naTIxuzQ7CzZ-ALz7jrJLD-URw!QJE3n4Lb zgw51fsyd4t2|OFiD5rt%i@>9Uc|m3$BYm6sZlmQ7GXo%Gug<$Z@KTz%Pv6;Y3*;*( z@OX8|^Vs&bExgjD7omLOY3zxI)Gd6Kv3s>YPzdRfS!nXf*{wXo@%D--fdVZG`HdT5 z(&=a`hq_=Z%-%)XE{>XpHrcm+7;f!5I7+GaP}e5+Nc>qex>3^uzNkqNFo*1|x239s zZKtj=+GzOqL)&Nd9+5&LKIX?z-Yb1Qo=U1Zz!4AMNB-~m2jJ~=@hlar>OT>+yYmjK zA^Q&bE_n{&%%5?Or|9GS0+@Yr(U&P9Su;{B!J~Lfbnv4i3Gx?xZj;Kss#xoOnvwGeUm9t69~q!-6k%TG^R1Q-AOJYUF-m@tDqOpB#C}!3 z8(PT9f+s$AP^Bg|sPf&{s=y`aos8^|&Tf7eZE=VigW-8xoaknH81^0@UybeVTOeE! z=?mka^tX5}w|Rus$`1Wh$SgbGbB`eJA%2umxE-V|<@8UYy zOG9G^t+LAeYTJCZNtg78Js(E=D&f~Sxn^a*BC1Rk6YXGJ?@SYqSY4lByTh5|(tTsH zvSjXgHk{JNiiZqVLeFQ5Ql@{gV_4uZ`PJQGuKu@|h6f&%`8lFR74;gQ%T;MmH0(a& zOs1S%<&C4H-7BytK1SLk^?n?|bb+hs@4+rFa@rOf&S3d6d$6q5PNR#&VLP(NmKTX? zdTyF{-q0S0$cvIL@zEVmiO&%FX`3y+)z~!ZnJ4-qg{*CXD75Ja!PKi!kw!08i)R`8 zN84{jJkv|HsO67Gn(zOexNK9L+!v?fGp7ZM1!NIW7GK{FpHr!^PLwfrx^0OF+VmM1 z7SEtLMRqI`6O4Z@eI`($MFp$=*OVylTQ2q}h@A0_j7)(#M+_qKBa_BRaVy5bf zutSwa|2Mw=4$8ikWa2HtH1t`h`W4ty0DOTb`d!(19Rk^ zLkEYqTR%eJ=n`oM)LHwFoHWG5vgl6Tpt4S}#m=r!=$t?iSh9a1mcMH4UJ+EAC+ zRSI1c=K)+fX^WLtYi-eFc8eYc6^qanQO;=QNwLXdaYoTe=inh2o>#5!(#g|eDB76x zyEQ<@{%^#3J1%%#~+Z?ljCdkg%4yIgQ!c>Kj!=s0dXT=PrKypq^*1A38sXQKt zF11%NVj?$L88B>>TGX0*GH~1Bod6JTMyLL@htTr-bwZ%Ka zWp8*eFb75OgEK%SQe7${+eMr^rxh=U3}r{>(}`r)?LZFbUfiS^@~dZENwUi2N~fs~ z@0*CDP;K+@6eeG5z)ELyjQ6mGMFVx_MA~V*>mb?sdt;*&F|ZCa+(hq62{9#?V}@4C f>S6-(sUy)F%h)_Rc)NF{u49&|%fDr_3$XaVax=6v delta 49953 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 Date: Fri, 24 Sep 2021 12:59:33 +0000 Subject: [PATCH 094/130] Ensure that sqlite_stat1 and sqlite_stat4 are ordinary tables (not views or virtual tables) before trying to load them (dbsqlfuzz bc02a0cde82dee801a8d6f653d2831680f87dca1). This prevents sqlite3_declare_vtab() from running with db->init.busy turned on. Even so, enhance sqlite3_declare_vtab() to be able to deal with db->init.busy being on, in case there are undiscovered paths to that state. Each of these two changes are independently sufficient to prevent the problem fixed by the previous check-in [c7560c1329965ab5] but there is no harm in keeping that third layer of protection in place. FossilOrigin-Name: eb94f4a8174436b1f0deed0a43618a20018387bb815be658314ca6b454c446fb --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/analyze.c | 10 ++++++++-- src/vtab.c | 8 ++++++++ test/vtabK.test | 16 ++++++++++++++++ 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index cbc9df8132..aa848c60a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sdb->init.azInit\sarray\sis\sinitialized\sat\sall\stimes.\ndbsqlfuzz\s0ad6d441f9bf3dfc32626a9900bc1700495b16f9 -D 2021-09-24T02:14:35.733 +C Ensure\sthat\ssqlite_stat1\sand\ssqlite_stat4\sare\sordinary\stables\s(not\sviews\sor\nvirtual\stables)\sbefore\strying\sto\sload\sthem\n(dbsqlfuzz\sbc02a0cde82dee801a8d6f653d2831680f87dca1).\s\sThis\sprevents\nsqlite3_declare_vtab()\sfrom\srunning\swith\sdb->init.busy\sturned\son.\s\sEven\sso,\nenhance\ssqlite3_declare_vtab()\sto\sbe\sable\sto\sdeal\swith\sdb->init.busy\sbeing\son,\nin\scase\sthere\sare\sundiscovered\spaths\sto\sthat\sstate.\nEach\sof\sthese\stwo\schanges\sare\sindependently\ssufficient\sto\sprevent\sthe\sproblem\nfixed\sby\sthe\sprevious\scheck-in\s[c7560c1329965ab5]\sbut\sthere\nis\sno\sharm\sin\skeeping\sthat\sthird\slayer\sof\sprotection\sin\splace. +D 2021-09-24T12:59:33.753 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -482,7 +482,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c a4e20094bb7e6ca5fa832779dc0b6aedfed4cab92144d3bc754fc6dfe6f26f34 -F src/analyze.c abbaaf7dca79d1c31c713500324fc0b55bf3eeac5b7b07001452a3d0f210de4f +F src/analyze.c 989eb1146f4a2c320623e190f8913bf1829fd8954a52dbfd0f792efc69db0e66 F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d @@ -629,7 +629,7 @@ F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c -F src/vtab.c 88404ac1517903b3eb2abe256772ee95bb09f81ac0a17e13afe5d467df4de4ee +F src/vtab.c c289aa504f278f23b64cb33c95d284495c5f405bd363b419d31c92c61c14df1f F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a @@ -1709,7 +1709,7 @@ F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f F test/vtabJ.test a6aef49d558af90fae10565b29501f82a95781cb4f797f2d13e2d19f9b6bc77b -F test/vtabK.test b109c112ca23f9fbb4c35395fd5b0aa722cc78edc759a5739fc54a93b4b0385b +F test/vtabK.test b20e9ec57750a3e8adb4023510edc72f1880f18f0914bbc1f116a31cf6563a9f F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad @@ -1926,7 +1926,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 d678ecca02698753d1b33e072566112e94ea36d0d3a8f4a24d2b09d131968d88 -R b533cb60525bfcc9f1f61bf9f8fd7850 +P c7560c1329965ab57cd71393c044b110561b83641d08677bc51044df9e377882 +R d36f6b4bb0a80e7d98d8d352f0785fdc U drh -Z 760c440786934b23f1295699ea1847cf +Z 660102229a12eb4b87616b09b150cba0 diff --git a/manifest.uuid b/manifest.uuid index 2b6c7ee745..dd2a54e96c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7560c1329965ab57cd71393c044b110561b83641d08677bc51044df9e377882 \ No newline at end of file +eb94f4a8174436b1f0deed0a43618a20018387bb815be658314ca6b454c446fb \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 41b993fb3f..840bdb4034 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1840,9 +1840,12 @@ static int loadStatTbl( */ static int loadStat4(sqlite3 *db, const char *zDb){ int rc = SQLITE_OK; /* Result codes from subroutines */ + const Table *pStat4; assert( db->lookaside.bDisable ); - if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ + if( (pStat4 = sqlite3FindTable(db, "sqlite_stat4", zDb))!=0 + && IsOrdinaryTable(pStat4) + ){ rc = loadStatTbl(db, "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", @@ -1879,6 +1882,7 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ char *zSql; int rc = SQLITE_OK; Schema *pSchema = db->aDb[iDb].pSchema; + const Table *pStat1; assert( iDb>=0 && iDbnDb ); assert( db->aDb[iDb].pBt!=0 ); @@ -1901,7 +1905,9 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ /* Load new statistics out of the sqlite_stat1 table */ sInfo.db = db; sInfo.zDatabase = db->aDb[iDb].zDbSName; - if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)!=0 ){ + if( (pStat1 = sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)) + && IsOrdinaryTable(pStat1) + ){ zSql = sqlite3MPrintf(db, "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); if( zSql==0 ){ diff --git a/src/vtab.c b/src/vtab.c index 86e13d3136..3c9b2f275f 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -801,6 +801,7 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ Table *pTab; char *zErr = 0; Parse sParse; + int initBusy; #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ @@ -820,6 +821,12 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ memset(&sParse, 0, sizeof(sParse)); sParse.eParseMode = PARSE_MODE_DECLARE_VTAB; sParse.db = db; + /* We should never be able to reach this point while loading the + ** schema. Nevertheless, defend against that (turn off db->init.busy) + ** in case a bug arises. */ + assert( db->init.busy==0 ); + initBusy = db->init.busy; + db->init.busy = 0; sParse.nQueryLoop = 1; if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr) && sParse.pNewTable @@ -866,6 +873,7 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ } sqlite3DeleteTable(db, sParse.pNewTable); sqlite3ParserReset(&sParse); + db->init.busy = initBusy; assert( (rc&0xff)==rc ); rc = sqlite3ApiExit(db, rc); diff --git a/test/vtabK.test b/test/vtabK.test index 3016e4b303..1731c9ca44 100644 --- a/test/vtabK.test +++ b/test/vtabK.test @@ -56,4 +56,20 @@ do_execsql_test 170 { PRAGMA integrity_check; } {ok} +# Follow-on dbsqlfuzz bc02a0cde82dee801a8d6f653d2831680f87dca1 +reset_db +do_execsql_test 200 { + CREATE TABLE t1(a); + INSERT INTO t1 VALUES('Ebed-malech'); + CREATE TABLE x(a); + PRAGMA writable_schema=ON; + CREATE VIRTUAL TABLE sqlite_stat1 USING fts5(a); +} {} +do_catchsql_test 210 { + CREATE VIRTUAL TABLE t2 USING rtree(id,x,y); +} {1 {no such column: stat}} +do_execsql_test 220 { + SELECT * FROM t1; +} {Ebed-malech} + finish_test From b6dad520e58221bfa878c3b1703835dd7ff0bac8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Sep 2021 16:14:47 +0000 Subject: [PATCH 095/130] Add lots of new "const" on internal function parameters. There is opportunity for many more - this is a work in progress. FossilOrigin-Name: a3c71a673ddd1c299bdae550fb955077b77088329a8ca2895dfb23538b524a8e --- manifest | 20 +++++++-------- manifest.uuid | 2 +- src/alter.c | 38 +++++++++++++++------------- src/build.c | 4 +-- src/expr.c | 67 ++++++++++++++++++++++++++----------------------- src/malloc.c | 12 ++++----- src/sqliteInt.h | 42 +++++++++++++++---------------- 7 files changed, 97 insertions(+), 88 deletions(-) diff --git a/manifest b/manifest index aa848c60a1..fbb0802075 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\ssqlite_stat1\sand\ssqlite_stat4\sare\sordinary\stables\s(not\sviews\sor\nvirtual\stables)\sbefore\strying\sto\sload\sthem\n(dbsqlfuzz\sbc02a0cde82dee801a8d6f653d2831680f87dca1).\s\sThis\sprevents\nsqlite3_declare_vtab()\sfrom\srunning\swith\sdb->init.busy\sturned\son.\s\sEven\sso,\nenhance\ssqlite3_declare_vtab()\sto\sbe\sable\sto\sdeal\swith\sdb->init.busy\sbeing\son,\nin\scase\sthere\sare\sundiscovered\spaths\sto\sthat\sstate.\nEach\sof\sthese\stwo\schanges\sare\sindependently\ssufficient\sto\sprevent\sthe\sproblem\nfixed\sby\sthe\sprevious\scheck-in\s[c7560c1329965ab5]\sbut\sthere\nis\sno\sharm\sin\skeeping\sthat\sthird\slayer\sof\sprotection\sin\splace. -D 2021-09-24T12:59:33.753 +C Add\slots\sof\snew\s"const"\son\sinternal\sfunction\sparameters.\s\sThere\sis\sopportunity\nfor\smany\smore\s-\sthis\sis\sa\swork\sin\sprogress. +D 2021-09-24T16:14:47.527 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -481,7 +481,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c a4e20094bb7e6ca5fa832779dc0b6aedfed4cab92144d3bc754fc6dfe6f26f34 +F src/alter.c a279ff8e6e079dcec20eb736d6399229f4b495f01e6da26052467c9963ead595 F src/analyze.c 989eb1146f4a2c320623e190f8913bf1829fd8954a52dbfd0f792efc69db0e66 F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -491,7 +491,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c bed4239e31772ed5486e947d8eaf3d38fcc76136e19d0383bad15609198419c2 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 8fa6deebf8726339a5aafb322e9d79c48950b994f33f17460c5393ef593d202e +F src/build.c 53fe0ecd73c210561eaea965cb4977d7d717e7984005fa814e856868b06f8b23 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -499,7 +499,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c ce736caaf1cf6d69789511e9fc5ed31013d9570d5d773cce909d396112d83843 +F src/expr.c 5316aff6218b871550e1a84c76f3343dabd0f1096ec29ad26f14e85c2ccd701e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1 @@ -512,7 +512,7 @@ F src/insert.c 16fa4b66709db6db5bb31475f2321d0a839269765aa2461a520c151c385e8b9d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c 9b99470c8bffc08b3758dca06a6af0961c919db554b58f2ffad51b05147f1186 -F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b +F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb @@ -552,7 +552,7 @@ F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd46 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 25af7dcb149966262f0fa485262db638e7058a63f9cfeda6b63a3c8334ca7af3 +F src/sqliteInt.h 8e88176d15baa0d36b6401042c8b301e9ad28fb34e43a29c0c44001e5a325e94 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1926,7 +1926,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 c7560c1329965ab57cd71393c044b110561b83641d08677bc51044df9e377882 -R d36f6b4bb0a80e7d98d8d352f0785fdc +P eb94f4a8174436b1f0deed0a43618a20018387bb815be658314ca6b454c446fb +R db077a8e62b070323fd372dd7e91140d U drh -Z 660102229a12eb4b87616b09b150cba0 +Z 4395f669ee70fc34c56697d082f33420 diff --git a/manifest.uuid b/manifest.uuid index dd2a54e96c..ce098267d0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eb94f4a8174436b1f0deed0a43618a20018387bb815be658314ca6b454c446fb \ No newline at end of file +a3c71a673ddd1c299bdae550fb955077b77088329a8ca2895dfb23538b524a8e \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 2e3b25b1de..8fc9b10968 100644 --- a/src/alter.c +++ b/src/alter.c @@ -689,7 +689,7 @@ void sqlite3AlterRenameColumn( ** the parse tree. */ struct RenameToken { - void *p; /* Parse tree element created by token t */ + const void *p; /* Parse tree element created by token t */ Token t; /* The token that created parse tree element p */ RenameToken *pNext; /* Next is a list of all RenameToken objects */ }; @@ -731,9 +731,9 @@ struct RenameCtx { ** Technically, as x no longer points into a valid object or to the byte ** following a valid object, it may not be used in comparison operations. */ -static void renameTokenCheckAll(Parse *pParse, void *pPtr){ +static void renameTokenCheckAll(Parse *pParse, const void *pPtr){ if( pParse->nErr==0 && pParse->db->mallocFailed==0 ){ - RenameToken *p; + const RenameToken *p; u8 i = 0; for(p=pParse->pRename; p; p=p->pNext){ if( p->p ){ @@ -759,7 +759,11 @@ static void renameTokenCheckAll(Parse *pParse, void *pPtr){ ** with tail recursion in tokenExpr() routine, for a small performance ** improvement. */ -void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){ +const void *sqlite3RenameTokenMap( + Parse *pParse, + const void *pPtr, + const Token *pToken +){ RenameToken *pNew; assert( pPtr || pParse->db->mallocFailed ); renameTokenCheckAll(pParse, pPtr); @@ -781,7 +785,7 @@ void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){ ** with parse tree element pFrom. This function remaps the associated token ** to parse tree element pTo. */ -void sqlite3RenameTokenRemap(Parse *pParse, void *pTo, void *pFrom){ +void sqlite3RenameTokenRemap(Parse *pParse, const void *pTo, const void *pFrom){ RenameToken *p; renameTokenCheckAll(pParse, pTo); for(p=pParse->pRename; p; p=p->pNext){ @@ -797,7 +801,7 @@ void sqlite3RenameTokenRemap(Parse *pParse, void *pTo, void *pFrom){ */ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ Parse *pParse = pWalker->pParse; - sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr); + sqlite3RenameTokenRemap(pParse, 0, (const void*)pExpr); return WRC_Continue; } @@ -841,12 +845,12 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ */ static void unmapColumnIdlistNames( Parse *pParse, - IdList *pIdList + const IdList *pIdList ){ if( pIdList ){ int ii; for(ii=0; iinId; ii++){ - sqlite3RenameTokenRemap(pParse, 0, (void*)pIdList->a[ii].zName); + sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName); } } } @@ -943,7 +947,7 @@ static void renameTokenFree(sqlite3 *db, RenameToken *pToken){ static RenameToken *renameTokenFind( Parse *pParse, struct RenameCtx *pCtx, - void *pPtr + const void *pPtr ){ RenameToken **pp; if( NEVER(pPtr==0) ){ @@ -1062,18 +1066,18 @@ static void renameColumnParseError( static void renameColumnElistNames( Parse *pParse, RenameCtx *pCtx, - ExprList *pEList, + const ExprList *pEList, const char *zOld ){ if( pEList ){ int i; for(i=0; inExpr; i++){ - char *zName = pEList->a[i].zEName; + const char *zName = pEList->a[i].zEName; if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) && ALWAYS(zName!=0) && 0==sqlite3_stricmp(zName, zOld) ){ - renameTokenFind(pParse, pCtx, (void*)zName); + renameTokenFind(pParse, pCtx, (const void*)zName); } } } @@ -1087,15 +1091,15 @@ static void renameColumnElistNames( static void renameColumnIdlistNames( Parse *pParse, RenameCtx *pCtx, - IdList *pIdList, + const IdList *pIdList, const char *zOld ){ if( pIdList ){ int i; for(i=0; inId; i++){ - char *zName = pIdList->a[i].zName; + const char *zName = pIdList->a[i].zName; if( 0==sqlite3_stricmp(zName, zOld) ){ - renameTokenFind(pParse, pCtx, (void*)zName); + renameTokenFind(pParse, pCtx, (const void*)zName); } } } @@ -1795,7 +1799,7 @@ static void renameTableFunc( static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_STRING && (pExpr->flags & EP_DblQuoted) ){ - renameTokenFind(pWalker->pParse, pWalker->u.pRename, (void*)pExpr); + renameTokenFind(pWalker->pParse, pWalker->u.pRename, (const void*)pExpr); } return WRC_Continue; } @@ -2065,7 +2069,7 @@ drop_column_done: ** statement. Argument pSrc contains the possibly qualified name of the ** table being edited, and token pName the name of the column to drop. */ -void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *pName){ +void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const Token *pName){ sqlite3 *db = pParse->db; /* Database handle */ Table *pTab; /* Table to modify */ int iDb; /* Index of db containing pTab in aDb[] */ diff --git a/src/build.c b/src/build.c index f2b3d2544d..126aa16ce6 100644 --- a/src/build.c +++ b/src/build.c @@ -888,10 +888,10 @@ void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){ ** are not \000 terminated and are not persistent. The returned string ** is \000 terminated and is persistent. */ -char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ +char *sqlite3NameFromToken(sqlite3 *db, const Token *pName){ char *zName; if( pName ){ - zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n); + zName = sqlite3DbStrNDup(db, (const char*)pName->z, pName->n); sqlite3Dequote(zName); }else{ zName = 0; diff --git a/src/expr.c b/src/expr.c index d85d21eb18..09fe66b7f6 100644 --- a/src/expr.c +++ b/src/expr.c @@ -21,7 +21,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piToFree); /* ** Return the affinity character for a single column of a table. */ -char sqlite3TableColumnAffinity(Table *pTab, int iCol){ +char sqlite3TableColumnAffinity(const Table *pTab, int iCol){ assert( iColnCol ); return iCol>=0 ? pTab->aCol[iCol].affinity : SQLITE_AFF_INTEGER; } @@ -92,7 +92,7 @@ char sqlite3ExprAffinity(const Expr *pExpr){ ** and the pExpr parameter is returned unchanged. */ Expr *sqlite3ExprAddCollateToken( - Parse *pParse, /* Parsing context */ + const Parse *pParse, /* Parsing context */ Expr *pExpr, /* Add the "COLLATE" clause to this expression */ const Token *pCollName, /* Name of collating sequence */ int dequote /* True to dequote pCollName */ @@ -107,7 +107,11 @@ Expr *sqlite3ExprAddCollateToken( } return pExpr; } -Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ +Expr *sqlite3ExprAddCollateString( + const Parse *pParse, /* Parsing context */ + Expr *pExpr, /* Add the "COLLATE" clause to this expression */ + const char *zC /* The collating sequence name */ +){ Token s; assert( zC!=0 ); sqlite3TokenInit(&s, (char*)zC); @@ -409,7 +413,7 @@ static int codeCompare( ** But a TK_SELECT might be either a vector or a scalar. It is only ** considered a vector if it has two or more result columns. */ -int sqlite3ExprIsVector(Expr *pExpr){ +int sqlite3ExprIsVector(const Expr *pExpr){ return sqlite3ExprVectorSize(pExpr)>1; } @@ -419,7 +423,7 @@ int sqlite3ExprIsVector(Expr *pExpr){ ** is a sub-select, return the number of columns in the sub-select. For ** any other type of expression, return 1. */ -int sqlite3ExprVectorSize(Expr *pExpr){ +int sqlite3ExprVectorSize(const Expr *pExpr){ u8 op = pExpr->op; if( op==TK_REGISTER ) op = pExpr->op2; if( op==TK_VECTOR ){ @@ -707,14 +711,14 @@ int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){ ** to by pnHeight, the second parameter, then set *pnHeight to that ** value. */ -static void heightOfExpr(Expr *p, int *pnHeight){ +static void heightOfExpr(const Expr *p, int *pnHeight){ if( p ){ if( p->nHeight>*pnHeight ){ *pnHeight = p->nHeight; } } } -static void heightOfExprList(ExprList *p, int *pnHeight){ +static void heightOfExprList(const ExprList *p, int *pnHeight){ if( p ){ int i; for(i=0; inExpr; i++){ @@ -722,8 +726,8 @@ static void heightOfExprList(ExprList *p, int *pnHeight){ } } } -static void heightOfSelect(Select *pSelect, int *pnHeight){ - Select *p; +static void heightOfSelect(const Select *pSelect, int *pnHeight){ + const Select *p; for(p=pSelect; p; p=p->pPrior){ heightOfExpr(p->pWhere, pnHeight); heightOfExpr(p->pHaving, pnHeight); @@ -775,7 +779,7 @@ void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ ** Return the maximum height of any expression tree referenced ** by the select statement passed as an argument. */ -int sqlite3SelectExprHeight(Select *p){ +int sqlite3SelectExprHeight(const Select *p){ int nHeight = 0; heightOfSelect(p, &nHeight); return nHeight; @@ -1028,7 +1032,7 @@ Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ Expr *sqlite3ExprFunction( Parse *pParse, /* Parsing context */ ExprList *pList, /* Argument list */ - Token *pToken, /* Name of the function */ + const Token *pToken, /* Name of the function */ int eDistinct /* SF_Distinct or SF_ALL or 0 */ ){ Expr *pNew; @@ -1066,8 +1070,8 @@ Expr *sqlite3ExprFunction( */ void sqlite3ExprFunctionUsable( Parse *pParse, /* Parsing and code generating context */ - Expr *pExpr, /* The function invocation */ - FuncDef *pDef /* The function being invoked */ + const Expr *pExpr, /* The function invocation */ + const FuncDef *pDef /* The function being invoked */ ){ assert( !IN_RENAME_OBJECT ); assert( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 ); @@ -1247,7 +1251,7 @@ void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){ ** passed as the first argument. This is always one of EXPR_FULLSIZE, ** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE. */ -static int exprStructSize(Expr *p){ +static int exprStructSize(const Expr *p){ if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE; if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE; return EXPR_FULLSIZE; @@ -1287,7 +1291,7 @@ static int exprStructSize(Expr *p){ ** of dupedExprStructSize() contain multiple assert() statements that attempt ** to enforce this constraint. */ -static int dupedExprStructSize(Expr *p, int flags){ +static int dupedExprStructSize(const Expr *p, int flags){ int nSize; assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ assert( EXPR_FULLSIZE<=0xfff ); @@ -1318,7 +1322,7 @@ static int dupedExprStructSize(Expr *p, int flags){ ** of the Expr structure and a copy of the Expr.u.zToken string (if that ** string is defined.) */ -static int dupedExprNodeSize(Expr *p, int flags){ +static int dupedExprNodeSize(const Expr *p, int flags){ int nByte = dupedExprStructSize(p, flags) & 0xfff; if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ nByte += sqlite3Strlen30NN(p->u.zToken)+1; @@ -1339,7 +1343,7 @@ static int dupedExprNodeSize(Expr *p, int flags){ ** and Expr.pRight variables (but not for any structures pointed to or ** descended from the Expr.x.pList or Expr.x.pSelect variables). */ -static int dupedExprSize(Expr *p, int flags){ +static int dupedExprSize(const Expr *p, int flags){ int nByte = 0; if( p ){ nByte = dupedExprNodeSize(p, flags); @@ -1358,7 +1362,7 @@ static int dupedExprSize(Expr *p, int flags){ ** if any. Before returning, *pzBuffer is set to the first byte past the ** portion of the buffer copied into by this function. */ -static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ +static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ Expr *pNew; /* Value to return */ u8 *zAlloc; /* Memory space from which to build Expr object */ u32 staticFlag; /* EP_Static if space not obtained from malloc */ @@ -1539,13 +1543,14 @@ static void gatherSelectWindows(Select *p){ ** truncated version of the usual Expr structure that will be stored as ** part of the in-memory representation of the database schema. */ -Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){ +Expr *sqlite3ExprDup(sqlite3 *db, const Expr *p, int flags){ assert( flags==0 || flags==EXPRDUP_REDUCE ); return p ? exprDup(db, p, flags, 0) : 0; } -ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ +ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int flags){ ExprList *pNew; - struct ExprList_item *pItem, *pOldItem; + struct ExprList_item *pItem; + const struct ExprList_item *pOldItem; int i; Expr *pPriorSelectColOld = 0; Expr *pPriorSelectColNew = 0; @@ -1597,7 +1602,7 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ */ #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ || !defined(SQLITE_OMIT_SUBQUERY) -SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ +SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int flags){ SrcList *pNew; int i; int nByte; @@ -1609,7 +1614,7 @@ SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ pNew->nSrc = pNew->nAlloc = p->nSrc; for(i=0; inSrc; i++){ SrcItem *pNewItem = &pNew->a[i]; - SrcItem *pOldItem = &p->a[i]; + const SrcItem *pOldItem = &p->a[i]; Table *pTab; pNewItem->pSchema = pOldItem->pSchema; pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); @@ -1641,7 +1646,7 @@ SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ } return pNew; } -IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ +IdList *sqlite3IdListDup(sqlite3 *db, const IdList *p){ IdList *pNew; int i; assert( db!=0 ); @@ -1665,11 +1670,11 @@ IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ } return pNew; } -Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ +Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int flags){ Select *pRet = 0; Select *pNext = 0; Select **pp = &pRet; - Select *p; + const Select *p; assert( db!=0 ); for(p=pDup; p; p=p->pPrior){ @@ -1910,7 +1915,7 @@ void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ void sqlite3ExprListSetName( Parse *pParse, /* Parsing context */ ExprList *pList, /* List to which to add the span. */ - Token *pName, /* Name to be added */ + const Token *pName, /* Name to be added */ int dequote /* True to cause the name to be dequoted */ ){ assert( pList!=0 || pParse->db->mallocFailed!=0 ); @@ -1928,7 +1933,7 @@ void sqlite3ExprListSetName( ** to the token-map. */ sqlite3Dequote(pItem->zEName); if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenMap(pParse, (void*)pItem->zEName, pName); + sqlite3RenameTokenMap(pParse, (const void*)pItem->zEName, pName); } } } @@ -2356,7 +2361,7 @@ int sqlite3ExprContainsSubquery(Expr *p){ ** in *pValue. If the expression is not an integer or if it is too big ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. */ -int sqlite3ExprIsInteger(Expr *p, int *pValue){ +int sqlite3ExprIsInteger(const Expr *p, int *pValue){ int rc = 0; if( NEVER(p==0) ) return 0; /* Used to only happen following on OOM */ @@ -2489,7 +2494,7 @@ int sqlite3IsRowid(const char *z){ ** table, then return NULL. */ #ifndef SQLITE_OMIT_SUBQUERY -static Select *isCandidateForInOpt(Expr *pX){ +static Select *isCandidateForInOpt(const Expr *pX){ Select *p; SrcList *pSrc; ExprList *pEList; @@ -2867,7 +2872,7 @@ int sqlite3FindInIndex( ** It is the responsibility of the caller to ensure that the returned ** string is eventually freed using sqlite3DbFree(). */ -static char *exprINAffinity(Parse *pParse, Expr *pExpr){ +static char *exprINAffinity(Parse *pParse, const Expr *pExpr){ Expr *pLeft = pExpr->pLeft; int nVal = sqlite3ExprVectorSize(pLeft); Select *pSelect = (pExpr->flags & EP_xIsSelect) ? pExpr->x.pSelect : 0; diff --git a/src/malloc.c b/src/malloc.c index b8a88f128c..932cecc210 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -316,7 +316,7 @@ void *sqlite3_malloc64(sqlite3_uint64 n){ ** TRUE if p is a lookaside memory allocation from db */ #ifndef SQLITE_OMIT_LOOKASIDE -static int isLookaside(sqlite3 *db, void *p){ +static int isLookaside(sqlite3 *db, const void *p){ return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd); } #else @@ -327,18 +327,18 @@ static int isLookaside(sqlite3 *db, void *p){ ** Return the size of a memory allocation previously obtained from ** sqlite3Malloc() or sqlite3_malloc(). */ -int sqlite3MallocSize(void *p){ +int sqlite3MallocSize(const void *p){ assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); - return sqlite3GlobalConfig.m.xSize(p); + return sqlite3GlobalConfig.m.xSize((void*)p); } -static int lookasideMallocSize(sqlite3 *db, void *p){ +static int lookasideMallocSize(sqlite3 *db, const void *p){ #ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE return plookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL; #else return db->lookaside.szTrue; #endif } -int sqlite3DbMallocSize(sqlite3 *db, void *p){ +int sqlite3DbMallocSize(sqlite3 *db, const void *p){ assert( p!=0 ); #ifdef SQLITE_DEBUG if( db==0 || !isLookaside(db,p) ){ @@ -365,7 +365,7 @@ int sqlite3DbMallocSize(sqlite3 *db, void *p){ } } } - return sqlite3GlobalConfig.m.xSize(p); + return sqlite3GlobalConfig.m.xSize((void*)p); } sqlite3_uint64 sqlite3_msize(void *p){ assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index dd19131fca..82f2803d61 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4242,8 +4242,8 @@ void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64); void *sqlite3DbRealloc(sqlite3 *, void *, u64); void sqlite3DbFree(sqlite3*, void*); void sqlite3DbFreeNN(sqlite3*, void*); -int sqlite3MallocSize(void*); -int sqlite3DbMallocSize(sqlite3*, void*); +int sqlite3MallocSize(const void*); +int sqlite3DbMallocSize(sqlite3*, const void*); void *sqlite3PageMalloc(int); void sqlite3PageFree(void*); void sqlite3MemSetDefault(void); @@ -4379,8 +4379,8 @@ Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*); void sqlite3PExprAddSelect(Parse*, Expr*, Select*); Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*); Expr *sqlite3ExprSimplifiedAndOr(Expr*); -Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*, int); -void sqlite3ExprFunctionUsable(Parse*,Expr*,FuncDef*); +Expr *sqlite3ExprFunction(Parse*,ExprList*, const Token*, int); +void sqlite3ExprFunctionUsable(Parse*,const Expr*,const FuncDef*); void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); void sqlite3ExprDelete(sqlite3*, Expr*); void sqlite3ExprDeferredDelete(Parse*, Expr*); @@ -4389,7 +4389,7 @@ ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); Select *sqlite3ExprListToValues(Parse*, int, ExprList*); void sqlite3ExprListSetSortOrder(ExprList*,int,int); -void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); +void sqlite3ExprListSetName(Parse*,ExprList*,const Token*,int); void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); void sqlite3ExprListDelete(sqlite3*, ExprList*); u32 sqlite3ExprListFlags(const ExprList*); @@ -4572,7 +4572,7 @@ void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); void sqlite3Vacuum(Parse*,Token*,Expr*); int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); -char *sqlite3NameFromToken(sqlite3*, Token*); +char *sqlite3NameFromToken(sqlite3*, const Token*); int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); int sqlite3ExprCompareSkip(Expr*, Expr*, int); int sqlite3ExprListCompare(ExprList*, ExprList*, int); @@ -4607,7 +4607,7 @@ int sqlite3ExprIsTableConstant(Expr*,int); #ifdef SQLITE_ENABLE_CURSOR_HINTS int sqlite3ExprContainsSubquery(Expr*); #endif -int sqlite3ExprIsInteger(Expr*, int*); +int sqlite3ExprIsInteger(const Expr*, int*); int sqlite3ExprCanBeNull(const Expr*); int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); int sqlite3IsRowid(const char*); @@ -4632,11 +4632,11 @@ void sqlite3MayAbort(Parse*); void sqlite3HaltConstraint(Parse*, int, int, char*, i8, u8); void sqlite3UniqueConstraint(Parse*, int, Index*); void sqlite3RowidConstraint(Parse*, int, Table*); -Expr *sqlite3ExprDup(sqlite3*,Expr*,int); -ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int); -SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int); -IdList *sqlite3IdListDup(sqlite3*,IdList*); -Select *sqlite3SelectDup(sqlite3*,Select*,int); +Expr *sqlite3ExprDup(sqlite3*,const Expr*,int); +ExprList *sqlite3ExprListDup(sqlite3*,const ExprList*,int); +SrcList *sqlite3SrcListDup(sqlite3*,const SrcList*,int); +IdList *sqlite3IdListDup(sqlite3*,const IdList*); +Select *sqlite3SelectDup(sqlite3*,const Select*,int); FuncDef *sqlite3FunctionSearch(int,const char*); void sqlite3InsertBuiltinFuncs(FuncDef*,int); FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); @@ -4774,7 +4774,7 @@ const char *sqlite3IndexAffinityStr(sqlite3*, Index*); void sqlite3TableAffinity(Vdbe*, Table*, int); char sqlite3CompareAffinity(const Expr *pExpr, char aff2); int sqlite3IndexAffinityOk(const Expr *pExpr, char idx_affinity); -char sqlite3TableColumnAffinity(Table*,int); +char sqlite3TableColumnAffinity(const Table*,int); char sqlite3ExprAffinity(const Expr *pExpr); int sqlite3Atoi64(const char*, i64*, int, u8); int sqlite3DecOrHexToI64(const char*, i64*); @@ -4803,8 +4803,8 @@ void sqlite3SetTextEncoding(sqlite3 *db, u8); CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr); CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, const Expr *pExpr); int sqlite3ExprCollSeqMatch(Parse*,const Expr*,const Expr*); -Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); -Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); +Expr *sqlite3ExprAddCollateToken(const Parse *pParse, Expr*, const Token*, int); +Expr *sqlite3ExprAddCollateString(const Parse*,Expr*,const char*); Expr *sqlite3ExprSkipCollate(Expr*); Expr *sqlite3ExprSkipCollateAndLikely(Expr*); int sqlite3CheckCollSeq(Parse *, CollSeq *); @@ -4887,9 +4887,9 @@ int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); void sqlite3ColumnDefault(Vdbe *, Table *, int, int); void sqlite3AlterFinishAddColumn(Parse *, Token *); void sqlite3AlterBeginAddColumn(Parse *, SrcList *); -void sqlite3AlterDropColumn(Parse*, SrcList*, Token*); -void *sqlite3RenameTokenMap(Parse*, void*, Token*); -void sqlite3RenameTokenRemap(Parse*, void *pTo, void *pFrom); +void sqlite3AlterDropColumn(Parse*, SrcList*, const Token*); +const void *sqlite3RenameTokenMap(Parse*, const void*, const Token*); +void sqlite3RenameTokenRemap(Parse*, const void *pTo, const void *pFrom); void sqlite3RenameExprUnmap(Parse*, Expr*); void sqlite3RenameExprlistUnmap(Parse*, ExprList*); CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); @@ -5164,7 +5164,7 @@ void sqlite3MemJournalOpen(sqlite3_file *); void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p); #if SQLITE_MAX_EXPR_DEPTH>0 - int sqlite3SelectExprHeight(Select *); + int sqlite3SelectExprHeight(const Select *); int sqlite3ExprCheckHeight(Parse*, int); #else #define sqlite3SelectExprHeight(x) 0 @@ -5261,8 +5261,8 @@ int sqlite3DbpageRegister(sqlite3*); int sqlite3DbstatRegister(sqlite3*); #endif -int sqlite3ExprVectorSize(Expr *pExpr); -int sqlite3ExprIsVector(Expr *pExpr); +int sqlite3ExprVectorSize(const Expr *pExpr); +int sqlite3ExprIsVector(const Expr *pExpr); Expr *sqlite3VectorFieldSubexpr(Expr*, int); Expr *sqlite3ExprForVectorField(Parse*,Expr*,int,int); void sqlite3VectorErrorMsg(Parse*, Expr*); From 84d90319e585173a50ac157d9404aee7d6261fe3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Sep 2021 19:57:32 +0000 Subject: [PATCH 096/130] Dbsqlfuzz (a097eaad43c3c845b236126df92fb49b25449b0c) found a way to reach the assert() that was added to sqlite3_declare_vtab() by [eb94f4a8174436b1]. This check-in fixes the problem. FossilOrigin-Name: 857d26a68cf439e9cba4f8a3b326c69366fc486a876b76835538709ee39b8713 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 8 +++++--- test/vtabK.test | 8 ++++++++ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index fbb0802075..725beb8467 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\slots\sof\snew\s"const"\son\sinternal\sfunction\sparameters.\s\sThere\sis\sopportunity\nfor\smany\smore\s-\sthis\sis\sa\swork\sin\sprogress. -D 2021-09-24T16:14:47.527 +C Dbsqlfuzz\s(a097eaad43c3c845b236126df92fb49b25449b0c)\sfound\sa\sway\sto\sreach\sthe\nassert()\sthat\swas\sadded\sto\ssqlite3_declare_vtab()\sby\s[eb94f4a8174436b1].\nThis\scheck-in\sfixes\sthe\sproblem. +D 2021-09-24T19:57:32.264 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927 F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 +F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd462 @@ -1709,7 +1709,7 @@ F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f F test/vtabJ.test a6aef49d558af90fae10565b29501f82a95781cb4f797f2d13e2d19f9b6bc77b -F test/vtabK.test b20e9ec57750a3e8adb4023510edc72f1880f18f0914bbc1f116a31cf6563a9f +F test/vtabK.test d769aa2689999f510045c219ec45dc8db5266a9b3932bf47d49e1065e4261b69 F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad @@ -1926,7 +1926,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 eb94f4a8174436b1f0deed0a43618a20018387bb815be658314ca6b454c446fb -R db077a8e62b070323fd372dd7e91140d +P a3c71a673ddd1c299bdae550fb955077b77088329a8ca2895dfb23538b524a8e +R 18e1aa2d4fa26b1304d3b0868495907e U drh -Z 4395f669ee70fc34c56697d082f33420 +Z c6e51dd68933de6b823f0292e322691d diff --git a/manifest.uuid b/manifest.uuid index ce098267d0..d21970fbc5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a3c71a673ddd1c299bdae550fb955077b77088329a8ca2895dfb23538b524a8e \ No newline at end of file +857d26a68cf439e9cba4f8a3b326c69366fc486a876b76835538709ee39b8713 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 3c1311417b..f5065e1167 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1119,9 +1119,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_PartIdx ); testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); - sqlite3ResolveNotValid(pParse, pNC, "subqueries", - NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr); - sqlite3WalkSelect(pWalker, pExpr->x.pSelect); + if( pNC->ncFlags & NC_SelfRef ){ + notValidImpl(pParse, pNC, "subqueries", pExpr); + }else{ + sqlite3WalkSelect(pWalker, pExpr->x.pSelect); + } assert( pNC->nRef>=nRef ); if( nRef!=pNC->nRef ){ ExprSetProperty(pExpr, EP_VarSelect); diff --git a/test/vtabK.test b/test/vtabK.test index 1731c9ca44..dc91687a8a 100644 --- a/test/vtabK.test +++ b/test/vtabK.test @@ -71,5 +71,13 @@ do_catchsql_test 210 { do_execsql_test 220 { SELECT * FROM t1; } {Ebed-malech} + +# Follow-on dbsqlfuzz a097eaad43c3c845b236126df92fb49b25449b0c +reset_db +do_catchsql_test 300 { + CREATE VIRTUAL TABLE t1 USING rtree(a,b,c); + CREATE TABLE t2(x); + ALTER TABLE t2 ADD d GENERATED ALWAYS AS (c IN (SELECT 1 FROM t1)) VIRTUAL; +} {1 {error in table t2 after rename: subqueries prohibited in generated columns}} finish_test From 1580d50b7657a8e97550f2ad8d162c937a28897e Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 25 Sep 2021 17:07:57 +0000 Subject: [PATCH 097/130] Add const to parameters on various internal interfaces. FossilOrigin-Name: 70c221c5cf7b4d9ed34f16d045f262f99d16aa3db84f80cf0b03ee82ba28d075 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 30 ++++++++++++++++++++++-------- src/sqliteInt.h | 12 ++++++------ src/vdbemem.c | 6 +++--- src/window.c | 7 ++++++- 6 files changed, 47 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index 725beb8467..bf7a40bbec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Dbsqlfuzz\s(a097eaad43c3c845b236126df92fb49b25449b0c)\sfound\sa\sway\sto\sreach\sthe\nassert()\sthat\swas\sadded\sto\ssqlite3_declare_vtab()\sby\s[eb94f4a8174436b1].\nThis\scheck-in\sfixes\sthe\sproblem. -D 2021-09-24T19:57:32.264 +C Add\sconst\sto\sparameters\son\svarious\sinternal\sinterfaces. +D 2021-09-25T17:07:57.340 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c 5316aff6218b871550e1a84c76f3343dabd0f1096ec29ad26f14e85c2ccd701e +F src/expr.c 38597afb008db2e0a5f86a82827567acb98f502cab61663ef16bc688bc256803 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1 @@ -552,7 +552,7 @@ F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd46 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 8e88176d15baa0d36b6401042c8b301e9ad28fb34e43a29c0c44001e5a325e94 +F src/sqliteInt.h 06a8f97a644388b28c0a9428a6b2cdf40e8b51b1cf38064f41baba5fd810be49 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -625,7 +625,7 @@ F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 F src/vdbeaux.c 2368a8888f17368d4040a05966f7d2a2276cac4eeeba50793828186d999e3c8f F src/vdbeblob.c 60a7694760e35b2bba166cf49eb6a1eb0b31581102b49de78008ca3032406065 -F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 +F src/vdbemem.c 0e830c2aab24241eed85bd4c8a5bd8c9b959081316477440bfffb35089ba7d0b F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -638,7 +638,7 @@ F src/where.c da3981a12e9eb5a71d32bab60ac1957fd4aa337aaea07ca8019b01f8788f442a F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 -F src/window.c a5417de85a13e1f47bfb33c0bae5ae0ded5d68b146f4986c3d89d10a04f2c262 +F src/window.c f27e34e896f84e0bedec32b027d4531f224971ce3e16f8e1d97a968875ddcec1 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 @@ -1926,7 +1926,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 a3c71a673ddd1c299bdae550fb955077b77088329a8ca2895dfb23538b524a8e -R 18e1aa2d4fa26b1304d3b0868495907e +P 857d26a68cf439e9cba4f8a3b326c69366fc486a876b76835538709ee39b8713 +R c04d6e91d6992a17a9e5f2b79f3ffd3e U drh -Z c6e51dd68933de6b823f0292e322691d +Z f7f3c0d8bcac3b88e76c7be60e7a4c19 diff --git a/manifest.uuid b/manifest.uuid index d21970fbc5..6f6363c759 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -857d26a68cf439e9cba4f8a3b326c69366fc486a876b76835538709ee39b8713 \ No newline at end of file +70c221c5cf7b4d9ed34f16d045f262f99d16aa3db84f80cf0b03ee82ba28d075 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 09fe66b7f6..baa1fce3dc 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5329,7 +5329,11 @@ void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ ** Otherwise, if the values are not the same or if pExpr is not a simple ** SQL value, zero is returned. */ -static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){ +static int exprCompareVariable( + const Parse *pParse, + const Expr *pVar, + const Expr *pExpr +){ int res = 0; int iVar; sqlite3_value *pL, *pR = 0; @@ -5381,7 +5385,12 @@ static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){ ** Argument pParse should normally be NULL. If it is not NULL and pA or ** pB causes a return value of 2. */ -int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ +int sqlite3ExprCompare( + const Parse *pParse, + const Expr *pA, + const Expr *pB, + int iTab +){ u32 combinedFlags; if( pA==0 || pB==0 ){ return pB==pA ? 0 : 2; @@ -5465,7 +5474,7 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ ** Two NULL pointers are considered to be the same. But a NULL pointer ** always differs from a non-NULL pointer. */ -int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ +int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB, int iTab){ int i; if( pA==0 && pB==0 ) return 0; if( pA==0 || pB==0 ) return 1; @@ -5484,7 +5493,7 @@ int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ ** Like sqlite3ExprCompare() except COLLATE operators at the top-level ** are ignored. */ -int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ +int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){ return sqlite3ExprCompare(0, sqlite3ExprSkipCollateAndLikely(pA), sqlite3ExprSkipCollateAndLikely(pB), @@ -5498,9 +5507,9 @@ int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ ** non-NULL if pNN is not NULL */ static int exprImpliesNotNull( - Parse *pParse, /* Parsing context */ - Expr *p, /* The expression to be checked */ - Expr *pNN, /* The expression that is NOT NULL */ + const Parse *pParse,/* Parsing context */ + const Expr *p, /* The expression to be checked */ + const Expr *pNN, /* The expression that is NOT NULL */ int iTab, /* Table being evaluated */ int seenNot /* Return true only if p can be any non-NULL value */ ){ @@ -5593,7 +5602,12 @@ static int exprImpliesNotNull( ** improvement. Returning false might cause a performance reduction, but ** it will always give the correct answer and is hence always safe. */ -int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, int iTab){ +int sqlite3ExprImpliesExpr( + const Parse *pParse, + const Expr *pE1, + const Expr *pE2, + int iTab +){ if( sqlite3ExprCompare(pParse, pE1, pE2, iTab)==0 ){ return 1; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 82f2803d61..21682fa113 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4110,7 +4110,7 @@ void sqlite3WindowListDelete(sqlite3 *db, Window *p); 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); +int sqlite3WindowCompare(const Parse*, const Window*, const Window*, int); void sqlite3WindowCodeInit(Parse*, Select*); void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); int sqlite3WindowRewrite(Parse*, Select*); @@ -4573,10 +4573,10 @@ void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); void sqlite3Vacuum(Parse*,Token*,Expr*); int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); char *sqlite3NameFromToken(sqlite3*, const Token*); -int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); -int sqlite3ExprCompareSkip(Expr*, Expr*, int); -int sqlite3ExprListCompare(ExprList*, ExprList*, int); -int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int); +int sqlite3ExprCompare(const Parse*,const Expr*,const Expr*, int); +int sqlite3ExprCompareSkip(Expr*,Expr*,int); +int sqlite3ExprListCompare(const ExprList*,const ExprList*, int); +int sqlite3ExprImpliesExpr(const Parse*,const Expr*,const Expr*, int); int sqlite3ExprImpliesNonNullRow(Expr*,int); void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*); void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); @@ -4835,7 +4835,7 @@ sqlite3_value *sqlite3ValueNew(sqlite3 *); #ifndef SQLITE_OMIT_UTF16 char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); #endif -int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **); +int sqlite3ValueFromExpr(sqlite3 *, const Expr *, u8, u8, sqlite3_value **); void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8); #ifndef SQLITE_AMALGAMATION extern const unsigned char sqlite3OpcodeProperty[]; diff --git a/src/vdbemem.c b/src/vdbemem.c index dc177161b4..e67cd64124 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1388,7 +1388,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ #ifdef SQLITE_ENABLE_STAT4 static int valueFromFunction( sqlite3 *db, /* The database connection */ - Expr *p, /* The expression to evaluate */ + const Expr *p, /* The expression to evaluate */ u8 enc, /* Encoding to use */ u8 aff, /* Affinity to use */ sqlite3_value **ppVal, /* Write the new value here */ @@ -1482,7 +1482,7 @@ static int valueFromFunction( */ static int valueFromExpr( sqlite3 *db, /* The database connection */ - Expr *pExpr, /* The expression to evaluate */ + const Expr *pExpr, /* The expression to evaluate */ u8 enc, /* Encoding to use */ u8 affinity, /* Affinity to use */ sqlite3_value **ppVal, /* Write the new value here */ @@ -1637,7 +1637,7 @@ no_mem: */ int sqlite3ValueFromExpr( sqlite3 *db, /* The database connection */ - Expr *pExpr, /* The expression to evaluate */ + const Expr *pExpr, /* The expression to evaluate */ u8 enc, /* Encoding to use */ u8 affinity, /* Affinity to use */ sqlite3_value **ppVal /* Write the new value here */ diff --git a/src/window.c b/src/window.c index 423ad2db8a..ba0e14e00d 100644 --- a/src/window.c +++ b/src/window.c @@ -1345,7 +1345,12 @@ void sqlite3WindowLink(Select *pSel, Window *pWin){ ** different, or 2 if it cannot be determined if the objects are identical ** or not. Identical window objects can be processed in a single scan. */ -int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ +int sqlite3WindowCompare( + const Parse *pParse, + const Window *p1, + const Window *p2, + int bFilter +){ int res; if( NEVER(p1==0) || NEVER(p2==0) ) return 1; if( p1->eFrmType!=p2->eFrmType ) return 1; From c28cc32d81ff93b6c8da8f8d5e507346101d2146 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 25 Sep 2021 18:21:01 +0000 Subject: [PATCH 098/130] Fix a bad interaction between the pager cache and the dbstat module that could lead to a malfunction following an OOM. dbsqlfuzz 9ed3e4e3816219d3509d711636c38542bf3f40b1. FossilOrigin-Name: e03554a6a8c33d820922edccf605a2ce92055315bf22e464207ea8c0d81e3dd6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/dbstat.c | 6 +++++- test/statfault.test | 10 ++++++++++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index bf7a40bbec..44ae112936 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sconst\sto\sparameters\son\svarious\sinternal\sinterfaces. -D 2021-09-25T17:07:57.340 +C Fix\sa\sbad\sinteraction\sbetween\sthe\spager\scache\sand\sthe\sdbstat\smodule\sthat\scould\slead\sto\sa\smalfunction\sfollowing\san\sOOM.\sdbsqlfuzz\s9ed3e4e3816219d3509d711636c38542bf3f40b1. +D 2021-09-25T18:21:01.895 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a -F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c +F src/dbstat.c 14d9098266fa712472bed757986eee70eb3613e9ba6e55bddac6708acf8d2857 F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c 38597afb008db2e0a5f86a82827567acb98f502cab61663ef16bc688bc256803 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 @@ -1425,7 +1425,7 @@ F test/sqllimits1.test 3f9030e5d35375ad3b912b4908094aa806335c8e9d804b8ffff70c5e9 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a F test/startup.c 1beb5ca66fcc0fce95c3444db9d1674f90fc605499a574ae2434dcfc10d22805 F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c5 -F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 +F test/statfault.test 55f86055f9cd7b2d962a621b8a04215c1cebd4eaaecde92d279442327fe648a0 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 F test/strict1.test ac29180be09313af1d5086420e8b7a832f9bf777653c4cbc64d7fd478000b3f0 @@ -1926,7 +1926,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 857d26a68cf439e9cba4f8a3b326c69366fc486a876b76835538709ee39b8713 -R c04d6e91d6992a17a9e5f2b79f3ffd3e -U drh -Z f7f3c0d8bcac3b88e76c7be60e7a4c19 +P 70c221c5cf7b4d9ed34f16d045f262f99d16aa3db84f80cf0b03ee82ba28d075 +R ea98ed9a89a0731001a69934bf5f6de0 +U dan +Z 049319a646210861af4489763ecd7530 diff --git a/manifest.uuid b/manifest.uuid index 6f6363c759..9d24bd23da 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -70c221c5cf7b4d9ed34f16d045f262f99d16aa3db84f80cf0b03ee82ba28d075 \ No newline at end of file +e03554a6a8c33d820922edccf605a2ce92055315bf22e464207ea8c0d81e3dd6 \ No newline at end of file diff --git a/src/dbstat.c b/src/dbstat.c index 78173c3976..5e75df15a6 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -314,10 +314,14 @@ static void statClearPage(StatPage *p){ static void statResetCsr(StatCursor *pCsr){ int i; - sqlite3_reset(pCsr->pStmt); + /* In some circumstances, specifically if an OOM has occurred, the call + ** to sqlite3_reset() may cause the pager to be reset (emptied). It is + ** important that statClearPage() is called to free any page refs before + ** this happens. dbsqlfuzz 9ed3e4e3816219d3509d711636c38542bf3f40b1. */ for(i=0; iaPage); i++){ statClearPage(&pCsr->aPage[i]); } + sqlite3_reset(pCsr->pStmt); pCsr->iPage = 0; sqlite3_free(pCsr->zPath); pCsr->zPath = 0; diff --git a/test/statfault.test b/test/statfault.test index ce79e328d8..b5980d417d 100644 --- a/test/statfault.test +++ b/test/statfault.test @@ -41,5 +41,15 @@ do_faultsim_test 1 -faults * -prep { faultsim_test_result {0 8} } +do_faultsim_test 2 -faults * -prep { + faultsim_restore_and_reopen + register_dbstat_vtab db + execsql { SELECT 1 FROM sqlite_master LIMIT 1 } +} -body { + db eval { SELECT * FROM sss } { db eval { SELECT randomblob(5000) } } +} -test { + faultsim_test_result {0 {}} +} finish_test + From 4b67c655af4340bd0d164b54899c7a2ef3f79a33 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 25 Sep 2021 20:19:16 +0000 Subject: [PATCH 099/130] Fix a memory leak in rtree triggered by corrupt database records. dbsqlfuzz 397ad036a9013d7318da30ef84947d2baaaa6d6c. FossilOrigin-Name: 706322c2b5bb31e14c1120a94520b21fa623ff119e3890170e36b37d8bde721a --- ext/rtree/rtree.c | 4 ++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 3dc0a6602a..47905c3d8c 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2545,6 +2545,10 @@ static int updateMapping( xSetMapping = ((iHeight==0)?rowidWrite:parentWrite); if( iHeight>0 ){ RtreeNode *pChild = nodeHashLookup(pRtree, iRowid); + RtreeNode *p; + for(p=pNode; p; p=p->pParent){ + if( p==pChild ) return SQLITE_CORRUPT_VTAB; + } if( pChild ){ nodeRelease(pRtree, pChild->pParent); nodeReference(pNode); diff --git a/manifest b/manifest index 44ae112936..4aca477058 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbad\sinteraction\sbetween\sthe\spager\scache\sand\sthe\sdbstat\smodule\sthat\scould\slead\sto\sa\smalfunction\sfollowing\san\sOOM.\sdbsqlfuzz\s9ed3e4e3816219d3509d711636c38542bf3f40b1. -D 2021-09-25T18:21:01.895 +C Fix\sa\smemory\sleak\sin\srtree\striggered\sby\scorrupt\sdatabase\srecords.\sdbsqlfuzz\s397ad036a9013d7318da30ef84947d2baaaa6d6c. +D 2021-09-25T20:19:16.641 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,7 +393,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 98d45533989e908bf65b43f36ff6eaad95a9ffe6f3b6b8658fbd47d45c58b10b -F ext/rtree/rtree.c e3b689c6a2622c572775f26149c4c30bc4cc9e7ddc19810cbaef7f76032b0475 +F ext/rtree/rtree.c 03b238f2134bac3cffeffa03f70cac3b23c9329ab865a73bb0242bfd2f19daf8 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1926,7 +1926,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 70c221c5cf7b4d9ed34f16d045f262f99d16aa3db84f80cf0b03ee82ba28d075 -R ea98ed9a89a0731001a69934bf5f6de0 +P e03554a6a8c33d820922edccf605a2ce92055315bf22e464207ea8c0d81e3dd6 +R e10289212fa6f853fbfe056d086db189 U dan -Z 049319a646210861af4489763ecd7530 +Z 57a6cc5f806335fb018e364d503abadc diff --git a/manifest.uuid b/manifest.uuid index 9d24bd23da..bf20cd553d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e03554a6a8c33d820922edccf605a2ce92055315bf22e464207ea8c0d81e3dd6 \ No newline at end of file +706322c2b5bb31e14c1120a94520b21fa623ff119e3890170e36b37d8bde721a \ No newline at end of file From 76ec55fddba94ea2c97d6f59b6c2417209a23079 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 25 Sep 2021 20:28:39 +0000 Subject: [PATCH 100/130] Load recent dbsqlfuzz cases into test/fuzzdata8.db. FossilOrigin-Name: 7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2635776 -> 2671616 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4aca477058..fdeb8b705e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\srtree\striggered\sby\scorrupt\sdatabase\srecords.\sdbsqlfuzz\s397ad036a9013d7318da30ef84947d2baaaa6d6c. -D 2021-09-25T20:19:16.641 +C Load\srecent\sdbsqlfuzz\scases\sinto\stest/fuzzdata8.db. +D 2021-09-25T20:28:39.895 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1060,7 +1060,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 82a92571f1ce534a7b5edd547ec3dc52ed63ed52343ffbae0c384c9c0a8a83d9 +F test/fuzzdata8.db 6e5fc4979d39b1d93371190202eb19d023c4671edaff205842024a632e3ecc58 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1926,7 +1926,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 e03554a6a8c33d820922edccf605a2ce92055315bf22e464207ea8c0d81e3dd6 -R e10289212fa6f853fbfe056d086db189 -U dan -Z 57a6cc5f806335fb018e364d503abadc +P 706322c2b5bb31e14c1120a94520b21fa623ff119e3890170e36b37d8bde721a +R 29fc8916ca6b5a432d2826152a802182 +U drh +Z 2df13617e37950dc266054e33266713a diff --git a/manifest.uuid b/manifest.uuid index bf20cd553d..57f5790ed6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -706322c2b5bb31e14c1120a94520b21fa623ff119e3890170e36b37d8bde721a \ No newline at end of file +7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 641a1128ab71590d9e5dbb11d8709881ab46f328..272bc5c8bd43afe43d71e8fe605dfd2e0f511248 100644 GIT binary patch delta 53466 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 delta 50120 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 From 5a69d19eea897dd597f48ad994c2cbdfd7052687 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 27 Sep 2021 15:44:03 +0000 Subject: [PATCH 101/130] Fix a problem in ALTER TABLE causing table or column references in sub-selects ton the RHS of a vector SET clause in an UPDATE within a trigger (i.e. "SET (a,b) = ( (SELECT...), )"). FossilOrigin-Name: 255b0eeed113d83b474efc5bc8fc790a270bc43ee598df4b2c378e1ad2d729b7 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/alter.c | 1 + src/expr.c | 5 ++++- test/altermalloc3.test | 31 +++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index fdeb8b705e..69d7db3f50 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Load\srecent\sdbsqlfuzz\scases\sinto\stest/fuzzdata8.db. -D 2021-09-25T20:28:39.895 +C Fix\sa\sproblem\sin\sALTER\sTABLE\scausing\stable\sor\scolumn\sreferences\sin\ssub-selects\ston\sthe\sRHS\sof\sa\svector\sSET\sclause\sin\san\sUPDATE\swithin\sa\strigger\s(i.e.\s"SET\s(a,b)\s=\s(\s(SELECT...),\s\s)"). +D 2021-09-27T15:44:03.909 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -481,7 +481,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c a279ff8e6e079dcec20eb736d6399229f4b495f01e6da26052467c9963ead595 +F src/alter.c 7f31a2524b2597d60c723ea420fc3789d390f5d35cb01dfedf2e4c24e0f250f0 F src/analyze.c 989eb1146f4a2c320623e190f8913bf1829fd8954a52dbfd0f792efc69db0e66 F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -499,7 +499,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 14d9098266fa712472bed757986eee70eb3613e9ba6e55bddac6708acf8d2857 F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c 38597afb008db2e0a5f86a82827567acb98f502cab61663ef16bc688bc256803 +F src/expr.c f2e0f5dd07d1b202f700f26b0851f2ea485e36ec8f335b05aec2cd91cd08853f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1 @@ -659,7 +659,7 @@ F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a54328 F test/alterlegacy.test f38c6d06cda39e1f7b955bbce57f2e3ef5b7cb566d3d1234502093e228c15811 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test ca3ebc01670d9313953a2b7628d8cc00dc5ea9988f229b3cbbbe1cca506dae45 -F test/altermalloc3.test 059841a3de6b6780efd9f0b30bf1d9b4443c555f68d39975cbcac2583167b239 +F test/altermalloc3.test 4660ac6240a8c82ba3947b927612dcc7c05a8eec3fe3c9f38e047ca69a789a33 F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 F test/altertab.test a13e11cb1933575002367613b1094f0eeb31f493e4bd9ebeca73279fe00c85e7 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b @@ -1926,7 +1926,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 706322c2b5bb31e14c1120a94520b21fa623ff119e3890170e36b37d8bde721a -R 29fc8916ca6b5a432d2826152a802182 -U drh -Z 2df13617e37950dc266054e33266713a +P 7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b +R 2a9beef8a41074983f454ce08ecf7909 +U dan +Z 371a9c0c029e52ab1de450a489c6939c diff --git a/manifest.uuid b/manifest.uuid index 57f5790ed6..5cc7f042d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b \ No newline at end of file +255b0eeed113d83b474efc5bc8fc790a270bc43ee598df4b2c378e1ad2d729b7 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 8fc9b10968..f358dcb0a5 100644 --- a/src/alter.c +++ b/src/alter.c @@ -831,6 +831,7 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; if( pCopy ) sqlite3SelectPrep(sNC.pParse, p, &sNC); + if( sNC.pParse->db->mallocFailed ) return; sqlite3WalkSelect(pWalker, p); sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); } diff --git a/src/expr.c b/src/expr.c index baa1fce3dc..5b7a58fb55 100644 --- a/src/expr.c +++ b/src/expr.c @@ -518,7 +518,10 @@ Expr *sqlite3ExprForVectorField( }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); - sqlite3RenameTokenRemap(pParse, pRet, pVector); + if( IN_RENAME_OBJECT && pRet ){ + SWAP(Expr, *pRet, *pVector); + sqlite3RenameTokenRemap(pParse, pRet, pVector); + } } return pRet; } diff --git a/test/altermalloc3.test b/test/altermalloc3.test index 5e4e75149d..4c10f48fed 100644 --- a/test/altermalloc3.test +++ b/test/altermalloc3.test @@ -43,5 +43,36 @@ do_faultsim_test 1 -prep { faultsim_test_result {0 {}} } +#------------------------------------------------------------------------- +# dbsqlfuzz e3dd84cda3848016a6a6024c7249d09bc2ef2615 +# +reset_db +do_execsql_test 2.0 { + CREATE TABLE t2(k,v); + CREATE TRIGGER r2 AFTER INSERT ON t2 BEGIN + UPDATE t2 SET (k,v)= ( + (WITH cte1(a) AS ( SELECT 1 FROM ( SELECT * FROM t2 ) ) + SELECT a FROM cte1 + ), 1); + END; +} + +faultsim_save_and_close +faultsim_restore_and_reopen + +do_execsql_test 2.1 { + ALTER TABLE t2 RENAME TO t2x; +} + +do_faultsim_test 2.2 -prep { + faultsim_restore_and_reopen + db eval { SELECT * FROM sqlite_master } +} -body { + execsql { + ALTER TABLE t2 RENAME TO t2x; + } +} -test { + faultsim_test_result {0 {}} +} finish_test From 6bcaba70ac3cbc7c93c24bb2b50631a0f4af67cc Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 27 Sep 2021 17:11:20 +0000 Subject: [PATCH 102/130] Have the dbstat virtual table take a copy of each page buffer that it traverses instead of just a reference to the page-cache object. This avoids problems if an error causes transaction rollback while a dbstat cursor is open. dbsqlfuzz crash-417224040fee04f0f0e62b70265c518893b08769. FossilOrigin-Name: 6ab25f8bd52d6412a9600143de364f6d8ad8e2c835315fafca6f54d5f38a49dc --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/dbstat.c | 53 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 69d7db3f50..2728a3e727 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sALTER\sTABLE\scausing\stable\sor\scolumn\sreferences\sin\ssub-selects\ston\sthe\sRHS\sof\sa\svector\sSET\sclause\sin\san\sUPDATE\swithin\sa\strigger\s(i.e.\s"SET\s(a,b)\s=\s(\s(SELECT...),\s\s)"). -D 2021-09-27T15:44:03.909 +C Have\sthe\sdbstat\svirtual\stable\stake\sa\scopy\sof\seach\spage\sbuffer\sthat\sit\straverses\sinstead\sof\sjust\sa\sreference\sto\sthe\spage-cache\sobject.\sThis\savoids\sproblems\sif\san\serror\scauses\stransaction\srollback\swhile\sa\sdbstat\scursor\sis\sopen.\sdbsqlfuzz\scrash-417224040fee04f0f0e62b70265c518893b08769. +D 2021-09-27T17:11:20.381 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -497,7 +497,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a -F src/dbstat.c 14d9098266fa712472bed757986eee70eb3613e9ba6e55bddac6708acf8d2857 +F src/dbstat.c bea044cfe99eab6c527837e196a5335c128989bdb354cf1b4973b85ea561d66b F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c f2e0f5dd07d1b202f700f26b0851f2ea485e36ec8f335b05aec2cd91cd08853f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 @@ -1926,7 +1926,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 7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b -R 2a9beef8a41074983f454ce08ecf7909 +P 255b0eeed113d83b474efc5bc8fc790a270bc43ee598df4b2c378e1ad2d729b7 +R 547ad4e37246025cb31145d1566b52e1 U dan -Z 371a9c0c029e52ab1de450a489c6939c +Z e0b0decb4370dc0c0faf674ef290b1f7 diff --git a/manifest.uuid b/manifest.uuid index 5cc7f042d6..5f8ca48f47 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -255b0eeed113d83b474efc5bc8fc790a270bc43ee598df4b2c378e1ad2d729b7 \ No newline at end of file +6ab25f8bd52d6412a9600143de364f6d8ad8e2c835315fafca6f54d5f38a49dc \ No newline at end of file diff --git a/src/dbstat.c b/src/dbstat.c index 5e75df15a6..33f9ea8f75 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -92,9 +92,8 @@ struct StatCell { /* Size information for a single btree page */ struct StatPage { u32 iPgno; /* Page number */ - DbPage *pPg; /* Page content */ + u8 *aPg; /* Page buffer from sqlite3_malloc() */ int iCell; /* Current cell */ - char *zPath; /* Path to this page */ /* Variables populated by statDecodePage(): */ @@ -306,10 +305,11 @@ static void statClearCells(StatPage *p){ } static void statClearPage(StatPage *p){ + u8 *aPg = p->aPg; statClearCells(p); - sqlite3PagerUnref(p->pPg); sqlite3_free(p->zPath); memset(p, 0, sizeof(StatPage)); + p->aPg = aPg; } static void statResetCsr(StatCursor *pCsr){ @@ -320,6 +320,8 @@ static void statResetCsr(StatCursor *pCsr){ ** this happens. dbsqlfuzz 9ed3e4e3816219d3509d711636c38542bf3f40b1. */ for(i=0; iaPage); i++){ statClearPage(&pCsr->aPage[i]); + sqlite3_free(pCsr->aPage[i].aPg); + pCsr->aPage[i].aPg = 0; } sqlite3_reset(pCsr->pStmt); pCsr->iPage = 0; @@ -386,7 +388,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){ int isLeaf; int szPage; - u8 *aData = sqlite3PagerGetData(p->pPg); + u8 *aData = p->aPg; u8 *aHdr = &aData[p->iPgno==1 ? 100 : 0]; p->flags = aHdr[0]; @@ -516,6 +518,37 @@ static void statSizeAndOffset(StatCursor *pCsr){ } } +/* +** Load a copy of the page data for page iPg into the buffer belonging +** to page object pPg. Allocate the buffer if necessary. Return SQLITE_OK +** if successful, or an SQLite error code otherwise. +*/ +static int statGetPage( + Btree *pBt, /* Load page from this b-tree */ + u32 iPg, /* Page number to load */ + StatPage *pPg /* Load page into this object */ +){ + int pgsz = sqlite3BtreeGetPageSize(pBt); + DbPage *pDbPage = 0; + int rc; + + if( pPg->aPg==0 ){ + pPg->aPg = (u8*)sqlite3_malloc(pgsz); + if( pPg->aPg==0 ){ + return SQLITE_NOMEM_BKPT; + } + } + + rc = sqlite3PagerGet(sqlite3BtreePager(pBt), iPg, &pDbPage, 0); + if( rc==SQLITE_OK ){ + const u8 *a = sqlite3PagerGetData(pDbPage); + memcpy(pPg->aPg, a, pgsz); + sqlite3PagerUnref(pDbPage); + } + + return rc; +} + /* ** Move a DBSTAT cursor to the next entry. Normally, the next ** entry will be the next page, but in aggregated mode (pCsr->isAgg!=0), @@ -534,7 +567,7 @@ static int statNext(sqlite3_vtab_cursor *pCursor){ pCsr->zPath = 0; statNextRestart: - if( pCsr->aPage[0].pPg==0 ){ + if( pCsr->iPage<0 ){ /* Start measuring space on the next btree */ statResetCounts(pCsr); rc = sqlite3_step(pCsr->pStmt); @@ -546,7 +579,7 @@ statNextRestart: pCsr->isEof = 1; return sqlite3_reset(pCsr->pStmt); } - rc = sqlite3PagerGet(pPager, iRoot, &pCsr->aPage[0].pPg, 0); + rc = statGetPage(pBt, iRoot, &pCsr->aPage[0]); pCsr->aPage[0].iPgno = iRoot; pCsr->aPage[0].iCell = 0; if( !pCsr->isAgg ){ @@ -597,9 +630,8 @@ statNextRestart: if( !p->iRightChildPg || p->iCell>p->nCell ){ statClearPage(p); - if( pCsr->iPage>0 ){ - pCsr->iPage--; - }else if( pCsr->isAgg ){ + pCsr->iPage--; + if( pCsr->isAgg && pCsr->iPage<0 ){ /* label-statNext-done: When computing aggregate space usage over ** an entire btree, this is the exit point from this function */ return SQLITE_OK; @@ -618,7 +650,7 @@ statNextRestart: }else{ p[1].iPgno = p->aCell[p->iCell].iChildPg; } - rc = sqlite3PagerGet(pPager, p[1].iPgno, &p[1].pPg, 0); + rc = statGetPage(pBt, p[1].iPgno, &p[1]); pCsr->nPage++; p[1].iCell = 0; if( !pCsr->isAgg ){ @@ -748,6 +780,7 @@ static int statFilter( } if( rc==SQLITE_OK ){ + pCsr->iPage = -1; rc = statNext(pCursor); } return rc; From a7f7c1c4af48443a8d11c862c71201b051eaa1bc Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 28 Sep 2021 10:44:54 +0000 Subject: [PATCH 103/130] Fix a potential ALTER TABLE problem with expressions like ( () IN () ). FossilOrigin-Name: df0d7e36dbf98ab5405d8366ce92fb85176d4388b47a57b0ca1aa1ba6ae5212e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 1 + test/altertab3.test | 26 ++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2728a3e727..02f493c401 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sthe\sdbstat\svirtual\stable\stake\sa\scopy\sof\seach\spage\sbuffer\sthat\sit\straverses\sinstead\sof\sjust\sa\sreference\sto\sthe\spage-cache\sobject.\sThis\savoids\sproblems\sif\san\serror\scauses\stransaction\srollback\swhile\sa\sdbstat\scursor\sis\sopen.\sdbsqlfuzz\scrash-417224040fee04f0f0e62b70265c518893b08769. -D 2021-09-27T17:11:20.381 +C Fix\sa\spotential\sALTER\sTABLE\sproblem\swith\sexpressions\slike\s(\s()\sIN\s()\s). +D 2021-09-28T10:44:54.441 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -481,7 +481,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 7f31a2524b2597d60c723ea420fc3789d390f5d35cb01dfedf2e4c24e0f250f0 +F src/alter.c ad192981c345625621048ae1145ac7fc94b39912c44940e458f439627aa18137 F src/analyze.c 989eb1146f4a2c320623e190f8913bf1829fd8954a52dbfd0f792efc69db0e66 F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -663,7 +663,7 @@ F test/altermalloc3.test 4660ac6240a8c82ba3947b927612dcc7c05a8eec3fe3c9f38e047ca F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 F test/altertab.test a13e11cb1933575002367613b1094f0eeb31f493e4bd9ebeca73279fe00c85e7 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b -F test/altertab3.test 2b82fa2236a3a91553d53ae5555d8e723c7eec174c41f1fa62ff497355398479 +F test/altertab3.test 9a8aad735c48440c05787b4ab5ac821340a72c6febd1ff8bf74e065fb75882b2 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 4440c4932247adb2b4e0c838f657c19dc7af4f56859255436dc4e855f39b9324 @@ -1926,7 +1926,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 255b0eeed113d83b474efc5bc8fc790a270bc43ee598df4b2c378e1ad2d729b7 -R 547ad4e37246025cb31145d1566b52e1 +P 6ab25f8bd52d6412a9600143de364f6d8ad8e2c835315fafca6f54d5f38a49dc +R 0b0aa479205f98d487986e0312e156bf U dan -Z e0b0decb4370dc0c0faf674ef290b1f7 +Z c883b6c925a98c67ff212863f29958e5 diff --git a/manifest.uuid b/manifest.uuid index 5f8ca48f47..6cb2d24b62 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ab25f8bd52d6412a9600143de364f6d8ad8e2c835315fafca6f54d5f38a49dc \ No newline at end of file +df0d7e36dbf98ab5405d8366ce92fb85176d4388b47a57b0ca1aa1ba6ae5212e \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index f358dcb0a5..9cdc342ee1 100644 --- a/src/alter.c +++ b/src/alter.c @@ -802,6 +802,7 @@ void sqlite3RenameTokenRemap(Parse *pParse, const void *pTo, const void *pFrom){ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ Parse *pParse = pWalker->pParse; sqlite3RenameTokenRemap(pParse, 0, (const void*)pExpr); + sqlite3RenameTokenRemap(pParse, 0, (const void*)&pExpr->y.pTab); return WRC_Continue; } diff --git a/test/altertab3.test b/test/altertab3.test index 1823b21edf..db38d76dd1 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -648,4 +648,30 @@ do_catchsql_test 26.6 { } {1 {error in trigger xx: ambiguous column name: xx}} +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 27.1 { + CREATE TABLE t1(a, b AS ((WITH w1 (xyz) AS ( SELECT t1.b FROM t1 ) SELECT 123) IN ()), c); +} + +do_execsql_test 27.2 { + ALTER TABLE t1 DROP COLUMN c; + SELECT sql FROM sqlite_schema WHERE name = 't1'; +} { + {CREATE TABLE t1(a, b AS ((WITH w1 (xyz) AS ( SELECT t1.b FROM t1 ) SELECT 123) IN ()))} +} + +do_execsql_test 27.3 { + CREATE TABLE t0(c0 , c1 AS (CASE TRUE NOT IN () WHEN NULL THEN CASE + 0xa ISNULL WHEN NOT + 0x9 THEN t0.c1 ELSE CURRENT_TIME LIKE CAST (t0.c1 REGEXP '-([1-9]\d*.\d*|0\.\d*[1-9]\d*)'ESCAPE (c1) COLLATE BINARY BETWEEN c1 AND c1 NOT IN (WITH t4 (c0) AS (WITH t3 (c0) AS NOT MATERIALIZED (WITH RECURSIVE t2 (c0) AS (WITH RECURSIVE t1 AS (VALUES (x'717171ff71717171' ) ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY 0x9 ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c1 ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY typeof(0x9 ) ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY typeof(typeof(0x9 ) ) ) IN t0 BETWEEN typeof(typeof(typeof(hex(*) FILTER (WHERE + x'5ccd1e68' ) ) ) ) AND 1 >0xa AS BLOB (+4.4E4 , -0xe ) ) END <> c1 IN () END ) VIRTUAL , c35 PRIMARY KEY , c60 , c64 NUMERIC (-6.8 , -0xE ) ) WITHOUT ROWID ; +} {} + +do_execsql_test 27.4 { + ALTER TABLE t0 DROP COLUMN c60; +} {} + +finish_test + + + finish_test From dde13e6f887953e5d5d3273fc264da3532b62c25 Mon Sep 17 00:00:00 2001 From: larrybr Date: Wed, 29 Sep 2021 00:32:13 +0000 Subject: [PATCH 104/130] Get group_concat() to handle varying separator lengths when windowing FossilOrigin-Name: 98e0f2bf67cdee1da1edadeb54ff8564728b3f28fc821e46e8de201247c3fc87 --- manifest | 19 ++++---- manifest.uuid | 2 +- src/func.c | 116 +++++++++++++++++++++++++++++++++++----------- test/windowB.test | 8 ++++ 4 files changed, 108 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index fdeb8b705e..6203b9826a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Load\srecent\sdbsqlfuzz\scases\sinto\stest/fuzzdata8.db. -D 2021-09-25T20:28:39.895 +C Get\sgroup_concat()\sto\shandle\svarying\sseparator\slengths\swhen\swindowing +D 2021-09-29T00:32:13.146 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -502,7 +502,7 @@ F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c 38597afb008db2e0a5f86a82827567acb98f502cab61663ef16bc688bc256803 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c -F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1 +F src/func.c c852d68d0a984263f969e3b84d602c6d821147a32905fecca65b1d86098367b4 F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -1797,7 +1797,7 @@ F test/window8.tcl 5e02e41d9d9a80f597063aed1a381eb19d1d0ef677a4f0df352c5365cf23f F test/window8.test 4ab16817414af0c904abe2ebdf88eb6c2b00058b84f9748c6174ff11fc45f1ed F test/window9.test 349c71eab4288a1ffc19e2f65872ec2c37e6cf8a1dda2ad300364b7450ae4836 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test 6e601f8178ba8ba28b2f19e74fe613815084bb4a8d2ad942defc7d42e191e521 +F test/windowB.test b67bda5645f3226790e1a360c4225241840b84adb5aa2e69bfb0b27eef3b84d9 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 21919e601f20b976ea2a73aa401220c89ed0e8d203c4f69476ea55bce3726496 @@ -1926,7 +1926,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 706322c2b5bb31e14c1120a94520b21fa623ff119e3890170e36b37d8bde721a -R 29fc8916ca6b5a432d2826152a802182 -U drh -Z 2df13617e37950dc266054e33266713a +P 7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b +R f06fcf734c6cb0151864e67091ca6f93 +T *branch * group_concat_varsep +T *sym-group_concat_varsep * +T -sym-trunk * +U larrybr +Z a3e2174302f0231fe7e552f570c10b10 diff --git a/manifest.uuid b/manifest.uuid index 57f5790ed6..90cedf20e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b \ No newline at end of file +98e0f2bf67cdee1da1edadeb54ff8564728b3f28fc821e46e8de201247c3fc87 \ No newline at end of file diff --git a/src/func.c b/src/func.c index b47378a3be..d348aa6574 100644 --- a/src/func.c +++ b/src/func.c @@ -1716,23 +1716,36 @@ static void minMaxFinalize(sqlite3_context *context){ /* ** group_concat(EXPR, ?SEPARATOR?) */ +typedef struct { + StrAccum str; /* The accumulated concatenation */ +#ifndef SQLITE_OMIT_WINDOWFUNC + int nAccum; /* Number of strings presently concatenated */ + int nFirstSepLength; /* Used to detect separator length change */ + /* If pnSepLengths!=0, refs an array of inter-string separator lengths, + * stored as actually incorporated into presently accumulated result. + * (Hence, its slots in use number nAccum-1 between method calls.) + * If pnSepLengths==0, nFirstSepLength is the length used throughout. + */ + int *pnSepLengths; +#endif +} GroupConcatCtx; + static void groupConcatStep( sqlite3_context *context, int argc, sqlite3_value **argv ){ const char *zVal; - StrAccum *pAccum; + GroupConcatCtx *pGCC; const char *zSep; int nVal, nSep; assert( argc==1 || argc==2 ); if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; - pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); - - if( pAccum ){ + pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC)); + if( pGCC ){ sqlite3 *db = sqlite3_context_db_handle(context); - int firstTerm = pAccum->mxAlloc==0; - pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; + int firstTerm = pGCC->str.mxAlloc==0; + pGCC->str.mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; if( !firstTerm ){ if( argc==2 ){ zSep = (char*)sqlite3_value_text(argv[1]); @@ -1741,49 +1754,92 @@ static void groupConcatStep( zSep = ","; nSep = 1; } - if( zSep ) sqlite3_str_append(pAccum, zSep, nSep); + if( zSep ) + sqlite3_str_append(&pGCC->str, zSep, nSep); +#ifndef SQLITE_OMIT_WINDOWFUNC + else + nSep = 0; + if( nSep != pGCC->nFirstSepLength || pGCC->pnSepLengths != 0 ){ + int * pnsl = pGCC->pnSepLengths; + if( pnsl == 0 ){ + /* First separator length variation seen, start tracking them. */ + pnsl = (int*)sqlite3_malloc64((pGCC->nAccum+1) * sizeof(int)); + if( pnsl!=0 ){ + int i = 0, nA = pGCC->nAccum-1; + while( inFirstSepLength; + } + }else{ + pnsl = (int*)sqlite3_realloc64(pnsl, pGCC->nAccum * sizeof(int)); + } + if( pnsl!=0 ){ + if( pGCC->nAccum>0 ) + pnsl[pGCC->nAccum-1] = nSep; + pGCC->pnSepLengths = pnsl; + }else{ + setStrAccumError(&pGCC->str, SQLITE_NOMEM); + } + } +#endif } +#ifndef SQLITE_OMIT_WINDOWFUNC + else{ + pGCC->nFirstSepLength = (argc==2)? sqlite3_value_bytes(argv[1]) : 1; + } + pGCC->nAccum += 1; +#endif zVal = (char*)sqlite3_value_text(argv[0]); nVal = sqlite3_value_bytes(argv[0]); - if( zVal ) sqlite3_str_append(pAccum, zVal, nVal); + if( zVal ) sqlite3_str_append(&pGCC->str, zVal, nVal); } } + #ifndef SQLITE_OMIT_WINDOWFUNC static void groupConcatInverse( sqlite3_context *context, int argc, sqlite3_value **argv ){ - int n; - StrAccum *pAccum; + GroupConcatCtx *pGCC; assert( argc==1 || argc==2 ); if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; - pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); - /* pAccum is always non-NULL since groupConcatStep() will have always + pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC)); + /* pGCC is always non-NULL since groupConcatStep() will have always ** run frist to initialize it */ - if( ALWAYS(pAccum) ){ - n = sqlite3_value_bytes(argv[0]); - if( argc==2 ){ - n += sqlite3_value_bytes(argv[1]); + if( ALWAYS(pGCC) ){ + int nVS = sqlite3_value_bytes(argv[0]); + pGCC->nAccum -= 1; + if( pGCC->pnSepLengths!=0 ){ + assert(pGCC->nAccum >= 0); + if( pGCC->nAccum>0 ){ + nVS += *pGCC->pnSepLengths; + memmove(pGCC->pnSepLengths, pGCC->pnSepLengths+1, + (pGCC->nAccum-1)*sizeof(int)); + } }else{ - n++; + /* If removing single accumulated string, harmlessly over-do. */ + nVS += pGCC->nFirstSepLength; } - if( n>=(int)pAccum->nChar ){ - pAccum->nChar = 0; + if( nVS>=(int)pGCC->str.nChar ){ + pGCC->str.nChar = 0; }else{ - pAccum->nChar -= n; - memmove(pAccum->zText, &pAccum->zText[n], pAccum->nChar); + pGCC->str.nChar -= nVS; + memmove(pGCC->str.zText, &pGCC->str.zText[nVS], pGCC->str.nChar); + } + if( pGCC->str.nChar==0 ){ + pGCC->str.mxAlloc = 0; + sqlite3_free(pGCC->pnSepLengths); + pGCC->pnSepLengths = 0; } - if( pAccum->nChar==0 ) pAccum->mxAlloc = 0; } } #else # define groupConcatInverse 0 #endif /* SQLITE_OMIT_WINDOWFUNC */ static void groupConcatFinalize(sqlite3_context *context){ - StrAccum *pAccum; - pAccum = sqlite3_aggregate_context(context, 0); - if( pAccum ){ + GroupConcatCtx *pGCC + = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0); + if( pGCC ){ + StrAccum *pAccum = &pGCC->str; if( pAccum->accError==SQLITE_TOOBIG ){ sqlite3_result_error_toobig(context); }else if( pAccum->accError==SQLITE_NOMEM ){ @@ -1792,13 +1848,17 @@ static void groupConcatFinalize(sqlite3_context *context){ sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, sqlite3_free); } +#ifndef SQLITE_OMIT_WINDOWFUNC + sqlite3_free(pGCC->pnSepLengths); +#endif } } #ifndef SQLITE_OMIT_WINDOWFUNC static void groupConcatValue(sqlite3_context *context){ - sqlite3_str *pAccum; - pAccum = (sqlite3_str*)sqlite3_aggregate_context(context, 0); - if( pAccum ){ + GroupConcatCtx *pGCC + = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0); + if( pGCC ){ + StrAccum *pAccum = &pGCC->str; if( pAccum->accError==SQLITE_TOOBIG ){ sqlite3_result_error_toobig(context); }else if( pAccum->accError==SQLITE_NOMEM ){ diff --git a/test/windowB.test b/test/windowB.test index 30380aee20..52221c445c 100644 --- a/test/windowB.test +++ b/test/windowB.test @@ -9,6 +9,7 @@ # #*********************************************************************** # Test cases for RANGE BETWEEN and especially with NULLS LAST +# and for varying separator handling by group_concat(). # set testdir [file dirname $argv0] @@ -356,5 +357,12 @@ do_execsql_test 8.1 { FROM t1; } {111 660 938 979} +do_execsql_test 9.0 { + CREATE TABLE seps(x); + INSERT INTO seps(x) VALUES ('1'), ('22'), ('333'), ('4444'); + SELECT group_concat('-', x) + OVER ( ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) + FROM seps; +} {-22- -22-333- -333-4444- -4444-} finish_test From 415540ddaa0c5ddff02c4ddea6ad1a8755aae8f8 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Sep 2021 13:36:58 +0000 Subject: [PATCH 105/130] Fix an out-of-bounds read in fts5 that could occur when processing corrupt records. FossilOrigin-Name: 9bbc01fb239b4aa752a56c584baa29655a3c845425d5c17d24a3939984d54fe2 --- ext/fts5/fts5_index.c | 5 +- ext/fts5/test/fts5corrupt5.test | 244 ++++++++++++++++++++++++++++++++ manifest | 13 +- manifest.uuid | 2 +- 4 files changed, 256 insertions(+), 8 deletions(-) create mode 100644 ext/fts5/test/fts5corrupt5.test diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 0291704f4a..40658a8710 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -2213,6 +2213,10 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ pIter->pLeaf = pLast; pIter->iLeafPgno = pgnoLast; iOff = fts5LeafFirstRowidOff(pLast); + if( iOff>pLast->szLeaf ){ + p->rc = FTS5_CORRUPT; + return; + } iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid); pIter->iLeafOffset = iOff; @@ -2221,7 +2225,6 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ }else{ pIter->iEndofDoclist = fts5LeafFirstTermOff(pLast); } - } fts5SegIterReverseInitPage(p, pIter); diff --git a/ext/fts5/test/fts5corrupt5.test b/ext/fts5/test/fts5corrupt5.test new file mode 100644 index 0000000000..062e826f5e --- /dev/null +++ b/ext/fts5/test/fts5corrupt5.test @@ -0,0 +1,244 @@ +# 2015 Apr 24 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file tests that FTS5 handles corrupt databases (i.e. internal +# inconsistencies in the backing tables) correctly. In this case +# "correctly" means without crashing. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5corrupt3 + +# If SQLITE_ENABLE_FTS5 is defined, omit this file. +ifcapable !fts5 { + finish_test + return +} +sqlite3_fts5_may_be_corrupt 1 +database_may_be_corrupt + +#------------------------------------------------------------------------- +# dbsqlfuzz crash-0f47112aa7520cf08c6a835a88fdff8c2a32a188 +# +reset_db +do_test 1.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash-0f47112aa7520c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 00 00 00 00 ...~.H.......... +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 11 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 00 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 03 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 04 f6 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: f6 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 0f 42 03 07 1c 8c 81 80 80 .0table.B....... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 13 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 9e 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 08 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 80 72 65 01 02 05 01 ..<.....3.re.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 17 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 64 61 62 ............0dab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 13 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 14 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 01 64 09 10 01 32 69 14 07 04 09 10 01 32 66 ..d...2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 06 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 00 00 00 00 00 ................ +| end crash-0f47112aa7520c.db + }] +} {} + +do_catchsql_test 1.1 { + SELECT * FROM t1('R*') WHERE (a,b)<=(current_date,0) ORDER BY rowid DESC; +} {1 {database disk image is malformed}} + +sqlite3_fts5_may_be_corrupt 0 +finish_test + diff --git a/manifest b/manifest index 02f493c401..80773b320e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sALTER\sTABLE\sproblem\swith\sexpressions\slike\s(\s()\sIN\s()\s). -D 2021-09-28T10:44:54.441 +C Fix\san\sout-of-bounds\sread\sin\sfts5\sthat\scould\soccur\swhen\sprocessing\scorrupt\srecords. +D 2021-09-29T13:36:58.216 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938d F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 3cdcb62ef0ead4420cd9a5da32d6586e628a4da7adba9fffbfa54626b63ff77c +F ext/fts5/fts5_index.c 48ab70b8d646f8b50d36664005682e7b5d1639bc8aaf60268e11d783afd5b203 F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -162,6 +162,7 @@ F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519d F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f F ext/fts5/test/fts5corrupt3.test 0e473620582a53ac61f468f364db8a151c1e18d2a879b16439d172c12c4c9828 F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 +F ext/fts5/test/fts5corrupt5.test 2765589a88645ed09bb73ce9e522e9b219166ad943e551f39b7ce13789b31499 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4 F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1926,7 +1927,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 6ab25f8bd52d6412a9600143de364f6d8ad8e2c835315fafca6f54d5f38a49dc -R 0b0aa479205f98d487986e0312e156bf +P df0d7e36dbf98ab5405d8366ce92fb85176d4388b47a57b0ca1aa1ba6ae5212e +R 4fb740a496089788306f88ca01646658 U dan -Z c883b6c925a98c67ff212863f29958e5 +Z a52e95ecb0bcc637cb02a3ef17a54917 diff --git a/manifest.uuid b/manifest.uuid index 6cb2d24b62..1dd392c1c9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df0d7e36dbf98ab5405d8366ce92fb85176d4388b47a57b0ca1aa1ba6ae5212e \ No newline at end of file +9bbc01fb239b4aa752a56c584baa29655a3c845425d5c17d24a3939984d54fe2 \ No newline at end of file From a40f5af40368526954f0dca0c78b435b80e8d401 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 29 Sep 2021 14:01:44 +0000 Subject: [PATCH 106/130] Improved testability of changes from check-in [255b0eeed113d83b]. FossilOrigin-Name: bbfd083c26086fb103fec88faa59a01e689e0b7fce38c09d8846bb472a0e6760 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 80773b320e..d1de3b6dd2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sout-of-bounds\sread\sin\sfts5\sthat\scould\soccur\swhen\sprocessing\scorrupt\srecords. -D 2021-09-29T13:36:58.216 +C Improved\stestability\sof\schanges\sfrom\scheck-in\s[255b0eeed113d83b]. +D 2021-09-29T14:01:44.665 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -500,7 +500,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c bea044cfe99eab6c527837e196a5335c128989bdb354cf1b4973b85ea561d66b F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c f2e0f5dd07d1b202f700f26b0851f2ea485e36ec8f335b05aec2cd91cd08853f +F src/expr.c 7628ab5359d7643bfd5b6027a7774419dd12bfbb2bc1f0d2a75bd12dd8c97304 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1 @@ -1927,7 +1927,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 df0d7e36dbf98ab5405d8366ce92fb85176d4388b47a57b0ca1aa1ba6ae5212e -R 4fb740a496089788306f88ca01646658 -U dan -Z a52e95ecb0bcc637cb02a3ef17a54917 +P 9bbc01fb239b4aa752a56c584baa29655a3c845425d5c17d24a3939984d54fe2 +R c40e5ac53dc649361977b7f5af733d92 +U drh +Z 737a81f3f3c6c485a35681c71272067e diff --git a/manifest.uuid b/manifest.uuid index 1dd392c1c9..1b0b3e9969 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9bbc01fb239b4aa752a56c584baa29655a3c845425d5c17d24a3939984d54fe2 \ No newline at end of file +bbfd083c26086fb103fec88faa59a01e689e0b7fce38c09d8846bb472a0e6760 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 5b7a58fb55..3e60cf712c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -518,7 +518,7 @@ Expr *sqlite3ExprForVectorField( }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); - if( IN_RENAME_OBJECT && pRet ){ + if( pRet && IN_RENAME_OBJECT ){ SWAP(Expr, *pRet, *pVector); sqlite3RenameTokenRemap(pParse, pRet, pVector); } From a92f9586e0cb702f0fccca2dacc891dbed38f11d Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Sep 2021 14:14:16 +0000 Subject: [PATCH 107/130] Add extra tests for the group_concat() fix on this branch. FossilOrigin-Name: 3d148615f9d9c6a3d63d8eb015f3d70f453a66de49b28e665831254387c700b9 --- manifest | 18 ++++++------ manifest.uuid | 2 +- test/windowC.test | 66 +++++++++++++++++++++++++++++++++++++++++++ test/windowfault.test | 39 +++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 test/windowC.test diff --git a/manifest b/manifest index 6203b9826a..d4ace12257 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Get\sgroup_concat()\sto\shandle\svarying\sseparator\slengths\swhen\swindowing -D 2021-09-29T00:32:13.146 +C Add\sextra\stests\sfor\sthe\sgroup_concat()\sfix\son\sthis\sbranch. +D 2021-09-29T14:14:16.714 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1798,9 +1798,10 @@ F test/window8.test 4ab16817414af0c904abe2ebdf88eb6c2b00058b84f9748c6174ff11fc45 F test/window9.test 349c71eab4288a1ffc19e2f65872ec2c37e6cf8a1dda2ad300364b7450ae4836 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowB.test b67bda5645f3226790e1a360c4225241840b84adb5aa2e69bfb0b27eef3b84d9 +F test/windowC.test ecf1831b995408b03f708386b37ece7a05108faf2288c0c55cff873c100e145f F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b -F test/windowfault.test 21919e601f20b976ea2a73aa401220c89ed0e8d203c4f69476ea55bce3726496 +F test/windowfault.test 15094c1529424e62f798bc679e3fe9dfab6e8ba2f7dfe8c923b6248c31660a7c F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df F test/with1.test 7bc5abfe4c80c0cef8a90f5a66d60b9982e8ccd7350c8eb70611323a3b8e07ba F test/with2.test f803743b2c746ecdd0b638783c7235654b947b0f1c4bb551ca10e1d813317153 @@ -1926,10 +1927,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 7a8fcf6d2c8e3c8f10ff515c8c00c761d15a28eef8e0e31e09e22feb06c9443b -R f06fcf734c6cb0151864e67091ca6f93 -T *branch * group_concat_varsep -T *sym-group_concat_varsep * -T -sym-trunk * -U larrybr -Z a3e2174302f0231fe7e552f570c10b10 +P 98e0f2bf67cdee1da1edadeb54ff8564728b3f28fc821e46e8de201247c3fc87 +R 1629e1fee3aa6c55d78d8125420eddd7 +U dan +Z 18e23ea62384af634dfba68431ad5780 diff --git a/manifest.uuid b/manifest.uuid index 90cedf20e5..63426e4b12 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98e0f2bf67cdee1da1edadeb54ff8564728b3f28fc821e46e8de201247c3fc87 \ No newline at end of file +3d148615f9d9c6a3d63d8eb015f3d70f453a66de49b28e665831254387c700b9 \ No newline at end of file diff --git a/test/windowC.test b/test/windowC.test new file mode 100644 index 0000000000..54eb7cadc4 --- /dev/null +++ b/test/windowC.test @@ -0,0 +1,66 @@ +# 2021-09-29 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# Test cases for varying separator handling by group_concat(). +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix windowB + +ifcapable !windowfunc { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE x1(i INTEGER PRIMARY KEY, x); +} + +foreach {tn bBlob seps} { + 1 0 {a b c def g} + 2 0 {abcdefg {} {} abcdefg} + 3 0 {a bc def ghij klmno pqrstu} + 4 1 {a bc def ghij klmno pqrstu} + 5 1 {, , , , , , , , , , , , ....... , ,} +} { + foreach type {text blob} { + do_test 1.$type.$tn.1 { + execsql { DELETE FROM x1 } + foreach s $seps { + if {$type=="text"} { + execsql {INSERT INTO x1 VALUES(NULL, $s)} + } else { + execsql {INSERT INTO x1 VALUES(NULL, CAST ($s AS blob))} + } + } + } {} + + foreach {tn2 win} { + 1 "ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING" + 2 "ROWS BETWEEN 2 PRECEDING AND CURRENT ROW" + 3 "ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" + } { + do_test 1.$type.$tn.2.$tn2 { + db eval " + SELECT group_concat('val', x) OVER ( ORDER BY i $win ) AS val FROM x1 + " { + if {[string range $val 0 2]!="val" + || [string range $val end-2 end]!="val" + } { + error "unexpected return value: $val" + } + } + } {} + } + } +} + +finish_test diff --git a/test/windowfault.test b/test/windowfault.test index b5d7433112..5340ce08fd 100644 --- a/test/windowfault.test +++ b/test/windowfault.test @@ -292,4 +292,43 @@ do_faultsim_test 12 -faults oom* -prep { faultsim_test_result {0 {}} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 13.0 { + CREATE TABLE t1(id INTEGER PRIMARY KEY, a, b); + INSERT INTO t1 VALUES(1, '1', 'a'); + INSERT INTO t1 VALUES(2, '22', 'b'); + INSERT INTO t1 VALUES(3, '333', 'c'); + INSERT INTO t1 VALUES(4, '4444', 'dddd'); + INSERT INTO t1 VALUES(5, '55555', 'e'); + INSERT INTO t1 VALUES(6, '666666', 'f'); + INSERT INTO t1 VALUES(7, '7777777', 'gggggggggg'); +} {} + +set queryres [list {*}{ + 1b22 + 1b22c333 + 22c333dddd4444 + 333dddd4444e55555 + 4444e55555f666666 + 55555f666666gggggggggg7777777 + 666666gggggggggg7777777 +}] +do_execsql_test 13.1 { + SELECT group_concat(a, b) OVER ( + ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 +} $queryres + +do_faultsim_test 13 -faults oom* -prep { +} -body { + execsql { + SELECT group_concat(a, b) OVER ( + ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 + } +} -test { + faultsim_test_result [list 0 $::queryres] +} + finish_test From eda0001d897fb122478248c81750d9a0a29ebbe8 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Sep 2021 16:38:02 +0000 Subject: [PATCH 108/130] Add new test file rtreedoc3.test. FossilOrigin-Name: 54604869861cc5866d5de87785599ca56f75067f8cb7fe22e32912b3a037e37b --- ext/rtree/rtreedoc.test | 12 +- ext/rtree/rtreedoc3.test | 292 ++++++++++++++++++++++++++++++++++++++ ext/rtree/test_rtreedoc.c | 129 ++++++++++++++++- manifest | 17 +-- manifest.uuid | 2 +- 5 files changed, 435 insertions(+), 17 deletions(-) create mode 100644 ext/rtree/rtreedoc3.test diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index f22349628d..bfc5a7520c 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -1313,10 +1313,14 @@ foreach {tn nm} { CREATE VIRTUAL TABLE $nm USING rtree(a,b,c,d,e); " - # EVIDENCE-OF: R-37699-54000 This is their schema: CREATE TABLE - # %_node(nodeno INTEGER PRIMARY KEY, data BLOB) CREATE TABLE - # %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) CREATE TABLE - # %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER) + # EVIDENCE-OF: R-33789-46762 The content of an R*Tree index is actually + # stored in three ordinary SQLite tables with names derived from the + # name of the R*Tree. + # + # EVIDENCE-OF: R-39849-06566 This is their schema: CREATE TABLE + # %_node(nodeno INTEGER PRIMARY KEY, data) CREATE TABLE %_parent(nodeno + # INTEGER PRIMARY KEY, parentnode) CREATE TABLE %_rowid(rowid INTEGER + # PRIMARY KEY, nodeno) # # EVIDENCE-OF: R-07489-10051 The "%" in the name of each shadow table is # replaced by the name of the R*Tree virtual table. So, if the name of diff --git a/ext/rtree/rtreedoc3.test b/ext/rtree/rtreedoc3.test new file mode 100644 index 0000000000..0403409fae --- /dev/null +++ b/ext/rtree/rtreedoc3.test @@ -0,0 +1,292 @@ +# 2021 September 13 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# The focus of this file is testing the r-tree extension. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] rtree_util.tcl] +source $testdir/tester.tcl +set testprefix rtreedoc3 + +ifcapable !rtree { + finish_test + return +} + + +# This command assumes that the argument is a node blob for a 2 dimensional +# i32 r-tree table. It decodes and returns a list of cells from the node +# as a list. Each cell is itself a list of the following form: +# +# {$rowid $minX $maxX $minY $maxY} +# +# For internal (non-leaf) nodes, the rowid is replaced by the child node +# number. +# +proc rnode_cells {aData} { + set nDim 2 + + set nData [string length $aData] + set nBytePerCell [expr (8 + 2*$nDim*4)] + binary scan [string range $aData 2 3] S nCell + + set res [list] + for {set i 0} {$i < $nCell} {incr i} { + set iOff [expr $i*$nBytePerCell+4] + set cell [string range $aData $iOff [expr $iOff+$nBytePerCell-1]] + binary scan $cell WIIII rowid x1 x2 y1 y2 + lappend res [list $rowid $x1 $x2 $y1 $y2] + } + + return $res +} + +# Interpret the first two bytes of the blob passed as the only parameter +# as a 16-bit big-endian integer and return the value. If this blob is +# the root node of an r-tree, this value is the height of the tree. +# +proc rnode_height {aData} { + binary scan [string range $aData 0 1] S nHeight + return $nHeight +} + +# Return a blob containing node iNode of r-tree "rt". +# +proc rt_node_get {iNode} { + db one { SELECT data FROM rt_node WHERE nodeno=$iNode } +} + + +#-------------------------------------------------------------- +# API: +# +# pq_init +# Initialize a new test. +# +# pq_test_callback +# Invoked each time the xQueryCallback function is called. This Tcl +# command checks that the arguments that SQLite passed to xQueryCallback +# are as expected. +# +# pq_test_row +# Invoked each time a row is returned. Checks that the row returned +# was predicted by the documentation. +# +# DATA STRUCTURE: +# The priority queue is stored as a Tcl list. The order of elements in +# the list is unimportant - it is just used as a set here. Each element +# in the priority queue is itself a list. The first element is the +# priority value for the entry (a real). Following this is a list of +# key-value pairs that make up the entries fields. +# +proc pq_init {} { + global Q + set Q(pri_queue) [list] + + set nHeight [rnode_height [rt_node_get 1]] + set nCell [llength [rnode_cells [rt_node_get 1]]] + + # EVIDENCE-OF: R-54708-13595 An R*Tree query is initialized by making + # the root node the only entry in a priority queue sorted by rScore. + lappend Q(pri_queue) [list 0.0 [list \ + iLevel [expr $nHeight+1] \ + iChild 1 \ + iCurrent 0 \ + ]] +} + +proc pq_extract {} { + global Q + if {[llength $Q(pri_queue)]==0} { + error "priority queue is empty!" + } + + # Find the priority queue entry with the lowest score. + # + # EVIDENCE-OF: R-47257-47871 Smaller scores are processed first. + set iBest 0 + set rBestScore [lindex $Q(pri_queue) 0 0] + for {set ii 1} {$ii < [llength $Q(pri_queue)]} {incr ii} { + set rScore [expr [lindex $Q(pri_queue) $ii 0]] + if {$rScore<$rBestScore} { + set rBestScore $rScore + set iBest $ii + } + } + + # Extract the entry with the lowest score from the queue and return it. + # + # EVIDENCE-OF: R-60002-49798 The query proceeds by extracting the entry + # from the priority queue that has the lowest score. + set ret [lindex $Q(pri_queue) $iBest] + set Q(pri_queue) [lreplace $Q(pri_queue) $iBest $iBest] + + return $ret +} + +proc pq_new_entry {rScore iLevel cell} { + global Q + + set rowid_name "iChild" + if {$iLevel==0} { set rowid_name "iRowid" } + + set kv [list] + lappend kv aCoord [lrange $cell 1 end] + lappend kv iLevel $iLevel + + if {$iLevel==0} { + lappend kv iRowid [lindex $cell 0] + } else { + lappend kv iChild [lindex $cell 0] + lappend kv iCurrent 0 + } + + lappend Q(pri_queue) [list $rScore $kv] +} + +proc pq_test_callback {L res} { + #pq_debug "pq_test_callback $L -> $res" + global Q + + array set G $L ;# "Got" - as in stuff passed to xQuery + + # EVIDENCE-OF: R-65127-42665 If the extracted priority queue entry is a + # node (a subtree), then the next child of that node is passed to the + # xQueryFunc callback. + # + # If it had been a leaf, the row should have been returned, instead of + # xQueryCallback being called on a child - as is happening here. + foreach {rParentScore parent} [pq_extract] {} + array set P $parent ;# "Parent" - as in parent of expected cell + if {$P(iLevel)==0} { error "query callback mismatch (1)" } + set child_node [rnode_cells [rt_node_get $P(iChild)]] + set expected_cell [lindex $child_node $P(iCurrent)] + set expected_coords [lrange $expected_cell 1 end] + if {[llength $expected_coords] != [llength $G(aCoord)]} { + puts [array get P] + puts "E: $expected_coords G: $G(aCoord)" + error "coordinate mismatch in query callback (1)" + } + foreach a [lrange $expected_cell 1 end] b $G(aCoord) { + if {$a!=$b} { error "coordinate mismatch in query callback (2)" } + } + + # Check level is as expected + # + if {$G(iLevel) != $P(iLevel)-1} { + error "iLevel mismatch in query callback (1)" + } + + # Unless the callback returned NOT_WITHIN, add the entry to the priority + # queue. + # + # EVIDENCE-OF: R-28754-35153 Those subelements for which the xQueryFunc + # callback sets eWithin to PARTLY_WITHIN or FULLY_WITHIN are added to + # the priority queue using the score supplied by the callback. + # + # EVIDENCE-OF: R-08681-45277 Subelements that return NOT_WITHIN are + # discarded. + set r [lindex $res 0] + set rScore [lindex $res 1] + if {$r!="fully" && $r!="partly" && $r!="not"} { + error "unknown result: $r - expected \"fully\", \"partly\" or \"not\"" + } + if {$r!="not"} { + pq_new_entry $rScore [expr $P(iLevel)-1] $expected_cell + } + + # EVIDENCE-OF: R-07194-63805 If the node has more children then it is + # returned to the priority queue. Otherwise it is discarded. + incr P(iCurrent) + if {$P(iCurrent)<[llength $child_node]} { + lappend Q(pri_queue) [list $rParentScore [array get P]] + } +} + +proc pq_test_result {id x1 x2 y1 y2} { + #pq_debug "pq_test_result $id $x1 $x2 $y1 $y2" + foreach {rScore next} [pq_extract] {} + + # The extracted entry must be a leaf (otherwise, xQueryCallback would + # have been called on the extracted entries children instead of just + # returning the data). + # + # EVIDENCE-OF: R-13214-54017 If that entry is a leaf (meaning that it is + # an actual R*Tree entry and not a subtree) then that entry is returned + # as one row of the query result. + array set N $next + if {$N(iLevel)!=0} { error "result row mismatch (1)" } + + if {$x1!=[lindex $N(aCoord) 0] || $x2!=[lindex $N(aCoord) 1] + || $y1!=[lindex $N(aCoord) 2] || $y2!=[lindex $N(aCoord) 3] + } { + if {$N(iLevel)!=0} { error "result row mismatch (2)" } + } + + if {$id!=$N(iRowid)} { error "result row mismatch (3)" } +} + +proc pq_done {} { + global Q + # EVIDENCE-OF: R-57438-45968 The query runs until the priority queue is + # empty. + if {[llength $Q(pri_queue)]>0} { + error "priority queue is not empty!" + } +} + +proc pq_debug {caption} { + global Q + + puts "**** $caption ****" + set i 0 + foreach q [lsort -real -index 0 $Q(pri_queue)] { + puts "PQ $i: $q" + incr i + } +} + +#-------------------------------------------------------------- + +proc box_query {a} { + set res [list fully [expr rand()]] + pq_test_callback $a $res + return $res +} + +register_box_query db box_query + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree_i32(id, x1,x2, y1,y2); + WITH s(i) AS ( + SELECT 0 UNION ALL SELECT i+1 FROM s WHERE i<64 + ) + INSERT INTO rt SELECT NULL, a.i, a.i+1, b.i, b.i+1 FROM s a, s b; +} + +proc box_query {a} { + set res [list fully [expr rand()]] + pq_test_callback $a $res + return $res +} + +pq_init +db eval { SELECT id, x1,x2, y1,y2 FROM rt WHERE id MATCH qbox() } { + pq_test_result $id $x1 $x2 $y1 $y2 +} +pq_done + +finish_test + + diff --git a/ext/rtree/test_rtreedoc.c b/ext/rtree/test_rtreedoc.c index 6eafef806f..752a7ac124 100644 --- a/ext/rtree/test_rtreedoc.c +++ b/ext/rtree/test_rtreedoc.c @@ -31,6 +31,12 @@ struct BoxGeomCtx { Tcl_Obj *pScript; }; +typedef struct BoxQueryCtx BoxQueryCtx; +struct BoxQueryCtx { + Tcl_Interp *interp; + Tcl_Obj *pScript; +}; + static void testDelUser(void *pCtx){ BoxGeomCtx *p = (BoxGeomCtx*)pCtx; Tcl_EvalObjEx(p->interp, p->pScript, 0); @@ -129,10 +135,6 @@ static int invokeTclGeomCb( # sqlite3_rtree_geometry structure which provides information about how # the SQL function was invoked. -# EVIDENCE-OF: R-40260-16838 The number of coordinates is 2 for a -# 1-dimensional R*Tree, 4 for a 2-dimensional R*Tree, 6 for a -# 3-dimensional R*Tree, and so forth. - # EVIDENCE-OF: R-00090-24248 The third argument, aCoord[], is an array # of nCoord coordinates that defines a bounding box to be tested. @@ -198,6 +200,113 @@ static int SQLITE_TCLAPI register_box_geom( return TCL_OK; } +static int box_query(sqlite3_rtree_query_info *pInfo){ + const char *azParentWithin[] = {"not", "partly", "fully", 0}; + BoxQueryCtx *pCtx = (BoxQueryCtx*)pInfo->pContext; + Tcl_Interp *interp = pCtx->interp; + Tcl_Obj *pEval; + Tcl_Obj *pArg; + Tcl_Obj *pTmp = 0; + int rc; + int ii; + + pEval = Tcl_DuplicateObj(pCtx->pScript); + Tcl_IncrRefCount(pEval); + pArg = Tcl_NewObj(); + Tcl_IncrRefCount(pArg); + + /* aParam[] */ + pTmp = Tcl_NewObj(); + Tcl_IncrRefCount(pTmp); + for(ii=0; iinParam; ii++){ + Tcl_Obj *p = Tcl_NewDoubleObj(pInfo->aParam[ii]); + Tcl_ListObjAppendElement(interp, pTmp, p); + } + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("aParam", -1)); + Tcl_ListObjAppendElement(interp, pArg, pTmp); + Tcl_DecrRefCount(pTmp); + + /* aCoord[] */ + pTmp = Tcl_NewObj(); + Tcl_IncrRefCount(pTmp); + for(ii=0; iinCoord; ii++){ + Tcl_Obj *p = Tcl_NewDoubleObj(pInfo->aCoord[ii]); + Tcl_ListObjAppendElement(interp, pTmp, p); + } + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("aCoord", -1)); + Tcl_ListObjAppendElement(interp, pArg, pTmp); + Tcl_DecrRefCount(pTmp); + + /* anQueue[] */ + pTmp = Tcl_NewObj(); + Tcl_IncrRefCount(pTmp); + for(ii=0; ii<=pInfo->mxLevel; ii++){ + Tcl_Obj *p = Tcl_NewIntObj((int)pInfo->anQueue[ii]); + Tcl_ListObjAppendElement(interp, pTmp, p); + } + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("anQueue", -1)); + Tcl_ListObjAppendElement(interp, pArg, pTmp); + Tcl_DecrRefCount(pTmp); + + /* iLevel */ + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("iLevel", -1)); + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewIntObj(pInfo->iLevel)); + + /* mxLevel */ + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("mxLevel", -1)); + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewIntObj(pInfo->mxLevel)); + + /* iRowid */ + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("iRowid", -1)); + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewWideIntObj(pInfo->iRowid)); + + /* rParentScore */ + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("rParentScore", -1)); + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewDoubleObj(pInfo->rParentScore)); + + /* eParentWithin */ + assert( pInfo->eParentWithin==0 + || pInfo->eParentWithin==1 + || pInfo->eParentWithin==2 + ); + Tcl_ListObjAppendElement(interp, pArg, Tcl_NewStringObj("eParentWithin", -1)); + Tcl_ListObjAppendElement(interp, pArg, + Tcl_NewStringObj(azParentWithin[pInfo->eParentWithin], -1) + ); + + Tcl_ListObjAppendElement(interp, pEval, pArg); + rc = Tcl_EvalObjEx(interp, pEval, 0) ? SQLITE_ERROR : SQLITE_OK; + + if( rc==SQLITE_OK ){ + double rScore = 0.0; + int nObj = 0; + int eP = 0; + Tcl_Obj **aObj = 0; + Tcl_Obj *pRes = Tcl_GetObjResult(interp); + + if( Tcl_ListObjGetElements(interp, pRes, &nObj, &aObj) + || nObj!=2 + || Tcl_GetDoubleFromObj(interp, aObj[1], &rScore) + || Tcl_GetIndexFromObj(interp, aObj[0], azParentWithin, "value", 0, &eP) + ){ + rc = SQLITE_ERROR; + }else{ + pInfo->rScore = rScore; + pInfo->eParentWithin = eP; + } + } + + Tcl_DecrRefCount(pArg); + Tcl_DecrRefCount(pEval); + return rc; +} + +static void box_query_destroy(void *p){ + BoxQueryCtx *pCtx = (BoxQueryCtx*)p; + Tcl_DecrRefCount(pCtx->pScript); + ckfree(pCtx); +} + static int SQLITE_TCLAPI register_box_query( void * clientData, Tcl_Interp *interp, @@ -207,6 +316,7 @@ static int SQLITE_TCLAPI register_box_query( extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); extern const char *sqlite3ErrName(int); sqlite3 *db; + BoxQueryCtx *pCtx; if( objc!=3 ){ Tcl_WrongNumArgs(interp, 1, objv, "DB SCRIPT"); @@ -214,6 +324,16 @@ static int SQLITE_TCLAPI register_box_query( } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + pCtx = (BoxQueryCtx*)ckalloc(sizeof(BoxQueryCtx*)); + pCtx->interp = interp; + pCtx->pScript = Tcl_DuplicateObj(objv[2]); + Tcl_IncrRefCount(pCtx->pScript); + + sqlite3_rtree_query_callback( + db, "qbox", box_query, (void*)pCtx, box_query_destroy + ); + + Tcl_ResetResult(interp); return TCL_OK; } #endif /* SQLITE_ENABLE_RTREE */ @@ -226,3 +346,4 @@ int Sqlitetestrtreedoc_Init(Tcl_Interp *interp){ #endif /* SQLITE_ENABLE_RTREE */ return TCL_OK; } + diff --git a/manifest b/manifest index d1de3b6dd2..8d4aee023e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\stestability\sof\schanges\sfrom\scheck-in\s[255b0eeed113d83b]. -D 2021-09-29T14:01:44.665 +C Add\snew\stest\sfile\srtreedoc3.test. +D 2021-09-29T16:38:02.070 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -419,11 +419,12 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 243cd3fdee1cb89e290e908ddde0cc0cfda0ccb85473c6d1b3c43e6260b14cac +F ext/rtree/rtreedoc.test 9d59baa8bce94056c63f872ad99fd9eaed60105be432af55402777f8ce093fb0 F ext/rtree/rtreedoc2.test 194ebb7d561452dcdc10bf03f44e30c082c2f0c14efeb07f5e02c7daf8284d93 +F ext/rtree/rtreedoc3.test 555a878c4d79c4e37fa439a1c3b02ee65d3ebaf75d9e8d96a9c55d66db3efbf8 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/test_rtreedoc.c 216f988e0b56474a3d42905653777772d3bdd413a7fe09a79e466b19296853b0 +F ext/rtree/test_rtreedoc.c e81d9bf69f7cbc8ba536458bbd8fc06a6f9ca93165f7d68832f588461e6a53cb F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 @@ -1927,7 +1928,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 9bbc01fb239b4aa752a56c584baa29655a3c845425d5c17d24a3939984d54fe2 -R c40e5ac53dc649361977b7f5af733d92 -U drh -Z 737a81f3f3c6c485a35681c71272067e +P bbfd083c26086fb103fec88faa59a01e689e0b7fce38c09d8846bb472a0e6760 +R 1037eaccd5510af0a78ced89d8bc5f27 +U dan +Z 19b69f1d272ce42a44f4a2c19e639601 diff --git a/manifest.uuid b/manifest.uuid index 1b0b3e9969..ef85c1c5c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bbfd083c26086fb103fec88faa59a01e689e0b7fce38c09d8846bb472a0e6760 \ No newline at end of file +54604869861cc5866d5de87785599ca56f75067f8cb7fe22e32912b3a037e37b \ No newline at end of file From ab632bc97e8d68d77912b16176a39781fd75a2a8 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Sep 2021 18:33:26 +0000 Subject: [PATCH 109/130] Fix another problem with ALTER TABLE and vector UPDATE statements within triggers. FossilOrigin-Name: a0df216f7c3f8963efba0b1ffee65d6a63309d846ffdcf2d2932cb4f1d4967b7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 14 +++++++++----- test/altertab3.test | 16 ++++++++++++++++ 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 8d4aee023e..443ef98e8c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\stest\sfile\srtreedoc3.test. -D 2021-09-29T16:38:02.070 +C Fix\sanother\sproblem\swith\sALTER\sTABLE\sand\svector\sUPDATE\sstatements\swithin\striggers. +D 2021-09-29T18:33:26.405 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -501,7 +501,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c bea044cfe99eab6c527837e196a5335c128989bdb354cf1b4973b85ea561d66b F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c 7628ab5359d7643bfd5b6027a7774419dd12bfbb2bc1f0d2a75bd12dd8c97304 +F src/expr.c 82797e5d82422d34ede9a95ba459f40c317b2daadb21109a21abfd42f84e3ed8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1 @@ -665,7 +665,7 @@ F test/altermalloc3.test 4660ac6240a8c82ba3947b927612dcc7c05a8eec3fe3c9f38e047ca F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 F test/altertab.test a13e11cb1933575002367613b1094f0eeb31f493e4bd9ebeca73279fe00c85e7 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b -F test/altertab3.test 9a8aad735c48440c05787b4ab5ac821340a72c6febd1ff8bf74e065fb75882b2 +F test/altertab3.test 78372063fae383ba41d1ad0ff1446e148f3c96815e648f830a55ba33668b4a69 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 4440c4932247adb2b4e0c838f657c19dc7af4f56859255436dc4e855f39b9324 @@ -1928,7 +1928,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 bbfd083c26086fb103fec88faa59a01e689e0b7fce38c09d8846bb472a0e6760 -R 1037eaccd5510af0a78ced89d8bc5f27 +P 54604869861cc5866d5de87785599ca56f75067f8cb7fe22e32912b3a037e37b +R c102c10e7d90535120f47ae5b9d857b8 U dan -Z 19b69f1d272ce42a44f4a2c19e639601 +Z 5f5b68ce84257c8f070b0080ca6a87b5 diff --git a/manifest.uuid b/manifest.uuid index ef85c1c5c1..2cc8710f19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -54604869861cc5866d5de87785599ca56f75067f8cb7fe22e32912b3a037e37b \ No newline at end of file +a0df216f7c3f8963efba0b1ffee65d6a63309d846ffdcf2d2932cb4f1d4967b7 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 3e60cf712c..d121fbfd22 100644 --- a/src/expr.c +++ b/src/expr.c @@ -516,12 +516,16 @@ Expr *sqlite3ExprForVectorField( pRet->pLeft = pVector; } }else{ - if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; - pRet = sqlite3ExprDup(pParse->db, pVector, 0); - if( pRet && IN_RENAME_OBJECT ){ - SWAP(Expr, *pRet, *pVector); - sqlite3RenameTokenRemap(pParse, pRet, pVector); + if( pVector->op==TK_VECTOR ){ + Expr **ppVector = &pVector->x.pList->a[iField].pExpr; + pVector = *ppVector; + if( IN_RENAME_OBJECT ){ + /* This must be a vector UPDATE inside a trigger */ + *ppVector = 0; + return pVector; + } } + pRet = sqlite3ExprDup(pParse->db, pVector, 0); } return pRet; } diff --git a/test/altertab3.test b/test/altertab3.test index db38d76dd1..5cf821b7e6 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -672,6 +672,22 @@ do_execsql_test 27.4 { finish_test +#------------------------------------------------------------------------- +reset_db +do_execsql_test 28.1 { + CREATE TABLE t1(a,b,c,d); + CREATE TRIGGER AFTER INSERT ON t1 BEGIN + UPDATE t1 SET (c,d)=(a,b); + END; + ALTER TABLE t1 RENAME TO t2; +} + +do_execsql_test 28.2 { + SELECT sql FROM sqlite_schema WHERE type=trigger +} {{CREATE TRIGGER AFTER INSERT ON t2 BEGIN + UPDATE t1 SET (c,d)=(a,b); + END}} + finish_test From d091245d312e2b8355cd0dbc3660c23a8b1e3691 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Sep 2021 19:15:25 +0000 Subject: [PATCH 110/130] Have the dbstat module arrange things internally so that there are 256 addressable bytes following each page buffer. This way, small buffer overreads caused by corrupt database pages do not lead to undefined behaviour. FossilOrigin-Name: c4c705abc60624bf9ba4c1c05286b902b965f7ba9fd776c4ef8bc1fb78a4ccde --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/dbstat.c | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 443ef98e8c..89af98225f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sproblem\swith\sALTER\sTABLE\sand\svector\sUPDATE\sstatements\swithin\striggers. -D 2021-09-29T18:33:26.405 +C Have\sthe\sdbstat\smodule\sarrange\sthings\sinternally\sso\sthat\sthere\sare\s256\saddressable\sbytes\sfollowing\seach\spage\sbuffer.\sThis\sway,\ssmall\sbuffer\soverreads\scaused\sby\scorrupt\sdatabase\spages\sdo\snot\slead\sto\sundefined\sbehaviour. +D 2021-09-29T19:15:25.012 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a -F src/dbstat.c bea044cfe99eab6c527837e196a5335c128989bdb354cf1b4973b85ea561d66b +F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c 82797e5d82422d34ede9a95ba459f40c317b2daadb21109a21abfd42f84e3ed8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 @@ -1928,7 +1928,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 54604869861cc5866d5de87785599ca56f75067f8cb7fe22e32912b3a037e37b -R c102c10e7d90535120f47ae5b9d857b8 +P a0df216f7c3f8963efba0b1ffee65d6a63309d846ffdcf2d2932cb4f1d4967b7 +R 7f80422897fa74c39c1c69f1ebb4bc77 U dan -Z 5f5b68ce84257c8f070b0080ca6a87b5 +Z 911e4aa022339aecd631fddd7d57b6e4 diff --git a/manifest.uuid b/manifest.uuid index 2cc8710f19..2fe5516a58 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0df216f7c3f8963efba0b1ffee65d6a63309d846ffdcf2d2932cb4f1d4967b7 \ No newline at end of file +c4c705abc60624bf9ba4c1c05286b902b965f7ba9fd776c4ef8bc1fb78a4ccde \ No newline at end of file diff --git a/src/dbstat.c b/src/dbstat.c index 33f9ea8f75..bb88a76f40 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -25,6 +25,15 @@ #if (defined(SQLITE_ENABLE_DBSTAT_VTAB) || defined(SQLITE_TEST)) \ && !defined(SQLITE_OMIT_VIRTUALTABLE) +/* +** The pager and btree modules arrange objects in memory so that there are +** always approximately 200 bytes of addressable memory following each page +** buffer. This way small buffer overreads caused by corrupt database pages +** do not cause undefined behaviour. This module pads each page buffer +** by the following number of bytes for the same purpose. +*/ +#define DBSTAT_PAGE_PADDING_BYTES 256 + /* ** Page paths: ** @@ -459,7 +468,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){ if( nPayload>(u32)nLocal ){ int j; int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4); - if( iOff+nLocal>nUsable || nPayload>0x7fffffff ){ + if( iOff+nLocal+4>nUsable || nPayload>0x7fffffff ){ goto statPageIsCorrupt; } pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4); @@ -533,10 +542,11 @@ static int statGetPage( int rc; if( pPg->aPg==0 ){ - pPg->aPg = (u8*)sqlite3_malloc(pgsz); + pPg->aPg = (u8*)sqlite3_malloc(pgsz + DBSTAT_PAGE_PADDING_BYTES); if( pPg->aPg==0 ){ return SQLITE_NOMEM_BKPT; } + memset(&pPg->aPg[pgsz], 0, DBSTAT_PAGE_PADDING_BYTES); } rc = sqlite3PagerGet(sqlite3BtreePager(pBt), iPg, &pDbPage, 0); From 0abb7ec36c71657fbfa14d7b9cedb5354e824d47 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Sep 2021 19:18:53 +0000 Subject: [PATCH 111/130] Fix a typo in altertab3.test. FossilOrigin-Name: 18d38b13104a9c3367ec205bfa17fbdc3d792ba68a369b1c6f046096ef6cc581 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/altertab3.test | 10 +++------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 89af98225f..81e1c3c72f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sthe\sdbstat\smodule\sarrange\sthings\sinternally\sso\sthat\sthere\sare\s256\saddressable\sbytes\sfollowing\seach\spage\sbuffer.\sThis\sway,\ssmall\sbuffer\soverreads\scaused\sby\scorrupt\sdatabase\spages\sdo\snot\slead\sto\sundefined\sbehaviour. -D 2021-09-29T19:15:25.012 +C Fix\sa\stypo\sin\saltertab3.test. +D 2021-09-29T19:18:53.042 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -665,7 +665,7 @@ F test/altermalloc3.test 4660ac6240a8c82ba3947b927612dcc7c05a8eec3fe3c9f38e047ca F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 F test/altertab.test a13e11cb1933575002367613b1094f0eeb31f493e4bd9ebeca73279fe00c85e7 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b -F test/altertab3.test 78372063fae383ba41d1ad0ff1446e148f3c96815e648f830a55ba33668b4a69 +F test/altertab3.test 5929f522fd6fd708396ad9f317d4af9ff1a93e460df85bb1d54d4499eeb94960 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 4440c4932247adb2b4e0c838f657c19dc7af4f56859255436dc4e855f39b9324 @@ -1928,7 +1928,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 a0df216f7c3f8963efba0b1ffee65d6a63309d846ffdcf2d2932cb4f1d4967b7 -R 7f80422897fa74c39c1c69f1ebb4bc77 +P c4c705abc60624bf9ba4c1c05286b902b965f7ba9fd776c4ef8bc1fb78a4ccde +R 101ffad09ce96f3ad73e2a23f6fa38ef U dan -Z 911e4aa022339aecd631fddd7d57b6e4 +Z 18ffb816225f5288c5908f924863f1c9 diff --git a/manifest.uuid b/manifest.uuid index 2fe5516a58..7ec7547c38 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4c705abc60624bf9ba4c1c05286b902b965f7ba9fd776c4ef8bc1fb78a4ccde \ No newline at end of file +18d38b13104a9c3367ec205bfa17fbdc3d792ba68a369b1c6f046096ef6cc581 \ No newline at end of file diff --git a/test/altertab3.test b/test/altertab3.test index 5cf821b7e6..2b9aac3ef8 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -670,8 +670,6 @@ do_execsql_test 27.4 { ALTER TABLE t0 DROP COLUMN c60; } {} -finish_test - #------------------------------------------------------------------------- reset_db do_execsql_test 28.1 { @@ -683,11 +681,9 @@ do_execsql_test 28.1 { } do_execsql_test 28.2 { - SELECT sql FROM sqlite_schema WHERE type=trigger -} {{CREATE TRIGGER AFTER INSERT ON t2 BEGIN - UPDATE t1 SET (c,d)=(a,b); + SELECT sql FROM sqlite_schema WHERE type='trigger' +} {{CREATE TRIGGER AFTER INSERT ON "t2" BEGIN + UPDATE "t2" SET (c,d)=(a,b); END}} - - finish_test From 0019774e7821ad8172100e93575c00cb2292b091 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 29 Sep 2021 20:17:19 +0000 Subject: [PATCH 112/130] Add NEVER() macros on branches that are not reachable since [a0df216f7c3f8963]. FossilOrigin-Name: 5d771f3554f3c98872cd0c9f12f415e685f26fcb923e3fb7f1a7a760c7a53255 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 6 ++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 81e1c3c72f..2996158ac4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\saltertab3.test. -D 2021-09-29T19:18:53.042 +C Add\sNEVER()\smacros\son\sbranches\sthat\sare\snot\sreachable\ssince\s[a0df216f7c3f8963]. +D 2021-09-29T20:17:19.536 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c ad192981c345625621048ae1145ac7fc94b39912c44940e458f439627aa18137 +F src/alter.c a6afe961ef3544104fa635a0c3161bfe1a34382f32e2a28706993abadedbffed F src/analyze.c 989eb1146f4a2c320623e190f8913bf1829fd8954a52dbfd0f792efc69db0e66 F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -1928,7 +1928,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 c4c705abc60624bf9ba4c1c05286b902b965f7ba9fd776c4ef8bc1fb78a4ccde -R 101ffad09ce96f3ad73e2a23f6fa38ef -U dan -Z 18ffb816225f5288c5908f924863f1c9 +P 18d38b13104a9c3367ec205bfa17fbdc3d792ba68a369b1c6f046096ef6cc581 +R ac3aeeac6e684e9aed670c65bf106e47 +U drh +Z 4b018556487da418a72f7b1ef9ffce10 diff --git a/manifest.uuid b/manifest.uuid index 7ec7547c38..b777729a62 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -18d38b13104a9c3367ec205bfa17fbdc3d792ba68a369b1c6f046096ef6cc581 \ No newline at end of file +5d771f3554f3c98872cd0c9f12f415e685f26fcb923e3fb7f1a7a760c7a53255 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 9cdc342ee1..81f6cf69d4 100644 --- a/src/alter.c +++ b/src/alter.c @@ -864,9 +864,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ Parse *pParse = pWalker->pParse; int i; if( pParse->nErr ) return WRC_Abort; - if( p->selFlags & (SF_View|SF_CopyCte) ){ - testcase( p->selFlags & SF_View ); - testcase( p->selFlags & SF_CopyCte ); + if( NEVER(p->selFlags & (SF_View|SF_CopyCte)) ){ return WRC_Prune; } if( ALWAYS(p->pEList) ){ @@ -881,7 +879,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ SrcList *pSrc = p->pSrc; for(i=0; inSrc; i++){ sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); - if( sqlite3WalkExpr(pWalker, pSrc->a[i].pOn) ) return WRC_Abort; + sqlite3WalkExpr(pWalker, pSrc->a[i].pOn); unmapColumnIdlistNames(pParse, pSrc->a[i].pUsing); } } From 91f621531dc1cb9ba5f6a47eb51b1de9ed8bdd07 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 30 Sep 2021 10:47:10 +0000 Subject: [PATCH 113/130] Update a test case in rtreedoc.test to account for the fact that release builds generate fewer VM instructions than debug builds. FossilOrigin-Name: 7d16b302826fec3606dbc6e20df0d2182f6946a2ed4076d2412d1df30c552ecb --- ext/rtree/rtreedoc.test | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index bfc5a7520c..76a9f3848e 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -925,7 +925,7 @@ set ::contained_in 0 do_vmstep_test 1.3 { SELECT objname FROM demo_data WHERE contained_in(demo_data.boundary, 35.37785, -80.77470); -} {$step>4000} +} {$step>3200} # EVIDENCE-OF: R-40261-32799 The problem with this latter query is that # it must apply the contained_in() function to all entries in the diff --git a/manifest b/manifest index 2996158ac4..a26921d663 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sNEVER()\smacros\son\sbranches\sthat\sare\snot\sreachable\ssince\s[a0df216f7c3f8963]. -D 2021-09-29T20:17:19.536 +C Update\sa\stest\scase\sin\srtreedoc.test\sto\saccount\sfor\sthe\sfact\sthat\srelease\sbuilds\sgenerate\sfewer\sVM\sinstructions\sthan\sdebug\sbuilds. +D 2021-09-30T10:47:10.633 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -419,7 +419,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 9d59baa8bce94056c63f872ad99fd9eaed60105be432af55402777f8ce093fb0 +F ext/rtree/rtreedoc.test c68024b2600a2f44c9f131507e193238ca01f9b09511f4293e6247d16925cc02 F ext/rtree/rtreedoc2.test 194ebb7d561452dcdc10bf03f44e30c082c2f0c14efeb07f5e02c7daf8284d93 F ext/rtree/rtreedoc3.test 555a878c4d79c4e37fa439a1c3b02ee65d3ebaf75d9e8d96a9c55d66db3efbf8 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee @@ -1928,7 +1928,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 18d38b13104a9c3367ec205bfa17fbdc3d792ba68a369b1c6f046096ef6cc581 -R ac3aeeac6e684e9aed670c65bf106e47 -U drh -Z 4b018556487da418a72f7b1ef9ffce10 +P 5d771f3554f3c98872cd0c9f12f415e685f26fcb923e3fb7f1a7a760c7a53255 +R 7836a39a0844715bc15a7a735276f745 +U dan +Z 6f61e641e71e433b9c88547a5dd22a12 diff --git a/manifest.uuid b/manifest.uuid index b777729a62..06ada9e62a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d771f3554f3c98872cd0c9f12f415e685f26fcb923e3fb7f1a7a760c7a53255 \ No newline at end of file +7d16b302826fec3606dbc6e20df0d2182f6946a2ed4076d2412d1df30c552ecb \ No newline at end of file From 09e2626eaac1d76a2de12c2790df653b7a1dc504 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 30 Sep 2021 17:39:21 +0000 Subject: [PATCH 114/130] Fix rtreedoc.test so that it works with SQLITE_DEFAULT_AUTOVACUUM=1 builds. FossilOrigin-Name: a300adc21151fb70ab8573477fd89a10300ee678f068fe123f22ada2f1f876d2 --- ext/rtree/rtreedoc.test | 8 ++++---- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index 76a9f3848e..d2b37428a9 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -325,13 +325,13 @@ do_execsql_test 2.0 { # # Ordinary tables. With ordinary sqlite_schema entries. do_execsql_test 2.1 { - SELECT * FROM sqlite_schema WHERE sql NOT LIKE '%virtual%' + SELECT type, name, sql FROM sqlite_schema WHERE sql NOT LIKE '%virtual%' } { - table demo_index_rowid demo_index_rowid 2 + table demo_index_rowid {CREATE TABLE "demo_index_rowid"(rowid INTEGER PRIMARY KEY,nodeno)} - table demo_index_node demo_index_node 3 + table demo_index_node {CREATE TABLE "demo_index_node"(nodeno INTEGER PRIMARY KEY,data)} - table demo_index_parent demo_index_parent 4 + table demo_index_parent {CREATE TABLE "demo_index_parent"(nodeno INTEGER PRIMARY KEY,parentnode)} } diff --git a/manifest b/manifest index a26921d663..e31e958ec7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sa\stest\scase\sin\srtreedoc.test\sto\saccount\sfor\sthe\sfact\sthat\srelease\sbuilds\sgenerate\sfewer\sVM\sinstructions\sthan\sdebug\sbuilds. -D 2021-09-30T10:47:10.633 +C Fix\srtreedoc.test\sso\sthat\sit\sworks\swith\sSQLITE_DEFAULT_AUTOVACUUM=1\sbuilds. +D 2021-09-30T17:39:21.613 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -419,7 +419,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test c68024b2600a2f44c9f131507e193238ca01f9b09511f4293e6247d16925cc02 +F ext/rtree/rtreedoc.test 903c5229758bcef1d5590892bf973d9f91dcd1d96b1c09b6761e2c0e398e78e1 F ext/rtree/rtreedoc2.test 194ebb7d561452dcdc10bf03f44e30c082c2f0c14efeb07f5e02c7daf8284d93 F ext/rtree/rtreedoc3.test 555a878c4d79c4e37fa439a1c3b02ee65d3ebaf75d9e8d96a9c55d66db3efbf8 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee @@ -1928,7 +1928,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 5d771f3554f3c98872cd0c9f12f415e685f26fcb923e3fb7f1a7a760c7a53255 -R 7836a39a0844715bc15a7a735276f745 +P 7d16b302826fec3606dbc6e20df0d2182f6946a2ed4076d2412d1df30c552ecb +R 2143874191f6cae16de1c082807e1380 U dan -Z 6f61e641e71e433b9c88547a5dd22a12 +Z 61fa72261b66a2f7b05e61aabc214b91 diff --git a/manifest.uuid b/manifest.uuid index 06ada9e62a..b96f216a75 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7d16b302826fec3606dbc6e20df0d2182f6946a2ed4076d2412d1df30c552ecb \ No newline at end of file +a300adc21151fb70ab8573477fd89a10300ee678f068fe123f22ada2f1f876d2 \ No newline at end of file From afaa660aef3d596fabbbcf6e99746294f77dbafa Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 30 Sep 2021 18:42:52 +0000 Subject: [PATCH 115/130] Fix a problem with view handling in SQLITE_OMIT_VIRTUAL_TABLE builds. FossilOrigin-Name: 6e791a24ce259ff6cc46a7c2188aea094a5021e154368f57019a0653c8a81217 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e31e958ec7..f8e221911d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\srtreedoc.test\sso\sthat\sit\sworks\swith\sSQLITE_DEFAULT_AUTOVACUUM=1\sbuilds. -D 2021-09-30T17:39:21.613 +C Fix\sa\sproblem\swith\sview\shandling\sin\sSQLITE_OMIT_VIRTUAL_TABLE\sbuilds. +D 2021-09-30T18:42:52.222 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 030c3d07326708343208418c84da607752aebc13c92df929b7c68c7c08e7df54 +F src/select.c 47a6e97bb04caeb71cc0b748b69d635eaa0aa765915d177949d21c386eb0cc97 F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd462 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1928,7 +1928,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 7d16b302826fec3606dbc6e20df0d2182f6946a2ed4076d2412d1df30c552ecb -R 2143874191f6cae16de1c082807e1380 +P a300adc21151fb70ab8573477fd89a10300ee678f068fe123f22ada2f1f876d2 +R 92a62ddf3c003fbdf03af7f31b764e73 U dan -Z 61fa72261b66a2f7b05e61aabc214b91 +Z 6842d9a35eaf3ec77461f481929e2588 diff --git a/manifest.uuid b/manifest.uuid index b96f216a75..d636c50acd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a300adc21151fb70ab8573477fd89a10300ee678f068fe123f22ada2f1f876d2 \ No newline at end of file +6e791a24ce259ff6cc46a7c2188aea094a5021e154368f57019a0653c8a81217 \ No newline at end of file diff --git a/src/select.c b/src/select.c index ba82d624d0..6af8b85bc1 100644 --- a/src/select.c +++ b/src/select.c @@ -5499,9 +5499,9 @@ static int selectExpander(Walker *pWalker, Select *p){ pTab->zName); } pFrom->pSelect = sqlite3SelectDup(db, pTab->u.view.pSelect, 0); - }else + } #ifndef SQLITE_OMIT_VIRTUALTABLE - if( ALWAYS(IsVirtual(pTab)) + else if( ALWAYS(IsVirtual(pTab)) && pFrom->fg.fromDDL && ALWAYS(pTab->u.vtab.p!=0) && pTab->u.vtab.p->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0) From f06db3e8929e36f7686ccc8f9f138359c6b12e80 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 1 Oct 2021 00:25:06 +0000 Subject: [PATCH 116/130] Fixes to the version of "varsep" group_concat so that (1) it builds under separate compilation and (2) omits tabs in source code and (3) runs faster than trunk. This variant of the group_concat_varsep branch might be preferred over the tip because it preserves (undocumented) legacy behavior about the position of separators relative to terms. FossilOrigin-Name: 04399cf9645e04b171090ff8a3c27752929c10d2cd8778e26f8f3337aa902ab6 --- manifest | 21 ++++++----- manifest.uuid | 2 +- src/func.c | 94 ++++++++++++++++++++++++++++--------------------- src/printf.c | 14 ++++---- src/sqliteInt.h | 1 + 5 files changed, 75 insertions(+), 57 deletions(-) diff --git a/manifest b/manifest index 6f2d72cf83..4057ec873a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Sync\sw/trunk -D 2021-09-29T16:35:14.868 +C Fixes\sto\sthe\sversion\sof\s"varsep"\sgroup_concat\sso\sthat\s(1)\sit\sbuilds\sunder\nseparate\scompilation\sand\s(2)\somits\stabs\sin\ssource\scode\sand\s(3)\sruns\sfaster\nthan\strunk.\s\sThis\svariant\sof\sthe\sgroup_concat_varsep\sbranch\smight\sbe\spreferred\nover\sthe\stip\sbecause\sit\spreserves\s(undocumented)\slegacy\sbehavior\sabout\sthe\nposition\sof\sseparators\srelative\sto\sterms. +D 2021-10-01T00:25:06.629 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -502,7 +502,7 @@ F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c f2e0f5dd07d1b202f700f26b0851f2ea485e36ec8f335b05aec2cd91cd08853f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c -F src/func.c c852d68d0a984263f969e3b84d602c6d821147a32905fecca65b1d86098367b4 +F src/func.c 35e0beafdbd8e9d7050577668ab3f515b86d8aff18bb81603d961d9152955b16 F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -543,7 +543,7 @@ F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927 F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 -F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b +F src/printf.c 1ce574bf02b503b0e031a70d3453324a9f4a0eb1ad379f3324ced73b918ed20b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 @@ -552,7 +552,7 @@ F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd46 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 06a8f97a644388b28c0a9428a6b2cdf40e8b51b1cf38064f41baba5fd810be49 +F src/sqliteInt.h 90aabdfc427a6356f0ff1ed77c886f823d10e08f100e992816dec1033c225079 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1927,7 +1927,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3d148615f9d9c6a3d63d8eb015f3d70f453a66de49b28e665831254387c700b9 df0d7e36dbf98ab5405d8366ce92fb85176d4388b47a57b0ca1aa1ba6ae5212e -R 4764117e20f212be49211212953ddad0 -U larrybr -Z 559da611469829addf62248db5ff3864 +P a4c18b2f0ce4a0f4d0c4f4c25dc69fbed4cb4876d2b69e3e5e0e756410892d74 +R 247138f3b5e489fa491f98b9cd97dbe7 +T *branch * group_concat-fix-legacy +T *sym-group_concat-fix-legacy * +T -sym-group_concat_varsep * +U drh +Z 89839e6f88669e9a8e94fe2639f687c4 diff --git a/manifest.uuid b/manifest.uuid index 43f8a3d717..fede5e072e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4c18b2f0ce4a0f4d0c4f4c25dc69fbed4cb4876d2b69e3e5e0e756410892d74 \ No newline at end of file +04399cf9645e04b171090ff8a3c27752929c10d2cd8778e26f8f3337aa902ab6 \ No newline at end of file diff --git a/src/func.c b/src/func.c index d348aa6574..860466bc10 100644 --- a/src/func.c +++ b/src/func.c @@ -1715,17 +1715,23 @@ static void minMaxFinalize(sqlite3_context *context){ /* ** group_concat(EXPR, ?SEPARATOR?) +** +** The SEPARATOR goes before the EXPR string. This is tragic. The +** groupConcatInverse() implementation would have been easier if the +** SEPARATOR were appended after EXPR. And the order is undocumented, +** so we could change it, in theory. But the old behavior has been +** around for so long that we dare not, for fear of breaking something. */ typedef struct { StrAccum str; /* The accumulated concatenation */ #ifndef SQLITE_OMIT_WINDOWFUNC int nAccum; /* Number of strings presently concatenated */ - int nFirstSepLength; /* Used to detect separator length change */ + int nFirstSepLength; /* Used to detect separator length change */ /* If pnSepLengths!=0, refs an array of inter-string separator lengths, - * stored as actually incorporated into presently accumulated result. - * (Hence, its slots in use number nAccum-1 between method calls.) - * If pnSepLengths==0, nFirstSepLength is the length used throughout. - */ + ** stored as actually incorporated into presently accumulated result. + ** (Hence, its slots in use number nAccum-1 between method calls.) + ** If pnSepLengths==0, nFirstSepLength is the length used throughout. + */ int *pnSepLengths; #endif } GroupConcatCtx; @@ -1746,38 +1752,45 @@ static void groupConcatStep( sqlite3 *db = sqlite3_context_db_handle(context); int firstTerm = pGCC->str.mxAlloc==0; pGCC->str.mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; - if( !firstTerm ){ - if( argc==2 ){ - zSep = (char*)sqlite3_value_text(argv[1]); - nSep = sqlite3_value_bytes(argv[1]); - }else{ - zSep = ","; - nSep = 1; + if( argc==1 ){ + if( !firstTerm ){ + sqlite3_str_appendchar(&pGCC->str, 1, ','); } - if( zSep ) - sqlite3_str_append(&pGCC->str, zSep, nSep); #ifndef SQLITE_OMIT_WINDOWFUNC - else - nSep = 0; + else{ + pGCC->nFirstSepLength = 1; + } +#endif + }else if( !firstTerm ){ + zSep = (char*)sqlite3_value_text(argv[1]); + nSep = sqlite3_value_bytes(argv[1]); + if( zSep ){ + sqlite3_str_append(&pGCC->str, zSep, nSep); + } +#ifndef SQLITE_OMIT_WINDOWFUNC + else{ + nSep = 0; + } if( nSep != pGCC->nFirstSepLength || pGCC->pnSepLengths != 0 ){ - int * pnsl = pGCC->pnSepLengths; - if( pnsl == 0 ){ - /* First separator length variation seen, start tracking them. */ - pnsl = (int*)sqlite3_malloc64((pGCC->nAccum+1) * sizeof(int)); - if( pnsl!=0 ){ - int i = 0, nA = pGCC->nAccum-1; - while( inFirstSepLength; - } - }else{ - pnsl = (int*)sqlite3_realloc64(pnsl, pGCC->nAccum * sizeof(int)); - } - if( pnsl!=0 ){ - if( pGCC->nAccum>0 ) - pnsl[pGCC->nAccum-1] = nSep; - pGCC->pnSepLengths = pnsl; - }else{ - setStrAccumError(&pGCC->str, SQLITE_NOMEM); - } + int *pnsl = pGCC->pnSepLengths; + if( pnsl == 0 ){ + /* First separator length variation seen, start tracking them. */ + pnsl = (int*)sqlite3_malloc64((pGCC->nAccum+1) * sizeof(int)); + if( pnsl!=0 ){ + int i = 0, nA = pGCC->nAccum-1; + while( inFirstSepLength; + } + }else{ + pnsl = (int*)sqlite3_realloc64(pnsl, pGCC->nAccum * sizeof(int)); + } + if( pnsl!=0 ){ + if( pGCC->nAccum>0 ){ + pnsl[pGCC->nAccum-1] = nSep; + } + pGCC->pnSepLengths = pnsl; + }else{ + sqlite3StrAccumSetError(&pGCC->str, SQLITE_NOMEM); + } } #endif } @@ -1811,9 +1824,9 @@ static void groupConcatInverse( if( pGCC->pnSepLengths!=0 ){ assert(pGCC->nAccum >= 0); if( pGCC->nAccum>0 ){ - nVS += *pGCC->pnSepLengths; - memmove(pGCC->pnSepLengths, pGCC->pnSepLengths+1, - (pGCC->nAccum-1)*sizeof(int)); + nVS += *pGCC->pnSepLengths; + memmove(pGCC->pnSepLengths, pGCC->pnSepLengths+1, + (pGCC->nAccum-1)*sizeof(int)); } }else{ /* If removing single accumulated string, harmlessly over-do. */ @@ -1844,8 +1857,9 @@ static void groupConcatFinalize(sqlite3_context *context){ sqlite3_result_error_toobig(context); }else if( pAccum->accError==SQLITE_NOMEM ){ sqlite3_result_error_nomem(context); - }else{ - sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, + }else{ + int n = pAccum->nChar; + sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), n, sqlite3_free); } #ifndef SQLITE_OMIT_WINDOWFUNC @@ -1865,7 +1879,7 @@ static void groupConcatValue(sqlite3_context *context){ sqlite3_result_error_nomem(context); }else{ const char *zText = sqlite3_str_value(pAccum); - sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); + sqlite3_result_text(context, zText, pAccum->nChar, SQLITE_TRANSIENT); } } } diff --git a/src/printf.c b/src/printf.c index f663e1b1ed..eb06e1a23d 100644 --- a/src/printf.c +++ b/src/printf.c @@ -145,7 +145,7 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ /* ** Set the StrAccum object to an error mode. */ -static void setStrAccumError(StrAccum *p, u8 eError){ +void sqlite3StrAccumSetError(StrAccum *p, u8 eError){ assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); p->accError = eError; if( p->mxAlloc ) sqlite3_str_reset(p); @@ -181,12 +181,12 @@ static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ char *z; if( pAccum->accError ) return 0; if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ - setStrAccumError(pAccum, SQLITE_TOOBIG); + sqlite3StrAccumSetError(pAccum, SQLITE_TOOBIG); return 0; } z = sqlite3DbMallocRaw(pAccum->db, n); if( z==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); + sqlite3StrAccumSetError(pAccum, SQLITE_NOMEM); } return z; } @@ -925,7 +925,7 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ return 0; } if( p->mxAlloc==0 ){ - setStrAccumError(p, SQLITE_TOOBIG); + sqlite3StrAccumSetError(p, SQLITE_TOOBIG); return p->nAlloc - p->nChar - 1; }else{ char *zOld = isMalloced(p) ? p->zText : 0; @@ -938,7 +938,7 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ } if( szNew > p->mxAlloc ){ sqlite3_str_reset(p); - setStrAccumError(p, SQLITE_TOOBIG); + sqlite3StrAccumSetError(p, SQLITE_TOOBIG); return 0; }else{ p->nAlloc = (int)szNew; @@ -956,7 +956,7 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ p->printfFlags |= SQLITE_PRINTF_MALLOCED; }else{ sqlite3_str_reset(p); - setStrAccumError(p, SQLITE_NOMEM); + sqlite3StrAccumSetError(p, SQLITE_NOMEM); return 0; } } @@ -1029,7 +1029,7 @@ static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){ memcpy(zText, p->zText, p->nChar+1); p->printfFlags |= SQLITE_PRINTF_MALLOCED; }else{ - setStrAccumError(p, SQLITE_NOMEM); + sqlite3StrAccumSetError(p, SQLITE_NOMEM); } p->zText = zText; return zText; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 21682fa113..c0f8455f6e 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4933,6 +4933,7 @@ int sqlite3OpenTempDatabase(Parse *); void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); char *sqlite3StrAccumFinish(StrAccum*); +void sqlite3StrAccumSetError(StrAccum*, u8); void sqlite3SelectDestInit(SelectDest*,int,int); Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); From 3dd01111e29b01b77c5c07c345b1f97ad29bbc4c Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 1 Oct 2021 02:45:48 +0000 Subject: [PATCH 117/130] Remove unreachable branches in the fixed group_concat() code. FossilOrigin-Name: 8bd721c29e7a28cd75885dd80235e4e37aa0847229f769f49e01127f794fa63a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/func.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index dbfc97538a..38694f3a3d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\supdates\sfrom\strunk -D 2021-10-01T02:16:52.236 +C Remove\sunreachable\sbranches\sin\sthe\sfixed\sgroup_concat()\scode. +D 2021-10-01T02:45:48.526 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -504,7 +504,7 @@ F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c 82797e5d82422d34ede9a95ba459f40c317b2daadb21109a21abfd42f84e3ed8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c -F src/func.c 35e0beafdbd8e9d7050577668ab3f515b86d8aff18bb81603d961d9152955b16 +F src/func.c 3b8bfd557ae3dc64a2e5c84ae300c770d66f17c13c9066badddcff9a5a74d10d F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -1929,7 +1929,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 04399cf9645e04b171090ff8a3c27752929c10d2cd8778e26f8f3337aa902ab6 6e791a24ce259ff6cc46a7c2188aea094a5021e154368f57019a0653c8a81217 -R d3b716f0cf9b6ef6a1679ee563e22ef8 +P 35351371c5e9602dec210ad0926ff8a1a269556ce1a166e81eb0543938e0c57e +R a4645f8bac89b041843b69411193844d U drh -Z f141141cc66d39890f48912f4e8ef81f +Z 93aa411e4c74267eee528d19e6131eb7 diff --git a/manifest.uuid b/manifest.uuid index 1c635395f0..5ba132f6ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35351371c5e9602dec210ad0926ff8a1a269556ce1a166e81eb0543938e0c57e \ No newline at end of file +8bd721c29e7a28cd75885dd80235e4e37aa0847229f769f49e01127f794fa63a \ No newline at end of file diff --git a/src/func.c b/src/func.c index 860466bc10..fddced62db 100644 --- a/src/func.c +++ b/src/func.c @@ -1784,7 +1784,7 @@ static void groupConcatStep( pnsl = (int*)sqlite3_realloc64(pnsl, pGCC->nAccum * sizeof(int)); } if( pnsl!=0 ){ - if( pGCC->nAccum>0 ){ + if( ALWAYS(pGCC->nAccum>0) ){ pnsl[pGCC->nAccum-1] = nSep; } pGCC->pnSepLengths = pnsl; @@ -1796,7 +1796,7 @@ static void groupConcatStep( } #ifndef SQLITE_OMIT_WINDOWFUNC else{ - pGCC->nFirstSepLength = (argc==2)? sqlite3_value_bytes(argv[1]) : 1; + pGCC->nFirstSepLength = sqlite3_value_bytes(argv[1]); } pGCC->nAccum += 1; #endif From adfb203a7d625c1860d4cabe6d020e01d5dad40d Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 1 Oct 2021 15:05:19 +0000 Subject: [PATCH 118/130] Fix a buffer overread in fts5 that could occur when processing an "ORDER BY rowid DESC" query against corrupt database records. FossilOrigin-Name: fe098a93340b8dac15752f1be4f681e2a591f7ae1a94b177f400ccd7ef638480 --- ext/fts5/fts5_index.c | 5 +- ext/fts5/test/fts5corrupt5.test | 214 ++++++++++++++++++++++++++++++++ manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 225 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 40658a8710..dcc391456a 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -697,6 +697,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ return pRet; } + /* ** Release a reference to data record returned by an earlier call to ** fts5DataRead(). @@ -2155,7 +2156,7 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ if( pDlidx ){ int iSegid = pIter->pSeg->iSegid; pgnoLast = fts5DlidxIterPgno(pDlidx); - pLast = fts5DataRead(p, FTS5_SEGMENT_ROWID(iSegid, pgnoLast)); + pLast = fts5LeafRead(p, FTS5_SEGMENT_ROWID(iSegid, pgnoLast)); }else{ Fts5Data *pLeaf = pIter->pLeaf; /* Current leaf data */ @@ -2182,7 +2183,7 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ ** forward to find the page containing the last rowid. */ for(pgno=pIter->iLeafPgno+1; !p->rc && pgno<=pSeg->pgnoLast; pgno++){ i64 iAbs = FTS5_SEGMENT_ROWID(pSeg->iSegid, pgno); - Fts5Data *pNew = fts5DataRead(p, iAbs); + Fts5Data *pNew = fts5LeafRead(p, iAbs); if( pNew ){ int iRowid, bTermless; iRowid = fts5LeafFirstRowidOff(pNew); diff --git a/ext/fts5/test/fts5corrupt5.test b/ext/fts5/test/fts5corrupt5.test index 062e826f5e..4c00d913e0 100644 --- a/ext/fts5/test/fts5corrupt5.test +++ b/ext/fts5/test/fts5corrupt5.test @@ -239,6 +239,220 @@ do_catchsql_test 1.1 { SELECT * FROM t1('R*') WHERE (a,b)<=(current_date,0) ORDER BY rowid DESC; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +# +reset_db +do_test 2.0 { + sqlite3 db {} + db deserialize [decode_hexdb { + +.open --hexdb +| size 24576 pagesize 4096 filename sql047467.txt.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 01 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 00 00 00 00 ...~.H.......... +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 11 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3b ff f0 00 16 04 33 74 68 65 03 06 01 01 04 .;.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 00 6f 03 06 01 01 06 14 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 03 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 04 f6 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: f6 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 0f 42 03 07 1c 8c 81 80 80 .0table.B....... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 13 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 94 50 ............<..P +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 08 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 80 72 65 01 02 05 01 ..<.....3.re.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 17 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 64 61 62 ............0dab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 13 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 14 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 01 64 09 10 01 32 69 14 07 04 09 10 01 32 66 ..d...2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 06 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 00 00 00 00 00 ................ +| end sql047467.txt.db +}]} {} + +do_catchsql_test 2.1 { +SELECT * FROM t1('R*R*R*R*') WHERE (a,b)<=(current_date,0) ORDER BY rowid DESC; +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index f8e221911d..2ffa30ecb6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sview\shandling\sin\sSQLITE_OMIT_VIRTUAL_TABLE\sbuilds. -D 2021-09-30T18:42:52.222 +C Fix\sa\sbuffer\soverread\sin\sfts5\sthat\scould\soccur\swhen\sprocessing\san\s"ORDER\sBY\srowid\sDESC"\squery\sagainst\scorrupt\sdatabase\srecords. +D 2021-10-01T15:05:19.078 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938d F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 48ab70b8d646f8b50d36664005682e7b5d1639bc8aaf60268e11d783afd5b203 +F ext/fts5/fts5_index.c b5df80b2f27cd4d0858fa22679fbd144a3f4a812e0392866108dab95e6a78ff0 F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -162,7 +162,7 @@ F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519d F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f F ext/fts5/test/fts5corrupt3.test 0e473620582a53ac61f468f364db8a151c1e18d2a879b16439d172c12c4c9828 F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 -F ext/fts5/test/fts5corrupt5.test 2765589a88645ed09bb73ce9e522e9b219166ad943e551f39b7ce13789b31499 +F ext/fts5/test/fts5corrupt5.test a6368d90baa61e606ebd53024584de2a02f981757d0941154432a727f3972828 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4 F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1928,7 +1928,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 a300adc21151fb70ab8573477fd89a10300ee678f068fe123f22ada2f1f876d2 -R 92a62ddf3c003fbdf03af7f31b764e73 +P 6e791a24ce259ff6cc46a7c2188aea094a5021e154368f57019a0653c8a81217 +R 065cb78f289f9f988c06bfa64086f6c7 U dan -Z 6842d9a35eaf3ec77461f481929e2588 +Z 769eaeb8fa8eb27acdd1e1a600d1548b diff --git a/manifest.uuid b/manifest.uuid index d636c50acd..b2275a3010 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e791a24ce259ff6cc46a7c2188aea094a5021e154368f57019a0653c8a81217 \ No newline at end of file +fe098a93340b8dac15752f1be4f681e2a591f7ae1a94b177f400ccd7ef638480 \ No newline at end of file From 82978ac20b03a5d2538e594ce1eda89002d32182 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 1 Oct 2021 17:06:44 +0000 Subject: [PATCH 119/130] Fix a potential write outside of array bounds in the --hexdb decoder of the CLI when given corrupt input. FossilOrigin-Name: c7fdd775bb5efd22a486510a32a2f278c4d5cda95acd3085a0f0dfc2ef749d6f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2ffa30ecb6..01bfcd2db1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverread\sin\sfts5\sthat\scould\soccur\swhen\sprocessing\san\s"ORDER\sBY\srowid\sDESC"\squery\sagainst\scorrupt\sdatabase\srecords. -D 2021-10-01T15:05:19.078 +C Fix\sa\spotential\swrite\soutside\sof\sarray\sbounds\sin\sthe\s--hexdb\sdecoder\sof\sthe\nCLI\swhen\sgiven\scorrupt\sinput. +D 2021-10-01T17:06:44.476 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 47a6e97bb04caeb71cc0b748b69d635eaa0aa765915d177949d21c386eb0cc97 -F src/shell.c.in 9df263dc0949698a8728ecc5bb826666ca8ced75201d5440a161b629455cd462 +F src/shell.c.in f9a13edb4d4cdbdfc161b0d200296c1dd9c492ad86dd73f4768ee841fec66578 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1928,7 +1928,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 6e791a24ce259ff6cc46a7c2188aea094a5021e154368f57019a0653c8a81217 -R 065cb78f289f9f988c06bfa64086f6c7 -U dan -Z 769eaeb8fa8eb27acdd1e1a600d1548b +P fe098a93340b8dac15752f1be4f681e2a591f7ae1a94b177f400ccd7ef638480 +R 77978b99526ec643e6ee046dad65d5ab +U drh +Z 7477ef1e574f4d90d4c36f8b8b9bf567 diff --git a/manifest.uuid b/manifest.uuid index b2275a3010..dfb58b93ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fe098a93340b8dac15752f1be4f681e2a591f7ae1a94b177f400ccd7ef638480 \ No newline at end of file +c7fdd775bb5efd22a486510a32a2f278c4d5cda95acd3085a0f0dfc2ef749d6f \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index c3544b22e9..bb02fa1657 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4469,7 +4469,7 @@ static unsigned char *readHexDb(ShellState *p, int *pnData){ &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); if( rc==17 ){ k = iOffset+j; - if( k+16<=n ){ + if( k+16<=n && k>=0 ){ int ii; for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; } From 37f3ac8faa5d4cfc18b2163b6fa47109e51b0a83 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 1 Oct 2021 20:39:50 +0000 Subject: [PATCH 120/130] Change things so that SQLITE_OMIT_VIRTUALTABLE implies SQLITE_OMIT_ALTER_TABLE. FossilOrigin-Name: 2f7c946c5f25a858167f5193ca06e53310394c8cff15426ab8a1327a1ec835fd --- ext/session/sessionat.test | 7 +- manifest | 76 +++++++++++----------- manifest.uuid | 2 +- src/parse.y | 6 +- src/sqliteInt.h | 7 ++ test/altercorrupt.test | 6 ++ test/alterqf.test | 7 ++ test/analyze4.test | 6 ++ test/auth3.test | 24 +++---- test/columncount.test | 6 ++ test/corruptL.test | 9 ++- test/e_changes.test | 4 +- test/e_totalchanges.test | 38 +++++------ test/func.test | 3 + test/gencol1.test | 28 ++++---- test/hook.test | 129 +++++++++++++++++++------------------ test/indexexpr1.test | 52 ++++++++------- test/istrue.test | 30 +++++---- test/pager1.test | 30 +++++---- test/pragma.test | 68 ++++++++++--------- test/quote.test | 78 +++++++++++----------- test/schema3.test | 6 ++ test/skipscan2.test | 1 - test/sorterref.test | 6 ++ test/strict1.test | 8 ++- test/tkt-8454a207b9.test | 6 ++ test/tkt-f67b41381a.test | 5 ++ test/update.test | 22 ++++--- test/view.test | 8 ++- test/whereE.test | 6 ++ test/window1.test | 16 +++-- test/with2.test | 112 ++++++++++++++++---------------- test/without_rowid1.test | 22 ++++--- tool/mkkeywordhash.c | 2 +- 34 files changed, 477 insertions(+), 359 deletions(-) diff --git a/ext/session/sessionat.test b/ext/session/sessionat.test index 4a3f59a441..8141d92322 100644 --- a/ext/session/sessionat.test +++ b/ext/session/sessionat.test @@ -20,9 +20,14 @@ if {![info exists testdir]} { source [file join [file dirname [info script]] session_common.tcl] source $testdir/tester.tcl ifcapable !session {finish_test; return} - set testprefix sessionat +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + db close sqlite3_shutdown test_sqlite3_log log diff --git a/manifest b/manifest index 01bfcd2db1..a50590d942 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\swrite\soutside\sof\sarray\sbounds\sin\sthe\s--hexdb\sdecoder\sof\sthe\nCLI\swhen\sgiven\scorrupt\sinput. -D 2021-10-01T17:06:44.476 +C Change\sthings\sso\sthat\sSQLITE_OMIT_VIRTUALTABLE\simplies\sSQLITE_OMIT_ALTER_TABLE. +D 2021-10-01T20:39:50.837 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -450,7 +450,7 @@ F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc955 F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea8893fbb914741a4 F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 -F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec +F ext/session/sessionat.test 52993535f1230a42f70886643574ba7ae60ef854f8add9c8e3fcc3eb5c564bd2 F ext/session/sessionbig.test 890ade19e3f80f3d3a3e83821ff79c5e2af906a67ecb5450879f0015cadf101e F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 @@ -538,7 +538,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 1ba6a843148282895d800aa69919553079946ef9a198a97e5d7c64442d10ed4c F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 86aa016b281f61d7664dd8cb7808cab8114d14cfaf362a9b9fc9ead8f33546b7 +F src/parse.y 82bdd593c50bddcc285a173e9788a20296103217f5f5290c9122abf8af71af62 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -554,7 +554,7 @@ F src/shell.c.in f9a13edb4d4cdbdfc161b0d200296c1dd9c492ad86dd73f4768ee841fec6657 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 06a8f97a644388b28c0a9428a6b2cdf40e8b51b1cf38064f41baba5fd810be49 +F src/sqliteInt.h c481cd4864217bdff96fc2a7054cdaca0edabe0eb9f6cce8b012d1e014ccdc5f F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -655,21 +655,21 @@ F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test 381b1ab603c9ef96314a3158528ea17f7964449385a28eeaf8191120b2e24a8d F test/altercol.test b11fa1b131e80ab5b6ecfb3b725fb0419c14ca6efba5adb57aeabfc9baa0c8f3 -F test/altercorrupt.test 584d707a80e106952d6382790c8919bcf9f0db678ed3a1c09fd98b7f9d1d3a10 +F test/altercorrupt.test 2e1d705342cf9d7de884518ddbb053fd52d7e60d2b8869b7b63b2fda68435c12 F test/alterdropcol.test a653a3945f964d26845ec0cd0a8e74189f46de3119a984c5bc45457da392612e F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41 F test/alterlegacy.test f38c6d06cda39e1f7b955bbce57f2e3ef5b7cb566d3d1234502093e228c15811 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test ca3ebc01670d9313953a2b7628d8cc00dc5ea9988f229b3cbbbe1cca506dae45 F test/altermalloc3.test 4660ac6240a8c82ba3947b927612dcc7c05a8eec3fe3c9f38e047ca69a789a33 -F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 +F test/alterqf.test 6b2482a957692606b23567ebd2cf80eb773e3c826086f5f151eee9c5a962623d F test/altertab.test a13e11cb1933575002367613b1094f0eeb31f493e4bd9ebeca73279fe00c85e7 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b F test/altertab3.test 5929f522fd6fd708396ad9f317d4af9ff1a93e460df85bb1d54d4499eeb94960 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 4440c4932247adb2b4e0c838f657c19dc7af4f56859255436dc4e855f39b9324 -F test/analyze4.test 293ec8ea21525f3435beaf9d6b1efb29e719415f03a0cd2a70589d59098e8464 +F test/analyze4.test 68bd069f3ac7ac1e652ddd9f04f57d5606ddb4208450f5297005db7aa0dd707d F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d F test/analyze6.test 028f5bdfc9e5b5294768fa9a7185b8cd1d019aa7aab5b2f8ee42d7271d9a3b28 F test/analyze7.test 079d17c495e396bdbd6cc6a083112788a6fbfb3b95c42e760e4270a53c9ead8f @@ -697,7 +697,7 @@ F test/attach4.test 00e754484859998d124d144de6d114d920f2ed6ca2f961e6a7f4183c714f F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438 F test/auth.test 567d917e0baddb6d0026a251cff977a3ab2c805a3cef906ba8653aafe7ad7240 F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 -F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 +F test/auth3.test 76d20a7fa136d63bcfcf8bcb65c0b1455ed71078d81f22bcd0550d3eb18594ab F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39 F test/autoindex1.test fe27af92eaf884bd9c38f94be3e8afa04ec494e5eefb189902026181a6175f5e @@ -781,7 +781,7 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e -F test/columncount.test d86fb6307261186370698962790ad2088ed419e4a4e823512b502f17d443b1b7 +F test/columncount.test 6fe99c2f35738b0129357a1cf3fa483f76140f4cd8a89014c88c33c876d2638f F test/conflict.test ac0667090f66130ac77d5fb764655558ca6600dd6d88f670ca9123b61c448337 F test/conflict2.test 5557909ce683b1073982f5d1b61dfb1d41e369533bfdaf003180c5bc87282dd1 F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac @@ -806,7 +806,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test df132ba9ffd6fa15038380b4154998b9904ab8f1ea78400d7da53c920cb3b13d +F test/corruptL.test 7d3440831ca24ba64305583c4d4506d417d3f89f5775c0b7cc8102db078f8ff5 F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 F test/corruptN.test c2a96ff81386027f7d7e95858783aa36f82ba1532106969575e3c8f90903a5bb F test/cost.test b11cdbf9f11ffe8ef99c9881bf390e61fe92baf2182bad1dbe6de59a7295c576 @@ -858,7 +858,7 @@ F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145 F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14 -F test/e_changes.test 6ba336a796db32f890e50197ab6a8fe5e6017e431fc9082702c246120cd58d55 +F test/e_changes.test 0f8c3e6aab7335cb772d5a3ea34ca4c82f98d0eb896e2eb3add971c16984b405 F test/e_createtable.test 7997c0106c181243e0ac7db7ba8b9ae7233d0bfb0188605650322a7a02ea326e F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 235c610f8bf8ec44513e222b9085c7e49fad65ad0c1975ac2577109dd06fd8fa @@ -871,7 +871,7 @@ F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a42 F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 F test/e_select.test c5425a423da06d0494119db8361ebfc6de302929f7546ca596d56224137e0360 F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f -F test/e_totalchanges.test 1daded1db6867991c10b53a18436b2602f41ad82a2b8c2e1ed5eb7d1ad15edaf +F test/e_totalchanges.test c927f7499dc3aa28b9b556b7d6d115a2f0fe41f012b128d16bf1f3b30e9b41e4 F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 F test/e_uri.test 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72 F test/e_vacuum.test 0d8832a2ce92350db0d0cff47b419465fd9772562e1f77ff7d9478c07a4980d2 @@ -1040,7 +1040,7 @@ F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f75 F test/fts4unicode.test 82a9c16b68ba2f358a856226bb2ee02f81583797bc4744061c54401bf1a0f4c9 F test/fts4upfrom.test f25835162c989dffd5e2ef91ec24c4848cc9973093e2d492d1c7b32afac1b49d F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test 77f6ea02c97d9ea64074461d347276a75df22d2cf51045a40f90857569e985f0 +F test/func.test 3a65ddb6c1998f71aa86492501a6be87904197e62bfb5b70b2493552b558abd1 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func3.test 600a632c305a88f3946d38f9a51efe145c989b2e13bd2b2a488db47fe76bab6a F test/func4.test 2285fb5792d593fef442358763f0fd9de806eda47dbc7a5934df57ffdc484c31 @@ -1067,12 +1067,12 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 1b63f8c00154e58714b1a04554304ffdaae0bac71a23935fe308fb1715068b6c +F test/gencol1.test cc0dbb0ee116e5602e18ea7d47f2a0f76b26e09a823b7c36ef254370c2b0f3c1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test a89236dd8d55aa50c4805f82ac9daf64d477a44d712d8209c118978d0ca21ec9 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711 -F test/hook.test 55b6d605d06dadbb04416eae8ad79889aea3521d119c87f04353c25f9c1450a4 +F test/hook.test bb9e03b93fa4bc3bf0f164e455ddaee3603dee0501cb61119baed557c8f936be F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 716a6b89fbabe5cc63e0cd4c260befb08fd7b9d761f04d43669233292f0753b1 F test/ieee754.test b0945d12be7d255f3dfa18e2511b17ca37e0edd2b803231c52d05b86c04ab26e @@ -1104,7 +1104,7 @@ F test/index7.test b238344318e0b4e42126717f6554f0e7dfd0b39cecad4b736039b43e1e3b6 F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a912a3 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test f21eca4f7a6ffe14c8500a7ad6cd53166666c99e5ccd311842a28bc94a195fe0 -F test/indexexpr1.test 7e0e7a33acb4d9b3524398e6ce90cc05c26603fabbaf3062083a036c8874bc12 +F test/indexexpr1.test 8f7241410e351679010f14cd7cd30357622d04a784508ff54ba5ce99f64a2228 F test/indexexpr2.test 2c7abe3c48f8aaa5a448615ab4d13df3662185d28419c00999670834a3f0b484 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 @@ -1128,7 +1128,7 @@ F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/istrue.test 9619a2d77580f676048aaff7a16a0bcfea2b96c6c660dfaded2e53c873418899 +F test/istrue.test e7f285bb70282625c258e866ce6337d4c762922f5a300e1b50f958aef6e7d9c9 F test/join.test 25da4f53523a4aa17c893134b47fba6aa4799bb33350517b157785878290e238 F test/join2.test 9bdc615841b91c97a16d68bad9508aea11fa0c6b34e5689847bcc4dac70e4990 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 @@ -1260,7 +1260,7 @@ F test/oserror.test 1fc9746b83d778e70d115049747ba19c7fba154afce7cc165b09feb6ca6a F test/ossfuzz.c 9636dad2092a05a32110df0ca06713038dd0c43dd89a77dabe4b8b0d71096715 F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f -F test/pager1.test a4e438c344663ad7f0bf6e880cacae7531bdf7d960db15a3db4751273ecee06d +F test/pager1.test 50df7826a03382ff508ed80a6b3c589c3e3ececc1d15239d67126be4b7c8b64b F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370 F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e @@ -1275,7 +1275,7 @@ F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff F test/permutations.test dfdb3356ceb66e515193b12e3fd46706d28274142dc46fd37da63fda9cd4a68a F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f -F test/pragma.test 30d5bbebd5e9cb5383155cf3f3c81297b98f6642d152e9d4100cf6888630da2c +F test/pragma.test cae534c12a033a5c319ccc94f50b32811acdef9f67bf19a82ff42697caccd69f F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 F test/pragma4.test ca5e4dfc46adfe490f75d73734f70349d95a199e6510973899e502eef2c8b1f8 @@ -1292,7 +1292,7 @@ F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test b8ddaba6b81dcf63bb31243219e28a2f96e04396adc50108cc7e5593019c3eb5 +F test/quote.test f33f95990e4032d1227b98c0ef314c0a077d162f3f2e61b3039ed69e6f8adbbf F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 @@ -1337,7 +1337,7 @@ F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 F test/scanstatus.test 9a0ed37ab6d57b50567282788fffdf832d9b16739ecc41bff9d77a8d767cf317 F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 -F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 +F test/schema3.test 8ed4ae66e082cdd8b1b1f22d8549e1e7a0db4527a8e6ee8b6193053ee1e5c9ce F test/schema4.test 3b26c9fa916abb6dadf894137adcf41b7796f7b9 F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce1f9b @@ -1390,7 +1390,7 @@ F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 9521e5e0d74c0b6192794f3de3a3e5e3190d465527ae365d96763ef753c7229c F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 F test/skipscan1.test 1a9972e1dc15ca3887f306d3cd9a29679afb382eca0f3539f3b746f3c2ccaf68 -F test/skipscan2.test c588cb7ed947db724d300f2a0dc537dd2ad292b0f812641d8481bc0b95dd3f49 +F test/skipscan2.test b032ed3e0ba5caa4df6c43ef22c31566aac67783bc031869155989a7ccdb5bd5 F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 0672103fd2c8f96bd114133f356192b35ece45c794fe3677e1d9e5e3104a608e F test/skipscan6.test bddbb35dd335e2d21b7791a61e3b2e1f3255dc307ce80aa6fe19cc298e6feb13 @@ -1407,7 +1407,7 @@ F test/sort2.test cc23b7c19d684657559e8a55b02f7fcee03851d0 F test/sort3.test 1480ed7c4c157682542224e05e3b75faf4a149e5 F test/sort4.test 5c34d9623a4ae5921d956dfa2b70e77ed0fc6e5c F test/sort5.test 6b43ae0e2169b5ceed441844492e55ba7f1ae0790528395ddf7888ab3094525d -F test/sorterref.test a13ed207a0eea3c7898f308f979bfb518f68c598ec737d2c494dfd3deaa83506 +F test/sorterref.test 9a606c86a4c682db5eeaaefa0565b52102778db53e48ca7101cd4f9ebcc0ad94 F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66 F test/speed1.test f2974a91d79f58507ada01864c0e323093065452 F test/speed1p.explain d841e650a04728b39e6740296b852dccdca9b2cb @@ -1430,7 +1430,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test 55f86055f9cd7b2d962a621b8a04215c1cebd4eaaecde92d279442327fe648a0 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test ac29180be09313af1d5086420e8b7a832f9bf777653c4cbc64d7fd478000b3f0 +F test/strict1.test 2e590641b1f26f9ff0db5b785df07f932988af1ab6ccab792b792ebb8405d657 F test/strict2.test e78cedd56eb1c3e0b09b16c594dbfcb7e95bc6d85f68f0fd6501c243be28e219 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f @@ -1504,7 +1504,7 @@ F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6 F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c -F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c +F test/tkt-8454a207b9.test aff2e76143cfa443ddce6f7d85968a2e9b57a3deb0b881b730120740555f9e2f F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 F test/tkt-8c63ff0ec.test 258b7fc8d7e4e1cb5362c7d65c143528b9c4cbed F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 @@ -1529,7 +1529,7 @@ F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09 F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30 F test/tkt-f3e5abed55.test d5a0126118142d13e27f6ce9f4c47096e9321c00 -F test/tkt-f67b41381a.test a23bc124c981662db712167bacd0ed8ad11abac9 +F test/tkt-f67b41381a.test 9120eab5e949969a29087e01bf57ac6a52b6c06c16be41091a74c2a863ffc660 F test/tkt-f777251dc7a.test d1a8fc3eefb7a9e64d19ff24d5c8c94c34a632fb F test/tkt-f7b4edec.test d998a08ff2b18b7f62edce8e3044317c45efe6c7 F test/tkt-f973c7ac31.test 28ef85c7f015477916795246d8286aeda39d4ead @@ -1664,7 +1664,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test 0edaf3411d300693bca595897c5201421c6c5ec787990a1dfe2f7f60ae93f1e2 -F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f847310d +F test/update.test ef3ebbafeb4be5c96db831f40796e2e77ee846da5ee8b61cfedb1ff1b9e0cc23 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 8859d9d437f03b44174c4524a7a734a391fd4526fcff65be08285dafc9dc9041 F test/upfrom1.test 8cb06689e99cd707d884faa16da0e8eb26ff658bb01c47ddf72fadade666e6e1 @@ -1691,7 +1691,7 @@ F test/vacuum6.test d3173a54edc81d13d99e4cf4972232b3cbb52f1d56ed48c3a939ef4e751c F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 798cf7936dda022d3ab0a4871685410d1c3b2a525b6b213915abc836e82a1078 +F test/view.test d654fbadae82f936c2a820bbc892592085467548ff59e88acef201416e9fe48a F test/view2.test db32c8138b5b556f610b35dfddd38c5a58a292f07fda5281eedb0851b2672679 F test/vtab1.test 772c94825d455dffc5da34dcf4b648d8a23887616185fa024a472bf745e56df8 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 @@ -1767,7 +1767,7 @@ F test/whereA.test 9d1077b117f1b68d5f739d94f36956c36cf995eb87bb19b77b2e81af020ed F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b -F test/whereE.test 0ac7e61c6225354a980666996539da154991b4325af943a25a9079079c82fb03 +F test/whereE.test 7a727b5d5b6bc8fa4cef5206e90cc0363e55ca7f0566f6fbad0206e43170f59e F test/whereF.test 926b65519608e3f2aa28720822b9154fb5c7b13519dd78194f434a511ab3dac5 F test/whereG.test b2a479f425f7d0a432df7e842e8484560908ef703fe0fd407888ff85e7097238 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 @@ -1784,7 +1784,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 9242d8083158d17b9b0cb8c7ecfc767987a1863c0076020b3ecb197df7d71886 +F test/window1.test 778ac2a5a037ab1378ffcc6f0444da8658630e576ab23cc0af3d649fd1332e55 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1805,13 +1805,13 @@ F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3c F test/windowfault.test 21919e601f20b976ea2a73aa401220c89ed0e8d203c4f69476ea55bce3726496 F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df F test/with1.test 7bc5abfe4c80c0cef8a90f5a66d60b9982e8ccd7350c8eb70611323a3b8e07ba -F test/with2.test f803743b2c746ecdd0b638783c7235654b947b0f1c4bb551ca10e1d813317153 +F test/with2.test a1df41b987198383b9b70bf5e5fda390582e46398653858dbc6ceb24253b28df F test/with3.test ad32d13ad50661e6fa305f62a0717649c348792e7b658bf2644976227a9e0373 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8 F test/with6.test 661d7e416bef6c0a2556b2c9f0c8178a5b15932bed65246abed99723a8d4e7c0 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test a1c144156d1d21eea7b2b0db62ad0aaed37d4e163eb5758ae6b6647cc0b4412f +F test/without_rowid1.test df3de14f1cc422d2b0f9b79969b5ef8e51c86ed87834ab35fb5139403e7f5a03 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053d68d4b2f67b F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a @@ -1856,7 +1856,7 @@ F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a19 F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8 F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl 5ef1891ed3d0e8143ff39bad7c01ed60c2817a2fb2d9a09487f7ccad2df621e4 -F tool/mkkeywordhash.c 08b6e4d7a482a7f37a9a0032e7ba968e26624a027b6b2e9ba589be6f5e3d8c2c +F tool/mkkeywordhash.c 7b1ffdb0731938cfb52dbf57461ff9132cb350612d944530e2f6031a7f16bf69 F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef F tool/mkopcodeh.tcl 130b88697da6ec5b89b41844d955d08fb62c2552e889dec8c7bcecb28d8f50bd @@ -1928,7 +1928,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 fe098a93340b8dac15752f1be4f681e2a591f7ae1a94b177f400ccd7ef638480 -R 77978b99526ec643e6ee046dad65d5ab -U drh -Z 7477ef1e574f4d90d4c36f8b8b9bf567 +P c7fdd775bb5efd22a486510a32a2f278c4d5cda95acd3085a0f0dfc2ef749d6f +R 926578650b00455ed26e22948e8e656f +U dan +Z 9dd8b361e8a634b7edc2d6fc8fe882ba diff --git a/manifest.uuid b/manifest.uuid index dfb58b93ff..a35b5dd3ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7fdd775bb5efd22a486510a32a2f278c4d5cda95acd3085a0f0dfc2ef749d6f \ No newline at end of file +2f7c946c5f25a858167f5193ca06e53310394c8cff15426ab8a1327a1ec835fd \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 08657f93be..54bed4389a 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1638,7 +1638,8 @@ cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} %endif //////////////////////// ALTER TABLE table ... //////////////////////////////// -%ifndef SQLITE_OMIT_ALTERTABLE +%ifndef SQLITE_OMIT_ALTERTABLE +%ifndef SQLITE_OMIT_VIRTUALTABLE cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { sqlite3AlterRenameTable(pParse,X,&Z); } @@ -1662,7 +1663,8 @@ cmd ::= ALTER TABLE fullname(X) RENAME kwcolumn_opt nm(Y) TO nm(Z). { kwcolumn_opt ::= . kwcolumn_opt ::= COLUMNKW. -%endif SQLITE_OMIT_ALTERTABLE +%endif SQLITE_OMIT_VIRTUALTABLE +%endif SQLITE_OMIT_ALTERTABLE //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// %ifndef SQLITE_OMIT_VIRTUALTABLE diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 21682fa113..f18035b16d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -578,6 +578,13 @@ # undef SQLITE_ENABLE_EXPLAIN_COMMENTS #endif +/* +** SQLITE_OMIT_VIRTUALTABLE implies SQLITE_OMIT_ALTERTABLE +*/ +#if defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_ALTERTABLE) +# define SQLITE_OMIT_ALTERTABLE +#endif + /* ** Return true (non-zero) if the input is an integer that is too large ** to fit in 32-bits. This macro is used inside of various testcase() diff --git a/test/altercorrupt.test b/test/altercorrupt.test index 5c50fa4a47..f24cb309a3 100644 --- a/test/altercorrupt.test +++ b/test/altercorrupt.test @@ -14,6 +14,12 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix altercorrupt +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + database_may_be_corrupt #-------------------------------------------------------------------------- diff --git a/test/alterqf.test b/test/alterqf.test index ce00f3b596..6a89641865 100644 --- a/test/alterqf.test +++ b/test/alterqf.test @@ -17,6 +17,13 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix alterqf +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_execsql_test 1.0 { diff --git a/test/analyze4.test b/test/analyze4.test index e3b0d23f6f..d4f1921e4c 100644 --- a/test/analyze4.test +++ b/test/analyze4.test @@ -20,6 +20,12 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + do_test analyze4-1.0 { db eval { CREATE TABLE t1(a,b); diff --git a/test/auth3.test b/test/auth3.test index 4377bcdc0f..abc973433e 100644 --- a/test/auth3.test +++ b/test/auth3.test @@ -115,18 +115,20 @@ do_test auth3-2.2 { # an authorizer failure during an ALTER TABLE. The solution (I think) is # to disable the authorizer during schema parsing. # -proc auth {code args} { - if {$code=="SQLITE_READ" && [regexp {DoNotRead} $args]} { - return SQLITE_DENY +ifcapable altertable { + proc auth {code args} { + if {$code=="SQLITE_READ" && [regexp {DoNotRead} $args]} { + return SQLITE_DENY + } + return SQLITE_OK } - return SQLITE_OK + do_execsql_test auth3-3.0 { + CREATE TEMPORARY TABLE TempTable ( + key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, + value TEXT NOT NULL ON CONFLICT FAIL); + ALTER TABLE TempTable RENAME TO DoNotRead; + SELECT name FROM temp.sqlite_master; + } {DoNotRead sqlite_autoindex_DoNotRead_1} } -do_execsql_test auth3-3.0 { - CREATE TEMPORARY TABLE TempTable ( - key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, - value TEXT NOT NULL ON CONFLICT FAIL); - ALTER TABLE TempTable RENAME TO DoNotRead; - SELECT name FROM temp.sqlite_master; -} {DoNotRead sqlite_autoindex_DoNotRead_1} finish_test diff --git a/test/columncount.test b/test/columncount.test index 669a35a72f..d9956b40f5 100644 --- a/test/columncount.test +++ b/test/columncount.test @@ -16,6 +16,12 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix columncount +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + proc do_ccsql_test {tn sql res} { uplevel [list do_test $tn [subst -nocommands { diff --git a/test/corruptL.test b/test/corruptL.test index 5ade7010d7..b7ff45d2ed 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -1179,9 +1179,12 @@ do_catchsql_test 14.1 { PRAGMA integrity_check; } {1 {database disk image is malformed}} -do_catchsql_test 14.2 { - ALTER TABLE t1 RENAME TO alkjalkjdfiiiwuer987lkjwer82mx97sf98788s9789s; -} {1 {database disk image is malformed}} +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable altertable { + do_catchsql_test 14.2 { + ALTER TABLE t1 RENAME TO alkjalkjdfiiiwuer987lkjwer82mx97sf98788s9789s; + } {1 {database disk image is malformed}} +} extra_schema_checks 1 #------------------------------------------------------------------------- diff --git a/test/e_changes.test b/test/e_changes.test index 9d49115b53..2eb77d3130 100644 --- a/test/e_changes.test +++ b/test/e_changes.test @@ -123,7 +123,9 @@ do_changes_test 2.2 { do_changes_test 2.3 { SELECT count(x) FROM t1 } {47 47} do_changes_test 2.4 { DROP TABLE t1 } 47 do_changes_test 2.5 { CREATE TABLE t1(x) } 47 -do_changes_test 2.6 { ALTER TABLE t1 ADD COLUMN b } 47 +ifcapable altertable { + do_changes_test 2.6 { ALTER TABLE t1 ADD COLUMN b } 47 +} #-------------------------------------------------------------------------- diff --git a/test/e_totalchanges.test b/test/e_totalchanges.test index d1666acfa0..bb5cfba8a5 100644 --- a/test/e_totalchanges.test +++ b/test/e_totalchanges.test @@ -94,24 +94,26 @@ do_tc_test 1.2.2 { #-------------------------------------------------------------------------- # EVIDENCE-OF: R-61766-15253 Executing any other type of SQL statement # does not affect the value returned by sqlite3_total_changes(). -do_tc_test 2.1 { - INSERT INTO t1 VALUES(1, 2), (3, 4); - INSERT INTO t2 VALUES(1, 2), (3, 4); -} {15} -do_tc_test 2.2 { - SELECT count(*) FROM t1; -} {2 15} -do_tc_test 2.3 { - CREATE TABLE t4(a, b); - ALTER TABLE t4 ADD COLUMN c; - CREATE INDEX i4 ON t4(c); - ALTER TABLE t4 RENAME TO t5; - ANALYZE; - BEGIN; - DROP TABLE t2; - ROLLBACK; - VACUUM; -} {15} +ifcapable altertable { + do_tc_test 2.1 { + INSERT INTO t1 VALUES(1, 2), (3, 4); + INSERT INTO t2 VALUES(1, 2), (3, 4); + } {15} + do_tc_test 2.2 { + SELECT count(*) FROM t1; + } {2 15} + do_tc_test 2.3 { + CREATE TABLE t4(a, b); + ALTER TABLE t4 ADD COLUMN c; + CREATE INDEX i4 ON t4(c); + ALTER TABLE t4 RENAME TO t5; + ANALYZE; + BEGIN; + DROP TABLE t2; + ROLLBACK; + VACUUM; + } {15} +} #-------------------------------------------------------------------------- diff --git a/test/func.test b/test/func.test index 38c0037735..ca1027f508 100644 --- a/test/func.test +++ b/test/func.test @@ -1459,12 +1459,15 @@ do_execsql_test func-33.10 { do_catchsql_test func-33.11 { INSERT INTO t33a VALUES(1,2); } {1 {unsafe use of testdirectonly()}} + +ifcapable altertable { do_execsql_test func-33.20 { ALTER TABLE t33a RENAME COLUMN a TO aaa; SELECT sql FROM sqlite_master WHERE name='r1'; } {{CREATE TRIGGER r1 AFTER INSERT ON t33a BEGIN INSERT INTO t33b(x,y) VALUES(testdirectonly(new.aaa),new.b); END}} +} # 2020-01-09 Yongheng fuzzer find # The bug is in the register-validity debug logic, not in the SQLite core diff --git a/test/gencol1.test b/test/gencol1.test index 0d72615435..ee0ebc53f5 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -587,20 +587,22 @@ do_execsql_test gencol1-20.2 { # 2021-07-30 forum https://sqlite.org/forum/forumpost/ff3ffe09251c105b?t=h # +ifcapable vtab { reset_db -do_execsql_test gencol1-21.1 { - CREATE TABLE t1( - a integer primary key, - b int generated always as (a+5), - c text GENERATED ALWAYS as (printf('%08x',a)), - d Generated - Always - AS ('xyzzy'), - e int Always default(5) - ); - INSERT INTO t1(a) VALUES(5); - SELECT name, type FROM pragma_table_xinfo('t1'); -} {a INTEGER b INT c TEXT d {} e INT} + do_execsql_test gencol1-21.1 { + CREATE TABLE t1( + a integer primary key, + b int generated always as (a+5), + c text GENERATED ALWAYS as (printf('%08x',a)), + d Generated + Always + AS ('xyzzy'), + e int Always default(5) + ); + INSERT INTO t1(a) VALUES(5); + SELECT name, type FROM pragma_table_xinfo('t1'); + } {a INTEGER b INT c TEXT d {} e INT} +} # 2021-09-07 forum https://sqlite.org/forum/forumpost/699b44b3ee # diff --git a/test/hook.test b/test/hook.test index 1dba87f272..bb868df8b4 100644 --- a/test/hook.test +++ b/test/hook.test @@ -677,30 +677,32 @@ do_preupdate_test 7.4.2.3 { DELETE main t5 1 1 a 1 } -do_execsql_test 7.5.1.0 { - CREATE TABLE t7(a, b); - INSERT INTO t7 VALUES('one', 'two'); - INSERT INTO t7 VALUES('three', 'four'); - ALTER TABLE t7 ADD COLUMN c DEFAULT NULL; -} - -do_preupdate_test 7.5.1.1 { - DELETE FROM t7 WHERE a = 'one' -} { - DELETE main t7 1 1 one two {} -} - -do_preupdate_test 7.5.1.2 { - UPDATE t7 SET b = 'five' -} { - UPDATE main t7 2 2 three four {} three five {} -} - -do_execsql_test 7.5.2.0 { - CREATE TABLE t8(a, b); - INSERT INTO t8 VALUES('one', 'two'); - INSERT INTO t8 VALUES('three', 'four'); - ALTER TABLE t8 ADD COLUMN c DEFAULT 'xxx'; +ifcapable altertable { + do_execsql_test 7.5.1.0 { + CREATE TABLE t7(a, b); + INSERT INTO t7 VALUES('one', 'two'); + INSERT INTO t7 VALUES('three', 'four'); + ALTER TABLE t7 ADD COLUMN c DEFAULT NULL; + } + + do_preupdate_test 7.5.1.1 { + DELETE FROM t7 WHERE a = 'one' + } { + DELETE main t7 1 1 one two {} + } + + do_preupdate_test 7.5.1.2 { + UPDATE t7 SET b = 'five' + } { + UPDATE main t7 2 2 three four {} three five {} + } + + do_execsql_test 7.5.2.0 { + CREATE TABLE t8(a, b); + INSERT INTO t8 VALUES('one', 'two'); + INSERT INTO t8 VALUES('three', 'four'); + ALTER TABLE t8 ADD COLUMN c DEFAULT 'xxx'; + } } if 0 { @@ -848,48 +850,53 @@ do_preupdate_test 7.6.4 { } # No preupdate callbacks for modifying sqlite_master. -do_preupdate_test 8.1 { CREATE TABLE x1(x, y); } { } -do_preupdate_test 8.2 { ALTER TABLE x1 ADD COLUMN z } { } -do_preupdate_test 8.3 { ALTER TABLE x1 RENAME TO y1 } { } -do_preupdate_test 8.4 { CREATE INDEX y1x ON y1(x) } { } -do_preupdate_test 8.5 { CREATE VIEW v1 AS SELECT * FROM y1 } { } -do_preupdate_test 8.6 { DROP TABLE y1 } { } +ifcapable altertable { + do_preupdate_test 8.1 { CREATE TABLE x1(x, y); } { } + do_preupdate_test 8.2 { ALTER TABLE x1 ADD COLUMN z } { } + do_preupdate_test 8.3 { ALTER TABLE x1 RENAME TO y1 } { } + do_preupdate_test 8.4 { CREATE INDEX y1x ON y1(x) } { } + do_preupdate_test 8.5 { CREATE VIEW v1 AS SELECT * FROM y1 } { } + do_preupdate_test 8.6 { DROP TABLE y1 } { } +} #------------------------------------------------------------------------- reset_db db preupdate hook preupdate_hook -do_execsql_test 9.0 { - CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); - CREATE TABLE t2(a, b INTEGER PRIMARY KEY); + +ifcapable altertable { + do_execsql_test 9.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); + CREATE TABLE t2(a, b INTEGER PRIMARY KEY); + } + do_preupdate_test 9.1 { + INSERT INTO t1 VALUES(456, NULL, NULL); + } { + INSERT main t1 456 456 0 456 {} {} + } + do_execsql_test 9.2 { + ALTER TABLE t1 ADD COLUMN d; + } + do_preupdate_test 9.3 { + INSERT INTO t1(a, b, c) VALUES(457, NULL, NULL); + } { + INSERT main t1 457 457 0 457 {} {} {} + } + do_preupdate_test 9.4 { + DELETE FROM t1 WHERE a=456 + } { + DELETE main t1 456 456 0 456 {} {} {} + } + do_preupdate_test 9.5 { + INSERT INTO t2 DEFAULT VALUES; + } { + INSERT main t2 1 1 0 {} 1 + } + do_preupdate_test 9.6 { + INSERT INTO t1 DEFAULT VALUES; + } { + INSERT main t1 458 458 0 458 {} {} {} + } } -do_preupdate_test 9.1 { - INSERT INTO t1 VALUES(456, NULL, NULL); -} { - INSERT main t1 456 456 0 456 {} {} -} -do_execsql_test 9.2 { - ALTER TABLE t1 ADD COLUMN d; -} -do_preupdate_test 9.3 { - INSERT INTO t1(a, b, c) VALUES(457, NULL, NULL); -} { - INSERT main t1 457 457 0 457 {} {} {} -} -do_preupdate_test 9.4 { - DELETE FROM t1 WHERE a=456 -} { - DELETE main t1 456 456 0 456 {} {} {} -} -do_preupdate_test 9.5 { - INSERT INTO t2 DEFAULT VALUES; -} { - INSERT main t2 1 1 0 {} 1 -} -do_preupdate_test 9.6 { - INSERT INTO t1 DEFAULT VALUES; -} { - INSERT main t1 458 458 0 458 {} {} {} -} do_execsql_test 10.0 { diff --git a/test/indexexpr1.test b/test/indexexpr1.test index a31b876955..92dfc8689b 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -75,18 +75,20 @@ do_execsql_test indexexpr1-150eqp { ORDER BY +rowid; } {/USING INDEX t1abx/} -do_execsql_test indexexpr1-160 { - ALTER TABLE t1 ADD COLUMN d; - UPDATE t1 SET d=length(a); - CREATE INDEX t1a2 ON t1(SUBSTR(a, 27, 3)) WHERE d>=29; - SELECT rowid, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; -} {1 1 1} -do_execsql_test indexexpr1-160eqp { - EXPLAIN QUERY PLAN - SELECT rowid, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; -} {/USING INDEX t1a2/} +ifcapable altertable { + do_execsql_test indexexpr1-160 { + ALTER TABLE t1 ADD COLUMN d; + UPDATE t1 SET d=length(a); + CREATE INDEX t1a2 ON t1(SUBSTR(a, 27, 3)) WHERE d>=29; + SELECT rowid, b, c FROM t1 + WHERE substr(a,27,3)=='ord' AND d>=29; + } {1 1 1} + do_execsql_test indexexpr1-160eqp { + EXPLAIN QUERY PLAN + SELECT rowid, b, c FROM t1 + WHERE substr(a,27,3)=='ord' AND d>=29; + } {/USING INDEX t1a2/} +} # ORDER BY using an indexed expression # @@ -166,18 +168,20 @@ do_execsql_test indexexpr1-250eqp { ORDER BY +id; } {/USING INDEX t1abx/} -do_execsql_test indexexpr1-260 { - ALTER TABLE t1 ADD COLUMN d; - UPDATE t1 SET d=length(a); - CREATE INDEX t1a2 ON t1(SUBSTR(a, 27, 3)) WHERE d>=29; - SELECT id, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; -} {1 1 1} -do_execsql_test indexexpr1-260eqp { - EXPLAIN QUERY PLAN - SELECT id, b, c FROM t1 - WHERE substr(a,27,3)=='ord' AND d>=29; -} {/USING INDEX t1a2/} +ifcapable altertable { + do_execsql_test indexexpr1-260 { + ALTER TABLE t1 ADD COLUMN d; + UPDATE t1 SET d=length(a); + CREATE INDEX t1a2 ON t1(SUBSTR(a, 27, 3)) WHERE d>=29; + SELECT id, b, c FROM t1 + WHERE substr(a,27,3)=='ord' AND d>=29; + } {1 1 1} + do_execsql_test indexexpr1-260eqp { + EXPLAIN QUERY PLAN + SELECT id, b, c FROM t1 + WHERE substr(a,27,3)=='ord' AND d>=29; + } {/USING INDEX t1a2/} +} do_catchsql_test indexexpr1-300 { diff --git a/test/istrue.test b/test/istrue.test index 13eccabc25..f1ba63248f 100644 --- a/test/istrue.test +++ b/test/istrue.test @@ -143,20 +143,22 @@ foreach {tn val} [list 1 NaN 2 -NaN 3 NaN0 4 -NaN0 5 Inf 6 -Inf] { } {0} } -do_execsql_test istrue-700 { - CREATE TABLE t7( - a INTEGER PRIMARY KEY, - b BOOLEAN DEFAULT false, - c BOOLEAN DEFAULT true - ); - INSERT INTO t7(a) VALUES(1); - INSERT INTO t7(a,b,c) VALUES(2,true,false); - ALTER TABLE t7 ADD COLUMN d BOOLEAN DEFAULT false; - ALTER TABLE t7 ADD COLUMN e BOOLEAN DEFAULT true; - INSERT INTO t7(a,b,c) VALUES(3,true,false); - INSERT INTO t7 VALUES(4,false,true,true,false); - SELECT *,'x' FROM t7 ORDER BY a; -} {1 0 1 0 1 x 2 1 0 0 1 x 3 1 0 0 1 x 4 0 1 1 0 x} +ifcapable altertable { + do_execsql_test istrue-700 { + CREATE TABLE t7( + a INTEGER PRIMARY KEY, + b BOOLEAN DEFAULT false, + c BOOLEAN DEFAULT true + ); + INSERT INTO t7(a) VALUES(1); + INSERT INTO t7(a,b,c) VALUES(2,true,false); + ALTER TABLE t7 ADD COLUMN d BOOLEAN DEFAULT false; + ALTER TABLE t7 ADD COLUMN e BOOLEAN DEFAULT true; + INSERT INTO t7(a,b,c) VALUES(3,true,false); + INSERT INTO t7 VALUES(4,false,true,true,false); + SELECT *,'x' FROM t7 ORDER BY a; + } {1 0 1 0 1 x 2 1 0 0 1 x 3 1 0 0 1 x 4 0 1 1 0 x} +} do_execsql_test istrue-710 { SELECT 0.5 IS TRUE COLLATE NOCASE; diff --git a/test/pager1.test b/test/pager1.test index a1e06d15cc..7cb158c992 100644 --- a/test/pager1.test +++ b/test/pager1.test @@ -1940,20 +1940,22 @@ do_test pager1-18.4 { } {1 {database disk image is malformed}} db2 close extra_schema_checks 0 -do_test pager1-18.5 { - sqlite3 db "" - sqlite3_db_config db DEFENSIVE 0 - execsql { - CREATE TABLE t1(a, b); - CREATE TABLE t2(a, b); - PRAGMA writable_schema = 1; - UPDATE sqlite_master SET rootpage=5 WHERE tbl_name = 't1'; - PRAGMA writable_schema = 0; - ALTER TABLE t1 RENAME TO x1; - } - catchsql { SELECT * FROM x1 } -} {1 {database disk image is malformed}} -db close +ifcapable altertable { + do_test pager1-18.5 { + sqlite3 db "" + sqlite3_db_config db DEFENSIVE 0 + execsql { + CREATE TABLE t1(a, b); + CREATE TABLE t2(a, b); + PRAGMA writable_schema = 1; + UPDATE sqlite_master SET rootpage=5 WHERE tbl_name = 't1'; + PRAGMA writable_schema = 0; + ALTER TABLE t1 RENAME TO x1; + } + catchsql { SELECT * FROM x1 } + } {1 {database disk image is malformed}} + db close +} extra_schema_checks 1 do_test pager1-18.6 { diff --git a/test/pragma.test b/test/pragma.test index c4b9d334ae..ba61882d5f 100644 --- a/test/pragma.test +++ b/test/pragma.test @@ -532,29 +532,31 @@ Page 6 is never used} {row 1 missing from index i2}} # Verify that PRAGMA integrity_check catches UNIQUE and NOT NULL # constraint violations. # -sqlite3_db_config db DEFENSIVE 0 -do_execsql_test pragma-3.20 { - CREATE TABLE t1(a,b); - CREATE INDEX t1a ON t1(a); - INSERT INTO t1 VALUES(1,1),(2,2),(3,3),(2,4),(NULL,5),(NULL,6); - PRAGMA writable_schema=ON; - UPDATE sqlite_master SET sql='CREATE UNIQUE INDEX t1a ON t1(a)' - WHERE name='t1a'; - UPDATE sqlite_master SET sql='CREATE TABLE t1(a NOT NULL,b)' - WHERE name='t1'; - PRAGMA writable_schema=OFF; - ALTER TABLE t1 RENAME TO t1x; - PRAGMA integrity_check; -} {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a} {NULL value in t1x.a}} -do_execsql_test pragma-3.21 { - PRAGMA integrity_check(3); -} {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a}} -do_execsql_test pragma-3.22 { - PRAGMA integrity_check(2); -} {{non-unique entry in index t1a} {NULL value in t1x.a}} -do_execsql_test pragma-3.23 { - PRAGMA integrity_check(1); -} {{non-unique entry in index t1a}} +ifcapable altertable { + sqlite3_db_config db DEFENSIVE 0 + do_execsql_test pragma-3.20 { + CREATE TABLE t1(a,b); + CREATE INDEX t1a ON t1(a); + INSERT INTO t1 VALUES(1,1),(2,2),(3,3),(2,4),(NULL,5),(NULL,6); + PRAGMA writable_schema=ON; + UPDATE sqlite_master SET sql='CREATE UNIQUE INDEX t1a ON t1(a)' + WHERE name='t1a'; + UPDATE sqlite_master SET sql='CREATE TABLE t1(a NOT NULL,b)' + WHERE name='t1'; + PRAGMA writable_schema=OFF; + ALTER TABLE t1 RENAME TO t1x; + PRAGMA integrity_check; + } {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a} {NULL value in t1x.a}} + do_execsql_test pragma-3.21 { + PRAGMA integrity_check(3); + } {{non-unique entry in index t1a} {NULL value in t1x.a} {non-unique entry in index t1a}} + do_execsql_test pragma-3.22 { + PRAGMA integrity_check(2); + } {{non-unique entry in index t1a} {NULL value in t1x.a}} + do_execsql_test pragma-3.23 { + PRAGMA integrity_check(1); + } {{non-unique entry in index t1a}} +} # PRAGMA integrity check (or more specifically the sqlite3BtreeCount() # interface) used to leave index cursors in an inconsistent state @@ -564,7 +566,7 @@ do_execsql_test pragma-3.23 { # that problem has been fixed. # do_test pragma-3.30 { - db close + catch { db close } delete_file test.db sqlite3 db test.db db eval { @@ -1957,14 +1959,16 @@ do_test 23.3 { capture_pragma db2 out {PRAGMA index_list(t1)} db2 eval {SELECT seq, name, "unique", origin, '|' FROM out ORDER BY seq} } {0 i3 0 c | 1 i2 0 c | 2 i2x 0 c | 3 i1 0 c |} -do_test 23.4 { - db eval { - ALTER TABLE t1 ADD COLUMN e; - } - db2 eval { - PRAGMA table_info(t1); - } -} {/4 e {} 0 {} 0/} +ifcapable altertable { + do_test 23.4 { + db eval { + ALTER TABLE t1 ADD COLUMN e; + } + db2 eval { + PRAGMA table_info(t1); + } + } {/4 e {} 0 {} 0/} +} do_test 23.5 { db eval { DROP TABLE t2; diff --git a/test/quote.test b/test/quote.test index 212885c05c..9810a3ca03 100644 --- a/test/quote.test +++ b/test/quote.test @@ -141,43 +141,45 @@ do_execsql_test 2.5 { # 2021-03-13 # ticket 1c24a659e6d7f3a1 -reset_db -do_catchsql_test 3.0 { - CREATE TABLE t1(a,b); - CREATE INDEX x1 on t1("b"); - ALTER TABLE t1 DROP COLUMN b; -} {1 {error in index x1 after drop column: no such column: b}} -do_catchsql_test 3.1 { - DROP TABLE t1; - CREATE TABLE t1(a,"b"); - CREATE INDEX x1 on t1("b"); - ALTER TABLE t1 DROP COLUMN b; -} {1 {error in index x1 after drop column: no such column: b}} -do_catchsql_test 3.2 { - DROP TABLE t1; - CREATE TABLE t1(a,'b'); - CREATE INDEX x1 on t1("b"); - ALTER TABLE t1 DROP COLUMN b; -} {1 {error in index x1 after drop column: no such column: b}} -do_catchsql_test 3.3 { - DROP TABLE t1; - CREATE TABLE t1(a,"b"); - CREATE INDEX x1 on t1('b'); - ALTER TABLE t1 DROP COLUMN b; -} {1 {error in index x1 after drop column: no such column: b}} -do_catchsql_test 3.4 { - DROP TABLE t1; - CREATE TABLE t1(a, b, c); - CREATE INDEX x1 ON t1("a"||"b"); - INSERT INTO t1 VALUES(1,2,3),(1,4,5); - ALTER TABLE t1 DROP COLUMN b; -} {1 {error in index x1 after drop column: no such column: b}} -do_catchsql_test 3.5 { - DROP TABLE t1; - CREATE TABLE t1(a, b, c); - CREATE INDEX x1 ON t1("a"||"x"); - INSERT INTO t1 VALUES(1,2,3),(1,4,5); - ALTER TABLE t1 DROP COLUMN b; -} {0 {}} +ifcapable altertable { + reset_db + do_catchsql_test 3.0 { + CREATE TABLE t1(a,b); + CREATE INDEX x1 on t1("b"); + ALTER TABLE t1 DROP COLUMN b; + } {1 {error in index x1 after drop column: no such column: b}} + do_catchsql_test 3.1 { + DROP TABLE t1; + CREATE TABLE t1(a,"b"); + CREATE INDEX x1 on t1("b"); + ALTER TABLE t1 DROP COLUMN b; + } {1 {error in index x1 after drop column: no such column: b}} + do_catchsql_test 3.2 { + DROP TABLE t1; + CREATE TABLE t1(a,'b'); + CREATE INDEX x1 on t1("b"); + ALTER TABLE t1 DROP COLUMN b; + } {1 {error in index x1 after drop column: no such column: b}} + do_catchsql_test 3.3 { + DROP TABLE t1; + CREATE TABLE t1(a,"b"); + CREATE INDEX x1 on t1('b'); + ALTER TABLE t1 DROP COLUMN b; + } {1 {error in index x1 after drop column: no such column: b}} + do_catchsql_test 3.4 { + DROP TABLE t1; + CREATE TABLE t1(a, b, c); + CREATE INDEX x1 ON t1("a"||"b"); + INSERT INTO t1 VALUES(1,2,3),(1,4,5); + ALTER TABLE t1 DROP COLUMN b; + } {1 {error in index x1 after drop column: no such column: b}} + do_catchsql_test 3.5 { + DROP TABLE t1; + CREATE TABLE t1(a, b, c); + CREATE INDEX x1 ON t1("a"||"x"); + INSERT INTO t1 VALUES(1,2,3),(1,4,5); + ALTER TABLE t1 DROP COLUMN b; + } {0 {}} +} finish_test diff --git a/test/schema3.test b/test/schema3.test index ba7d745eb7..39d4632330 100644 --- a/test/schema3.test +++ b/test/schema3.test @@ -16,6 +16,12 @@ source $testdir/tester.tcl source $testdir/malloc_common.tcl source $testdir/lock_common.tcl +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + # This block tests that if one client modifies the database schema, a # second client updates its internal cache of the database schema before # executing any queries. Specifically, it does not return a "no such column" diff --git a/test/skipscan2.test b/test/skipscan2.test index 47b2b3fffa..aa870d4565 100644 --- a/test/skipscan2.test +++ b/test/skipscan2.test @@ -157,7 +157,6 @@ do_execsql_test skipscan2-2.1 { CREATE INDEX peoplew_idx1 ON peoplew(role, height); INSERT INTO peoplew(name,role,height) SELECT name, role, height FROM people; - ALTER TABLE people RENAME TO old_people; SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; } {David Jack Patrick Quiana Xavier} do_execsql_test skipscan2-2.2 { diff --git a/test/sorterref.test b/test/sorterref.test index 28445c6e72..adf1cf53b2 100644 --- a/test/sorterref.test +++ b/test/sorterref.test @@ -14,6 +14,12 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix sorterref +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + do_execsql_test 1.0 { CREATE TABLE t1(a, b, c); INSERT INTO t1 VALUES(1, 2, 3); diff --git a/test/strict1.test b/test/strict1.test index 5e10af889b..606136abe0 100644 --- a/test/strict1.test +++ b/test/strict1.test @@ -46,8 +46,12 @@ do_execsql_test strict1-2.0 { d TEXT, e REAL ) STRICT; - SELECT strict FROM pragma_table_list('t1'); -} {1} +} {} +ifcapable vtab { + do_execsql_test strict1-2.0a { + SELECT strict FROM pragma_table_list('t1'); + } {1} +} do_catchsql_test strict1-2.1 { INSERT INTO t1(a) VALUES('xyz'); } {1 {cannot store TEXT value in INT column t1.a}} diff --git a/test/tkt-8454a207b9.test b/test/tkt-8454a207b9.test index 88a8614f82..20e142057d 100644 --- a/test/tkt-8454a207b9.test +++ b/test/tkt-8454a207b9.test @@ -18,6 +18,12 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + do_test tkt-8454a207b9.1 { db eval { CREATE TABLE t1(a); diff --git a/test/tkt-f67b41381a.test b/test/tkt-f67b41381a.test index 1ddec988cd..43e5cc7dbb 100644 --- a/test/tkt-f67b41381a.test +++ b/test/tkt-f67b41381a.test @@ -15,6 +15,11 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix tkt-f67b41381a +ifcapable !altertable { + finish_test + return +} + do_execsql_test 1.0 { CREATE TABLE t1(a); INSERT INTO t1 VALUES(1); diff --git a/test/update.test b/test/update.test index dd96124b4d..7be360726f 100644 --- a/test/update.test +++ b/test/update.test @@ -619,16 +619,18 @@ do_test update-14.4 { # Ticket [https://www.sqlite.org/src/tktview/43107840f1c02] on 2014-10-29 # An assertion fault on UPDATE # -do_execsql_test update-15.1 { - CREATE TABLE t15(a INTEGER PRIMARY KEY, b); - INSERT INTO t15(a,b) VALUES(10,'abc'),(20,'def'),(30,'ghi'); - ALTER TABLE t15 ADD COLUMN c; - CREATE INDEX t15c ON t15(c); - INSERT INTO t15(a,b) - VALUES(5,'zyx'),(15,'wvu'),(25,'tsr'),(35,'qpo'); - UPDATE t15 SET c=printf("y%d",a) WHERE c IS NULL; - SELECT a,b,c,'|' FROM t15 ORDER BY a; -} {5 zyx y5 | 10 abc y10 | 15 wvu y15 | 20 def y20 | 25 tsr y25 | 30 ghi y30 | 35 qpo y35 |} +ifcapable altertable { + do_execsql_test update-15.1 { + CREATE TABLE t15(a INTEGER PRIMARY KEY, b); + INSERT INTO t15(a,b) VALUES(10,'abc'),(20,'def'),(30,'ghi'); + ALTER TABLE t15 ADD COLUMN c; + CREATE INDEX t15c ON t15(c); + INSERT INTO t15(a,b) + VALUES(5,'zyx'),(15,'wvu'),(25,'tsr'),(35,'qpo'); + UPDATE t15 SET c=printf("y%d",a) WHERE c IS NULL; + SELECT a,b,c,'|' FROM t15 ORDER BY a; + } {5 zyx y5 | 10 abc y10 | 15 wvu y15 | 20 def y20 | 25 tsr y25 | 30 ghi y30 | 35 qpo y35 |} +} # Unreleased bug in UPDATE caused by the UPSERT changes. # Found by OSSFuzz as soon as the UPSERT changes landed on trunk. diff --git a/test/view.test b/test/view.test index 68bfcad64d..85202d7d06 100644 --- a/test/view.test +++ b/test/view.test @@ -55,9 +55,11 @@ do_test view-1.1.110 { SELECT * FROM v1temp ORDER BY a; } } {0 {1 2 4 5 7 8 1 2 4 5 7 8}} -do_execsql_test view-1.1.120 { - SELECT name, type FROM pragma_table_list('v1'); -} {v1 view} +ifcapable vtab { + do_execsql_test view-1.1.120 { + SELECT name, type FROM pragma_table_list('v1'); + } {v1 view} +} do_test view-1.2 { catchsql { ROLLBACK; diff --git a/test/whereE.test b/test/whereE.test index 31086b2492..cd9f81d531 100644 --- a/test/whereE.test +++ b/test/whereE.test @@ -18,6 +18,12 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set ::testprefix whereE +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + do_execsql_test 1.1 { CREATE TABLE t1(a,b); INSERT INTO t1 VALUES(1,10), (2,20), (3,30), (2,22), (3, 33); diff --git a/test/window1.test b/test/window1.test index 8db23c55a6..f595d40e2e 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1267,13 +1267,15 @@ do_catchsql_test 31.3 { } {1 {frame ending offset must be a non-negative integer}} # 2019-11-16 chromium issue 1025467 -db close -sqlite3 db :memory: -do_catchsql_test 32.10 { - CREATE VIEW a AS SELECT NULL INTERSECT SELECT NULL ORDER BY s() OVER R; - CREATE TABLE a0 AS SELECT 0; - ALTER TABLE a0 RENAME TO S; -} {1 {error in view a: 1st ORDER BY term does not match any column in the result set}} +ifcapable altertable { + db close + sqlite3 db :memory: + do_catchsql_test 32.10 { + CREATE VIEW a AS SELECT NULL INTERSECT SELECT NULL ORDER BY s() OVER R; + CREATE TABLE a0 AS SELECT 0; + ALTER TABLE a0 RENAME TO S; + } {1 {error in view a: 1st ORDER BY term does not match any column in the result set}} +} reset_db do_execsql_test 33.1 { diff --git a/test/with2.test b/test/with2.test index 93be6a6a10..660df52b77 100644 --- a/test/with2.test +++ b/test/with2.test @@ -552,64 +552,68 @@ do_execsql_test 10.1 { # 2021-05-21 # Forum post https://sqlite.org/forum/forumpost/aa4a7a3980 # +ifcapable altertable { reset_db -do_execsql_test 11.1 { - CREATE TABLE t1(a); - CREATE VIEW v2(c) AS - WITH x AS ( - WITH y AS ( - WITH z AS(SELECT * FROM t1) - SELECT * FROM v2 - ) SELECT a - ) SELECT * from t1; - ALTER TABLE t1 RENAME COLUMN a TO b; - SELECT sql FROM sqlite_schema WHERE name='t1'; -} {{CREATE TABLE t1(b)}} -do_catchsql_test 11.2 { - INSERT INTO t1 VALUES(55); - SELECT * FROM v2; -} {0 55} -do_catchsql_test 11.3 { - DROP VIEW v2; - CREATE VIEW v2(c) AS - WITH x AS ( - WITH y AS ( - WITH z AS(SELECT * FROM t1) - SELECT * FROM v2 - ) SELECT a - ) SELECT * from t1, x; - SELECT * FROM v2; -} {1 {no such column: a}} -do_catchsql_test 11.4 { - DROP VIEW v2; - CREATE VIEW v2(c) AS - WITH x AS ( - WITH y AS ( - WITH z AS(SELECT * FROM t1) - SELECT * FROM v2 - ) SELECT * - ) SELECT * from t1, x; - SELECT * FROM v2; -} {1 {no tables specified}} -do_catchsql_test 11.5 { - WITH x AS ( - WITH y AS ( - WITH z AS(SELECT * FROM t1) - SELECT * FROM no_such_table - ) SELECT a - ) SELECT * from t1; -} {0 55} + do_execsql_test 11.1 { + CREATE TABLE t1(a); + CREATE VIEW v2(c) AS + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM v2 + ) SELECT a + ) SELECT * from t1; + ALTER TABLE t1 RENAME COLUMN a TO b; + SELECT sql FROM sqlite_schema WHERE name='t1'; + } {{CREATE TABLE t1(b)}} + do_catchsql_test 11.2 { + INSERT INTO t1 VALUES(55); + SELECT * FROM v2; + } {0 55} + do_catchsql_test 11.3 { + DROP VIEW v2; + CREATE VIEW v2(c) AS + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM v2 + ) SELECT a + ) SELECT * from t1, x; + SELECT * FROM v2; + } {1 {no such column: a}} + do_catchsql_test 11.4 { + DROP VIEW v2; + CREATE VIEW v2(c) AS + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM v2 + ) SELECT * + ) SELECT * from t1, x; + SELECT * FROM v2; + } {1 {no tables specified}} + do_catchsql_test 11.5 { + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM no_such_table + ) SELECT a + ) SELECT * from t1; + } {0 55} +} # 2021-05-23 dbsqlfuzz 6b7a144674e215f06ddfeb9042c873d9ee956ac0 */ reset_db -do_execsql_test 12.1 { - CREATE TABLE t1(a); - INSERT INTO t1 VALUES(1),('hello'),(4.25),(NULL),(x'3c626c6f623e'); - CREATE VIEW v2(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM t1) SELECT * FROM v2) SELECT a) SELECT * from t1; - CREATE VIEW v3(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM v2) SELECT * FROM v3) SELECT a) SELECT * from t1; - ALTER TABLE t1 RENAME TO t1x; - SELECT quote(c) FROM v3; -} {1 'hello' 4.25 NULL X'3C626C6F623E'} +ifcapable altertable { + do_execsql_test 12.1 { + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(1),('hello'),(4.25),(NULL),(x'3c626c6f623e'); + CREATE VIEW v2(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM t1) SELECT * FROM v2) SELECT a) SELECT * from t1; + CREATE VIEW v3(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM v2) SELECT * FROM v3) SELECT a) SELECT * from t1; + ALTER TABLE t1 RENAME TO t1x; + SELECT quote(c) FROM v3; + } {1 'hello' 4.25 NULL X'3C626C6F623E'} +} # 2021-08-11 https://sqlite.org/forum/forumpost/d496c3d29bc93736 reset_db diff --git a/test/without_rowid1.test b/test/without_rowid1.test index 1dd7e10dde..c712392688 100644 --- a/test/without_rowid1.test +++ b/test/without_rowid1.test @@ -458,15 +458,17 @@ do_execsql_test 13.10 { # 2021-05-13 https://sqlite.org/forum/forumpost/6c8960f545 reset_db -do_execsql_test 14.1 { - CREATE TABLE t1(a INT PRIMARY KEY) WITHOUT ROWID; - INSERT INTO t1(a) VALUES(10); - ALTER TABLE t1 ADD COLUMN b INT; - SELECT * FROM t1 WHERE a=20 OR (a=10 AND b=10); -} {} -do_execsql_test 14.2 { - CREATE TABLE dual AS SELECT 'X' AS dummy; - EXPLAIN QUERY PLAN SELECT * FROM dual, t1 WHERE a=10 AND b=10; -} {~/b=/} +ifcapable altertable { + do_execsql_test 14.1 { + CREATE TABLE t1(a INT PRIMARY KEY) WITHOUT ROWID; + INSERT INTO t1(a) VALUES(10); + ALTER TABLE t1 ADD COLUMN b INT; + SELECT * FROM t1 WHERE a=20 OR (a=10 AND b=10); + } {} + do_execsql_test 14.2 { + CREATE TABLE dual AS SELECT 'X' AS dummy; + EXPLAIN QUERY PLAN SELECT * FROM dual, t1 WHERE a=10 AND b=10; + } {~/b=/} +} finish_test diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index bbb0ccf293..a330ef0c87 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -52,7 +52,7 @@ struct Keyword { /* ** Define masks used to determine which keywords are allowed */ -#ifdef SQLITE_OMIT_ALTERTABLE +#if defined(SQLITE_OMIT_ALTERTABLE) || defined(SQLITE_OMIT_VIRTUALTABLE) # define ALTER 0 #else # define ALTER 0x00000001 From e85e1da07bae9b72a964bb49eb359715d4fff0de Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 1 Oct 2021 21:01:07 +0000 Subject: [PATCH 121/130] Fix harmless compiler warnings. FossilOrigin-Name: 94b59691ee50a4666b25e36d1529fc52f714bbe94c3e8ccb35bf0a4ea11050db --- ext/misc/ieee754.c | 6 +++++- ext/misc/json1.c | 2 +- ext/misc/zipfile.c | 4 ++-- manifest | 32 ++++++++++++++++---------------- manifest.uuid | 2 +- src/analyze.c | 1 - src/btree.c | 4 +--- src/build.c | 2 +- src/pager.c | 1 + src/select.c | 3 +-- src/shell.c.in | 24 +++++++++++++----------- src/vdbe.c | 2 -- 12 files changed, 42 insertions(+), 41 deletions(-) diff --git a/ext/misc/ieee754.c b/ext/misc/ieee754.c index 6cdd79a4d4..66d946f3d5 100644 --- a/ext/misc/ieee754.c +++ b/ext/misc/ieee754.c @@ -194,7 +194,11 @@ static void ieee754func( e += 1075; if( e<=0 ){ /* Subnormal */ - m >>= 1-e; + if( 1-e >= 64 ){ + m = 0; + }else{ + m >>= 1-e; + } e = 0; }else if( e>0x7ff ){ e = 0x7ff; diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 077d02d912..6fe3ab9676 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -605,7 +605,7 @@ static void jsonReturn( sqlite3_result_int64(pCtx, i); int_done: break; - int_as_real: i=0; /* no break */ deliberate_fall_through + int_as_real: ; /* no break */ deliberate_fall_through } case JSON_REAL: { double r; diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index b727f9f2be..12453900ed 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -863,7 +863,7 @@ static int zipfileGetEntry( aRead = (u8*)&aBlob[pNew->cds.iOffset]; } - rc = zipfileReadLFH(aRead, &lfh); + if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh); if( rc==SQLITE_OK ){ pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ; pNew->iDataOff += lfh.nFile + lfh.nExtra; @@ -1139,13 +1139,13 @@ static int zipfileReadEOCD( int nRead; /* Bytes to read from file */ int rc = SQLITE_OK; + memset(pEOCD, 0, sizeof(ZipfileEOCD)); if( aBlob==0 ){ i64 iOff; /* Offset to read from */ i64 szFile; /* Total size of file in bytes */ fseek(pFile, 0, SEEK_END); szFile = (i64)ftell(pFile); if( szFile==0 ){ - memset(pEOCD, 0, sizeof(ZipfileEOCD)); return SQLITE_OK; } nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE)); diff --git a/manifest b/manifest index a50590d942..b40ba43439 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthings\sso\sthat\sSQLITE_OMIT_VIRTUALTABLE\simplies\sSQLITE_OMIT_ALTER_TABLE. -D 2021-10-01T20:39:50.837 +C Fix\sharmless\scompiler\swarnings. +D 2021-10-01T21:01:07.786 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -305,8 +305,8 @@ F ext/misc/explain.c 0086fab288d4352ea638cf40ac382aad3b0dc5e845a1ea829a694c015fd F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab90058e0 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d -F ext/misc/ieee754.c cd6ab89f85fda8a020559b3f4d03001a8a62dd856beda5af3f558621d12be913 -F ext/misc/json1.c 76c5d9e0960fd15b4be79dacb76d872b4d0d983ce13e72ebfe9481d82cb9345d +F ext/misc/ieee754.c 91a5594071143a4ab79c638fe9f059af1db09932faf2e704c3e29216a7d4f511 +F ext/misc/json1.c 96a44b84f00d35f9450abae1f0167abe60de9379b2b27ea652c6cf14450b4739 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c 7dffa8cc89c7f2d73da4bd4ccea1bcbd2bd283e3bb4cea398df7c372a197291b @@ -338,7 +338,7 @@ F ext/misc/vfsstat.c 474d08efc697b8eba300082cb1eb74a5f0f3df31ed257db1cb07e72ab0e F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c a838d1bea913c514ff316c69695efbb49ea3b8cb37d22afc57f73b6b010b4546 -F ext/misc/zipfile.c b7261ef6dbc2d18924ff80c40fb5d56c9ccfee3f822a7d3d43b7c87af3d27218 +F ext/misc/zipfile.c f01cc496f082b361520223df1bbb685576c45539fd511ea50b2ed19ce7081111 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8 F ext/rbu/rbu1.test c62904bd9526dcdc3496a21199aaf14ae191bbadbf67f076bf16be6b3f2115c2 @@ -484,16 +484,16 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c a6afe961ef3544104fa635a0c3161bfe1a34382f32e2a28706993abadedbffed -F src/analyze.c 989eb1146f4a2c320623e190f8913bf1829fd8954a52dbfd0f792efc69db0e66 +F src/analyze.c 6ff8ae7b9e8dfacd62447e1204d85e57f76580c955f4faf953704c36ed8ac60e F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c bed4239e31772ed5486e947d8eaf3d38fcc76136e19d0383bad15609198419c2 +F src/btree.c c97860dd57b01415b10ab9c976f52804d8cd914537465ca3b9fd52cab1321f2d F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 53fe0ecd73c210561eaea965cb4977d7d717e7984005fa814e856868b06f8b23 +F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -536,7 +536,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 1ba6a843148282895d800aa69919553079946ef9a198a97e5d7c64442d10ed4c +F src/pager.c dabb867aa4fabe01d05a5fb39c4d497b2d7bff591b738ffbe7f715ee28b67cdb F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 82bdd593c50bddcc285a173e9788a20296103217f5f5290c9122abf8af71af62 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -549,8 +549,8 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 47a6e97bb04caeb71cc0b748b69d635eaa0aa765915d177949d21c386eb0cc97 -F src/shell.c.in f9a13edb4d4cdbdfc161b0d200296c1dd9c492ad86dd73f4768ee841fec66578 +F src/select.c 916d18b586d8efad5a46040e48405f42e7f90fff33bca1cfab040169515ec525 +F src/shell.c.in 928114971b558dc2e40a1afaf07e3e5e93558a77ecca95067c51e1f9d3c1441a F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 3f27a1eae01c8bbbb8cdef2f26bd8e6a2a7db08106ef7c3dcc990787a5da6e86 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c a4b6736b22ccb9e875dea4350ea1666276500b4d6a27eed9c7d000faa1fea163 +F src/vdbe.c f2a83da75711ee42b8986600ba870c71f57b49325d9b196c2097950871846983 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1928,7 +1928,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 c7fdd775bb5efd22a486510a32a2f278c4d5cda95acd3085a0f0dfc2ef749d6f -R 926578650b00455ed26e22948e8e656f -U dan -Z 9dd8b361e8a634b7edc2d6fc8fe882ba +P 2f7c946c5f25a858167f5193ca06e53310394c8cff15426ab8a1327a1ec835fd +R efed3f9c2718d18bc8a69a58b9e2f371 +U drh +Z 00ef577a561ca93dc97c1f48c37c36a1 diff --git a/manifest.uuid b/manifest.uuid index a35b5dd3ec..fb3f190d8a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2f7c946c5f25a858167f5193ca06e53310394c8cff15426ab8a1327a1ec835fd \ No newline at end of file +94b59691ee50a4666b25e36d1529fc52f714bbe94c3e8ccb35bf0a4ea11050db \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 840bdb4034..e4f389ca3d 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -433,7 +433,6 @@ static void statInit( + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample); } #endif - db = sqlite3_context_db_handle(context); p = sqlite3DbMallocZero(db, n); if( p==0 ){ sqlite3_result_error_nomem(context); diff --git a/src/btree.c b/src/btree.c index 74e60d98de..a366b06bbb 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5480,9 +5480,7 @@ int sqlite3BtreeTableMoveto( if( pCur->info.nKey==intKey ){ return SQLITE_OK; } - }else if( rc==SQLITE_DONE ){ - rc = SQLITE_OK; - }else{ + }else if( rc!=SQLITE_DONE ){ return rc; } } diff --git a/src/build.c b/src/build.c index 126aa16ce6..f7d285c2b8 100644 --- a/src/build.c +++ b/src/build.c @@ -4382,7 +4382,7 @@ exit_create_index: ** The list was already ordered when this routine was entered, so at this ** point at most a single index (the newly added index) will be out of ** order. So we have to reorder at most one index. */ - Index **ppFrom = &pTab->pIndex; + Index **ppFrom; Index *pThis; for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){ Index *pNext; diff --git a/src/pager.c b/src/pager.c index 87aaa163bd..00ab38e512 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4858,6 +4858,7 @@ int sqlite3PagerOpen( pPager->zWal = 0; } #endif + (void)pPtr; /* Suppress warning about unused pPtr value */ if( nPathname ) sqlite3DbFree(0, zPathname); pPager->pVfs = pVfs; diff --git a/src/select.c b/src/select.c index 6af8b85bc1..a06031e02d 100644 --- a/src/select.c +++ b/src/select.c @@ -2434,7 +2434,7 @@ static void generateWithRecursiveQuery( SrcList *pSrc = p->pSrc; /* The FROM clause of the recursive query */ int nCol = p->pEList->nExpr; /* Number of columns in the recursive table */ Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */ - Select *pSetup = p->pPrior; /* The setup query */ + Select *pSetup; /* The setup query */ Select *pFirstRec; /* Left-most recursive term */ int addrTop; /* Top of the loop */ int addrCont, addrBreak; /* CONTINUE and BREAK addresses */ @@ -2518,7 +2518,6 @@ static void generateWithRecursiveQuery( ** iDistinct table. pFirstRec is left pointing to the left-most ** recursive term of the CTE. */ - pFirstRec = p; for(pFirstRec=p; ALWAYS(pFirstRec!=0); pFirstRec=pFirstRec->pPrior){ if( pFirstRec->selFlags & SF_Aggregate ){ sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported"); diff --git a/src/shell.c.in b/src/shell.c.in index bb02fa1657..b9909bc165 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1455,7 +1455,6 @@ static void editFunc( sqlite3_int64 i, j; if( hasCRNL ){ /* If the original contains \r\n then do no conversions back to \n */ - j = sz; }else{ /* If the file did not originally contain \r\n then convert any new ** \r\n back into \n */ @@ -3328,7 +3327,7 @@ static void exec_prepared_stmt( int nCol = sqlite3_column_count(pStmt); void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); if( !pData ){ - rc = SQLITE_NOMEM; + shell_out_of_memory(); }else{ char **azCols = (char **)pData; /* Names of result columns */ char **azVals = &azCols[nCol]; /* Results */ @@ -5774,8 +5773,7 @@ static void newTempFile(ShellState *p, const char *zSuffix){ p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); } if( p->zTempFile==0 ){ - raw_printf(stderr, "out of memory\n"); - exit(1); + shell_out_of_memory(); } } @@ -8590,7 +8588,7 @@ static int do_meta_command(char *zLine, ShellState *p){ rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); i = 0; - while( sqlite3_step(pStmt)==SQLITE_ROW ){ + while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ char zLabel[20]; const char *zCol = (const char*)sqlite3_column_text(pStmt,2); i++; @@ -8832,10 +8830,11 @@ static int do_meta_command(char *zLine, ShellState *p){ }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){ raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n", p->lineno, azArg[1]); exit(1); + }else{ + p->bSafeMode = 0; + return 0; /* Return immediately to bypass the safe mode reset + ** at the end of this procedure */ } - p->bSafeMode = 0; - return 0; /* Return immediately to bypass the safe mode reset - ** at the end of this procedure */ }else if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ @@ -9094,7 +9093,7 @@ static int do_meta_command(char *zLine, ShellState *p){ rx = sqlite3_prepare_v2(p->db, "SELECT key, quote(value) " "FROM temp.sqlite_parameters;", -1, &pStmt, 0); - while( sqlite3_step(pStmt)==SQLITE_ROW ){ + while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), sqlite3_column_text(pStmt,1)); } @@ -10067,8 +10066,10 @@ static int do_meta_command(char *zLine, ShellState *p){ } } rc = sqlite3_finalize(pStmt); - appendText(&s, " ORDER BY 1", 0); - rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + appendText(&s, " ORDER BY 1", 0); + rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); + } freeText(&s); if( rc ) return shellDatabaseError(p->db); @@ -10643,6 +10644,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss){ char cWait = (char)qss; /* intentional narrowing loss */ if( cWait==0 ){ PlainScan: + assert( cWait==0 ); while( (cin = *zLine++)!=0 ){ if( IsSpace(cin) ) continue; diff --git a/src/vdbe.c b/src/vdbe.c index e4995bbcf9..fa98c244c6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7735,7 +7735,6 @@ case OP_VFilter: { /* jump */ iQuery = (int)pQuery->u.i; /* Invoke the xFilter method */ - res = 0; apArg = p->apArg; for(i = 0; iapCsr[pOp->p1]; assert( pCur->eCurType==CURTYPE_VTAB ); if( pCur->nullRow ){ From 810121623bba3e3dbc23baeca4362896c299a32f Mon Sep 17 00:00:00 2001 From: larrybr Date: Sat, 2 Oct 2021 15:34:52 +0000 Subject: [PATCH 122/130] Fix CLI line processing. (back to start state after meta-command executes) FossilOrigin-Name: 928c2a34986644d34bcb5e8a1b2720f31cf703383f4ce75381faefca6f356d04 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/shell.c.in | 1 + 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 7286e6e0f8..4448d6578b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sgroup_concat()\swhen\sit\sis\sused\sas\sa\swindow\sfunction\swith\na\ssliding\swindow,\sas\sdescribed\sby\n[forum:/forumpost/f3eb24a6c0|forum\sthread\sf3eb24a6c0]. -D 2021-10-01T22:48:52.993 +C Fix\sCLI\sline\sprocessing.\s(back\sto\sstart\sstate\safter\smeta-command\sexecutes) +D 2021-10-02T15:34:52.035 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 916d18b586d8efad5a46040e48405f42e7f90fff33bca1cfab040169515ec525 -F src/shell.c.in 928114971b558dc2e40a1afaf07e3e5e93558a77ecca95067c51e1f9d3c1441a +F src/shell.c.in ed6eca3f048731abe688bbf656cc14522e6b8e80cd17b8542d789cf2e46a384e F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1929,8 +1929,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 94b59691ee50a4666b25e36d1529fc52f714bbe94c3e8ccb35bf0a4ea11050db 8bd721c29e7a28cd75885dd80235e4e37aa0847229f769f49e01127f794fa63a -R 755a222a3849cf0b99ca8b66d427fd7c -T +closed 8bd721c29e7a28cd75885dd80235e4e37aa0847229f769f49e01127f794fa63a -U drh -Z d91f8598d681fe6b47f22c72a76f272f +P f47f7f78227830c065d9ce715b8456eab81a38d680f76bf4ff08f298d84f9c7a +R 62c6b6b7dfa60befa70e3fc7e7596c05 +U larrybr +Z 00be79fd8f3326e4653e355698a3033c diff --git a/manifest.uuid b/manifest.uuid index 83de866a84..d2a3e8b8ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f47f7f78227830c065d9ce715b8456eab81a38d680f76bf4ff08f298d84f9c7a \ No newline at end of file +928c2a34986644d34bcb5e8a1b2720f31cf703383f4ce75381faefca6f356d04 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index b9909bc165..015d71aad9 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10845,6 +10845,7 @@ static int process_input(ShellState *p){ errCnt++; } } + qss = QSS_Start; continue; } nLine = strlen30(zLine); From 76fc88fe0fe434f1f428cef0503e1224800fab7c Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 2 Oct 2021 16:39:16 +0000 Subject: [PATCH 123/130] Fix harmless compiler warnings FossilOrigin-Name: bdb9dc8a025b509960d08cdf0ff784dd075c156860548d7908de7d97e030701c --- ext/misc/series.c | 2 +- ext/misc/zipfile.c | 1 + manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/os.c | 1 + src/shell.c.in | 8 ++++---- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/ext/misc/series.c b/ext/misc/series.c index 08e1829b8c..e8d8c10aec 100644 --- a/ext/misc/series.c +++ b/ext/misc/series.c @@ -448,7 +448,7 @@ int sqlite3_series_init( int rc = SQLITE_OK; SQLITE_EXTENSION_INIT2(pApi); #ifndef SQLITE_OMIT_VIRTUALTABLE - if( sqlite3_libversion_number()<3008012 ){ + if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){ *pzErrMsg = sqlite3_mprintf( "generate_series() requires SQLite 3.8.12 or later"); return SQLITE_ERROR; diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 12453900ed..78c669631c 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -561,6 +561,7 @@ static u16 zipfileGetU16(const u8 *aBuf){ ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf. */ static u32 zipfileGetU32(const u8 *aBuf){ + if( aBuf==0 ) return 0; return ((u32)(aBuf[3]) << 24) + ((u32)(aBuf[2]) << 16) + ((u32)(aBuf[1]) << 8) diff --git a/manifest b/manifest index 4448d6578b..569da70ac5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sCLI\sline\sprocessing.\s(back\sto\sstart\sstate\safter\smeta-command\sexecutes) -D 2021-10-02T15:34:52.035 +C Fix\sharmless\scompiler\swarnings +D 2021-10-02T16:39:16.344 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -320,7 +320,7 @@ F ext/misc/regexp.c 5853b0e5ed40c47f7ded2b0bf2ff73796f7cb21543089c5f07308e003264 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 -F ext/misc/series.c 233804fd4e07de94ecae42b487fb38bbd819b249114bb34bb46f227c8c7111df +F ext/misc/series.c f9896e76b029e3c6553c520552555e803e26e7dfe1890d5866243cf072d938d0 F ext/misc/sha1.c c8f2253c8792ffab9517695ea7d88c079f0395a5505eefef5c8198fe184ed5ac F ext/misc/shathree.c e984f31731de4cf302a0386be5fe664580f63d8204c47b9b41cc4b997745f9ec F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 @@ -338,7 +338,7 @@ F ext/misc/vfsstat.c 474d08efc697b8eba300082cb1eb74a5f0f3df31ed257db1cb07e72ab0e F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c a838d1bea913c514ff316c69695efbb49ea3b8cb37d22afc57f73b6b010b4546 -F ext/misc/zipfile.c f01cc496f082b361520223df1bbb685576c45539fd511ea50b2ed19ce7081111 +F ext/misc/zipfile.c 9078475440114135594322cdf137f5475acfca5ab22af21a3f3e65ba38d2de20 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8 F ext/rbu/rbu1.test c62904bd9526dcdc3496a21199aaf14ae191bbadbf67f076bf16be6b3f2115c2 @@ -529,7 +529,7 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c dd2b3f1cc1863079bc1349ac0fec395a500090c4fe4e11ab775310a49f2f956d F src/mutex_w32.c caa50e1c0258ac4443f52e00fe8aaea73b6d0728bd8856bedfff822cae418541 F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 -F src/os.c 59ed1f503347e8b5434c0ce7d7d0f02a3f24a72fea8b26d0bba2de8dfaef778b +F src/os.c 91fc69f95ef0528368174dca20f01e1d8f82934f719e1cb50fd0260b18c028a6 F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 916d18b586d8efad5a46040e48405f42e7f90fff33bca1cfab040169515ec525 -F src/shell.c.in ed6eca3f048731abe688bbf656cc14522e6b8e80cd17b8542d789cf2e46a384e +F src/shell.c.in 5a4ccff506efcc58b72df1bff13d9f54c1534887c93d42746d6f1ccf1d0a815a F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1929,7 +1929,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 f47f7f78227830c065d9ce715b8456eab81a38d680f76bf4ff08f298d84f9c7a -R 62c6b6b7dfa60befa70e3fc7e7596c05 -U larrybr -Z 00be79fd8f3326e4653e355698a3033c +P 928c2a34986644d34bcb5e8a1b2720f31cf703383f4ce75381faefca6f356d04 +R e85aa0a583053f59c7db0ebab1450d1b +U drh +Z d1f68cf6d8948736d6cc86bb510479d1 diff --git a/manifest.uuid b/manifest.uuid index d2a3e8b8ce..ce8d80ca85 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -928c2a34986644d34bcb5e8a1b2720f31cf703383f4ce75381faefca6f356d04 \ No newline at end of file +bdb9dc8a025b509960d08cdf0ff784dd075c156860548d7908de7d97e030701c \ No newline at end of file diff --git a/src/os.c b/src/os.c index f1798ff96e..cf26b8ae5d 100644 --- a/src/os.c +++ b/src/os.c @@ -161,6 +161,7 @@ int sqlite3OsSectorSize(sqlite3_file *id){ return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); } int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ + if( NEVER(id->pMethods==0) ) return 0; return id->pMethods->xDeviceCharacteristics(id); } #ifndef SQLITE_OMIT_WAL diff --git a/src/shell.c.in b/src/shell.c.in index 015d71aad9..cf04378db8 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3183,9 +3183,9 @@ static void exec_prepared_stmt_columnar( z = (const char*)sqlite3_column_text(pStmt,i); azData[nRow*nColumn + i] = z ? strdup(z) : 0; } - }while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ); + }while( sqlite3_step(pStmt)==SQLITE_ROW ); if( nColumn>p->nWidth ){ - p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); + p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int)); if( p->colWidth==0 ) shell_out_of_memory(); for(i=p->nWidth; icolWidth[i] = 0; p->nWidth = nColumn; @@ -5385,7 +5385,7 @@ static void tryToCloneSchema( zQuery); goto end_schema_xfer; } - while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ + while( sqlite3_step(pQuery)==SQLITE_ROW ){ zName = sqlite3_column_text(pQuery, 0); zSql = sqlite3_column_text(pQuery, 1); printf("%s... ", zName); fflush(stdout); @@ -10595,7 +10595,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int j; assert( nArg<=ArraySize(azArg) ); p->nWidth = nArg-1; - p->colWidth = realloc(p->colWidth, p->nWidth*sizeof(int)*2); + p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2); if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; for(j=1; j Date: Sat, 2 Oct 2021 17:12:58 +0000 Subject: [PATCH 124/130] Make the sqlite3_filename_xxxx() interfaces robust against NULL pointer arguments, even though the documentation says the behavior is undefined in that case. FossilOrigin-Name: dd64c60bab4e2b44419db6882dfcc80b73d733ebe3bea64a7588c33fbc428234 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/main.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 569da70ac5..c4908d4755 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings -D 2021-10-02T16:39:16.344 +C Make\sthe\ssqlite3_filename_xxxx()\sinterfaces\srobust\sagainst\sNULL\spointer\narguments,\seven\sthough\sthe\sdocumentation\ssays\sthe\sbehavior\sis\sundefined\nin\sthat\scase. +D 2021-10-02T17:12:58.929 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 16fa4b66709db6db5bb31475f2321d0a839269765aa2461a520c151c385e8b9d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c 9b99470c8bffc08b3758dca06a6af0961c919db554b58f2ffad51b05147f1186 +F src/main.c ff4c89bdfd980b59126d3f6ed4677b1e79fcb93fb72d09908019d533fd0ff134 F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1929,7 +1929,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 928c2a34986644d34bcb5e8a1b2720f31cf703383f4ce75381faefca6f356d04 -R e85aa0a583053f59c7db0ebab1450d1b +P bdb9dc8a025b509960d08cdf0ff784dd075c156860548d7908de7d97e030701c +R d05379f0eecffcb85b33e0b6c9d4d52f U drh -Z d1f68cf6d8948736d6cc86bb510479d1 +Z ae6b1e556240082c07b6b21a5e0ef3b0 diff --git a/manifest.uuid b/manifest.uuid index ce8d80ca85..0ee890ad9c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bdb9dc8a025b509960d08cdf0ff784dd075c156860548d7908de7d97e030701c \ No newline at end of file +dd64c60bab4e2b44419db6882dfcc80b73d733ebe3bea64a7588c33fbc428234 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 65fe4a6688..c44b9b4702 100644 --- a/src/main.c +++ b/src/main.c @@ -4487,9 +4487,11 @@ sqlite3_int64 sqlite3_uri_int64( ** corruption. */ const char *sqlite3_filename_database(const char *zFilename){ + if( zFilename==0 ) return 0; return databaseName(zFilename); } const char *sqlite3_filename_journal(const char *zFilename){ + if( zFilename==0 ) return 0; zFilename = databaseName(zFilename); zFilename += sqlite3Strlen30(zFilename) + 1; while( zFilename[0] ){ @@ -4503,7 +4505,7 @@ const char *sqlite3_filename_wal(const char *zFilename){ return 0; #else zFilename = sqlite3_filename_journal(zFilename); - zFilename += sqlite3Strlen30(zFilename) + 1; + if( zFilename ) zFilename += sqlite3Strlen30(zFilename) + 1; return zFilename; #endif } From 9673cd0de7dd2dbc4fd1c0b082e27c5e00f67c61 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 2 Oct 2021 17:34:28 +0000 Subject: [PATCH 125/130] Remove an unnecessary static buffer from sqlite3VdbeExpandSql(). FossilOrigin-Name: 953a33b7f739bb39f4a0efedcad2236c09fb798da4a519f8e1049aebe3bbf3ff --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbetrace.c | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c4908d4755..f34671f694 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sthe\ssqlite3_filename_xxxx()\sinterfaces\srobust\sagainst\sNULL\spointer\narguments,\seven\sthough\sthe\sdocumentation\ssays\sthe\sbehavior\sis\sundefined\nin\sthat\scase. -D 2021-10-02T17:12:58.929 +C Remove\san\sunnecessary\sstatic\sbuffer\sfrom\ssqlite3VdbeExpandSql(). +D 2021-10-02T17:34:28.966 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -629,7 +629,7 @@ F src/vdbeaux.c 2368a8888f17368d4040a05966f7d2a2276cac4eeeba50793828186d999e3c8f F src/vdbeblob.c 60a7694760e35b2bba166cf49eb6a1eb0b31581102b49de78008ca3032406065 F src/vdbemem.c 0e830c2aab24241eed85bd4c8a5bd8c9b959081316477440bfffb35089ba7d0b F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 -F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 +F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c c289aa504f278f23b64cb33c95d284495c5f405bd363b419d31c92c61c14df1f F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 @@ -1929,7 +1929,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 bdb9dc8a025b509960d08cdf0ff784dd075c156860548d7908de7d97e030701c -R d05379f0eecffcb85b33e0b6c9d4d52f +P dd64c60bab4e2b44419db6882dfcc80b73d733ebe3bea64a7588c33fbc428234 +R e771ef06e483311628276065877f4a87 U drh -Z ae6b1e556240082c07b6b21a5e0ef3b0 +Z 409febaf73a0d399cf250c72faf60d59 diff --git a/manifest.uuid b/manifest.uuid index 0ee890ad9c..a9fbdcb854 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dd64c60bab4e2b44419db6882dfcc80b73d733ebe3bea64a7588c33fbc428234 \ No newline at end of file +953a33b7f739bb39f4a0efedcad2236c09fb798da4a519f8e1049aebe3bbf3ff \ No newline at end of file diff --git a/src/vdbetrace.c b/src/vdbetrace.c index 1095e7f589..ae8ad3115f 100644 --- a/src/vdbetrace.c +++ b/src/vdbetrace.c @@ -84,11 +84,9 @@ char *sqlite3VdbeExpandSql( #ifndef SQLITE_OMIT_UTF16 Mem utf8; /* Used to convert UTF16 into UTF8 for display */ #endif - char zBase[100]; /* Initial working space */ db = p->db; - sqlite3StrAccumInit(&out, 0, zBase, sizeof(zBase), - db->aLimit[SQLITE_LIMIT_LENGTH]); + sqlite3StrAccumInit(&out, 0, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); if( db->nVdbeExec>1 ){ while( *zRawSql ){ const char *zStart = zRawSql; From 952f35b24d9e140c5c42df1e61c18928890c64b8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 2 Oct 2021 17:46:24 +0000 Subject: [PATCH 126/130] Fix a harmless static-analyzer warning in sqlite3ExprCode(). FossilOrigin-Name: 918c22e82ae6e366ddd094d337ed73fd23878c51745045519ed700113832545c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f34671f694..1cf0cb86a4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunnecessary\sstatic\sbuffer\sfrom\ssqlite3VdbeExpandSql(). -D 2021-10-02T17:34:28.966 +C Fix\sa\sharmless\sstatic-analyzer\swarning\sin\ssqlite3ExprCode(). +D 2021-10-02T17:46:24.515 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -501,7 +501,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c 82797e5d82422d34ede9a95ba459f40c317b2daadb21109a21abfd42f84e3ed8 +F src/expr.c ebc76aa98b9bcd556c2855942c18f4d2f52c6504c13f7285413026bdd1c7bbf5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c f4924c04e95335762ed1b24f184df26d0db5b20e87decbc5a0ed6431f7ebd9ca @@ -1929,7 +1929,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 dd64c60bab4e2b44419db6882dfcc80b73d733ebe3bea64a7588c33fbc428234 -R e771ef06e483311628276065877f4a87 +P 953a33b7f739bb39f4a0efedcad2236c09fb798da4a519f8e1049aebe3bbf3ff +R eec41ce7eba3f81a969c5c018c3299c3 U drh -Z 409febaf73a0d399cf250c72faf60d59 +Z ca31665b692f9e645cca03a4673a842f diff --git a/manifest.uuid b/manifest.uuid index a9fbdcb854..9a537765fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -953a33b7f739bb39f4a0efedcad2236c09fb798da4a519f8e1049aebe3bbf3ff \ No newline at end of file +918c22e82ae6e366ddd094d337ed73fd23878c51745045519ed700113832545c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index d121fbfd22..14fe8e5bdb 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4798,7 +4798,7 @@ void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); if( inReg!=target ){ u8 op; - if( ExprHasProperty(pExpr,EP_Subquery) ){ + if( ALWAYS(pExpr) && ExprHasProperty(pExpr,EP_Subquery) ){ op = OP_Copy; }else{ op = OP_SCopy; From ad1188b21c6fc7a08a6639c7c09beb5295c15a09 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 2 Oct 2021 18:22:24 +0000 Subject: [PATCH 127/130] Try to fix a harmless static-analyzer warning in sqlite3BtreeTransferRow(). FossilOrigin-Name: 5906a0152deded614d965e790a33c67832890828a4835451d65c06414ba71f8b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1cf0cb86a4..cb9695eaa2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\sstatic-analyzer\swarning\sin\ssqlite3ExprCode(). -D 2021-10-02T17:46:24.515 +C Try\sto\sfix\sa\sharmless\sstatic-analyzer\swarning\sin\ssqlite3BtreeTransferRow(). +D 2021-10-02T18:22:24.853 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c c97860dd57b01415b10ab9c976f52804d8cd914537465ca3b9fd52cab1321f2d +F src/btree.c ced03fe226a3a42b77b504afcd0a9da14da39b42fac5935988243803cf03bc14 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001 @@ -1929,7 +1929,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 953a33b7f739bb39f4a0efedcad2236c09fb798da4a519f8e1049aebe3bbf3ff -R eec41ce7eba3f81a969c5c018c3299c3 +P 918c22e82ae6e366ddd094d337ed73fd23878c51745045519ed700113832545c +R 5781c21c06185469dcaa5dd85fb44478 U drh -Z ca31665b692f9e645cca03a4673a842f +Z 74091180b7dd3dec2d49d6625f2783ff diff --git a/manifest.uuid b/manifest.uuid index 9a537765fe..e004fbdbf2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -918c22e82ae6e366ddd094d337ed73fd23878c51745045519ed700113832545c \ No newline at end of file +5906a0152deded614d965e790a33c67832890828a4835451d65c06414ba71f8b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a366b06bbb..6db35cd315 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9153,7 +9153,7 @@ int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 iKey){ } }while( rc==SQLITE_OK && nOut>0 ); - if( rc==SQLITE_OK && nRem>0 ){ + if( rc==SQLITE_OK && nRem>0 && ALWAYS(pPgnoOut) ){ Pgno pgnoNew; MemPage *pNew = 0; rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); From 5bf4715e0184cceca87c372af609959c6df75b43 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 3 Oct 2021 00:12:43 +0000 Subject: [PATCH 128/130] Add the sqlite3ResultStrAccum() internal interface to simplify the the implementation of functions that return strings. FossilOrigin-Name: e548e9299d3fd6ce5b647cf0dd93ff8e917a5eda43076c6a02389c52640e2e50 --- manifest | 20 ++--- manifest.uuid | 2 +- src/analyze.c | 44 ++++------- src/date.c | 191 ++++++++++++++++++++---------------------------- src/func.c | 11 +-- src/printf.c | 16 ++++ src/sqliteInt.h | 1 + 7 files changed, 122 insertions(+), 163 deletions(-) diff --git a/manifest b/manifest index cb9695eaa2..f45622eb31 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Try\sto\sfix\sa\sharmless\sstatic-analyzer\swarning\sin\ssqlite3BtreeTransferRow(). -D 2021-10-02T18:22:24.853 +C Add\sthe\ssqlite3ResultStrAccum()\sinternal\sinterface\sto\ssimplify\sthe\nthe\simplementation\sof\sfunctions\sthat\sreturn\sstrings. +D 2021-10-03T00:12:43.656 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -484,7 +484,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c a6afe961ef3544104fa635a0c3161bfe1a34382f32e2a28706993abadedbffed -F src/analyze.c 6ff8ae7b9e8dfacd62447e1204d85e57f76580c955f4faf953704c36ed8ac60e +F src/analyze.c 979b6d2cdaca992a9c9f0818de55d08fb9a4e52929a509752b52d9fd23bb86d3 F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d @@ -497,14 +497,14 @@ F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 -F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf +F src/date.c 467848d8187382764e37fd7678d6825cdfb90d9e564648527ed832e999ea7b85 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c ebc76aa98b9bcd556c2855942c18f4d2f52c6504c13f7285413026bdd1c7bbf5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c -F src/func.c f4924c04e95335762ed1b24f184df26d0db5b20e87decbc5a0ed6431f7ebd9ca +F src/func.c 761a989e9b6a1f03cae05ef274f30881cb8f7ec816af2913b58dc18ac31ffd0e F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -545,7 +545,7 @@ F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927 F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 -F src/printf.c 1ce574bf02b503b0e031a70d3453324a9f4a0eb1ad379f3324ced73b918ed20b +F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 @@ -554,7 +554,7 @@ F src/shell.c.in 5a4ccff506efcc58b72df1bff13d9f54c1534887c93d42746d6f1ccf1d0a815 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 2cfc99065003dd1f5d91a85114449f920fde0adbea4bdbd524fca8907a6e38f3 +F src/sqliteInt.h e105aa8ec699c8c247117b99080b49c175b013493f9938bd411f00d839a381dc F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1929,7 +1929,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 918c22e82ae6e366ddd094d337ed73fd23878c51745045519ed700113832545c -R 5781c21c06185469dcaa5dd85fb44478 +P 5906a0152deded614d965e790a33c67832890828a4835451d65c06414ba71f8b +R 899d8dbf1371ef1c2da55d4150a8c0b1 U drh -Z 74091180b7dd3dec2d49d6625f2783ff +Z 0fd44f9546cbcefb4424b0b49d87120d diff --git a/manifest.uuid b/manifest.uuid index e004fbdbf2..83db15e38e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5906a0152deded614d965e790a33c67832890828a4835451d65c06414ba71f8b \ No newline at end of file +e548e9299d3fd6ce5b647cf0dd93ff8e917a5eda43076c6a02389c52640e2e50 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index e4f389ca3d..d38cb18784 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -851,28 +851,19 @@ static void statGet( ** ** I = (K+D-1)/D */ - char *z; - int i; + sqlite3_str sStat; /* Text of the constructed "stat" line */ + int i; /* Loop counter */ - char *zRet = sqlite3MallocZero( (p->nKeyCol+1)*25 ); - if( zRet==0 ){ - sqlite3_result_error_nomem(context); - return; - } - - sqlite3_snprintf(24, zRet, "%llu", + sqlite3StrAccumInit(&sStat, 0, 0, 0, (p->nKeyCol+1)*100); + sqlite3_str_appendf(&sStat, "%llu", p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow); - z = zRet + sqlite3Strlen30(zRet); for(i=0; inKeyCol; i++){ u64 nDistinct = p->current.anDLt[i] + 1; u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; - sqlite3_snprintf(24, z, " %llu", iVal); - z += sqlite3Strlen30(z); + sqlite3_str_appendf(&sStat, " %llu", iVal); assert( p->current.anEq[i] ); } - assert( z[0]=='\0' && z>zRet ); - - sqlite3_result_text(context, zRet, -1, sqlite3_free); + sqlite3ResultStrAccum(context, &sStat); } #ifdef SQLITE_ENABLE_STAT4 else if( eCall==STAT_GET_ROWID ){ @@ -891,6 +882,8 @@ static void statGet( } }else{ tRowcnt *aCnt = 0; + sqlite3_str sStat; + int i; assert( p->iGetnSample ); switch( eCall ){ @@ -902,23 +895,12 @@ static void statGet( break; } } - - { - char *zRet = sqlite3MallocZero(p->nCol * 25); - if( zRet==0 ){ - sqlite3_result_error_nomem(context); - }else{ - int i; - char *z = zRet; - for(i=0; inCol; i++){ - sqlite3_snprintf(24, z, "%llu ", (u64)aCnt[i]); - z += sqlite3Strlen30(z); - } - assert( z[0]=='\0' && z>zRet ); - z[-1] = '\0'; - sqlite3_result_text(context, zRet, -1, sqlite3_free); - } + sqlite3StrAccumInit(&sStat, 0, 0, 0, p->nCol*100); + for(i=0; inCol; i++){ + sqlite3_str_appendf(&sStat, "%llu ", (u64)aCnt[i]); } + if( sStat.nChar ) sStat.nChar--; + sqlite3ResultStrAccum(context, &sStat); } #endif /* SQLITE_ENABLE_STAT4 */ #ifndef SQLITE_DEBUG diff --git a/src/date.c b/src/date.c index f88f544e3a..fb83ad1876 100644 --- a/src/date.c +++ b/src/date.c @@ -1009,131 +1009,100 @@ static void strftimeFunc( sqlite3_value **argv ){ DateTime x; - u64 n; size_t i,j; - char *z; sqlite3 *db; const char *zFmt; - char zBuf[100]; + sqlite3_str sRes; + + if( argc==0 ) return; zFmt = (const char*)sqlite3_value_text(argv[0]); if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return; db = sqlite3_context_db_handle(context); - for(i=0, n=1; zFmt[i]; i++, n++){ - if( zFmt[i]=='%' ){ - switch( zFmt[i+1] ){ - case 'd': - case 'H': - case 'm': - case 'M': - case 'S': - case 'W': - n++; - /* fall thru */ - case 'w': - case '%': - break; - case 'f': - n += 8; - break; - case 'j': - n += 3; - break; - case 'Y': - n += 8; - break; - case 's': - case 'J': - n += 50; - break; - default: - return; /* ERROR. return a NULL */ - } - i++; - } - } - testcase( n==sizeof(zBuf)-1 ); - testcase( n==sizeof(zBuf) ); - testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); - testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ); - if( n(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){ - sqlite3_result_error_toobig(context); - return; - }else{ - z = sqlite3DbMallocRawNN(db, (int)n); - if( z==0 ){ - sqlite3_result_error_nomem(context); - return; - } - } + sqlite3StrAccumInit(&sRes, 0, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + computeJD(&x); computeYMD_HMS(&x); for(i=j=0; zFmt[i]; i++){ - if( zFmt[i]!='%' ){ - z[j++] = zFmt[i]; - }else{ - i++; - switch( zFmt[i] ){ - case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break; - case 'f': { - double s = x.s; - if( s>59.999 ) s = 59.999; - sqlite3_snprintf(7, &z[j],"%06.3f", s); - j += sqlite3Strlen30(&z[j]); - break; + if( zFmt[i]!='%' ) continue; + if( j59.999 ) s = 59.999; + sqlite3_str_appendf(&sRes, "%06.3f", s); + break; + } + case 'H': { + sqlite3_str_appendf(&sRes, "%02d", x.h); + break; + } + case 'W': /* Fall thru */ + case 'j': { + int nDay; /* Number of days since 1st day of year */ + DateTime y = x; + y.validJD = 0; + y.M = 1; + y.D = 1; + computeJD(&y); + nDay = (int)((x.iJD-y.iJD+43200000)/86400000); + if( zFmt[i]=='W' ){ + int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ + wd = (int)(((x.iJD+43200000)/86400000)%7); + sqlite3_str_appendf(&sRes,"%02d",(nDay+7-wd)/7); + }else{ + sqlite3_str_appendf(&sRes,"%03d",nDay+1); } - case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break; - case 'W': /* Fall thru */ - case 'j': { - int nDay; /* Number of days since 1st day of year */ - DateTime y = x; - y.validJD = 0; - y.M = 1; - y.D = 1; - computeJD(&y); - nDay = (int)((x.iJD-y.iJD+43200000)/86400000); - if( zFmt[i]=='W' ){ - int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ - wd = (int)(((x.iJD+43200000)/86400000)%7); - sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7); - j += 2; - }else{ - sqlite3_snprintf(4, &z[j],"%03d",nDay+1); - j += 3; - } - break; - } - case 'J': { - sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0); - j+=sqlite3Strlen30(&z[j]); - break; - } - case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; - case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; - case 's': { - i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000); - sqlite3Int64ToText(iS, &z[j]); - j += sqlite3Strlen30(&z[j]); - break; - } - case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; - case 'w': { - z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0'; - break; - } - case 'Y': { - sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]); - break; - } - default: z[j++] = '%'; break; + break; + } + case 'J': { + sqlite3_str_appendf(&sRes,"%.16g",x.iJD/86400000.0); + break; + } + case 'm': { + sqlite3_str_appendf(&sRes,"%02d",x.M); + break; + } + case 'M': { + sqlite3_str_appendf(&sRes,"%02d",x.m); + break; + } + case 's': { + i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000); + sqlite3_str_appendf(&sRes,"%lld",iS); + break; + } + case 'S': { + sqlite3_str_appendf(&sRes,"%02d",(int)x.s); + break; + } + case 'w': { + sqlite3_str_appendchar(&sRes, 1, + (char)(((x.iJD+129600000)/86400000) % 7) + '0'); + break; + } + case 'Y': { + sqlite3_str_appendf(&sRes,"%04d",x.Y); + break; + } + case '%': { + sqlite3_str_appendchar(&sRes, 1, '%'); + break; + } + default: { + sqlite3_str_reset(&sRes); + return; } } } - z[j] = 0; - sqlite3_result_text(context, z, -1, - z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC); + if( jstr; - if( pAccum->accError==SQLITE_TOOBIG ){ - sqlite3_result_error_toobig(context); - }else if( pAccum->accError==SQLITE_NOMEM ){ - sqlite3_result_error_nomem(context); - }else{ - int n = pAccum->nChar; - sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), n, - sqlite3_free); - } + sqlite3ResultStrAccum(context, &pGCC->str); #ifndef SQLITE_OMIT_WINDOWFUNC sqlite3_free(pGCC->pnSepLengths); #endif diff --git a/src/printf.c b/src/printf.c index eb06e1a23d..e63518450c 100644 --- a/src/printf.c +++ b/src/printf.c @@ -1044,6 +1044,22 @@ char *sqlite3StrAccumFinish(StrAccum *p){ return p->zText; } +/* +** Use the content of the StrAccum passed as the second argument +** as the result of an SQL function. +*/ +void sqlite3ResultStrAccum(sqlite3_context *pCtx, StrAccum *p){ + if( p->accError ){ + sqlite3_result_error_code(pCtx, p->accError); + sqlite3_str_reset(p); + }else if( isMalloced(p) ){ + sqlite3_result_text(pCtx, p->zText, p->nChar, SQLITE_DYNAMIC); + }else{ + sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); + sqlite3_str_reset(p); + } +} + /* ** This singleton is an sqlite3_str object that is returned if ** sqlite3_malloc() fails to provide space for a real one. This diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c1e0638dc3..a7f830263c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4941,6 +4941,7 @@ int sqlite3OpenTempDatabase(Parse *); void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); char *sqlite3StrAccumFinish(StrAccum*); void sqlite3StrAccumSetError(StrAccum*, u8); +void sqlite3ResultStrAccum(sqlite3_context*,StrAccum*); void sqlite3SelectDestInit(SelectDest*,int,int); Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); From d797d6b626996f62bd0fc499e3d8eff2483e02ea Mon Sep 17 00:00:00 2001 From: larrybr Date: Sun, 3 Oct 2021 22:03:59 +0000 Subject: [PATCH 129/130] In CLI, ensure correct line-accumulation state whenever line(s) are dumped or processed. And test this. FossilOrigin-Name: be211a9c59234ef202e772fcaae18be43c44e1e00674f137cad2d903e00bfcab --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 6 +++++- test/shell1.test | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f45622eb31..1f24513b7d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3ResultStrAccum()\sinternal\sinterface\sto\ssimplify\sthe\nthe\simplementation\sof\sfunctions\sthat\sreturn\sstrings. -D 2021-10-03T00:12:43.656 +C In\sCLI,\sensure\scorrect\sline-accumulation\sstate\swhenever\sline(s)\sare\sdumped\sor\sprocessed.\sAnd\stest\sthis. +D 2021-10-03T22:03:59.982 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 916d18b586d8efad5a46040e48405f42e7f90fff33bca1cfab040169515ec525 -F src/shell.c.in 5a4ccff506efcc58b72df1bff13d9f54c1534887c93d42746d6f1ccf1d0a815a +F src/shell.c.in 923671ae56ad899db71296d0ebefea9c85e7e52ef087c8a097f3f3a3a3ade98c F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1376,7 +1376,7 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 56a7358a2a05e850e9e4aa24629db9c8975e8038dbe8debd2d95be22a5f03612 +F test/shell1.test d014dc15876233d06df1eaf5a22275653a1d391abf1ca28df5ef3ac688df72e9 F test/shell2.test a03b835a9e7dcc1f79b471e4d62e0c85bdc4cb954a00820702603f1409553caf F test/shell3.test 1586a163e7918775d3c25530bf84200453f30a77cc338490389114a67352f4d9 F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f48be @@ -1929,7 +1929,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 5906a0152deded614d965e790a33c67832890828a4835451d65c06414ba71f8b -R 899d8dbf1371ef1c2da55d4150a8c0b1 -U drh -Z 0fd44f9546cbcefb4424b0b49d87120d +P e548e9299d3fd6ce5b647cf0dd93ff8e917a5eda43076c6a02389c52640e2e50 +R 38415c55bb15ec5e5592551fc07b2f41 +U larrybr +Z ce1b9939396109dd8b1cf40d551b3704 diff --git a/manifest.uuid b/manifest.uuid index 83db15e38e..a45d8294a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e548e9299d3fd6ce5b647cf0dd93ff8e917a5eda43076c6a02389c52640e2e50 \ No newline at end of file +be211a9c59234ef202e772fcaae18be43c44e1e00674f137cad2d903e00bfcab \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index cf04378db8..1f98731aa5 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10832,7 +10832,8 @@ static int process_input(ShellState *p){ if( QSS_PLAINWHITE(qss) && nSql==0 ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); - /* Just swallow leading whitespace */ + /* Just swallow single-line whitespace */ + qss = QSS_Start; continue; } if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ @@ -10848,6 +10849,7 @@ static int process_input(ShellState *p){ qss = QSS_Start; continue; } + /* No single-line dispositions remain; accumulate line(s). */ nLine = strlen30(zLine); if( nSql+nLine+2>=nAlloc ){ /* Grow buffer by half-again increments when big. */ @@ -10877,9 +10879,11 @@ static int process_input(ShellState *p){ clearTempFile(p); } p->bSafeMode = p->bSafeModePersist; + qss = QSS_Start; }else if( nSql && QSS_PLAINWHITE(qss) ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); nSql = 0; + qss = QSS_Start; } } if( nSql && QSS_PLAINDARK(qss) ){ diff --git a/test/shell1.test b/test/shell1.test index 330276120d..d54964fd81 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -18,6 +18,8 @@ # shell1-1.*: Basic command line option handling. # shell1-2.*: Basic "dot" command token parsing. # shell1-3.*: Basic test that "dot" command can be called. +# shell1-{4-8}.*: Test various "dot" commands's functionality. +# shell1-9.*: Basic test that "dot" commands and SQL intermix ok. # set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -1224,4 +1226,22 @@ do_test shell1-8.4 { | 6683623321994527 | -47 | +------------------+-----+}} +#---------------------------------------------------------------------------- +# Test cases shell1-9.*: Basic test that "dot" commands and SQL intermix ok. +# +do_test shell1-9.1 { + catchcmd :memory: { +.mode csv +/* +x */ select 1,2; --x + -- .nada +; +.mode csv +--x +select 2,1; select 3,4; +} +} {0 {1,2 +2,1 +3,4}} + finish_test From 36db90d3dd62602ec80d1b07612d55343e8a310a Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 4 Oct 2021 11:10:15 +0000 Subject: [PATCH 130/130] Fix query plans created by whereShortCut() so that they always check transitive constraints that drive an index. The is analogous to the [f1f9b5de3c59489b] check-in, just for whereShortCut() rather than the full query planner. Fix for the issue described by [forum:/forumpost/a65cacbf5e1c41ba|forum post a65cacbf5e1c41ba]. FossilOrigin-Name: 8b24c177061c38361588f419eda9b7943b72a0c6b2855b6f39272451b8a1b813 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 13 +++++++++++-- test/transitive1.test | 14 ++++++++++++++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 1f24513b7d..cd1aa495ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sCLI,\sensure\scorrect\sline-accumulation\sstate\swhenever\sline(s)\sare\sdumped\sor\sprocessed.\sAnd\stest\sthis. -D 2021-10-03T22:03:59.982 +C Fix\squery\splans\screated\sby\swhereShortCut()\sso\sthat\sthey\salways\scheck\ntransitive\sconstraints\sthat\sdrive\san\sindex.\s\sThe\sis\sanalogous\sto\sthe\n[f1f9b5de3c59489b]\scheck-in,\sjust\sfor\swhereShortCut()\srather\sthan\sthe\nfull\squery\splanner.\sFix\sfor\sthe\sissue\sdescribed\sby\n[forum:/forumpost/a65cacbf5e1c41ba|forum\spost\sa65cacbf5e1c41ba]. +D 2021-10-04T11:10:15.125 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -636,7 +636,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c da3981a12e9eb5a71d32bab60ac1957fd4aa337aaea07ca8019b01f8788f442a +F src/where.c d9215db24449143da844ab86c727bbbef94ad45c53cc17bc0051386472db5789 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 @@ -1627,7 +1627,7 @@ F test/trace3.test ae2004df24b585fed9046cc0bae4601762bc6fc4aa321d475f1350bba5047 F test/trans.test 45f6f9ab6f66a7b5744f1caac06b558f95da62501916906cf55586a896f9f439 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 -F test/transitive1.test 7dcd1f263813688cb5433c15c758dcab9a62b3c4ec72edd96c0255e0b322d470 +F test/transitive1.test d75f4c919bdbee75cb3968fb614f74f4bbb2a71823c048b2042af682f08c56df F test/trigger1.test d30cd09ae8ac365a088f09daba583cc5c0b8fc7d4e1d70809d0b4be3bf6ae2ab F test/trigger2.test 6e35bd7321c49e63d540aee980eb95dec63e1d1caca175224101045bcc80871f F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 @@ -1929,7 +1929,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 e548e9299d3fd6ce5b647cf0dd93ff8e917a5eda43076c6a02389c52640e2e50 -R 38415c55bb15ec5e5592551fc07b2f41 -U larrybr -Z ce1b9939396109dd8b1cf40d551b3704 +P be211a9c59234ef202e772fcaae18be43c44e1e00674f137cad2d903e00bfcab +R 292b396dc8ad27f72b460cd6d9853182 +U drh +Z eff1f6baf32edbc9330b75894ca2e4ea diff --git a/manifest.uuid b/manifest.uuid index a45d8294a7..c4357ca791 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -be211a9c59234ef202e772fcaae18be43c44e1e00674f137cad2d903e00bfcab \ No newline at end of file +8b24c177061c38361588f419eda9b7943b72a0c6b2855b6f39272451b8a1b813 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 4157d17b4c..751d622352 100644 --- a/src/where.c +++ b/src/where.c @@ -4594,6 +4594,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ int j; Table *pTab; Index *pIdx; + WhereScan scan; pWInfo = pBuilder->pWInfo; if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0; @@ -4607,9 +4608,10 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pLoop = pBuilder->pNew; pLoop->wsFlags = 0; pLoop->nSkip = 0; - pTerm = sqlite3WhereFindTerm(pWC, iCur, -1, 0, WO_EQ|WO_IS, 0); + pTerm = whereScanInit(&scan, pWC, iCur, -1, WO_EQ|WO_IS, 0); if( pTerm ){ testcase( pTerm->eOperator & WO_IS ); + assert( pTerm->prereqRight==0 ); pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW; pLoop->aLTerm[0] = pTerm; pLoop->nLTerm = 1; @@ -4626,7 +4628,8 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ ) continue; opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ; for(j=0; jnKeyCol; j++){ - pTerm = sqlite3WhereFindTerm(pWC, iCur, j, 0, opMask, pIdx); + pTerm = whereScanInit(&scan, pWC, iCur, j, opMask, pIdx); + while( pTerm && pTerm->prereqRight ) pTerm = whereScanNext(&scan); if( pTerm==0 ) break; testcase( pTerm->eOperator & WO_IS ); pLoop->aLTerm[j] = pTerm; @@ -4655,8 +4658,14 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ if( pWInfo->wctrlFlags & WHERE_WANT_DISTINCT ){ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; } + if( scan.iEquiv>1 ) pLoop->wsFlags |= WHERE_TRANSCONS; #ifdef SQLITE_DEBUG pLoop->cId = '0'; +#endif +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ + sqlite3DebugPrintf("whereShortCut() used to compute solution\n"); + } #endif return 1; } diff --git a/test/transitive1.test b/test/transitive1.test index 9e2b2e6f81..1161a4454e 100644 --- a/test/transitive1.test +++ b/test/transitive1.test @@ -398,4 +398,18 @@ do_execsql_test transitive1-720 { SELECT * FROM t1 CROSS JOIN t2 WHERE likely(t2.y=t1.a) AND unlikely(t1.a=t2.x) } {} +# 2021-10-04 forum https://sqlite.org/forum/forumpost/a65cacbf5e1c41ba +# +reset_db +do_execsql_test transitive1-800 { + CREATE TABLE t1(a INT); + INSERT INTO t1 VALUES(0),(3); + CREATE TABLE t2(b INT UNIQUE, c INT); + INSERT INTO t2 VALUES(1,4) ,(0,5); + SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE c=a AND b IS a); + SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE a=c AND a IS b); + SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE a=c AND b IS a); + SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE c=a AND a IS b); +} {} + finish_test