From 3245f3be67907a31431a4506908d981ab1354523 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 20 Jul 2022 16:42:40 +0000 Subject: [PATCH 01/42] Simplify the logic that converts the "1" expression in "ORDER BY 1" into a copy of the expression that defines the first output column. FossilOrigin-Name: e1f1cfe7f4387b60443bd31742e2f49db1a2d0443200318a898ba0da216619be --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 24 +++++++----------------- 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 6359633be1..2197f5c054 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\saccuracy\sof\sjulian\sday\smilliseconds\scalculation. -D 2022-07-19T21:12:54.087 +C Simplify\sthe\slogic\sthat\sconverts\sthe\s"1"\sexpression\sin\s"ORDER\sBY\s1"\sinto\sa\ncopy\sof\sthe\sexpression\sthat\sdefines\sthe\sfirst\soutput\scolumn. +D 2022-07-20T16:42:40.963 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -568,7 +568,7 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c c62820c15dcb63013519c8e41d9f928d7478672cc902cfd0581c733c271dbf45 F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 84a8443e3723e908730d754f54df4e1dacc1eb7073c0bd79c9d5efe977a9f5b9 +F src/resolve.c f0d663c9b1ceeb3e7d262ede872dd3b24b323a7cc11d84c05a39d962e7d64b07 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 45b93eee3c349f46240ddc14344365bbf34579ec332bd4c7bc061945e38172e2 F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 @@ -1981,8 +1981,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 22d280a5cd395abbedcfffbac3d3b3a614c327be25763ca380c1338a2a7bd33a -R 358f17e3f8be659125138359345ba38f -U larrybr -Z 66841ff8e7be7e09568cdaf4bf69cc26 +P e5e9311863544ef30dccd3bd0b3a048a864a650e69cdf9aab13dbe32a4777b51 +R 311c30e12c0d7c0934ec40d91e93ee45 +U drh +Z d68f40fa601eed057ba107efae30da32 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1ca07adc23..a1d1130861 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e5e9311863544ef30dccd3bd0b3a048a864a650e69cdf9aab13dbe32a4777b51 \ No newline at end of file +e1f1cfe7f4387b60443bd31742e2f49db1a2d0443200318a898ba0da216619be \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 99e30d4c83..9512e3a42d 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -85,33 +85,23 @@ static void resolveAlias( sqlite3ExprDelete(db, pDup); pDup = 0; }else{ + Expr temp; incrAggFunctionDepth(pDup, nSubquery); if( pExpr->op==TK_COLLATE ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - - /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This - ** prevents ExprDelete() from deleting the Expr structure itself, - ** allowing it to be repopulated by the memcpy() on the following line. - ** The pExpr->u.zToken might point into memory that will be freed by the - ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to - ** make a copy of the token before doing the sqlite3DbFree(). - */ - ExprSetProperty(pExpr, EP_Static); - sqlite3ExprDelete(db, pExpr); - memcpy(pExpr, pDup, sizeof(*pExpr)); - if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ - assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); - pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); - pExpr->flags |= EP_MemToken; - } + memcpy(&temp, pDup, sizeof(Expr)); + memcpy(pDup, pExpr, sizeof(Expr)); + memcpy(pExpr, &temp, sizeof(Expr)); if( ExprHasProperty(pExpr, EP_WinFunc) ){ if( ALWAYS(pExpr->y.pWin!=0) ){ pExpr->y.pWin->pOwner = pExpr; } } - sqlite3DbFree(db, pDup); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprDelete, + pDup); } } From 955301637710f18d3b44e8972f17f8cf22df4092 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 20 Jul 2022 20:36:26 +0000 Subject: [PATCH 02/42] Make use of the sqlite3ExprDeferredDelete() interface in the previous check-in, and in another place where it might be helpful. FossilOrigin-Name: 22f90e9683d5cd6619ccdb06a02e9dde9f4b7457391c0dbb4c3216c22fc0db47 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- src/resolve.c | 4 +--- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 2197f5c054..28c018cc1c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\slogic\sthat\sconverts\sthe\s"1"\sexpression\sin\s"ORDER\sBY\s1"\sinto\sa\ncopy\sof\sthe\sexpression\sthat\sdefines\sthe\sfirst\soutput\scolumn. -D 2022-07-20T16:42:40.963 +C Make\suse\sof\sthe\ssqlite3ExprDeferredDelete()\sinterface\sin\sthe\sprevious\ncheck-in,\sand\sin\sanother\splace\swhere\sit\smight\sbe\shelpful. +D 2022-07-20T20:36:26.106 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 4907afcb86d72b5525d8767515ce425ec53c7a2d3664441b46cef5b376ee0cba +F src/expr.c 9f568514b37dff8b1e10df6c2ccea0e5d871272d913877cde999e0168969b573 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -568,7 +568,7 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c c62820c15dcb63013519c8e41d9f928d7478672cc902cfd0581c733c271dbf45 F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c f0d663c9b1ceeb3e7d262ede872dd3b24b323a7cc11d84c05a39d962e7d64b07 +F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 45b93eee3c349f46240ddc14344365bbf34579ec332bd4c7bc061945e38172e2 F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 @@ -1981,8 +1981,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 e5e9311863544ef30dccd3bd0b3a048a864a650e69cdf9aab13dbe32a4777b51 -R 311c30e12c0d7c0934ec40d91e93ee45 +P e1f1cfe7f4387b60443bd31742e2f49db1a2d0443200318a898ba0da216619be +R cf76080c96baf955a2cebd7f6b61366a U drh -Z d68f40fa601eed057ba107efae30da32 +Z 4c65ef63d6c645ffaac99f031aa62bbf # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a1d1130861..85bd5eafdd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e1f1cfe7f4387b60443bd31742e2f49db1a2d0443200318a898ba0da216619be \ No newline at end of file +22f90e9683d5cd6619ccdb06a02e9dde9f4b7457391c0dbb4c3216c22fc0db47 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c0b2bee948..61b1d60e4b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3325,7 +3325,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ pLimit = sqlite3PExpr(pParse, TK_NE, sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit); } - sqlite3ExprDelete(db, pSel->pLimit->pLeft); + sqlite3ExprDeferredDelete(pParse, pSel->pLimit->pLeft); pSel->pLimit->pLeft = pLimit; }else{ /* If there is no pre-existing limit add a limit of 1 */ diff --git a/src/resolve.c b/src/resolve.c index 9512e3a42d..1c3a9d9097 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -99,9 +99,7 @@ static void resolveAlias( pExpr->y.pWin->pOwner = pExpr; } } - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3ExprDelete, - pDup); + sqlite3ExprDeferredDelete(pParse, pDup); } } From e50998859d046da292dc2383410df67fe94a400e Mon Sep 17 00:00:00 2001 From: mistachkin Date: Thu, 21 Jul 2022 18:37:50 +0000 Subject: [PATCH 03/42] Fix harmless compiler warning seen with MSVC. FossilOrigin-Name: 648172de20d70532ed0fb9713b76161dd481e09bbd973c03dffb51fb61b731cc --- ext/misc/regexp.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 7413ab80ec..d0c8ee5cfe 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -825,7 +825,7 @@ static void re_bytecode_func( } sqlite3_str_appendf(pStr, "\n"); } - for(i=0; inState; i++){ + for(i=0; (unsigned)inState; i++){ sqlite3_str_appendf(pStr, "%-8s %4d\n", ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]); } diff --git a/manifest b/manifest index 28c018cc1c..78ee70b915 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\suse\sof\sthe\ssqlite3ExprDeferredDelete()\sinterface\sin\sthe\sprevious\ncheck-in,\sand\sin\sanother\splace\swhere\sit\smight\sbe\shelpful. -D 2022-07-20T20:36:26.106 +C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC. +D 2022-07-21T18:37:50.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -334,7 +334,7 @@ F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 F ext/misc/qpvtab.c 09738419e25f603a35c0ac8bd0a04daab794f48d08a9bc07a6085b9057b99009 -F ext/misc/regexp.c 1459fe1452b61aafb25b11d7144f3dabfaf890b566c4ef9cfa4dc270451a8f02 +F ext/misc/regexp.c 5abed0ace2d9340b42b9ab1dbe64db9c276e4e8eba38a903232b6253e05ccdaf F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -1981,8 +1981,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 e1f1cfe7f4387b60443bd31742e2f49db1a2d0443200318a898ba0da216619be -R cf76080c96baf955a2cebd7f6b61366a -U drh -Z 4c65ef63d6c645ffaac99f031aa62bbf +P 22f90e9683d5cd6619ccdb06a02e9dde9f4b7457391c0dbb4c3216c22fc0db47 +R 846ac44e12ef98f830013180b827ef68 +U mistachkin +Z 35c5050a4917217d748070c1e316ab4b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 85bd5eafdd..af6fbce23c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -22f90e9683d5cd6619ccdb06a02e9dde9f4b7457391c0dbb4c3216c22fc0db47 \ No newline at end of file +648172de20d70532ed0fb9713b76161dd481e09bbd973c03dffb51fb61b731cc \ No newline at end of file From d00505dc97e030f7b68bd631db14c27128f82a51 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 22 Jul 2022 14:52:29 +0000 Subject: [PATCH 04/42] Update the documentation for SQLITE_OPEN_NOFOLLOW to state more clearly that nothing in the database path is allowed to be a symbolic link. FossilOrigin-Name: de9222697b2ca8cae2cc7aa9082cca3910038ebbab1e8ee15270b06711711a0b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 78ee70b915..41afa25e23 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC. -D 2022-07-21T18:37:50.752 +C Update\sthe\sdocumentation\sfor\sSQLITE_OPEN_NOFOLLOW\sto\sstate\smore\sclearly\sthat\nnothing\sin\sthe\sdatabase\spath\sis\sallowed\sto\sbe\sa\ssymbolic\slink. +D 2022-07-22T14:52:29.510 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -572,7 +572,7 @@ F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 45b93eee3c349f46240ddc14344365bbf34579ec332bd4c7bc061945e38172e2 F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 -F src/sqlite.h.in 01573eae96721f2a8ee2a9e3b7140ceeba2e9c44350911890b89b8ff0dcf6781 +F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a988810c9b21c0dc36dc7a62735012339dc76fc7ab448fb0792721d30eacb69d F src/sqliteInt.h 059d5a017ebf488c7484f79ea507f56b2bf4bb700f340abf91c5d2227869f275 @@ -1981,8 +1981,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 22f90e9683d5cd6619ccdb06a02e9dde9f4b7457391c0dbb4c3216c22fc0db47 -R 846ac44e12ef98f830013180b827ef68 -U mistachkin -Z 35c5050a4917217d748070c1e316ab4b +P 648172de20d70532ed0fb9713b76161dd481e09bbd973c03dffb51fb61b731cc +R 22d3a3c7680400f82d17fa9e3cf5e084 +U drh +Z ef2231159a73a46fc3d5cbe83757be79 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index af6fbce23c..bd99275ee3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -648172de20d70532ed0fb9713b76161dd481e09bbd973c03dffb51fb61b731cc \ No newline at end of file +de9222697b2ca8cae2cc7aa9082cca3910038ebbab1e8ee15270b06711711a0b \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index e2281e4978..f6b49b4d88 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3439,7 +3439,7 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** to return an extended result code. ** ** [[OPEN_NOFOLLOW]] ^(
[SQLITE_OPEN_NOFOLLOW]
-**
The database filename is not allowed to be a symbolic link
+**
The database filename is not allowed to contain a symbolic link
** )^ ** ** If the 3rd parameter to sqlite3_open_v2() is not one of the From 034d11180796267db921a5faba2d98ec6d73fe48 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 22 Jul 2022 18:25:04 +0000 Subject: [PATCH 05/42] In a TK_BLOB Expr node, the Expr.zToken might not be a well-formed BLOB literal if there has been a prior OOM. dbsqlfuzz 23871e5805d6c45b392f9b7aa1e8a2b98f3c27cd. FossilOrigin-Name: c538d075350927222ab0a6598b844f7b15153c5dc008d71b921a2b73c4f4a7a4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 41afa25e23..416917b7f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sdocumentation\sfor\sSQLITE_OPEN_NOFOLLOW\sto\sstate\smore\sclearly\sthat\nnothing\sin\sthe\sdatabase\spath\sis\sallowed\sto\sbe\sa\ssymbolic\slink. -D 2022-07-22T14:52:29.510 +C In\sa\sTK_BLOB\sExpr\snode,\sthe\sExpr.zToken\smight\snot\sbe\sa\swell-formed\nBLOB\sliteral\sif\sthere\shas\sbeen\sa\sprior\sOOM.\ndbsqlfuzz\s23871e5805d6c45b392f9b7aa1e8a2b98f3c27cd. +D 2022-07-22T18:25:04.652 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 9f568514b37dff8b1e10df6c2ccea0e5d871272d913877cde999e0168969b573 +F src/expr.c 10b3e1a052ccadbb81037e273bd4482831dcebdbbab379d895df655a5ff7e305 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -1981,8 +1981,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 648172de20d70532ed0fb9713b76161dd481e09bbd973c03dffb51fb61b731cc -R 22d3a3c7680400f82d17fa9e3cf5e084 +P de9222697b2ca8cae2cc7aa9082cca3910038ebbab1e8ee15270b06711711a0b +R 6f602e521caa17d238271eb589ae4e8e U drh -Z ef2231159a73a46fc3d5cbe83757be79 +Z 19001449740bd3515437c61d096c4c20 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bd99275ee3..09f38cfb08 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de9222697b2ca8cae2cc7aa9082cca3910038ebbab1e8ee15270b06711711a0b \ No newline at end of file +c538d075350927222ab0a6598b844f7b15153c5dc008d71b921a2b73c4f4a7a4 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 61b1d60e4b..93e2f1e8ef 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4212,6 +4212,7 @@ expr_code_doover: int n; const char *z; char *zBlob; + if( pParse->nErr ) return target; assert( !ExprHasProperty(pExpr, EP_IntValue) ); assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); assert( pExpr->u.zToken[1]=='\'' ); From 825fa17b1f220e9ba45757251becdde41958ae8e Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 22 Jul 2022 19:28:04 +0000 Subject: [PATCH 06/42] Omit the EP_MemToken flag that was made obsolete by [e1f1cfe7f4387b60], for a size reduction and performance increase. FossilOrigin-Name: 28934a9d92d5e5ac862a0dc7169f071f39047f98dc79441db697cf353a4b9433 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 7 +------ src/sqliteInt.h | 2 +- src/window.c | 1 - 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 416917b7f1..ddd8d2b466 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sa\sTK_BLOB\sExpr\snode,\sthe\sExpr.zToken\smight\snot\sbe\sa\swell-formed\nBLOB\sliteral\sif\sthere\shas\sbeen\sa\sprior\sOOM.\ndbsqlfuzz\s23871e5805d6c45b392f9b7aa1e8a2b98f3c27cd. -D 2022-07-22T18:25:04.652 +C Omit\sthe\sEP_MemToken\sflag\sthat\swas\smade\sobsolete\sby\s[e1f1cfe7f4387b60],\sfor\na\ssize\sreduction\sand\sperformance\sincrease. +D 2022-07-22T19:28:04.965 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 10b3e1a052ccadbb81037e273bd4482831dcebdbbab379d895df655a5ff7e305 +F src/expr.c 44f6b019a581f7c5a6599464d76d19111427edfa2710b4f007968fc64aaed0d1 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -575,7 +575,7 @@ F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d3 F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a988810c9b21c0dc36dc7a62735012339dc76fc7ab448fb0792721d30eacb69d -F src/sqliteInt.h 059d5a017ebf488c7484f79ea507f56b2bf4bb700f340abf91c5d2227869f275 +F src/sqliteInt.h c97b6351dba36b7bacd231610cd7173e7a7ef8469c2d9b849037415e0b1d8c79 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -661,7 +661,7 @@ F src/where.c 1049685e84bd74692ad76984a3411a21c5a1e6ddd08c981ec94d2f11f769e07f F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 -F src/window.c fff1b51757438c664e471d5184634e48dcdf8ea34b640f3b1b0810b1e06de18c +F src/window.c 3409e5067705ad8b858475e36fc22dc342192c02158d2b7c5219b9c1f96aaf55 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test b5c19d504dec222c0dc66642673d23dce915d35737b68e74d9f237b80493eb53 @@ -1981,8 +1981,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 de9222697b2ca8cae2cc7aa9082cca3910038ebbab1e8ee15270b06711711a0b -R 6f602e521caa17d238271eb589ae4e8e +P c538d075350927222ab0a6598b844f7b15153c5dc008d71b921a2b73c4f4a7a4 +R 0a28921b7e90ddf823369af11249c300 U drh -Z 19001449740bd3515437c61d096c4c20 +Z 8e5ad3553ebf08b44289f99a5ac2ab7d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 09f38cfb08..15e2267724 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c538d075350927222ab0a6598b844f7b15153c5dc008d71b921a2b73c4f4a7a4 \ No newline at end of file +28934a9d92d5e5ac862a0dc7169f071f39047f98dc79441db697cf353a4b9433 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 93e2f1e8ef..3801fb98f4 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1238,10 +1238,6 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ #endif } } - if( ExprHasProperty(p, EP_MemToken) ){ - assert( !ExprHasProperty(p, EP_IntValue) ); - sqlite3DbFree(db, p->u.zToken); - } if( !ExprHasProperty(p, EP_Static) ){ sqlite3DbFreeNN(db, p); } @@ -1349,7 +1345,6 @@ static int dupedExprStructSize(const Expr *p, int flags){ }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); assert( !ExprHasProperty(p, EP_OuterON) ); - assert( !ExprHasProperty(p, EP_MemToken) ); assert( !ExprHasVVAProperty(p, EP_NoReduce) ); if( p->pLeft || p->x.pList ){ nSize = EXPR_REDUCEDSIZE | EP_Reduced; @@ -1453,7 +1448,7 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ } /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ - pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); + pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static); pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); pNew->flags |= staticFlag; ExprClearVVAProperties(pNew); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 106a5d1475..c6bdd3dd35 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2886,7 +2886,7 @@ struct Expr { #define EP_Reduced 0x004000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_Win 0x008000 /* Contains window functions */ #define EP_TokenOnly 0x010000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ -#define EP_MemToken 0x020000 /* Need to sqlite3DbFree() Expr.zToken */ + /* 0x020000 // Available for reuse */ #define EP_IfNullRow 0x040000 /* The TK_IF_NULL_ROW opcode */ #define EP_Unlikely 0x080000 /* unlikely() or likelihood() function */ #define EP_ConstFunc 0x100000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ diff --git a/src/window.c b/src/window.c index 893668664f..cb7681f461 100644 --- a/src/window.c +++ b/src/window.c @@ -900,7 +900,6 @@ static ExprList *exprListAppendList( for(i=0; inExpr; i++){ sqlite3 *db = pParse->db; Expr *pDup = sqlite3ExprDup(db, pAppend->a[i].pExpr, 0); - assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) ); if( db->mallocFailed ){ sqlite3ExprDelete(db, pDup); break; From ee6b80c3b50efb65630584eb9001d2771055ff8d Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Jul 2022 00:44:44 +0000 Subject: [PATCH 07/42] Use sqlite3ParserAddCleanup() rather than pParse->pConstExpr to implement sqlite3ExprDeferredDelete(). This is a better solution than check-in [c538d07535092722]. FossilOrigin-Name: 2a6f6971fa010219323b976ff53b2606e39fb43fd36c394837c3a8528bf3c425 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index ddd8d2b466..07ebf75ee4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\sEP_MemToken\sflag\sthat\swas\smade\sobsolete\sby\s[e1f1cfe7f4387b60],\sfor\na\ssize\sreduction\sand\sperformance\sincrease. -D 2022-07-22T19:28:04.965 +C Use\ssqlite3ParserAddCleanup()\srather\sthan\spParse->pConstExpr\sto\simplement\nsqlite3ExprDeferredDelete().\s\sThis\sis\sa\sbetter\ssolution\sthan\scheck-in\s\n[c538d07535092722]. +D 2022-07-23T00:44:44.539 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 44f6b019a581f7c5a6599464d76d19111427edfa2710b4f007968fc64aaed0d1 +F src/expr.c 78a1b6c13306efaf563e9340732a2d651f792c488b7795a25f1f6a853e07ef25 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -1981,8 +1981,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 c538d075350927222ab0a6598b844f7b15153c5dc008d71b921a2b73c4f4a7a4 -R 0a28921b7e90ddf823369af11249c300 +P 28934a9d92d5e5ac862a0dc7169f071f39047f98dc79441db697cf353a4b9433 +R 88cc25988976487ed2e20df47dba68d4 U drh -Z 8e5ad3553ebf08b44289f99a5ac2ab7d +Z fe526c3fdeb2c1220cb11dfe559b4150 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 15e2267724..f97e721aa1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28934a9d92d5e5ac862a0dc7169f071f39047f98dc79441db697cf353a4b9433 \ No newline at end of file +2a6f6971fa010219323b976ff53b2606e39fb43fd36c394837c3a8528bf3c425 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 3801fb98f4..8edab3298a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1270,8 +1270,9 @@ void sqlite3ClearOnOrUsing(sqlite3 *db, OnOrUsing *p){ ** pExpr to the pParse->pConstExpr list with a register number of 0. */ void sqlite3ExprDeferredDelete(Parse *pParse, Expr *pExpr){ - pParse->pConstExpr = - sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprDelete, + pExpr); } /* Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the @@ -4207,7 +4208,6 @@ expr_code_doover: int n; const char *z; char *zBlob; - if( pParse->nErr ) return target; assert( !ExprHasProperty(pExpr, EP_IntValue) ); assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); assert( pExpr->u.zToken[1]=='\'' ); From 3dedb87bd79822948234862154699f1e7781999a Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Jul 2022 00:53:48 +0000 Subject: [PATCH 08/42] Remove a branch that is no longer reachable due to the previous check-in. FossilOrigin-Name: 8b4d1b9317624f443fe526858bfe3da5281ba83de1828c62935f48b3e7cf2a88 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 07ebf75ee4..3578f3ff26 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\ssqlite3ParserAddCleanup()\srather\sthan\spParse->pConstExpr\sto\simplement\nsqlite3ExprDeferredDelete().\s\sThis\sis\sa\sbetter\ssolution\sthan\scheck-in\s\n[c538d07535092722]. -D 2022-07-23T00:44:44.539 +C Remove\sa\sbranch\sthat\sis\sno\slonger\sreachable\sdue\sto\sthe\sprevious\scheck-in. +D 2022-07-23T00:53:48.586 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1307d57f65023c9f37c2b6c62253343fca63877f161f694a593b14c0883cedda F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c 29fcc97af5197511788a571ed35a001eea472cbe3bcdbae88178e17fcafd4341 +F src/build.c 149663ba16fc023d3ee1929d2fac40e0055617cd58e49d4e75b99376ddd40bd3 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad @@ -1981,8 +1981,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 28934a9d92d5e5ac862a0dc7169f071f39047f98dc79441db697cf353a4b9433 -R 88cc25988976487ed2e20df47dba68d4 +P 2a6f6971fa010219323b976ff53b2606e39fb43fd36c394837c3a8528bf3c425 +R 620499f569e880513867b67bc9090f80 U drh -Z fe526c3fdeb2c1220cb11dfe559b4150 +Z 0dba3b3710f22c731b61e5cb97b7e027 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f97e721aa1..2f48cc1742 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2a6f6971fa010219323b976ff53b2606e39fb43fd36c394837c3a8528bf3c425 \ No newline at end of file +8b4d1b9317624f443fe526858bfe3da5281ba83de1828c62935f48b3e7cf2a88 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 31ab81b09b..b48876ac52 100644 --- a/src/build.c +++ b/src/build.c @@ -260,9 +260,7 @@ void sqlite3FinishCoding(Parse *pParse){ pParse->okConstFactor = 0; for(i=0; inExpr; i++){ int iReg = pEL->a[i].u.iConstExprReg; - if( iReg>0 ){ - sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); - } + sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); } } From 7bace9e9bb3d2b67b5a3e5e567b7be2cd9cc1e97 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Jul 2022 12:51:48 +0000 Subject: [PATCH 09/42] Simplifications to sqlite3FinishCoding() for a small size reduction and performance increase. FossilOrigin-Name: a995614b9aedf4492e6d7b777293770f268837f8246e1678ef0523738c8a8339 --- manifest | 12 ++--- manifest.uuid | 2 +- src/build.c | 118 ++++++++++++++++++++++++-------------------------- 3 files changed, 64 insertions(+), 68 deletions(-) diff --git a/manifest b/manifest index 3578f3ff26..2e7a764e4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sbranch\sthat\sis\sno\slonger\sreachable\sdue\sto\sthe\sprevious\scheck-in. -D 2022-07-23T00:53:48.586 +C Simplifications\sto\ssqlite3FinishCoding()\sfor\sa\ssmall\ssize\sreduction\sand\nperformance\sincrease. +D 2022-07-23T12:51:48.615 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1307d57f65023c9f37c2b6c62253343fca63877f161f694a593b14c0883cedda F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c 149663ba16fc023d3ee1929d2fac40e0055617cd58e49d4e75b99376ddd40bd3 +F src/build.c 249fb44843805cded2003e0e678ab65acb98ae0982e23256d4d0a7576a440eb3 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad @@ -1981,8 +1981,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 2a6f6971fa010219323b976ff53b2606e39fb43fd36c394837c3a8528bf3c425 -R 620499f569e880513867b67bc9090f80 +P 8b4d1b9317624f443fe526858bfe3da5281ba83de1828c62935f48b3e7cf2a88 +R 4e3eaba4ea506cda95e5ca36886afbe8 U drh -Z 0dba3b3710f22c731b61e5cb97b7e027 +Z 03b9158b57b304bce795274f430799f1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2f48cc1742..d3e71676b3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8b4d1b9317624f443fe526858bfe3da5281ba83de1828c62935f48b3e7cf2a88 \ No newline at end of file +a995614b9aedf4492e6d7b777293770f268837f8246e1678ef0523738c8a8339 \ No newline at end of file diff --git a/src/build.c b/src/build.c index b48876ac52..df33c493a4 100644 --- a/src/build.c +++ b/src/build.c @@ -140,6 +140,7 @@ int sqlite3DbMaskAllZero(yDbMask m){ void sqlite3FinishCoding(Parse *pParse){ sqlite3 *db; Vdbe *v; + int iDb, i; assert( pParse->pToplevel==0 ); db = pParse->db; @@ -206,74 +207,69 @@ void sqlite3FinishCoding(Parse *pParse){ ** transaction on each used database and to verify the schema cookie ** on each used database. */ - if( db->mallocFailed==0 - && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr) - ){ - int iDb, i; - assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); - sqlite3VdbeJumpHere(v, 0); - assert( db->nDb>0 ); - iDb = 0; - do{ - Schema *pSchema; - if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; - sqlite3VdbeUsesBtree(v, iDb); - pSchema = db->aDb[iDb].pSchema; - sqlite3VdbeAddOp4Int(v, - OP_Transaction, /* Opcode */ - iDb, /* P1 */ - DbMaskTest(pParse->writeMask,iDb), /* P2 */ - pSchema->schema_cookie, /* P3 */ - pSchema->iGeneration /* P4 */ - ); - if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); - VdbeComment((v, - "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); - }while( ++iDbnDb ); + assert( pParse->nErr>0 || sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); + sqlite3VdbeJumpHere(v, 0); + assert( db->nDb>0 ); + iDb = 0; + do{ + Schema *pSchema; + if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; + sqlite3VdbeUsesBtree(v, iDb); + pSchema = db->aDb[iDb].pSchema; + sqlite3VdbeAddOp4Int(v, + OP_Transaction, /* Opcode */ + iDb, /* P1 */ + DbMaskTest(pParse->writeMask,iDb), /* P2 */ + pSchema->schema_cookie, /* P3 */ + pSchema->iGeneration /* P4 */ + ); + if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); + VdbeComment((v, + "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); + }while( ++iDbnDb ); #ifndef SQLITE_OMIT_VIRTUALTABLE - for(i=0; inVtabLock; i++){ - char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); - sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB); - } - pParse->nVtabLock = 0; + for(i=0; inVtabLock; i++){ + char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); + sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB); + } + pParse->nVtabLock = 0; #endif - /* Once all the cookies have been verified and transactions opened, - ** obtain the required table-locks. This is a no-op unless the - ** shared-cache feature is enabled. - */ - codeTableLocks(pParse); + /* Once all the cookies have been verified and transactions opened, + ** obtain the required table-locks. This is a no-op unless the + ** shared-cache feature is enabled. + */ + codeTableLocks(pParse); - /* Initialize any AUTOINCREMENT data structures required. - */ - sqlite3AutoincrementBegin(pParse); + /* Initialize any AUTOINCREMENT data structures required. + */ + sqlite3AutoincrementBegin(pParse); - /* Code constant expressions that where factored out of inner loops. - ** - ** The pConstExpr list might also contain expressions that we simply - ** want to keep around until the Parse object is deleted. Such - ** expressions have iConstExprReg==0. Do not generate code for - ** those expressions, of course. - */ - if( pParse->pConstExpr ){ - ExprList *pEL = pParse->pConstExpr; - pParse->okConstFactor = 0; - for(i=0; inExpr; i++){ - int iReg = pEL->a[i].u.iConstExprReg; - sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); - } + /* Code constant expressions that where factored out of inner loops. + ** + ** The pConstExpr list might also contain expressions that we simply + ** want to keep around until the Parse object is deleted. Such + ** expressions have iConstExprReg==0. Do not generate code for + ** those expressions, of course. + */ + if( pParse->pConstExpr ){ + ExprList *pEL = pParse->pConstExpr; + pParse->okConstFactor = 0; + for(i=0; inExpr; i++){ + int iReg = pEL->a[i].u.iConstExprReg; + sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); } - - if( pParse->bReturning ){ - Returning *pRet = pParse->u1.pReturning; - if( pRet->nRetCol ){ - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); - } - } - - /* Finally, jump back to the beginning of the executable code. */ - sqlite3VdbeGoto(v, 1); } + + if( pParse->bReturning ){ + Returning *pRet = pParse->u1.pReturning; + if( pRet->nRetCol ){ + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); + } + } + + /* Finally, jump back to the beginning of the executable code. */ + sqlite3VdbeGoto(v, 1); } /* Get the VDBE program ready for execution From 8bd0b250b715802f3bddf46596841d18acffcdb4 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 25 Jul 2022 11:04:13 +0000 Subject: [PATCH 10/42] Reduce a timeout in walsetlk.test from 2000ms to 1100ms so that the test runs a bit faster. FossilOrigin-Name: 836fa097060dadeb2dc5d4ee2e40621c4af606b1ef7241e2264823e23e4ceb1f --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/walsetlk.test | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2e7a764e4f..c38bca3b5e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplifications\sto\ssqlite3FinishCoding()\sfor\sa\ssmall\ssize\sreduction\sand\nperformance\sincrease. -D 2022-07-23T12:51:48.615 +C Reduce\sa\stimeout\sin\swalsetlk.test\sfrom\s2000ms\sto\s1100ms\sso\sthat\sthe\stest\sruns\sa\sbit\sfaster. +D 2022-07-25T11:04:13.326 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1797,7 +1797,7 @@ F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db8 F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 F test/walro2.test 33955a6fd874dd9724005e17f77fef89d334b3171454a1256fe4941a96766cdc F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test c084796fc1d908957eaeba00caf85a575565be17e3333a60d5b72fe75c150387 +F test/walsetlk.test 34c901443b31ab720afc463f5b236c86ca5c4134402573dce91aa0761de8db5a F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 @@ -1981,8 +1981,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 8b4d1b9317624f443fe526858bfe3da5281ba83de1828c62935f48b3e7cf2a88 -R 4e3eaba4ea506cda95e5ca36886afbe8 -U drh -Z 03b9158b57b304bce795274f430799f1 +P a995614b9aedf4492e6d7b777293770f268837f8246e1678ef0523738c8a8339 +R e7b8638d6eb2bb65a2c18035ce7a719d +U dan +Z 34c5d50caba419fff3085e94b713365e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d3e71676b3..69076e5991 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a995614b9aedf4492e6d7b777293770f268837f8246e1678ef0523738c8a8339 \ No newline at end of file +836fa097060dadeb2dc5d4ee2e40621c4af606b1ef7241e2264823e23e4ceb1f \ No newline at end of file diff --git a/test/walsetlk.test b/test/walsetlk.test index 2f2f90ce31..1e09238226 100644 --- a/test/walsetlk.test +++ b/test/walsetlk.test @@ -88,7 +88,7 @@ do_multiclient_test tn { INSERT INTO t1 VALUES(3, 4); INSERT INTO t1 VALUES(5, 6); } - code1 { db timeout 2000 } + code1 { db timeout 1100 } } {} do_test 2.$tn.2 { From 6b6d6c6bd2ca6b1dc19f61216ffe88e5cf734581 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 14:05:11 +0000 Subject: [PATCH 11/42] TK_IF_NULL_ROW expressions must be accumulated in the same way as TK_COLUMN expressions in an aggregate query. Proposed fix for the problem identifyed by dbsqlfuzz 8e17857db2c5a9294c975123ac807156a6559f13. FossilOrigin-Name: 40d08807209638aad728be2cedbc904e342e76c8e486c364bd571b55dd2e1e87 --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/expr.c | 10 +++++++++- test/select3.test | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c38bca3b5e..d040b26a47 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reduce\sa\stimeout\sin\swalsetlk.test\sfrom\s2000ms\sto\s1100ms\sso\sthat\sthe\stest\sruns\sa\sbit\sfaster. -D 2022-07-25T11:04:13.326 +C TK_IF_NULL_ROW\sexpressions\smust\sbe\saccumulated\sin\sthe\ssame\sway\sas\sTK_COLUMN\nexpressions\sin\san\saggregate\squery.\s\sProposed\sfix\sfor\sthe\sproblem\sidentifyed\sby\ndbsqlfuzz\s8e17857db2c5a9294c975123ac807156a6559f13. +D 2022-07-25T14:05:11.599 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 78a1b6c13306efaf563e9340732a2d651f792c488b7795a25f1f6a853e07ef25 +F src/expr.c 72f312252a5791988242dc812df89778f53939e3f60f4e0b432e90f4a3081c1d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -1391,7 +1391,7 @@ F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2f F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 F test/select1.test 692e84cfa29c405854c69e8a4027183d64c22952866a123fabbce741a379e889 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 -F test/select3.test ce4f78bbc809b0513f960f1ee84cdbc5af50ba112c343d5266558a8b2468f656 +F test/select3.test 054b155a4b9394c6858640029cb93e87defbaecc1c87ebb21157c3d35dfc4d88 F test/select4.test f0684d3da3bccacbe2a1ebadf6fb49d9df6f53acb4c6ebc228a88d0d6054cc7b F test/select5.test 8afc5e5dcdebc2be54472e73ebd9cd1adef1225fd15d37a1c62f969159f390ae F test/select6.test 9b2fb4ffedf52e1b5703cfcae1212e7a4a063f014c0458d78d29aca3db766d1f @@ -1981,8 +1981,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a995614b9aedf4492e6d7b777293770f268837f8246e1678ef0523738c8a8339 -R e7b8638d6eb2bb65a2c18035ce7a719d -U dan -Z 34c5d50caba419fff3085e94b713365e +P 836fa097060dadeb2dc5d4ee2e40621c4af606b1ef7241e2264823e23e4ceb1f +R ef7a712abb1795061ef7b33ca931bdb8 +T *branch * flatten-left-join +T *sym-flatten-left-join * +T -sym-trunk * +U drh +Z 4c1e333b8e885220474e580d77e5a634 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 69076e5991..383392c434 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -836fa097060dadeb2dc5d4ee2e40621c4af606b1ef7241e2264823e23e4ceb1f \ No newline at end of file +40d08807209638aad728be2cedbc904e342e76c8e486c364bd571b55dd2e1e87 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 8edab3298a..876b453f16 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4670,6 +4670,13 @@ expr_code_doover: case TK_IF_NULL_ROW: { int addrINR; u8 okConstFactor = pParse->okConstFactor; + if( pExpr->pAggInfo && !pExpr->pAggInfo->directMode ){ + struct AggInfo_col *pCol; + assert( pExpr->iAgg>=0 && pExpr->iAggpAggInfo->nColumn ); + pCol = &pExpr->pAggInfo->aCol[pExpr->iAgg]; + inReg = pCol->iMem; + break; + } addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); /* Temporarily disable factoring of constant expressions, since ** even though expressions may appear to be constant, they are not @@ -6175,6 +6182,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ assert( pNC->ncFlags & NC_UAggInfo ); switch( pExpr->op ){ + case TK_IF_NULL_ROW: case TK_AGG_COLUMN: case TK_COLUMN: { testcase( pExpr->op==TK_AGG_COLUMN ); @@ -6237,7 +6245,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ ExprSetVVAProperty(pExpr, EP_NoReduce); pExpr->pAggInfo = pAggInfo; - pExpr->op = TK_AGG_COLUMN; + if( pExpr->op==TK_COLUMN ) pExpr->op = TK_AGG_COLUMN; pExpr->iAgg = (i16)k; break; } /* endif pExpr->iTable==pItem->iCursor */ diff --git a/test/select3.test b/test/select3.test index 809b549028..ec0ee8d2bb 100644 --- a/test/select3.test +++ b/test/select3.test @@ -330,4 +330,49 @@ do_execsql_test select3.10.100 { FROM t1; } {{} {}} +#------------------------------------------------------------------------- +# dbsqlfuzz crash-8e17857db2c5a9294c975123ac807156a6559f13.txt +# Associated with the flatten-left-join branch circa 2022-06-23. +# +foreach {tn sql} { + 1 { + CREATE TABLE t1(a TEXT); + CREATE TABLE t2(x INT); + CREATE INDEX t2x ON t2(x); + INSERT INTO t1 VALUES('abc'); + } + 2 { + CREATE TABLE t1(a TEXT); + CREATE TABLE t2(x INT); + INSERT INTO t1 VALUES('abc'); + } + 3 { + CREATE TABLE t1(a TEXT); + CREATE TABLE t2(x INT); + INSERT INTO t1 VALUES('abc'); + PRAGMA automatic_index=OFF; + } +} { + reset_db + do_execsql_test select3-11.$tn.1 $sql + do_execsql_test select3.11.$tn.2 { + SELECT max(a), val FROM t1 LEFT JOIN ( + SELECT 'constant' AS val FROM t2 WHERE x=1234 + ) + } {abc {}} + do_execsql_test select3.11.$tn.3 { + INSERT INTO t2 VALUES(123); + SELECT max(a), val FROM t1 LEFT JOIN ( + SELECT 'constant' AS val FROM t2 WHERE x=1234 + ) + } {abc {}} + do_execsql_test select3.11.$tn.4 { + INSERT INTO t2 VALUES(1234); + SELECT max(a), val FROM t1 LEFT JOIN ( + SELECT 'constant' AS val FROM t2 WHERE x=1234 + ) + } {abc constant} +} + + finish_test From ee37302095f95b8692d835dc3dec4cbb398d9c3b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 15:54:23 +0000 Subject: [PATCH 12/42] Allow subqueries on the right-hand side of a LEFT JOIN to be flattened even if they contain a GROUP BY clause. FossilOrigin-Name: 816da9a893ae97a21463562479edb419a8b511ae731d86eccee3fa6e3e7dc96e --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/expr.c | 25 ++++++++++++++++++------- src/select.c | 11 +++++------ 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index d040b26a47..a5d100a729 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C TK_IF_NULL_ROW\sexpressions\smust\sbe\saccumulated\sin\sthe\ssame\sway\sas\sTK_COLUMN\nexpressions\sin\san\saggregate\squery.\s\sProposed\sfix\sfor\sthe\sproblem\sidentifyed\sby\ndbsqlfuzz\s8e17857db2c5a9294c975123ac807156a6559f13. -D 2022-07-25T14:05:11.599 +C Allow\ssubqueries\son\sthe\sright-hand\sside\sof\sa\sLEFT\sJOIN\sto\sbe\sflattened\seven\nif\sthey\scontain\sa\sGROUP\sBY\sclause. +D 2022-07-25T15:54:23.818 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 72f312252a5791988242dc812df89778f53939e3f60f4e0b432e90f4a3081c1d +F src/expr.c 61681ff95f4017181b975cdf2790dcbcda6ec962786041286bf5a8b6e051e2ca F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -570,7 +570,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 45b93eee3c349f46240ddc14344365bbf34579ec332bd4c7bc061945e38172e2 +F src/select.c a9516e1453241986f1eb73c00a0e7cf23d23081fd2eb50e67fcbb96fe7bf6f00 F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1981,11 +1981,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 836fa097060dadeb2dc5d4ee2e40621c4af606b1ef7241e2264823e23e4ceb1f -R ef7a712abb1795061ef7b33ca931bdb8 -T *branch * flatten-left-join -T *sym-flatten-left-join * -T -sym-trunk * +P 40d08807209638aad728be2cedbc904e342e76c8e486c364bd571b55dd2e1e87 +R 9e57786ca604cfa312cb51673a055fc9 U drh -Z 4c1e333b8e885220474e580d77e5a634 +Z fc9a3eeded753547b019835285a3d918 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 383392c434..790aa223e4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -40d08807209638aad728be2cedbc904e342e76c8e486c364bd571b55dd2e1e87 \ No newline at end of file +816da9a893ae97a21463562479edb419a8b511ae731d86eccee3fa6e3e7dc96e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 876b453f16..c9c7c2e760 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4670,12 +4670,20 @@ expr_code_doover: case TK_IF_NULL_ROW: { int addrINR; u8 okConstFactor = pParse->okConstFactor; - if( pExpr->pAggInfo && !pExpr->pAggInfo->directMode ){ - struct AggInfo_col *pCol; - assert( pExpr->iAgg>=0 && pExpr->iAggpAggInfo->nColumn ); - pCol = &pExpr->pAggInfo->aCol[pExpr->iAgg]; - inReg = pCol->iMem; - break; + AggInfo *pAggInfo = pExpr->pAggInfo; + if( pAggInfo ){ + assert( pExpr->iAgg>=0 && pExpr->iAggnColumn ); + if( !pAggInfo->directMode ){ + inReg = pAggInfo->aCol[pExpr->iAgg].iMem; + break; + } + if( pExpr->pAggInfo->useSortingIdx ){ + sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab, + pAggInfo->aCol[pExpr->iAgg].iSorterColumn, + target); + inReg = target; + break; + } } addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); /* Temporarily disable factoring of constant expressions, since @@ -6187,6 +6195,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ case TK_COLUMN: { testcase( pExpr->op==TK_AGG_COLUMN ); testcase( pExpr->op==TK_COLUMN ); + testcase( pExpr->op==TK_IF_NULL_ROW ); /* Check to see if the column is in one of the tables in the FROM ** clause of the aggregate query */ if( ALWAYS(pSrcList!=0) ){ @@ -6245,7 +6254,9 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ ExprSetVVAProperty(pExpr, EP_NoReduce); pExpr->pAggInfo = pAggInfo; - if( pExpr->op==TK_COLUMN ) pExpr->op = TK_AGG_COLUMN; + if( pExpr->op==TK_COLUMN ){ + pExpr->op = TK_AGG_COLUMN; + } pExpr->iAgg = (i16)k; break; } /* endif pExpr->iTable==pItem->iCursor */ diff --git a/src/select.c b/src/select.c index 90ba47fa8a..672461d447 100644 --- a/src/select.c +++ b/src/select.c @@ -4065,8 +4065,8 @@ static void renumberCursors( ** (3a) the subquery may not be a join and ** (3b) the FROM clause of the subquery may not contain a virtual ** table and -** (3c) The outer query may not have a GROUP BY. (This limitation is -** due to how TK_IF_NULL_ROW works. FIX ME!) +** (**) Was: "The outer query may not have a GROUP BY." This case +** is now managed correctly ** (3d) the outer query may not be DISTINCT. ** See also (26) for restrictions on RIGHT JOIN. ** @@ -4284,7 +4284,6 @@ static int flattenSubquery( if( pSubSrc->nSrc>1 /* (3a) */ || IsVirtual(pSubSrc->a[0].pTab) /* (3b) */ || (p->selFlags & SF_Distinct)!=0 /* (3d) */ - || (p->pGroupBy!=0) /* (3c) */ || (pSubitem->fg.jointype & JT_RIGHT)!=0 /* (26) */ ){ return 0; @@ -7541,15 +7540,15 @@ int sqlite3Select( regBase = sqlite3GetTempRange(pParse, nCol); sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0); j = nGroupBy; + pAggInfo->directMode = 1; for(i=0; inColumn; i++){ struct AggInfo_col *pCol = &pAggInfo->aCol[i]; if( pCol->iSorterColumn>=j ){ - int r1 = j + regBase; - sqlite3ExprCodeGetColumnOfTable(v, - pCol->pTab, pCol->iTable, pCol->iColumn, r1); + sqlite3ExprCode(pParse, pCol->pCExpr, j + regBase); j++; } } + pAggInfo->directMode = 0; regRecord = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord); From 058e99502a70abb5e67bead9a4146f4523ff89d9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 19:05:24 +0000 Subject: [PATCH 13/42] Small performance increase and size reduction by splitting out the sqlite3VdbeGetLastOp() from sqlite3VdbeGetOp(). FossilOrigin-Name: 92ac01d41d46ab73e189b1e5596ea63e5edb5b15639c5d7bdb981b95366c069b --- manifest | 27 +++++++++++++-------------- manifest.uuid | 2 +- src/delete.c | 5 +++-- src/expr.c | 6 +++--- src/insert.c | 6 +++--- src/pragma.c | 2 +- src/vdbe.h | 1 + src/vdbeaux.c | 23 +++++++++++++++-------- src/wherecode.c | 2 +- src/window.c | 6 ++---- 10 files changed, 43 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index 40e6111774..8d9ac4ab45 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\serror\sin\sthe\saggregate\squery\sLEFT\sJOIN\sflattening\soptimization\sfrom\n[2cf373b10c9bc4cb]\sand\sfurther\senhance\sthat\soptimization\sso\sthat\sit\sworks\neven\sif\sthere\sis\sa\sGROUP\sBY\sclause. -D 2022-07-25T16:06:14.582 +C Small\sperformance\sincrease\sand\ssize\sreduction\sby\ssplitting\sout\sthe\nsqlite3VdbeGetLastOp()\sfrom\ssqlite3VdbeGetOp(). +D 2022-07-25T19:05:24.840 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,8 +520,8 @@ F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d -F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 61681ff95f4017181b975cdf2790dcbcda6ec962786041286bf5a8b6e051e2ca +F src/delete.c 13eca2beee5b758ed033a11230971310cc4a58fcd8f6bc33cad4f677c985e96c +F src/expr.c 375b8285b347a33ea239eb1dad378d4044fe5a6b0d9ee1e7db7370f97d5fb14e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -530,7 +530,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 173845e5a6bac96ae937409e4f876b631f26b31dabb9df8fd0eb3b130b2bb3a7 +F src/insert.c ffbfe57fb73c0f14b30ce8a5da431519cdd315e20a9dd07fa12ae8e526d37f49 F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 853385cc7a604157e137585097949252d5d0c731768e16b044608e5c95c3614b @@ -563,7 +563,7 @@ F src/parse.y 8e67d820030d2655b9942ffe61c1e7e6b96cea2f2f72183533299393907d0564 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c d1aead03e8418ff586c7cfca344c50a914b8eb06abd841e8e91a982d823671da +F src/pragma.c 6637d624c37a8909d3edfa9d7cf694d79b49d2a0827d8c52ef15dceb641783fa F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c c62820c15dcb63013519c8e41d9f928d7478672cc902cfd0581c733c271dbf45 F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 @@ -643,10 +643,10 @@ F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 F src/vdbe.c 1266f3a4744224253dd74f0080014be8056b062c6f2f6a81e229fa0d306d4102 -F src/vdbe.h 07641758ca8b4f4c6d81ea667ea167c541e6ece21f5574da11e3d21ec37e2662 +F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c d68267db6e6641994e17c70670c40fd67ceb2352e42188815ed8c05d4d6502cb -F src/vdbeaux.c 444c399df547e003be52cc51b460fed3b63e1f18939e6b773ff99c584954b726 +F src/vdbeaux.c f14f30892ee8491f7903cf4ccd7bd0b7ab6f1eddf7dda4a0e03725fcd5ae05e1 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c 5ebf05c0182addedb1607ade848e1c83cef40981df94d1abfab0c59288c6064f F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 @@ -659,9 +659,9 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 1049685e84bd74692ad76984a3411a21c5a1e6ddd08c981ec94d2f11f769e07f F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 -F src/wherecode.c 0b09abfcb88c61c6a6984a3e065786631ff35495e9bdf865e6b74ab0a1299c5b +F src/wherecode.c 210240c9cec2a1d1494a3ac7852e9432245382e752b490c2bb437637c2c98711 F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 -F src/window.c 3409e5067705ad8b858475e36fc22dc342192c02158d2b7c5219b9c1f96aaf55 +F src/window.c 057df98b3b8296c4ccd35066ee171b66d956b3ee8bfce27596ddb5ed8fab66f4 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test b5c19d504dec222c0dc66642673d23dce915d35737b68e74d9f237b80493eb53 @@ -1981,9 +1981,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 836fa097060dadeb2dc5d4ee2e40621c4af606b1ef7241e2264823e23e4ceb1f 816da9a893ae97a21463562479edb419a8b511ae731d86eccee3fa6e3e7dc96e -R 9e57786ca604cfa312cb51673a055fc9 -T +closed 816da9a893ae97a21463562479edb419a8b511ae731d86eccee3fa6e3e7dc96e +P b52393ac28debe9867227f901d05cccf54f1b467272474500a549d956a5fb4d7 +R d4f59dff4c0149f1eec71fecf2aaf224 U drh -Z c715e74c49fbf8938da5e0c5419cf34a +Z da216fd20b1c63c1a0740d95d247a9a9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b115932a65..e1b00675ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b52393ac28debe9867227f901d05cccf54f1b467272474500a549d956a5fb4d7 \ No newline at end of file +92ac01d41d46ab73e189b1e5596ea63e5edb5b15639c5d7bdb981b95366c069b \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index df378d2d58..3d0e055be2 100644 --- a/src/delete.c +++ b/src/delete.c @@ -447,9 +447,10 @@ void sqlite3DeleteFrom( } for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ assert( pIdx->pSchema==pTab->pSchema ); - sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb); if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ - sqlite3VdbeChangeP3(v, -1, memCnt ? memCnt : -1); + sqlite3VdbeAddOp3(v, OP_Clear, pIdx->tnum, iDb, memCnt ? memCnt : -1); + }else{ + sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb); } } }else diff --git a/src/expr.c b/src/expr.c index c9c7c2e760..c383f6f65f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3835,7 +3835,7 @@ int sqlite3ExprCodeGetColumn( assert( pParse->pVdbe!=0 ); sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); if( p5 ){ - VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + VdbeOp *pOp = sqlite3VdbeGetLastOp(pParse->pVdbe); if( pOp->opcode==OP_Column ) pOp->p5 = p5; } return iReg; @@ -3904,7 +3904,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ ** so that a subsequent copy will not be merged into this one. */ static void setDoNotMergeFlagOnCopy(Vdbe *v){ - if( sqlite3VdbeGetOp(v, -1)->opcode==OP_Copy ){ + if( sqlite3VdbeGetLastOp(v)->opcode==OP_Copy ){ sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */ } } @@ -5026,7 +5026,7 @@ int sqlite3ExprCodeExprList( if( inReg!=target+i ){ VdbeOp *pOp; if( copyOp==OP_Copy - && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy + && (pOp=sqlite3VdbeGetLastOp(v))->opcode==OP_Copy && pOp->p1+pOp->p3+1==inReg && pOp->p2+pOp->p3+1==target+i && pOp->p5==0 /* The do-not-merge flag must be clear */ diff --git a/src/insert.c b/src/insert.c index 9b97b99a35..507bc017e2 100644 --- a/src/insert.c +++ b/src/insert.c @@ -159,7 +159,7 @@ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ ** OP_MakeRecord is found */ VdbeOp *pPrev; sqlite3VdbeAppendP4(v, pTab, P4_TABLE); - pPrev = sqlite3VdbeGetOp(v, -1); + pPrev = sqlite3VdbeGetLastOp(v); assert( pPrev!=0 ); assert( pPrev->opcode==OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed ); pPrev->opcode = OP_TypeCheck; @@ -197,7 +197,7 @@ 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 + assert( sqlite3VdbeGetLastOp(v)->opcode==OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed ); sqlite3VdbeChangeP4(v, -1, zColAff, i); } @@ -283,7 +283,7 @@ void sqlite3ComputeGeneratedColumns( */ sqlite3TableAffinity(pParse->pVdbe, pTab, iRegStore); if( (pTab->tabFlags & TF_HasStored)!=0 ){ - pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + pOp = sqlite3VdbeGetLastOp(pParse->pVdbe); if( pOp->opcode==OP_Affinity ){ /* Change the OP_Affinity argument to '@' (NONE) for all stored ** columns. '@' is the no-op affinity and those columns have not diff --git a/src/pragma.c b/src/pragma.c index 9860da86d7..0a1bc37fae 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1781,7 +1781,7 @@ void sqlite3Pragma( if( pCol->notNull==0 && !bStrict ) continue; doError = bStrict ? sqlite3VdbeMakeLabel(pParse) : 0; sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); - if( sqlite3VdbeGetOp(v,-1)->opcode==OP_Column ){ + if( sqlite3VdbeGetLastOp(v)->opcode==OP_Column ){ sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); } if( pCol->notNull ){ diff --git a/src/vdbe.h b/src/vdbe.h index 5909d3995d..eb1445f1db 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -242,6 +242,7 @@ void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); void sqlite3VdbeUsesBtree(Vdbe*, int); VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); +VdbeOp *sqlite3VdbeGetLastOp(Vdbe*); int sqlite3VdbeMakeLabel(Parse*); void sqlite3VdbeRunOnlyOnce(Vdbe*); void sqlite3VdbeReusable(Vdbe*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4666f728ab..dfee43d05c 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -456,7 +456,7 @@ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ iThis = v->nOp; sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, zMsg, P4_DYNAMIC); - sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z); + sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetLastOp(v)->p4.z); if( bPush){ pParse->addrExplain = iThis; } @@ -1133,15 +1133,19 @@ void sqlite3VdbeScanStatus( ** for a specific instruction. */ void sqlite3VdbeChangeOpcode(Vdbe *p, int addr, u8 iNewOpcode){ + assert( addr>=0 ); sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; } void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ + assert( addr>=0 ); sqlite3VdbeGetOp(p,addr)->p1 = val; } void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ + assert( addr>=0 ); sqlite3VdbeGetOp(p,addr)->p2 = val; } void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){ + assert( addr>=0 ); sqlite3VdbeGetOp(p,addr)->p3 = val; } void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){ @@ -1177,7 +1181,7 @@ void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){ || p->aOp[addr].opcode==OP_FkIfZero ); assert( p->aOp[addr].p4type==0 ); #ifdef SQLITE_VDBE_COVERAGE - sqlite3VdbeGetOp(p,-1)->iSrcLine = 0; /* Erase VdbeCoverage() macros */ + sqlite3VdbeGetLastOp(p)->iSrcLine = 0; /* Erase VdbeCoverage() macros */ #endif p->nOp--; }else{ @@ -1498,13 +1502,13 @@ void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){ ** Set the value if the iSrcLine field for the previously coded instruction. */ void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){ - sqlite3VdbeGetOp(v,-1)->iSrcLine = iLine; + sqlite3VdbeGetLastOp(v)->iSrcLine = iLine; } #endif /* SQLITE_VDBE_COVERAGE */ /* -** Return the opcode for a given address. If the address is -1, then -** return the most recently inserted opcode. +** Return the opcode for a given address. The address must be non-negative. +** See sqlite3VdbeGetLastOp() to get the most recently added opcode. ** ** If a memory allocation error has occurred prior to the calling of this ** routine, then a pointer to a dummy VdbeOp will be returned. That opcode @@ -1520,9 +1524,6 @@ VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ ** zeros, which is correct. MSVC generates a warning, nevertheless. */ static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */ assert( p->eVdbeState==VDBE_INIT_STATE ); - if( addr<0 ){ - addr = p->nOp - 1; - } assert( (addr>=0 && addrnOp) || p->db->mallocFailed ); if( p->db->mallocFailed ){ return (VdbeOp*)&dummy; @@ -1531,6 +1532,12 @@ VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ } } +/* Return the most recently added opcode +*/ +VdbeOp * sqlite3VdbeGetLastOp(Vdbe *p){ + return sqlite3VdbeGetOp(p, p->nOp - 1); +} + #if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) /* ** Return an integer value for one of the parameters to the opcode pOp diff --git a/src/wherecode.c b/src/wherecode.c index 04f1c374d0..db7c60ec2a 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -892,7 +892,7 @@ static void whereLikeOptimizationStringFixup( if( pTerm->wtFlags & TERM_LIKEOPT ){ VdbeOp *pOp; assert( pLevel->iLikeRepCntr>0 ); - pOp = sqlite3VdbeGetOp(v, -1); + pOp = sqlite3VdbeGetLastOp(v); assert( pOp!=0 ); assert( pOp->opcode==OP_String8 || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); diff --git a/src/window.c b/src/window.c index cb7681f461..030365851c 100644 --- a/src/window.c +++ b/src/window.c @@ -2170,10 +2170,8 @@ static void windowCodeRangeTest( /* This block runs if reg1 is not NULL, but reg2 is. */ sqlite3VdbeJumpHere(v, addr); - sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); - if( op==OP_Gt || op==OP_Ge ){ - sqlite3VdbeChangeP2(v, -1, addrDone); - } + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, + (op==OP_Gt || op==OP_Ge) ? addrDone : lbl); } /* Register reg1 currently contains csr1.peerVal (the peer-value from csr1). From 47e2fe3ce78af0c2dd32a0e8f6e10d2211a932d2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 20:21:57 +0000 Subject: [PATCH 14/42] Performance optimization in computing the Expr.nHeight field. FossilOrigin-Name: 1798ce97c8763d75315e1716d10f6c5be301042c174f41ee8c1fb8d9db99d52b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 17 +++++++++++++++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8d9ac4ab45..3d1d1a278e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\sincrease\sand\ssize\sreduction\sby\ssplitting\sout\sthe\nsqlite3VdbeGetLastOp()\sfrom\ssqlite3VdbeGetOp(). -D 2022-07-25T19:05:24.840 +C Performance\soptimization\sin\scomputing\sthe\sExpr.nHeight\sfield. +D 2022-07-25T20:21:57.291 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 13eca2beee5b758ed033a11230971310cc4a58fcd8f6bc33cad4f677c985e96c -F src/expr.c 375b8285b347a33ea239eb1dad378d4044fe5a6b0d9ee1e7db7370f97d5fb14e +F src/expr.c afc33c8b4f72a61e49194aa2c6f475e4e7ba87e91a5102701d02978d292000e2 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -1981,8 +1981,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 b52393ac28debe9867227f901d05cccf54f1b467272474500a549d956a5fb4d7 -R d4f59dff4c0149f1eec71fecf2aaf224 +P 92ac01d41d46ab73e189b1e5596ea63e5edb5b15639c5d7bdb981b95366c069b +R 5546500321041b9016b316ba858300f9 U drh -Z da216fd20b1c63c1a0740d95d247a9a9 +Z dddc2675e82e808f6c9034d235b5fa31 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e1b00675ab..e9a838e5a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92ac01d41d46ab73e189b1e5596ea63e5edb5b15639c5d7bdb981b95366c069b \ No newline at end of file +1798ce97c8763d75315e1716d10f6c5be301042c174f41ee8c1fb8d9db99d52b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c383f6f65f..44744524ab 100644 --- a/src/expr.c +++ b/src/expr.c @@ -770,7 +770,9 @@ static void heightOfSelect(const Select *pSelect, int *pnHeight){ */ static void exprSetHeight(Expr *p){ int nHeight = p->pLeft ? p->pLeft->nHeight : 0; - if( p->pRight && p->pRight->nHeight>nHeight ) nHeight = p->pRight->nHeight; + if( NEVER(p->pRight) && p->pRight->nHeight>nHeight ){ + nHeight = p->pRight->nHeight; + } if( ExprUseXSelect(p) ){ heightOfSelect(p->x.pSelect, &nHeight); }else if( p->x.pList ){ @@ -913,15 +915,26 @@ void sqlite3ExprAttachSubtrees( sqlite3ExprDelete(db, pLeft); sqlite3ExprDelete(db, pRight); }else{ + assert( ExprUseXList(pRoot) ); + assert( pRoot->x.pSelect==0 ); if( pRight ){ pRoot->pRight = pRight; pRoot->flags |= EP_Propagate & pRight->flags; +#if SQLITE_MAX_EXPR_DEPTH>0 + pRoot->nHeight = pRight->nHeight+1; + }else{ + pRoot->nHeight = 1; +#endif } if( pLeft ){ pRoot->pLeft = pLeft; pRoot->flags |= EP_Propagate & pLeft->flags; +#if SQLITE_MAX_EXPR_DEPTH>0 + if( pLeft->nHeight>=pRoot->nHeight ){ + pRoot->nHeight = pLeft->nHeight+1; + } +#endif } - exprSetHeight(pRoot); } } From 2d2e528e1f46e326c0c9e6fe27d47fab3b93c945 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 21:37:13 +0000 Subject: [PATCH 15/42] In-line a call to sqlite3ExprCode() in insert.c, for a size reduction and performance increase. FossilOrigin-Name: 35066b1446228bf030795e7868509c7b54a5681984ac28bf43123f8fac2e361e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 7 ++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3d1d1a278e..aabe381def 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sin\scomputing\sthe\sExpr.nHeight\sfield. -D 2022-07-25T20:21:57.291 +C In-line\sa\scall\sto\ssqlite3ExprCode()\sin\sinsert.c,\sfor\sa\ssize\sreduction\sand\nperformance\sincrease. +D 2022-07-25T21:37:13.343 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -530,7 +530,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c ffbfe57fb73c0f14b30ce8a5da431519cdd315e20a9dd07fa12ae8e526d37f49 +F src/insert.c 0dad9475a958e9d3bfd6c4bc3507b5ed0ec7cca615c423c652b19e2676d59b3f F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 853385cc7a604157e137585097949252d5d0c731768e16b044608e5c95c3614b @@ -1981,8 +1981,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 92ac01d41d46ab73e189b1e5596ea63e5edb5b15639c5d7bdb981b95366c069b -R 5546500321041b9016b316ba858300f9 +P 1798ce97c8763d75315e1716d10f6c5be301042c174f41ee8c1fb8d9db99d52b +R 893e05cda15fed15bec15ef6790fcb7b U drh -Z dddc2675e82e808f6c9034d235b5fa31 +Z b54185c467fd683a9e6941abfcb36a89 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e9a838e5a8..6aa0dd4538 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1798ce97c8763d75315e1716d10f6c5be301042c174f41ee8c1fb8d9db99d52b \ No newline at end of file +35066b1446228bf030795e7868509c7b54a5681984ac28bf43123f8fac2e361e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 507bc017e2..91004fb470 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1189,7 +1189,12 @@ void sqlite3Insert( sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); } }else{ - sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore); + Expr *pX = pList->a[k].pExpr; + int y = sqlite3ExprCodeTarget(pParse, pX, iRegStore); + if( y!=iRegStore ){ + sqlite3VdbeAddOp2(v, + ExprHasProperty(pX, EP_Subquery) ? OP_Copy : OP_SCopy, y, iRegStore); + } } } From f89812fe526d29db71fd4181d5efc40b4ced2648 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 22:02:35 +0000 Subject: [PATCH 16/42] Fix a harmless compiler warning. FossilOrigin-Name: 9aba7417c60b30b44c051580f0f997a4d2fc86bc811b532d175305ad4c181fc6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index aabe381def..5d003aaa49 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In-line\sa\scall\sto\ssqlite3ExprCode()\sin\sinsert.c,\sfor\sa\ssize\sreduction\sand\nperformance\sincrease. -D 2022-07-25T21:37:13.343 +C Fix\sa\sharmless\scompiler\swarning. +D 2022-07-25T22:02:35.792 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1307d57f65023c9f37c2b6c62253343fca63877f161f694a593b14c0883cedda F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c 249fb44843805cded2003e0e678ab65acb98ae0982e23256d4d0a7576a440eb3 +F src/build.c abba8a3f8529d3f3808e7cfa580e4541471ea010635d2a23365c0de8b22128b5 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad @@ -1981,8 +1981,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 1798ce97c8763d75315e1716d10f6c5be301042c174f41ee8c1fb8d9db99d52b -R 893e05cda15fed15bec15ef6790fcb7b +P 35066b1446228bf030795e7868509c7b54a5681984ac28bf43123f8fac2e361e +R 14bc2153dd870c51d01ef34ec6804518 U drh -Z b54185c467fd683a9e6941abfcb36a89 +Z 26d5ce22a72ed03f342cb02915325d2e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6aa0dd4538..269b8d0bb9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35066b1446228bf030795e7868509c7b54a5681984ac28bf43123f8fac2e361e \ No newline at end of file +9aba7417c60b30b44c051580f0f997a4d2fc86bc811b532d175305ad4c181fc6 \ No newline at end of file diff --git a/src/build.c b/src/build.c index df33c493a4..4b27d5cf84 100644 --- a/src/build.c +++ b/src/build.c @@ -170,7 +170,6 @@ void sqlite3FinishCoding(Parse *pParse){ if( pParse->bReturning ){ Returning *pReturning = pParse->u1.pReturning; int addrRewind; - int i; int reg; if( pReturning->nRetCol ){ From ef69d2b277c545fa8fe193ab9ec87b96ccbd05f7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 22:31:04 +0000 Subject: [PATCH 17/42] Performance optimization in sqlite3ViewGetColumnNames(). FossilOrigin-Name: 390717e68800af9b71acd635cf6cb123f9a591276df511f11462b42960f9a70c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 7 ++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5d003aaa49..dfa107fe51 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning. -D 2022-07-25T22:02:35.792 +C Performance\soptimization\sin\ssqlite3ViewGetColumnNames(). +D 2022-07-25T22:31:04.172 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1307d57f65023c9f37c2b6c62253343fca63877f161f694a593b14c0883cedda F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c abba8a3f8529d3f3808e7cfa580e4541471ea010635d2a23365c0de8b22128b5 +F src/build.c 941d7ff0c38f8b16ae5ffff8d76a7657701115a42651d9e52054c12ef0a6ad79 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad @@ -1981,8 +1981,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 35066b1446228bf030795e7868509c7b54a5681984ac28bf43123f8fac2e361e -R 14bc2153dd870c51d01ef34ec6804518 +P 9aba7417c60b30b44c051580f0f997a4d2fc86bc811b532d175305ad4c181fc6 +R 6455264c445f081e2167b0aeb515b69f U drh -Z 26d5ce22a72ed03f342cb02915325d2e +Z 96e54ff79e297fd32468d545082b5401 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 269b8d0bb9..cdf20ffd4d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9aba7417c60b30b44c051580f0f997a4d2fc86bc811b532d175305ad4c181fc6 \ No newline at end of file +390717e68800af9b71acd635cf6cb123f9a591276df511f11462b42960f9a70c \ No newline at end of file diff --git a/src/build.c b/src/build.c index 4b27d5cf84..47aa8bc57c 100644 --- a/src/build.c +++ b/src/build.c @@ -3042,7 +3042,7 @@ create_view_fail: ** the columns of the view in the pTable structure. Return the number ** of errors. If an error is seen leave an error message in pParse->zErrMsg. */ -int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ +static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){ Table *pSelTab; /* A fake table from which we get the result set */ Select *pSel; /* Copy of the SELECT that implements the view */ int nErr = 0; /* Number of errors encountered */ @@ -3165,6 +3165,11 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #endif /* SQLITE_OMIT_VIEW */ return nErr; } +int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ + assert( pTable!=0 ); + if( !IsVirtual(pTable) && pTable->nCol>0 ) return 0; + return viewGetColumnNames(pParse, pTable); +} #endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ #ifndef SQLITE_OMIT_VIEW From 509a6303d140d00068f5c33ededb91191934a434 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 23:01:41 +0000 Subject: [PATCH 18/42] Performance optimization by only invoking sqlite3FkCheck() when it is actually needed. FossilOrigin-Name: 98b0e830bc7effa3c9cbb77aebe7c128afc3b210af336b7516108d6435705ba0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 5 +++-- src/insert.c | 4 +++- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index dfa107fe51..220822117c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sin\ssqlite3ViewGetColumnNames(). -D 2022-07-25T22:31:04.172 +C Performance\soptimization\sby\sonly\sinvoking\ssqlite3FkCheck()\swhen\sit\sis\sactually\nneeded. +D 2022-07-25T23:01:41.122 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1307d57f65023c9f37c2b6c62253343fca63877f161f694a593b14c0883cedda F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c 941d7ff0c38f8b16ae5ffff8d76a7657701115a42651d9e52054c12ef0a6ad79 +F src/build.c 33aec2b34dbc53c3da2ea8434fccbf3c17c35ba647c3193df598cce0e861355c F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad @@ -530,7 +530,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 0dad9475a958e9d3bfd6c4bc3507b5ed0ec7cca615c423c652b19e2676d59b3f +F src/insert.c a8c994e3c3b8b08f61745bedabdf5affc79584a2b3c80ee2e4f038817838bd0a F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 853385cc7a604157e137585097949252d5d0c731768e16b044608e5c95c3614b @@ -1981,8 +1981,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 9aba7417c60b30b44c051580f0f997a4d2fc86bc811b532d175305ad4c181fc6 -R 6455264c445f081e2167b0aeb515b69f +P 390717e68800af9b71acd635cf6cb123f9a591276df511f11462b42960f9a70c +R fad65d0eefcf9a391d6bfd56620c6c0d U drh -Z 96e54ff79e297fd32468d545082b5401 +Z 0b33966f147041d5e60fb39f3e8d2b14 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cdf20ffd4d..7e63185ea7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -390717e68800af9b71acd635cf6cb123f9a591276df511f11462b42960f9a70c \ No newline at end of file +98b0e830bc7effa3c9cbb77aebe7c128afc3b210af336b7516108d6435705ba0 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 47aa8bc57c..db69b611fa 100644 --- a/src/build.c +++ b/src/build.c @@ -3067,9 +3067,10 @@ static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){ #ifndef SQLITE_OMIT_VIEW /* A positive nCol means the columns names for this view are - ** already known. + ** already known. This routine is not called unless either the + ** table is virtual or nCol is zero. */ - if( pTable->nCol>0 ) return 0; + assert( pTable->nCol<=0 ); /* A negative nCol is a special marker meaning that we are currently ** trying to compute the column names. If we enter this routine with diff --git a/src/insert.c b/src/insert.c index 91004fb470..6de304848e 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1331,7 +1331,9 @@ void sqlite3Insert( sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert ); - sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); + if( db->flags & SQLITE_ForeignKeys ){ + sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); + } /* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE ** constraints or (b) there are no triggers and this table is not a From fe888bcf1173dbcd4f21be0e2dba747973cb6e35 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Jul 2022 23:34:14 +0000 Subject: [PATCH 19/42] Fix an assert() that was made out-of-date by [b52393ac28debe98]. FossilOrigin-Name: db8230e80ed894fc2801cdbb53c2cd9de00192d7f4d8328c29cc214e2e0adde9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 220822117c..af92ee66bd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sby\sonly\sinvoking\ssqlite3FkCheck()\swhen\sit\sis\sactually\nneeded. -D 2022-07-25T23:01:41.122 +C Fix\san\sassert()\sthat\swas\smade\sout-of-date\sby\s[b52393ac28debe98]. +D 2022-07-25T23:34:14.245 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 13eca2beee5b758ed033a11230971310cc4a58fcd8f6bc33cad4f677c985e96c -F src/expr.c afc33c8b4f72a61e49194aa2c6f475e4e7ba87e91a5102701d02978d292000e2 +F src/expr.c 1565349664995e930cc11217cc665875d8d3d3cae62c92805a67ab582befc92a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -1981,8 +1981,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 390717e68800af9b71acd635cf6cb123f9a591276df511f11462b42960f9a70c -R fad65d0eefcf9a391d6bfd56620c6c0d +P 98b0e830bc7effa3c9cbb77aebe7c128afc3b210af336b7516108d6435705ba0 +R 30abdb0021008a8a1927382f64246cc3 U drh -Z 0b33966f147041d5e60fb39f3e8d2b14 +Z a20715ac16e756fff0bd1afe1caf81e7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7e63185ea7..2296089167 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98b0e830bc7effa3c9cbb77aebe7c128afc3b210af336b7516108d6435705ba0 \ No newline at end of file +db8230e80ed894fc2801cdbb53c2cd9de00192d7f4d8328c29cc214e2e0adde9 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 44744524ab..32d655a751 100644 --- a/src/expr.c +++ b/src/expr.c @@ -6122,8 +6122,8 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ int iAgg = pExpr->iAgg; Parse *pParse = pWalker->pParse; sqlite3 *db = pParse->db; - assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION ); - if( pExpr->op==TK_AGG_COLUMN ){ + if( pExpr->op!=TK_AGG_FUNCTION ){ + assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_IF_NULL_ROW ); assert( iAgg>=0 && iAggnColumn ); if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); @@ -6133,6 +6133,7 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ } } }else{ + assert( pExpr->op==TK_AGG_FUNCTION ); assert( iAgg>=0 && iAggnFunc ); if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); From 3c8fb6fb8461cb813b3b76048ce54e3c1604a06e Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Jul 2022 01:20:18 +0000 Subject: [PATCH 20/42] Performance optimization: avoid unnecessary calls to computeLimitRegisters(). FossilOrigin-Name: f48bd8f85d86fd93329dda7ba57f468854a732b89e4126e9c5beec3495d24b31 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index af92ee66bd..7173617ca0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\swas\smade\sout-of-date\sby\s[b52393ac28debe98]. -D 2022-07-25T23:34:14.245 +C Performance\soptimization:\s\savoid\sunnecessary\scalls\sto\scomputeLimitRegisters(). +D 2022-07-26T01:20:18.198 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -570,7 +570,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c a9516e1453241986f1eb73c00a0e7cf23d23081fd2eb50e67fcbb96fe7bf6f00 +F src/select.c 2219591ff134d612e2e3e9d401665634bac45956f2c12100280c04efb0d99bb8 F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1981,8 +1981,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 98b0e830bc7effa3c9cbb77aebe7c128afc3b210af336b7516108d6435705ba0 -R 30abdb0021008a8a1927382f64246cc3 +P db8230e80ed894fc2801cdbb53c2cd9de00192d7f4d8328c29cc214e2e0adde9 +R ff9bb5a29a45c7eaa1b390df1d36ecd7 U drh -Z a20715ac16e756fff0bd1afe1caf81e7 +Z 3b35c17a3beaeddc52e4b88d9f02979e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2296089167..65ce96a9c4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db8230e80ed894fc2801cdbb53c2cd9de00192d7f4d8328c29cc214e2e0adde9 \ No newline at end of file +f48bd8f85d86fd93329dda7ba57f468854a732b89e4126e9c5beec3495d24b31 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 672461d447..fe30e96ce0 100644 --- a/src/select.c +++ b/src/select.c @@ -7196,7 +7196,7 @@ int sqlite3Select( if( (p->selFlags & SF_FixedLimit)==0 ){ p->nSelectRow = 320; /* 4 billion rows */ } - computeLimitRegisters(pParse, p, iEnd); + if( p->pLimit ) computeLimitRegisters(pParse, p, iEnd); if( p->iLimit==0 && sSort.addrSortIndex>=0 ){ sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen); sSort.sortFlags |= SORTFLAG_UseSorter; From e6710e83fcec5678f059aec7dcd2e20aacfacbdd Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Jul 2022 10:16:25 +0000 Subject: [PATCH 21/42] Add a OOM term to a single assert() statement. FossilOrigin-Name: 217fc3ebd423e050508d6af97e0664f301824ef9a997ed2d302c006a41227917 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7173617ca0..4f61cf9bfc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization:\s\savoid\sunnecessary\scalls\sto\scomputeLimitRegisters(). -D 2022-07-26T01:20:18.198 +C Add\sa\sOOM\sterm\sto\sa\ssingle\sassert()\sstatement. +D 2022-07-26T10:16:25.603 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -646,7 +646,7 @@ F src/vdbe.c 1266f3a4744224253dd74f0080014be8056b062c6f2f6a81e229fa0d306d4102 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c d68267db6e6641994e17c70670c40fd67ceb2352e42188815ed8c05d4d6502cb -F src/vdbeaux.c f14f30892ee8491f7903cf4ccd7bd0b7ab6f1eddf7dda4a0e03725fcd5ae05e1 +F src/vdbeaux.c 8584f4a20997fd918f0d957ab4f73d7411159772297c5020c188973bdc41dbf0 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c 5ebf05c0182addedb1607ade848e1c83cef40981df94d1abfab0c59288c6064f F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 @@ -1981,8 +1981,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 db8230e80ed894fc2801cdbb53c2cd9de00192d7f4d8328c29cc214e2e0adde9 -R ff9bb5a29a45c7eaa1b390df1d36ecd7 +P f48bd8f85d86fd93329dda7ba57f468854a732b89e4126e9c5beec3495d24b31 +R e7b7ace3206c3ff792140e3157349b46 U drh -Z 3b35c17a3beaeddc52e4b88d9f02979e +Z f1efcdf9820c3825f4f57a8fb233e014 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 65ce96a9c4..28819b56af 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f48bd8f85d86fd93329dda7ba57f468854a732b89e4126e9c5beec3495d24b31 \ No newline at end of file +217fc3ebd423e050508d6af97e0664f301824ef9a997ed2d302c006a41227917 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index dfee43d05c..8ab7978fa1 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1141,7 +1141,7 @@ void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ sqlite3VdbeGetOp(p,addr)->p1 = val; } void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ - assert( addr>=0 ); + assert( addr>=0 || p->db->mallocFailed ); sqlite3VdbeGetOp(p,addr)->p2 = val; } void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){ From f4c291275b6cb345afad5feb4f8ecb88ab356e4c Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Jul 2022 14:37:04 +0000 Subject: [PATCH 22/42] Improved AggInfo.aCol debugging output, intended to debug a problem with LEFT JOIN flattening into an aggregate query with GROUP BY. FossilOrigin-Name: e717e029bde4ee68b6ea77a68721c02ddb6e296f1d310a368137ea3c4164f68c --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- src/select.c | 9 +++++++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 4f61cf9bfc..c3d2195875 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sOOM\sterm\sto\sa\ssingle\sassert()\sstatement. -D 2022-07-26T10:16:25.603 +C Improved\sAggInfo.aCol\sdebugging\soutput,\sintended\sto\sdebug\sa\sproblem\swith\nLEFT\sJOIN\sflattening\sinto\san\saggregate\squery\swith\sGROUP\sBY. +D 2022-07-26T14:37:04.119 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 13eca2beee5b758ed033a11230971310cc4a58fcd8f6bc33cad4f677c985e96c -F src/expr.c 1565349664995e930cc11217cc665875d8d3d3cae62c92805a67ab582befc92a +F src/expr.c ed5f44ba634193eaa9c603da52ab45a3acd3f23abf786ea0aff69a64da52d20f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -570,7 +570,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 2219591ff134d612e2e3e9d401665634bac45956f2c12100280c04efb0d99bb8 +F src/select.c 7d385fbf6ba7f386f24d31ba6c508613131680ff4244b75046278a7ac85819c6 F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1981,8 +1981,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f48bd8f85d86fd93329dda7ba57f468854a732b89e4126e9c5beec3495d24b31 -R e7b7ace3206c3ff792140e3157349b46 +P 217fc3ebd423e050508d6af97e0664f301824ef9a997ed2d302c006a41227917 +R 05b53d25dc1ad05451162b3588f8e8f6 +T *branch * flatten-left-join +T *sym-flatten-left-join * +T -sym-trunk * U drh -Z f1efcdf9820c3825f4f57a8fb233e014 +Z 41b04475f9d85a45d0a38cd9eef9070b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 28819b56af..d7c0db8b97 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -217fc3ebd423e050508d6af97e0664f301824ef9a997ed2d302c006a41227917 \ No newline at end of file +e717e029bde4ee68b6ea77a68721c02ddb6e296f1d310a368137ea3c4164f68c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 32d655a751..5f2068d26a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4088,7 +4088,7 @@ expr_code_doover: pCol->iSorterColumn, target); if( pCol->iColumn<0 ){ VdbeComment((v,"%s.rowid",pTab->zName)); - }else{ + }else if( pTab!=0 ){ VdbeComment((v,"%s.%s", pTab->zName, pTab->aCol[pCol->iColumn].zCnName)); if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){ diff --git a/src/select.c b/src/select.c index fe30e96ce0..d9e0e87698 100644 --- a/src/select.c +++ b/src/select.c @@ -7418,8 +7418,13 @@ int sqlite3Select( sqlite3TreeViewExprList(0, pMinMaxOrderBy, 0, "ORDERBY"); } for(ii=0; iinColumn; ii++){ - sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", - ii, pAggInfo->aCol[ii].iMem); + struct AggInfo_col *pCol = &pAggInfo->aCol[ii]; + sqlite3DebugPrintf( + "agg-column[%d] pTab=%s iTable=%d iColumn=%d iMem=%d" + " iSorterColumn=%d\n", + ii, pCol->pTab ? pCol->pTab->zName : "NULL", + pCol->iTable, pCol->iColumn, pCol->iMem, + pCol->iSorterColumn); sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0); } for(ii=0; iinFunc; ii++){ From 4b1b65ca2e561c11adc9466849faea58be7221aa Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Jul 2022 15:32:02 +0000 Subject: [PATCH 23/42] Make sure IF_NULL_ROW expressions receive a separate slot in the sorter used to implement GROUP BY. FossilOrigin-Name: 2bda4fca06ab6be5ad02377a7d1fd9fb9586e3181f1052e4b4937958bdd45efe --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/expr.c | 16 ++++++++++------ src/select.c | 1 + 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index c3d2195875..2df75e5e74 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sAggInfo.aCol\sdebugging\soutput,\sintended\sto\sdebug\sa\sproblem\swith\nLEFT\sJOIN\sflattening\sinto\san\saggregate\squery\swith\sGROUP\sBY. -D 2022-07-26T14:37:04.119 +C Make\ssure\sIF_NULL_ROW\sexpressions\sreceive\sa\sseparate\sslot\sin\sthe\ssorter\sused\nto\simplement\sGROUP\sBY. +D 2022-07-26T15:32:02.206 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 13eca2beee5b758ed033a11230971310cc4a58fcd8f6bc33cad4f677c985e96c -F src/expr.c ed5f44ba634193eaa9c603da52ab45a3acd3f23abf786ea0aff69a64da52d20f +F src/expr.c 0f72468b64eef40c280fd6b273c19f3b221444b00f535c7ba6f34faa657e63da F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c 8f72e88cccdee22185133c10f96ccd61dc34c5ea4b1fa9a73c237ef59b2e64f1 @@ -570,7 +570,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 7d385fbf6ba7f386f24d31ba6c508613131680ff4244b75046278a7ac85819c6 +F src/select.c 76708e3a8cb80f011f31f1eb6fa5f433aef8f47c85c0a2709148d673a719a846 F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1981,11 +1981,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 217fc3ebd423e050508d6af97e0664f301824ef9a997ed2d302c006a41227917 -R 05b53d25dc1ad05451162b3588f8e8f6 -T *branch * flatten-left-join -T *sym-flatten-left-join * -T -sym-trunk * +P e717e029bde4ee68b6ea77a68721c02ddb6e296f1d310a368137ea3c4164f68c +R 1029f8a12febed8db153949d4d164b76 U drh -Z 41b04475f9d85a45d0a38cd9eef9070b +Z b08c39293252863d670f80901346b8c8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d7c0db8b97..fb3f6bc93b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e717e029bde4ee68b6ea77a68721c02ddb6e296f1d310a368137ea3c4164f68c \ No newline at end of file +2bda4fca06ab6be5ad02377a7d1fd9fb9586e3181f1052e4b4937958bdd45efe \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 5f2068d26a..be3e73294f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4088,7 +4088,7 @@ expr_code_doover: pCol->iSorterColumn, target); if( pCol->iColumn<0 ){ VdbeComment((v,"%s.rowid",pTab->zName)); - }else if( pTab!=0 ){ + }else if( ALWAYS(pTab!=0) ){ VdbeComment((v,"%s.%s", pTab->zName, pTab->aCol[pCol->iColumn].zCnName)); if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){ @@ -6227,8 +6227,10 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ int k; pCol = pAggInfo->aCol; for(k=0; knColumn; k++, pCol++){ - if( pCol->iTable==pExpr->iTable && - pCol->iColumn==pExpr->iColumn ){ + if( pCol->iTable==pExpr->iTable + && pCol->iColumn==pExpr->iColumn + && pExpr->op!=TK_IF_NULL_ROW + ){ break; } } @@ -6243,15 +6245,17 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ pCol->iMem = ++pParse->nMem; pCol->iSorterColumn = -1; pCol->pCExpr = pExpr; - if( pAggInfo->pGroupBy ){ + if( pAggInfo->pGroupBy && pExpr->op!=TK_IF_NULL_ROW ){ int j, n; ExprList *pGB = pAggInfo->pGroupBy; struct ExprList_item *pTerm = pGB->a; n = pGB->nExpr; for(j=0; jpExpr; - if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable && - pE->iColumn==pExpr->iColumn ){ + if( pE->op==TK_COLUMN + && pE->iTable==pExpr->iTable + && pE->iColumn==pExpr->iColumn + ){ pCol->iSorterColumn = j; break; } diff --git a/src/select.c b/src/select.c index d9e0e87698..d5c65bfb28 100644 --- a/src/select.c +++ b/src/select.c @@ -3798,6 +3798,7 @@ static Expr *substExpr( ifNullRow.op = TK_IF_NULL_ROW; ifNullRow.pLeft = pCopy; ifNullRow.iTable = pSubst->iNewTable; + ifNullRow.iColumn = -99; ifNullRow.flags = EP_IfNullRow; pCopy = &ifNullRow; } From 4784a78d1cc87525c03e9788307acd0e93344261 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 26 Jul 2022 15:39:32 +0000 Subject: [PATCH 24/42] Add test cases related to fix [e717e029]. FossilOrigin-Name: 2909f36bfba8f34b818e5d9ecd8c759f05bbe25765089e78bb022de2b77a4f0f --- manifest | 14 +++++------ manifest.uuid | 2 +- test/select3.test | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2df75e5e74..eeccada10e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sIF_NULL_ROW\sexpressions\sreceive\sa\sseparate\sslot\sin\sthe\ssorter\sused\nto\simplement\sGROUP\sBY. -D 2022-07-26T15:32:02.206 +C Add\stest\scases\srelated\sto\sfix\s[e717e029]. +D 2022-07-26T15:39:32.378 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1391,7 +1391,7 @@ F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2f F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 F test/select1.test 692e84cfa29c405854c69e8a4027183d64c22952866a123fabbce741a379e889 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 -F test/select3.test 054b155a4b9394c6858640029cb93e87defbaecc1c87ebb21157c3d35dfc4d88 +F test/select3.test 8d04b66df7475275a65f7e4a786d6a724c30bd9929f8ae5bd59c8d3d6e75e6cd F test/select4.test f0684d3da3bccacbe2a1ebadf6fb49d9df6f53acb4c6ebc228a88d0d6054cc7b F test/select5.test 8afc5e5dcdebc2be54472e73ebd9cd1adef1225fd15d37a1c62f969159f390ae F test/select6.test 9b2fb4ffedf52e1b5703cfcae1212e7a4a063f014c0458d78d29aca3db766d1f @@ -1981,8 +1981,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 e717e029bde4ee68b6ea77a68721c02ddb6e296f1d310a368137ea3c4164f68c -R 1029f8a12febed8db153949d4d164b76 -U drh -Z b08c39293252863d670f80901346b8c8 +P 2bda4fca06ab6be5ad02377a7d1fd9fb9586e3181f1052e4b4937958bdd45efe +R 12b2c22b8ec2610d9abb28e0edce627b +U dan +Z 31e4b968c08d2950ff44e5d5f67d5a40 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fb3f6bc93b..b7c6c8eb83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2bda4fca06ab6be5ad02377a7d1fd9fb9586e3181f1052e4b4937958bdd45efe \ No newline at end of file +2909f36bfba8f34b818e5d9ecd8c759f05bbe25765089e78bb022de2b77a4f0f \ No newline at end of file diff --git a/test/select3.test b/test/select3.test index ec0ee8d2bb..4c9d71b4f5 100644 --- a/test/select3.test +++ b/test/select3.test @@ -374,5 +374,64 @@ foreach {tn sql} { } {abc constant} } +reset_db +do_execsql_test 12.0 { + CREATE TABLE t1(a); + CREATE TABLE t2(x); +} +do_execsql_test 12.1 { + SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; +} +do_execsql_test 12.2 { + INSERT INTO t1 VALUES(1), (1), (2), (3); + SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; +} { + 0 {} + 0 {} + 0 {} +} +do_execsql_test 12.3 { + INSERT INTO t2 VALUES(45); + SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; +} { + 2 59 + 1 59 + 1 59 +} +do_execsql_test 12.4 { + INSERT INTO t2 VALUES(210); + SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; +} { + 4 59 + 2 59 + 2 59 +} +do_execsql_test 12.5 { + INSERT INTO t2 VALUES(NULL); + SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; +} { + 4 59 + 2 59 + 2 59 +} +do_execsql_test 12.6 { + DELETE FROM t2; + DELETE FROM t1; + INSERT INTO t1 VALUES('value'); + INSERT INTO t2 VALUES('hello'); +} {} +do_execsql_test 12.7 { + SELECT group_concat(x), m FROM t1 + LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; +} { + hello 59 +} +do_execsql_test 12.8 { + SELECT group_concat(x), m, n FROM t1 + LEFT JOIN (SELECT x, 59 AS m, 60 AS n FROM t2) GROUP BY a; +} { + hello 59 60 +} finish_test + From 1dd130360020fa9a1cea9f9fb9349cd695df73c5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Jul 2022 15:41:34 +0000 Subject: [PATCH 25/42] Omit a unused variable initialization in order to suppress a harmless compiler warning. FossilOrigin-Name: 2d703c5e941cac72efc21d58e1e35c446b338b2927a42f587ab788826fd7f3f1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4f61cf9bfc..10030b8131 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sOOM\sterm\sto\sa\ssingle\sassert()\sstatement. -D 2022-07-26T10:16:25.603 +C Omit\sa\sunused\svariable\sinitialization\sin\sorder\sto\ssuppress\sa\sharmless\scompiler\nwarning. +D 2022-07-26T15:41:34.792 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -510,7 +510,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7 F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 1307d57f65023c9f37c2b6c62253343fca63877f161f694a593b14c0883cedda +F src/btree.c 4a8d349b9ed4dc6d252c535227699d75319b633058a56432ebf43c9f56f9085e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e F src/build.c 33aec2b34dbc53c3da2ea8434fccbf3c17c35ba647c3193df598cce0e861355c @@ -1981,8 +1981,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 f48bd8f85d86fd93329dda7ba57f468854a732b89e4126e9c5beec3495d24b31 -R e7b7ace3206c3ff792140e3157349b46 +P 217fc3ebd423e050508d6af97e0664f301824ef9a997ed2d302c006a41227917 +R 407e9b273b183df6bef313b5323c800a U drh -Z f1efcdf9820c3825f4f57a8fb233e014 +Z a0cbd446115797b84cb35ad185602ef9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 28819b56af..814b7ff643 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -217fc3ebd423e050508d6af97e0664f301824ef9a997ed2d302c006a41227917 \ No newline at end of file +2d703c5e941cac72efc21d58e1e35c446b338b2927a42f587ab788826fd7f3f1 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 80bca66353..09835fca03 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1513,7 +1513,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); assert( pPage->nOverflow==0 ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - src = data = pPage->aData; + data = pPage->aData; hdr = pPage->hdrOffset; cellOffset = pPage->cellOffset; nCell = pPage->nCell; From 3b01dd0f5db44d5d236326cb948a0cac048d5024 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Jul 2022 19:10:13 +0000 Subject: [PATCH 26/42] Restore a VDBE coverage macro that is mistakenly deleted for check-in [92ac01d41d46ab73]. FossilOrigin-Name: 01de7ec44fb1e8e6f847eaef433216b3163a44a8789451718e1c419ef840ddfb --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/window.c | 1 + 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6408bbbc2e..3281ad26af 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sproblem\srelated\sto\saggregate\squery\sLEFT\sJOIN\sflattening. -D 2022-07-26T18:43:45.800 +C Restore\sa\sVDBE\scoverage\smacro\sthat\sis\smistakenly\sdeleted\sfor\ncheck-in\s[92ac01d41d46ab73]. +D 2022-07-26T19:10:13.436 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -661,7 +661,7 @@ F src/where.c 1049685e84bd74692ad76984a3411a21c5a1e6ddd08c981ec94d2f11f769e07f F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 210240c9cec2a1d1494a3ac7852e9432245382e752b490c2bb437637c2c98711 F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 -F src/window.c 057df98b3b8296c4ccd35066ee171b66d956b3ee8bfce27596ddb5ed8fab66f4 +F src/window.c 928e215840e2f2d9a2746e018c9643ef42c66c4ab6630ef0df7fa388fa145e86 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test b5c19d504dec222c0dc66642673d23dce915d35737b68e74d9f237b80493eb53 @@ -1981,9 +1981,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 2d703c5e941cac72efc21d58e1e35c446b338b2927a42f587ab788826fd7f3f1 2909f36bfba8f34b818e5d9ecd8c759f05bbe25765089e78bb022de2b77a4f0f -R fd8805f95598ecc80e3e7fdb82e7f06b -T +closed 2909f36bfba8f34b818e5d9ecd8c759f05bbe25765089e78bb022de2b77a4f0f -U dan -Z 98cbf6cf155acbce70008bbc87cc3bcc +P 8e12c6f59bcb67be4ff131feecc5af68f4bb0afbcced2e2f7e73289aaf95d99d +R d0d3075ca4c78be3d08a2ae674010fb3 +U drh +Z 2ec897bd518817fd9fabfa62106fc627 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8ac3fc2520..3b870e435e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8e12c6f59bcb67be4ff131feecc5af68f4bb0afbcced2e2f7e73289aaf95d99d \ No newline at end of file +01de7ec44fb1e8e6f847eaef433216b3163a44a8789451718e1c419ef840ddfb \ No newline at end of file diff --git a/src/window.c b/src/window.c index 030365851c..f13ea8b027 100644 --- a/src/window.c +++ b/src/window.c @@ -2172,6 +2172,7 @@ static void windowCodeRangeTest( sqlite3VdbeJumpHere(v, addr); sqlite3VdbeAddOp2(v, OP_IsNull, reg2, (op==OP_Gt || op==OP_Ge) ? addrDone : lbl); + VdbeCoverage(v); } /* Register reg1 currently contains csr1.peerVal (the peer-value from csr1). From f98109e7cb51e0950ed8fe863f970ea6f9e729bd Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 1 Aug 2022 13:14:03 +0000 Subject: [PATCH 27/42] In the xUpdate method of the GeoPoly virtual table, make sure that the number of updated columns does not exceed the underlying implementation, even if the virtual table object records an excess number of column in the nAux field due to table constraints in the table definition. Fix for the problem reported by [forum:/forumpost/a096ab7d96bb057a|forum post a096ab7d96bb057a]. FossilOrigin-Name: a04dd475c2c8afdded0afecfd34c6c4c2f48cce520e09b7fa5172ff30f09209e --- ext/rtree/geopoly.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index 68cde87344..7b41e79092 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -1695,7 +1695,7 @@ static int geopolyUpdate( sqlite3_free(p); nChange = 1; } - for(jj=1; jjnAux; jj++){ + for(jj=1; jj Date: Wed, 3 Aug 2022 15:58:44 +0000 Subject: [PATCH 28/42] For an IN operator used with a RIGHT JOIN, use the number of terms in the vector, not the number of equality terms, to size the column map. dbsqlfuzz 14cfdad6ca45e607163f54049ddf5065183dc657. FossilOrigin-Name: b184c8d9222da6b420b5d7c439bbe4b737d92ffa27f5e933f4e1a9c8117b0ee5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c3727e9837..f3994472d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sxUpdate\smethod\sof\sthe\sGeoPoly\svirtual\stable,\smake\ssure\sthat\sthe\nnumber\sof\supdated\scolumns\sdoes\snot\sexceed\sthe\sunderlying\simplementation,\seven\nif\sthe\svirtual\stable\sobject\srecords\san\sexcess\snumber\sof\scolumn\sin\sthe\snAux\nfield\sdue\sto\stable\sconstraints\sin\sthe\stable\sdefinition.\nFix\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/a096ab7d96bb057a|forum\spost\sa096ab7d96bb057a]. -D 2022-08-01T13:14:03.301 +C For\san\sIN\soperator\sused\swith\sa\sRIGHT\sJOIN,\suse\sthe\snumber\sof\sterms\sin\sthe\nvector,\snot\sthe\snumber\sof\sequality\sterms,\sto\ssize\sthe\scolumn\smap.\ndbsqlfuzz\s14cfdad6ca45e607163f54049ddf5065183dc657. +D 2022-08-03T15:58:44.012 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -659,7 +659,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 1049685e84bd74692ad76984a3411a21c5a1e6ddd08c981ec94d2f11f769e07f F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 -F src/wherecode.c 210240c9cec2a1d1494a3ac7852e9432245382e752b490c2bb437637c2c98711 +F src/wherecode.c 6fc48e5b25821c66c387a2e5b2d00bf497636ed330683ce5acae50b178d25bac F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 F src/window.c 928e215840e2f2d9a2746e018c9643ef42c66c4ab6630ef0df7fa388fa145e86 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1981,8 +1981,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 01de7ec44fb1e8e6f847eaef433216b3163a44a8789451718e1c419ef840ddfb -R 6e9af4a1fd48ba4a0b2f74feb2fb7ec8 +P a04dd475c2c8afdded0afecfd34c6c4c2f48cce520e09b7fa5172ff30f09209e +R 63dd5d94fb138ca07714f601c94938cf U drh -Z b4532202f959fae679f2c4c7df6a9a48 +Z 4f99307534c0bc9f7c784d197ef60b08 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index db1cc4977c..d44341365c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a04dd475c2c8afdded0afecfd34c6c4c2f48cce520e09b7fa5172ff30f09209e \ No newline at end of file +b184c8d9222da6b420b5d7c439bbe4b737d92ffa27f5e933f4e1a9c8117b0ee5 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index db7c60ec2a..ab947773b7 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -622,7 +622,8 @@ static int codeEqualityTerm( } sqlite3ExprDelete(db, pX); }else{ - aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, + sizeof(int)*sqlite3ExprVectorSize(pX->pLeft)); eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); } pX = pExpr; From 3a17e2e5cf6896486ecdda92ef6abc7a9e74ec6c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 3 Aug 2022 17:26:32 +0000 Subject: [PATCH 29/42] Improvement on the previous check-in. FossilOrigin-Name: c1ab0ea2959259cbd29f624bfd5e7366035f2dbcaab72c0bf55723c0919b7a79 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f3994472d9..e053d1a255 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\san\sIN\soperator\sused\swith\sa\sRIGHT\sJOIN,\suse\sthe\snumber\sof\sterms\sin\sthe\nvector,\snot\sthe\snumber\sof\sequality\sterms,\sto\ssize\sthe\scolumn\smap.\ndbsqlfuzz\s14cfdad6ca45e607163f54049ddf5065183dc657. -D 2022-08-03T15:58:44.012 +C Improvement\son\sthe\sprevious\scheck-in. +D 2022-08-03T17:26:32.426 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -659,7 +659,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 1049685e84bd74692ad76984a3411a21c5a1e6ddd08c981ec94d2f11f769e07f F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 -F src/wherecode.c 6fc48e5b25821c66c387a2e5b2d00bf497636ed330683ce5acae50b178d25bac +F src/wherecode.c 719a5bb0102711a6ebed8d4385b831a27ce679172f3ae8e9aaec0dc1e415a95a F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 F src/window.c 928e215840e2f2d9a2746e018c9643ef42c66c4ab6630ef0df7fa388fa145e86 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1981,8 +1981,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 a04dd475c2c8afdded0afecfd34c6c4c2f48cce520e09b7fa5172ff30f09209e -R 63dd5d94fb138ca07714f601c94938cf +P b184c8d9222da6b420b5d7c439bbe4b737d92ffa27f5e933f4e1a9c8117b0ee5 +R 600a480393721dba1f30f4d7f2bbbe2b U drh -Z 4f99307534c0bc9f7c784d197ef60b08 +Z c1a9cd59eb2cac4d212215eae9db9a45 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d44341365c..1e485a198c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b184c8d9222da6b420b5d7c439bbe4b737d92ffa27f5e933f4e1a9c8117b0ee5 \ No newline at end of file +c1ab0ea2959259cbd29f624bfd5e7366035f2dbcaab72c0bf55723c0919b7a79 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index ab947773b7..85df64279c 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -622,8 +622,8 @@ static int codeEqualityTerm( } sqlite3ExprDelete(db, pX); }else{ - aiMap = (int*)sqlite3DbMallocZero(pParse->db, - sizeof(int)*sqlite3ExprVectorSize(pX->pLeft)); + int n = sqlite3ExprVectorSize(pX->pLeft); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n)); eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); } pX = pExpr; From 403f00219b78fe8778af1f487c04d840a3abe0f5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 3 Aug 2022 19:37:25 +0000 Subject: [PATCH 30/42] Small performance increase on the binding interfaces. FossilOrigin-Name: aab24c37fb444804fb91177b4b522909ef1bb85383444d97d82a758f919047d2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeapi.c | 17 ++++++++--------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index e053d1a255..7263c92943 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvement\son\sthe\sprevious\scheck-in. -D 2022-08-03T17:26:32.426 +C Small\sperformance\sincrease\son\sthe\sbinding\sinterfaces. +D 2022-08-03T19:37:25.175 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -645,7 +645,7 @@ F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 F src/vdbe.c 1266f3a4744224253dd74f0080014be8056b062c6f2f6a81e229fa0d306d4102 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da -F src/vdbeapi.c d68267db6e6641994e17c70670c40fd67ceb2352e42188815ed8c05d4d6502cb +F src/vdbeapi.c 4181dffeef6ee181275cfecf27ad8577024c17ee9639531decdf4162b8c0326b F src/vdbeaux.c 8584f4a20997fd918f0d957ab4f73d7411159772297c5020c188973bdc41dbf0 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c 5ebf05c0182addedb1607ade848e1c83cef40981df94d1abfab0c59288c6064f @@ -1981,8 +1981,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 b184c8d9222da6b420b5d7c439bbe4b737d92ffa27f5e933f4e1a9c8117b0ee5 -R 600a480393721dba1f30f4d7f2bbbe2b +P c1ab0ea2959259cbd29f624bfd5e7366035f2dbcaab72c0bf55723c0919b7a79 +R 6d30ee627cafae056fe4256608756484 U drh -Z c1a9cd59eb2cac4d212215eae9db9a45 +Z 20186bacd0ffc8dda8aa3c7b92c68f3f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1e485a198c..0fa5666afd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1ab0ea2959259cbd29f624bfd5e7366035f2dbcaab72c0bf55723c0919b7a79 \ No newline at end of file +aab24c37fb444804fb91177b4b522909ef1bb85383444d97d82a758f919047d2 \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 97bc744c30..c810610bef 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1432,7 +1432,7 @@ const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ ** The error code stored in database p->db is overwritten with the return ** value in any case. */ -static int vdbeUnbind(Vdbe *p, int i){ +static int vdbeUnbind(Vdbe *p, unsigned int i){ Mem *pVar; if( vdbeSafetyNotNull(p) ){ return SQLITE_MISUSE_BKPT; @@ -1445,12 +1445,11 @@ static int vdbeUnbind(Vdbe *p, int i){ "bind on a busy prepared statement: [%s]", p->zSql); return SQLITE_MISUSE_BKPT; } - if( i<1 || i>p->nVar ){ + if( i>=p->nVar ){ sqlite3Error(p->db, SQLITE_RANGE); sqlite3_mutex_leave(p->db->mutex); return SQLITE_RANGE; } - i--; pVar = &p->aVar[i]; sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; @@ -1487,7 +1486,7 @@ static int bindText( Mem *pVar; int rc; - rc = vdbeUnbind(p, i); + rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ if( zData!=0 ){ pVar = &p->aVar[i-1]; @@ -1536,7 +1535,7 @@ int sqlite3_bind_blob64( int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ int rc; Vdbe *p = (Vdbe *)pStmt; - rc = vdbeUnbind(p, i); + rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); sqlite3_mutex_leave(p->db->mutex); @@ -1549,7 +1548,7 @@ int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ int rc; Vdbe *p = (Vdbe *)pStmt; - rc = vdbeUnbind(p, i); + rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); sqlite3_mutex_leave(p->db->mutex); @@ -1559,7 +1558,7 @@ int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){ int rc; Vdbe *p = (Vdbe*)pStmt; - rc = vdbeUnbind(p, i); + rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ sqlite3_mutex_leave(p->db->mutex); } @@ -1574,7 +1573,7 @@ int sqlite3_bind_pointer( ){ int rc; Vdbe *p = (Vdbe*)pStmt; - rc = vdbeUnbind(p, i); + rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ sqlite3VdbeMemSetPointer(&p->aVar[i-1], pPtr, zPTtype, xDestructor); sqlite3_mutex_leave(p->db->mutex); @@ -1652,7 +1651,7 @@ int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ int rc; Vdbe *p = (Vdbe *)pStmt; - rc = vdbeUnbind(p, i); + rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ #ifndef SQLITE_OMIT_INCRBLOB sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); From 3cf46ee508e97b46736a2607ded9c84c2c16229f Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 3 Aug 2022 19:53:54 +0000 Subject: [PATCH 31/42] Performance optimization to the math opcodes of the bytecode engine. FossilOrigin-Name: 597347d9c39f6ed068ac942a8c9853b1b745fce1eb5e9dd30f6c1cb312b36f53 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 12 +++++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 7263c92943..75438ca23f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\sincrease\son\sthe\sbinding\sinterfaces. -D 2022-08-03T19:37:25.175 +C Performance\soptimization\sto\sthe\smath\sopcodes\sof\sthe\sbytecode\sengine. +D 2022-08-03T19:53:54.082 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c 1266f3a4744224253dd74f0080014be8056b062c6f2f6a81e229fa0d306d4102 +F src/vdbe.c 34f76cbbd886d90413b4503e6d46d7425152b88219bdd4e6bcaf81da75640d3e F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 4181dffeef6ee181275cfecf27ad8577024c17ee9639531decdf4162b8c0326b @@ -1981,8 +1981,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 c1ab0ea2959259cbd29f624bfd5e7366035f2dbcaab72c0bf55723c0919b7a79 -R 6d30ee627cafae056fe4256608756484 +P aab24c37fb444804fb91177b4b522909ef1bb85383444d97d82a758f919047d2 +R e2ed79990c9f576213c6203a5349f2b7 U drh -Z 20186bacd0ffc8dda8aa3c7b92c68f3f +Z ef554432af87d216083ec59e16ec0e61 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0fa5666afd..a35147d8e3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aab24c37fb444804fb91177b4b522909ef1bb85383444d97d82a758f919047d2 \ No newline at end of file +597347d9c39f6ed068ac942a8c9853b1b745fce1eb5e9dd30f6c1cb312b36f53 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5a6a8fbdc2..0b6fee3521 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1731,7 +1731,6 @@ case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */ case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ - u16 flags; /* Combined MEM_* flags from both inputs */ u16 type1; /* Numeric type of left operand */ u16 type2; /* Numeric type of right operand */ i64 iA; /* Integer value of left operand */ @@ -1740,12 +1739,12 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ double rB; /* Real value of right operand */ pIn1 = &aMem[pOp->p1]; - type1 = numericType(pIn1); + type1 = pIn1->flags; pIn2 = &aMem[pOp->p2]; - type2 = numericType(pIn2); + type2 = pIn2->flags; pOut = &aMem[pOp->p3]; - flags = pIn1->flags | pIn2->flags; if( (type1 & type2 & MEM_Int)!=0 ){ +int_math: iA = pIn1->u.i; iB = pIn2->u.i; switch( pOp->opcode ){ @@ -1767,9 +1766,12 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ } pOut->u.i = iB; MemSetTypeFlag(pOut, MEM_Int); - }else if( (flags & MEM_Null)!=0 ){ + }else if( ((type1 | type2) & MEM_Null)!=0 ){ goto arithmetic_result_is_null; }else{ + type1 = numericType(pIn1); + type2 = numericType(pIn2); + if( (type1 & type2 & MEM_Int)!=0 ) goto int_math; fp_math: rA = sqlite3VdbeRealValue(pIn1); rB = sqlite3VdbeRealValue(pIn2); From e24a6f58ae24670446f386578e63962633e8d4a6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 4 Aug 2022 14:02:35 +0000 Subject: [PATCH 32/42] Fix a typo on a comment used to generate bytecode documentation. FossilOrigin-Name: 64348d0b665f61c3a89f51341f23ca87f939dd9e306dc58c2004e46ab04e696e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 75438ca23f..3e7707eefe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sto\sthe\smath\sopcodes\sof\sthe\sbytecode\sengine. -D 2022-08-03T19:53:54.082 +C Fix\sa\stypo\son\sa\scomment\sused\sto\sgenerate\sbytecode\sdocumentation. +D 2022-08-04T14:02:35.852 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c 34f76cbbd886d90413b4503e6d46d7425152b88219bdd4e6bcaf81da75640d3e +F src/vdbe.c 796fbae3e989744ea3761c5ab8a23bec1764ff889d267d71666fcaa4aeb75a81 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 4181dffeef6ee181275cfecf27ad8577024c17ee9639531decdf4162b8c0326b @@ -1981,8 +1981,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 aab24c37fb444804fb91177b4b522909ef1bb85383444d97d82a758f919047d2 -R e2ed79990c9f576213c6203a5349f2b7 +P 597347d9c39f6ed068ac942a8c9853b1b745fce1eb5e9dd30f6c1cb312b36f53 +R ce5a27ffc72e7ec12d095a7689107487 U drh -Z ef554432af87d216083ec59e16ec0e61 +Z 549658791a10dec284226014b5aa7e75 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a35147d8e3..f4402b8b33 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -597347d9c39f6ed068ac942a8c9853b1b745fce1eb5e9dd30f6c1cb312b36f53 \ No newline at end of file +64348d0b665f61c3a89f51341f23ca87f939dd9e306dc58c2004e46ab04e696e \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 0b6fee3521..72dae08810 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7216,7 +7216,7 @@ case OP_IfPos: { /* jump, in1 */ ** Synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) ** ** This opcode performs a commonly used computation associated with -** LIMIT and OFFSET process. r[P1] holds the limit counter. r[P3] +** LIMIT and OFFSET processing. r[P1] holds the limit counter. r[P3] ** holds the offset counter. The opcode computes the combined value ** of the LIMIT and OFFSET and stores that value in r[P2]. The r[P2] ** value computed is the total number of rows that will need to be From bffd5c1ece80bcf04512b2965d06bc89aaab7ba8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 4 Aug 2022 17:15:00 +0000 Subject: [PATCH 33/42] Fix a problem with the query optimizer for LIMIT/OFFSET queries when underlying query is a UNION ALL and both arms of the UNION ALL are subqueries with an ORDER BY clause. This bug was reported at [forum:/forumpost/6b5e9188f0657616|forum post 6b5e9188f0657616]. The problem was introduced in 2015 (SQLite version 3.9.0) by check-in [4b631364354068af]. See also ticket [b65cb2c8d91f6685]. FossilOrigin-Name: 6c806f64bbc9e98891bad0868575ee2ec5d0951ceb0c71d3ed417b45d5f27561 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 5 ++++- test/offset1.test | 43 ++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 3e7707eefe..86bc727217 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\son\sa\scomment\sused\sto\sgenerate\sbytecode\sdocumentation. -D 2022-08-04T14:02:35.852 +C Fix\sa\sproblem\swith\sthe\squery\soptimizer\sfor\sLIMIT/OFFSET\squeries\swhen\nunderlying\squery\sis\sa\sUNION\sALL\sand\sboth\sarms\sof\sthe\sUNION\sALL\sare\nsubqueries\swith\san\sORDER\sBY\sclause.\s\sThis\sbug\swas\sreported\sat\n[forum:/forumpost/6b5e9188f0657616|forum\spost\s6b5e9188f0657616].\s\sThe\nproblem\swas\sintroduced\sin\s2015\s(SQLite\sversion\s3.9.0)\sby\scheck-in\n[4b631364354068af].\s\sSee\salso\sticket\s[b65cb2c8d91f6685]. +D 2022-08-04T17:15:00.492 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -570,7 +570,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 76708e3a8cb80f011f31f1eb6fa5f433aef8f47c85c0a2709148d673a719a846 +F src/select.c 4750fbe9d8ecb7236baf7a9bea4299bb87126e08c209645666a0ae8f0efbe0fc F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d37 F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1286,7 +1286,7 @@ F test/null.test b7ff206a1c60fe01aa2abd33ef9ea83c93727d993ca8a613de86e925c9f2bc6 F test/nulls1.test 7a5e4346ee4285034100b4cd20e6784f16a9d6c927e44ecdf10034086bbee9c9 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 -F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 +F test/offset1.test 72cca52482cbd5bc687cfa67aa2566c859081b5a353fd2f9da9bbd3914dea1ef F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 F test/optfuzz-db01.c 9f2fa80b8f84ebbf1f2e8b13421a4e0477fe300f6686fbd76cac1d2db66e0fdc F test/optfuzz-db01.txt 21f6bdeadc701cf11528276e2a55c70bfcb846ba42df327f979bd9e7b6ce7041 @@ -1981,8 +1981,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 597347d9c39f6ed068ac942a8c9853b1b745fce1eb5e9dd30f6c1cb312b36f53 -R ce5a27ffc72e7ec12d095a7689107487 +P 64348d0b665f61c3a89f51341f23ca87f939dd9e306dc58c2004e46ab04e696e +R ee3ba899316d027809db4ccd10585a40 U drh -Z 549658791a10dec284226014b5aa7e75 +Z 55de9d5c0f343647378b885b0fe37df5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f4402b8b33..70b6140f8b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -64348d0b665f61c3a89f51341f23ca87f939dd9e306dc58c2004e46ab04e696e \ No newline at end of file +6c806f64bbc9e98891bad0868575ee2ec5d0951ceb0c71d3ed417b45d5f27561 \ No newline at end of file diff --git a/src/select.c b/src/select.c index d5c65bfb28..3f80e44ce2 100644 --- a/src/select.c +++ b/src/select.c @@ -1688,7 +1688,7 @@ static void generateSortTail( if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); VdbeCoverage(v); - codeOffset(v, p->iOffset, addrContinue); + assert( p->iLimit==0 && p->iOffset==0 ); sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); bSeq = 0; }else{ @@ -1696,6 +1696,9 @@ static void generateSortTail( codeOffset(v, p->iOffset, addrContinue); iSortTab = iTab; bSeq = 1; + if( p->iOffset>0 ){ + sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1); + } } for(i=0, iCol=nKey+bSeq-1; i= 100 + ORDER BY salary asc); +} {} +do_execsql_test offset1-2.1 { + SELECT * FROM v LIMIT 5 OFFSET 2; +} { + 22 Grace Berlin it 90 + 21 Emma London it 84 + 12 Bob London hr 78 + 11 Diane London hr 70 + 33 Alice Berlin sales 100 +} finish_test From e2848932a508e48e8ac7e98a647d63ebc34632f6 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 5 Aug 2022 05:30:07 +0000 Subject: [PATCH 34/42] Fix harmless compiler warning seen with MSVC. FossilOrigin-Name: e36217f2536d89f7a15a879fe3ead32307909c71ced42e1ae7b35f43d4744a80 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeapi.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 86bc727217..16ad722e8f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sthe\squery\soptimizer\sfor\sLIMIT/OFFSET\squeries\swhen\nunderlying\squery\sis\sa\sUNION\sALL\sand\sboth\sarms\sof\sthe\sUNION\sALL\sare\nsubqueries\swith\san\sORDER\sBY\sclause.\s\sThis\sbug\swas\sreported\sat\n[forum:/forumpost/6b5e9188f0657616|forum\spost\s6b5e9188f0657616].\s\sThe\nproblem\swas\sintroduced\sin\s2015\s(SQLite\sversion\s3.9.0)\sby\scheck-in\n[4b631364354068af].\s\sSee\salso\sticket\s[b65cb2c8d91f6685]. -D 2022-08-04T17:15:00.492 +C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC. +D 2022-08-05T05:30:07.478 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -645,7 +645,7 @@ F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 F src/vdbe.c 796fbae3e989744ea3761c5ab8a23bec1764ff889d267d71666fcaa4aeb75a81 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da -F src/vdbeapi.c 4181dffeef6ee181275cfecf27ad8577024c17ee9639531decdf4162b8c0326b +F src/vdbeapi.c 4cfbf7ec3ed60366a38655f3f10316c5a3d68f6d4d06e462f88679392611c756 F src/vdbeaux.c 8584f4a20997fd918f0d957ab4f73d7411159772297c5020c188973bdc41dbf0 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c 5ebf05c0182addedb1607ade848e1c83cef40981df94d1abfab0c59288c6064f @@ -1981,8 +1981,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 64348d0b665f61c3a89f51341f23ca87f939dd9e306dc58c2004e46ab04e696e -R ee3ba899316d027809db4ccd10585a40 -U drh -Z 55de9d5c0f343647378b885b0fe37df5 +P 6c806f64bbc9e98891bad0868575ee2ec5d0951ceb0c71d3ed417b45d5f27561 +R 93de007b6ed89be23aeb731b205e5be2 +U mistachkin +Z 19aad0410826162a6654bad862e7b83b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 70b6140f8b..846e2e7574 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6c806f64bbc9e98891bad0868575ee2ec5d0951ceb0c71d3ed417b45d5f27561 \ No newline at end of file +e36217f2536d89f7a15a879fe3ead32307909c71ced42e1ae7b35f43d4744a80 \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index c810610bef..5d3e5601e5 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1445,7 +1445,7 @@ static int vdbeUnbind(Vdbe *p, unsigned int i){ "bind on a busy prepared statement: [%s]", p->zSql); return SQLITE_MISUSE_BKPT; } - if( i>=p->nVar ){ + if( i>=(unsigned int)p->nVar ){ sqlite3Error(p->db, SQLITE_RANGE); sqlite3_mutex_leave(p->db->mutex); return SQLITE_RANGE; From 8e658f0a13da40b920241329ec87fe9c9c16b111 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 5 Aug 2022 17:16:00 +0000 Subject: [PATCH 35/42] Avoid having fts3 read uninitialized values when processing deferred tokens. FossilOrigin-Name: 98729c5fa6c4c418ca9779c35e6874c930e5cee5a90b5eb32b284a0f3762269e --- ext/fts3/fts3.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 1a1672512a..3b73fbba1d 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -4376,7 +4376,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ nDistance = iPrev - nMaxUndeferred; } - aOut = (char *)sqlite3_malloc(nPoslist+8); + aOut = (char *)sqlite3Fts3MallocZero(nPoslist+FTS3_BUFFER_PADDING); if( !aOut ){ sqlite3_free(aPoslist); return SQLITE_NOMEM; diff --git a/manifest b/manifest index 16ad722e8f..ab1066930e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC. -D 2022-08-05T05:30:07.478 +C Avoid\shaving\sfts3\sread\suninitialized\svalues\swhen\sprocessing\sdeferred\stokens. +D 2022-08-05T17:16:00.185 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -102,7 +102,7 @@ F ext/fts3/README.content b9078d0843a094d86af0d48dffbff13c906702b4c3558012e67b9c F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 8cd361bd8612de3e5ec451d33ced8575cbc5af6744e7efc05d54bde4d2df3cd0 +F ext/fts3/fts3.c b20bd583991e740c1e14371896f3ab61d7b6c033740646366bbf6667191bc4e2 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h dafdc371f9fbab175744b06cfe019d5f040cdfdbd11fea752f5dc28d45b04c05 F ext/fts3/fts3_aux.c f0dc9bd98582615b7750218899bd0c729879b6bbf94d1be57ca1833ff49afc6f @@ -1981,8 +1981,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 6c806f64bbc9e98891bad0868575ee2ec5d0951ceb0c71d3ed417b45d5f27561 -R 93de007b6ed89be23aeb731b205e5be2 -U mistachkin -Z 19aad0410826162a6654bad862e7b83b +P e36217f2536d89f7a15a879fe3ead32307909c71ced42e1ae7b35f43d4744a80 +R 9810d4cb92a49345fdc5e6b1d4c32ce1 +U dan +Z 17935eeb35e00b5bc2c7ef71b0671232 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 846e2e7574..92d41db7f5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e36217f2536d89f7a15a879fe3ead32307909c71ced42e1ae7b35f43d4744a80 \ No newline at end of file +98729c5fa6c4c418ca9779c35e6874c930e5cee5a90b5eb32b284a0f3762269e \ No newline at end of file From 8c3cc71a5ad77541951ec17d88451b227932253c Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 6 Aug 2022 15:28:37 +0000 Subject: [PATCH 36/42] Fix a rounding error caused by scalar->logarithm->scalar conversion when using stat4 data to estimate some range scans. FossilOrigin-Name: 86e30d7c4bb1cebe25b66686d6d1ee170c1a88e5a6c1bed6652ebbb024d62062 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ab1066930e..5cc169bbdb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\shaving\sfts3\sread\suninitialized\svalues\swhen\sprocessing\sdeferred\stokens. -D 2022-08-05T17:16:00.185 +C Fix\sa\srounding\serror\scaused\sby\sscalar->logarithm->scalar\sconversion\swhen\susing\sstat4\sdata\sto\sestimate\ssome\srange\sscans. +D 2022-08-06T15:28:37.948 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -657,7 +657,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 1049685e84bd74692ad76984a3411a21c5a1e6ddd08c981ec94d2f11f769e07f +F src/where.c 8bfe41220558a03be393d064ef3d942cd1ceaf57cd88a85b6cb59b7dda555202 F src/whereInt.h b48ca529ffe293c18cbfa8326af18a09e39910de66fb3e96ef788c7cbf8ef3a7 F src/wherecode.c 719a5bb0102711a6ebed8d4385b831a27ce679172f3ae8e9aaec0dc1e415a95a F src/whereexpr.c 55a39f42aaf982574fbf52906371a84cceed98a994422198dfd03db4fce4cc46 @@ -1981,8 +1981,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 e36217f2536d89f7a15a879fe3ead32307909c71ced42e1ae7b35f43d4744a80 -R 9810d4cb92a49345fdc5e6b1d4c32ce1 +P 98729c5fa6c4c418ca9779c35e6874c930e5cee5a90b5eb32b284a0f3762269e +R 33e8f2d20ee794e5cf556ebabd2d9ca9 U dan -Z 17935eeb35e00b5bc2c7ef71b0671232 +Z b5ab7076fb09a8652a3894b7ab774d07 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 92d41db7f5..35773030c3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98729c5fa6c4c418ca9779c35e6874c930e5cee5a90b5eb32b284a0f3762269e \ No newline at end of file +86e30d7c4bb1cebe25b66686d6d1ee170c1a88e5a6c1bed6652ebbb024d62062 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 6f3402a6e4..9c4678345e 100644 --- a/src/where.c +++ b/src/where.c @@ -1567,7 +1567,7 @@ static int whereKeyStats( ** is larger than all samples in the array. */ tRowcnt iUpper, iGap; if( i>=pIdx->nSample ){ - iUpper = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]); + iUpper = pIdx->nRowEst0; }else{ iUpper = aSample[i].anLt[iCol]; } From a3a4da09226982a646982f2bc2188ab3c071af25 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 8 Aug 2022 12:19:13 +0000 Subject: [PATCH 37/42] Do not attempt to convert an oversized floating point value into an integer. FossilOrigin-Name: 6c4fc8385ee22516e0b87fb647327ee7d1a564040ebe2a4d66fc999ef2908df2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5cc169bbdb..f5ed72888c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\srounding\serror\scaused\sby\sscalar->logarithm->scalar\sconversion\swhen\susing\sstat4\sdata\sto\sestimate\ssome\srange\sscans. -D 2022-08-06T15:28:37.948 +C Do\snot\sattempt\sto\sconvert\san\soversized\sfloating\spoint\svalue\sinto\san\sinteger. +D 2022-08-08T12:19:13.235 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c 796fbae3e989744ea3761c5ab8a23bec1764ff889d267d71666fcaa4aeb75a81 +F src/vdbe.c e0517ef4a599aa71dcc3875c558f0369790b7e048df8ed7b9993d24818a26ea3 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 4cfbf7ec3ed60366a38655f3f10316c5a3d68f6d4d06e462f88679392611c756 @@ -1981,8 +1981,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 98729c5fa6c4c418ca9779c35e6874c930e5cee5a90b5eb32b284a0f3762269e -R 33e8f2d20ee794e5cf556ebabd2d9ca9 -U dan -Z b5ab7076fb09a8652a3894b7ab774d07 +P 86e30d7c4bb1cebe25b66686d6d1ee170c1a88e5a6c1bed6652ebbb024d62062 +R cc38bc596bc6cfb7cf263b784bfa32d2 +U drh +Z 1b3d5f93d9de8e10c30a689056160d79 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 35773030c3..30ca22856c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86e30d7c4bb1cebe25b66686d6d1ee170c1a88e5a6c1bed6652ebbb024d62062 \ No newline at end of file +6c4fc8385ee22516e0b87fb647327ee7d1a564040ebe2a4d66fc999ef2908df2 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 72dae08810..346d005fad 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -314,7 +314,9 @@ static VdbeCursor *allocateCursor( ** return false. */ static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ - i64 iValue = (double)rValue; + i64 iValue; + if( rValue>(double)LARGEST_INT64 || rValue<(double)SMALLEST_INT64 ) return 0; + iValue = (double)rValue; if( sqlite3RealSameAsInt(rValue,iValue) ){ *piValue = iValue; return 1; From 5e10d892d699ea0dc48c4fc15d996c9b7629a989 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 8 Aug 2022 13:04:08 +0000 Subject: [PATCH 38/42] Remove an unreachable branch in the numericType() helper routine. FossilOrigin-Name: a99cc008e46ab1a4fdbe2fa87202d026a10c57be55e3e9fedd935795ed6dc694 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 15 ++++++++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index f5ed72888c..6c2fbdb446 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sattempt\sto\sconvert\san\soversized\sfloating\spoint\svalue\sinto\san\sinteger. -D 2022-08-08T12:19:13.235 +C Remove\san\sunreachable\sbranch\sin\sthe\snumericType()\shelper\sroutine. +D 2022-08-08T13:04:08.230 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c e0517ef4a599aa71dcc3875c558f0369790b7e048df8ed7b9993d24818a26ea3 +F src/vdbe.c 6bca2e524d29d9f40e9842c287e60dbae5c428b6ea23f8ceb3114b78b3995d73 F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 4cfbf7ec3ed60366a38655f3f10316c5a3d68f6d4d06e462f88679392611c756 @@ -1981,8 +1981,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 86e30d7c4bb1cebe25b66686d6d1ee170c1a88e5a6c1bed6652ebbb024d62062 -R cc38bc596bc6cfb7cf263b784bfa32d2 +P 6c4fc8385ee22516e0b87fb647327ee7d1a564040ebe2a4d66fc999ef2908df2 +R e4cfac9ab2cb69853bf392410d0d10ea U drh -Z 1b3d5f93d9de8e10c30a689056160d79 +Z 0989c0895e99c37065974c0506edc50e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 30ca22856c..cbd770bafc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6c4fc8385ee22516e0b87fb647327ee7d1a564040ebe2a4d66fc999ef2908df2 \ No newline at end of file +a99cc008e46ab1a4fdbe2fa87202d026a10c57be55e3e9fedd935795ed6dc694 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 346d005fad..dcfab51ace 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -478,17 +478,18 @@ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ ** But it does set pMem->u.r and pMem->u.i appropriately. */ static u16 numericType(Mem *pMem){ - if( pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal) ){ + assert( (pMem->flags & MEM_Null)==0 + || pMem->db==0 || pMem->db->mallocFailed ); + if( pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null) ){ testcase( pMem->flags & MEM_Int ); testcase( pMem->flags & MEM_Real ); testcase( pMem->flags & MEM_IntReal ); - return pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal); - } - if( pMem->flags & (MEM_Str|MEM_Blob) ){ - testcase( pMem->flags & MEM_Str ); - testcase( pMem->flags & MEM_Blob ); - return computeNumericType(pMem); + return pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null); } + assert( pMem->flags & (MEM_Str|MEM_Blob) ); + testcase( pMem->flags & MEM_Str ); + testcase( pMem->flags & MEM_Blob ); + return computeNumericType(pMem); return 0; } From 26e817f69b4a153ca39ecb2c50fd99fd5287cf0a Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 8 Aug 2022 16:25:13 +0000 Subject: [PATCH 39/42] Avoid trying to cast an over-sized floating point value into an integer. FossilOrigin-Name: 3518cd7cb1feeefc3963da72c2d258d81d8914f1e1f427da28a00b6228cf126c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/date.c | 2 +- src/sqliteInt.h | 1 + src/vdbe.c | 3 +-- src/vdbemem.c | 12 +++++++++++- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 6c2fbdb446..88135850f0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sbranch\sin\sthe\snumericType()\shelper\sroutine. -D 2022-08-08T13:04:08.230 +C Avoid\strying\sto\scast\san\sover-sized\sfloating\spoint\svalue\sinto\san\sinteger. +D 2022-08-08T16:25:13.721 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ F src/build.c 33aec2b34dbc53c3da2ea8434fccbf3c17c35ba647c3193df598cce0e861355c F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad -F src/date.c 272162554168e7af4976213850e1c4c5f33b964d299ceb0983f3d5cceba01d05 +F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 13eca2beee5b758ed033a11230971310cc4a58fcd8f6bc33cad4f677c985e96c @@ -575,7 +575,7 @@ F src/shell.c.in 29749b34bbd19d0004fdb6f61f62659096e1c0b4dfb1ad2314e7fafbe9dd8d3 F src/sqlite.h.in be265991edca9aea69986758b58ba81cbf5ae403fe0c4ea1d0c9df0cdc8f25ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a988810c9b21c0dc36dc7a62735012339dc76fc7ab448fb0792721d30eacb69d -F src/sqliteInt.h c97b6351dba36b7bacd231610cd7173e7a7ef8469c2d9b849037415e0b1d8c79 +F src/sqliteInt.h 3ae1d20f579149c18ddd995bbeffabf036cad9f4359dc2f27dc1b778d108ff35 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -642,13 +642,13 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c bb346170b0b54c6683bba4a5983aea40485597fdf605c87ec8bc2e199fe88cd8 -F src/vdbe.c 6bca2e524d29d9f40e9842c287e60dbae5c428b6ea23f8ceb3114b78b3995d73 +F src/vdbe.c 81e2febe73f3db6d1ce5be29d30c4667d5fab9f6eae892ad7c80808f1af0c2bb F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 F src/vdbeInt.h 2cad0aeeb106371ed0e0946bab89f60627087068847afc2451c05056961c18da F src/vdbeapi.c 4cfbf7ec3ed60366a38655f3f10316c5a3d68f6d4d06e462f88679392611c756 F src/vdbeaux.c 8584f4a20997fd918f0d957ab4f73d7411159772297c5020c188973bdc41dbf0 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd -F src/vdbemem.c 5ebf05c0182addedb1607ade848e1c83cef40981df94d1abfab0c59288c6064f +F src/vdbemem.c c3ce80af15e2ff5c2824a8db881681cbf511376f13613da020bac6d320c535b1 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -1981,8 +1981,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 6c4fc8385ee22516e0b87fb647327ee7d1a564040ebe2a4d66fc999ef2908df2 -R e4cfac9ab2cb69853bf392410d0d10ea +P a99cc008e46ab1a4fdbe2fa87202d026a10c57be55e3e9fedd935795ed6dc694 +R bb31f7c383d6661944df8ccb04f02a45 U drh -Z 0989c0895e99c37065974c0506edc50e +Z debe4f549c31b424da3a7da3757ec640 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cbd770bafc..77c8bd5d50 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a99cc008e46ab1a4fdbe2fa87202d026a10c57be55e3e9fedd935795ed6dc694 \ No newline at end of file +3518cd7cb1feeefc3963da72c2d258d81d8914f1e1f427da28a00b6228cf126c \ No newline at end of file diff --git a/src/date.c b/src/date.c index 68d3e994f7..a3e58bc4e3 100644 --- a/src/date.c +++ b/src/date.c @@ -785,7 +785,7 @@ static int parseModifier( */ if( sqlite3_strnicmp(z, "weekday ", 8)==0 && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)>0 - && (n=(int)r)==r && n>=0 && r<7 ){ + && r>=0.0 && r<7.0 && (n=(int)r)==r ){ sqlite3_int64 Z; computeYMD_HMS(p); p->validTZ = 0; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c6bdd3dd35..32e0e78e83 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4888,6 +4888,7 @@ int sqlite3FixSelect(DbFixer*, Select*); int sqlite3FixExpr(DbFixer*, Expr*); int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); int sqlite3RealSameAsInt(double,sqlite3_int64); +i64 sqlite3RealToI64(double); void sqlite3Int64ToText(i64,char*); int sqlite3AtoF(const char *z, double*, int, u8); int sqlite3GetInt32(const char *, int*); diff --git a/src/vdbe.c b/src/vdbe.c index dcfab51ace..131a52f14d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -315,8 +315,7 @@ static VdbeCursor *allocateCursor( */ static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ i64 iValue; - if( rValue>(double)LARGEST_INT64 || rValue<(double)SMALLEST_INT64 ) return 0; - iValue = (double)rValue; + iValue = sqlite3RealToI64(rValue); if( sqlite3RealSameAsInt(rValue,iValue) ){ *piValue = iValue; return 1; diff --git a/src/vdbemem.c b/src/vdbemem.c index fd4ab0ccc6..c6c938cb5c 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -749,6 +749,16 @@ int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ && i >= -2251799813685248LL && i < 2251799813685248LL); } +/* Convert a floating point value to its closest integer. Do so in +** a way that avoids 'outside the range of representable values' warnings +** from UBSAN. +*/ +i64 sqlite3RealToI64(double r){ + if( r<=(double)SMALLEST_INT64 ) return SMALLEST_INT64; + if( r>=(double)LARGEST_INT64) return LARGEST_INT64; + return (i64)r; +} + /* ** Convert pMem so that it has type MEM_Real or MEM_Int. ** Invalidate any prior representations. @@ -770,7 +780,7 @@ int sqlite3VdbeMemNumerify(Mem *pMem){ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1) - || sqlite3RealSameAsInt(pMem->u.r, (ix = (i64)pMem->u.r)) + || sqlite3RealSameAsInt(pMem->u.r, (ix = sqlite3RealToI64(pMem->u.r))) ){ pMem->u.i = ix; MemSetTypeFlag(pMem, MEM_Int); From 6aafd74853f7f0bf27ccbce92a69c490ddfb81d1 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Aug 2022 19:29:53 +0000 Subject: [PATCH 40/42] Avoid some cases of signed integer overflow in fts5 by casting to unsigned values. FossilOrigin-Name: 46a78c8c0ed518c4521e6e0bdebeb065bab07076abc444775002e7f4361d2242 --- ext/fts5/fts5Int.h | 2 +- ext/fts5/fts5_index.c | 22 +++++++------ ext/fts5/test/fts5ubsan.test | 60 ++++++++++++++++++++++++++++++++++++ manifest | 17 +++++----- manifest.uuid | 2 +- 5 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 ext/fts5/test/fts5ubsan.test diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 754f28c67f..e7e7043c60 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -286,7 +286,7 @@ void sqlite3Fts5BufferAppendPrintf(int *, Fts5Buffer*, char *zFmt, ...); char *sqlite3Fts5Mprintf(int *pRc, const char *zFmt, ...); #define fts5BufferZero(x) sqlite3Fts5BufferZero(x) -#define fts5BufferAppendVarint(a,b,c) sqlite3Fts5BufferAppendVarint(a,b,c) +#define fts5BufferAppendVarint(a,b,c) sqlite3Fts5BufferAppendVarint(a,b,(i64)c) #define fts5BufferFree(a) sqlite3Fts5BufferFree(a) #define fts5BufferAppendBlob(a,b,c,d) sqlite3Fts5BufferAppendBlob(a,b,c,d) #define fts5BufferSet(a,b,c,d) sqlite3Fts5BufferSet(a,b,c,d) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index d2ec9ad5a9..8a29304922 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4087,7 +4087,9 @@ static void fts5WriteAppendRowid( fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid); }else{ assert_nc( p->rc || iRowid>pWriter->iPrevRowid ); - fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid); + fts5BufferAppendVarint(&p->rc, &pPage->buf, + (u64)iRowid - (u64)pWriter->iPrevRowid + ); } pWriter->iPrevRowid = iRowid; pWriter->bFirstRowidInDoclist = 0; @@ -4851,7 +4853,7 @@ int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge){ static void fts5AppendRowid( Fts5Index *p, - i64 iDelta, + u64 iDelta, Fts5Iter *pUnused, Fts5Buffer *pBuf ){ @@ -4861,7 +4863,7 @@ static void fts5AppendRowid( static void fts5AppendPoslist( Fts5Index *p, - i64 iDelta, + u64 iDelta, Fts5Iter *pMulti, Fts5Buffer *pBuf ){ @@ -4936,10 +4938,10 @@ static void fts5MergeAppendDocid( } #endif -#define fts5MergeAppendDocid(pBuf, iLastRowid, iRowid) { \ - assert( (pBuf)->n!=0 || (iLastRowid)==0 ); \ - fts5BufferSafeAppendVarint((pBuf), (iRowid) - (iLastRowid)); \ - (iLastRowid) = (iRowid); \ +#define fts5MergeAppendDocid(pBuf, iLastRowid, iRowid) { \ + assert( (pBuf)->n!=0 || (iLastRowid)==0 ); \ + fts5BufferSafeAppendVarint((pBuf), (u64)(iRowid) - (u64)(iLastRowid)); \ + (iLastRowid) = (iRowid); \ } /* @@ -5210,7 +5212,7 @@ static void fts5SetupPrefixIter( int nMerge = 1; void (*xMerge)(Fts5Index*, Fts5Buffer*, int, Fts5Buffer*); - void (*xAppend)(Fts5Index*, i64, Fts5Iter*, Fts5Buffer*); + void (*xAppend)(Fts5Index*, u64, Fts5Iter*, Fts5Buffer*); if( p->pConfig->eDetail==FTS5_DETAIL_NONE ){ xMerge = fts5MergeRowidLists; xAppend = fts5AppendRowid; @@ -5249,7 +5251,7 @@ static void fts5SetupPrefixIter( Fts5SegIter *pSeg = &p1->aSeg[ p1->aFirst[1].iFirst ]; p1->xSetOutputs(p1, pSeg); if( p1->base.nData ){ - xAppend(p, p1->base.iRowid-iLastRowid, p1, &doclist); + xAppend(p, (u64)p1->base.iRowid-(u64)iLastRowid, p1, &doclist); iLastRowid = p1->base.iRowid; } } @@ -5297,7 +5299,7 @@ static void fts5SetupPrefixIter( iLastRowid = 0; } - xAppend(p, p1->base.iRowid-iLastRowid, p1, &doclist); + xAppend(p, (u64)p1->base.iRowid-(u64)iLastRowid, p1, &doclist); iLastRowid = p1->base.iRowid; } diff --git a/ext/fts5/test/fts5ubsan.test b/ext/fts5/test/fts5ubsan.test new file mode 100644 index 0000000000..2dc0aa7bd4 --- /dev/null +++ b/ext/fts5/test/fts5ubsan.test @@ -0,0 +1,60 @@ +# 2022 August 9 +# +# 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 test is focused on edge cases that cause ubsan errors. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5ubsan + +# If SQLITE_ENABLE_FTS5 is defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE x1 USING fts5(x); +} + +set BIG 9000000000000000000 +set SMALL -9000000000000000000 + +do_execsql_test 1.1 { + BEGIN; + INSERT INTO x1 (rowid, x) VALUES($BIG, 'aaa aba acc'); + INSERT INTO x1 (rowid, x) VALUES($SMALL, 'aaa abc acb'); + COMMIT; +} + +do_execsql_test 1.2 { + SELECT rowid, x FROM x1('ab*'); +} [list $SMALL {aaa abc acb} $BIG {aaa aba acc}] + +do_execsql_test 1.3 { + SELECT rowid, x FROM x1('ac*'); +} [list $SMALL {aaa abc acb} $BIG {aaa aba acc}] + +reset_db +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE x1 USING fts5(x); +} + +do_execsql_test 2.1 { + INSERT INTO x1 (rowid, x) VALUES($BIG, 'aaa aba acc'); + INSERT INTO x1 (rowid, x) VALUES($SMALL, 'aaa abc acb'); +} + +do_execsql_test 2.2 { + INSERT INTO x1 (x1) VALUES('optimize'); +} + +finish_test diff --git a/manifest b/manifest index 88135850f0..f387e1e26d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\strying\sto\scast\san\sover-sized\sfloating\spoint\svalue\sinto\san\sinteger. -D 2022-08-08T16:25:13.721 +C Avoid\ssome\scases\sof\ssigned\sinteger\soverflow\sin\sfts5\sby\scasting\sto\sunsigned\svalues. +D 2022-08-08T19:29:53.445 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -130,13 +130,13 @@ F ext/fts3/unicode/mkunicode.tcl d5aebf022fa4577ee8cdf27468f0d847879993959101f6d F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a -F ext/fts5/fts5Int.h 36fd4a05e6e6307e3bac359a589d5f090b903afe0e7ae15db84f0ff90c79676a +F ext/fts5/fts5Int.h c0d46e399e345e35985b72a1c1af025973bfaa5b1e3563b0ce3bb0ce144a7ca3 F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b729225eeaf6a5 F ext/fts5/fts5_config.c 501e7d3566bc92766b0e11c0109a7c5a6146bc41144195459af5422f6c2078aa F ext/fts5/fts5_expr.c 40174a64829d30cc86e8266306ad24980f6911edd5ca0b8c1ce7821ea1341b88 F ext/fts5/fts5_hash.c d4fb70940359f2120ccd1de7ffe64cc3efe65de9e8995b822cd536ff64c96982 -F ext/fts5/fts5_index.c 3e47d9c56e4e9a6dee78bc32e006d6a28a3b5ec9ff84f3b8c381c78323201720 +F ext/fts5/fts5_index.c 4b1ac44c665667be970df780bd8e734748047bd30a971d0bb7e884af8ac6e62c F ext/fts5/fts5_main.c 6078ae86d3b813753a4f1201054550aff21a3f660e97b30f200d2b1472874151 F ext/fts5/fts5_storage.c 76c6085239eb44424004c022e9da17a5ecd5aaec859fba90ad47d3b08f4c8082 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -239,6 +239,7 @@ F ext/fts5/test/fts5tok1.test 1f7817499f5971450d8c4a652114b3d833393c8134e32422d0 F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43 F ext/fts5/test/fts5trigram.test 5b4feb53a4d5aca70c841f6919c8719b5a9c805474727dda99285fccdd2e9cce +F ext/fts5/test/fts5ubsan.test 783d5a8d13ebfa169e634940228db54540780e3ba7a87ad1e4510e61440bf64b F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d05926482cc0bccac9ad602 F ext/fts5/test/fts5unicode.test 17056f4efe6b0a5d4f41fdf7a7dc9af2873004562eaa899d40633b93dc95f5a9 F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e242c9383b95d314e3e @@ -1981,8 +1982,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 a99cc008e46ab1a4fdbe2fa87202d026a10c57be55e3e9fedd935795ed6dc694 -R bb31f7c383d6661944df8ccb04f02a45 -U drh -Z debe4f549c31b424da3a7da3757ec640 +P 3518cd7cb1feeefc3963da72c2d258d81d8914f1e1f427da28a00b6228cf126c +R ee3441acc635032c89c4a495f8aff56d +U dan +Z 869f3966f913fbed35d61b23d360896d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 77c8bd5d50..a6b2cec1a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3518cd7cb1feeefc3963da72c2d258d81d8914f1e1f427da28a00b6228cf126c \ No newline at end of file +46a78c8c0ed518c4521e6e0bdebeb065bab07076abc444775002e7f4361d2242 \ No newline at end of file From c8e9f6818b0d1420eb6989dfd3c69192f67e1aee Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 9 Aug 2022 14:28:54 +0000 Subject: [PATCH 41/42] Omit the (undocumented) SQLITE_PCACHE_SEPARATE_HEADER compile-time option. FossilOrigin-Name: 60947da687d525e72e62bcddcdf4c5c819818855074cc318c9ee656e83897aef --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/ctime.c | 3 --- src/pcache1.c | 44 ++++++++++++++++---------------------------- tool/mkctimec.tcl | 1 - 5 files changed, 26 insertions(+), 42 deletions(-) diff --git a/manifest b/manifest index f387e1e26d..2b5d0ebe87 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\ssome\scases\sof\ssigned\sinteger\soverflow\sin\sfts5\sby\scasting\sto\sunsigned\svalues. -D 2022-08-08T19:29:53.445 +C Omit\sthe\s(undocumented)\sSQLITE_PCACHE_SEPARATE_HEADER\scompile-time\soption. +D 2022-08-09T14:28:54.231 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482 F src/build.c 33aec2b34dbc53c3da2ea8434fccbf3c17c35ba647c3193df598cce0e861355c F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad +F src/ctime.c 93e4b5f4faf6d3f688988a116773259a4fbfb4ddac0e9bf9d0ae0429390c2543 F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5 F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d @@ -563,7 +563,7 @@ F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3 F src/parse.y 8e67d820030d2655b9942ffe61c1e7e6b96cea2f2f72183533299393907d0564 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 +F src/pcache1.c 0b4245cd4964e635f2630908c2533cd8e9da7af3ca592e23ae8730aa25ae5eb9 F src/pragma.c 6637d624c37a8909d3edfa9d7cf694d79b49d2a0827d8c52ef15dceb641783fa F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c c62820c15dcb63013519c8e41d9f928d7478672cc902cfd0581c733c271dbf45 @@ -1909,7 +1909,7 @@ F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8 F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x -F tool/mkctimec.tcl ac96a74f5e6d9dac672d5229f79c583d3357a50e7d098e473e6b2ce2f8ae1704 x +F tool/mkctimec.tcl 8f472681f6041cf0ec26a1799feda39e55370614a6090d66fa5044f9f52d22c6 x F tool/mkkeywordhash.c 35bfc41adacc4aa6ef6fca7fd0c63e0ec0534b78daf4d0cfdebe398216bbffc3 F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef @@ -1982,8 +1982,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 3518cd7cb1feeefc3963da72c2d258d81d8914f1e1f427da28a00b6228cf126c -R ee3441acc635032c89c4a495f8aff56d -U dan -Z 869f3966f913fbed35d61b23d360896d +P 46a78c8c0ed518c4521e6e0bdebeb065bab07076abc444775002e7f4361d2242 +R d8bef198132a525587d2454d35cbc1ca +U drh +Z a9046e25d51003cb689d3e1458ccf6d6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a6b2cec1a7..116c7715b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46a78c8c0ed518c4521e6e0bdebeb065bab07076abc444775002e7f4361d2242 \ No newline at end of file +60947da687d525e72e62bcddcdf4c5c819818855074cc318c9ee656e83897aef \ No newline at end of file diff --git a/src/ctime.c b/src/ctime.c index a9391213d7..7eb43f20a7 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -683,9 +683,6 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_OMIT_XFER_OPT "OMIT_XFER_OPT", #endif -#ifdef SQLITE_PCACHE_SEPARATE_HEADER - "PCACHE_SEPARATE_HEADER", -#endif #ifdef SQLITE_PERFORMANCE_TRACE "PERFORMANCE_TRACE", #endif diff --git a/src/pcache1.c b/src/pcache1.c index a93b146894..4f84a20b50 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -39,12 +39,13 @@ ** size can vary according to architecture, compile-time options, and ** SQLite library version number. ** -** If SQLITE_PCACHE_SEPARATE_HEADER is defined, then the extension is obtained -** using a separate memory allocation from the database page content. This -** seeks to overcome the "clownshoe" problem (also called "internal -** fragmentation" in academic literature) of allocating a few bytes more -** than a power of two with the memory allocator rounding up to the next -** power of two, and leaving the rounded-up space unused. +** Historical note: It used to be that if the SQLITE_PCACHE_SEPARATE_HEADER +** was defined, then the page content would be held in a separate memory +** allocation from the PgHdr1. This was intended to avoid clownshoe memory +** allocations. However, the btree layer needs a small (16-byte) overrun +** area after the page content buffer. The header serves as that overrun +** area. Therefore SQLITE_PCACHE_SEPARATE_HEADER was discontinued to avoid +** any possibility of a memory error. ** ** This module tracks pointers to PgHdr1 objects. Only pcache.c communicates ** with this module. Information is passed back and forth as PgHdr1 pointers. @@ -89,11 +90,16 @@ typedef struct PGroup PGroup; /* ** Each cache entry is represented by an instance of the following -** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of -** PgHdr1.pCache->szPage bytes is allocated directly before this structure -** in memory. +** structure. A buffer of PgHdr1.pCache->szPage bytes is allocated +** directly before this structure and is used to cache the page content. ** -** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** When reading a corrupt database file, it is possible that SQLite might +** read a few bytes (no more than 16 bytes) past the end of the page buffer. +** It will only read past the end of the page buffer, never write. This +** object is positioned immediately after the page buffer to serve as an +** overrun area, so that overreads are harmless. +** +** Variables isBulkLocal and isAnchor were once type "u8". That works, ** but causes a 2-byte gap in the structure for most architectures (since ** pointers must be either 4 or 8-byte aligned). As this structure is located ** in memory directly after the associated page data, if the database is @@ -438,25 +444,13 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ pcache1LeaveMutex(pCache->pGroup); #endif if( benignMalloc ){ sqlite3BeginBenignMalloc(); } -#ifdef SQLITE_PCACHE_SEPARATE_HEADER - pPg = pcache1Alloc(pCache->szPage); - p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); - if( !pPg || !p ){ - pcache1Free(pPg); - sqlite3_free(p); - pPg = 0; - } -#else pPg = pcache1Alloc(pCache->szAlloc); -#endif if( benignMalloc ){ sqlite3EndBenignMalloc(); } #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT pcache1EnterMutex(pCache->pGroup); #endif if( pPg==0 ) return 0; -#ifndef SQLITE_PCACHE_SEPARATE_HEADER p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; -#endif p->page.pBuf = pPg; p->page.pExtra = &p[1]; p->isBulkLocal = 0; @@ -480,9 +474,6 @@ static void pcache1FreePage(PgHdr1 *p){ pCache->pFree = p; }else{ pcache1Free(p->page.pBuf); -#ifdef SQLITE_PCACHE_SEPARATE_HEADER - sqlite3_free(p); -#endif } (*pCache->pnPurgeable)--; } @@ -1246,9 +1237,6 @@ int sqlite3PcacheReleaseMemory(int nReq){ && p->isAnchor==0 ){ nFree += pcache1MemSize(p->page.pBuf); -#ifdef SQLITE_PCACHE_SEPARATE_HEADER - nFree += sqlite3MemSize(p); -#endif assert( PAGE_IS_UNPINNED(p) ); pcache1PinPage(p); pcache1RemoveFromHash(p, 1); diff --git a/tool/mkctimec.tcl b/tool/mkctimec.tcl index bc723f4561..1120bc1316 100755 --- a/tool/mkctimec.tcl +++ b/tool/mkctimec.tcl @@ -254,7 +254,6 @@ set boolean_defnil_options { SQLITE_OMIT_WAL SQLITE_OMIT_WSD SQLITE_OMIT_XFER_OPT - SQLITE_PCACHE_SEPARATE_HEADER SQLITE_PERFORMANCE_TRACE SQLITE_PREFER_PROXY_LOCKING SQLITE_PROXY_DEBUG From 626bcc88dd530ce4657b5cec9c1cf6b0c56a8915 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 9 Aug 2022 16:13:21 +0000 Subject: [PATCH 42/42] Allow the name of an index to collide with a table in a different schema. FossilOrigin-Name: f963c2523872b59b8a7a14971f703f2eb0d021501b288597a958f6596885d0de --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2b5d0ebe87..1fec492199 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\s(undocumented)\sSQLITE_PCACHE_SEPARATE_HEADER\scompile-time\soption. -D 2022-08-09T14:28:54.231 +C Allow\sthe\sname\sof\san\sindex\sto\scollide\swith\sa\stable\sin\sa\sdifferent\sschema. +D 2022-08-09T16:13:21.868 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -514,7 +514,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 4a8d349b9ed4dc6d252c535227699d75319b633058a56432ebf43c9f56f9085e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e -F src/build.c 33aec2b34dbc53c3da2ea8434fccbf3c17c35ba647c3193df598cce0e861355c +F src/build.c 1e96f35d5912a1606c9c9463dfd8eaffc76b2bc01207ee372cb3249eef5173c4 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 93e4b5f4faf6d3f688988a116773259a4fbfb4ddac0e9bf9d0ae0429390c2543 @@ -1982,8 +1982,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 46a78c8c0ed518c4521e6e0bdebeb065bab07076abc444775002e7f4361d2242 -R d8bef198132a525587d2454d35cbc1ca +P 60947da687d525e72e62bcddcdf4c5c819818855074cc318c9ee656e83897aef +R f4e408bf2436c98ebd7456a4b6d2719e U drh -Z a9046e25d51003cb689d3e1458ccf6d6 +Z 37c870234d7cfb98492f5c9537ed0794 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 116c7715b4..6ee9ccf9af 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -60947da687d525e72e62bcddcdf4c5c819818855074cc318c9ee656e83897aef \ No newline at end of file +f963c2523872b59b8a7a14971f703f2eb0d021501b288597a958f6596885d0de \ No newline at end of file diff --git a/src/build.c b/src/build.c index db69b611fa..e3e79df05d 100644 --- a/src/build.c +++ b/src/build.c @@ -4036,7 +4036,7 @@ void sqlite3CreateIndex( } if( !IN_RENAME_OBJECT ){ if( !db->init.busy ){ - if( sqlite3FindTable(db, zName, 0)!=0 ){ + if( sqlite3FindTable(db, zName, pDb->zDbSName)!=0 ){ sqlite3ErrorMsg(pParse, "there is already a table named %s", zName); goto exit_create_index; }