From aa6fe5bf1005f27a82f23d5a21afe83da1428ff1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 4 Oct 2021 13:18:44 +0000 Subject: [PATCH 01/64] Fix harmless static analyzer warnings. FossilOrigin-Name: 6604a085964121113e7b7f57537a0ba64ba058d0eb12bf0a3aeb6d1b7a29d516 --- ext/misc/json1.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pager.c | 1 + src/select.c | 1 + 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 6fe3ab9676..5b8a0a05c5 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -759,7 +759,7 @@ static int jsonParseAddNode( const char *zContent /* Content */ ){ JsonNode *p; - if( pParse->nNode>=pParse->nAlloc ){ + if( pParse->aNode==0 || pParse->nNode>=pParse->nAlloc ){ return jsonParseAddNodeExpand(pParse, eType, n, zContent); } p = &pParse->aNode[pParse->nNode]; diff --git a/manifest b/manifest index cd1aa495ea..15a2d51bc2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\squery\splans\screated\sby\swhereShortCut()\sso\sthat\sthey\salways\scheck\ntransitive\sconstraints\sthat\sdrive\san\sindex.\s\sThe\sis\sanalogous\sto\sthe\n[f1f9b5de3c59489b]\scheck-in,\sjust\sfor\swhereShortCut()\srather\sthan\sthe\nfull\squery\splanner.\sFix\sfor\sthe\sissue\sdescribed\sby\n[forum:/forumpost/a65cacbf5e1c41ba|forum\spost\sa65cacbf5e1c41ba]. -D 2021-10-04T11:10:15.125 +C Fix\sharmless\sstatic\sanalyzer\swarnings. +D 2021-10-04T13:18:44.742 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -306,7 +306,7 @@ F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab900 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c 91a5594071143a4ab79c638fe9f059af1db09932faf2e704c3e29216a7d4f511 -F ext/misc/json1.c 96a44b84f00d35f9450abae1f0167abe60de9379b2b27ea652c6cf14450b4739 +F ext/misc/json1.c 6cfebb66a7568f8a17d67e676daba0a95efc3bc8f69c26998fc9519857bc5deb F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c 7dffa8cc89c7f2d73da4bd4ccea1bcbd2bd283e3bb4cea398df7c372a197291b @@ -536,7 +536,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c dabb867aa4fabe01d05a5fb39c4d497b2d7bff591b738ffbe7f715ee28b67cdb +F src/pager.c e20778eee03916035f5fb861bab7edb894779b1c448c3725fd4cde5f6a3edc6d F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 82bdd593c50bddcc285a173e9788a20296103217f5f5290c9122abf8af71af62 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -549,7 +549,7 @@ F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 916d18b586d8efad5a46040e48405f42e7f90fff33bca1cfab040169515ec525 +F src/select.c c4f14e9aaa2f7c821be721f79ee578a82d4efeef5797f9673feb82750582ae80 F src/shell.c.in 923671ae56ad899db71296d0ebefea9c85e7e52ef087c8a097f3f3a3a3ade98c F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P be211a9c59234ef202e772fcaae18be43c44e1e00674f137cad2d903e00bfcab -R 292b396dc8ad27f72b460cd6d9853182 +P 8b24c177061c38361588f419eda9b7943b72a0c6b2855b6f39272451b8a1b813 +R e6fd0cb863cd13024a2ff76a8115faa5 U drh -Z eff1f6baf32edbc9330b75894ca2e4ea +Z 993ff6f0e7e4efd9b421b48c58764014 diff --git a/manifest.uuid b/manifest.uuid index c4357ca791..f3d7683949 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8b24c177061c38361588f419eda9b7943b72a0c6b2855b6f39272451b8a1b813 \ No newline at end of file +6604a085964121113e7b7f57537a0ba64ba058d0eb12bf0a3aeb6d1b7a29d516 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 00ab38e512..4410907c76 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3024,6 +3024,7 @@ static int readDbPage(PgHdr *pPg){ */ static void pager_write_changecounter(PgHdr *pPg){ u32 change_counter; + if( NEVER(pPg==0) ) return; /* Increment the value just read and write it back to byte 24. */ change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1; diff --git a/src/select.c b/src/select.c index a06031e02d..226a6635d3 100644 --- a/src/select.c +++ b/src/select.c @@ -2983,6 +2983,7 @@ static int multiSelect( int nCol; /* Number of columns in result set */ assert( p->pNext==0 ); + assert( p->pEList!=0 ); nCol = p->pEList->nExpr; pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1); if( !pKeyInfo ){ From 253888c13b77fd83f03f12c401d7e728c6dcdcb3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 4 Oct 2021 13:30:22 +0000 Subject: [PATCH 02/64] The pragma_table_list virtual table should have only one "schema" column. FossilOrigin-Name: 886feffaad6baac37dfaab489c2aecc4abf51a3a5bce1e8a94be7cc1d2a3c30c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pragma.h | 2 +- tool/mkpragmatab.tcl | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 15a2d51bc2..35a4b9d9e7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\sstatic\sanalyzer\swarnings. -D 2021-10-04T13:18:44.742 +C The\spragma_table_list\svirtual\stable\sshould\shave\sonly\sone\s"schema"\scolumn. +D 2021-10-04T13:30:22.741 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -543,7 +543,7 @@ F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c -F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927 +F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c @@ -1862,7 +1862,7 @@ F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a89 F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef F tool/mkopcodeh.tcl 130b88697da6ec5b89b41844d955d08fb62c2552e889dec8c7bcecb28d8f50bd F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl 056338994c2a816076342dc1035294db3980152f514050067659af3ea4526361 +F tool/mkpragmatab.tcl de206c64b6e9ac8cd5e3cbd0ffe456f07d5710605ef8385d677e60ce3335ea12 F tool/mkshellc.tcl df5d249617f9cc94d5c48eb0401673eb3f31f383ecbc54e8a13ca3dd97e89450 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8b24c177061c38361588f419eda9b7943b72a0c6b2855b6f39272451b8a1b813 -R e6fd0cb863cd13024a2ff76a8115faa5 +P 6604a085964121113e7b7f57537a0ba64ba058d0eb12bf0a3aeb6d1b7a29d516 +R 36c0379c51eeda190fca7799dbb2bec0 U drh -Z 993ff6f0e7e4efd9b421b48c58764014 +Z ea004bf9234e5f1001b3a44b9f08ecf2 diff --git a/manifest.uuid b/manifest.uuid index f3d7683949..ce5190daef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6604a085964121113e7b7f57537a0ba64ba058d0eb12bf0a3aeb6d1b7a29d516 \ No newline at end of file +886feffaad6baac37dfaab489c2aecc4abf51a3a5bce1e8a94be7cc1d2a3c30c \ No newline at end of file diff --git a/src/pragma.h b/src/pragma.h index f90de7c77b..6eb05763c8 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -570,7 +570,7 @@ static const PragmaName aPragmaName[] = { /* ePragTyp: */ PragTyp_TABLE_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1, /* ColNames: */ 15, 6, - /* iArg: */ 1 }, + /* iArg: */ 0 }, {/* zName: */ "table_xinfo", /* ePragTyp: */ PragTyp_TABLE_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 530b6c2224..a8a7ef66be 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -233,7 +233,7 @@ set pragma_def { NAME: table_list TYPE: TABLE_LIST - FLAG: NeedSchema Result1 SchemaOpt + FLAG: NeedSchema Result1 COLS: schema name type ncol wr strict IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) From c59ffa8c1e4451db06e3a062601ad77e8a0a1139 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 4 Oct 2021 15:08:49 +0000 Subject: [PATCH 03/64] Fix harmless static analyzer warnings. FossilOrigin-Name: 1ebcde72e2046dffaa408d2a5a4a5bbf35fdf4b096e0e088dcffd9360effdaa7 --- ext/fts3/fts3_snippet.c | 4 +++- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/expr.c | 4 ++-- src/main.c | 6 +++--- src/vdbeaux.c | 2 ++ src/where.c | 5 +++-- 7 files changed, 24 insertions(+), 19 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 613d3e5f16..68bcd07e74 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1112,10 +1112,12 @@ static int fts3MatchinfoLcsCb( ** position list for the next column. */ static int fts3LcsIteratorAdvance(LcsIterator *pIter){ - char *pRead = pIter->pRead; + char *pRead; sqlite3_int64 iRead; int rc = 0; + if( NEVER(pIter==0) ) return 1; + pRead = pIter->pRead; pRead += sqlite3Fts3GetVarint(pRead, &iRead); if( iRead==0 || iRead==1 ){ pRead = 0; diff --git a/manifest b/manifest index 35a4b9d9e7..eea02ea2a0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\spragma_table_list\svirtual\stable\sshould\shave\sonly\sone\s"schema"\scolumn. -D 2021-10-04T13:30:22.741 +C Fix\sharmless\sstatic\sanalyzer\swarnings. +D 2021-10-04T15:08:49.115 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -93,7 +93,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 57e1965906f3ecfcb5251a14aea98ac2d2dd1868a123bcd5a569601719ab9ead +F ext/fts3/fts3_snippet.c a4b2f009c3eba05fc51826d70a31aad67f2a0681b6a5b12a9d1d8b7575c88f93 F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 F ext/fts3/fts3_test.c d8d7b2734f894e8a489987447658e374cdd3a3bc8575c401decf1911cb7c6454 F ext/fts3/fts3_tokenize_vtab.c 8d15b148e7d88a4280389a200b26e8d52abda4c4ec2e9a35e9d7a1fa50e5aa03 @@ -501,7 +501,7 @@ F src/date.c 467848d8187382764e37fd7678d6825cdfb90d9e564648527ed832e999ea7b85 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c ebc76aa98b9bcd556c2855942c18f4d2f52c6504c13f7285413026bdd1c7bbf5 +F src/expr.c b2d8333a1b4e320b5989a286924a2c7c63fc4f7668b2b0a570babe254c0089ef F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c 761a989e9b6a1f03cae05ef274f30881cb8f7ec816af2913b58dc18ac31ffd0e @@ -513,7 +513,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 16fa4b66709db6db5bb31475f2321d0a839269765aa2461a520c151c385e8b9d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c ff4c89bdfd980b59126d3f6ed4677b1e79fcb93fb72d09908019d533fd0ff134 +F src/main.c b9e0b9ac6540f371d9284ea8275a7e6c1b652229efafac74be3e173f4cf16bf9 F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -625,7 +625,7 @@ F src/vdbe.c f2a83da75711ee42b8986600ba870c71f57b49325d9b196c2097950871846983 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 -F src/vdbeaux.c 2368a8888f17368d4040a05966f7d2a2276cac4eeeba50793828186d999e3c8f +F src/vdbeaux.c 2f2f9b1c2b1d441ff5b34a6fb0874ecd7de0e34049a584bd9fb6c651846fd098 F src/vdbeblob.c 60a7694760e35b2bba166cf49eb6a1eb0b31581102b49de78008ca3032406065 F src/vdbemem.c 0e830c2aab24241eed85bd4c8a5bd8c9b959081316477440bfffb35089ba7d0b F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 @@ -636,7 +636,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c d9215db24449143da844ab86c727bbbef94ad45c53cc17bc0051386472db5789 +F src/where.c 5d669d7c31f53d18a413eed69899f11d6e92a400a7c982d90eb6d8d301c73afb F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6604a085964121113e7b7f57537a0ba64ba058d0eb12bf0a3aeb6d1b7a29d516 -R 36c0379c51eeda190fca7799dbb2bec0 +P 886feffaad6baac37dfaab489c2aecc4abf51a3a5bce1e8a94be7cc1d2a3c30c +R 4f79fd109adffef1d1d3caa9f4ec93b1 U drh -Z ea004bf9234e5f1001b3a44b9f08ecf2 +Z c5a5cf144ead5527e6e37b4c187e37f0 diff --git a/manifest.uuid b/manifest.uuid index ce5190daef..e9e6ac76c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -886feffaad6baac37dfaab489c2aecc4abf51a3a5bce1e8a94be7cc1d2a3c30c \ No newline at end of file +1ebcde72e2046dffaa408d2a5a4a5bbf35fdf4b096e0e088dcffd9360effdaa7 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 14fe8e5bdb..3a943a5a06 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2387,9 +2387,9 @@ int sqlite3ExprIsInteger(const Expr *p, int *pValue){ break; } case TK_UMINUS: { - int v; + int v = 0; if( sqlite3ExprIsInteger(p->pLeft, &v) ){ - assert( v!=(-2147483647-1) ); + assert( ((unsigned int)v)!=0x80000000 ); *pValue = -v; rc = 1; } diff --git a/src/main.c b/src/main.c index c44b9b4702..3a25f3bac1 100644 --- a/src/main.c +++ b/src/main.c @@ -3096,7 +3096,7 @@ int sqlite3ParseUri( */ static const char *uriParameter(const char *zFilename, const char *zParam){ zFilename += sqlite3Strlen30(zFilename) + 1; - while( zFilename[0] ){ + while( ALWAYS(zFilename!=0) && zFilename[0] ){ int x = strcmp(zFilename, zParam); zFilename += sqlite3Strlen30(zFilename) + 1; if( x==0 ) return zFilename; @@ -4444,7 +4444,7 @@ const char *sqlite3_uri_key(const char *zFilename, int N){ if( zFilename==0 || N<0 ) return 0; zFilename = databaseName(zFilename); zFilename += sqlite3Strlen30(zFilename) + 1; - while( zFilename[0] && (N--)>0 ){ + while( ALWAYS(zFilename) && zFilename[0] && (N--)>0 ){ zFilename += sqlite3Strlen30(zFilename) + 1; zFilename += sqlite3Strlen30(zFilename) + 1; } @@ -4494,7 +4494,7 @@ const char *sqlite3_filename_journal(const char *zFilename){ if( zFilename==0 ) return 0; zFilename = databaseName(zFilename); zFilename += sqlite3Strlen30(zFilename) + 1; - while( zFilename[0] ){ + while( ALWAYS(zFilename) && zFilename[0] ){ zFilename += sqlite3Strlen30(zFilename) + 1; zFilename += sqlite3Strlen30(zFilename) + 1; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index c04bd0d379..f1307503ad 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -241,8 +241,10 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ if( p->nOpAlloc<=i ){ return growOp3(p, op, p1, p2, p3); } + assert( p->aOp!=0 ); p->nOp++; pOp = &p->aOp[i]; + assert( pOp!=0 ); pOp->opcode = (u8)op; pOp->p5 = 0; pOp->p1 = p1; diff --git a/src/where.c b/src/where.c index 751d622352..45a6fb4a5e 100644 --- a/src/where.c +++ b/src/where.c @@ -329,7 +329,8 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ } } if( (pTerm->eOperator & (WO_EQ|WO_IS))!=0 - && (pX = pTerm->pExpr->pRight)->op==TK_COLUMN + && (pX = pTerm->pExpr->pRight, ALWAYS(pX!=0)) + && pX->op==TK_COLUMN && pX->iTable==pScan->aiCur[0] && pX->iColumn==pScan->aiColumn[0] ){ @@ -4084,7 +4085,7 @@ static i8 wherePathSatisfiesOrderBy( if( obSat==obDone ) return (i8)nOrderBy; if( !isOrderDistinct ){ for(i=nOrderBy-1; i>0; i--){ - Bitmask m = MASKBIT(i) - 1; + Bitmask m = ALWAYS(i Date: Mon, 4 Oct 2021 16:14:51 +0000 Subject: [PATCH 04/64] Fix harmless static analyzer warnings in auxiliary build tools, mkkeywordhash.c and lemon.c. No changes to the SQLite core. FossilOrigin-Name: f2f279b2cc1c8b3b162058c33956be4037cd519715ac0c4290f10c58d2528f0a --- manifest | 14 +++++------ manifest.uuid | 2 +- tool/lemon.c | 57 +++++++++++++++++++++++++------------------- tool/mkkeywordhash.c | 1 + 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/manifest b/manifest index eea02ea2a0..3cd35b9592 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\sstatic\sanalyzer\swarnings. -D 2021-10-04T15:08:49.115 +C Fix\sharmless\sstatic\sanalyzer\swarnings\sin\sauxiliary\sbuild\stools,\smkkeywordhash.c\nand\slemon.c.\s\sNo\schanges\sto\sthe\sSQLite\score. +D 2021-10-04T16:14:51.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1847,7 +1847,7 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c f62a0c701b2c7ff2f3e21d206f093c123f222dbf07136a10ffd1ca15a5c706c5 F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c dabeb66806057235fdca34d77e077a554396d8b8c2e1982dfd292b9dba3be13c +F tool/lemon.c 258881835bd5bccd0c74fb110fe54244ff18e8e7ef3d949cbdab7187f02132bb F tool/lempar.c 7d4b1c863a6c7f75f0a04bfa7000b7388898c9ee9c906adc675bc40590ad0abe F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 @@ -1857,7 +1857,7 @@ F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a19 F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8 F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl 5ef1891ed3d0e8143ff39bad7c01ed60c2817a2fb2d9a09487f7ccad2df621e4 -F tool/mkkeywordhash.c 7b1ffdb0731938cfb52dbf57461ff9132cb350612d944530e2f6031a7f16bf69 +F tool/mkkeywordhash.c 35bfc41adacc4aa6ef6fca7fd0c63e0ec0534b78daf4d0cfdebe398216bbffc3 F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef F tool/mkopcodeh.tcl 130b88697da6ec5b89b41844d955d08fb62c2552e889dec8c7bcecb28d8f50bd @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 886feffaad6baac37dfaab489c2aecc4abf51a3a5bce1e8a94be7cc1d2a3c30c -R 4f79fd109adffef1d1d3caa9f4ec93b1 +P 1ebcde72e2046dffaa408d2a5a4a5bbf35fdf4b096e0e088dcffd9360effdaa7 +R 460df5fa70f5b978400f9f41b6eef0a4 U drh -Z c5a5cf144ead5527e6e37b4c187e37f0 +Z a4e1f535f3f3f44fafce7d2809ef8d9a diff --git a/manifest.uuid b/manifest.uuid index e9e6ac76c6..65378f6374 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ebcde72e2046dffaa408d2a5a4a5bbf35fdf4b096e0e088dcffd9360effdaa7 \ No newline at end of file +f2f279b2cc1c8b3b162058c33956be4037cd519715ac0c4290f10c58d2528f0a \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index edf17cae74..d4e157a1cd 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -917,8 +917,11 @@ void FindStates(struct lemon *lemp) lemp->errorcnt++; sp = lemp->startRule->lhs; } - }else{ + }else if( lemp->startRule ){ sp = lemp->startRule->lhs; + }else{ + ErrorMsg(lemp->filename,0,"Internal error - no start rule\n"); + exit(1); } /* Make sure the start symbol doesn't occur on the right-hand side of @@ -1083,7 +1086,7 @@ void FindLinks(struct lemon *lemp) ** which the link is attached. */ for(i=0; instate; i++){ stp = lemp->sorted[i]; - for(cfp=stp->cfp; cfp; cfp=cfp->next){ + for(cfp=stp?stp->cfp:0; cfp; cfp=cfp->next){ cfp->stp = stp; } } @@ -1092,7 +1095,7 @@ void FindLinks(struct lemon *lemp) ** links are used in the follow-set computation. */ for(i=0; instate; i++){ stp = lemp->sorted[i]; - for(cfp=stp->cfp; cfp; cfp=cfp->next){ + for(cfp=stp?stp->cfp:0; cfp; cfp=cfp->next){ for(plp=cfp->bplp; plp; plp=plp->next){ other = plp->cfp; Plink_add(&other->fplp,cfp); @@ -1115,6 +1118,7 @@ void FindFollowSets(struct lemon *lemp) int change; for(i=0; instate; i++){ + assert( lemp->sorted[i]!=0 ); for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ cfp->status = INCOMPLETE; } @@ -1123,6 +1127,7 @@ void FindFollowSets(struct lemon *lemp) do{ progress = 0; for(i=0; instate; i++){ + assert( lemp->sorted[i]!=0 ); for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ if( cfp->status==COMPLETE ) continue; for(plp=cfp->fplp; plp; plp=plp->next){ @@ -1172,7 +1177,14 @@ void FindActions(struct lemon *lemp) /* Add the accepting token */ if( lemp->start ){ sp = Symbol_find(lemp->start); - if( sp==0 ) sp = lemp->startRule->lhs; + if( sp==0 ){ + if( lemp->startRule==0 ){ + fprintf(stderr, "internal error on source line %d: no start rule\n", + __LINE__); + exit(1); + } + sp = lemp->startRule->lhs; + } }else{ sp = lemp->startRule->lhs; } @@ -1299,21 +1311,7 @@ static struct config **basisend = 0; /* End of list of basis configs */ /* Return a pointer to a new configuration */ PRIVATE struct config *newconfig(void){ - struct config *newcfg; - if( freelist==0 ){ - int i; - int amt = 3; - freelist = (struct config *)calloc( amt, sizeof(struct config) ); - if( freelist==0 ){ - fprintf(stderr,"Unable to allocate memory for a new configuration."); - exit(1); - } - for(i=0; inext; - return newcfg; + return (struct config*)calloc(1, sizeof(struct config)); } /* The configuration "old" is no longer used */ @@ -1932,8 +1930,12 @@ static FILE *errstream; static void errline(int n, int k, FILE *err) { int spcnt, i; - if( g_argv[0] ) fprintf(err,"%s",g_argv[0]); - spcnt = lemonStrlen(g_argv[0]) + 1; + if( g_argv[0] ){ + fprintf(err,"%s",g_argv[0]); + spcnt = lemonStrlen(g_argv[0]) + 1; + }else{ + spcnt = 0; + } for(i=1; ifrom = &(array.ht[h]); array.ht[h] = newnp; } - free(x1a->tbl); + /* free(x1a->tbl); // This program was originally for 16-bit machines. + ** Don't worry about freeing memory on modern platforms. */ *x1a = array; } /* Insert the new data */ @@ -5507,7 +5510,9 @@ int Symbol_insert(struct symbol *data, const char *key) newnp->from = &(array.ht[h]); array.ht[h] = newnp; } - free(x2a->tbl); + /* free(x2a->tbl); // This program was originally written for 16-bit + ** machines. Don't worry about freeing this trivial amount of memory + ** on modern platforms. Just leak it. */ *x2a = array; } /* Insert the new data */ @@ -5843,7 +5848,9 @@ int Configtable_insert(struct config *data) newnp->from = &(array.ht[h]); array.ht[h] = newnp; } - free(x4a->tbl); + /* free(x4a->tbl); // This code was originall written for 16-bit machines. + ** on modern machines, don't worry about freeing this trival amount of + ** memory. */ *x4a = array; } /* Insert the new data */ diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index a330ef0c87..fe25b5abc0 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -513,6 +513,7 @@ int main(int argc, char **argv){ bestSize = nKeyword; bestCount = nKeyword*nKeyword; for(i=nKeyword/2; i<=2*nKeyword; i++){ + if( i<=0 ) continue; for(j=0; j Date: Mon, 4 Oct 2021 18:21:14 +0000 Subject: [PATCH 05/64] Fix harmless static analyzer warnings in sessions, rtree, fts3 and fts5. Add the -DSQLITE_OMIT_AUXILIARY_SAFETY_CHECKS compile-time option to cause ALWAYS() and NEVER() macros to be omitted from the build. FossilOrigin-Name: 1c67f957fc77e37ce8f0d447c41ca975e8e79a35d332739c24a633649b5b0387 --- ext/expert/sqlite3expert.c | 21 +++++++++++++++++++-- ext/fts3/fts3.c | 7 ------- ext/fts3/fts3Int.h | 21 +++++++++++---------- ext/fts5/fts5Int.h | 15 +++++++++++++-- ext/fts5/fts5_expr.c | 1 + ext/fts5/fts5_index.c | 7 ++++--- ext/misc/zipfile.c | 3 +++ ext/repair/checkfreelist.c | 15 +++++++++++++-- ext/rtree/geopoly.c | 4 ++-- ext/rtree/rtree.c | 4 ++++ ext/session/sqlite3session.c | 8 ++++---- manifest | 36 ++++++++++++++++++------------------ manifest.uuid | 2 +- src/shell.c.in | 2 +- src/sqliteInt.h | 10 +++++++++- 15 files changed, 103 insertions(+), 53 deletions(-) diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index a20c4f4e4d..a5eb109b46 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -15,6 +15,23 @@ #include #include +#if !defined(SQLITE_AMALGAMATION) +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif +#endif /* !defined(SQLITE_AMALGAMATION) */ + + #ifndef SQLITE_OMIT_VIRTUALTABLE typedef sqlite3_int64 i64; @@ -741,9 +758,9 @@ static int idxGetTableInfo( if( rc!=SQLITE_OK ){ sqlite3_free(pNew); pNew = 0; - }else{ + }else if( ALWAYS(pNew!=0) ){ pNew->zName = pCsr; - memcpy(pNew->zName, zTab, nTab+1); + if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1); } *ppOut = pNew; diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 9c5703d3f1..9c49afa2ed 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -313,13 +313,6 @@ static int fts3EvalStart(Fts3Cursor *pCsr); static int fts3TermSegReaderCursor( Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **); -#ifndef SQLITE_AMALGAMATION -# if defined(SQLITE_DEBUG) -int sqlite3Fts3Always(int b) { assert( b ); return b; } -int sqlite3Fts3Never(int b) { assert( !b ); return b; } -# endif -#endif - /* ** This variable is set to false when running tests for which the on disk ** structures should not be corrupt. Otherwise, true. If it is false, extra diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 8c2579166d..348b88387e 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -151,17 +151,18 @@ extern int sqlite3_fts3_may_be_corrupt; ** Macros indicating that conditional expressions are always true or ** false. */ -#ifdef SQLITE_COVERAGE_TEST -# define ALWAYS(x) (1) -# define NEVER(X) (0) -#elif defined(SQLITE_DEBUG) -# define ALWAYS(x) sqlite3Fts3Always((x)!=0) -# define NEVER(x) sqlite3Fts3Never((x)!=0) -int sqlite3Fts3Always(int b); -int sqlite3Fts3Never(int b); +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) #else -# define ALWAYS(x) (x) -# define NEVER(x) (x) +# define ALWAYS(X) (X) +# define NEVER(X) (X) #endif /* diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index b264a391bc..28a30e59ff 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -35,8 +35,19 @@ typedef sqlite3_uint64 u64; #endif #define testcase(x) -#define ALWAYS(x) 1 -#define NEVER(x) 0 + +#ifdef SQLITE_COVERAGE_TEST +# define ALWAYS(x) (1) +# define NEVER(X) (0) +#elif defined(SQLITE_DEBUG) +# define ALWAYS(x) sqlite3Fts3Always((x)!=0) +# define NEVER(x) sqlite3Fts3Never((x)!=0) +int sqlite3Fts3Always(int b); +int sqlite3Fts3Never(int b); +#else +# define ALWAYS(x) (x) +# define NEVER(x) (x) +#endif #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #define MAX(x,y) (((x) > (y)) ? (x) : (y)) diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index d1cd5bb7f1..402371c69a 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -434,6 +434,7 @@ static i64 fts5ExprSynonymRowid(Fts5ExprTerm *pTerm, int bDesc, int *pbEof){ int bRetValid = 0; Fts5ExprTerm *p; + assert( pTerm ); assert( pTerm->pSynonym ); assert( bDesc==0 || bDesc==1 ); for(p=pTerm; p; p=p->pSynonym){ diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index dcc391456a..afba249e30 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -1773,6 +1773,7 @@ static void fts5SegIterInit( if( p->rc==SQLITE_OK ){ pIter->iLeafOffset = 4; + assert( pIter->pLeaf!=0 ); assert_nc( pIter->pLeaf->nn>4 ); assert_nc( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); pIter->iPgidxOff = pIter->pLeaf->szLeaf+1; @@ -2733,7 +2734,7 @@ static void fts5SegIterGotoPage( fts5SegIterNextPage(p, pIter); assert( p->rc!=SQLITE_OK || pIter->iLeafPgno==iLeafPgno ); - if( p->rc==SQLITE_OK ){ + if( p->rc==SQLITE_OK && ALWAYS(pIter->pLeaf!=0) ){ int iOff; u8 *a = pIter->pLeaf->p; int n = pIter->pLeaf->szLeaf; @@ -4475,7 +4476,7 @@ static void fts5IndexAutomerge( Fts5Structure **ppStruct, /* IN/OUT: Current structure of index */ int nLeaf /* Number of output leaves just written */ ){ - if( p->rc==SQLITE_OK && p->pConfig->nAutomerge>0 ){ + if( p->rc==SQLITE_OK && p->pConfig->nAutomerge>0 && ALWAYS((*ppStruct)!=0) ){ Fts5Structure *pStruct = *ppStruct; u64 nWrite; /* Initial value of write-counter */ int nWork; /* Number of work-quanta to perform */ @@ -5837,7 +5838,7 @@ static int fts5QueryCksum( Fts5IndexIter *pIter = 0; int rc = sqlite3Fts5IndexQuery(p, z, n, flags, 0, &pIter); - while( rc==SQLITE_OK && 0==sqlite3Fts5IterEof(pIter) ){ + while( rc==SQLITE_OK && ALWAYS(pIter!=0) && 0==sqlite3Fts5IterEof(pIter) ){ i64 rowid = pIter->iRowid; if( eDetail==FTS5_DETAIL_NONE ){ diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 78c669631c..b7ceb9396d 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -57,6 +57,9 @@ typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ #define MIN(a,b) ((a)<(b) ? (a) : (b)) #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) # define ALWAYS(X) (1) # define NEVER(X) (0) #elif !defined(NDEBUG) diff --git a/ext/repair/checkfreelist.c b/ext/repair/checkfreelist.c index 990be4afa7..d1d3d54074 100644 --- a/ext/repair/checkfreelist.c +++ b/ext/repair/checkfreelist.c @@ -44,8 +44,19 @@ SQLITE_EXTENSION_INIT1 # include # include # include -# define ALWAYS(X) 1 -# define NEVER(X) 0 +# if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +# endif +# if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +# elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +# else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +# endif typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index b7759bbb51..484ceb4023 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -1138,11 +1138,11 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ }else{ /* Remove a segment */ if( pActive==pThisEvent->pSeg ){ - pActive = pActive->pNext; + pActive = ALWAYS(pActive) ? pActive->pNext : 0; }else{ for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ if( pSeg->pNext==pThisEvent->pSeg ){ - pSeg->pNext = pSeg->pNext->pNext; + pSeg->pNext = ALWAYS(pSeg->pNext) ? pSeg->pNext->pNext : 0; break; } } diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 47905c3d8c..946cc6377d 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -82,6 +82,9 @@ typedef unsigned int u32; # undef NDEBUG #endif #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) # define ALWAYS(X) (1) # define NEVER(X) (0) #elif !defined(NDEBUG) @@ -3859,6 +3862,7 @@ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ tree.nDim2 = tree.nDim*2; tree.nBytesPerCell = 8 + 8 * tree.nDim; node.zData = (u8 *)sqlite3_value_blob(apArg[1]); + if( node.zData==0 ) return; nData = sqlite3_value_bytes(apArg[1]); if( nData<4 ) return; if( nData0 ) memcpy(&aBuf[nVarint + 1], z, n); } nByte = 1 + nVarint + n; @@ -3651,11 +3651,11 @@ static int sessionChangesetInvert( } assert( rc==SQLITE_OK ); - if( pnInverted ){ + if( pnInverted && ALWAYS(ppInverted) ){ *pnInverted = sOut.nBuf; *ppInverted = sOut.aBuf; sOut.aBuf = 0; - }else if( sOut.nBuf>0 ){ + }else if( sOut.nBuf>0 && ALWAYS(xOutput!=0) ){ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); } @@ -4111,7 +4111,7 @@ static int sessionBindRow( for(i=0; rc==SQLITE_OK && in+len>=p->nAlloc ){ + if( p->z==0 || p->n+len>=p->nAlloc ){ p->nAlloc = p->nAlloc*2 + len + 20; p->z = realloc(p->z, p->nAlloc); if( p->z==0 ) shell_out_of_memory(); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a7f830263c..d941de07ad 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -469,6 +469,14 @@ # define VVA_ONLY(X) #endif +/* +** Disable ALWAYS() and NEVER() (make them pass-throughs) for coverage +** and mutation testing +*/ +#if defined(SQLITE_COVERATE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif + /* ** The ALWAYS and NEVER macros surround boolean expressions which ** are intended to always be true or false, respectively. Such @@ -484,7 +492,7 @@ ** be true and false so that the unreachable code they specify will ** not be counted as untested code. */ -#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) # define ALWAYS(X) (1) # define NEVER(X) (0) #elif !defined(NDEBUG) From 922c54206fd664ad22c56d88d5b7998b213cd75c Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 4 Oct 2021 18:57:42 +0000 Subject: [PATCH 06/64] Some #defines somehow failed to get set correctly in the previous check-in. Fixed here. FossilOrigin-Name: 15bbdf9ac840a220f384411d3025ef22f949d310194b60bca8e6d6a759e6042e --- ext/fts5/fts5Int.h | 21 +++++++++++---------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 28a30e59ff..7a5ff26468 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -36,17 +36,18 @@ typedef sqlite3_uint64 u64; #define testcase(x) -#ifdef SQLITE_COVERAGE_TEST -# define ALWAYS(x) (1) -# define NEVER(X) (0) -#elif defined(SQLITE_DEBUG) -# define ALWAYS(x) sqlite3Fts3Always((x)!=0) -# define NEVER(x) sqlite3Fts3Never((x)!=0) -int sqlite3Fts3Always(int b); -int sqlite3Fts3Never(int b); +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#endif +#if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) #else -# define ALWAYS(x) (x) -# define NEVER(x) (x) +# define ALWAYS(X) (X) +# define NEVER(X) (X) #endif #define MIN(x,y) (((x) < (y)) ? (x) : (y)) diff --git a/manifest b/manifest index e4de9aef60..73c0d820f2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\sstatic\sanalyzer\swarnings\sin\ssessions,\srtree,\sfts3\sand\sfts5.\nAdd\sthe\s-DSQLITE_OMIT_AUXILIARY_SAFETY_CHECKS\scompile-time\soption\sto\scause\nALWAYS()\sand\sNEVER()\smacros\sto\sbe\somitted\sfrom\sthe\sbuild. -D 2021-10-04T18:21:14.780 +C Some\s#defines\ssomehow\sfailed\sto\sget\sset\scorrectly\sin\sthe\sprevious\scheck-in.\nFixed\shere. +D 2021-10-04T18:57:42.757 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -113,7 +113,7 @@ 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 ff24689b6e641dd41c21e21d305edd2557a8dd3eb66d52463ed2a458f898d30e +F ext/fts5/fts5Int.h a453bdbc5741c8e4014fa232f06a954f7bec4460f3d840aaac95404118436ddc F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938df59a1347f F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f2f279b2cc1c8b3b162058c33956be4037cd519715ac0c4290f10c58d2528f0a -R 3c35f5ee3afb57355fb7bdf18fbfd8fc +P 1c67f957fc77e37ce8f0d447c41ca975e8e79a35d332739c24a633649b5b0387 +R e4fec384b9b81dd75f2f9dbefbf1c470 U drh -Z d5b73332feee812a90444e7b74de370f +Z f3095bec1807bac205dafa906eef3829 diff --git a/manifest.uuid b/manifest.uuid index d04fefb42f..ef8caf94ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c67f957fc77e37ce8f0d447c41ca975e8e79a35d332739c24a633649b5b0387 \ No newline at end of file +15bbdf9ac840a220f384411d3025ef22f949d310194b60bca8e6d6a759e6042e \ No newline at end of file From 7d4c94bc0fc8fbf9359f57a90c2c19567d87df02 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 4 Oct 2021 22:34:38 +0000 Subject: [PATCH 07/64] Fix harmless static-analyzer warnings. FossilOrigin-Name: 32f33f356931242b59c01b5df7e180941231e3d9c91577ad33aa4a01e9d59092 --- ext/fts3/fts3_write.c | 10 +++++++--- ext/misc/json1.c | 3 ++- ext/rtree/rtree.c | 3 ++- manifest | 37 ++++++++++++++++++------------------- manifest.uuid | 2 +- src/attach.c | 6 +++--- src/bitvec.c | 2 +- src/btree.c | 8 +++----- src/expr.c | 2 +- src/main.c | 3 +-- src/select.c | 4 +++- src/vdbe.c | 2 +- src/vdbeaux.c | 2 +- src/vdbemem.c | 13 +++++++++++++ src/wherecode.c | 2 +- 15 files changed, 58 insertions(+), 41 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 56c59ce3ae..99605c6282 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3783,7 +3783,7 @@ static int nodeReaderNext(NodeReader *p){ return FTS_CORRUPT_VTAB; } blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && ALWAYS(p->term.a!=0) ){ memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix); p->term.n = nPrefix+nSuffix; p->iOff += nSuffix; @@ -4177,7 +4177,11 @@ static int fts3TermCmp( int nCmp = MIN(nLhs, nRhs); int res; - res = (nCmp ? memcmp(zLhs, zRhs, nCmp) : 0); + if( nCmp && ALWAYS(zLhs) && ALWAYS(zRhs) ){ + res = memcmp(zLhs, zRhs, nCmp); + }else{ + res = 0; + } if( res==0 ) res = nLhs - nRhs; return res; @@ -4821,7 +4825,7 @@ static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){ if( aHint ){ blobGrowBuffer(pHint, nHint, &rc); if( rc==SQLITE_OK ){ - memcpy(pHint->a, aHint, nHint); + if( ALWAYS(pHint->a!=0) ) memcpy(pHint->a, aHint, nHint); pHint->n = nHint; } } diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 5b8a0a05c5..6aa4e97f9d 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -438,8 +438,9 @@ static void jsonRenderNode( JsonString *pOut, /* Write JSON here */ sqlite3_value **aReplace /* Replacement values */ ){ + assert( pNode!=0 ); if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){ - if( pNode->jnFlags & JNODE_REPLACE ){ + if( (pNode->jnFlags & JNODE_REPLACE)!=0 && ALWAYS(aReplace!=0) ){ jsonAppendValue(pOut, aReplace[pNode->u.iReplace]); return; } diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 946cc6377d..0e9a9ba0bd 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2200,7 +2200,7 @@ static int ChooseLeaf( int nCell = NCELL(pNode); RtreeCell cell; - RtreeNode *pChild; + RtreeNode *pChild = 0; RtreeCell *aCell = 0; @@ -2558,6 +2558,7 @@ static int updateMapping( pChild->pParent = pNode; } } + if( NEVER(pNode==0) ) return SQLITE_ERROR; return xSetMapping(pRtree, iRowid, pNode->iNode); } diff --git a/manifest b/manifest index 918013d73c..f527b6861b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sstatic-analyzer\swarning\sfixes\sand\sthe\snew\sSQLITE_OMIT_AUXILIARY_SAFETY_CHECKS\smacro. -D 2021-10-04T18:59:02.285 +C Fix\sharmless\sstatic-analyzer\swarnings. +D 2021-10-04T22:34:38.507 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -102,7 +102,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c de426ff05c1c2e7bce161cf6b706638419c3a1d9c2667de9cb9dc0458c18e226 F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 98edfd77aeb53afcb26d8de3ed0a87f16468ee05f84f8c1752e6e378c354cd7a +F ext/fts3/fts3_write.c c93b1287721c2ef680186867ee1a6b5cc6659014aeffb542309101af72c77b81 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -306,7 +306,7 @@ F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab900 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c 91a5594071143a4ab79c638fe9f059af1db09932faf2e704c3e29216a7d4f511 -F ext/misc/json1.c 6cfebb66a7568f8a17d67e676daba0a95efc3bc8f69c26998fc9519857bc5deb +F ext/misc/json1.c f204a61f7c4436261dcb0423ff48395ac53fcfc44ea3a74a77a2a4f47b8c61e2 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c 7dffa8cc89c7f2d73da4bd4ccea1bcbd2bd283e3bb4cea398df7c372a197291b @@ -394,7 +394,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c d575f6c796fcb8066fb38e3d5c604b31a13867fbee2713ffb190eff31e7bc04d -F ext/rtree/rtree.c 4e1ba7894720c33b710fb1c393a559c9faa1b0e238746006bb5d9c30a6238b2b +F ext/rtree/rtree.c bd862b5368c60d3494bcdf6ded2fe743cf0b855a1b2ff4c5b71c82ea0694ecb1 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -485,12 +485,12 @@ F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c a6afe961ef3544104fa635a0c3161bfe1a34382f32e2a28706993abadedbffed F src/analyze.c 979b6d2cdaca992a9c9f0818de55d08fb9a4e52929a509752b52d9fd23bb86d3 -F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 +F src/attach.c e5f9ab9700d545d49352db4865e9f4ba02085d244485729575b61da9fd3a7218 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d -F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 +F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c ced03fe226a3a42b77b504afcd0a9da14da39b42fac5935988243803cf03bc14 +F src/btree.c 57c2ac124795303fb2358c29dcadbb9de67cf34b16896a555f2abdb5fd68833c F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001 @@ -501,7 +501,7 @@ F src/date.c 467848d8187382764e37fd7678d6825cdfb90d9e564648527ed832e999ea7b85 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c b2d8333a1b4e320b5989a286924a2c7c63fc4f7668b2b0a570babe254c0089ef +F src/expr.c ac2bc8eef596443dfe04c3510eefda5dfdda9dac65cc8fef5a80c69fb4c24815 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/func.c 761a989e9b6a1f03cae05ef274f30881cb8f7ec816af2913b58dc18ac31ffd0e @@ -513,7 +513,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 16fa4b66709db6db5bb31475f2321d0a839269765aa2461a520c151c385e8b9d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c b9e0b9ac6540f371d9284ea8275a7e6c1b652229efafac74be3e173f4cf16bf9 +F src/main.c 819f1e56cb8fc8d2d58cd5bbdbf60da0c48065a96a0d06617a5e5723ae2ddd05 F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -549,7 +549,7 @@ F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c c4f14e9aaa2f7c821be721f79ee578a82d4efeef5797f9673feb82750582ae80 +F src/select.c c49365e313d8b5338665d21139a07d2481c0340a2daf2f56fab1d8d526c1182e F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -621,13 +621,13 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 3f27a1eae01c8bbbb8cdef2f26bd8e6a2a7db08106ef7c3dcc990787a5da6e86 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c f2a83da75711ee42b8986600ba870c71f57b49325d9b196c2097950871846983 +F src/vdbe.c e4ed1897b74a25989b17a27f7e4a9ee22d40a7ba2fddebca047ca5cc59d9676b F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 -F src/vdbeaux.c 2f2f9b1c2b1d441ff5b34a6fb0874ecd7de0e34049a584bd9fb6c651846fd098 +F src/vdbeaux.c e7d3d85ac3c64522f5077b18c6f7ae725026727f74d852fef416180060275b15 F src/vdbeblob.c 60a7694760e35b2bba166cf49eb6a1eb0b31581102b49de78008ca3032406065 -F src/vdbemem.c 0e830c2aab24241eed85bd4c8a5bd8c9b959081316477440bfffb35089ba7d0b +F src/vdbemem.c f4dcedec564688c957c7ac27c5e90a884dd5499cf37eb7cc50e33853e5313c97 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -638,7 +638,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 5d669d7c31f53d18a413eed69899f11d6e92a400a7c982d90eb6d8d301c73afb F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c 0208553a0602146b5640747c0e3f7a8c785108c2d06a160b69f23491e9dc781e +F src/wherecode.c af9bc0608f07f6582affb0e4f30f95815cca080feb5359c2acc4558b48500604 F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 F src/window.c f27e34e896f84e0bedec32b027d4531f224971ce3e16f8e1d97a968875ddcec1 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1929,8 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f2f279b2cc1c8b3b162058c33956be4037cd519715ac0c4290f10c58d2528f0a 15bbdf9ac840a220f384411d3025ef22f949d310194b60bca8e6d6a759e6042e -R e4fec384b9b81dd75f2f9dbefbf1c470 -T +closed 15bbdf9ac840a220f384411d3025ef22f949d310194b60bca8e6d6a759e6042e +P 5da112c02f9e8d0bcbed8bcf6bab9c227607a802e85c8f70b1ca628d24960dee +R ed158196d4eb2672db00add61a3b4690 U drh -Z c20af47dd06bfe213e39442e78aafbf5 +Z 3cde4d92fbbfe00106b388617e0f0f8e diff --git a/manifest.uuid b/manifest.uuid index 9aa5b31216..762d2b004f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5da112c02f9e8d0bcbed8bcf6bab9c227607a802e85c8f70b1ca628d24960dee \ No newline at end of file +32f33f356931242b59c01b5df7e180941231e3d9c91577ad33aa4a01e9d59092 \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 2fc84e5b84..9c602f8c67 100644 --- a/src/attach.c +++ b/src/attach.c @@ -346,9 +346,9 @@ static void codeAttach( sName.pParse = pParse; if( - SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) || - SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) || - SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey)) + SQLITE_OK!=resolveAttachExpr(&sName, pFilename) || + SQLITE_OK!=resolveAttachExpr(&sName, pDbname) || + SQLITE_OK!=resolveAttachExpr(&sName, pKey) ){ goto attach_end; } diff --git a/src/bitvec.c b/src/bitvec.c index bd4a09429b..9393428d9d 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -353,7 +353,7 @@ int sqlite3BitvecBuiltinTest(int sz, int *aOp){ sqlite3BitvecClear(0, 1, pTmpSpace); /* Run the program */ - pc = 0; + pc = i = 0; while( (op = aOp[pc])!=0 ){ switch( op ){ case 1: diff --git a/src/btree.c b/src/btree.c index 6db35cd315..5d03ea80f5 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3095,7 +3095,6 @@ static int lockBtree(BtShared *pBt){ MemPage *pPage1; /* Page 1 of the database file */ u32 nPage; /* Number of pages in the database */ u32 nPageFile = 0; /* Number of pages in the database file */ - u32 nPageHeader; /* Number of pages in the database according to hdr */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( pBt->pPage1==0 ); @@ -3107,7 +3106,7 @@ static int lockBtree(BtShared *pBt){ /* Do some checking to help insure the file we opened really is ** a valid database file. */ - nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); + nPage = get4byte(28+(u8*)pPage1->aData); sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; @@ -7687,11 +7686,10 @@ static int balance_nonroot( Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */ Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */ u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */ - CellArray b; /* Parsed information on cells being balanced */ + CellArray b; /* Parsed information on cells being balanced */ memset(abDone, 0, sizeof(abDone)); - b.nCell = 0; - b.apCell = 0; + memset(&b, 0, sizeof(b)); pBt = pParent->pBt; assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); diff --git a/src/expr.c b/src/expr.c index 3a943a5a06..7dc03fa19c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4399,7 +4399,7 @@ expr_code_doover: sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); } #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - if( pDef->funcFlags & SQLITE_FUNC_OFFSET ){ + if( (pDef->funcFlags & SQLITE_FUNC_OFFSET)!=0 && ALWAYS(pFarg!=0) ){ Expr *pArg = pFarg->a[0].pExpr; if( pArg->op==TK_COLUMN ){ sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); diff --git a/src/main.c b/src/main.c index 3a25f3bac1..7b4c8938c0 100644 --- a/src/main.c +++ b/src/main.c @@ -1819,7 +1819,6 @@ int sqlite3CreateFunc( FuncDestructor *pDestructor ){ FuncDef *p; - int nName; int extraFlags; assert( sqlite3_mutex_held(db->mutex) ); @@ -1829,7 +1828,7 @@ int sqlite3CreateFunc( || ((xFinal==0)!=(xStep==0)) /* Both or neither of xFinal and xStep */ || ((xValue==0)!=(xInverse==0)) /* Both or neither of xValue, xInverse */ || (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) - || (255<(nName = sqlite3Strlen30( zFunctionName))) + || (255pOrderBy; - int nOrderBy = p->pOrderBy->nExpr; + int nOrderBy = ALWAYS(pOrderBy!=0) ? pOrderBy->nExpr : 0; sqlite3 *db = pParse->db; KeyInfo *pRet = sqlite3KeyInfoAlloc(db, nOrderBy+nExtra, 1); if( pRet ){ @@ -3335,6 +3335,7 @@ static int multiSelectOrderBy( for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){ struct ExprList_item *pItem; for(j=0, pItem=pOrderBy->a; ju.x.iOrderByCol>0 ); if( pItem->u.x.iOrderByCol==i ) break; } @@ -3361,6 +3362,7 @@ static int multiSelectOrderBy( struct ExprList_item *pItem; aPermute[0] = nOrderBy; for(i=1, pItem=pOrderBy->a; i<=nOrderBy; i++, pItem++){ + assert( pItem!=0 ); assert( pItem->u.x.iOrderByCol>0 ); assert( pItem->u.x.iOrderByCol<=p->pEList->nExpr ); aPermute[i] = pItem->u.x.iOrderByCol - 1; diff --git a/src/vdbe.c b/src/vdbe.c index fa98c244c6..4e39b5dc99 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5456,7 +5456,7 @@ case OP_Delete: { /* Invoke the update-hook if required. */ if( opflags & OPFLAG_NCHANGE ){ p->nChange++; - if( db->xUpdateCallback && HasRowid(pTab) ){ + if( db->xUpdateCallback && ALWAYS(pTab!=0) && HasRowid(pTab) ){ db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, pTab->zName, pC->movetoTarget); assert( pC->iDb>=0 ); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index f1307503ad..a15e5a5911 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1487,7 +1487,7 @@ char *sqlite3VdbeDisplayComment( if( zOpName[nOpName+1] ){ int seenCom = 0; char c; - zSynopsis = zOpName += nOpName + 1; + zSynopsis = zOpName + nOpName + 1; if( strncmp(zSynopsis,"IF ",3)==0 ){ sqlite3_snprintf(sizeof(zAlt), zAlt, "if %s goto P2", zSynopsis+3); zSynopsis = zAlt; diff --git a/src/vdbemem.c b/src/vdbemem.c index e67cd64124..723c40621e 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -200,6 +200,7 @@ int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ #ifndef SQLITE_OMIT_UTF16 int rc; #endif + assert( pMem!=0 ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE || desiredEnc==SQLITE_UTF16BE ); @@ -332,6 +333,7 @@ static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ ** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails. */ int sqlite3VdbeMemMakeWriteable(Mem *pMem){ + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){ @@ -356,6 +358,7 @@ int sqlite3VdbeMemMakeWriteable(Mem *pMem){ #ifndef SQLITE_OMIT_INCRBLOB int sqlite3VdbeMemExpandBlob(Mem *pMem){ int nByte; + assert( pMem!=0 ); assert( pMem->flags & MEM_Zero ); assert( (pMem->flags&MEM_Blob)!=0 || MemNullNochng(pMem) ); testcase( sqlite3_value_nochange(pMem) ); @@ -383,6 +386,7 @@ int sqlite3VdbeMemExpandBlob(Mem *pMem){ ** Make sure the given Mem is \u0000 terminated. */ int sqlite3VdbeMemNulTerminate(Mem *pMem){ + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); testcase( (pMem->flags & (MEM_Term|MEM_Str))==(MEM_Term|MEM_Str) ); testcase( (pMem->flags & (MEM_Term|MEM_Str))==0 ); @@ -410,6 +414,7 @@ int sqlite3VdbeMemNulTerminate(Mem *pMem){ int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ const int nByte = 32; + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( !(pMem->flags&MEM_Zero) ); assert( !(pMem->flags&(MEM_Str|MEM_Blob)) ); @@ -445,6 +450,7 @@ int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ sqlite3_context ctx; Mem t; assert( pFunc!=0 ); + assert( pMem!=0 ); assert( pFunc->xFinalize!=0 ); assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); @@ -595,6 +601,7 @@ static SQLITE_NOINLINE i64 memIntValue(Mem *pMem){ } i64 sqlite3VdbeIntValue(Mem *pMem){ int flags; + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( EIGHT_BYTE_ALIGNMENT(pMem) ); flags = pMem->flags; @@ -623,6 +630,7 @@ static SQLITE_NOINLINE double memRealValue(Mem *pMem){ return val; } double sqlite3VdbeRealValue(Mem *pMem){ + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( EIGHT_BYTE_ALIGNMENT(pMem) ); if( pMem->flags & MEM_Real ){ @@ -655,6 +663,7 @@ int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){ */ void sqlite3VdbeIntegerAffinity(Mem *pMem){ i64 ix; + assert( pMem!=0 ); assert( pMem->flags & MEM_Real ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); @@ -682,6 +691,7 @@ void sqlite3VdbeIntegerAffinity(Mem *pMem){ ** Convert pMem to type integer. Invalidate any prior representations. */ int sqlite3VdbeMemIntegerify(Mem *pMem){ + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); assert( EIGHT_BYTE_ALIGNMENT(pMem) ); @@ -696,6 +706,7 @@ int sqlite3VdbeMemIntegerify(Mem *pMem){ ** Invalidate any prior representations. */ int sqlite3VdbeMemRealify(Mem *pMem){ + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( EIGHT_BYTE_ALIGNMENT(pMem) ); @@ -729,6 +740,7 @@ int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ ** as much of the string as we can and ignore the rest. */ int sqlite3VdbeMemNumerify(Mem *pMem){ + assert( pMem!=0 ); testcase( pMem->flags & MEM_Int ); testcase( pMem->flags & MEM_Real ); testcase( pMem->flags & MEM_IntReal ); @@ -1080,6 +1092,7 @@ int sqlite3VdbeMemSetStr( int iLimit; /* Maximum allowed string or blob size */ u16 flags = 0; /* New value for pMem->flags */ + assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); diff --git a/src/wherecode.c b/src/wherecode.c index 5d9bed27c9..15e4aa8393 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1234,7 +1234,7 @@ static void whereIndexExprTrans( for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ i16 iRef = pIdx->aiColumn[iIdxCol]; if( iRef==XN_EXPR ){ - assert( aColExpr->a[iIdxCol].pExpr!=0 ); + assert( aColExpr!=0 && aColExpr->a[iIdxCol].pExpr!=0 ); x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; if( sqlite3ExprIsConstant(x.pIdxExpr) ) continue; w.xExprCallback = whereIndexExprTransNode; From e1e1a43a0f31269440d4d1270c44d140bc703c2b Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 5 Oct 2021 11:11:43 +0000 Subject: [PATCH 08/64] Simplifications to the preupdate_hook logic to make it easier to reason about, and reduce static analyzer warnings. FossilOrigin-Name: 91e3b98e06feaa5b70caf2266200d20d0ae4e432db147975c9f5959f93df7e7b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 9 +++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index f527b6861b..733e04bf87 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\sstatic-analyzer\swarnings. -D 2021-10-04T22:34:38.507 +C Simplifications\sto\sthe\spreupdate_hook\slogic\sto\smake\sit\seasier\sto\sreason\sabout,\nand\sreduce\sstatic\sanalyzer\swarnings. +D 2021-10-05T11:11:43.379 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 3f27a1eae01c8bbbb8cdef2f26bd8e6a2a7db08106ef7c3dcc990787a5da6e86 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c e4ed1897b74a25989b17a27f7e4a9ee22d40a7ba2fddebca047ca5cc59d9676b +F src/vdbe.c b42cf4c8518ef237586258528cd7ecff14134e1ceee741e6f95b68848b844eff F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5da112c02f9e8d0bcbed8bcf6bab9c227607a802e85c8f70b1ca628d24960dee -R ed158196d4eb2672db00add61a3b4690 +P 32f33f356931242b59c01b5df7e180941231e3d9c91577ad33aa4a01e9d59092 +R 40118fb23ffff22e883bc146535d4ef6 U drh -Z 3cde4d92fbbfe00106b388617e0f0f8e +Z 98cc5429b03c6a7bf82a3053dffda967 diff --git a/manifest.uuid b/manifest.uuid index 762d2b004f..caee1bba19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32f33f356931242b59c01b5df7e180941231e3d9c91577ad33aa4a01e9d59092 \ No newline at end of file +91e3b98e06feaa5b70caf2266200d20d0ae4e432db147975c9f5959f93df7e7b \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 4e39b5dc99..f7df923877 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5256,7 +5256,7 @@ case OP_Insert: { assert( (pOp->p5 & OPFLAG_ISNOOP) || HasRowid(pTab) ); }else{ pTab = 0; - zDb = 0; /* Not needed. Silence a compiler warning. */ + zDb = 0; } #ifdef SQLITE_ENABLE_PREUPDATE_HOOK @@ -5409,13 +5409,14 @@ case OP_Delete: { pC->movetoTarget = sqlite3BtreeIntegerKey(pC->uc.pCursor); } }else{ - zDb = 0; /* Not needed. Silence a compiler warning. */ - pTab = 0; /* Not needed. Silence a compiler warning. */ + zDb = 0; + pTab = 0; } #ifdef SQLITE_ENABLE_PREUPDATE_HOOK /* Invoke the pre-update-hook if required. */ - if( db->xPreUpdateCallback && pOp->p4.pTab ){ + assert( db->xPreUpdateCallback==0 || pTab==pOp->p4.pTab ); + if( db->xPreUpdateCallback && pTab ){ assert( !(opflags & OPFLAG_ISUPDATE) || HasRowid(pTab)==0 || (aMem[pOp->p3].flags & MEM_Int) From 8a0c42765de7a104e507adc414f0d94acfde74cc Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 5 Oct 2021 12:34:54 +0000 Subject: [PATCH 09/64] Ensure that geopoly does not invoke sqlite3_result_error_nomem() with a NULL pointer. FossilOrigin-Name: 2483310d15022b47109b44c86e100f5894be7a45a0568dfef6aea80e6c518654 --- ext/rtree/geopoly.c | 3 ++- ext/rtree/rtree.c | 7 ++++++- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index 484ceb4023..8c76123a45 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -305,13 +305,14 @@ static GeoPoly *geopolyFuncParam( ){ GeoPoly *p = 0; int nByte; + testcase( pCtx==0 ); if( sqlite3_value_type(pVal)==SQLITE_BLOB && (nByte = sqlite3_value_bytes(pVal))>=(4+6*sizeof(GeoCoord)) ){ const unsigned char *a = sqlite3_value_blob(pVal); int nVertex; if( a==0 ){ - sqlite3_result_error_nomem(pCtx); + if( pCtx ) sqlite3_result_error_nomem(pCtx); return 0; } nVertex = (a[1]<<16) + (a[2]<<8) + a[3]; diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 0e9a9ba0bd..2f95a71272 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -436,7 +436,12 @@ struct RtreeMatchArg { ** it is not, make it a no-op. */ #ifndef SQLITE_AMALGAMATION -# define testcase(X) +# ifdef SQLITE_COVERAGE_TEST + unsigned int sqlite3RtreeTestcase = 0; +# define testcase(X) if( X ){ sqlite3RtreeTestcase += __LINE__; } +# else +# define testcase(X) +# endif #endif /* diff --git a/manifest b/manifest index 733e04bf87..3bcd399773 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplifications\sto\sthe\spreupdate_hook\slogic\sto\smake\sit\seasier\sto\sreason\sabout,\nand\sreduce\sstatic\sanalyzer\swarnings. -D 2021-10-05T11:11:43.379 +C Ensure\sthat\sgeopoly\sdoes\snot\sinvoke\ssqlite3_result_error_nomem()\swith\sa\nNULL\spointer. +D 2021-10-05T12:34:54.148 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -393,8 +393,8 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c d575f6c796fcb8066fb38e3d5c604b31a13867fbee2713ffb190eff31e7bc04d -F ext/rtree/rtree.c bd862b5368c60d3494bcdf6ded2fe743cf0b855a1b2ff4c5b71c82ea0694ecb1 +F ext/rtree/geopoly.c 97a4a5b4065fb2c2fe8dd7991b0e0ea3144f3f385a844265f9b2a98ea7a42c51 +F ext/rtree/rtree.c f2658ccaf20c65f2c2d7b097e42aa71be7272a3b49af586a57d9eed8ceb8436f F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 32f33f356931242b59c01b5df7e180941231e3d9c91577ad33aa4a01e9d59092 -R 40118fb23ffff22e883bc146535d4ef6 +P 91e3b98e06feaa5b70caf2266200d20d0ae4e432db147975c9f5959f93df7e7b +R 50e6d5202614b0113708b86e660afec9 U drh -Z 98cc5429b03c6a7bf82a3053dffda967 +Z 4b50cc08c340a52012457074bd6d6040 diff --git a/manifest.uuid b/manifest.uuid index caee1bba19..72ed28517a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -91e3b98e06feaa5b70caf2266200d20d0ae4e432db147975c9f5959f93df7e7b \ No newline at end of file +2483310d15022b47109b44c86e100f5894be7a45a0568dfef6aea80e6c518654 \ No newline at end of file From 640574f61a18e8b8193d7d4b08fbe65922f661d4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 5 Oct 2021 13:00:50 +0000 Subject: [PATCH 10/64] Small change to FTS5 to help static analyzers understand that it is not dereferencing a NULL pointer. FossilOrigin-Name: 0d853df1b19a0270b2cb0ebdf5df8067572f19ab9a82d047cb047f3f9e850348 --- ext/fts5/fts5_main.c | 3 ++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 3dea6cafcb..fd3a9066b7 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1374,7 +1374,8 @@ static int fts5FilterMethod( pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->p.base.zErrMsg ); if( rc==SQLITE_OK ){ - if( pCsr->ePlan==FTS5_PLAN_ROWID ){ + if( pRowidEq!=0 ){ + assert( pCsr->ePlan==FTS5_PLAN_ROWID ); sqlite3_bind_value(pCsr->pStmt, 1, pRowidEq); }else{ sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iFirstRowid); diff --git a/manifest b/manifest index 3bcd399773..4468818d92 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sgeopoly\sdoes\snot\sinvoke\ssqlite3_result_error_nomem()\swith\sa\nNULL\spointer. -D 2021-10-05T12:34:54.148 +C Small\schange\sto\sFTS5\sto\shelp\sstatic\sanalyzers\sunderstand\sthat\sit\sis\snot\ndereferencing\sa\sNULL\spointer. +D 2021-10-05T13:00:50.994 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -120,7 +120,7 @@ F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7 F ext/fts5/fts5_expr.c 11cc2acd3d73fba0af0041a6887c49e8f54ac4d314fc3489cfdfc10836945ada F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 F ext/fts5/fts5_index.c 7d38db1d89cd1d0488d452c7eed725a612dec4df9346efec5dca76674e7ff1a0 -F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a +F ext/fts5/fts5_main.c 7c6092a53e6802962fa07b0fad3e61cb077b6c98b74b727d8d44ac2cf63bd914 F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 91e3b98e06feaa5b70caf2266200d20d0ae4e432db147975c9f5959f93df7e7b -R 50e6d5202614b0113708b86e660afec9 +P 2483310d15022b47109b44c86e100f5894be7a45a0568dfef6aea80e6c518654 +R 9285f1b08a8a281a7dc87624d697ac42 U drh -Z 4b50cc08c340a52012457074bd6d6040 +Z cf71305744e2964d45d264476deebc14 diff --git a/manifest.uuid b/manifest.uuid index 72ed28517a..3cac40d217 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2483310d15022b47109b44c86e100f5894be7a45a0568dfef6aea80e6c518654 \ No newline at end of file +0d853df1b19a0270b2cb0ebdf5df8067572f19ab9a82d047cb047f3f9e850348 \ No newline at end of file From 6a726fa17557cf550acb5e8e8dbca11f7d924004 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 5 Oct 2021 15:30:52 +0000 Subject: [PATCH 11/64] Fix separate compilation of json1.c, which was apparently broken by check-in [32f33f356931242b]. FossilOrigin-Name: 0c7ece6792d30bdb314e2a6e61d0c051c3619a2d749f8b1df7dc2b1f521388bf --- ext/misc/json1.c | 13 +++++++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 6aa4e97f9d..0a3e907be6 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -96,6 +96,19 @@ static const char jsonIsSpace[] = { typedef unsigned int u32; typedef unsigned short int u16; typedef unsigned char u8; +# if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) +# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +# endif +# if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +# elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +# else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +# endif #endif /* Objects */ diff --git a/manifest b/manifest index 4468818d92..a666dd2d25 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\schange\sto\sFTS5\sto\shelp\sstatic\sanalyzers\sunderstand\sthat\sit\sis\snot\ndereferencing\sa\sNULL\spointer. -D 2021-10-05T13:00:50.994 +C Fix\sseparate\scompilation\sof\sjson1.c,\swhich\swas\sapparently\sbroken\sby\ncheck-in\s[32f33f356931242b]. +D 2021-10-05T15:30:52.545 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -306,7 +306,7 @@ F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab900 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c 91a5594071143a4ab79c638fe9f059af1db09932faf2e704c3e29216a7d4f511 -F ext/misc/json1.c f204a61f7c4436261dcb0423ff48395ac53fcfc44ea3a74a77a2a4f47b8c61e2 +F ext/misc/json1.c 1a278d675235c1ccf096e8b83e1999aabbd2941edf96c9cfe00bd58386596aa0 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c 7dffa8cc89c7f2d73da4bd4ccea1bcbd2bd283e3bb4cea398df7c372a197291b @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2483310d15022b47109b44c86e100f5894be7a45a0568dfef6aea80e6c518654 -R 9285f1b08a8a281a7dc87624d697ac42 +P 0d853df1b19a0270b2cb0ebdf5df8067572f19ab9a82d047cb047f3f9e850348 +R 63be5c84a35184416ddc69495763d671 U drh -Z cf71305744e2964d45d264476deebc14 +Z d82694695e4c51961e1d1391abd9f9a9 diff --git a/manifest.uuid b/manifest.uuid index 3cac40d217..03416392ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d853df1b19a0270b2cb0ebdf5df8067572f19ab9a82d047cb047f3f9e850348 \ No newline at end of file +0c7ece6792d30bdb314e2a6e61d0c051c3619a2d749f8b1df7dc2b1f521388bf \ No newline at end of file From 7a3b4451a140c42b6acb6c61d96a15c52928052d Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 5 Oct 2021 17:41:12 +0000 Subject: [PATCH 12/64] Fixes for harmless static-analyzer warnings. This also makes the code easier for humans to understand. FossilOrigin-Name: 36177a62feeb4fa93ab6e3c6f4dbe1ddcf63bb02f93284abab979da0261b218e --- ext/fts5/fts5_config.c | 7 ++++- ext/fts5/fts5_expr.c | 2 +- ext/fts5/fts5_index.c | 26 +++++++++++++------ ext/fts5/fts5_storage.c | 5 +++- ext/rtree/geopoly.c | 2 ++ ext/session/sqlite3session.c | 50 ++++++++++++++++++++++++++++-------- manifest | 22 ++++++++-------- manifest.uuid | 2 +- 8 files changed, 83 insertions(+), 33 deletions(-) diff --git a/ext/fts5/fts5_config.c b/ext/fts5/fts5_config.c index 32335c9374..ab1a846b12 100644 --- a/ext/fts5/fts5_config.c +++ b/ext/fts5/fts5_config.c @@ -562,6 +562,7 @@ int sqlite3Fts5ConfigParse( z = fts5ConfigSkipWhitespace(z); if( z && *z=='=' ){ bOption = 1; + assert( zOne!=0 ); z++; if( bMustBeCol ) z = 0; } @@ -578,7 +579,11 @@ int sqlite3Fts5ConfigParse( rc = SQLITE_ERROR; }else{ if( bOption ){ - rc = fts5ConfigParseSpecial(pGlobal, pRet, zOne, zTwo?zTwo:"", pzErr); + rc = fts5ConfigParseSpecial(pGlobal, pRet, + ALWAYS(zOne)?zOne:"", + zTwo?zTwo:"", + pzErr + ); }else{ rc = fts5ConfigParseColumn(pRet, zOne, zTwo, pzErr); zOne = 0; diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 402371c69a..2d8b6144f2 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -1875,7 +1875,7 @@ int sqlite3Fts5ExprClonePhrase( sCtx.pPhrase = sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase)); } - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && ALWAYS(sCtx.pPhrase) ){ /* All the allocations succeeded. Put the expression object together. */ pNew->pIndex = pExpr->pIndex; pNew->pConfig = pExpr->pConfig; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index afba249e30..1e92784914 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3390,6 +3390,7 @@ static void fts5IterSetOutputs_Full(Fts5Iter *pIter, Fts5SegIter *pSeg){ } static void fts5IterSetOutputCb(int *pRc, Fts5Iter *pIter){ + assert( pIter!=0 || (*pRc)!=SQLITE_OK ); if( *pRc==SQLITE_OK ){ Fts5Config *pConfig = pIter->pIndex->pConfig; if( pConfig->eDetail==FTS5_DETAIL_NONE ){ @@ -3461,7 +3462,10 @@ static void fts5MultiIterNew( } } *ppOut = pNew = fts5MultiIterAlloc(p, nSeg); - if( pNew==0 ) return; + if( pNew==0 ){ + assert( p->rc!=SQLITE_OK ); + goto fts5MultiIterNew_post_check; + } pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); pNew->pColset = pColset; @@ -3525,6 +3529,10 @@ static void fts5MultiIterNew( fts5MultiIterFree(pNew); *ppOut = 0; } + +fts5MultiIterNew_post_check: + assert( (*ppOut)!=0 || p->rc!=SQLITE_OK ); + return; } /* @@ -6203,6 +6211,7 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum){ Fts5Buffer poslist = {0,0,0}; /* Buffer used to hold a poslist */ Fts5Iter *pIter; /* Used to iterate through entire index */ Fts5Structure *pStruct; /* Index structure */ + int iLvl, iSeg; #ifdef SQLITE_DEBUG /* Used by extra internal tests only run if NDEBUG is not defined */ @@ -6213,15 +6222,16 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum){ /* Load the FTS index structure */ pStruct = fts5StructureRead(p); + if( pStruct==0 ){ + assert( p->rc!=SQLITE_OK ); + return fts5IndexReturn(p); + } /* Check that the internal nodes of each segment match the leaves */ - if( pStruct ){ - int iLvl, iSeg; - for(iLvl=0; iLvlnLevel; iLvl++){ - for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ - Fts5StructureSegment *pSeg = &pStruct->aLevel[iLvl].aSeg[iSeg]; - fts5IndexIntegrityCheckSegment(p, pSeg); - } + for(iLvl=0; iLvlnLevel; iLvl++){ + for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ + Fts5StructureSegment *pSeg = &pStruct->aLevel[iLvl].aSeg[iSeg]; + fts5IndexIntegrityCheckSegment(p, pSeg); } } diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index c5052b0478..532b4980b7 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -1058,8 +1058,9 @@ int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol){ assert( p->pConfig->bColumnsize ); rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP_DOCSIZE, &pLookup, 0); - if( rc==SQLITE_OK ){ + if( pLookup ){ int bCorrupt = 1; + assert( rc==SQLITE_OK ); sqlite3_bind_int64(pLookup, 1, iRowid); if( SQLITE_ROW==sqlite3_step(pLookup) ){ const u8 *aBlob = sqlite3_column_blob(pLookup, 0); @@ -1072,6 +1073,8 @@ int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol){ if( bCorrupt && rc==SQLITE_OK ){ rc = FTS5_CORRUPT; } + }else{ + assert( rc!=SQLITE_OK ); } return rc; diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index 8c76123a45..98ea718f5a 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -1387,6 +1387,7 @@ static int geopolyFilter( RtreeCoord bbox[4]; RtreeConstraint *p; assert( argc==1 ); + assert( argv[0]!=0 ); geopolyBBox(0, argv[0], bbox, &rc); if( rc ){ goto geopoly_filter_end; @@ -1614,6 +1615,7 @@ static int geopolyUpdate( || !sqlite3_value_nochange(aData[2]) /* UPDATE _shape */ || oldRowid!=newRowid) /* Rowid change */ ){ + assert( aData[2]!=0 ); geopolyBBox(0, aData[2], cell.aCoord, &rc); if( rc ){ if( rc==SQLITE_ERROR ){ diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index b404e5b267..a892804b49 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -1025,16 +1025,32 @@ static int sessionTableInfo( }else if( rc==SQLITE_ERROR ){ zPragma = sqlite3_mprintf(""); }else{ + *pazCol = 0; + *pabPK = 0; + *pnCol = 0; + if( pzTab ) *pzTab = 0; return rc; } }else{ zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis); } - if( !zPragma ) return SQLITE_NOMEM; + if( !zPragma ){ + *pazCol = 0; + *pabPK = 0; + *pnCol = 0; + if( pzTab ) *pzTab = 0; + return SQLITE_NOMEM; + } rc = sqlite3_prepare_v2(db, zPragma, -1, &pStmt, 0); sqlite3_free(zPragma); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_OK ){ + *pazCol = 0; + *pabPK = 0; + *pnCol = 0; + if( pzTab ) *pzTab = 0; + return rc; + } nByte = nThis + 1; while( SQLITE_ROW==sqlite3_step(pStmt) ){ @@ -1452,7 +1468,11 @@ static int sessionFindTable( ){ rc = sqlite3session_attach(pSession, zName); if( rc==SQLITE_OK ){ - for(pRet=pSession->pTable; pRet->pNext; pRet=pRet->pNext); + pRet = pSession->pTable; + while( ALWAYS(pRet) && pRet->pNext ){ + pRet = pRet->pNext; + } + assert( pRet!=0 ); assert( 0==sqlite3_strnicmp(pRet->zName, zName, nName+1) ); } } @@ -2225,6 +2245,7 @@ static int sessionAppendUpdate( int i; /* Used to iterate through columns */ u8 *pCsr = p->aRecord; /* Used to iterate through old.* values */ + assert( abPK!=0 ); sessionAppendByte(pBuf, SQLITE_UPDATE, &rc); sessionAppendByte(pBuf, p->bIndirect, &rc); for(i=0; ipTable; rc==SQLITE_OK && pTab; pTab=pTab->pNext){ if( pTab->nEntry ){ const char *zName = pTab->zName; - int nCol; /* Number of columns in table */ - u8 *abPK; /* Primary key array */ + int nCol = 0; /* Number of columns in table */ + u8 *abPK = 0; /* Primary key array */ const char **azCol = 0; /* Table columns */ int i; /* Used to iterate through hash buckets */ sqlite3_stmt *pSel = 0; /* SELECT statement to query table pTab */ @@ -2587,6 +2610,7 @@ static int sessionGenerateChangeset( sessionAppendCol(&buf, pSel, iCol, &rc); } }else{ + assert( abPK!=0 ); /* Because sessionSelectStmt() returned ok */ rc = sessionAppendUpdate(&buf, bPatchset, pSel, p, abPK); } }else if( p->op!=SQLITE_INSERT ){ @@ -2647,7 +2671,10 @@ int sqlite3session_changeset( int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ void **ppChangeset /* OUT: Buffer containing changeset */ ){ - int rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset,ppChangeset); + int rc; + + if( pnChangeset==0 || ppChangeset==0 ) return SQLITE_MISUSE; + rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset,ppChangeset); assert( rc || pnChangeset==0 || pSession->bEnableSize==0 || *pnChangeset<=pSession->nMaxChangesetSize ); @@ -2662,6 +2689,7 @@ int sqlite3session_changeset_strm( int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ){ + if( xOutput==0 ) return SQLITE_MISUSE; return sessionGenerateChangeset(pSession, 0, xOutput, pOut, 0, 0); } @@ -2673,6 +2701,7 @@ int sqlite3session_patchset_strm( int (*xOutput)(void *pOut, const void *pData, int nData), void *pOut ){ + if( xOutput==0 ) return SQLITE_MISUSE; return sessionGenerateChangeset(pSession, 1, xOutput, pOut, 0, 0); } @@ -2688,6 +2717,7 @@ int sqlite3session_patchset( int *pnPatchset, /* OUT: Size of buffer at *ppChangeset */ void **ppPatchset /* OUT: Buffer containing changeset */ ){ + if( pnPatchset==0 || ppPatchset==0 ) return SQLITE_MISUSE; return sessionGenerateChangeset(pSession, 1, 0, 0, pnPatchset, ppPatchset); } @@ -5254,9 +5284,9 @@ static int sessionChangegroupOutput( if( rc==SQLITE_OK ){ if( xOutput ){ if( buf.nBuf>0 ) rc = xOutput(pOut, buf.aBuf, buf.nBuf); - }else{ + }else if( ppOut ){ *ppOut = buf.aBuf; - *pnOut = buf.nBuf; + if( pnOut ) *pnOut = buf.nBuf; buf.aBuf = 0; } } @@ -5656,7 +5686,7 @@ static int sessionRebase( if( sOut.nBuf>0 ){ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); } - }else{ + }else if( ppOut ){ *ppOut = (void*)sOut.aBuf; *pnOut = sOut.nBuf; sOut.aBuf = 0; diff --git a/manifest b/manifest index a666dd2d25..0dc89ceaed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sseparate\scompilation\sof\sjson1.c,\swhich\swas\sapparently\sbroken\sby\ncheck-in\s[32f33f356931242b]. -D 2021-10-05T15:30:52.545 +C Fixes\sfor\sharmless\sstatic-analyzer\swarnings.\s\sThis\salso\smakes\sthe\scode\seasier\nfor\shumans\sto\sunderstand. +D 2021-10-05T17:41:12.259 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,12 +116,12 @@ F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca F ext/fts5/fts5Int.h a453bdbc5741c8e4014fa232f06a954f7bec4460f3d840aaac95404118436ddc F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938df59a1347f -F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 -F ext/fts5/fts5_expr.c 11cc2acd3d73fba0af0041a6887c49e8f54ac4d314fc3489cfdfc10836945ada +F ext/fts5/fts5_config.c 501e7d3566bc92766b0e11c0109a7c5a6146bc41144195459af5422f6c2078aa +F ext/fts5/fts5_expr.c cd2058668122c316c8bd24ccbdbc91da7d34862b180508f3cf1de02abf0d9c6f F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 7d38db1d89cd1d0488d452c7eed725a612dec4df9346efec5dca76674e7ff1a0 +F ext/fts5/fts5_index.c 10be19396b59d327ecc708ff07ba3733f93f6e5669e80d5c67a00387976245cf F ext/fts5/fts5_main.c 7c6092a53e6802962fa07b0fad3e61cb077b6c98b74b727d8d44ac2cf63bd914 -F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 +F ext/fts5/fts5_storage.c 8cad8ac7e6ff099a7923b49efb3f7409245333e3198381c8bf39169d0920e735 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c a2bed8edb25f6432e8cdb62aad5916935c19dba8dac2b8324950cfff397e25ff @@ -393,7 +393,7 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c 97a4a5b4065fb2c2fe8dd7991b0e0ea3144f3f385a844265f9b2a98ea7a42c51 +F ext/rtree/geopoly.c a7021cb524621573ccda213a35b0339371849dd4acc4909f689786ee1f964b7f F ext/rtree/rtree.c f2658ccaf20c65f2c2d7b097e42aa71be7272a3b49af586a57d9eed8ceb8436f F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f @@ -462,7 +462,7 @@ F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2 F ext/session/sessionsize.test 6f644aff31c7f1e4871e9ff3542766e18da68fc7e587b83a347ea9820a002dd8 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc -F ext/session/sqlite3session.c c710a6e34b6635794102dcd1ed2d594aa08e2d2ae6487ca4111e56c165dbce91 +F ext/session/sqlite3session.c 1d019c5caf51936ef24c761db63552b06e0e0d951c8740bba9639b17fa0cb107 F ext/session/sqlite3session.h 0907de79bc13a2e3af30a6dc29acc60792a3eaf7d33d44cf52500d0f3c2b2171 F ext/session/test_session.c f433f68a8a8c64b0f5bc74dc725078f12483301ad4ae8375205eef790274a787 F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0d853df1b19a0270b2cb0ebdf5df8067572f19ab9a82d047cb047f3f9e850348 -R 63be5c84a35184416ddc69495763d671 +P 0c7ece6792d30bdb314e2a6e61d0c051c3619a2d749f8b1df7dc2b1f521388bf +R d7869467529a1f693e58c2e82f050714 U drh -Z d82694695e4c51961e1d1391abd9f9a9 +Z e16dba19332e3dabfbb249ef117ed387 diff --git a/manifest.uuid b/manifest.uuid index 03416392ec..6a8ec75ab4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c7ece6792d30bdb314e2a6e61d0c051c3619a2d749f8b1df7dc2b1f521388bf \ No newline at end of file +36177a62feeb4fa93ab6e3c6f4dbe1ddcf63bb02f93284abab979da0261b218e \ No newline at end of file From d7ace22d8c53679986e176e7da45fe688819ba1f Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 5 Oct 2021 18:33:38 +0000 Subject: [PATCH 13/64] Fix more harmless static-analyzer warnings. As of this check-in, no warnings are generated by scan-build for clang-6 or clang-10. FossilOrigin-Name: a7835bead85b1b18a8affd9835240b0baf9c7af887196bbdcc3f5d58055042fc --- ext/fts5/fts5_index.c | 22 ++++++++++++++++------ ext/fts5/fts5_storage.c | 4 +++- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 1e92784914..aab09ef22b 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3166,7 +3166,11 @@ static void fts5SegiterPoslist( Fts5Colset *pColset, Fts5Buffer *pBuf ){ + assert( pBuf!=0 ); + assert( pSeg!=0 ); if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+FTS5_DATA_ZERO_PADDING) ){ + assert( pBuf->p!=0 ); + assert( pBuf->nSpace >= pBuf->n+pSeg->nPos+FTS5_DATA_ZERO_PADDING ); memset(&pBuf->p[pBuf->n+pSeg->nPos], 0, FTS5_DATA_ZERO_PADDING); if( pColset==0 ){ fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); @@ -3580,7 +3584,8 @@ static void fts5MultiIterNew2( ** False otherwise. */ static int fts5MultiIterEof(Fts5Index *p, Fts5Iter *pIter){ - assert( p->rc + assert( pIter!=0 || p->rc!=SQLITE_OK ); + assert( p->rc!=SQLITE_OK || (pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf==0)==pIter->base.bEof ); return (p->rc || pIter->base.bEof); @@ -4384,6 +4389,7 @@ static void fts5IndexMergeLevel( ** and last leaf page number at the same time. */ fts5WriteFinish(p, &writer, &pSeg->pgnoLast); + assert( pIter!=0 || p->rc!=SQLITE_OK ); if( fts5MultiIterEof(p, pIter) ){ int i; @@ -5594,11 +5600,15 @@ int sqlite3Fts5IndexQuery( /* Scan multiple terms in the main index */ int bDesc = (flags & FTS5INDEX_QUERY_DESC)!=0; fts5SetupPrefixIter(p, bDesc, iPrefixIdx, buf.p, nToken+1, pColset,&pRet); - assert( p->rc!=SQLITE_OK || pRet->pColset==0 ); - fts5IterSetOutputCb(&p->rc, pRet); - if( p->rc==SQLITE_OK ){ - Fts5SegIter *pSeg = &pRet->aSeg[pRet->aFirst[1].iFirst]; - if( pSeg->pLeaf ) pRet->xSetOutputs(pRet, pSeg); + if( pRet==0 ){ + assert( p->rc!=SQLITE_OK ); + }else{ + assert( pRet->pColset==0 ); + fts5IterSetOutputCb(&p->rc, pRet); + if( p->rc==SQLITE_OK ){ + Fts5SegIter *pSeg = &pRet->aSeg[pRet->aFirst[1].iFirst]; + if( pSeg->pLeaf ) pRet->xSetOutputs(pRet, pSeg); + } } } diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 532b4980b7..73b2cb518b 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -417,10 +417,12 @@ static int fts5StorageDeleteFromIndex( if( pConfig->abUnindexed[iCol-1]==0 ){ const char *zText; int nText; + assert( pSeek==0 || apVal==0 ); + assert( pSeek!=0 || apVal!=0 ); if( pSeek ){ zText = (const char*)sqlite3_column_text(pSeek, iCol); nText = sqlite3_column_bytes(pSeek, iCol); - }else{ + }else if( ALWAYS(apVal) ){ zText = (const char*)sqlite3_value_text(apVal[iCol-1]); nText = sqlite3_value_bytes(apVal[iCol-1]); } diff --git a/manifest b/manifest index 0dc89ceaed..f7a71609d4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fixes\sfor\sharmless\sstatic-analyzer\swarnings.\s\sThis\salso\smakes\sthe\scode\seasier\nfor\shumans\sto\sunderstand. -D 2021-10-05T17:41:12.259 +C Fix\smore\sharmless\sstatic-analyzer\swarnings.\s\sAs\sof\sthis\scheck-in,\sno\swarnings\nare\sgenerated\sby\sscan-build\sfor\sclang-6\sor\sclang-10. +D 2021-10-05T18:33:38.657 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,9 +119,9 @@ F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938d F ext/fts5/fts5_config.c 501e7d3566bc92766b0e11c0109a7c5a6146bc41144195459af5422f6c2078aa F ext/fts5/fts5_expr.c cd2058668122c316c8bd24ccbdbc91da7d34862b180508f3cf1de02abf0d9c6f F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 10be19396b59d327ecc708ff07ba3733f93f6e5669e80d5c67a00387976245cf +F ext/fts5/fts5_index.c 9f4f6e2c491d281ed0ed808fc0688abf3b355db775486dd547d35b60796f2430 F ext/fts5/fts5_main.c 7c6092a53e6802962fa07b0fad3e61cb077b6c98b74b727d8d44ac2cf63bd914 -F ext/fts5/fts5_storage.c 8cad8ac7e6ff099a7923b49efb3f7409245333e3198381c8bf39169d0920e735 +F ext/fts5/fts5_storage.c 21336839c02da46bdc1dbab80ed0c8f067cde26979df4ca626f85e5bc97f5cff F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c a2bed8edb25f6432e8cdb62aad5916935c19dba8dac2b8324950cfff397e25ff @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0c7ece6792d30bdb314e2a6e61d0c051c3619a2d749f8b1df7dc2b1f521388bf -R d7869467529a1f693e58c2e82f050714 +P 36177a62feeb4fa93ab6e3c6f4dbe1ddcf63bb02f93284abab979da0261b218e +R ada48f761a6f20e873e3032bbd67482f U drh -Z e16dba19332e3dabfbb249ef117ed387 +Z 8d90c6725f4f77280692c5e7bc68312f diff --git a/manifest.uuid b/manifest.uuid index 6a8ec75ab4..7e77599f58 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36177a62feeb4fa93ab6e3c6f4dbe1ddcf63bb02f93284abab979da0261b218e \ No newline at end of file +a7835bead85b1b18a8affd9835240b0baf9c7af887196bbdcc3f5d58055042fc \ No newline at end of file From 13ca72d011965ba63956434106e3f48c371862de Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 5 Oct 2021 18:59:05 +0000 Subject: [PATCH 14/64] Fix harmless compiler warnings, mostly caused by prior efforts to get static analyzers to run without warnings. FossilOrigin-Name: cddd3b382a118bb16be3a602ae711fe2c2a7d1c673dd30dd3977b67ee555e666 --- ext/fts5/fts5_storage.c | 2 ++ ext/misc/regexp.c | 4 ++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/date.c | 4 ++-- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 73b2cb518b..02b98d9e44 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -425,6 +425,8 @@ static int fts5StorageDeleteFromIndex( }else if( ALWAYS(apVal) ){ zText = (const char*)sqlite3_value_text(apVal[iCol-1]); nText = sqlite3_value_bytes(apVal[iCol-1]); + }else{ + continue; } ctx.szCol = 0; rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 99fb453cec..f282e777f0 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -299,9 +299,9 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ } case RE_OP_CC_EXC: { if( c==0 ) break; - /* fall-through */ + /* fall-through */ goto re_op_cc_inc; } - case RE_OP_CC_INC: { + case RE_OP_CC_INC: re_op_cc_inc: { int j = 1; int n = pRe->aArg[x]; int hit = 0; diff --git a/manifest b/manifest index f7a71609d4..53b4e28fb4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\smore\sharmless\sstatic-analyzer\swarnings.\s\sAs\sof\sthis\scheck-in,\sno\swarnings\nare\sgenerated\sby\sscan-build\sfor\sclang-6\sor\sclang-10. -D 2021-10-05T18:33:38.657 +C Fix\sharmless\scompiler\swarnings,\smostly\scaused\sby\sprior\sefforts\sto\sget\sstatic\nanalyzers\sto\srun\swithout\swarnings. +D 2021-10-05T18:59:05.694 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -121,7 +121,7 @@ F ext/fts5/fts5_expr.c cd2058668122c316c8bd24ccbdbc91da7d34862b180508f3cf1de02ab F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 F ext/fts5/fts5_index.c 9f4f6e2c491d281ed0ed808fc0688abf3b355db775486dd547d35b60796f2430 F ext/fts5/fts5_main.c 7c6092a53e6802962fa07b0fad3e61cb077b6c98b74b727d8d44ac2cf63bd914 -F ext/fts5/fts5_storage.c 21336839c02da46bdc1dbab80ed0c8f067cde26979df4ca626f85e5bc97f5cff +F ext/fts5/fts5_storage.c 76c6085239eb44424004c022e9da17a5ecd5aaec859fba90ad47d3b08f4c8082 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c a2bed8edb25f6432e8cdb62aad5916935c19dba8dac2b8324950cfff397e25ff @@ -316,7 +316,7 @@ F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1 F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d09ea61f F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 5853b0e5ed40c47f7ded2b0bf2ff73796f7cb21543089c5f07308e0032647b76 +F ext/misc/regexp.c 8cd0d2d904bf7014ba28beab8c1d502b5154e04a8c738b079d88e4ecca1b3981 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -497,7 +497,7 @@ F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 -F src/date.c 467848d8187382764e37fd7678d6825cdfb90d9e564648527ed832e999ea7b85 +F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 36177a62feeb4fa93ab6e3c6f4dbe1ddcf63bb02f93284abab979da0261b218e -R ada48f761a6f20e873e3032bbd67482f +P a7835bead85b1b18a8affd9835240b0baf9c7af887196bbdcc3f5d58055042fc +R 871647754fe41cfc5412c921cfce84b1 U drh -Z 8d90c6725f4f77280692c5e7bc68312f +Z 3eedb87d416452f83d5f1c6ef06cbe58 diff --git a/manifest.uuid b/manifest.uuid index 7e77599f58..c22d9436a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7835bead85b1b18a8affd9835240b0baf9c7af887196bbdcc3f5d58055042fc \ No newline at end of file +cddd3b382a118bb16be3a602ae711fe2c2a7d1c673dd30dd3977b67ee555e666 \ No newline at end of file diff --git a/src/date.c b/src/date.c index fb83ad1876..20a0a5d175 100644 --- a/src/date.c +++ b/src/date.c @@ -1025,7 +1025,7 @@ static void strftimeFunc( computeYMD_HMS(&x); for(i=j=0; zFmt[i]; i++){ if( zFmt[i]!='%' ) continue; - if( j Date: Tue, 5 Oct 2021 22:51:26 +0000 Subject: [PATCH 15/64] Fix a harmless typo in a comment. [forum:/forumpost/218c116fdf|forum post 218c116fdf]. FossilOrigin-Name: 8ca0c7d826622c9660ecbd9664eba2bac9bb1b850f96f35d6c959d0acde2309b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 53b4e28fb4..dd22b20dfb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings,\smostly\scaused\sby\sprior\sefforts\sto\sget\sstatic\nanalyzers\sto\srun\swithout\swarnings. -D 2021-10-05T18:59:05.694 +C Fix\sa\sharmless\stypo\sin\sa\scomment.\s\n[forum:/forumpost/218c116fdf|forum\spost\s218c116fdf]. +D 2021-10-05T22:51:26.698 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 57c2ac124795303fb2358c29dcadbb9de67cf34b16896a555f2abdb5fd68833c +F src/btree.c 15b8bdbcf4c26ca15ec420e8da440a6d170669ac2f3735deb1668d9f3284129e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a7835bead85b1b18a8affd9835240b0baf9c7af887196bbdcc3f5d58055042fc -R 871647754fe41cfc5412c921cfce84b1 +P cddd3b382a118bb16be3a602ae711fe2c2a7d1c673dd30dd3977b67ee555e666 +R 66ab677fa1633c50595275342f29b7c2 U drh -Z 3eedb87d416452f83d5f1c6ef06cbe58 +Z f208508751d7387f0db721ec9058f7f0 diff --git a/manifest.uuid b/manifest.uuid index c22d9436a3..4429e69f8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cddd3b382a118bb16be3a602ae711fe2c2a7d1c673dd30dd3977b67ee555e666 \ No newline at end of file +8ca0c7d826622c9660ecbd9664eba2bac9bb1b850f96f35d6c959d0acde2309b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 5d03ea80f5..fc1642a66a 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8500,7 +8500,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ ** Return SQLITE_CORRUPT if any cursor other than pCur is currently valid ** on the same B-tree as pCur. ** -** This can if a database is corrupt with two or more SQL tables +** This can occur if a database is corrupt with two or more SQL tables ** pointing to the same b-tree. If an insert occurs on one SQL table ** and causes a BEFORE TRIGGER to do a secondary insert on the other SQL ** table linked to the same b-tree. If the secondary insert causes a From 3768f175cc6e5940c37b3078f21acd36815bac28 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 6 Oct 2021 10:04:04 +0000 Subject: [PATCH 16/64] Once corner case for the fix at [8b24c177061c3836] was not quite right. Caught overnight by both OSSFuzz and dbsqlfuzz and repaired here. FossilOrigin-Name: 79e90a8225b90593e384eab49a8d1d3c93a3deaf2739dcc30f6c88852df80d04 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 2 +- test/transitive1.test | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index dd22b20dfb..37cbd99bb2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\stypo\sin\sa\scomment.\s\n[forum:/forumpost/218c116fdf|forum\spost\s218c116fdf]. -D 2021-10-05T22:51:26.698 +C Once\scorner\scase\sfor\sthe\sfix\sat\s[8b24c177061c3836]\swas\snot\squite\sright.\nCaught\sovernight\sby\sboth\sOSSFuzz\sand\sdbsqlfuzz\sand\srepaired\shere. +D 2021-10-06T10:04:04.566 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -636,7 +636,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 5d669d7c31f53d18a413eed69899f11d6e92a400a7c982d90eb6d8d301c73afb +F src/where.c f71086505c5db78209574eaffdb01c4e7beb745873ccba2cfcd4822232ef4e39 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c af9bc0608f07f6582affb0e4f30f95815cca080feb5359c2acc4558b48500604 F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 @@ -1627,7 +1627,7 @@ F test/trace3.test ae2004df24b585fed9046cc0bae4601762bc6fc4aa321d475f1350bba5047 F test/trans.test 45f6f9ab6f66a7b5744f1caac06b558f95da62501916906cf55586a896f9f439 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 -F test/transitive1.test d75f4c919bdbee75cb3968fb614f74f4bbb2a71823c048b2042af682f08c56df +F test/transitive1.test f8ee983600b33d167da1885657f064aec404e1c0d0bc8765fdf163f4c749237a F test/trigger1.test d30cd09ae8ac365a088f09daba583cc5c0b8fc7d4e1d70809d0b4be3bf6ae2ab F test/trigger2.test 6e35bd7321c49e63d540aee980eb95dec63e1d1caca175224101045bcc80871f F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cddd3b382a118bb16be3a602ae711fe2c2a7d1c673dd30dd3977b67ee555e666 -R 66ab677fa1633c50595275342f29b7c2 +P 8ca0c7d826622c9660ecbd9664eba2bac9bb1b850f96f35d6c959d0acde2309b +R a82f422056d918a0f8db241de201dfbf U drh -Z f208508751d7387f0db721ec9058f7f0 +Z 46af2b7b949b12f91845c5c99b37cb08 diff --git a/manifest.uuid b/manifest.uuid index 4429e69f8e..37f48fca33 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8ca0c7d826622c9660ecbd9664eba2bac9bb1b850f96f35d6c959d0acde2309b \ No newline at end of file +79e90a8225b90593e384eab49a8d1d3c93a3deaf2739dcc30f6c88852df80d04 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 45a6fb4a5e..63ac4e1c12 100644 --- a/src/where.c +++ b/src/where.c @@ -4610,9 +4610,9 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pLoop->wsFlags = 0; pLoop->nSkip = 0; pTerm = whereScanInit(&scan, pWC, iCur, -1, WO_EQ|WO_IS, 0); + while( pTerm && pTerm->prereqRight ) pTerm = whereScanNext(&scan); if( pTerm ){ testcase( pTerm->eOperator & WO_IS ); - assert( pTerm->prereqRight==0 ); pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW; pLoop->aLTerm[0] = pTerm; pLoop->nLTerm = 1; diff --git a/test/transitive1.test b/test/transitive1.test index 1161a4454e..80c53e8ffb 100644 --- a/test/transitive1.test +++ b/test/transitive1.test @@ -411,5 +411,19 @@ do_execsql_test transitive1-800 { SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE a=c AND b IS a); SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE c=a AND a IS b); } {} +do_execsql_test transitive1-810 { + CREATE TABLE t3(a INTEGER PRIMARY KEY,b); + INSERT INTO t3(a,b) VALUES(1,2),(5,5),(7,11); + SELECT * FROM t3 WHERE a=b AND a='5'; +} {5 5} +do_execsql_test transitive1-811 { + SELECT * FROM t3 WHERE a=b AND a='4'; +} {} +do_execsql_test transitive1-812 { + SELECT * FROM t3 WHERE a=b AND a='7'; +} {} +do_execsql_test transitive1-813 { + SELECT * FROM t3 WHERE a=b AND a='5x'; +} {} finish_test From 16a8f28e492507523c6b0b9d0bc0d9fd43c253a7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 6 Oct 2021 10:36:56 +0000 Subject: [PATCH 17/64] Fix a macro typo introduced by [5da112c02f9e8d0b] that prevented coverage tests from working. FossilOrigin-Name: 566e6974892ebd3d3de8d77b24655257a5efe14434c553e1a25fc680b201b336 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 37cbd99bb2..9b902ed70c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Once\scorner\scase\sfor\sthe\sfix\sat\s[8b24c177061c3836]\swas\snot\squite\sright.\nCaught\sovernight\sby\sboth\sOSSFuzz\sand\sdbsqlfuzz\sand\srepaired\shere. -D 2021-10-06T10:04:04.566 +C Fix\sa\smacro\stypo\sintroduced\sby\s[5da112c02f9e8d0b]\sthat\sprevented\scoverage\ntests\sfrom\sworking. +D 2021-10-06T10:36:56.583 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h ef9b68563e05d0da80cd291e7486bcc3ca7b787aae35b04b9285277957c2648a +F src/sqliteInt.h 67d38ee799cc34c36cdb0e4faebf0810d2722d0e4c7bd6b2cc6e7ae54e7211e6 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8ca0c7d826622c9660ecbd9664eba2bac9bb1b850f96f35d6c959d0acde2309b -R a82f422056d918a0f8db241de201dfbf +P 79e90a8225b90593e384eab49a8d1d3c93a3deaf2739dcc30f6c88852df80d04 +R 72dda00bb84c5fb21dc2438379b36ec1 U drh -Z 46af2b7b949b12f91845c5c99b37cb08 +Z f3fb5f8bb9c0563f6e2634c4bbe3df94 diff --git a/manifest.uuid b/manifest.uuid index 37f48fca33..b4f02642aa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -79e90a8225b90593e384eab49a8d1d3c93a3deaf2739dcc30f6c88852df80d04 \ No newline at end of file +566e6974892ebd3d3de8d77b24655257a5efe14434c553e1a25fc680b201b336 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d941de07ad..de3e6e97e5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -473,7 +473,7 @@ ** Disable ALWAYS() and NEVER() (make them pass-throughs) for coverage ** and mutation testing */ -#if defined(SQLITE_COVERATE_TEST) || defined(SQLITE_MUTATION_TEST) +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 #endif From 78b2fa8610bd2d149af7746faa79f095e505550c Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 7 Oct 2021 12:11:20 +0000 Subject: [PATCH 18/64] Protect every access to the Table.u union using a nearby assert() or branch. FossilOrigin-Name: 50e08338aed7ac0cee600098d2ecd4b3b7bfd31a597bb26773badf3d2e2582c8 --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/alter.c | 13 ++++++++----- src/build.c | 13 +++++++------ src/fkey.c | 14 ++++++-------- src/insert.c | 4 +++- src/pragma.c | 8 ++++---- src/vdbeblob.c | 2 +- src/vtab.c | 19 +++++++++++++++---- 9 files changed, 57 insertions(+), 42 deletions(-) diff --git a/manifest b/manifest index 9b902ed70c..f0cece1c11 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smacro\stypo\sintroduced\sby\s[5da112c02f9e8d0b]\sthat\sprevented\scoverage\ntests\sfrom\sworking. -D 2021-10-06T10:36:56.583 +C Protect\severy\saccess\sto\sthe\sTable.u\sunion\susing\sa\snearby\sassert()\sor\sbranch. +D 2021-10-07T12:11:20.389 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c a6afe961ef3544104fa635a0c3161bfe1a34382f32e2a28706993abadedbffed +F src/alter.c c3ef7565031b96f70c6d240929052cc2603e54df4a48025e2387104c804b2de6 F src/analyze.c 979b6d2cdaca992a9c9f0818de55d08fb9a4e52929a509752b52d9fd23bb86d3 F src/attach.c e5f9ab9700d545d49352db4865e9f4ba02085d244485729575b61da9fd3a7218 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -493,7 +493,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 15b8bdbcf4c26ca15ec420e8da440a6d170669ac2f3735deb1668d9f3284129e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001 +F src/build.c 56dd17ca5491f3992095353a569956b435cc669edb330b98b2e2ac8e99b010a1 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -503,14 +503,14 @@ F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/expr.c ac2bc8eef596443dfe04c3510eefda5dfdda9dac65cc8fef5a80c69fb4c24815 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c +F src/fkey.c 0c57a9cd2a0ecd04dde0c06e41df46959526f52a68c4409591e0f8c41a577042 F src/func.c 761a989e9b6a1f03cae05ef274f30881cb8f7ec816af2913b58dc18ac31ffd0e F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 16fa4b66709db6db5bb31475f2321d0a839269765aa2461a520c151c385e8b9d +F src/insert.c 042ad11fce0792944c6e3111a46c604318abc6fa4e90f5ad380e0c760b5e4e8a F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c 819f1e56cb8fc8d2d58cd5bbdbf60da0c48065a96a0d06617a5e5723ae2ddd05 @@ -542,7 +542,7 @@ F src/parse.y 82bdd593c50bddcc285a173e9788a20296103217f5f5290c9122abf8af71af62 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c +F src/pragma.c e92c2529978bfc0bbd5a7c48e5a18c35822d23997a7a10edfb94cb869e924666 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -626,12 +626,12 @@ F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 F src/vdbeaux.c e7d3d85ac3c64522f5077b18c6f7ae725026727f74d852fef416180060275b15 -F src/vdbeblob.c 60a7694760e35b2bba166cf49eb6a1eb0b31581102b49de78008ca3032406065 +F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 F src/vdbemem.c f4dcedec564688c957c7ac27c5e90a884dd5499cf37eb7cc50e33853e5313c97 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c -F src/vtab.c c289aa504f278f23b64cb33c95d284495c5f405bd363b419d31c92c61c14df1f +F src/vtab.c 3a6640d86d5dfae8f69715a1ee7405bb96d8982b39655b91c1f3648baae476a8 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 79e90a8225b90593e384eab49a8d1d3c93a3deaf2739dcc30f6c88852df80d04 -R 72dda00bb84c5fb21dc2438379b36ec1 +P 566e6974892ebd3d3de8d77b24655257a5efe14434c553e1a25fc680b201b336 +R d41a9f5eb518b0215c5b2591bb42bca2 U drh -Z f3fb5f8bb9c0563f6e2634c4bbe3df94 +Z e3f6ac0c0f243a0e136ac2fe16fdf41d diff --git a/manifest.uuid b/manifest.uuid index b4f02642aa..51a2123aa4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -566e6974892ebd3d3de8d77b24655257a5efe14434c553e1a25fc680b201b336 \ No newline at end of file +50e08338aed7ac0cee600098d2ecd4b3b7bfd31a597bb26773badf3d2e2582c8 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 81f6cf69d4..8b8fbf2be8 100644 --- a/src/alter.c +++ b/src/alter.c @@ -367,6 +367,7 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ if( pDflt && pDflt->pLeft->op==TK_NULL ){ pDflt = 0; } + assert( IsOrdinaryTable(pNew) ); if( (db->flags&SQLITE_ForeignKeys) && pNew->u.tab.pFKey && pDflt ){ sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a REFERENCES column with non-NULL default value"); @@ -409,7 +410,8 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ } /* substr() operations on characters, but addColOffset is in bytes. So we ** have to use printf() to translate between these units: */ - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); + assert( IsOrdinaryTable(pNew) ); sqlite3NestedParse(pParse, "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = printf('%%.%ds, ',sql) || %Q" @@ -503,6 +505,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ } sqlite3MayAbort(pParse); + assert( IsOrdinaryTable(pTab) ); assert( pTab->u.tab.addColOffset>0 ); iDb = sqlite3SchemaToIndex(db, pTab->pSchema); @@ -533,7 +536,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ pCol->zCnName = sqlite3DbStrDup(db, pCol->zCnName); pCol->hName = sqlite3StrIHash(pCol->zCnName); } - assert( !IsVirtual(pNew) ); + assert( IsOrdinaryTable(pNew) ); pNew->u.tab.pDfltList = sqlite3ExprListDup(db, pTab->u.tab.pDfltList, 0); pNew->pSchema = db->aDb[iDb].pSchema; pNew->u.tab.addColOffset = pTab->u.tab.addColOffset; @@ -1531,7 +1534,7 @@ static void renameColumnFunc( #endif } - assert( !IsVirtual(sParse.pNewTable) ); + assert( IsOrdinaryTable(sParse.pNewTable) ); for(pFKey=sParse.pNewTable->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ for(i=0; inCol; i++){ if( bFKOnly==0 && pFKey->aCol[i].iFrom==iCol ){ @@ -1721,7 +1724,7 @@ static void renameTableFunc( && !IsVirtual(pTab) ){ FKey *pFKey; - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){ renameTokenFind(&sParse, &sCtx, (void*)pFKey->zTo); @@ -2042,7 +2045,7 @@ static void dropColumnFunc( pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol+1].zCnName); zEnd = (const char*)pEnd->t.z; }else{ - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); zEnd = (const char*)&zSql[pTab->u.tab.addColOffset]; while( ALWAYS(pCol->t.z[0]!=0) && pCol->t.z[0]!=',' ) pCol->t.z--; } diff --git a/src/build.c b/src/build.c index f7d285c2b8..12d6b187c8 100644 --- a/src/build.c +++ b/src/build.c @@ -683,7 +683,7 @@ void sqlite3ColumnSetExpr( Expr *pExpr /* The new default expression */ ){ ExprList *pList; - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); pList = pTab->u.tab.pDfltList; if( pCol->iDflt==0 || NEVER(pList==0) @@ -704,7 +704,7 @@ void sqlite3ColumnSetExpr( */ Expr *sqlite3ColumnExpr(Table *pTab, Column *pCol){ if( pCol->iDflt==0 ) return 0; - if( NEVER(IsVirtual(pTab)) ) return 0; + if( NEVER(!IsOrdinaryTable(pTab)) ) return 0; if( NEVER(pTab->u.tab.pDfltList==0) ) return 0; if( NEVER(pTab->u.tab.pDfltList->nExpriDflt) ) return 0; return pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; @@ -763,13 +763,13 @@ void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ sqlite3DbFree(db, pCol->zCnName); } sqlite3DbFree(db, pTable->aCol); - if( !IsVirtual(pTable) ){ + if( IsOrdinaryTable(pTable) ){ sqlite3ExprListDelete(db, pTable->u.tab.pDfltList); } if( db==0 || db->pnBytesFreed==0 ){ pTable->aCol = 0; pTable->nCol = 0; - if( !IsVirtual(pTable) ){ + if( IsOrdinaryTable(pTable) ){ pTable->u.tab.pDfltList = 0; } } @@ -3549,6 +3549,7 @@ void sqlite3CreateForeignKey( goto fk_end; } pFKey->pFrom = p; + assert( IsOrdinaryTable(p) ); pFKey->pNextFrom = p->u.tab.pFKey; z = (char*)&pFKey->aCol[nCol]; pFKey->zTo = z; @@ -3614,7 +3615,7 @@ void sqlite3CreateForeignKey( /* Link the foreign key to the table as the last step. */ - assert( !IsVirtual(p) ); + assert( IsOrdinaryTable(p) ); p->u.tab.pFKey = pFKey; pFKey = 0; @@ -3637,7 +3638,7 @@ void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ Table *pTab; FKey *pFKey; if( (pTab = pParse->pNewTable)==0 ) return; - if( NEVER(IsVirtual(pTab)) ) return; + if( NEVER(!IsOrdinaryTable(pTab)) ) return; if( (pFKey = pTab->u.tab.pFKey)==0 ) return; assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */ pFKey->isDeferred = (u8)isDeferred; diff --git a/src/fkey.c b/src/fkey.c index 5888e558fb..7a82a1c130 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -720,13 +720,12 @@ static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){ */ void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ sqlite3 *db = pParse->db; - if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) ){ + if( (db->flags&SQLITE_ForeignKeys) && IsOrdinaryTable(pTab) ){ int iSkip = 0; Vdbe *v = sqlite3GetVdbe(pParse); assert( v ); /* VDBE has already been allocated */ - assert( !IsView(pTab) ); /* Not a view */ - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); if( sqlite3FkReferences(pTab)==0 ){ /* Search for a deferred foreign key constraint for which this table ** is the child table. If one cannot be found, return without @@ -890,13 +889,13 @@ void sqlite3FkCheck( /* If foreign-keys are disabled, this function is a no-op. */ if( (db->flags&SQLITE_ForeignKeys)==0 ) return; + if( !IsOrdinaryTable(pTab) ) return; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); zDb = db->aDb[iDb].zDbSName; /* Loop through all the foreign key constraints for which pTab is the ** child table (the table that the foreign key definition is part of). */ - assert( !IsVirtual(pTab) ); for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ Table *pTo; /* Parent table of foreign key pFKey */ Index *pIdx = 0; /* Index on key columns in pTo */ @@ -1079,10 +1078,9 @@ u32 sqlite3FkOldmask( Table *pTab /* Table being modified */ ){ u32 mask = 0; - if( pParse->db->flags&SQLITE_ForeignKeys ){ + if( pParse->db->flags&SQLITE_ForeignKeys && IsOrdinaryTable(pTab) ){ FKey *p; int i; - assert( !IsVirtual(pTab) ); for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){ for(i=0; inCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom); } @@ -1133,7 +1131,7 @@ int sqlite3FkRequired( ){ int eRet = 1; /* Value to return if bHaveFK is true */ int bHaveFK = 0; /* If FK processing is required */ - if( pParse->db->flags&SQLITE_ForeignKeys && !IsVirtual(pTab) ){ + if( pParse->db->flags&SQLITE_ForeignKeys && IsOrdinaryTable(pTab) ){ if( !aChange ){ /* A DELETE operation. Foreign key processing is required if the ** table in question is either the child or parent table for any @@ -1421,7 +1419,7 @@ void sqlite3FkDelete(sqlite3 *db, Table *pTab){ FKey *pFKey; /* Iterator variable */ FKey *pNext; /* Copy of pFKey->pNextFrom */ - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pNext){ assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); diff --git a/src/insert.c b/src/insert.c index acaafa0239..84b998a64d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2219,7 +2219,8 @@ void sqlite3GenerateConstraintChecks( ** ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row ** must be explicitly deleted in order to ensure any pre-update hook - ** is invoked. */ + ** is invoked. */ + assert( IsOrdinaryTable(pTab) ); #ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ @@ -2940,6 +2941,7 @@ static int xferOptimization( ** the extra complication to make this rule less restrictive is probably ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e] */ + assert( IsOrdinaryTable(pDest) ); if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->u.tab.pFKey!=0 ){ return 0; } diff --git a/src/pragma.c b/src/pragma.c index 8abbeb92ea..5a2c4e5552 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1408,7 +1408,7 @@ void sqlite3Pragma( FKey *pFK; Table *pTab; pTab = sqlite3FindTable(db, zRight, zDb); - if( pTab && !IsVirtual(pTab) ){ + if( pTab && IsOrdinaryTable(pTab) ){ pFK = pTab->u.tab.pFKey; if( pFK ){ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); @@ -1468,7 +1468,7 @@ void sqlite3Pragma( pTab = (Table*)sqliteHashData(k); k = sqliteHashNext(k); } - if( pTab==0 || IsVirtual(pTab) || pTab->u.tab.pFKey==0 ) continue; + if( pTab==0 || !IsOrdinaryTable(pTab) || pTab->u.tab.pFKey==0 ) continue; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); zDb = db->aDb[iDb].zDbSName; sqlite3CodeVerifySchema(pParse, iDb); @@ -1476,7 +1476,7 @@ void sqlite3Pragma( if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); sqlite3VdbeLoadString(v, regResult, pTab->zName); - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); if( pParent==0 ) continue; @@ -1499,7 +1499,7 @@ void sqlite3Pragma( if( pFK ) break; if( pParse->nTabnTab = i; addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v); - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); pIdx = 0; diff --git a/src/vdbeblob.c b/src/vdbeblob.c index cc427b9c34..9cf6b5495e 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -212,7 +212,7 @@ int sqlite3_blob_open( ** key columns must be indexed. The check below will pick up this ** case. */ FKey *pFKey; - assert( !IsVirtual(pTab) ); + assert( IsOrdinaryTable(pTab) ); for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ int j; for(j=0; jnCol; j++){ diff --git a/src/vtab.c b/src/vtab.c index 3c9b2f275f..9f742ec1ac 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -228,7 +228,10 @@ void sqlite3VtabUnlock(VTable *pVTab){ */ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ VTable *pRet = 0; - VTable *pVTable = p->u.vtab.p; + VTable *pVTable; + + assert( IsVirtual(p) ); + pVTable = p->u.vtab.p; p->u.vtab.p = 0; /* Assert that the mutex (if any) associated with the BtShared database @@ -336,6 +339,7 @@ void sqlite3VtabUnlockList(sqlite3 *db){ ** database connection. */ void sqlite3VtabClear(sqlite3 *db, Table *p){ + assert( IsVirtual(p) ); if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p); if( p->u.vtab.azArg ){ int i; @@ -353,9 +357,12 @@ void sqlite3VtabClear(sqlite3 *db, Table *p){ ** deleted. */ static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ - sqlite3_int64 nBytes = sizeof(char *)*(2+pTable->u.vtab.nArg); + sqlite3_int64 nBytes; char **azModuleArg; sqlite3 *db = pParse->db; + + assert( IsVirtual(pTable) ); + nBytes = sizeof(char *)*(2+pTable->u.vtab.nArg); if( pTable->u.vtab.nArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){ sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName); } @@ -442,6 +449,7 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ sqlite3 *db = pParse->db; /* The database connection */ if( pTab==0 ) return; + assert( IsVirtual(pTab) ); addArgumentToVtab(pParse); pParse->sArg.z = 0; if( pTab->u.vtab.nArg<1 ) return; @@ -559,13 +567,16 @@ static int vtabCallConstructor( VtabCtx sCtx; VTable *pVTable; int rc; - const char *const*azArg = (const char *const*)pTab->u.vtab.azArg; + const char *const*azArg; int nArg = pTab->u.vtab.nArg; char *zErr = 0; char *zModuleName; int iDb; VtabCtx *pCtx; + assert( IsVirtual(pTab) ); + azArg = (const char *const*)pTab->u.vtab.azArg; + /* Check that the virtual-table is not already being initialized */ for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){ if( pCtx->pTab==pTab ){ @@ -893,7 +904,7 @@ int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ Table *pTab; pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); - if( pTab!=0 && ALWAYS(pTab->u.vtab.p!=0) ){ + if( pTab!=0 && ALWAYS(IsVirtual(pTab)) && ALWAYS(pTab->u.vtab.p!=0) ){ VTable *p; int (*xDestroy)(sqlite3_vtab *); for(p=pTab->u.vtab.p; p; p=p->pNext){ From f9751074377d444231f7e9a05404a87051f10c8a Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 7 Oct 2021 13:40:29 +0000 Subject: [PATCH 19/64] Protect all accesses to the FuncDef.u and Expr.u unions using nearby assert()s or branches. FossilOrigin-Name: 9af863f065e0bef491c2ab7525194505f9516f4e6dfc789d2e3a9d2c2438533a --- manifest | 44 ++++++++++++++++++++++---------------------- manifest.uuid | 2 +- src/attach.c | 1 + src/build.c | 6 +++++- src/callback.c | 2 ++ src/expr.c | 17 ++++++++++++++--- src/func.c | 3 +++ src/insert.c | 2 ++ src/main.c | 4 +++- src/pragma.c | 12 +++++++----- src/resolve.c | 13 +++++++++++-- src/select.c | 2 ++ src/sqliteInt.h | 36 ++++++++++++++++++++++-------------- src/treeview.c | 10 ++++++++++ src/util.c | 1 + src/vdbeaux.c | 1 + src/vdbemem.c | 7 ++++++- src/whereexpr.c | 16 +++++++++++++--- src/window.c | 9 +++++---- 19 files changed, 131 insertions(+), 57 deletions(-) diff --git a/manifest b/manifest index f0cece1c11..39abbda31a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Protect\severy\saccess\sto\sthe\sTable.u\sunion\susing\sa\snearby\sassert()\sor\sbranch. -D 2021-10-07T12:11:20.389 +C Protect\sall\saccesses\sto\sthe\sFuncDef.u\sand\sExpr.u\sunions\susing\snearby\nassert()s\sor\sbranches. +D 2021-10-07T13:40:29.653 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c c3ef7565031b96f70c6d240929052cc2603e54df4a48025e2387104c804b2de6 F src/analyze.c 979b6d2cdaca992a9c9f0818de55d08fb9a4e52929a509752b52d9fd23bb86d3 -F src/attach.c e5f9ab9700d545d49352db4865e9f4ba02085d244485729575b61da9fd3a7218 +F src/attach.c e3f9d9a2a4a844750f3f348f37afb244535f21382cbfcd840152cb21cb41cfaf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d @@ -493,27 +493,27 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 15b8bdbcf4c26ca15ec420e8da440a6d170669ac2f3735deb1668d9f3284129e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 56dd17ca5491f3992095353a569956b435cc669edb330b98b2e2ac8e99b010a1 -F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c +F src/build.c da127abe7fe2e2095116ec5b253ab5c77e5107bd29bbd63e258935173836e29c +F src/callback.c 106b585da1edd57d75fa579d823a5218e0bf37f191dbf7417eeb4a8a9a267dbc F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c ac2bc8eef596443dfe04c3510eefda5dfdda9dac65cc8fef5a80c69fb4c24815 +F src/expr.c a2ceac9ee826c43d0943d1412bd8ef668db24fca57d2829453d13c6eb1dccb1c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0c57a9cd2a0ecd04dde0c06e41df46959526f52a68c4409591e0f8c41a577042 -F src/func.c 761a989e9b6a1f03cae05ef274f30881cb8f7ec816af2913b58dc18ac31ffd0e +F src/func.c 315c63812b5ad965158fccdb3c15b155f62d123d064efeda87d35b23fd5d529d F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 042ad11fce0792944c6e3111a46c604318abc6fa4e90f5ad380e0c760b5e4e8a +F src/insert.c b32e2dcbca838cb8acd4777a59243db4bcea53089e3181b0ea3e4dc75b43aeff F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c 819f1e56cb8fc8d2d58cd5bbdbf60da0c48065a96a0d06617a5e5723ae2ddd05 +F src/main.c d375bb6f761b3fa2cd2c1afaa5d4b282c7128a2c4d2fe7da6294fe8eaca9fa1a F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -542,19 +542,19 @@ F src/parse.y 82bdd593c50bddcc285a173e9788a20296103217f5f5290c9122abf8af71af62 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c e92c2529978bfc0bbd5a7c48e5a18c35822d23997a7a10edfb94cb869e924666 +F src/pragma.c 99feddb5e3dc249caa0b4725917209ad2a1976fd72a148cbff739dead0aff0ce F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d +F src/resolve.c efbb58ab3bf5ce041a8529f08866811148fca2ee079d5b919c7681319b5e5ebc F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c c49365e313d8b5338665d21139a07d2481c0340a2daf2f56fab1d8d526c1182e +F src/select.c 6b33d8197dad64015aca2031ee7ae67968c1532e812662fbce2406b39f46c278 F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 67d38ee799cc34c36cdb0e4faebf0810d2722d0e4c7bd6b2cc6e7ae54e7211e6 +F src/sqliteInt.h 398111a3db45b92158b81d1fb9d7add8907704e83d4190a3560ebcf2bae6a151 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -614,20 +614,20 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c 43f88d0fd19976a60aee6867959213b438593276f1e8179048df85f416a1ab19 +F src/treeview.c f8eaf6e9a237e7666ae18b47d7ff5a9091afdc5c2d2a08a493d41be24ce70c46 F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c 3f27a1eae01c8bbbb8cdef2f26bd8e6a2a7db08106ef7c3dcc990787a5da6e86 +F src/util.c 34b6b9a82ec6a15eaf94dd69cbb21362dffc9f27682ca1d6f1eccc352cf89d3e F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c b42cf4c8518ef237586258528cd7ecff14134e1ceee741e6f95b68848b844eff F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 -F src/vdbeaux.c e7d3d85ac3c64522f5077b18c6f7ae725026727f74d852fef416180060275b15 +F src/vdbeaux.c 897912feb91ec3cd8dedc3fce21d192fd6d37d299538a13d9d93100b22e4d4a0 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 -F src/vdbemem.c f4dcedec564688c957c7ac27c5e90a884dd5499cf37eb7cc50e33853e5313c97 +F src/vdbemem.c 51cb5d507a0f62cbf2ab6dd1f2042873807146d05920c6943955ecf4cec6529f F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -639,8 +639,8 @@ F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c f71086505c5db78209574eaffdb01c4e7beb745873ccba2cfcd4822232ef4e39 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c af9bc0608f07f6582affb0e4f30f95815cca080feb5359c2acc4558b48500604 -F src/whereexpr.c e5fdac355deef93a821f03b90770f92f2be833e92bbdeff8ac1b6c2ae1f74356 -F src/window.c f27e34e896f84e0bedec32b027d4531f224971ce3e16f8e1d97a968875ddcec1 +F src/whereexpr.c 108a89887ea4943c2573f43c0b37342e4a23afa215d88f5d137d205c7fd2f66a +F src/window.c 7bb95e7e6e1c7279ccaf1784c06ccf55c33303c1c2dc37aa4b13fab312b7bd50 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 566e6974892ebd3d3de8d77b24655257a5efe14434c553e1a25fc680b201b336 -R d41a9f5eb518b0215c5b2591bb42bca2 +P 50e08338aed7ac0cee600098d2ecd4b3b7bfd31a597bb26773badf3d2e2582c8 +R fc28982a1b3d34b40b6226fc2536da7e U drh -Z e3f6ac0c0f243a0e136ac2fe16fdf41d +Z 0841762a805ab21d382c6e505c7a82c1 diff --git a/manifest.uuid b/manifest.uuid index 51a2123aa4..6213e9d825 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -50e08338aed7ac0cee600098d2ecd4b3b7bfd31a597bb26773badf3d2e2582c8 \ No newline at end of file +9af863f065e0bef491c2ab7525194505f9516f4e6dfc789d2e3a9d2c2438533a \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 9c602f8c67..2123278c47 100644 --- a/src/attach.c +++ b/src/attach.c @@ -357,6 +357,7 @@ static void codeAttach( if( pAuthArg ){ char *zAuthArg; if( pAuthArg->op==TK_STRING ){ + assert( !ExprHasProperty(pAuthArg, EP_IntValue) ); zAuthArg = pAuthArg->u.zToken; }else{ zAuthArg = 0; diff --git a/src/build.c b/src/build.c index 12d6b187c8..58762bf370 100644 --- a/src/build.c +++ b/src/build.c @@ -1836,7 +1836,9 @@ void sqlite3AddPrimaryKey( assert( pCExpr!=0 ); sqlite3StringToId(pCExpr); if( pCExpr->op==TK_ID ){ - const char *zCName = pCExpr->u.zToken; + const char *zCName; + assert( !ExprHasProperty(pCExpr, EP_IntValue) ); + zCName = pCExpr->u.zToken; for(iCol=0; iColnCol; iCol++){ if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zCnName)==0 ){ pCol = &pTab->aCol[iCol]; @@ -4040,6 +4042,7 @@ void sqlite3CreateIndex( Expr *pExpr = pList->a[i].pExpr; assert( pExpr!=0 ); if( pExpr->op==TK_COLLATE ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); } } @@ -4135,6 +4138,7 @@ void sqlite3CreateIndex( zColl = 0; if( pListItem->pExpr->op==TK_COLLATE ){ int nColl; + assert( !ExprHasProperty(pListItem->pExpr, EP_IntValue) ); zColl = pListItem->pExpr->u.zToken; nColl = sqlite3Strlen30(zColl) + 1; assert( nExtra>=nColl ); diff --git a/src/callback.c b/src/callback.c index 421cef2814..936c374abd 100644 --- a/src/callback.c +++ b/src/callback.c @@ -337,6 +337,7 @@ FuncDef *sqlite3FunctionSearch( ){ FuncDef *p; for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ + assert( p->funcFlags & SQLITE_FUNC_BUILTIN ); if( sqlite3StrICmp(p->zName, zFunc)==0 ){ return p; } @@ -358,6 +359,7 @@ void sqlite3InsertBuiltinFuncs( int nName = sqlite3Strlen30(zName); int h = SQLITE_FUNC_HASH(zName[0], nName); assert( zName[0]>='a' && zName[0]<='z' ); + assert( aDef[i].funcFlags & SQLITE_FUNC_BUILTIN ); pOther = sqlite3FunctionSearch(h, zName); if( pOther ){ assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); diff --git a/src/expr.c b/src/expr.c index 7dc03fa19c..7d2558d2a5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -191,6 +191,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ continue; } if( op==TK_COLLATE ){ + assert( !ExprHasProperty(p, EP_IntValue) ); pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); break; } @@ -1216,7 +1217,10 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ #endif } } - if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); + if( ExprHasProperty(p, EP_MemToken) ){ + assert( !ExprHasProperty(p, EP_IntValue) ); + sqlite3DbFree(db, p->u.zToken); + } if( !ExprHasProperty(p, EP_Static) ){ sqlite3DbFreeNN(db, p); } @@ -2059,7 +2063,7 @@ u32 sqlite3IsTrueOrFalse(const char *zIn){ int sqlite3ExprIdToTrueFalse(Expr *pExpr){ u32 v; assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); - if( !ExprHasProperty(pExpr, EP_Quoted) + if( !ExprHasProperty(pExpr, EP_Quoted|EP_IntValue) && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0 ){ pExpr->op = TK_TRUEFALSE; @@ -2076,6 +2080,7 @@ int sqlite3ExprIdToTrueFalse(Expr *pExpr){ int sqlite3ExprTruthValue(const Expr *pExpr){ pExpr = sqlite3ExprSkipCollate((Expr*)pExpr); assert( pExpr->op==TK_TRUEFALSE ); + assert( !ExprHasProperty(pExpr, EP_IntValue) ); assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0 || sqlite3StrICmp(pExpr->u.zToken,"false")==0 ); return pExpr->u.zToken[4]==0; @@ -4142,6 +4147,7 @@ expr_code_doover: sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); inReg = target; } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3VdbeAddOp2(v, OP_Cast, target, sqlite3AffinityType(pExpr->u.zToken, 0)); return inReg; @@ -5421,7 +5427,12 @@ int sqlite3ExprCompare( } return 2; } - if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ + if( pA->op!=TK_COLUMN + && pA->op!=TK_AGG_COLUMN + && ALWAYS(!ExprHasProperty(pA, EP_IntValue)) + && pA->u.zToken + ){ + assert( !ExprHasProperty(pB, EP_IntValue) ); if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; #ifndef SQLITE_OMIT_WINDOWFUNC diff --git a/src/func.c b/src/func.c index 754ffc50ee..3e1bd86c47 100644 --- a/src/func.c +++ b/src/func.c @@ -1940,6 +1940,7 @@ int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ } assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); nExpr = pExpr->x.pList->nExpr; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION if( pDef==0 ) return 0; @@ -1963,6 +1964,7 @@ int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ Expr *pEscape = pExpr->x.pList->a[2].pExpr; char *zEscape; if( pEscape->op!=TK_STRING ) return 0; + assert( !ExprHasProperty(pEscape, EP_IntValue) ); zEscape = pEscape->u.zToken; if( zEscape[0]==0 || zEscape[1]!=0 ) return 0; if( zEscape[0]==aWc[0] ) return 0; @@ -2344,6 +2346,7 @@ void sqlite3RegisterBuiltinFunctions(void){ for(p=sqlite3BuiltinFunctions.a[i]; p; p=p->u.pHash){ int n = sqlite3Strlen30(p->zName); int h = p->zName[0] + n; + assert( p->funcFlags & SQLITE_FUNC_BUILTIN ); printf(" %s(%d)", p->zName, h); } printf("\n"); diff --git a/src/insert.c b/src/insert.c index 84b998a64d..d8948e6056 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2901,7 +2901,9 @@ static int xferOptimization( Expr *pDestExpr = sqlite3ColumnExpr(pDest, pDestCol); Expr *pSrcExpr = sqlite3ColumnExpr(pSrc, pSrcCol); assert( pDestExpr==0 || pDestExpr->op==TK_SPAN ); + assert( pDestExpr==0 || !ExprHasProperty(pDestExpr, EP_IntValue) ); assert( pSrcExpr==0 || pSrcExpr->op==TK_SPAN ); + assert( pSrcExpr==0 || !ExprHasProperty(pSrcExpr, EP_IntValue) ); if( (pDestExpr==0)!=(pSrcExpr==0) || (pDestExpr!=0 && strcmp(pDestExpr->u.zToken, pSrcExpr->u.zToken)!=0) diff --git a/src/main.c b/src/main.c index 7b4c8938c0..ade9bd0d9f 100644 --- a/src/main.c +++ b/src/main.c @@ -1138,7 +1138,9 @@ void sqlite3CloseSavepoints(sqlite3 *db){ ** with SQLITE_ANY as the encoding. */ static void functionDestroy(sqlite3 *db, FuncDef *p){ - FuncDestructor *pDestructor = p->u.pDestructor; + FuncDestructor *pDestructor; + assert( (p->funcFlags & SQLITE_FUNC_BUILTIN)==0 ); + pDestructor = p->u.pDestructor; if( pDestructor ){ pDestructor->nRef--; if( pDestructor->nRef==0 ){ diff --git a/src/pragma.c b/src/pragma.c index 5a2c4e5552..c731ba9b2f 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1157,6 +1157,7 @@ void sqlite3Pragma( sqlite3ViewGetColumnNames(pParse, pTab); for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ int isHidden = 0; + const Expr *pColExpr; if( pCol->colFlags & COLFLAG_NOINSERT ){ if( pPragma->iArg==0 ){ nHidden++; @@ -1177,16 +1178,15 @@ void sqlite3Pragma( }else{ for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } - assert( sqlite3ColumnExpr(pTab,pCol)==0 - || sqlite3ColumnExpr(pTab,pCol)->op==TK_SPAN - || isHidden>=2 ); + pColExpr = sqlite3ColumnExpr(pTab,pCol); + assert( pColExpr==0 || pColExpr->op==TK_SPAN || isHidden>=2 ); + assert( pColExpr==0 || !ExprHasProperty(pColExpr, EP_IntValue) ); sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", i-nHidden, pCol->zCnName, sqlite3ColumnType(pCol,""), pCol->notNull ? 1 : 0, - isHidden>=2 || sqlite3ColumnExpr(pTab,pCol)==0 ? 0 : - sqlite3ColumnExpr(pTab,pCol)->u.zToken, + (isHidden>=2 || pColExpr==0) ? 0 : pColExpr->u.zToken, k, isHidden); } @@ -1370,11 +1370,13 @@ void sqlite3Pragma( pParse->nMem = 6; for(i=0; iu.pHash ){ + assert( p->funcFlags & SQLITE_FUNC_BUILTIN ); pragmaFunclistLine(v, p, 1, showInternFunc); } } for(j=sqliteHashFirst(&db->aFunc); j; j=sqliteHashNext(j)){ p = (FuncDef*)sqliteHashData(j); + assert( (p->funcFlags & SQLITE_FUNC_BUILTIN)==0 ); pragmaFunclistLine(v, p, 0, showInternFunc); } } diff --git a/src/resolve.c b/src/resolve.c index f5065e1167..24c9509658 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -87,6 +87,7 @@ static void resolveAlias( }else{ incrAggFunctionDepth(pDup, nSubquery); if( pExpr->op==TK_COLLATE ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } @@ -743,6 +744,7 @@ static void notValidImpl( static int exprProbability(Expr *p){ double r = -1.0; if( p->op!=TK_FLOAT ) return -1; + assert( !ExprHasProperty(p, EP_IntValue) ); sqlite3AtoF(p->u.zToken, &r, sqlite3Strlen30(p->u.zToken), SQLITE_UTF8); assert( r>=0.0 ); if( r>1.0 ) return -1; @@ -823,6 +825,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3WalkExpr(pWalker, pExpr->pLeft); if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){ testcase( ExprHasProperty(pExpr, EP_FromJoin) ); + assert( !ExprHasProperty(pExpr, EP_IntValue) ); if( pExpr->op==TK_NOTNULL ){ pExpr->u.zToken = "true"; ExprSetProperty(pExpr, EP_IsTrue); @@ -858,6 +861,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_ID ){ zDb = 0; zTable = 0; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); zColumn = pExpr->u.zToken; }else{ Expr *pLeft = pExpr->pLeft; @@ -870,11 +874,14 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ zDb = 0; }else{ assert( pRight->op==TK_DOT ); + assert( !ExprHasProperty(pRight, EP_IntValue) ); zDb = pLeft->u.zToken; pLeft = pRight->pLeft; pRight = pRight->pRight; } + assert( !ExprHasProperty(pLeft, EP_IntValue) ); zTable = pLeft->u.zToken; + assert( !ExprHasProperty(pRight, EP_IntValue) ); zColumn = pRight->u.zToken; if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); @@ -900,7 +907,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #ifndef SQLITE_OMIT_WINDOWFUNC Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); #endif - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); zId = pExpr->u.zToken; nId = sqlite3Strlen30(zId); pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); @@ -1218,7 +1225,9 @@ static int resolveAsName( UNUSED_PARAMETER(pParse); if( pE->op==TK_ID ){ - char *zCol = pE->u.zToken; + const char *zCol; + assert( !ExprHasProperty(pE, EP_IntValue) ); + zCol = pE->u.zToken; for(i=0; inExpr; i++){ if( pEList->a[i].eEName==ENAME_NAME && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 diff --git a/src/select.c b/src/select.c index 84060cf346..d8047835ba 100644 --- a/src/select.c +++ b/src/select.c @@ -4901,6 +4901,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ ){ return eRet; } + assert( !ExprHasProperty(pFunc, EP_IntValue) ); zFunc = pFunc->u.zToken; if( sqlite3StrICmp(zFunc, "min")==0 ){ eRet = WHERE_ORDERBY_MIN; @@ -6177,6 +6178,7 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ if( p->pGroupBy ) return 0; pExpr = p->pEList->a[0].pExpr; if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */ if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */ if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index de3e6e97e5..b486d904d3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1810,7 +1810,7 @@ struct FuncDef { union { FuncDef *pHash; /* Next with a different name but the same hash */ FuncDestructor *pDestructor; /* Reference counted destructor function */ - } u; + } u; /* pHash if SQLITE_FUNC_BUILTIN, pDestructor otherwise */ }; /* @@ -1871,6 +1871,7 @@ struct FuncDestructor { #define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ #define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */ #define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */ +#define SQLITE_FUNC_BUILTIN 0x00800000 /* This is a built-in function */ #define SQLITE_FUNC_ANYORDER 0x08000000 /* count/min/max aggregate */ /* Identifier numbers for each in-line function */ @@ -1949,44 +1950,51 @@ struct FuncDestructor { ** parameter. */ #define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } #define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } #define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8|SQLITE_DIRECTONLY|SQLITE_FUNC_UNSAFE, \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_DIRECTONLY|SQLITE_FUNC_UNSAFE, \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } #define MFUNCTION(zName, nArg, xPtr, xFunc) \ - {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ xPtr, 0, xFunc, 0, 0, 0, #zName, {0} } #define INLINE_FUNC(zName, nArg, iArg, mFlags) \ - {nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } #define TEST_FUNC(zName, nArg, iArg, mFlags) \ - {nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \ SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } #define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ 0, 0, xFunc, 0, 0, 0, #zName, {0} } #define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ (void*)&sqlite3Config, 0, xFunc, 0, 0, 0, #zName, {0} } #define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ - {nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } #define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ - {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ pArg, 0, xFunc, 0, 0, 0, #zName, } #define LIKEFUNC(zName, nArg, arg, flags) \ - {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ (void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} } #define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \ - {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,xInverse,#zName, {0}} #define INTERNAL_FUNCTION(zName, nArg, xFunc) \ - {nArg, SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + {nArg, SQLITE_FUNC_BUILTIN|\ + SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ 0, 0, xFunc, 0, 0, 0, #zName, {0} } diff --git a/src/treeview.c b/src/treeview.c index 654e01a3ea..27fb69cd15 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -461,11 +461,13 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ } #ifndef SQLITE_OMIT_FLOATING_POINT case TK_FLOAT: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); break; } #endif case TK_STRING: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); break; } @@ -480,11 +482,13 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ } #ifndef SQLITE_OMIT_BLOB_LITERAL case TK_BLOB: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); break; } #endif case TK_VARIABLE: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", pExpr->u.zToken, pExpr->iColumn); break; @@ -494,12 +498,14 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_ID: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); break; } #ifndef SQLITE_OMIT_CAST case TK_CAST: { /* Expressions of the form: CAST(pLeft AS token) */ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); break; @@ -549,6 +555,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ } case TK_SPAN: { + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); break; @@ -560,6 +567,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ ** up in the treeview output as "SOFT-COLLATE". Explicit COLLATE ** operators that appear in the original SQL always have the ** EP_Collate bit set and appear in treeview output as just "COLLATE" */ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView, "%sCOLLATE %Q%s", !ExprHasProperty(pExpr, EP_Collate) ? "SOFT-" : "", pExpr->u.zToken, zFlgs); @@ -582,6 +590,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ pWin = 0; #endif } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); if( pExpr->op==TK_AGG_FUNCTION ){ sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s agg=%d[%d]/%p", pExpr->op2, pExpr->u.zToken, zFlgs, @@ -682,6 +691,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ case OE_Fail: zType = "fail"; break; case OE_Ignore: zType = "ignore"; break; } + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); break; } diff --git a/src/util.c b/src/util.c index 44c0195caf..d707a9bfcb 100644 --- a/src/util.c +++ b/src/util.c @@ -277,6 +277,7 @@ void sqlite3Dequote(char *z){ z[j] = 0; } void sqlite3DequoteExpr(Expr *p){ + assert( !ExprHasProperty(p, EP_IntValue) ); assert( sqlite3Isquote(p->u.zToken[0]) ); p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; sqlite3Dequote(p->u.zToken); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index a15e5a5911..da594993b6 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1560,6 +1560,7 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){ const char *zOp = 0; switch( pExpr->op ){ case TK_STRING: + assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3_str_appendf(p, "%Q", pExpr->u.zToken); break; case TK_INTEGER: diff --git a/src/vdbemem.c b/src/vdbemem.c index 723c40621e..73077b4881 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1420,6 +1420,7 @@ static int valueFromFunction( assert( (p->flags & EP_TokenOnly)==0 ); pList = p->x.pList; if( pList ) nVal = pList->nExpr; + assert( !ExprHasProperty(p, EP_IntValue) ); pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0); assert( pFunc ); if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 @@ -1523,7 +1524,9 @@ static int valueFromExpr( assert( (pExpr->flags & EP_TokenOnly)==0 || pCtx==0 ); if( op==TK_CAST ){ - u8 aff = sqlite3AffinityType(pExpr->u.zToken,0); + u8 aff; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + aff = sqlite3AffinityType(pExpr->u.zToken,0); rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); testcase( rc!=SQLITE_OK ); if( *ppVal ){ @@ -1596,6 +1599,7 @@ static int valueFromExpr( #ifndef SQLITE_OMIT_BLOB_LITERAL else if( op==TK_BLOB ){ int nVal; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); assert( pExpr->u.zToken[1]=='\'' ); pVal = valueNew(db, pCtx); @@ -1613,6 +1617,7 @@ static int valueFromExpr( } #endif else if( op==TK_TRUEFALSE ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); pVal = valueNew(db, pCtx); if( pVal ){ pVal->flags = MEM_Int; diff --git a/src/whereexpr.c b/src/whereexpr.c index 9b5d2cce9d..336de1d302 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -210,7 +210,8 @@ static int isLikeOrGlob( sqlite3VdbeSetVarmask(pParse->pVdbe, iCol); assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); }else if( op==TK_STRING ){ - z = (u8*)pRight->u.zToken; + assert( !ExprHasProperty(pRight, EP_IntValue) ); + z = (u8*)pRight->u.zToken; } if( z ){ @@ -239,7 +240,9 @@ static int isLikeOrGlob( pPrefix = sqlite3Expr(db, TK_STRING, (char*)z); if( pPrefix ){ int iFrom, iTo; - char *zNew = pPrefix->u.zToken; + char *zNew; + assert( !ExprHasProperty(pPrefix, EP_IntValue) ); + zNew = pPrefix->u.zToken; zNew[cnt] = 0; for(iFrom=iTo=0; iFrompVdbe; sqlite3VdbeSetVarmask(v, pRight->iColumn); + assert( !ExprHasProperty(pRight, EP_IntValue) ); if( *pisComplete && pRight->u.zToken[1] ){ /* If the rhs of the LIKE expression is a variable, and the current ** value of the variable means there is no need to invoke the LIKE @@ -380,6 +384,7 @@ static int isAuxiliaryVtabOperator( testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); if( ExprIsVtab(pCol) ){ for(i=0; iu.zToken, aOp[i].zOp)==0 ){ *peOp2 = aOp[i].eOp2; *ppRight = pList->a[0].pExpr; @@ -409,7 +414,8 @@ static int isAuxiliaryVtabOperator( pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab; assert( pVtab!=0 ); assert( pVtab->pModule!=0 ); - pMod = (sqlite3_module *)pVtab->pModule; + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + pMod = (sqlite3_module *)pVtab->pModule; if( pMod->xFindFunction!=0 ){ i = pMod->xFindFunction(pVtab,2, pExpr->u.zToken, &xNotUsed, &pNotUsed); if( i>=SQLITE_INDEX_CONSTRAINT_FUNCTION ){ @@ -1149,6 +1155,7 @@ static void exprAnalyze( && !ExprHasProperty(pExpr,EP_FromJoin) && 0==sqlite3ExprCanBeNull(pLeft) ){ + assert( !ExprHasProperty(pExpr, EP_IntValue) ); pExpr->op = TK_TRUEFALSE; pExpr->u.zToken = "false"; ExprSetProperty(pExpr, EP_IsFalse); @@ -1271,6 +1278,9 @@ static void exprAnalyze( pLeft = pExpr->x.pList->a[1].pExpr; pStr2 = sqlite3ExprDup(db, pStr1, 0); + assert( pStr1==0 || !ExprHasProperty(pStr1, EP_IntValue) ); + assert( pStr2==0 || !ExprHasProperty(pStr2, EP_IntValue) ); + /* Convert the lower bound to upper-case and the upper bound to ** lower-case (upper-case is less than lower-case in ASCII) so that diff --git a/src/window.c b/src/window.c index ba0e14e00d..89439913c1 100644 --- a/src/window.c +++ b/src/window.c @@ -581,7 +581,7 @@ static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ } /* Window functions that use all window interfaces: xStep, xFinal, ** xValue, and xInverse */ #define WINDOWFUNCALL(name,nArg,extra) { \ - nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ name ## StepFunc, name ## FinalizeFunc, name ## ValueFunc, \ name ## InvFunc, name ## Name, {0} \ } @@ -589,7 +589,7 @@ static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ } /* Window functions that are implemented using bytecode and thus have ** no-op routines for their methods */ #define WINDOWFUNCNOOP(name,nArg,extra) { \ - nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ noopStepFunc, noopValueFunc, noopValueFunc, \ noopStepFunc, name ## Name, {0} \ } @@ -598,7 +598,7 @@ static void noopValueFunc(sqlite3_context *p){ UNUSED_PARAMETER(p); /*no-op*/ } ** same routine for xFinalize and xValue and which never call ** xInverse. */ #define WINDOWFUNCX(name,nArg,extra) { \ - nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ + nArg, (SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ name ## StepFunc, name ## ValueFunc, name ## ValueFunc, \ noopStepFunc, name ## Name, {0} \ } @@ -941,7 +941,8 @@ static int sqlite3WindowExtraAggFuncDepth(Walker *pWalker, Expr *pExpr){ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_AGG_FUNCTION && pExpr->pAggInfo==0 ){ - sqlite3ErrorMsg(pWalker->pParse, + assert( !ExprHasProperty(pExpr, EP_IntValue) ); + sqlite3ErrorMsg(pWalker->pParse, "misuse of aggregate: %s()", pExpr->u.zToken); } return WRC_Continue; From 9d43db5b5c82a4242b97cd85c8950c3fcd1d6961 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 7 Oct 2021 14:19:32 +0000 Subject: [PATCH 20/64] Fix an incorrect assert() on PRAGMA table_xinfo added by the previous check-in. FossilOrigin-Name: f85cb287c52baa729aeb223038e979a3b74a1eb3d97bf59c01f5417998204f84 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pragma.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 39abbda31a..de179051f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Protect\sall\saccesses\sto\sthe\sFuncDef.u\sand\sExpr.u\sunions\susing\snearby\nassert()s\sor\sbranches. -D 2021-10-07T13:40:29.653 +C Fix\san\sincorrect\sassert()\son\sPRAGMA\stable_xinfo\sadded\sby\sthe\sprevious\scheck-in. +D 2021-10-07T14:19:32.259 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/parse.y 82bdd593c50bddcc285a173e9788a20296103217f5f5290c9122abf8af71af62 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c 99feddb5e3dc249caa0b4725917209ad2a1976fd72a148cbff739dead0aff0ce +F src/pragma.c a2458437f99b356681ff3d699943e7f0eeb7ad0a00abf00df60fd8132d41f1c1 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 50e08338aed7ac0cee600098d2ecd4b3b7bfd31a597bb26773badf3d2e2582c8 -R fc28982a1b3d34b40b6226fc2536da7e +P 9af863f065e0bef491c2ab7525194505f9516f4e6dfc789d2e3a9d2c2438533a +R eeba287e3c7adfad939bd3178ae64a7a U drh -Z 0841762a805ab21d382c6e505c7a82c1 +Z ead3dbf79919d143e014b4c2002fbeb0 diff --git a/manifest.uuid b/manifest.uuid index 6213e9d825..8d5c73ec26 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9af863f065e0bef491c2ab7525194505f9516f4e6dfc789d2e3a9d2c2438533a \ No newline at end of file +f85cb287c52baa729aeb223038e979a3b74a1eb3d97bf59c01f5417998204f84 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index c731ba9b2f..8bac047261 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1180,7 +1180,8 @@ void sqlite3Pragma( } pColExpr = sqlite3ColumnExpr(pTab,pCol); assert( pColExpr==0 || pColExpr->op==TK_SPAN || isHidden>=2 ); - assert( pColExpr==0 || !ExprHasProperty(pColExpr, EP_IntValue) ); + assert( pColExpr==0 || !ExprHasProperty(pColExpr, EP_IntValue) + || isHidden>=2 ); sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", i-nHidden, pCol->zCnName, From a4eeccdfdf9a9b4a5a007d17ac51f124656272d9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 7 Oct 2021 17:43:30 +0000 Subject: [PATCH 21/64] Protect all accesses to the Expr.x union using nearby assert()s and branches. FossilOrigin-Name: 8eaa1d4a98b24adf245bbd2fe9212aa6a924a0f09c445906d7f87574f36a7423 --- manifest | 34 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 104 +++++++++++++++++++++++++++++------------------- src/func.c | 2 +- src/resolve.c | 7 ++-- src/select.c | 58 +++++++++++++++++---------- src/sqliteInt.h | 10 +++++ src/treeview.c | 17 ++++++-- src/vdbemem.c | 1 + src/walker.c | 2 +- src/where.c | 13 +++--- src/wherecode.c | 19 ++++++--- src/whereexpr.c | 16 ++++++-- src/window.c | 19 +++++++-- 14 files changed, 197 insertions(+), 107 deletions(-) diff --git a/manifest b/manifest index de179051f3..4be9248ca9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\sassert()\son\sPRAGMA\stable_xinfo\sadded\sby\sthe\sprevious\scheck-in. -D 2021-10-07T14:19:32.259 +C Protect\sall\saccesses\sto\sthe\sExpr.x\sunion\susing\snearby\sassert()s\sand\sbranches. +D 2021-10-07T17:43:30.167 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -501,10 +501,10 @@ F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c a2ceac9ee826c43d0943d1412bd8ef668db24fca57d2829453d13c6eb1dccb1c +F src/expr.c 19c0b5c7afaf6a305274b7de312f319bd86e802383f08ef6633f0752f51d96a8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0c57a9cd2a0ecd04dde0c06e41df46959526f52a68c4409591e0f8c41a577042 -F src/func.c 315c63812b5ad965158fccdb3c15b155f62d123d064efeda87d35b23fd5d529d +F src/func.c 9577175a1459f65c9e3c4bbe7ed0bdf97ee928f693c81ee9f61e2642414c917c F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -547,14 +547,14 @@ F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c efbb58ab3bf5ce041a8529f08866811148fca2ee079d5b919c7681319b5e5ebc +F src/resolve.c 7f8954f49ddf18d16a13866593eb4f51a6deba8b30b2d877e27ef1b385cd94db F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 6b33d8197dad64015aca2031ee7ae67968c1532e812662fbce2406b39f46c278 +F src/select.c 6164779bdafadf23f506e87224095b73f27be519b242579bd9d24a6d6a53d9fb F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 398111a3db45b92158b81d1fb9d7add8907704e83d4190a3560ebcf2bae6a151 +F src/sqliteInt.h e62e6eab356e01a8cf1c88d0a2ec7e403e5d3b141b4816ec0b5ea23acd1fcd14 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -614,7 +614,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c f8eaf6e9a237e7666ae18b47d7ff5a9091afdc5c2d2a08a493d41be24ce70c46 +F src/treeview.c e80a6126f82c0cd0a939aa617c428329c6e2c3351b7d4dabb8b8a83c9b4e7696 F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -627,7 +627,7 @@ F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 F src/vdbeaux.c 897912feb91ec3cd8dedc3fce21d192fd6d37d299538a13d9d93100b22e4d4a0 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 -F src/vdbemem.c 51cb5d507a0f62cbf2ab6dd1f2042873807146d05920c6943955ecf4cec6529f +F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -635,12 +635,12 @@ F src/vtab.c 3a6640d86d5dfae8f69715a1ee7405bb96d8982b39655b91c1f3648baae476a8 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a -F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c f71086505c5db78209574eaffdb01c4e7beb745873ccba2cfcd4822232ef4e39 +F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b +F src/where.c 56e1902e9b91fb1fe159181a21c34abd59a01e2cb8f5ef4c3e478d32c5d838df F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c af9bc0608f07f6582affb0e4f30f95815cca080feb5359c2acc4558b48500604 -F src/whereexpr.c 108a89887ea4943c2573f43c0b37342e4a23afa215d88f5d137d205c7fd2f66a -F src/window.c 7bb95e7e6e1c7279ccaf1784c06ccf55c33303c1c2dc37aa4b13fab312b7bd50 +F src/wherecode.c 6721f5de1d74d952b473c3f2473ea36b4a3aafed2c0ae0edb02c7e8a6b908d43 +F src/whereexpr.c 01d87dc0d5fb0a18100a65ba5466e399f2b8d96b3ec8a6056cf2aac10436afa5 +F src/window.c 0dff6fedf61493490d21ced5d7a7b4321d4c0db6c8123f0179c46080a860850a F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9af863f065e0bef491c2ab7525194505f9516f4e6dfc789d2e3a9d2c2438533a -R eeba287e3c7adfad939bd3178ae64a7a +P f85cb287c52baa729aeb223038e979a3b74a1eb3d97bf59c01f5417998204f84 +R d1a38de85ec9395d66459f512bc9b39f U drh -Z ead3dbf79919d143e014b4c2002fbeb0 +Z a07d4736a8e9c697e3914dd4948a3735 diff --git a/manifest.uuid b/manifest.uuid index 8d5c73ec26..2451d9c2a4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f85cb287c52baa729aeb223038e979a3b74a1eb3d97bf59c01f5417998204f84 \ No newline at end of file +8eaa1d4a98b24adf245bbd2fe9212aa6a924a0f09c445906d7f87574f36a7423 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 7d2558d2a5..01f6ae4199 100644 --- a/src/expr.c +++ b/src/expr.c @@ -57,7 +57,7 @@ char sqlite3ExprAffinity(const Expr *pExpr){ return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); } if( op==TK_SELECT ){ - assert( pExpr->flags&EP_xIsSelect ); + assert( ExprUseXSelect(pExpr) ); assert( pExpr->x.pSelect!=0 ); assert( pExpr->x.pSelect->pEList!=0 ); assert( pExpr->x.pSelect->pEList->a[0].pExpr!=0 ); @@ -70,7 +70,7 @@ char sqlite3ExprAffinity(const Expr *pExpr){ } #endif if( op==TK_SELECT_COLUMN ){ - assert( pExpr->pLeft->flags&EP_xIsSelect ); + assert( pExpr->pLeft!=0 && ExprUseXSelect(pExpr->pLeft) ); assert( pExpr->iColumn < pExpr->iTable ); assert( pExpr->iTable==pExpr->pLeft->x.pSelect->pEList->nExpr ); return sqlite3ExprAffinity( @@ -78,6 +78,7 @@ char sqlite3ExprAffinity(const Expr *pExpr){ ); } if( op==TK_VECTOR ){ + assert( ExprUseXList(pExpr) ); return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr); } return pExpr->affExpr; @@ -137,7 +138,7 @@ Expr *sqlite3ExprSkipCollate(Expr *pExpr){ Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ if( ExprHasProperty(pExpr, EP_Unlikely) ){ - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( ExprUseXList(pExpr) ); assert( pExpr->x.pList->nExpr>0 ); assert( pExpr->op==TK_FUNCTION ); pExpr = pExpr->x.pList->a[0].pExpr; @@ -187,6 +188,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ continue; } if( op==TK_VECTOR ){ + assert( ExprUseXList(p) ); p = p->x.pList->a[0].pExpr; continue; } @@ -201,11 +203,9 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ }else{ Expr *pNext = p->pRight; /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( ExprUseXList(p) ); assert( p->x.pList==0 || p->pRight==0 ); - if( p->x.pList!=0 - && !db->mallocFailed - && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) - ){ + if( p->x.pList!=0 && !db->mallocFailed ){ int i; for(i=0; ALWAYS(ix.pList->nExpr); i++){ if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ @@ -288,7 +288,7 @@ static char comparisonAffinity(const Expr *pExpr){ aff = sqlite3ExprAffinity(pExpr->pLeft); if( pExpr->pRight ){ aff = sqlite3CompareAffinity(pExpr->pRight, aff); - }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + }else if( ExprUseXSelect(pExpr) ){ aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); }else if( aff==0 ){ aff = SQLITE_AFF_BLOB; @@ -428,8 +428,10 @@ int sqlite3ExprVectorSize(const Expr *pExpr){ u8 op = pExpr->op; if( op==TK_REGISTER ) op = pExpr->op2; if( op==TK_VECTOR ){ + assert( ExprUseXList(pExpr) ); return pExpr->x.pList->nExpr; }else if( op==TK_SELECT ){ + assert( ExprUseXSelect(pExpr) ); return pExpr->x.pSelect->pEList->nExpr; }else{ return 1; @@ -456,8 +458,10 @@ Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ if( sqlite3ExprIsVector(pVector) ){ assert( pVector->op2==0 || pVector->op==TK_REGISTER ); if( pVector->op==TK_SELECT || pVector->op2==TK_SELECT ){ + assert( ExprUseXSelect(pVector) ); return pVector->x.pSelect->pEList->a[i].pExpr; }else{ + assert( ExprUseXList(pVector) ); return pVector->x.pList->a[i].pExpr; } } @@ -493,7 +497,7 @@ Expr *sqlite3ExprForVectorField( ){ Expr *pRet; if( pVector->op==TK_SELECT ){ - assert( pVector->flags & EP_xIsSelect ); + assert( ExprUseXSelect(pVector) ); /* The TK_SELECT_COLUMN Expr node: ** ** pLeft: pVector containing TK_SELECT. Not deleted. @@ -518,7 +522,9 @@ Expr *sqlite3ExprForVectorField( } }else{ if( pVector->op==TK_VECTOR ){ - Expr **ppVector = &pVector->x.pList->a[iField].pExpr; + Expr **ppVector; + assert( ExprUseXList(pVector) ); + ppVector = &pVector->x.pList->a[iField].pExpr; pVector = *ppVector; if( IN_RENAME_OBJECT ){ /* This must be a vector UPDATE inside a trigger */ @@ -582,10 +588,12 @@ static int exprVectorRegister( return pVector->iTable+iField; } if( op==TK_SELECT ){ + assert( ExprUseXSelect(pVector) ); *ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr; return regSelect+iField; } if( op==TK_VECTOR ){ + assert( ExprUseXList(pVector) ); *ppExpr = pVector->x.pList->a[iField].pExpr; return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); } @@ -760,7 +768,7 @@ static void exprSetHeight(Expr *p){ int nHeight = 0; heightOfExpr(p->pLeft, &nHeight); heightOfExpr(p->pRight, &nHeight); - if( ExprHasProperty(p, EP_xIsSelect) ){ + if( ExprUseXSelect(p) ){ heightOfSelect(p->x.pSelect, &nHeight); }else if( p->x.pList ){ heightOfExprList(p->x.pList, &nHeight); @@ -799,7 +807,7 @@ int sqlite3SelectExprHeight(const Select *p){ */ void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ if( pParse->nErr ) return; - if( p && p->x.pList && !ExprHasProperty(p, EP_xIsSelect) ){ + if( p && ExprUseXList(p) && p->x.pList ){ p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); } } @@ -983,13 +991,20 @@ Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprList *pEList){ for(ii=0; iinExpr; ii++){ Select *pSel; Expr *pExpr = pEList->a[ii].pExpr; - int nExprElem = (pExpr->op==TK_VECTOR ? pExpr->x.pList->nExpr : 1); + int nExprElem; + if( pExpr->op==TK_VECTOR ){ + assert( ExprUseXList(pExpr) ); + nExprElem = pExpr->x.pList->nExpr; + }else{ + nExprElem = 1; + } if( nExprElem!=nElem ){ sqlite3ErrorMsg(pParse, "IN(...) element has %d term%s - expected %d", nExprElem, nExprElem>1?"s":"", nElem ); break; } + assert( ExprUseXList(pExpr) ); pSel = sqlite3SelectNew(pParse, pExpr->x.pList, 0, 0, 0, 0, 0, SF_Values,0); pExpr->x.pList = 0; if( pSel ){ @@ -1059,7 +1074,7 @@ Expr *sqlite3ExprFunction( } pNew->x.pList = pList; ExprSetProperty(pNew, EP_HasFunc); - assert( !ExprHasProperty(pNew, EP_xIsSelect) ); + assert( ExprUseXList(pNew) ); sqlite3ExprSetHeightAndFlags(pParse, pNew); if( eDistinct==SF_Distinct ) ExprSetProperty(pNew, EP_Distinct); return pNew; @@ -1195,17 +1210,18 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ assert( p->pLeft==0 ); assert( p->pRight==0 ); - assert( p->x.pSelect==0 ); + assert( !ExprUseXSelect(p) || p->x.pSelect==0 ); + assert( !ExprUseXList(p) || p->x.pList==0 ); } #endif if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ /* The Expr.x union is never used at the same time as Expr.pRight */ - assert( p->x.pList==0 || p->pRight==0 ); + assert( (ExprUseXList(p) && p->x.pList==0) || p->pRight==0 ); if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); if( p->pRight ){ assert( !ExprHasProperty(p, EP_WinFunc) ); sqlite3ExprDeleteNN(db, p->pRight); - }else if( ExprHasProperty(p, EP_xIsSelect) ){ + }else if( ExprUseXSelect(p) ){ assert( !ExprHasProperty(p, EP_WinFunc) ); sqlite3SelectDelete(db, p->x.pSelect); }else{ @@ -1436,7 +1452,7 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_Leaf)) ){ /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ - if( ExprHasProperty(p, EP_xIsSelect) ){ + if( ExprUseXSelect(p) ){ pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags); }else{ pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags); @@ -2285,7 +2301,7 @@ static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){ } /* Check if pExpr is a sub-select. If so, consider it variable. */ - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ pWalker->eCode = 0; return WRC_Abort; } @@ -2512,7 +2528,7 @@ static Select *isCandidateForInOpt(const Expr *pX){ ExprList *pEList; Table *pTab; int i; - if( !ExprHasProperty(pX, EP_xIsSelect) ) return 0; /* Not a subquery */ + if( !ExprUseXSelect(pX) ) return 0; /* Not a subquery */ if( ExprHasProperty(pX, EP_VarSelect) ) return 0; /* Correlated subq */ p = pX->x.pSelect; if( p->pPrior ) return 0; /* Not a compound SELECT */ @@ -2683,7 +2699,7 @@ int sqlite3FindInIndex( ** or not NULL is actually possible (it may not be, for example, due ** to NOT NULL constraints in the schema). If no NULL values are possible, ** set prRhsHasNull to 0 before continuing. */ - if( prRhsHasNull && (pX->flags & EP_xIsSelect) ){ + if( prRhsHasNull && ExprUseXSelect(pX) ){ int i; ExprList *pEList = pX->x.pSelect->pEList; for(i=0; inExpr; i++){ @@ -2839,7 +2855,7 @@ int sqlite3FindInIndex( */ if( eType==0 && (inFlags & IN_INDEX_NOOP_OK) - && !ExprHasProperty(pX, EP_xIsSelect) + && ExprUseXList(pX) && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) ){ eType = IN_INDEX_NOOP; @@ -2887,7 +2903,7 @@ int sqlite3FindInIndex( static char *exprINAffinity(Parse *pParse, const Expr *pExpr){ Expr *pLeft = pExpr->pLeft; int nVal = sqlite3ExprVectorSize(pLeft); - Select *pSelect = (pExpr->flags & EP_xIsSelect) ? pExpr->x.pSelect : 0; + Select *pSelect = ExprUseXSelect(pExpr) ? pExpr->x.pSelect : 0; char *zRet; assert( pExpr->op==TK_IN ); @@ -2937,7 +2953,7 @@ void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ */ void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ #ifndef SQLITE_OMIT_SUBQUERY - if( pExpr->flags & EP_xIsSelect ){ + if( ExprUseXSelect(pExpr) ){ sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1); }else #endif @@ -3001,7 +3017,7 @@ void sqlite3CodeRhsOfIN( */ if( ExprHasProperty(pExpr, EP_Subrtn) ){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", pExpr->x.pSelect->selId)); } @@ -3033,7 +3049,7 @@ void sqlite3CodeRhsOfIN( pExpr->iTable = iTab; addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); }else{ VdbeComment((v, "RHS of IN operator")); @@ -3041,7 +3057,7 @@ void sqlite3CodeRhsOfIN( #endif pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ /* Case 1: expr IN (SELECT ...) ** ** Generate code to write the results of the select into the temporary @@ -3175,7 +3191,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ testcase( pExpr->op==TK_EXISTS ); testcase( pExpr->op==TK_SELECT ); assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); - assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( ExprUseXSelect(pExpr) ); pSel = pExpr->x.pSelect; /* If this routine has already been coded, then invoke it as a @@ -3283,7 +3299,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ */ int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ int nVector = sqlite3ExprVectorSize(pIn->pLeft); - if( (pIn->flags & EP_xIsSelect)!=0 && !pParse->db->mallocFailed ){ + if( ExprUseXSelect(pIn) && !pParse->db->mallocFailed ){ if( nVector!=pIn->x.pSelect->pEList->nExpr ){ sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector); return 1; @@ -3417,13 +3433,15 @@ static void sqlite3ExprCodeIN( ** This is step (1) in the in-operator.md optimized algorithm. */ if( eType==IN_INDEX_NOOP ){ - ExprList *pList = pExpr->x.pList; - CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + ExprList *pList; + CollSeq *pColl; int labelOk = sqlite3VdbeMakeLabel(pParse); int r2, regToFree; int regCkNull = 0; int ii; - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( ExprUseXList(pExpr) ); + pList = pExpr->x.pList; + pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); if( destIfNull!=destIfFalse ){ regCkNull = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); @@ -3809,6 +3827,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ int i; iResult = pParse->nMem+1; pParse->nMem += nResult; + assert( ExprUseXList(p) ); for(i=0; ix.pList->a[i].pExpr, i+iResult); } @@ -4315,8 +4334,8 @@ expr_code_doover: ** multiple times if we know they always give the same result */ return sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); } - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); assert( !ExprHasProperty(pExpr, EP_TokenOnly) ); + assert( ExprUseXList(pExpr) ); pFarg = pExpr->x.pList; nFarg = pFarg ? pFarg->nExpr : 0; assert( !ExprHasProperty(pExpr, EP_IntValue) ); @@ -4435,7 +4454,10 @@ expr_code_doover: testcase( op==TK_SELECT ); if( pParse->db->mallocFailed ){ return 0; - }else if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){ + }else if( op==TK_SELECT + && ALWAYS( ExprUseXSelect(pExpr) ) + && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 + ){ sqlite3SubselectError(pParse, nCol, 1); }else{ return sqlite3CodeSubselect(pParse, pExpr); @@ -4607,7 +4629,7 @@ expr_code_doover: Expr *pDel = 0; sqlite3 *db = pParse->db; - assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList ); + assert( ExprUseXList(pExpr) && pExpr->x.pList!=0 ); assert(pExpr->x.pList->nExpr > 0); pEList = pExpr->x.pList; aListelem = pEList->a; @@ -4952,7 +4974,7 @@ static void exprCodeBetween( memset(&compRight, 0, sizeof(Expr)); memset(&exprAnd, 0, sizeof(Expr)); - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( ExprUseXList(pExpr) ); pDel = sqlite3ExprDup(db, pExpr->pLeft, 0); if( db->mallocFailed==0 ){ exprAnd.op = TK_AND; @@ -5539,12 +5561,13 @@ static int exprImpliesNotNull( switch( p->op ){ case TK_IN: { if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0; - assert( ExprHasProperty(p,EP_xIsSelect) - || (p->x.pList!=0 && p->x.pList->nExpr>0) ); + assert( ExprUseXSelect(p) || (p->x.pList!=0 && p->x.pList->nExpr>0) ); return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); } case TK_BETWEEN: { - ExprList *pList = p->x.pList; + ExprList *pList; + assert( ExprUseXList(p) ); + pList = p->x.pList; assert( pList!=0 ); assert( pList->nExpr==2 ); if( seenNot ) return 0; @@ -5908,6 +5931,7 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ cnt.iSrcInner = (pSrcList&&pSrcList->nSrc)?pSrcList->a[0].iCursor:0x7FFFFFFF; cnt.nThis = 0; cnt.nOther = 0; + assert( ExprUseXList(pExpr) ); sqlite3WalkExprList(&w, pExpr->x.pList); #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(pExpr, EP_WinFunc) ){ @@ -6112,7 +6136,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ pItem = &pAggInfo->aFunc[i]; pItem->pFExpr = pExpr; pItem->iMem = ++pParse->nMem; - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( ExprUseUToken(pExpr) ); pItem->pFunc = sqlite3FindFunction(pParse->db, pExpr->u.zToken, pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); diff --git a/src/func.c b/src/func.c index 3e1bd86c47..208da48e27 100644 --- a/src/func.c +++ b/src/func.c @@ -1935,10 +1935,10 @@ int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ int nExpr; assert( pExpr!=0 ); assert( pExpr->op==TK_FUNCTION ); + assert( ExprUseXList(pExpr) ); if( !pExpr->x.pList ){ return 0; } - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); nExpr = pExpr->x.pList->nExpr; assert( !ExprHasProperty(pExpr, EP_IntValue) ); pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); diff --git a/src/resolve.c b/src/resolve.c index 24c9509658..a29b483db7 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -518,8 +518,8 @@ static int lookupName( ){ Expr *pOrig; assert( pExpr->pLeft==0 && pExpr->pRight==0 ); - assert( pExpr->x.pList==0 ); - assert( pExpr->x.pSelect==0 ); + assert( ExprUseXList(pExpr)==0 || pExpr->x.pList==0 ); + assert( ExprUseXSelect(pExpr)==0 || pExpr->x.pSelect==0 ); pOrig = pEList->a[j].pExpr; if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){ sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); @@ -1120,7 +1120,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #endif case TK_IN: { testcase( pExpr->op==TK_IN ); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ int nRef = pNC->nRef; testcase( pNC->ncFlags & NC_IsCheck ); testcase( pNC->ncFlags & NC_PartIdx ); @@ -1177,6 +1177,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ assert( pExpr->pLeft!=0 ); nLeft = sqlite3ExprVectorSize(pExpr->pLeft); if( pExpr->op==TK_BETWEEN ){ + assert( ExprUseXList(pExpr) ); nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr); if( nRight==nLeft ){ nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr); diff --git a/src/select.c b/src/select.c index d8047835ba..39bdc49686 100644 --- a/src/select.c +++ b/src/select.c @@ -391,10 +391,13 @@ void sqlite3SetJoinExpr(Expr *p, int iTable){ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); p->iRightJoinTable = iTable; - if( p->op==TK_FUNCTION && p->x.pList ){ - int i; - for(i=0; ix.pList->nExpr; i++){ - sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable); + if( p->op==TK_FUNCTION ){ + assert( ExprUseXList(p) ); + if( p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable); + } } } sqlite3SetJoinExpr(p->pLeft, iTable); @@ -417,10 +420,13 @@ static void unsetJoinExpr(Expr *p, int iTable){ if( p->op==TK_COLUMN && p->iTable==iTable ){ ExprClearProperty(p, EP_CanBeNull); } - if( p->op==TK_FUNCTION && p->x.pList ){ - int i; - for(i=0; ix.pList->nExpr; i++){ - unsetJoinExpr(p->x.pList->a[i].pExpr, iTable); + if( p->op==TK_FUNCTION ){ + assert( ExprUseXList(p) ); + if( p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + unsetJoinExpr(p->x.pList->a[i].pExpr, iTable); + } } } unsetJoinExpr(p->pLeft, iTable); @@ -1866,9 +1872,11 @@ static const char *columnTypeImpl( ** statement. */ NameContext sNC; - Select *pS = pExpr->x.pSelect; - Expr *p = pS->pEList->a[0].pExpr; - assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + Select *pS; + Expr *p; + assert( ExprUseXSelect(pExpr) ); + pS = pExpr->x.pSelect; + p = pS->pEList->a[0].pExpr; sNC.pSrcList = pS->pSrc; sNC.pNext = pNC; sNC.pParse = pNC->pParse; @@ -3675,7 +3683,7 @@ static Expr *substExpr( } pExpr->pLeft = substExpr(pSubst, pExpr->pLeft); pExpr->pRight = substExpr(pSubst, pExpr->pRight); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ substSelect(pSubst, pExpr->x.pSelect, 1); }else{ substExprList(pSubst, pExpr->x.pList); @@ -4886,7 +4894,7 @@ static int pushDownWhereTerms( */ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ - ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */ + ExprList *pEList; /* Arguments to agg function */ const char *zFunc; /* Name of aggregate function pFunc */ ExprList *pOrderBy; u8 sortFlags = 0; @@ -4894,6 +4902,8 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ assert( *ppMinMax==0 ); assert( pFunc->op==TK_AGG_FUNCTION ); assert( !IsWindowFunc(pFunc) ); + assert( ExprUseXList(pFunc) ); + pEList = pFunc->x.pList; if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_WinFunc) @@ -5870,7 +5880,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ if( pFunc->iDistinct>=0 ){ Expr *pE = pFunc->pFExpr; - assert( !ExprHasProperty(pE, EP_xIsSelect) ); + assert( ExprUseXList(pE) ); if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one " "argument"); @@ -5895,8 +5905,9 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ int i; struct AggInfo_func *pF; for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ - ExprList *pList = pF->pFExpr->x.pList; - assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) ); + ExprList *pList; + assert( ExprUseXList(pF->pFExpr) ); + pList = pF->pFExpr->x.pList; sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0); sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); } @@ -5930,9 +5941,10 @@ static void updateAccumulator( int nArg; int addrNext = 0; int regAgg; - ExprList *pList = pF->pFExpr->x.pList; - assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) ); + ExprList *pList; + assert( ExprUseXList(pF->pFExpr) ); assert( !IsWindowFunc(pF->pFExpr) ); + pList = pF->pFExpr->x.pList; if( ExprHasProperty(pF->pFExpr, EP_WinFunc) ){ Expr *pFilter = pF->pFExpr->y.pWin->pFilter; if( pAggInfo->nAccumulator @@ -6178,8 +6190,9 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ if( p->pGroupBy ) return 0; pExpr = p->pEList->a[0].pExpr; if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */ - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert( ExprUseUToken(pExpr) ); if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */ + assert( ExprUseXList(pExpr) ); if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */ if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */ pSub = p->pSrc->a[0].pSelect; @@ -6994,7 +7007,7 @@ int sqlite3Select( } for(i=0; inFunc; i++){ Expr *pExpr = pAggInfo->aFunc[i].pFExpr; - assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); + assert( ExprUseXList(pExpr) ); sNC.ncFlags |= NC_InAggFunc; sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); #ifndef SQLITE_OMIT_WINDOWFUNC @@ -7049,7 +7062,9 @@ int sqlite3Select( if( pAggInfo->nFunc==1 && pAggInfo->aFunc[0].iDistinct>=0 - && pAggInfo->aFunc[0].pFExpr->x.pList + && ALWAYS(pAggInfo->aFunc[0].pFExpr!=0) + && ALWAYS(ExprUseXList(pAggInfo->aFunc[0].pFExpr)) + && pAggInfo->aFunc[0].pFExpr->x.pList!=0 ){ Expr *pExpr = pAggInfo->aFunc[0].pFExpr->x.pList->a[0].pExpr; pExpr = sqlite3ExprDup(db, pExpr, 0); @@ -7370,6 +7385,7 @@ int sqlite3Select( sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc); } }else if( pAggInfo->nFunc==1 && pAggInfo->aFunc[0].iDistinct>=0 ){ + assert( ExprUseXList(pAggInfo->aFunc[0].pFExpr) ); pDistinct = pAggInfo->aFunc[0].pFExpr->x.pList; distFlag = pDistinct ? (WHERE_WANT_DISTINCT|WHERE_AGG_DISTINCT) : 0; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b486d904d3..aae8f17b53 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2886,6 +2886,16 @@ struct Expr { #define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue) #define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse) +/* +** Macros used to ensure that the correct members of unions are accessed. +*/ +#define ExprUseUToken(E) (((E)->flags&EP_IntValue)==0) +#define ExprUseUValue(E) (((E)->flags&EP_IntValue)!=0) +#define ExprUseXList(E) (((E)->flags&EP_xIsSelect)==0) +#define ExprUseXSelect(E) (((E)->flags&EP_xIsSelect)!=0) +#define ExprUseYTab(E) ((E)->op==TK_COLUMN) +#define ExprUseYWin(E) ((E)->flags&EP_WinFunc)!=0) +#define ExprUseYSub(E) ((E)->op==TK_IN||(E)->op==TK_SELECT||(E)->op==TK_EXISTS) /* Flags for use with Expr.vvaFlags */ diff --git a/src/treeview.c b/src/treeview.c index 27fb69cd15..a7dfe2d43d 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -583,6 +583,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ pFarg = 0; pWin = 0; }else{ + assert( ExprUseXList(pExpr) ); pFarg = pExpr->x.pList; #ifndef SQLITE_OMIT_WINDOWFUNC pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0; @@ -622,11 +623,13 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ } #ifndef SQLITE_OMIT_SUBQUERY case TK_EXISTS: { + assert( ExprUseXSelect(pExpr) ); sqlite3TreeViewLine(pView, "EXISTS-expr flags=0x%x", pExpr->flags); sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); break; } case TK_SELECT: { + assert( ExprUseXSelect(pExpr) ); sqlite3TreeViewLine(pView, "subquery-expr flags=0x%x", pExpr->flags); sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); break; @@ -634,7 +637,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ case TK_IN: { sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags); sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); }else{ sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); @@ -655,9 +658,12 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ ** Z is stored in pExpr->pList->a[1].pExpr. */ case TK_BETWEEN: { - Expr *pX = pExpr->pLeft; - Expr *pY = pExpr->x.pList->a[0].pExpr; - Expr *pZ = pExpr->x.pList->a[1].pExpr; + const Expr *pX, *pY, *pZ; + pX = pExpr->pLeft; + assert( ExprUseXList(pExpr) ); + assert( pExpr->x.pList->nExpr==2 ); + pY = pExpr->x.pList->a[0].pExpr; + pZ = pExpr->x.pList->a[1].pExpr; sqlite3TreeViewLine(pView, "BETWEEN"); sqlite3TreeViewExpr(pView, pX, 1); sqlite3TreeViewExpr(pView, pY, 1); @@ -679,6 +685,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ case TK_CASE: { sqlite3TreeViewLine(pView, "CASE"); sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + assert( ExprUseXList(pExpr) ); sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); break; } @@ -704,6 +711,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ } case TK_VECTOR: { char *z = sqlite3_mprintf("VECTOR%s",zFlgs); + assert( ExprUseXList(pExpr) ); sqlite3TreeViewBareExprList(pView, pExpr->x.pList, z); sqlite3_free(z); break; @@ -712,6 +720,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3TreeViewLine(pView, "SELECT-COLUMN %d of [0..%d]%s", pExpr->iColumn, pExpr->iTable-1, pExpr->pRight==pExpr->pLeft ? " (SELECT-owner)" : ""); + assert( ExprUseXSelect(pExpr->pLeft) ); sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); break; } diff --git a/src/vdbemem.c b/src/vdbemem.c index 73077b4881..d381d4fc5c 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1418,6 +1418,7 @@ static int valueFromFunction( assert( pCtx!=0 ); assert( (p->flags & EP_TokenOnly)==0 ); + assert( ExprUseXList(p) ); pList = p->x.pList; if( pList ) nVal = pList->nExpr; assert( !ExprHasProperty(p, EP_IntValue) ); diff --git a/src/walker.c b/src/walker.c index 8c0308473a..f24c052d6d 100644 --- a/src/walker.c +++ b/src/walker.c @@ -75,7 +75,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ assert( !ExprHasProperty(pExpr, EP_WinFunc) ); pExpr = pExpr->pRight; continue; - }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + }else if( ExprUseXSelect(pExpr) ){ assert( !ExprHasProperty(pExpr, EP_WinFunc) ); if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; }else{ diff --git a/src/where.c b/src/where.c index 63ac4e1c12..7583f05631 100644 --- a/src/where.c +++ b/src/where.c @@ -2419,9 +2419,12 @@ static int whereRangeVectorLen( char aff; /* Comparison affinity */ char idxaff = 0; /* Indexed columns affinity */ CollSeq *pColl; /* Comparison collation sequence */ - Expr *pLhs = pTerm->pExpr->pLeft->x.pList->a[i].pExpr; - Expr *pRhs = pTerm->pExpr->pRight; - if( pRhs->flags & EP_xIsSelect ){ + Expr *pLhs, *pRhs; + + assert( ExprUseXList(pTerm->pExpr->pLeft) ); + pLhs = pTerm->pExpr->pLeft->x.pList->a[i].pExpr; + pRhs = pTerm->pExpr->pRight; + if( ExprUseXSelect(pRhs) ){ pRhs = pRhs->x.pSelect->pEList->a[i].pExpr; }else{ pRhs = pRhs->x.pList->a[i].pExpr; @@ -2582,7 +2585,7 @@ static int whereLoopAddBtreeIndex( if( eOp & WO_IN ){ Expr *pExpr = pTerm->pExpr; - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ /* "x IN (SELECT ...)": TUNING: the SELECT returns 25 rows */ int i; nIn = 46; assert( 46==sqlite3LogEst(25) ); @@ -2723,7 +2726,7 @@ static int whereLoopAddBtreeIndex( if( nInMul==0 && pProbe->nSample && ALWAYS(pNew->u.btree.nEq<=pProbe->nSampleCol) - && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) + && ((eOp & WO_IN)==0 || ExprUseXList(pTerm->pExpr)) && OptimizationEnabled(db, SQLITE_Stat4) ){ Expr *pExpr = pTerm->pExpr; diff --git a/src/wherecode.c b/src/wherecode.c index 15e4aa8393..d803c674f6 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -416,13 +416,18 @@ static Expr *removeUnindexableInClauseTerms( Expr *pNew; pNew = sqlite3ExprDup(db, pX, 0); if( db->mallocFailed==0 ){ - ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */ - ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */ + ExprList *pOrigRhs; /* Original unmodified RHS */ + ExprList *pOrigLhs; /* Original unmodified LHS */ ExprList *pRhs = 0; /* New RHS after modifications */ ExprList *pLhs = 0; /* New LHS after mods */ int i; /* Loop counter */ Select *pSelect; /* Pointer to the SELECT on the RHS */ + assert( ExprUseXSelect(pNew) ); + pOrigRhs = pNew->x.pSelect->pEList; + assert( pNew->pLeft!=0 ); + assert( ExprUseXList(pNew->pLeft) ); + pOrigLhs = pNew->pLeft->x.pList; for(i=iEq; inLTerm; i++){ if( pLoop->aLTerm[i]->pExpr==pX ){ int iField = pLoop->aLTerm[i]->u.x.iField - 1; @@ -540,7 +545,7 @@ static int codeEqualityTerm( } iTab = 0; - if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ + if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ sqlite3 *db = pParse->db; @@ -1105,7 +1110,7 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ assert( nReg>0 ); if( p && sqlite3ExprIsVector(p) ){ #ifndef SQLITE_OMIT_SUBQUERY - if( (p->flags & EP_xIsSelect) ){ + if( ExprUseXSelect(p) ){ Vdbe *v = pParse->pVdbe; int iSelect; assert( p->op==TK_SELECT ); @@ -1115,7 +1120,9 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ #endif { int i; - ExprList *pList = p->x.pList; + const ExprList *pList; + assert( ExprUseXList(p) ); + pList = p->x.pList; assert( nReg<=pList->nExpr ); for(i=0; ia[i].pExpr, iReg+i); @@ -2461,7 +2468,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( pAlt==0 ) continue; if( pAlt->wtFlags & (TERM_CODED) ) continue; if( (pAlt->eOperator & WO_IN) - && (pAlt->pExpr->flags & EP_xIsSelect) + && ExprUseXSelect(pAlt->pExpr) && (pAlt->pExpr->x.pSelect->pEList->nExpr>1) ){ continue; diff --git a/src/whereexpr.c b/src/whereexpr.c index 336de1d302..8c73feeb33 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -195,6 +195,7 @@ static int isLikeOrGlob( #ifdef SQLITE_EBCDIC if( *pnoCase ) return 0; #endif + assert( ExprUseXList(pExpr) ); pList = pExpr->x.pList; pLeft = pList->a[1].pExpr; @@ -368,6 +369,7 @@ static int isAuxiliaryVtabOperator( Expr *pCol; /* Column reference */ int i; + assert( ExprUseXList(pExpr) ); pList = pExpr->x.pList; if( pList==0 || pList->nExpr!=2 ){ return 0; @@ -873,7 +875,7 @@ static void exprAnalyzeOrTerm( if( pNew ){ int idxNew; transferJoinMarkings(pNew, pExpr); - assert( !ExprHasProperty(pNew, EP_xIsSelect) ); + assert( ExprUseXList(pNew) ); pNew->x.pList = pList; idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); @@ -1001,6 +1003,7 @@ static int exprMightBeIndexed( assert( TK_ISop==TK_VECTOR && (op>=TK_GT && ALWAYS(op<=TK_GE)) ){ + assert( ExprUseXList(pExpr) ); pExpr = pExpr->x.pList->a[0].pExpr; } @@ -1067,7 +1070,7 @@ static void exprAnalyze( if( op==TK_IN ){ assert( pExpr->pRight==0 ); if( sqlite3ExprCheckIN(pParse, pExpr) ) return; - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( ExprUseXSelect(pExpr) ){ pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect); }else{ pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); @@ -1103,6 +1106,7 @@ static void exprAnalyze( if( pTerm->u.x.iField>0 ){ assert( op==TK_IN ); assert( pLeft->op==TK_VECTOR ); + assert( ExprUseXList(pLeft) ); pLeft = pLeft->x.pList->a[pTerm->u.x.iField-1].pExpr; } @@ -1181,9 +1185,11 @@ static void exprAnalyze( ** BETWEEN term is skipped. */ else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){ - ExprList *pList = pExpr->x.pList; + ExprList *pList; int i; static const u8 ops[] = {TK_GE, TK_LE}; + assert( ExprUseXList(pExpr) ); + pList = pExpr->x.pList; assert( pList!=0 ); assert( pList->nExpr==2 ); for(i=0; i<2; i++){ @@ -1276,6 +1282,7 @@ static void exprAnalyze( const char *zCollSeqName; /* Name of collating sequence */ const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; + assert( ExprUseXList(pExpr) ); pLeft = pExpr->x.pList->a[1].pExpr; pStr2 = sqlite3ExprDup(db, pStr1, 0); assert( pStr1==0 || !ExprHasProperty(pStr1, EP_IntValue) ); @@ -1380,6 +1387,7 @@ static void exprAnalyze( else if( pExpr->op==TK_IN && pTerm->u.x.iField==0 && pExpr->pLeft->op==TK_VECTOR + && ALWAYS( ExprUseXSelect(pExpr) ) && pExpr->x.pSelect->pPrior==0 #ifndef SQLITE_OMIT_WINDOWFUNC && pExpr->x.pSelect->pWin==0 @@ -1543,7 +1551,7 @@ Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ if( p->pRight ){ mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pRight); assert( p->x.pList==0 ); - }else if( ExprHasProperty(p, EP_xIsSelect) ){ + }else if( ExprUseXSelect(p) ){ if( ExprHasProperty(p, EP_VarSelect) ) pMaskSet->bVarSelect = 1; mask |= exprSelectUsage(pMaskSet, p->x.pSelect); }else if( p->x.pList ){ diff --git a/src/window.c b/src/window.c index 89439913c1..21dc285716 100644 --- a/src/window.c +++ b/src/window.c @@ -1030,7 +1030,9 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** window function - one for the accumulator, another for interim ** results. */ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - ExprList *pArgs = pWin->pOwner->x.pList; + ExprList *pArgs; + assert( ExprUseXList(pWin->pOwner) ); + pArgs = pWin->pOwner->x.pList; if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); @@ -1423,8 +1425,11 @@ void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ ** regApp+1: integer value used to ensure keys are unique ** regApp+2: output of MakeRecord */ - ExprList *pList = pWin->pOwner->x.pList; - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0); + ExprList *pList; + KeyInfo *pKeyInfo; + assert( ExprUseXList(pWin->pOwner) ); + pList = pWin->pOwner->x.pList; + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0); pWin->csrApp = pParse->nTab++; pWin->regApp = pParse->nMem+1; pParse->nMem += 3; @@ -1512,7 +1517,9 @@ static void windowCheckValue(Parse *pParse, int reg, int eCond){ ** with the object passed as the only argument to this function. */ static int windowArgCount(Window *pWin){ - ExprList *pList = pWin->pOwner->x.pList; + const ExprList *pList; + assert( ExprUseXList(pWin->pOwner) ); + pList = pWin->pOwner->x.pList; return (pList ? pList->nExpr : 0); } @@ -1697,6 +1704,7 @@ static void windowAggStep( int addrIf = 0; if( pWin->pFilter ){ int regTmp; + assert( ExprUseXList(pWin->pOwner) ); assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr ); assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 ); regTmp = sqlite3GetTempReg(pParse); @@ -1710,6 +1718,7 @@ static void windowAggStep( int iOp = sqlite3VdbeCurrentAddr(v); int iEnd; + assert( ExprUseXList(pWin->pOwner) ); nArg = pWin->pOwner->x.pList->nExpr; regArg = sqlite3GetTempRange(pParse, nArg); sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0); @@ -1724,6 +1733,7 @@ static void windowAggStep( if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ CollSeq *pColl; assert( nArg>0 ); + assert( ExprUseXList(pWin->pOwner) ); pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr); sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ); } @@ -1909,6 +1919,7 @@ static void windowReturnOneRow(WindowCodeArg *p){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ FuncDef *pFunc = pWin->pFunc; + assert( ExprUseXList(pWin->pOwner) ); if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName ){ From 867bc4de2e998280e1c34c4d828708f9cb8bf62a Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 7 Oct 2021 19:27:17 +0000 Subject: [PATCH 22/64] Break the tcl release tests into smaller units to better take advantage of multi-processor systems. FossilOrigin-Name: 03cef1c30d96cd42682f57667bb3072c7643ef43fe05eda2d8b82c30789234af --- Makefile.in | 5 +- Makefile.msc | 4 +- manifest | 21 +- manifest.uuid | 2 +- test/permutations.test | 9 +- test/releasetest.tcl | 1100 ------------------------------------- test/releasetest_data.tcl | 175 +++--- 7 files changed, 127 insertions(+), 1189 deletions(-) delete mode 100755 test/releasetest.tcl diff --git a/Makefile.in b/Makefile.in index 9adcf6296f..840b504f1d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1251,7 +1251,10 @@ coretestprogs: $(TESTPROGS) testprogs: coretestprogs srcck1$(BEXE) fuzzcheck$(TEXE) sessionfuzz$(TEXE) # A very detailed test running most or all test cases -fulltest: $(TESTPROGS) fuzztest +fulltest: alltest fuzztest + +# Run most or all tcl test cases +alltest: $(TESTPROGS) ./testfixture$(TEXE) $(TOP)/test/all.test $(TESTOPTS) # Really really long testing diff --git a/Makefile.msc b/Makefile.msc index b83a0906bb..cfa20c6245 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2437,7 +2437,9 @@ coretestprogs: $(TESTPROGS) testprogs: coretestprogs srcck1.exe fuzzcheck.exe sessionfuzz.exe -fulltest: $(TESTPROGS) fuzztest +fulltest: alltest fuzztest + +alltest: $(TESTPROGS) @set PATH=$(LIBTCLPATH);$(PATH) .\testfixture.exe $(TOP)\test\all.test $(TESTOPTS) diff --git a/manifest b/manifest index 4be9248ca9..3cad8b9c70 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Protect\sall\saccesses\sto\sthe\sExpr.x\sunion\susing\snearby\sassert()s\sand\sbranches. -D 2021-10-07T17:43:30.167 +C Break\sthe\stcl\srelease\stests\sinto\ssmaller\sunits\sto\sbetter\stake\sadvantage\sof\smulti-processor\ssystems. +D 2021-10-07T19:27:17.394 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 2a6e71e91f29e9eb0cb800b6500bbbfef31730d5c37eaadb6e8ea8a45e6ead21 +F Makefile.in 457a0f10540bd18a700c9d45add8dcc06e040bc9d1e948c9816b9b6eab1de384 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc b18738be47ba9293dbea2048fe1d5a737456fdc630361cc98ef2c2f73bf3395c +F Makefile.msc fef1e54f1a2138aa2de79ad8a928f1711106d082e6a35cdfbbfec9e8fd0c59c3 F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1273,7 +1273,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test dfdb3356ceb66e515193b12e3fd46706d28274142dc46fd37da63fda9cd4a68a +F test/permutations.test 536ab91e3d8fda6086ae6a3a0087d0750c95a412a9f3fb661e5a58de6d1b1224 F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f F test/pragma.test cae534c12a033a5c319ccc94f50b32811acdef9f67bf19a82ff42697caccd69f F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1301,8 +1301,7 @@ F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79 F test/regexp1.test 0c3ff80f66b0eff80e623eb5db7a3dad512095c573d78ac23009785f6d8f51ce F test/regexp2.test 55ed41da802b0e284ac7e2fe944be3948f93ff25abbca0361a609acfed1368b5 F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest.tcl 6f803ef0b896f8f3f4c26eb072c0399963a5987a509a64d45f5dfbc1ebae2951 x -F test/releasetest_data.tcl 1673991f780277748a0c7524969ae9d6f7cfb21d8c790f6081ee5c0d96ea0f28 +F test/releasetest_data.tcl 0f844b4884df67619768400eb8e4dd55708397d1728b52a2d41a8b76fb62ca7e F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/returning1.test f96c7245f6ac16038e802760cd90b93479369939a8a7a44e2329ee5aed28239c @@ -1929,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f85cb287c52baa729aeb223038e979a3b74a1eb3d97bf59c01f5417998204f84 -R d1a38de85ec9395d66459f512bc9b39f -U drh -Z a07d4736a8e9c697e3914dd4948a3735 +P 8eaa1d4a98b24adf245bbd2fe9212aa6a924a0f09c445906d7f87574f36a7423 +R 5eb83fb05c47023834fe1cae6d00b957 +U dan +Z 9054f47cc6bebbf9ed5d65ed018c55d7 diff --git a/manifest.uuid b/manifest.uuid index 2451d9c2a4..1b8acfde23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8eaa1d4a98b24adf245bbd2fe9212aa6a924a0f09c445906d7f87574f36a7423 \ No newline at end of file +03cef1c30d96cd42682f57667bb3072c7643ef43fe05eda2d8b82c30789234af \ No newline at end of file diff --git a/test/permutations.test b/test/permutations.test index 34404f8876..7d2a0e58a7 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -1138,7 +1138,14 @@ proc run_tests {name args} { set ::G(perm:dbconfig) $options(-dbconfig) set ::G(perm:presql) $options(-presql) - foreach file [lsort $options(-files)] { + set filelist [lsort $options(-files)] + if {[info exists ::env(TCLTEST_PART)]} { + regexp {^([0-9]*)/([0-9]*)$} $::env(TCLTEST_PART) -> A B + set nFile [expr {([llength $filelist]+$B-1)/$B}] + set filelist [lrange $filelist [expr ($A-1)*$nFile] [expr $A*$nFile-1]] + } + + foreach file $filelist { if {[file tail $file] == $file} { set file [file join $::testdir $file] } if {[info exists ::env(SQLITE_TEST_PATTERN_LIST)]} { diff --git a/test/releasetest.tcl b/test/releasetest.tcl deleted file mode 100755 index da6113a19a..0000000000 --- a/test/releasetest.tcl +++ /dev/null @@ -1,1100 +0,0 @@ -#!/usr/bin/tclsh -# -# Documentation for this script. This may be output to stderr -# if the script is invoked incorrectly. See the [process_options] -# proc below. -# -set ::USAGE_MESSAGE { -This Tcl script is used to test the various configurations required -before releasing a new version. Supported command line options (all -optional) are: - - --buildonly (Just build testfixture - do not run) - --config CONFIGNAME (Run only CONFIGNAME) - --dryrun (Print what would have happened) - -f|--force (Run even if uncommitted changes) - --info (Show diagnostic info) - --jobs N (Use N processes - default 1) - --keep (Delete no files after each test run) - --msvc (Use MSVC as the compiler) - --platform PLATFORM (see below) - --progress (Show progress messages) - --quick (Run "veryquick.test" only) - --veryquick (Run "make smoketest" only) - --with-tcl=DIR (Use TCL build at DIR) - -The script determines the default value for --platform using the -$tcl_platform(os) and $tcl_platform(machine) variables. Supported -platforms are "Linux-x86", "Linux-x86_64", "Darwin-i386", -"Darwin-x86_64", "Windows NT-intel", and "Windows NT-amd64". - -Every test begins with a fresh run of the configure script at the top -of the SQLite source tree. -} - -# Return a timestamp of the form HH:MM:SS -# -proc now {} { - return [clock format [clock seconds] -format %H:%M:%S] -} - -# Omit comments (text between # and \n) in a long multi-line string. -# -proc strip_comments {in} { - regsub -all {#[^\n]*\n} $in {} out - return $out -} - -array set ::Configs [strip_comments { - "Default" { - -O2 - --disable-amalgamation --disable-shared - --enable-session - } - "Sanitize" { - CC=clang -fsanitize=undefined - -DSQLITE_ENABLE_STAT4 - -DCONFIG_SLOWDOWN_FACTOR=5.0 - --enable-session - } - "Stdcall" { - -DUSE_STDCALL=1 - -O2 - } - "Have-Not" { - # The "Have-Not" configuration sets all possible -UHAVE_feature options - # in order to verify that the code works even on platforms that lack - # these support services. - -DHAVE_FDATASYNC=0 - -DHAVE_GMTIME_R=0 - -DHAVE_ISNAN=0 - -DHAVE_LOCALTIME_R=0 - -DHAVE_LOCALTIME_S=0 - -DHAVE_MALLOC_USABLE_SIZE=0 - -DHAVE_STRCHRNUL=0 - -DHAVE_USLEEP=0 - -DHAVE_UTIME=0 - } - "Unlock-Notify" { - -O2 - -DSQLITE_ENABLE_UNLOCK_NOTIFY - -DSQLITE_THREADSAFE - -DSQLITE_TCL_DEFAULT_FULLMUTEX=1 - } - "User-Auth" { - -O2 - -DSQLITE_USER_AUTHENTICATION=1 - } - "Secure-Delete" { - -O2 - -DSQLITE_SECURE_DELETE=1 - -DSQLITE_SOUNDEX=1 - } - "Update-Delete-Limit" { - -O2 - -DSQLITE_DEFAULT_FILE_FORMAT=4 - -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 - -DSQLITE_ENABLE_STMT_SCANSTATUS - -DSQLITE_LIKE_DOESNT_MATCH_BLOBS - -DSQLITE_ENABLE_CURSOR_HINTS - --enable-json1 - } - "Check-Symbols" { - -DSQLITE_MEMDEBUG=1 - -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 - -DSQLITE_ENABLE_FTS3=1 - -DSQLITE_ENABLE_RTREE=1 - -DSQLITE_ENABLE_MEMSYS5=1 - -DSQLITE_ENABLE_MEMSYS3=1 - -DSQLITE_ENABLE_COLUMN_METADATA=1 - -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 - -DSQLITE_SECURE_DELETE=1 - -DSQLITE_SOUNDEX=1 - -DSQLITE_ENABLE_ATOMIC_WRITE=1 - -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 - -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1 - -DSQLITE_ENABLE_STAT4 - -DSQLITE_ENABLE_STMT_SCANSTATUS - --enable-json1 --enable-fts5 --enable-session - } - "Debug-One" { - --disable-shared - -O2 -funsigned-char - -DSQLITE_DEBUG=1 - -DSQLITE_MEMDEBUG=1 - -DSQLITE_MUTEX_NOOP=1 - -DSQLITE_TCL_DEFAULT_FULLMUTEX=1 - -DSQLITE_ENABLE_FTS3=1 - -DSQLITE_ENABLE_RTREE=1 - -DSQLITE_ENABLE_MEMSYS5=1 - -DSQLITE_ENABLE_COLUMN_METADATA=1 - -DSQLITE_ENABLE_STAT4 - -DSQLITE_ENABLE_HIDDEN_COLUMNS - -DSQLITE_MAX_ATTACHED=125 - -DSQLITE_MUTATION_TEST - --enable-fts5 --enable-json1 - } - "Fast-One" { - -O6 - -DSQLITE_ENABLE_FTS4=1 - -DSQLITE_ENABLE_RTREE=1 - -DSQLITE_ENABLE_STAT4 - -DSQLITE_ENABLE_RBU - -DSQLITE_MAX_ATTACHED=125 - -DLONGDOUBLE_TYPE=double - --enable-session - } - "Device-One" { - -O2 - -DSQLITE_DEBUG=1 - -DSQLITE_DEFAULT_AUTOVACUUM=1 - -DSQLITE_DEFAULT_CACHE_SIZE=64 - -DSQLITE_DEFAULT_PAGE_SIZE=1024 - -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32 - -DSQLITE_DISABLE_LFS=1 - -DSQLITE_ENABLE_ATOMIC_WRITE=1 - -DSQLITE_ENABLE_IOTRACE=1 - -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 - -DSQLITE_MAX_PAGE_SIZE=4096 - -DSQLITE_OMIT_LOAD_EXTENSION=1 - -DSQLITE_OMIT_PROGRESS_CALLBACK=1 - -DSQLITE_OMIT_VIRTUALTABLE=1 - -DSQLITE_ENABLE_HIDDEN_COLUMNS - -DSQLITE_TEMP_STORE=3 - --enable-json1 - } - "Device-Two" { - -DSQLITE_4_BYTE_ALIGNED_MALLOC=1 - -DSQLITE_DEFAULT_AUTOVACUUM=1 - -DSQLITE_DEFAULT_CACHE_SIZE=1000 - -DSQLITE_DEFAULT_LOCKING_MODE=0 - -DSQLITE_DEFAULT_PAGE_SIZE=1024 - -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000 - -DSQLITE_DISABLE_LFS=1 - -DSQLITE_ENABLE_FTS3=1 - -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 - -DSQLITE_ENABLE_RTREE=1 - -DSQLITE_MAX_COMPOUND_SELECT=50 - -DSQLITE_MAX_PAGE_SIZE=32768 - -DSQLITE_OMIT_TRACE=1 - -DSQLITE_TEMP_STORE=3 - -DSQLITE_THREADSAFE=2 - --enable-json1 --enable-fts5 --enable-session - } - "Locking-Style" { - -O2 - -DSQLITE_ENABLE_LOCKING_STYLE=1 - } - "Apple" { - -Os - -DHAVE_GMTIME_R=1 - -DHAVE_ISNAN=1 - -DHAVE_LOCALTIME_R=1 - -DHAVE_PREAD=1 - -DHAVE_PWRITE=1 - -DHAVE_USLEEP=1 - -DHAVE_USLEEP=1 - -DHAVE_UTIME=1 - -DSQLITE_DEFAULT_CACHE_SIZE=1000 - -DSQLITE_DEFAULT_CKPTFULLFSYNC=1 - -DSQLITE_DEFAULT_MEMSTATUS=1 - -DSQLITE_DEFAULT_PAGE_SIZE=1024 - -DSQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS=1 - -DSQLITE_ENABLE_API_ARMOR=1 - -DSQLITE_ENABLE_AUTO_PROFILE=1 - -DSQLITE_ENABLE_FLOCKTIMEOUT=1 - -DSQLITE_ENABLE_FTS3=1 - -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 - -DSQLITE_ENABLE_FTS3_TOKENIZER=1 - if:os=="Darwin" -DSQLITE_ENABLE_LOCKING_STYLE=1 - -DSQLITE_ENABLE_PERSIST_WAL=1 - -DSQLITE_ENABLE_PURGEABLE_PCACHE=1 - -DSQLITE_ENABLE_RTREE=1 - -DSQLITE_ENABLE_SNAPSHOT=1 - # -DSQLITE_ENABLE_SQLLOG=1 - -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 - -DSQLITE_MAX_LENGTH=2147483645 - -DSQLITE_MAX_VARIABLE_NUMBER=500000 - # -DSQLITE_MEMDEBUG=1 - -DSQLITE_NO_SYNC=1 - -DSQLITE_OMIT_AUTORESET=1 - -DSQLITE_OMIT_LOAD_EXTENSION=1 - -DSQLITE_PREFER_PROXY_LOCKING=1 - -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 - -DSQLITE_THREADSAFE=2 - -DSQLITE_USE_URI=1 - -DSQLITE_WRITE_WALFRAME_PREBUFFERED=1 - -DUSE_GUARDED_FD=1 - -DUSE_PREAD=1 - --enable-json1 --enable-fts5 - } - "Extra-Robustness" { - -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1 - -DSQLITE_MAX_ATTACHED=62 - } - "Devkit" { - -DSQLITE_DEFAULT_FILE_FORMAT=4 - -DSQLITE_MAX_ATTACHED=30 - -DSQLITE_ENABLE_COLUMN_METADATA - -DSQLITE_ENABLE_FTS4 - -DSQLITE_ENABLE_FTS5 - -DSQLITE_ENABLE_FTS4_PARENTHESIS - -DSQLITE_DISABLE_FTS4_DEFERRED - -DSQLITE_ENABLE_RTREE - --enable-json1 --enable-fts5 - } - "No-lookaside" { - -DSQLITE_TEST_REALLOC_STRESS=1 - -DSQLITE_OMIT_LOOKASIDE=1 - -DHAVE_USLEEP=1 - } - "Valgrind" { - -DSQLITE_ENABLE_STAT4 - -DSQLITE_ENABLE_FTS4 - -DSQLITE_ENABLE_RTREE - -DSQLITE_ENABLE_HIDDEN_COLUMNS - -DCONFIG_SLOWDOWN_FACTOR=8.0 - --enable-json1 - } - - # The next group of configurations are used only by the - # Failure-Detection platform. They are all the same, but we need - # different names for them all so that they results appear in separate - # subdirectories. - # - Fail0 {-O0} - Fail2 {-O0} - Fail3 {-O0} - Fail4 {-O0} - FuzzFail1 {-O0} - FuzzFail2 {-O0} -}] - -array set ::Platforms [strip_comments { - Linux-x86_64 { - "Check-Symbols" checksymbols - "Fast-One" "fuzztest test" - "Debug-One" "mptest test" - "Have-Not" test - "Secure-Delete" test - "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test" - "User-Auth" tcltest - "Update-Delete-Limit" test - "Extra-Robustness" test - "Device-Two" "threadtest test" - "No-lookaside" test - "Devkit" test - "Apple" test - "Sanitize" {QUICKTEST_OMIT=func4.test,nan.test test} - "Device-One" fulltest - "Default" "threadtest fulltest" - "Valgrind" valgrindtest - } - Linux-i686 { - "Devkit" test - "Have-Not" test - "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test" - "Device-One" test - "Device-Two" test - "Default" "threadtest fulltest" - } - Darwin-i386 { - "Locking-Style" "mptest test" - "Have-Not" test - "Apple" "threadtest fulltest" - } - Darwin-x86_64 { - "Locking-Style" "mptest test" - "Have-Not" test - "Apple" "threadtest fulltest" - } - "Windows NT-intel" { - "Stdcall" test - "Have-Not" test - "Default" "mptest fulltestonly" - } - "Windows NT-amd64" { - "Stdcall" test - "Have-Not" test - "Default" "mptest fulltestonly" - } - - # The Failure-Detection platform runs various tests that deliberately - # fail. This is used as a test of this script to verify that this script - # correctly identifies failures. - # - Failure-Detection { - Fail0 "TEST_FAILURE=0 test" - Sanitize "TEST_FAILURE=1 test" - Fail2 "TEST_FAILURE=2 valgrindtest" - Fail3 "TEST_FAILURE=3 valgrindtest" - Fail4 "TEST_FAILURE=4 test" - FuzzFail1 "TEST_FAILURE=5 test" - FuzzFail2 "TEST_FAILURE=5 valgrindtest" - } -}] - - -# End of configuration section. -######################################################################### -######################################################################### - -# Configuration verification: Check that each entry in the list of configs -# specified for each platforms exists. -# -foreach {key value} [array get ::Platforms] { - foreach {v t} $value { - if {0==[info exists ::Configs($v)]} { - puts stderr "No such configuration: \"$v\"" - exit -1 - } - } -} - -# Output log. Disabled for slave interpreters. -# -if {[lindex $argv end]!="--slave"} { - set LOG [open releasetest-out.txt w] - proc PUTS {txt} { - puts $txt - puts $::LOG $txt - flush $::LOG - } - proc PUTSNNL {txt} { - puts -nonewline $txt - puts -nonewline $::LOG $txt - flush $::LOG - } - proc PUTSERR {txt} { - puts stderr $txt - puts $::LOG $txt - flush $::LOG - } - puts $LOG "$argv0 $argv" - set tm0 [clock format [clock seconds] -format {%Y-%m-%d %H:%M:%S} -gmt 1] - puts $LOG "start-time: $tm0 UTC" -} else { - proc PUTS {txt} { - puts $txt - } - proc PUTSNNL {txt} { - puts -nonewline $txt - } - proc PUTSERR {txt} { - puts stderr $txt - } -} - -# Open the file $logfile and look for a report on the number of errors -# and the number of test cases run. Add these values to the global -# $::NERRCASE and $::NTESTCASE variables. -# -# If any errors occur, then write into $errmsgVar the text of an appropriate -# one-line error message to show on the output. -# -proc count_tests_and_errors {logfile rcVar errmsgVar} { - if {$::DRYRUN} return - upvar 1 $rcVar rc $errmsgVar errmsg - set fd [open $logfile rb] - set seen 0 - while {![eof $fd]} { - set line [gets $fd] - if {[regexp {(\d+) errors out of (\d+) tests} $line all nerr ntest]} { - incr ::NERRCASE $nerr - incr ::NTESTCASE $ntest - set seen 1 - if {$nerr>0} { - set rc 1 - set errmsg $line - } - } - if {[regexp {runtime error: +(.*)} $line all msg]} { - # skip over "value is outside range" errors - if {[regexp {value .* is outside the range of representable} $line]} { - # noop - } elseif {[regexp {overflow: .* cannot be represented} $line]} { - # noop - } else { - incr ::NERRCASE - if {$rc==0} { - set rc 1 - set errmsg $msg - } - } - } - if {[regexp {fatal error +(.*)} $line all msg]} { - incr ::NERRCASE - if {$rc==0} { - set rc 1 - set errmsg $msg - } - } - if {[regexp {ERROR SUMMARY: (\d+) errors.*} $line all cnt] && $cnt>0} { - incr ::NERRCASE - if {$rc==0} { - set rc 1 - set errmsg $all - } - } - if {[regexp {^VERSION: 3\.\d+.\d+} $line]} { - set v [string range $line 9 end] - if {$::SQLITE_VERSION eq ""} { - set ::SQLITE_VERSION $v - } elseif {$::SQLITE_VERSION ne $v} { - set rc 1 - set errmsg "version conflict: {$::SQLITE_VERSION} vs. {$v}" - } - } - } - close $fd - if {$::BUILDONLY} { - incr ::NTESTCASE - if {$rc!=0} { - set errmsg "Build failed" - } - } elseif {!$seen} { - set rc 1 - set errmsg "Test did not complete" - if {[file readable core]} { - append errmsg " - core file exists" - } - } -} - -#-------------------------------------------------------------------------- -# This command is invoked as the [main] routine for scripts run with the -# "--slave" option. -# -# For each test (i.e. "configure && make test" execution), the master -# process spawns a process with the --slave option. It writes two lines -# to the slaves stdin. The first contains a single boolean value - the -# value of ::TRACE to use in the slave script. The second line contains a -# list in the same format as each element of the list passed to the -# [run_all_test_suites] command in the master process. -# -# The slave then runs the "configure && make test" commands specified. It -# exits successfully if the tests passes, or with a non-zero error code -# otherwise. -# -proc run_slave_test {} { - # Read global vars configuration from stdin. - set V [gets stdin] - foreach {::TRACE ::MSVC ::DRYRUN ::KEEPFILES} $V {} - - # Read the test-suite configuration from stdin. - set T [gets stdin] - foreach {title dir configOpts testtarget makeOpts cflags opts} $T {} - - # Create and switch to the test directory. - set normaldir [file normalize $dir] - set ::env(SQLITE_TMPDIR) $normaldir - trace_cmd file mkdir $dir - trace_cmd cd $dir - catch {file delete core} - catch {file delete test.log} - - # Run the "./configure && make" commands. - set rc 0 - set rc [catch [configureCommand $configOpts]] - if {!$rc} { - if {[info exists ::env(TCLSH_CMD)]} { - set savedEnv(TCLSH_CMD) $::env(TCLSH_CMD) - } else { - unset -nocomplain savedEnv(TCLSH_CMD) - } - set ::env(TCLSH_CMD) [file nativename [info nameofexecutable]] - - # Create a file called "makecommand.sh" containing the text of - # the make command line. - catch { - set cmd [makeCommand $testtarget $makeOpts $cflags $opts] - set fd [open makecommand.sh w] - foreach e $cmd { - if {[string first " " $e]>=0} { - puts -nonewline $fd "\"$e\"" - } else { - puts -nonewline $fd $e - } - puts -nonewline $fd " " - } - puts $fd "" - close $fd - } msg - - # Run the make command. - set rc [catch {trace_cmd exec {*}$cmd >>& test.log} msg] - if {[info exists savedEnv(TCLSH_CMD)]} { - set ::env(TCLSH_CMD) $savedEnv(TCLSH_CMD) - } else { - unset -nocomplain ::env(TCLSH_CMD) - } - } - - # Clean up lots of extra files if --keep was not specified. - if {$::KEEPFILES==0} { cleanup $normaldir } - - # Exis successfully if the test passed, or with a non-zero error code - # otherwise. - exit $rc -} - -# This command is invoked in the master process each time a slave -# file-descriptor is readable. -# -proc slave_fileevent {fd T tm1} { - global G - foreach {title dir configOpts testtarget makeOpts cflags opts} $T {} - - if {[eof $fd]} { - fconfigure $fd -blocking 1 - set rc [catch { close $fd }] - - set errmsg {} - set logfile [file join $dir test.log] - if {[file exists $logfile]} { - count_tests_and_errors [file join $dir test.log] rc errmsg - } elseif {$rc==0 && !$::DRYRUN} { - set rc 1 - set errmsg "no test.log file..." - } - - if {!$::TRACE} { - set tm2 [clock seconds] - set hours [expr {($tm2-$tm1)/3600}] - set minutes [expr {(($tm2-$tm1)/60)%60}] - set seconds [expr {($tm2-$tm1)%60}] - set tm [format (%02d:%02d:%02d) $hours $minutes $seconds] - - if {$rc} { - set status FAIL - incr ::NERR - } else { - set status Ok - } - - set n [string length $title] - if {$::PROGRESS_MSGS} { - PUTS "finished: ${title}[string repeat . [expr {53-$n}]] $status $tm" - } else { - PUTS "${title}[string repeat . [expr {63-$n}]] $status $tm" - } - if {$errmsg!=""} {PUTS " $errmsg"} - flush stdout - } - - incr G(nJob) -1 - } else { - set line [gets $fd] - if {[string trim $line] != ""} { - puts "Trace : $title - \"$line\"" - } - } -} - -#-------------------------------------------------------------------------- -# The only argument passed to this function is a list of test-suites to -# run. Each "test-suite" is itself a list consisting of the following -# elements: -# -# * Test title (for display). -# * The name of the directory to run the test in. -# * The argument for [configureCommand] -# * The first argument for [makeCommand] -# * The second argument for [makeCommand] -# * The third argument for [makeCommand] -# -proc run_all_test_suites {alltests} { - global G - set tests $alltests - - set G(nJob) 0 - - while {[llength $tests]>0 || $G(nJob)>0} { - if {$G(nJob)>=$::JOBS || [llength $tests]==0} { - vwait G(nJob) - } - - if {[llength $tests]>0} { - set T [lindex $tests 0] - set tests [lrange $tests 1 end] - foreach {title dir configOpts testtarget makeOpts cflags opts} $T {} - if {$::PROGRESS_MSGS && !$::TRACE} { - set n [string length $title] - PUTS "starting: ${title} at [now]" - flush stdout - } - - # Run the job. - # - set tm1 [clock seconds] - incr G(nJob) - set script [file normalize [info script]] - set fd [open "|[info nameofexecutable] $script --slave" r+] - fconfigure $fd -blocking 0 - fileevent $fd readable [list slave_fileevent $fd $T $tm1] - puts $fd [list $::TRACE $::MSVC $::DRYRUN $::KEEPFILES] - puts $fd [list {*}$T] - flush $fd - } - } -} - -proc add_test_suite {listvar name testtarget config} { - upvar $listvar alltests - - # Tcl variable $opts is used to build up the value used to set the - # OPTS Makefile variable. Variable $cflags holds the value for - # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but - # CFLAGS is only passed to gcc. - # - set makeOpts "" - set cflags [expr {$::MSVC ? "-Zi" : "-g"}] - set opts "" - set title ${name}($testtarget) - set configOpts $::WITHTCL - set skip 0 - - regsub -all {#[^\n]*\n} $config \n config - foreach arg $config { - if {$skip} { - set skip 0 - continue - } - if {[regexp {^-[UD]} $arg]} { - lappend opts $arg - } elseif {[regexp {^[A-Z]+=} $arg]} { - lappend testtarget $arg - } elseif {[regexp {^if:([a-z]+)(.*)} $arg all key tail]} { - # Arguments of the form 'if:os=="Linux"' will cause the subsequent - # argument to be skipped if the $tcl_platform(os) is not "Linux", for - # example... - set skip [expr !(\$::tcl_platform($key)$tail)] - } elseif {[regexp {^--(enable|disable)-} $arg]} { - if {$::MSVC} { - if {$arg eq "--disable-amalgamation"} { - lappend makeOpts USE_AMALGAMATION=0 - continue - } - if {$arg eq "--disable-shared"} { - lappend makeOpts USE_CRT_DLL=0 DYNAMIC_SHELL=0 - continue - } - if {$arg eq "--enable-fts5"} { - lappend opts -DSQLITE_ENABLE_FTS5 - continue - } - if {$arg eq "--enable-json1"} { - lappend opts -DSQLITE_ENABLE_JSON1 - continue - } - if {$arg eq "--enable-shared"} { - lappend makeOpts USE_CRT_DLL=1 DYNAMIC_SHELL=1 - continue - } - } - lappend configOpts $arg - } else { - if {$::MSVC} { - if {$arg eq "-g"} { - lappend cflags -Zi - continue - } - if {[regexp -- {^-O(\d+)$} $arg all level]} then { - lappend makeOpts OPTIMIZATIONS=$level - continue - } - } - lappend cflags $arg - } - } - - # Disable sync to make testing faster. - # - lappend opts -DSQLITE_NO_SYNC=1 - - # Some configurations already set HAVE_USLEEP; in that case, skip it. - # - if {[lsearch -regexp $opts {^-DHAVE_USLEEP(?:=|$)}]==-1} { - lappend opts -DHAVE_USLEEP=1 - } - - # Add the define for this platform. - # - if {$::tcl_platform(platform)=="windows"} { - lappend opts -DSQLITE_OS_WIN=1 - } else { - lappend opts -DSQLITE_OS_UNIX=1 - } - - # Set the sub-directory to use. - # - set dir [string tolower [string map {- _ " " _} $name]] - - # Join option lists into strings, using space as delimiter. - # - set makeOpts [join $makeOpts " "] - set cflags [join $cflags " "] - set opts [join $opts " "] - - lappend alltests [list \ - $title $dir $configOpts $testtarget $makeOpts $cflags $opts] -} - -# The following procedure returns the "configure" command to be exectued for -# the current platform, which may be Windows (via MinGW, etc). -# -proc configureCommand {opts} { - if {$::MSVC} return [list]; # This is not needed for MSVC. - set result [list trace_cmd exec] - if {$::tcl_platform(platform)=="windows"} { - lappend result sh - } - lappend result $::SRCDIR/configure --enable-load-extension - foreach x $opts {lappend result $x} - lappend result >& test.log -} - -# The following procedure returns the "make" command to be executed for the -# specified targets, compiler flags, and options. -# -proc makeCommand { targets makeOpts cflags opts } { - set result [list] - if {$::MSVC} { - set nmakeDir [file nativename $::SRCDIR] - set nmakeFile [file nativename [file join $nmakeDir Makefile.msc]] - lappend result nmake /f $nmakeFile TOP=$nmakeDir - set tclDir [file nativename [file normalize \ - [file dirname [file dirname [info nameofexecutable]]]]] - lappend result "TCLDIR=$tclDir" - if {[regexp {USE_STDCALL=1} $cflags]} { - lappend result USE_STDCALL=1 - } - } else { - lappend result make - } - foreach makeOpt $makeOpts { - lappend result $makeOpt - } - lappend result clean - foreach target $targets { - lappend result $target - } - lappend result CFLAGS=$cflags OPTS=$opts -} - -# The following procedure prints its arguments if ::TRACE is true. -# And it executes the command of its arguments in the calling context -# if ::DRYRUN is false. -# -proc trace_cmd {args} { - if {$::TRACE} { - PUTS $args - } - set res "" - if {!$::DRYRUN} { - set res [uplevel 1 $args] - } - return $res -} - - -# This proc processes the command line options passed to this script. -# Currently the only option supported is "-makefile", default -# "releasetest.mk". Set the ::MAKEFILE variable to the value of this -# option. -# -proc process_options {argv} { - set ::SRCDIR [file normalize [file dirname [file dirname $::argv0]]] - set ::QUICK 0 - set ::MSVC 0 - set ::BUILDONLY 0 - set ::DRYRUN 0 - set ::TRACE 0 - set ::JOBS 1 - set ::PROGRESS_MSGS 0 - set ::WITHTCL {} - set ::FORCE 0 - set ::KEEPFILES 0 ;# Keep extra files after test run - set config {} - set platform $::tcl_platform(os)-$::tcl_platform(machine) - - for {set i 0} {$i < [llength $argv]} {incr i} { - set x [lindex $argv $i] - if {[regexp {^--[a-z]} $x]} {set x [string range $x 1 end]} - switch -glob -- $x { - -slave { - run_slave_test - exit - } - - # Undocumented legacy option: --srcdir DIRECTORY - # - # DIRECTORY is the root of the SQLite checkout. This sets the - # SRCDIR global variable. But that variable is already set - # automatically so there really is no reason to have this option. - # - -srcdir { - incr i - set ::SRCDIR [file normalize [lindex $argv $i]] - } - - -platform { - incr i - set platform [lindex $argv $i] - } - - -jobs { - incr i - set ::JOBS [lindex $argv $i] - } - - -progress { - set ::PROGRESS_MSGS 1 - } - - -quick { - set ::QUICK 1 - } - -veryquick { - set ::QUICK 2 - } - - -config { - incr i - set config [lindex $argv $i] - } - - -msvc { - set ::MSVC 1 - } - - -buildonly { - set ::BUILDONLY 1 - } - - -dryrun { - set ::DRYRUN 1 - } - - -force - - -f { - set ::FORCE 1 - } - - -trace { - set ::TRACE 1 - } - - -info { - PUTS "Command-line Options:" - PUTS " --srcdir $::SRCDIR" - PUTS " --platform [list $platform]" - PUTS " --config [list $config]" - if {$::QUICK} { - if {$::QUICK==1} {PUTS " --quick"} - if {$::QUICK==2} {PUTS " --veryquick"} - } - if {$::MSVC} {PUTS " --msvc"} - if {$::BUILDONLY} {PUTS " --buildonly"} - if {$::DRYRUN} {PUTS " --dryrun"} - if {$::TRACE} {PUTS " --trace"} - PUTS "\nAvailable --platform options:" - foreach y [lsort [array names ::Platforms]] { - PUTS " [list $y]" - } - PUTS "\nAvailable --config options:" - foreach y [lsort [array names ::Configs]] { - PUTS " [list $y]" - } - exit - } - - -g { - lappend ::EXTRACONFIG [lindex $argv $i] - } - - -keep { - set ::KEEPFILES 1 - } - - -with-tcl=* { - set ::WITHTCL -$x - } - - -D* - - -O* - - -enable-* - - -disable-* - - *=* { - lappend ::EXTRACONFIG [lindex $argv $i] - } - - default { - PUTSERR "" - PUTSERR [string trim $::USAGE_MESSAGE] - exit -1 - } - } - } - - if {0==[info exists ::Platforms($platform)]} { - PUTS "Unknown platform: $platform" - PUTSNNL "Set the -platform option to " - set print [list] - foreach p [array names ::Platforms] { - lappend print "\"$p\"" - } - lset print end "or [lindex $print end]" - PUTS "[join $print {, }]." - exit - } - - if {$config!=""} { - if {[llength $config]==1} {lappend config fulltest} - set ::CONFIGLIST $config - } else { - if {$::JOBS>1} { - set ::CONFIGLIST {} - foreach {target zConfig} [lreverse $::Platforms($platform)] { - append ::CONFIGLIST [format " %-25s %s\n" \ - [list $zConfig] [list $target]] - } - } else { - set ::CONFIGLIST $::Platforms($platform) - } - } - PUTS "Running the following test configurations for $platform:" - PUTS " [string trim $::CONFIGLIST]" - PUTSNNL "Flags:" - if {$::PROGRESS_MSGS} {PUTSNNL " --progress"} - if {$::DRYRUN} {PUTSNNL " --dryrun"} - if {$::BUILDONLY} {PUTSNNL " --buildonly"} - if {$::MSVC} {PUTSNNL " --msvc"} - switch -- $::QUICK { - 1 {PUTSNNL " --quick"} - 2 {PUTSNNL " --veryquick"} - } - if {$::JOBS>1} {PUTSNNL " --jobs $::JOBS"} - PUTS "" -} - -# Check to see if there are uncommitted changes in the SQLite source -# checkout. Exit if there are. Except: Do nothing if the --force -# flag is used. Also, ignore this test if the fossil binary is -# unavailable, or if the source tree is not a valid fossil checkout. -# -proc check_uncommitted {} { - if {$::FORCE} return - set pwd [pwd] - cd $::SRCDIR - if {[catch {exec fossil changes} res]==0 && [string trim $res]!=""} { - puts "ERROR: The check-out contains uncommitted changes:" - puts $res - puts "Use the -f or --force options to override" - exit 1 - } - cd $pwd -} - -# A test run has just finished in directory $dir. This command deletes all -# non-essential files from the directory. Specifically, everything except -# -# * The "testfixture" and "sqlite3" binaries, -# * The "test-out.log" and "test.log" log files. -# -proc cleanup {dir} { - set K(testfixture) 1 - set K(testfixture.exe) 1 - set K(sqlite3) 1 - set K(sqlite3.exe) 1 - set K(test-out.txt) 1 - set K(test.log) 1 - - foreach f [glob -nocomplain [file join $dir *]] { - set tail [file tail $f] - if {[info exists K($tail)]==0} { - file delete -force $f - } - } -} - - -# Main routine. -# -proc main {argv} { - - # Process any command line options. - set ::EXTRACONFIG {} - process_options $argv - if {!$::DRYRUN} check_uncommitted - PUTS [string repeat * 79] - - set ::NERR 0 - set ::NTEST 0 - set ::NTESTCASE 0 - set ::NERRCASE 0 - set ::SQLITE_VERSION {} - set STARTTIME [clock seconds] - foreach {zConfig target} $::CONFIGLIST { - if {$::MSVC && ($zConfig eq "Sanitize" || "checksymbols" in $target - || "valgrindtest" in $target)} { - PUTS "Skipping $zConfig / $target for MSVC..." - continue - } - if {$target ne "checksymbols"} { - switch -- $::QUICK { - 1 {set target quicktest} - 2 {set target smoketest} - } - if {$::BUILDONLY} { - set target testfixture - if {$::tcl_platform(platform)=="windows"} { - append target .exe - } - } - } - set config_options [concat $::Configs($zConfig) $::EXTRACONFIG] - - incr NTEST - add_test_suite all $zConfig $target $config_options - - # If the configuration included the SQLITE_DEBUG option, then remove - # it and run veryquick.test. If it did not include the SQLITE_DEBUG option - # add it and run veryquick.test. - if {$target!="checksymbols" && $target!="valgrindtest" - && $target!="fuzzoomtest" && !$::BUILDONLY && $::QUICK<2} { - set debug_idx [lsearch -glob $config_options -DSQLITE_DEBUG*] - set xtarget $target - regsub -all {fulltest[a-z]*} $xtarget test xtarget - regsub -all {fuzzoomtest} $xtarget fuzztest xtarget - if {$debug_idx < 0} { - incr NTEST - append config_options " -DSQLITE_DEBUG=1 -DSQLITE_EXTRA_IFNULLROW=1" - add_test_suite all "${zConfig}_debug" $xtarget $config_options - } else { - incr NTEST - regsub { *-DSQLITE_MEMDEBUG[^ ]* *} $config_options { } config_options - regsub { *-DSQLITE_DEBUG[^ ]* *} $config_options { } config_options - add_test_suite all "${zConfig}_ndebug" $xtarget $config_options - } - } - } - - run_all_test_suites $all - - set elapsetime [expr {[clock seconds]-$STARTTIME}] - set hr [expr {$elapsetime/3600}] - set min [expr {($elapsetime/60)%60}] - set sec [expr {$elapsetime%60}] - set etime [format (%02d:%02d:%02d) $hr $min $sec] - if {$::JOBS>1} {append etime " $::JOBS cores"} - if {[catch {exec hostname} HNAME]==0} {append etime " on $HNAME"} - PUTS [string repeat * 79] - incr ::NERRCASE $::NERR - PUTS "$::NERRCASE failures out of $::NTESTCASE tests in $etime" - if {$::SQLITE_VERSION ne ""} { - PUTS "SQLite $::SQLITE_VERSION" - } -} - -main $argv diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index d90ae2c74f..878b546db2 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -22,14 +22,6 @@ # "fulltest"). The program may be invoked as follows: # set USAGE { -$argv0 platforms - List available platforms. - -$argv0 tests ?-nodebug? PLATFORM - List tests in a specified platform. If the -nodebug switch is - specified, synthetic debug/ndebug configurations are omitted. Each - test is a combination of a configuration and a makefile target. - $argv0 script ?-msvc? CONFIGURATION TARGET Given a configuration and make target, return a bash (or, if -msvc is specified, batch) script to execute the test. The first argument @@ -37,6 +29,14 @@ $argv0 script ?-msvc? CONFIGURATION TARGET $argv0 configurations List available configurations. + +$argv0 platforms + List available platforms. + +$argv0 tests ?-nodebug? PLATFORM + List tests in a specified platform. If the -nodebug switch is + specified, synthetic debug/ndebug configurations are omitted. Each + test is a combination of a configuration and a makefile target. } # Omit comments (text between # and \n) in a long multi-line string. @@ -289,56 +289,56 @@ if {$tcl_platform(os)=="Darwin"} { array set ::Platforms [strip_comments { Linux-x86_64 { - "Check-Symbols*" checksymbols - "Fast-One" "QUICKTEST_INCLUDE=rbu.test fuzztest test" - "Debug-One" "mptest test" - "Debug-Two" "test" - "Have-Not" test - "Secure-Delete" test - "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test" - "User-Auth" tcltest - "Update-Delete-Limit" test - "Extra-Robustness" test - "Device-Two" "threadtest test" - "No-lookaside" test - "Devkit" test - "Apple" test - "Sanitize" test - "Device-One" fulltest - "Default" "threadtest fulltest" - "Valgrind*" valgrindtest + "Check-Symbols*" "" checksymbols + "Fast-One" QUICKTEST_INCLUDE=rbu.test "fuzztest test" + "Debug-One" "" "mptest test" + "Debug-Two" "" test + "Have-Not" "" test + "Secure-Delete" "" test + "Unlock-Notify" QUICKTEST_INCLUDE=notify2.test test + "User-Auth" "" tcltest + "Update-Delete-Limit" "" test + "Extra-Robustness" "" test + "Device-Two" "" "threadtest test" + "No-lookaside" "" test + "Devkit" "" test + "Apple" "" test + "Sanitize*" "" test + "Device-One" "" "fuzztest alltest" + "Default" "" "threadtest fuzztest alltest" + "Valgrind*" "" valgrindtest } Linux-i686 { - "Devkit" test - "Have-Not" test - "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test" - "Device-One" test - "Device-Two" test - "Default" "threadtest fulltest" + "Devkit" "" test + "Have-Not" "" test + "Unlock-Notify" QUICKTEST_INCLUDE=notify2.test test + "Device-One" "" test + "Device-Two" "" test + "Default" "" "threadtest fuzztest alltest" } Darwin-i386 { - "Locking-Style" "mptest test" - "Have-Not" test - "Apple" "threadtest fulltest" + "Locking-Style" "" "mptest test" + "Have-Not" "" test + "Apple" "" "threadtest fuzztest alltest" } Darwin-x86_64 { - "Locking-Style" "mptest test" - "Have-Not" test - "Apple" "threadtest fulltest" + "Locking-Style" "" "mptest test" + "Have-Not" "" test + "Apple" "" "threadtest fuzztest alltest" } "Windows NT-intel" { - "Stdcall" test - "Have-Not" test - "Windows-Memdebug*" test - "Windows-Win32Heap*" test - "Default" "mptest fulltestonly" + "Stdcall" "" test + "Have-Not" "" test + "Windows-Memdebug*" "" test + "Windows-Win32Heap*" "" test + "Default" "" "mptest fulltestonly" } "Windows NT-amd64" { - "Stdcall" test - "Have-Not" test - "Windows-Memdebug*" test - "Windows-Win32Heap*" test - "Default" "mptest fulltestonly" + "Stdcall" "" test + "Have-Not" "" test + "Windows-Memdebug*" "" test + "Windows-Win32Heap*" "" test + "Default" "" "mptest fulltestonly" } # The Failure-Detection platform runs various tests that deliberately @@ -346,13 +346,13 @@ array set ::Platforms [strip_comments { # correctly identifies failures. # Failure-Detection { - Fail0* "TEST_FAILURE=0 test" - Sanitize* "TEST_FAILURE=1 test" - Fail2* "TEST_FAILURE=2 valgrindtest" - Fail3* "TEST_FAILURE=3 valgrindtest" - Fail4* "TEST_FAILURE=4 test" - FuzzFail1* "TEST_FAILURE=5 test" - FuzzFail2* "TEST_FAILURE=5 valgrindtest" + Fail0* "TEST_FAILURE=0" test + Sanitize* "TEST_FAILURE=1" test + Fail2* "TEST_FAILURE=2" valgrindtest + Fail3* "TEST_FAILURE=3" valgrindtest + Fail4* "TEST_FAILURE=4" test + FuzzFail1* "TEST_FAILURE=5" test + FuzzFail2* "TEST_FAILURE=5" valgrindtest } }] @@ -368,7 +368,7 @@ array set ::Platforms [strip_comments { # specified for each platforms exists. # foreach {key value} [array get ::Platforms] { - foreach {v t} $value { + foreach {v vars t} $value { if {[string range $v end end]=="*"} { set v [string range $v 0 end-1] } @@ -439,6 +439,7 @@ proc main_script {args} { lappend opts -DSQLITE_EXTRA_IFNULLROW set config [string range $config 0 end-6] } + regexp {^(.*)-[0-9]+} $config -> config # Ensure that the named configuration exists. # @@ -474,6 +475,7 @@ proc main_script {args} { if {$bRemoveDebug} { if {$param=="-DSQLITE_DEBUG" || $param=="-DSQLITE_DEBUG=1" || $param=="-DSQLITE_MEMDEBUG" || $param=="-DSQLITE_MEMDEBUG=1" + || $param=="--enable-debug" } { continue } @@ -586,32 +588,57 @@ proc main_tests {args} { exit 1 } - foreach {config target} $::Platforms($p) { - set bNosynthetic 0 + set lTest [list] + + foreach {config vars target} $::Platforms($p) { if {[string range $config end end]=="*"} { - set bNosynthetic 1 set config [string range $config 0 end-1] - } - puts "$config \"$target\"" - if {$bNodebug==0 && $bNosynthetic==0} { - set iHas [string first SQLITE_DEBUG $::Configs($config)] - set dtarget [list] - set iQTI [lsearch -glob $target QUICKTEST_*] - if {$iQTI>=0} { - lappend dtarget [lindex $target $iQTI] - } + } elseif {$bNodebug==0} { + set dtarget test if {[lsearch $target tcltest]>=0} { - lappend dtarget tcltest - } else { - lappend dtarget test + set dtarget tcltest } - if {$iHas>=0} { - puts "$config-ndebug \"$dtarget\"" + if {$vars!=""} { set dtarget "$vars $dtarget" } + + if {[string first SQLITE_DEBUG $::Configs($config)]>=0 + || [string first --enable-debug $::Configs($config)]>=0 + } { + lappend lTest "$config-ndebug \"$dtarget\"" } else { - puts "$config-debug \"$dtarget\"" + lappend lTest "$config-debug \"$dtarget\"" + } + } + + if {[llength $target]==1 + && [lsearch $target "valgrindtest"]<0 + && [lsearch $target "alltest"]<0 + && [lsearch $target "fulltestonly"]<0 + && ![string match Sanitize* $config] + } { + if {$vars!=""} { set target "$vars $target" } + lappend lTest "$config \"$target\"" + } else { + set idir -1 + foreach t $target { + if {$t=="valgrindtest" || $t=="alltest" || $t=="fulltestonly" + || [string match Sanitize* $config] + } { + if {$vars!=""} { set t "$vars $t" } + for {set ii 1} {$ii<=4} {incr ii} { + lappend lTest "$config-[incr idir] \"TCLTEST_PART=$ii/4 $t\"" + } + } else { + if {$vars!=""} { set t "$vars $t" } + lappend lTest "$config-[incr idir] \"$t\"" + } } } } + + foreach l $lTest { + puts $l + } + } if {[llength $argv]==0} { usage } From 477572b9f1afc0d4f377554b64ad2c2c9e3146ac Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 7 Oct 2021 20:46:29 +0000 Subject: [PATCH 23/64] Protect access to the Expr.y union using nearby assert()s and branches. FossilOrigin-Name: 87e2f5eb436fc448427b0e24fb70f29688796b513b8c7b12f1a21540dae1e56d --- manifest | 34 +++++++++++----------- manifest.uuid | 2 +- src/alter.c | 12 ++++++-- src/expr.c | 76 ++++++++++++++++++++++++++++++++----------------- src/fkey.c | 1 + src/parse.y | 4 +-- src/resolve.c | 18 ++++++++---- src/select.c | 15 +++++++--- src/sqliteInt.h | 27 ++++++++---------- src/treeview.c | 1 + src/vtab.c | 1 + src/wherecode.c | 6 ++-- src/whereexpr.c | 12 ++++++-- 13 files changed, 131 insertions(+), 78 deletions(-) diff --git a/manifest b/manifest index 3cad8b9c70..b1297c51f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Break\sthe\stcl\srelease\stests\sinto\ssmaller\sunits\sto\sbetter\stake\sadvantage\sof\smulti-processor\ssystems. -D 2021-10-07T19:27:17.394 +C Protect\saccess\sto\sthe\sExpr.y\sunion\susing\snearby\sassert()s\sand\sbranches. +D 2021-10-07T20:46:29.719 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c c3ef7565031b96f70c6d240929052cc2603e54df4a48025e2387104c804b2de6 +F src/alter.c 9578c5a54027166688ec3e679ed10e85a3d08b986210e98d736f57aacc63335a F src/analyze.c 979b6d2cdaca992a9c9f0818de55d08fb9a4e52929a509752b52d9fd23bb86d3 F src/attach.c e3f9d9a2a4a844750f3f348f37afb244535f21382cbfcd840152cb21cb41cfaf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -501,9 +501,9 @@ F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 -F src/expr.c 19c0b5c7afaf6a305274b7de312f319bd86e802383f08ef6633f0752f51d96a8 +F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 0c57a9cd2a0ecd04dde0c06e41df46959526f52a68c4409591e0f8c41a577042 +F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 9577175a1459f65c9e3c4bbe7ed0bdf97ee928f693c81ee9f61e2642414c917c F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -538,7 +538,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c e20778eee03916035f5fb861bab7edb894779b1c448c3725fd4cde5f6a3edc6d F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 82bdd593c50bddcc285a173e9788a20296103217f5f5290c9122abf8af71af62 +F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -547,14 +547,14 @@ F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 7f8954f49ddf18d16a13866593eb4f51a6deba8b30b2d877e27ef1b385cd94db +F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 6164779bdafadf23f506e87224095b73f27be519b242579bd9d24a6d6a53d9fb +F src/select.c 56069fb5fae836179ffb58e8c4a2723a8c4e146abf7892472fbc5534a86e353f F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h e62e6eab356e01a8cf1c88d0a2ec7e403e5d3b141b4816ec0b5ea23acd1fcd14 +F src/sqliteInt.h 62fad2ae3aaf94a9398d031dc20bd147e2954a93e3d85455f3d999bebed48121 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -614,7 +614,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c e80a6126f82c0cd0a939aa617c428329c6e2c3351b7d4dabb8b8a83c9b4e7696 +F src/treeview.c 9dfdb7ff7f6645d0a6458dbdf4ffac041c071c4533a6db8bb6e502b979ac67bc F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -631,15 +631,15 @@ F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c -F src/vtab.c 3a6640d86d5dfae8f69715a1ee7405bb96d8982b39655b91c1f3648baae476a8 +F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 56e1902e9b91fb1fe159181a21c34abd59a01e2cb8f5ef4c3e478d32c5d838df F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c 6721f5de1d74d952b473c3f2473ea36b4a3aafed2c0ae0edb02c7e8a6b908d43 -F src/whereexpr.c 01d87dc0d5fb0a18100a65ba5466e399f2b8d96b3ec8a6056cf2aac10436afa5 +F src/wherecode.c 0bb4a2a82fc9ccfce105fb2ff2921de373c62aa60c770029f95bd8b685f3498a +F src/whereexpr.c 4514a162d878b6523a698fac1d760991b5728be0d7e2b2b0687aa175144dcf15 F src/window.c 0dff6fedf61493490d21ced5d7a7b4321d4c0db6c8123f0179c46080a860850a F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8eaa1d4a98b24adf245bbd2fe9212aa6a924a0f09c445906d7f87574f36a7423 -R 5eb83fb05c47023834fe1cae6d00b957 -U dan -Z 9054f47cc6bebbf9ed5d65ed018c55d7 +P 03cef1c30d96cd42682f57667bb3072c7643ef43fe05eda2d8b82c30789234af +R 06b773afbf19fb9230871daeb2e22572 +U drh +Z 58c40dd2d56708967ad96d2415e961d1 diff --git a/manifest.uuid b/manifest.uuid index 1b8acfde23..8fb5c801f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -03cef1c30d96cd42682f57667bb3072c7643ef43fe05eda2d8b82c30789234af \ No newline at end of file +87e2f5eb436fc448427b0e24fb70f29688796b513b8c7b12f1a21540dae1e56d \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 8b8fbf2be8..89e5a30faa 100644 --- a/src/alter.c +++ b/src/alter.c @@ -805,7 +805,9 @@ void sqlite3RenameTokenRemap(Parse *pParse, const void *pTo, const void *pFrom){ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ Parse *pParse = pWalker->pParse; sqlite3RenameTokenRemap(pParse, 0, (const void*)pExpr); - sqlite3RenameTokenRemap(pParse, 0, (const void*)&pExpr->y.pTab); + if( ExprUseYTab(pExpr) ){ + sqlite3RenameTokenRemap(pParse, 0, (const void*)&pExpr->y.pTab); + } return WRC_Continue; } @@ -1003,7 +1005,8 @@ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); }else if( pExpr->op==TK_COLUMN - && pExpr->iColumn==p->iCol + && pExpr->iColumn==p->iCol + && ALWAYS(ExprUseYTab(pExpr)) && p->pTab==pExpr->y.pTab ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); @@ -1606,7 +1609,10 @@ renameColumnFunc_done: */ static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ RenameCtx *p = pWalker->u.pRename; - if( pExpr->op==TK_COLUMN && p->pTab==pExpr->y.pTab ){ + if( pExpr->op==TK_COLUMN + && ALWAYS(ExprUseYTab(pExpr)) + && p->pTab==pExpr->y.pTab + ){ renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab); } return WRC_Continue; diff --git a/src/expr.c b/src/expr.c index 01f6ae4199..12c2ad636e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -53,8 +53,11 @@ char sqlite3ExprAffinity(const Expr *pExpr){ } op = pExpr->op; if( op==TK_REGISTER ) op = pExpr->op2; - if( (op==TK_COLUMN || op==TK_AGG_COLUMN) && pExpr->y.pTab ){ - return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); + if( op==TK_COLUMN || op==TK_AGG_COLUMN ){ + assert( ExprUseYTab(pExpr) ); + if( pExpr->y.pTab ){ + return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); + } } if( op==TK_SELECT ){ assert( ExprUseXSelect(pExpr) ); @@ -171,17 +174,18 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ while( p ){ int op = p->op; if( op==TK_REGISTER ) op = p->op2; - if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) - && p->y.pTab!=0 - ){ - /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally - ** a TK_COLUMN but was previously evaluated and cached in a register */ - int j = p->iColumn; - if( j>=0 ){ - const char *zColl = sqlite3ColumnColl(&p->y.pTab->aCol[j]); - pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + if( op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER ){ + assert( ExprUseYTab(p) ); + if( p->y.pTab!=0 ){ + /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally + ** a TK_COLUMN but was previously evaluated and cached in a register */ + int j = p->iColumn; + if( j>=0 ){ + const char *zColl = sqlite3ColumnColl(&p->y.pTab->aCol[j]); + pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); + } + break; } - break; } if( op==TK_CAST || op==TK_UPLUS ){ p = p->pLeft; @@ -1200,12 +1204,10 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ */ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( p!=0 ); - /* Sanity check: Assert that the IntValue is non-negative if it exists */ - assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 ); - - assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed ); - assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced) - || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) ); + assert( !ExprUseUValue(p) || p->u.iValue>=0 ); + assert( !ExprUseYWin(p) || !ExprUseYSub(p) ); + assert( !ExprUseYWin(p) || p->y.pWin!=0 || db->mallocFailed ); + assert( p->op!=TK_FUNCTION || !ExprUseYSub(p) ); #ifdef SQLITE_DEBUG if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ assert( p->pLeft==0 ); @@ -2451,6 +2453,7 @@ int sqlite3ExprCanBeNull(const Expr *p){ case TK_BLOB: return 0; case TK_COLUMN: + assert( ExprUseYTab(p) ); return ExprHasProperty(p, EP_CanBeNull) || p->y.pTab==0 || /* Reference to column of index on expression */ (p->iColumn>=0 @@ -3021,6 +3024,7 @@ void sqlite3CodeRhsOfIN( ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", pExpr->x.pSelect->selId)); } + assert( ExprUseYSub(pExpr) ); sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); @@ -3029,6 +3033,7 @@ void sqlite3CodeRhsOfIN( } /* Begin coding the subroutine */ + assert( !ExprUseYWin(pExpr) ); ExprSetProperty(pExpr, EP_Subrtn); assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); pExpr->y.sub.regReturn = ++pParse->nMem; @@ -3155,6 +3160,7 @@ void sqlite3CodeRhsOfIN( if( addrOnce ){ sqlite3VdbeJumpHere(v, addrOnce); /* Subroutine return */ + assert( ExprUseYSub(pExpr) ); sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); sqlite3ClearTempRegCache(pParse); @@ -3198,12 +3204,15 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ** subroutine. */ if( ExprHasProperty(pExpr, EP_Subrtn) ){ ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + assert( ExprUseYSub(pExpr) ); sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); return pExpr->iTable; } /* Begin coding the subroutine */ + assert( !ExprUseYWin(pExpr) ); + assert( !ExprHasProperty(pExpr, EP_Reduced|EP_TokenOnly) ); ExprSetProperty(pExpr, EP_Subrtn); pExpr->y.sub.regReturn = ++pParse->nMem; pExpr->y.sub.iAddr = @@ -3283,6 +3292,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ } /* Subroutine return */ + assert( ExprUseYSub(pExpr) ); sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); sqlite3ClearTempRegCache(pParse); @@ -4026,6 +4036,7 @@ expr_code_doover: */ int aff; iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); + assert( ExprUseYTab(pExpr) ); if( pExpr->y.pTab ){ aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); }else{ @@ -4049,9 +4060,11 @@ expr_code_doover: ** immediately prior to the first column. */ Column *pCol; - Table *pTab = pExpr->y.pTab; + Table *pTab; int iSrc; int iCol = pExpr->iColumn; + assert( ExprUseYTab(pExpr) ); + pTab = pExpr->y.pTab; assert( pTab!=0 ); assert( iCol>=XN_ROWID ); assert( iColnCol ); @@ -4089,6 +4102,7 @@ expr_code_doover: iTab = pParse->iSelfTab - 1; } } + assert( ExprUseYTab(pExpr) ); iReg = sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, pExpr->iColumn, iTab, target, pExpr->op2); @@ -4539,9 +4553,14 @@ expr_code_doover: ** p1==1 -> old.a p1==4 -> new.a ** p1==2 -> old.b p1==5 -> new.b */ - Table *pTab = pExpr->y.pTab; - int iCol = pExpr->iColumn; - int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + Table *pTab; + int iCol; + int p1; + + assert( ExprUseYTab(pExpr) ); + pTab = pExpr->y.pTab; + iCol = pExpr->iColumn; + p1 = pExpr->iTable * (pTab->nCol+1) + 1 + sqlite3TableColumnToStorage(pTab, iCol); assert( pExpr->iTable==0 || pExpr->iTable==1 ); @@ -5744,10 +5763,14 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_GE ); /* The y.pTab=0 assignment in wherecode.c always happens after the ** impliesNotNullRow() test */ - if( (pLeft->op==TK_COLUMN && pLeft->y.pTab!=0 - && IsVirtual(pLeft->y.pTab)) - || (pRight->op==TK_COLUMN && pRight->y.pTab!=0 - && IsVirtual(pRight->y.pTab)) + assert( pLeft->op!=TK_COLUMN || ExprUseYTab(pLeft) ); + assert( pRight->op!=TK_COLUMN || ExprUseYTab(pRight) ); + if( (pLeft->op==TK_COLUMN + && pLeft->y.pTab!=0 + && IsVirtual(pLeft->y.pTab)) + || (pRight->op==TK_COLUMN + && pRight->y.pTab!=0 + && IsVirtual(pRight->y.pTab)) ){ return WRC_Prune; } @@ -6073,6 +6096,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 ){ pCol = &pAggInfo->aCol[k]; + assert( ExprUseYTab(pExpr) ); pCol->pTab = pExpr->y.pTab; pCol->iTable = pExpr->iTable; pCol->iColumn = pExpr->iColumn; diff --git a/src/fkey.c b/src/fkey.c index 7a82a1c130..13b08dfe19 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -510,6 +510,7 @@ static Expr *exprTableColumn( ){ Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0); if( pExpr ){ + assert( ExprUseYTab(pExpr) ); pExpr->y.pTab = pTab; pExpr->iTable = iCursor; pExpr->iColumn = iCol; diff --git a/src/parse.y b/src/parse.y index 54bed4389a..97a26c28e8 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1039,9 +1039,9 @@ idlist(A) ::= nm(Y). ExprClearVVAProperties(p); p->iAgg = -1; p->pLeft = p->pRight = 0; - p->x.pList = 0; p->pAggInfo = 0; - p->y.pTab = 0; + memset(&p->x, 0, sizeof(p->x)); + memset(&p->y, 0, sizeof(p->y)); p->op2 = 0; p->iTable = 0; p->iColumn = 0; diff --git a/src/resolve.c b/src/resolve.c index a29b483db7..c55fc514cb 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -191,6 +191,7 @@ Bitmask sqlite3ExprColUsed(Expr *pExpr){ Table *pExTab; n = pExpr->iColumn; + assert( ExprUseYTab(pExpr) ); pExTab = pExpr->y.pTab; assert( pExTab!=0 ); if( (pExTab->tabFlags & TF_HasGenerated)!=0 @@ -328,6 +329,7 @@ static int lookupName( if( sqlite3StrICmp(zTabName, zTab)!=0 ){ continue; } + assert( ExprUseYTab(pExpr) ); if( IN_RENAME_OBJECT && pItem->zAlias ){ sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); } @@ -359,6 +361,7 @@ static int lookupName( } if( pMatch ){ pExpr->iTable = pMatch->iCursor; + assert( ExprUseYTab(pExpr) ); pExpr->y.pTab = pMatch->pTab; /* RIGHT JOIN not (yet) supported */ assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); @@ -432,6 +435,7 @@ static int lookupName( #ifndef SQLITE_OMIT_UPSERT if( pExpr->iTable==EXCLUDED_TABLE_NUMBER ){ testcase( iCol==(-1) ); + assert( ExprUseYTab(pExpr) ); if( IN_RENAME_OBJECT ){ pExpr->iColumn = iCol; pExpr->y.pTab = pTab; @@ -444,6 +448,7 @@ static int lookupName( }else #endif /* SQLITE_OMIT_UPSERT */ { + assert( ExprUseYTab(pExpr) ); pExpr->y.pTab = pTab; if( pParse->bReturning ){ eNewExprOp = TK_REGISTER; @@ -591,7 +596,7 @@ static int lookupName( sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); #endif pExpr->op = TK_STRING; - pExpr->y.pTab = 0; + memset(&pExpr->y, 0, sizeof(pExpr->y)); return WRC_Prune; } if( sqlite3ExprIdToTrueFalse(pExpr) ){ @@ -677,7 +682,9 @@ Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){ Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0); if( p ){ SrcItem *pItem = &pSrc->a[iSrc]; - Table *pTab = p->y.pTab = pItem->pTab; + Table *pTab; + assert( ExprUseYTab(p) ); + pTab = p->y.pTab = pItem->pTab; p->iTable = pItem->iCursor; if( p->y.pTab->iPKey==iCol ){ p->iColumn = -1; @@ -793,6 +800,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ assert( pSrcList && pSrcList->nSrc>=1 ); pItem = pSrcList->a; pExpr->op = TK_COLUMN; + assert( ExprUseYTab(pExpr) ); pExpr->y.pTab = pItem->pTab; pExpr->iTable = pItem->iCursor; pExpr->iColumn--; @@ -879,10 +887,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pLeft = pRight->pLeft; pRight = pRight->pRight; } - assert( !ExprHasProperty(pLeft, EP_IntValue) ); + assert( ExprUseUToken(pLeft) && ExprUseUToken(pRight) ); zTable = pLeft->u.zToken; - assert( !ExprHasProperty(pRight, EP_IntValue) ); zColumn = pRight->u.zToken; + assert( ExprUseYTab(pExpr) ); if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft); @@ -1071,7 +1079,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ Select *pSel = pNC->pWinSelect; - assert( pWin==pExpr->y.pWin ); + assert( pWin==0 || (ExprUseYWin(pExpr) && pWin==pExpr->y.pWin) ); if( IN_RENAME_OBJECT==0 ){ sqlite3WindowUpdate(pParse, pSel ? pSel->pWinDefn : 0, pWin, pDef); if( pParse->db->mallocFailed ) break; diff --git a/src/select.c b/src/select.c index 39bdc49686..e846a02201 100644 --- a/src/select.c +++ b/src/select.c @@ -941,7 +941,9 @@ static void selectExprDefer( struct ExprList_item *pItem = &pEList->a[i]; if( pItem->u.x.iOrderByCol==0 ){ Expr *pExpr = pItem->pExpr; - Table *pTab = pExpr->y.pTab; + Table *pTab; + assert( ExprUseYTab(pExpr) ); + pTab = pExpr->y.pTab; if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab) && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF) ){ @@ -964,6 +966,7 @@ static void selectExprDefer( Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0); if( pNew ){ pNew->iTable = pExpr->iTable; + assert( ExprUseYTab(pNew) ); pNew->y.pTab = pExpr->y.pTab; pNew->iColumn = pPk ? pPk->aiColumn[k] : -1; pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew); @@ -1812,7 +1815,7 @@ static const char *columnTypeImpl( break; } - assert( pTab && pExpr->y.pTab==pTab ); + assert( pTab && ExprUseYTab(pExpr) && pExpr->y.pTab==pTab ); if( pS ){ /* The "table" is actually a sub-select or a view in the FROM clause ** of the SELECT statement. Return the declaration type and origin @@ -2005,7 +2008,8 @@ void sqlite3GenerateColumnNames( assert( p!=0 ); assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ - assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */ + assert( p->op!=TK_COLUMN + || (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */ if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ /* An AS clause always takes first priority */ char *zName = pEList->a[i].zEName; @@ -2101,7 +2105,10 @@ int sqlite3ColumnsFromExprList( pColExpr = pColExpr->pRight; assert( pColExpr!=0 ); } - if( pColExpr->op==TK_COLUMN && (pTab = pColExpr->y.pTab)!=0 ){ + if( pColExpr->op==TK_COLUMN + && ALWAYS( ExprUseYTab(pColExpr) ) + && (pTab = pColExpr->y.pTab)!=0 + ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; if( iCol<0 ) iCol = pTab->iPKey; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index aae8f17b53..009742c4da 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2829,8 +2829,7 @@ struct Expr { } y; }; -/* -** The following are the meanings of bits in the Expr.flags field. +/* The following are the meanings of bits in the Expr.flags field. ** Value restrictions: ** ** EP_Agg == NC_HasAgg == SF_HasAgg @@ -2869,14 +2868,12 @@ struct Expr { #define EP_FromDDL 0x40000000 /* Originates from sqlite_schema */ /* 0x80000000 // Available */ -/* -** The EP_Propagate mask is a set of properties that automatically propagate +/* The EP_Propagate mask is a set of properties that automatically propagate ** upwards into parent nodes. */ #define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc) -/* -** These macros can be used to test, set, or clear bits in the +/* Macros can be used to test, set, or clear bits in the ** Expr.flags field. */ #define ExprHasProperty(E,P) (((E)->flags&(P))!=0) @@ -2886,16 +2883,16 @@ struct Expr { #define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue) #define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse) -/* -** Macros used to ensure that the correct members of unions are accessed. +/* Macros used to ensure that the correct members of unions are accessed +** in Expr. */ -#define ExprUseUToken(E) (((E)->flags&EP_IntValue)==0) -#define ExprUseUValue(E) (((E)->flags&EP_IntValue)!=0) -#define ExprUseXList(E) (((E)->flags&EP_xIsSelect)==0) -#define ExprUseXSelect(E) (((E)->flags&EP_xIsSelect)!=0) -#define ExprUseYTab(E) ((E)->op==TK_COLUMN) -#define ExprUseYWin(E) ((E)->flags&EP_WinFunc)!=0) -#define ExprUseYSub(E) ((E)->op==TK_IN||(E)->op==TK_SELECT||(E)->op==TK_EXISTS) +#define ExprUseUToken(E) (((E)->flags&EP_IntValue)==0) +#define ExprUseUValue(E) (((E)->flags&EP_IntValue)!=0) +#define ExprUseXList(E) (((E)->flags&EP_xIsSelect)==0) +#define ExprUseXSelect(E) (((E)->flags&EP_xIsSelect)!=0) +#define ExprUseYTab(E) (((E)->flags&(EP_WinFunc|EP_Subrtn))==0) +#define ExprUseYWin(E) (((E)->flags&EP_WinFunc)!=0) +#define ExprUseYSub(E) (((E)->flags&EP_Subrtn)!=0) /* Flags for use with Expr.vvaFlags */ diff --git a/src/treeview.c b/src/treeview.c index a7dfe2d43d..1b19ea6797 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -442,6 +442,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3TreeViewLine(pView, "COLUMN(%d)%s%s", pExpr->iColumn, zFlgs, zOp2); }else{ + assert( ExprUseYTab(pExpr) ); sqlite3TreeViewLine(pView, "{%d:%d} pTab=%p%s", pExpr->iTable, pExpr->iColumn, pExpr->y.pTab, zFlgs); diff --git a/src/vtab.c b/src/vtab.c index 9f742ec1ac..9b95297f2b 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -1137,6 +1137,7 @@ FuncDef *sqlite3VtabOverloadFunction( /* Check to see the left operand is a column in a virtual table */ if( NEVER(pExpr==0) ) return pDef; if( pExpr->op!=TK_COLUMN ) return pDef; + assert( ExprUseYTab(pExpr) ); pTab = pExpr->y.pTab; if( pTab==0 ) return pDef; if( !IsVirtual(pTab) ) return pDef; diff --git a/src/wherecode.c b/src/wherecode.c index d803c674f6..664393ffd7 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1175,10 +1175,10 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; - pExpr->y.pTab = 0; testcase( ExprHasProperty(pExpr, EP_Skip) ); testcase( ExprHasProperty(pExpr, EP_Unlikely) ); - ExprClearProperty(pExpr, EP_Skip|EP_Unlikely); + ExprClearProperty(pExpr, EP_Skip|EP_Unlikely|EP_WinFunc|EP_Subrtn); + pExpr->y.pTab = 0; return WRC_Prune; }else{ return WRC_Continue; @@ -1193,7 +1193,7 @@ static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ if( pExpr->op==TK_COLUMN ){ IdxExprTrans *pX = p->u.pIdxTrans; if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ - assert( pExpr->y.pTab!=0 ); + assert( ExprUseYTab(pExpr) && pExpr->y.pTab!=0 ); preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn); pExpr->iTable = pX->iIdxCur; diff --git a/src/whereexpr.c b/src/whereexpr.c index 8c73feeb33..c230b14a47 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -267,7 +267,9 @@ static int isLikeOrGlob( */ if( pLeft->op!=TK_COLUMN || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT - || (pLeft->y.pTab && IsVirtual(pLeft->y.pTab)) /* Might be numeric */ + || (ALWAYS( ExprUseYTab(pLeft) ) + && pLeft->y.pTab + && IsVirtual(pLeft->y.pTab)) /* Might be numeric */ ){ int isNum; double rDummy; @@ -383,6 +385,7 @@ static int isAuxiliaryVtabOperator( ** MATCH(expression,vtab_column) */ pCol = pList->a[1].pExpr; + assert( pCol->op!=TK_COLUMN || ExprUseYTab(pCol) ); testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); if( ExprIsVtab(pCol) ){ for(i=0; ia[0].pExpr; + assert( pCol->op!=TK_COLUMN || ExprUseYTab(pCol) ); testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); if( ExprIsVtab(pCol) ){ sqlite3_vtab *pVtab; @@ -432,10 +436,12 @@ static int isAuxiliaryVtabOperator( int res = 0; Expr *pLeft = pExpr->pLeft; Expr *pRight = pExpr->pRight; + assert( pLeft->op!=TK_COLUMN || ExprUseYTab(pLeft) ); testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 ); if( ExprIsVtab(pLeft) ){ res++; } + assert( pRight==0 || pRight->op!=TK_COLUMN || ExprUseYTab(pRight) ); testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 ); if( pRight && ExprIsVtab(pRight) ){ res++; @@ -1558,7 +1564,8 @@ Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); } #ifndef SQLITE_OMIT_WINDOWFUNC - if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && p->y.pWin ){ + if( (p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION) && ExprUseYWin(p) ){ + assert( p->y.pWin!=0 ); mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pPartition); mask |= sqlite3WhereExprListUsage(pMaskSet, p->y.pWin->pOrderBy); mask |= sqlite3WhereExprUsage(pMaskSet, p->y.pWin->pFilter); @@ -1633,6 +1640,7 @@ void sqlite3WhereTabFuncArgs( if( pColRef==0 ) return; pColRef->iTable = pItem->iCursor; pColRef->iColumn = k++; + assert( ExprUseYTab(pColRef) ); pColRef->y.pTab = pTab; pRhs = sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); From dbfbb5a0c53d19d38249d1562a0f48286d697fb1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 7 Oct 2021 23:04:50 +0000 Subject: [PATCH 24/64] New assert() statements to protect the u1 and u2 unions of SrcList. FossilOrigin-Name: 9b91fbcfcc14048f7d0755d47d9b7f9212fa2eaa6f3c04f417fa16c3a47943bf --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/build.c | 1 + src/delete.c | 1 + src/select.c | 2 ++ src/sqliteInt.h | 5 +++-- src/where.c | 1 + 7 files changed, 19 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index b1297c51f8..162e44b1aa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Protect\saccess\sto\sthe\sExpr.y\sunion\susing\snearby\sassert()s\sand\sbranches. -D 2021-10-07T20:46:29.719 +C New\sassert()\sstatements\sto\sprotect\sthe\su1\sand\su2\sunions\sof\sSrcList. +D 2021-10-07T23:04:50.256 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -493,14 +493,14 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 15b8bdbcf4c26ca15ec420e8da440a6d170669ac2f3735deb1668d9f3284129e F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c da127abe7fe2e2095116ec5b253ab5c77e5107bd29bbd63e258935173836e29c +F src/build.c 46df621d2426fe04494ad83d86d2edb5f79f6a14a4595981e4de2502f172794e F src/callback.c 106b585da1edd57d75fa579d823a5218e0bf37f191dbf7417eeb4a8a9a267dbc F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d -F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 +F src/delete.c 0c151975fa99560767d7747f9b60543d0093d9f8b89f13d2d6058e9c83ad19e7 F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 @@ -549,12 +549,12 @@ F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 56069fb5fae836179ffb58e8c4a2723a8c4e146abf7892472fbc5534a86e353f +F src/select.c 2367906fef5bf128e31fc695d365463e2e482fc09a80b651ff2a38ed130a9842 F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 62fad2ae3aaf94a9398d031dc20bd147e2954a93e3d85455f3d999bebed48121 +F src/sqliteInt.h d83718ee235209088e809480a1651123f864f8f6a42793877cd8c2c3ba052b60 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -636,7 +636,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 56e1902e9b91fb1fe159181a21c34abd59a01e2cb8f5ef4c3e478d32c5d838df +F src/where.c 85109b6c33b83b9b93139a1eea633cf1dfdc1c43a0b45192cf7e8d85dd209bc8 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 0bb4a2a82fc9ccfce105fb2ff2921de373c62aa60c770029f95bd8b685f3498a F src/whereexpr.c 4514a162d878b6523a698fac1d760991b5728be0d7e2b2b0687aa175144dcf15 @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 03cef1c30d96cd42682f57667bb3072c7643ef43fe05eda2d8b82c30789234af -R 06b773afbf19fb9230871daeb2e22572 +P 87e2f5eb436fc448427b0e24fb70f29688796b513b8c7b12f1a21540dae1e56d +R 26f96ed7e6bc8d87135a2e1f26f03c7a U drh -Z 58c40dd2d56708967ad96d2415e961d1 +Z 1e388ad2186d49d3ab5f000ad284e609 diff --git a/manifest.uuid b/manifest.uuid index 8fb5c801f4..ef4b83ad5e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87e2f5eb436fc448427b0e24fb70f29688796b513b8c7b12f1a21540dae1e56d \ No newline at end of file +9b91fbcfcc14048f7d0755d47d9b7f9212fa2eaa6f3c04f417fa16c3a47943bf \ No newline at end of file diff --git a/src/build.c b/src/build.c index 58762bf370..1bf0827121 100644 --- a/src/build.c +++ b/src/build.c @@ -4927,6 +4927,7 @@ void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ }else{ pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy); pItem->fg.isIndexedBy = 1; + assert( pItem->fg.isCte==0 ); /* No collision on union u2 */ } } } diff --git a/src/delete.c b/src/delete.c index 0debce3cb8..e2b283ea47 100644 --- a/src/delete.c +++ b/src/delete.c @@ -210,6 +210,7 @@ Expr *sqlite3LimitWhere( pSelectSrc = sqlite3SrcListDup(db, pSrc, 0); pSrc->a[0].pTab = pTab; if( pSrc->a[0].fg.isIndexedBy ){ + assert( pSrc->a[0].fg.isCte==0 ); pSrc->a[0].u2.pIBIndex = 0; pSrc->a[0].fg.isIndexedBy = 0; sqlite3DbFree(db, pSrc->a[0].u1.zIndexedBy); diff --git a/src/select.c b/src/select.c index e846a02201..13ed20f6c3 100644 --- a/src/select.c +++ b/src/select.c @@ -4995,6 +4995,7 @@ int sqlite3IndexedByLookup(Parse *pParse, SrcItem *pFrom){ pParse->checkSchema = 1; return SQLITE_ERROR; } + assert( pFrom->fg.isCte==0 ); pFrom->u2.pIBIndex = pIdx; return SQLITE_OK; } @@ -5252,6 +5253,7 @@ static int resolveFromTermToCte( if( db->mallocFailed ) return 2; pFrom->pSelect->selFlags |= SF_CopyCte; assert( pFrom->pSelect ); + assert( pFrom->fg.isIndexedBy==0 ); /* Prevent collision in union u2 */ pFrom->fg.isCte = 1; pFrom->u2.pCteUse = pCteUse; pCteUse->nUse++; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 009742c4da..f517431681 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2975,11 +2975,12 @@ struct ExprList { unsigned bSorterRef :1; /* Defer evaluation until after sorting */ unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ union { - struct { + struct { /* Used by any ExprList other than Parse.pConsExpr */ u16 iOrderByCol; /* For ORDER BY, column number in result set */ u16 iAlias; /* Index into Parse.aAlias[] for zName */ } x; - int iConstExprReg; /* Register in which Expr value is cached */ + int iConstExprReg; /* Register in which Expr value is cached. Used only + ** by Parse.pConstExpr */ } u; } a[1]; /* One slot for each expression in the list */ }; diff --git a/src/where.c b/src/where.c index 7583f05631..4d17376600 100644 --- a/src/where.c +++ b/src/where.c @@ -3002,6 +3002,7 @@ static int whereLoopAddBtree( assert( !IsVirtual(pSrc->pTab) ); if( pSrc->fg.isIndexedBy ){ + assert( pSrc->fg.isCte==0 ); /* An INDEXED BY clause specifies a particular index to use */ pProbe = pSrc->u2.pIBIndex; }else if( !HasRowid(pTab) ){ From 074a131245a67251ca329d4bcc38584a37bbca3b Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 8 Oct 2021 10:25:06 +0000 Subject: [PATCH 25/64] Minor improvements to comments in the data structure definitions. No changes to code. FossilOrigin-Name: e77ac4050cf6c24118ce2af4c075f60e3eeb2dafe6d222c848bc4e541eef7172 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 23 ++++++++++++++++------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 162e44b1aa..07edb5cad0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()\sstatements\sto\sprotect\sthe\su1\sand\su2\sunions\sof\sSrcList. -D 2021-10-07T23:04:50.256 +C Minor\simprovements\sto\scomments\sin\sthe\sdata\sstructure\sdefinitions.\s\sNo\nchanges\sto\scode. +D 2021-10-08T10:25:06.619 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h d83718ee235209088e809480a1651123f864f8f6a42793877cd8c2c3ba052b60 +F src/sqliteInt.h 1c533af6ddc8bac06db0706698227b1a04d3c25a439dae5f1d72d672e51a6244 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 87e2f5eb436fc448427b0e24fb70f29688796b513b8c7b12f1a21540dae1e56d -R 26f96ed7e6bc8d87135a2e1f26f03c7a +P 9b91fbcfcc14048f7d0755d47d9b7f9212fa2eaa6f3c04f417fa16c3a47943bf +R 4b303a4d6767f7ff61406cb5e533618e U drh -Z 1e388ad2186d49d3ab5f000ad284e609 +Z 17855c0746b72f35a62a4e373c2c0159 diff --git a/manifest.uuid b/manifest.uuid index ef4b83ad5e..c5423eade3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9b91fbcfcc14048f7d0755d47d9b7f9212fa2eaa6f3c04f417fa16c3a47943bf \ No newline at end of file +e77ac4050cf6c24118ce2af4c075f60e3eeb2dafe6d222c848bc4e541eef7172 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f517431681..67a50e8368 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1571,10 +1571,10 @@ struct sqlite3 { int nExtension; /* Number of loaded extensions */ void **aExtension; /* Array of shared library handles */ union { - void (*xLegacy)(void*,const char*); /* Legacy trace function */ - int (*xV2)(u32,void*,void*,void*); /* V2 Trace function */ + void (*xLegacy)(void*,const char*); /* mTrace==SQLITE_TRACE_LEGACY */ + int (*xV2)(u32,void*,void*,void*); /* All other mTrace values */ } trace; - void *pTraceArg; /* Argument to the trace function */ + void *pTraceArg; /* Argument to the trace function */ #ifndef SQLITE_OMIT_DEPRECATED void (*xProfile)(void*,const char*,u64); /* Profiling function */ void *pProfileArg; /* Argument to profile function */ @@ -2717,10 +2717,10 @@ typedef int ynVar; ** tree. ** ** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, -** or TK_STRING), then Expr.token contains the text of the SQL literal. If -** the expression is a variable (TK_VARIABLE), then Expr.token contains the +** or TK_STRING), then Expr.u.zToken contains the text of the SQL literal. If +** the expression is a variable (TK_VARIABLE), then Expr.u.zToken contains the ** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), -** then Expr.token contains the name of the function. +** then Expr.u.zToken contains the name of the function. ** ** Expr.pRight and Expr.pLeft are the left and right subexpressions of a ** binary operator. Either or both may be NULL. @@ -2760,7 +2760,7 @@ typedef int ynVar; ** help reduce memory requirements, sometimes an Expr object will be ** truncated. And to reduce the number of memory allocations, sometimes ** two or more Expr objects will be stored in a single memory allocation, -** together with Expr.zToken strings. +** together with Expr.u.zToken strings. ** ** If the EP_Reduced and EP_TokenOnly flags are set when ** an Expr object is truncated. When EP_Reduced is set, then all @@ -3018,6 +3018,13 @@ struct IdList { /* ** The SrcItem object represents a single term in the FROM clause of a query. ** The SrcList object is mostly an array of SrcItems. +** +** Union member validity: +** +** u1.zIndexedBy fg.isIndexedBy && !fg.isTabFunc +** u1.pFuncArg fg.isTabFunc && !fg.isIndexedBy +** u2.pIBIndex fg.isIndexedBy && !fg.isCte +** u2.pCteUse fg.isCte && !fg.isIndexedBy */ struct SrcItem { Schema *pSchema; /* Schema to which this item is fixed */ @@ -3612,6 +3619,8 @@ struct Parse { #endif }; +/* Allowed values for Parse.eParseMode +*/ #define PARSE_MODE_NORMAL 0 #define PARSE_MODE_DECLARE_VTAB 1 #define PARSE_MODE_RENAME 2 From 635480ef475da35161b334c4051deef7c37fb206 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 8 Oct 2021 16:15:17 +0000 Subject: [PATCH 26/64] Improved detection of database corruption. FossilOrigin-Name: c7fae46c8a3bd78adc5a01340eff6c1efa75f9384dc7f42cb81717b029e7c56f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 07edb5cad0..c6e13be900 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\simprovements\sto\scomments\sin\sthe\sdata\sstructure\sdefinitions.\s\sNo\nchanges\sto\scode. -D 2021-10-08T10:25:06.619 +C Improved\sdetection\sof\sdatabase\scorruption. +D 2021-10-08T16:15:17.284 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 15b8bdbcf4c26ca15ec420e8da440a6d170669ac2f3735deb1668d9f3284129e +F src/btree.c 8ec2758e13d8a3884b3eb197f6aa59857ffd57943eaf18e8b961d19ad81f6266 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c 46df621d2426fe04494ad83d86d2edb5f79f6a14a4595981e4de2502f172794e @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9b91fbcfcc14048f7d0755d47d9b7f9212fa2eaa6f3c04f417fa16c3a47943bf -R 4b303a4d6767f7ff61406cb5e533618e +P e77ac4050cf6c24118ce2af4c075f60e3eeb2dafe6d222c848bc4e541eef7172 +R 9bc76ad0c59bed7ccf95e6fe530b6c9c U drh -Z 17855c0746b72f35a62a4e373c2c0159 +Z 057f03f7f6d5e1e4d7c402b7d6417858 diff --git a/manifest.uuid b/manifest.uuid index c5423eade3..73c25e7133 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e77ac4050cf6c24118ce2af4c075f60e3eeb2dafe6d222c848bc4e541eef7172 \ No newline at end of file +c7fae46c8a3bd78adc5a01340eff6c1efa75f9384dc7f42cb81717b029e7c56f \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fc1642a66a..9c22c70353 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8969,7 +8969,10 @@ int sqlite3BtreeInsert( idx = pCur->ix; if( loc==0 ){ CellInfo info; - assert( idxnCell ); + assert( idx>=0 ); + if( idx>=pPage->nCell ){ + return SQLITE_CORRUPT_BKPT; + } rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ){ goto end_insert; From 635e6a92a0a2ef0f97b6d1ab85d5eba1625d3cad Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 8 Oct 2021 16:39:33 +0000 Subject: [PATCH 27/64] Add support for "PRAGMA writable_schema=RESET". FossilOrigin-Name: a51b305bd068f8d8e85b9fc38d61cdf5957f3a2ad2eb2e77015547910088e681 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pragma.c | 8 ++++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c6e13be900..704d5dd7de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\sdatabase\scorruption. -D 2021-10-08T16:15:17.284 +C Add\ssupport\sfor\s"PRAGMA\swritable_schema=RESET". +D 2021-10-08T16:39:33.643 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c a2458437f99b356681ff3d699943e7f0eeb7ad0a00abf00df60fd8132d41f1c1 +F src/pragma.c 8d029903aac7d73ad9a304c32c98a0f65ec6fd3be37eae5d63a37900ace8e3b0 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e77ac4050cf6c24118ce2af4c075f60e3eeb2dafe6d222c848bc4e541eef7172 -R 9bc76ad0c59bed7ccf95e6fe530b6c9c +P c7fae46c8a3bd78adc5a01340eff6c1efa75f9384dc7f42cb81717b029e7c56f +R c222db3e9e08c849b67cafc40e6de8c1 U drh -Z 057f03f7f6d5e1e4d7c402b7d6417858 +Z dd0d8cab0621c5c115ac8ea1cce302b4 diff --git a/manifest.uuid b/manifest.uuid index 73c25e7133..c6f8a8a75f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7fae46c8a3bd78adc5a01340eff6c1efa75f9384dc7f42cb81717b029e7c56f \ No newline at end of file +a51b305bd068f8d8e85b9fc38d61cdf5957f3a2ad2eb2e77015547910088e681 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 8bac047261..b997408b91 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1117,6 +1117,14 @@ void sqlite3Pragma( }else{ db->flags &= ~mask; if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; + if( (mask & SQLITE_WriteSchema)!=0 + && sqlite3_stricmp(zRight, "reset")==0 + ){ + /* "PRAGMA writable_schema=RESET" turns schema writing off, just + ** like "PRAGMA writable_schema=OFF, but also causes the schema + ** to be reloaded. */ + sqlite3ResetAllSchemasOfConnection(db); + } } /* Many of the flag-pragmas modify the code generated by the SQL From 15b5411a67d4ce4b9b9ddb43e26f3f7dbcac8407 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 8 Oct 2021 18:12:37 +0000 Subject: [PATCH 28/64] Remove a "harmless()" macro that is no longer relevant. FossilOrigin-Name: 87c357c60168fdc52c82382aa7288d66886f5fbe2ae6af68344dbcfdbca9069b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 10 ---------- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 704d5dd7de..fe9a774662 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\s"PRAGMA\swritable_schema=RESET". -D 2021-10-08T16:39:33.643 +C Remove\sa\s"harmless()"\smacro\sthat\sis\sno\slonger\srelevant. +D 2021-10-08T18:12:37.220 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 8ec2758e13d8a3884b3eb197f6aa59857ffd57943eaf18e8b961d19ad81f6266 +F src/btree.c 7c07979ab50dc15e0c3f967897543ce09743b1d11377f10f9dd4a2fd0ec3e0e4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c 46df621d2426fe04494ad83d86d2edb5f79f6a14a4595981e4de2502f172794e @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c7fae46c8a3bd78adc5a01340eff6c1efa75f9384dc7f42cb81717b029e7c56f -R c222db3e9e08c849b67cafc40e6de8c1 +P a51b305bd068f8d8e85b9fc38d61cdf5957f3a2ad2eb2e77015547910088e681 +R fd484d3c128a2ea8cf0418a51903c533 U drh -Z dd0d8cab0621c5c115ac8ea1cce302b4 +Z 279abe732b42272c57b1f99ac8bf0794 diff --git a/manifest.uuid b/manifest.uuid index c6f8a8a75f..c74aa093d4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a51b305bd068f8d8e85b9fc38d61cdf5957f3a2ad2eb2e77015547910088e681 \ No newline at end of file +87c357c60168fdc52c82382aa7288d66886f5fbe2ae6af68344dbcfdbca9069b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9c22c70353..f5d9996749 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5871,16 +5871,6 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ return SQLITE_CORRUPT_BKPT; } - /* If the database file is corrupt, it is possible for the value of idx - ** to be invalid here. This can only occur if a second cursor modifies - ** the page while cursor pCur is holding a reference to it. Which can - ** only happen if the database is corrupt in such a way as to link the - ** page into more than one b-tree structure. - ** - ** Update 2019-12-23: appears to long longer be possible after the - ** addition of anotherValidCursor() condition on balance_deeper(). */ - harmless( idx>pPage->nCell ); - if( idx>=pPage->nCell ){ if( !pPage->leaf ){ rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); From b18b3df1da599c6e4764e04abe13963f11eeb075 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 8 Oct 2021 18:15:50 +0000 Subject: [PATCH 29/64] Further to the previous check-in, remove the "harmless()" macro definition as it is no longer used. FossilOrigin-Name: b8c9a54664a87ac464b413390572c3feb912e1efc9c8a78c61f1b370e2165c05 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 20 -------------------- 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index fe9a774662..6488eea937 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\s"harmless()"\smacro\sthat\sis\sno\slonger\srelevant. -D 2021-10-08T18:12:37.220 +C Further\sto\sthe\sprevious\scheck-in,\sremove\sthe\s"harmless()"\smacro\sdefinition\sas\nit\sis\sno\slonger\sused. +D 2021-10-08T18:15:50.320 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 1c533af6ddc8bac06db0706698227b1a04d3c25a439dae5f1d72d672e51a6244 +F src/sqliteInt.h ef4da7ea99a18dd8975636e050b5eddc5576b55da127a8c7a80983c3ee608d25 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a51b305bd068f8d8e85b9fc38d61cdf5957f3a2ad2eb2e77015547910088e681 -R fd484d3c128a2ea8cf0418a51903c533 +P 87c357c60168fdc52c82382aa7288d66886f5fbe2ae6af68344dbcfdbca9069b +R 1cc86c723eae430b905815a96dda1490 U drh -Z 279abe732b42272c57b1f99ac8bf0794 +Z bcca30cb5ad97f8aa9cbbd8a97fe1387 diff --git a/manifest.uuid b/manifest.uuid index c74aa093d4..1f7e054b73 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87c357c60168fdc52c82382aa7288d66886f5fbe2ae6af68344dbcfdbca9069b \ No newline at end of file +b8c9a54664a87ac464b413390572c3feb912e1efc9c8a78c61f1b370e2165c05 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 67a50e8368..d1885ebc6c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -503,26 +503,6 @@ # define NEVER(X) (X) #endif -/* -** The harmless(X) macro indicates that expression X is usually false -** but can be true without causing any problems, but we don't know of -** any way to cause X to be true. -** -** In debugging and testing builds, this macro will abort if X is ever -** true. In this way, developers are alerted to a possible test case -** that causes X to be true. If a harmless macro ever fails, that is -** an opportunity to change the macro into a testcase() and add a new -** test case to the test suite. -** -** For normal production builds, harmless(X) is a no-op, since it does -** not matter whether expression X is true or false. -*/ -#ifdef SQLITE_DEBUG -# define harmless(X) assert(!(X)); -#else -# define harmless(X) -#endif - /* ** Some conditionals are optimizations only. In other words, if the ** conditionals are replaced with a constant 1 (true) or 0 (false) then From 0c1da689075bde27b5d742c772b5498df8873c3e Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 9 Oct 2021 16:00:56 +0000 Subject: [PATCH 30/64] Detect any attempt to use an INDEXED BY clause on a CTE and report an error. FossilOrigin-Name: 35a9de2c97b9a386070e7827a0842bb1caf3af69ea0d6f67ce2a50be3426fb63 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6488eea937..b94362e6ee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\sto\sthe\sprevious\scheck-in,\sremove\sthe\s"harmless()"\smacro\sdefinition\sas\nit\sis\sno\slonger\sused. -D 2021-10-08T18:15:50.320 +C Detect\sany\sattempt\sto\suse\san\sINDEXED\sBY\sclause\son\sa\sCTE\sand\sreport\san\nerror. +D 2021-10-09T16:00:56.047 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 2367906fef5bf128e31fc695d365463e2e482fc09a80b651ff2a38ed130a9842 +F src/select.c 9eab80721a24fb05eb03d4bb93d26d1ade0ac707bbb45d917ed39546427b5b3f F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 87c357c60168fdc52c82382aa7288d66886f5fbe2ae6af68344dbcfdbca9069b -R 1cc86c723eae430b905815a96dda1490 +P b8c9a54664a87ac464b413390572c3feb912e1efc9c8a78c61f1b370e2165c05 +R 0dfb0bb10d05f6bb20b43b31156cbd37 U drh -Z bcca30cb5ad97f8aa9cbbd8a97fe1387 +Z 963494934ee8a982a3213d8ade04cfb3 diff --git a/manifest.uuid b/manifest.uuid index 1f7e054b73..2490396299 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b8c9a54664a87ac464b413390572c3feb912e1efc9c8a78c61f1b370e2165c05 \ No newline at end of file +35a9de2c97b9a386070e7827a0842bb1caf3af69ea0d6f67ce2a50be3426fb63 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 13ed20f6c3..d437283a4a 100644 --- a/src/select.c +++ b/src/select.c @@ -5253,7 +5253,10 @@ static int resolveFromTermToCte( if( db->mallocFailed ) return 2; pFrom->pSelect->selFlags |= SF_CopyCte; assert( pFrom->pSelect ); - assert( pFrom->fg.isIndexedBy==0 ); /* Prevent collision in union u2 */ + if( pFrom->fg.isIndexedBy ){ + sqlite3ErrorMsg(pParse, "no such index: \"%s\"", pFrom->u1.zIndexedBy); + return 2; + } pFrom->fg.isCte = 1; pFrom->u2.pCteUse = pCteUse; pCteUse->nUse++; From cd789f9bd9971b387ab87944d2283584fbfd35fd Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 11 Oct 2021 09:39:42 +0000 Subject: [PATCH 31/64] Fix an over-zealous assert(). FossilOrigin-Name: e2bb82a4095427eb810903180fa27fb85b52144bdcfe33388352638428d017f5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b94362e6ee..86c2ed2b62 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\sany\sattempt\sto\suse\san\sINDEXED\sBY\sclause\son\sa\sCTE\sand\sreport\san\nerror. -D 2021-10-09T16:00:56.047 +C Fix\san\sover-zealous\sassert(). +D 2021-10-11T09:39:42.548 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 7c07979ab50dc15e0c3f967897543ce09743b1d11377f10f9dd4a2fd0ec3e0e4 +F src/btree.c 472cc43a2631d9bd917475e0a0ab43949ae27c8541473a90b55c51011f6121cc F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c 46df621d2426fe04494ad83d86d2edb5f79f6a14a4595981e4de2502f172794e @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b8c9a54664a87ac464b413390572c3feb912e1efc9c8a78c61f1b370e2165c05 -R 0dfb0bb10d05f6bb20b43b31156cbd37 +P 35a9de2c97b9a386070e7827a0842bb1caf3af69ea0d6f67ce2a50be3426fb63 +R 06629d80390d3bfc787a4a109d27b763 U drh -Z 963494934ee8a982a3213d8ade04cfb3 +Z 8447ffb286f0a97c5704ea348d708c3f diff --git a/manifest.uuid b/manifest.uuid index 2490396299..a5f7dc2034 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35a9de2c97b9a386070e7827a0842bb1caf3af69ea0d6f67ce2a50be3426fb63 \ No newline at end of file +e2bb82a4095427eb810903180fa27fb85b52144bdcfe33388352638428d017f5 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f5d9996749..8b7f1137c8 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5085,7 +5085,7 @@ static const void *fetchPayload( assert( pCur->eState==CURSOR_VALID ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); assert( cursorOwnsBtShared(pCur) ); - assert( pCur->ixpPage->nCell ); + assert( pCur->ixpPage->nCell || CORRUPT_DB ); assert( pCur->info.nSize>0 ); assert( pCur->info.pPayload>pCur->pPage->aData || CORRUPT_DB ); assert( pCur->info.pPayloadpPage->aDataEnd ||CORRUPT_DB); From 75231eae07e57987f163efff3ec2132e9a7dc552 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 11 Oct 2021 09:48:59 +0000 Subject: [PATCH 32/64] New test cases added to test/fuzzdata8.db FossilOrigin-Name: 2e475fecadc6d9e9a0537435827f56a5c7345f69a9b713d7812da4c9a0f27a96 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2671616 -> 2724864 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 86c2ed2b62..667bae24e8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sover-zealous\sassert(). -D 2021-10-11T09:39:42.548 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db +D 2021-10-11T09:48:59.129 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1062,7 +1062,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 6e5fc4979d39b1d93371190202eb19d023c4671edaff205842024a632e3ecc58 +F test/fuzzdata8.db d6293be0c83e97c2b6c2d35507de1643cd04650938ea05f0096b5f53096b5178 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 35a9de2c97b9a386070e7827a0842bb1caf3af69ea0d6f67ce2a50be3426fb63 -R 06629d80390d3bfc787a4a109d27b763 +P e2bb82a4095427eb810903180fa27fb85b52144bdcfe33388352638428d017f5 +R ecdc864c9fe624410248844455e3e5af U drh -Z 8447ffb286f0a97c5704ea348d708c3f +Z 43de5116009e259c1c06d2a670d3069b diff --git a/manifest.uuid b/manifest.uuid index a5f7dc2034..6beec941c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2bb82a4095427eb810903180fa27fb85b52144bdcfe33388352638428d017f5 \ No newline at end of file +2e475fecadc6d9e9a0537435827f56a5c7345f69a9b713d7812da4c9a0f27a96 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 272bc5c8bd43afe43d71e8fe605dfd2e0f511248..5f66c63ce644b63d19535b8b51db1d2775a2cd6f 100644 GIT binary patch delta 58688 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 lAw$Q4RE>}f*P>pXfj)~$A! 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 ?l>R|-^gQ51}y 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�hZlIj%U$ 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 Date: Mon, 11 Oct 2021 15:21:42 +0000 Subject: [PATCH 33/64] Use the IsOrdinaryTable() macro, not a test of tnum, to distinguish tables from views and virtual tables. FossilOrigin-Name: 6189b7809d774bf697d14e27a4bd961df5c318d261dce97db7801ce83f12c59a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/analyze.c | 2 +- src/pragma.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 667bae24e8..541b6d884a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\stest/fuzzdata8.db -D 2021-10-11T09:48:59.129 +C Use\sthe\sIsOrdinaryTable()\smacro,\snot\sa\stest\sof\stnum,\sto\sdistinguish\stables\nfrom\sviews\sand\svirtual\stables. +D 2021-10-11T15:21:42.574 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -484,7 +484,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 9578c5a54027166688ec3e679ed10e85a3d08b986210e98d736f57aacc63335a -F src/analyze.c 979b6d2cdaca992a9c9f0818de55d08fb9a4e52929a509752b52d9fd23bb86d3 +F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c e3f9d9a2a4a844750f3f348f37afb244535f21382cbfcd840152cb21cb41cfaf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d @@ -542,7 +542,7 @@ F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c 8d029903aac7d73ad9a304c32c98a0f65ec6fd3be37eae5d63a37900ace8e3b0 +F src/pragma.c 5a37120a6cb9848e5d071b1646cc85f6ce7fc4983dd265b26c20925faf51a441 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e2bb82a4095427eb810903180fa27fb85b52144bdcfe33388352638428d017f5 -R ecdc864c9fe624410248844455e3e5af +P 2e475fecadc6d9e9a0537435827f56a5c7345f69a9b713d7812da4c9a0f27a96 +R 23dee1b3cc387091f13965964f5dc241 U drh -Z 43de5116009e259c1c06d2a670d3069b +Z 74c39a96d037d547a4b8ace527c80bd7 diff --git a/manifest.uuid b/manifest.uuid index 6beec941c0..e04a1c374c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2e475fecadc6d9e9a0537435827f56a5c7345f69a9b713d7812da4c9a0f27a96 \ No newline at end of file +6189b7809d774bf697d14e27a4bd961df5c318d261dce97db7801ce83f12c59a \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index d38cb18784..5bbd34f9a2 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -996,7 +996,7 @@ static void analyzeOneTable( if( v==0 || NEVER(pTab==0) ){ return; } - if( pTab->tnum==0 ){ + if( !IsOrdinaryTable(pTab) ){ /* Do not gather statistics on views or virtual tables */ return; } diff --git a/src/pragma.c b/src/pragma.c index b997408b91..1c00e68b09 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1714,7 +1714,7 @@ void sqlite3Pragma( int r1 = -1; int bStrict; - if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */ + if( !IsOrdinaryTable(pTab) ) continue; if( pObjTab && pObjTab!=pTab ) continue; pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, From 54e3f94eee2aff724fcb8d4268ff2d4df7ae938d Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 11 Oct 2021 15:54:05 +0000 Subject: [PATCH 34/64] Fail a schema parse if a virtual table or view has a positive integer rootpage. FossilOrigin-Name: 02656760406add06303afc94eaf9f2be021cbdbc7ac1ca79b139a7d2de9c0dc5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 541b6d884a..1644eb92a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\sIsOrdinaryTable()\smacro,\snot\sa\stest\sof\stnum,\sto\sdistinguish\stables\nfrom\sviews\sand\svirtual\stables. -D 2021-10-11T15:21:42.574 +C Fail\sa\sschema\sparse\sif\sa\svirtual\stable\sor\sview\shas\sa\spositive\sinteger\nrootpage. +D 2021-10-11T15:54:05.911 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -493,7 +493,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 472cc43a2631d9bd917475e0a0ab43949ae27c8541473a90b55c51011f6121cc F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 46df621d2426fe04494ad83d86d2edb5f79f6a14a4595981e4de2502f172794e +F src/build.c f70d6375ea5b78daac5b1d24eab53ed7b81c3e68a17dff9581c50c0c06180e00 F src/callback.c 106b585da1edd57d75fa579d823a5218e0bf37f191dbf7417eeb4a8a9a267dbc F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2e475fecadc6d9e9a0537435827f56a5c7345f69a9b713d7812da4c9a0f27a96 -R 23dee1b3cc387091f13965964f5dc241 +P 6189b7809d774bf697d14e27a4bd961df5c318d261dce97db7801ce83f12c59a +R 9cb4b9fb9bb00a6c6989d7c18493c0e3 U drh -Z 74c39a96d037d547a4b8ace527c80bd7 +Z a0f3b0022c1e0519582697c7b0ed76b0 diff --git a/manifest.uuid b/manifest.uuid index e04a1c374c..a137e5c2da 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6189b7809d774bf697d14e27a4bd961df5c318d261dce97db7801ce83f12c59a \ No newline at end of file +02656760406add06303afc94eaf9f2be021cbdbc7ac1ca79b139a7d2de9c0dc5 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 1bf0827121..55d336c38f 100644 --- a/src/build.c +++ b/src/build.c @@ -2586,7 +2586,7 @@ void sqlite3EndTable( ** table itself. So mark it read-only. */ if( db->init.busy ){ - if( pSelect ){ + if( pSelect || (!IsOrdinaryTable(p) && db->init.newTnum) ){ sqlite3ErrorMsg(pParse, ""); return; } From 77978a64f4b2ff33fa5255db88325759968cb1e9 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 12 Oct 2021 02:17:39 +0000 Subject: [PATCH 35/64] Fix harmless compiler warnings in the debug build for MSVC. FossilOrigin-Name: 1ceb73f316ddc736aebd1e82ef3a0d9c173d025ac5b7fcfbde0a65a0eeb60a4b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/mem2.c | 4 ++-- src/sqliteInt.h | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 1644eb92a8..ee6f0b6845 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fail\sa\sschema\sparse\sif\sa\svirtual\stable\sor\sview\shas\sa\spositive\sinteger\nrootpage. -D 2021-10-11T15:54:05.911 +C Fix\sharmless\scompiler\swarnings\sin\sthe\sdebug\sbuild\sfor\sMSVC. +D 2021-10-12T02:17:39.440 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ F src/main.c d375bb6f761b3fa2cd2c1afaa5d4b282c7128a2c4d2fe7da6294fe8eaca9fa1a F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de -F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb +F src/mem2.c a6b4c1b29bfaaf6ac87628643cc10ab11f16a9b8a5b5b75f0ba8142adbbfa3e7 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 F src/memdb.c cd8cf3ee965db4a4ab4b5423b49a4ef810490b8ba828911e523325f2cce3ed1a @@ -554,7 +554,7 @@ F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h ef4da7ea99a18dd8975636e050b5eddc5576b55da127a8c7a80983c3ee608d25 +F src/sqliteInt.h 642c17df9e5a3517db452ac73a2b953143449a8bc2f6570c60de455a89a8571c F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6189b7809d774bf697d14e27a4bd961df5c318d261dce97db7801ce83f12c59a -R 9cb4b9fb9bb00a6c6989d7c18493c0e3 -U drh -Z a0f3b0022c1e0519582697c7b0ed76b0 +P 02656760406add06303afc94eaf9f2be021cbdbc7ac1ca79b139a7d2de9c0dc5 +R 6eba3cbabf6ac2a73d7123c6e6c0014f +U mistachkin +Z d951710d1eaf82a2a4e925900c6cc2a4 diff --git a/manifest.uuid b/manifest.uuid index a137e5c2da..ebe8d13d0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -02656760406add06303afc94eaf9f2be021cbdbc7ac1ca79b139a7d2de9c0dc5 \ No newline at end of file +1ceb73f316ddc736aebd1e82ef3a0d9c173d025ac5b7fcfbde0a65a0eeb60a4b \ No newline at end of file diff --git a/src/mem2.c b/src/mem2.c index ac031508c2..4ecbd8005c 100644 --- a/src/mem2.c +++ b/src/mem2.c @@ -396,7 +396,7 @@ void sqlite3MemdebugSetType(void *p, u8 eType){ ** ** assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); */ -int sqlite3MemdebugHasType(void *p, u8 eType){ +int sqlite3MemdebugHasType(const void *p, u8 eType){ int rc = 1; if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){ struct MemBlockHdr *pHdr; @@ -418,7 +418,7 @@ int sqlite3MemdebugHasType(void *p, u8 eType){ ** ** assert( sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); */ -int sqlite3MemdebugNoType(void *p, u8 eType){ +int sqlite3MemdebugNoType(const void *p, u8 eType){ int rc = 1; if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){ struct MemBlockHdr *pHdr; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d1885ebc6c..dbf994d53f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -5257,8 +5257,8 @@ SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...); */ #ifdef SQLITE_MEMDEBUG void sqlite3MemdebugSetType(void*,u8); - int sqlite3MemdebugHasType(void*,u8); - int sqlite3MemdebugNoType(void*,u8); + int sqlite3MemdebugHasType(const void*,u8); + int sqlite3MemdebugNoType(const void*,u8); #else # define sqlite3MemdebugSetType(X,Y) /* no-op */ # define sqlite3MemdebugHasType(X,Y) 1 From 04f1b691f2a082454487025867adb9da1d6d003f Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 12 Oct 2021 02:26:32 +0000 Subject: [PATCH 36/64] Fix another harmless compiler warning for MSVC. FossilOrigin-Name: b54c0db0fd686b85269cf4c301c9b483c5272269d0cd69a1c7141a91101192f0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/mem2.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ee6f0b6845..9b577db228 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\sthe\sdebug\sbuild\sfor\sMSVC. -D 2021-10-12T02:17:39.440 +C Fix\sanother\sharmless\scompiler\swarning\sfor\sMSVC. +D 2021-10-12T02:26:32.225 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ F src/main.c d375bb6f761b3fa2cd2c1afaa5d4b282c7128a2c4d2fe7da6294fe8eaca9fa1a F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de -F src/mem2.c a6b4c1b29bfaaf6ac87628643cc10ab11f16a9b8a5b5b75f0ba8142adbbfa3e7 +F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 F src/memdb.c cd8cf3ee965db4a4ab4b5423b49a4ef810490b8ba828911e523325f2cce3ed1a @@ -1928,7 +1928,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 02656760406add06303afc94eaf9f2be021cbdbc7ac1ca79b139a7d2de9c0dc5 -R 6eba3cbabf6ac2a73d7123c6e6c0014f +P 1ceb73f316ddc736aebd1e82ef3a0d9c173d025ac5b7fcfbde0a65a0eeb60a4b +R 638916a5819730f8ce4b6f0dcd3abd60 U mistachkin -Z d951710d1eaf82a2a4e925900c6cc2a4 +Z cc9900a3def07dfadb4c80cb5f6cec6b diff --git a/manifest.uuid b/manifest.uuid index ebe8d13d0c..c227d8204d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ceb73f316ddc736aebd1e82ef3a0d9c173d025ac5b7fcfbde0a65a0eeb60a4b \ No newline at end of file +b54c0db0fd686b85269cf4c301c9b483c5272269d0cd69a1c7141a91101192f0 \ No newline at end of file diff --git a/src/mem2.c b/src/mem2.c index 4ecbd8005c..04d6298dba 100644 --- a/src/mem2.c +++ b/src/mem2.c @@ -149,7 +149,7 @@ static void adjustStats(int iSize, int increment){ ** This routine checks the guards at either end of the allocation and ** if they are incorrect it asserts. */ -static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){ +static struct MemBlockHdr *sqlite3MemsysGetHeader(const void *pAllocation){ struct MemBlockHdr *p; int *pInt; u8 *pU8; From dee0359ddbb890e26e6d61f21b4e26361c3b8712 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 12 Oct 2021 11:30:07 +0000 Subject: [PATCH 37/64] Fix a use-after-free in fts3 that could follow an optimize() in the middle of a SELECT statement when the hash table is non-empty. FossilOrigin-Name: 8124b2ceb71447157283b16f9a7fa6e250003b9ddf1c1b45f91db64aed79b5da --- ext/fts3/fts3_write.c | 18 ++++++++++---- manifest | 15 ++++++------ manifest.uuid | 2 +- test/fts3f.test | 57 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 test/fts3f.test diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 99605c6282..201e5813c6 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1335,8 +1335,18 @@ static int fts3SegReaderNext( char *aCopy; PendingList *pList = (PendingList *)fts3HashData(pElem); int nCopy = pList->nData+1; - pReader->zTerm = (char *)fts3HashKey(pElem); - pReader->nTerm = fts3HashKeysize(pElem); + + int nTerm = fts3HashKeysize(pElem); + if( (nTerm+1)>pReader->nTermAlloc ){ + sqlite3_free(pReader->zTerm); + pReader->zTerm = (char*)sqlite3_malloc((nTerm+1)*2); + if( !pReader->zTerm ) return SQLITE_NOMEM; + pReader->nTermAlloc = (nTerm+1)*2; + } + memcpy(pReader->zTerm, fts3HashKey(pElem), nTerm); + pReader->zTerm[nTerm] = '\0'; + pReader->nTerm = nTerm; + aCopy = (char*)sqlite3_malloc(nCopy); if( !aCopy ) return SQLITE_NOMEM; memcpy(aCopy, pList->aData, nCopy); @@ -1589,9 +1599,7 @@ int sqlite3Fts3MsrOvfl( */ void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ if( pReader ){ - if( !fts3SegReaderIsPending(pReader) ){ - sqlite3_free(pReader->zTerm); - } + sqlite3_free(pReader->zTerm); if( !fts3SegReaderIsRootOnly(pReader) ){ sqlite3_free(pReader->aNode); } diff --git a/manifest b/manifest index 9b577db228..87ffcdd487 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sharmless\scompiler\swarning\sfor\sMSVC. -D 2021-10-12T02:26:32.225 +C Fix\sa\suse-after-free\sin\sfts3\sthat\scould\sfollow\san\soptimize()\sin\sthe\smiddle\sof\sa\sSELECT\sstatement\swhen\sthe\shash\stable\sis\snon-empty. +D 2021-10-12T11:30:07.454 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -102,7 +102,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c de426ff05c1c2e7bce161cf6b706638419c3a1d9c2667de9cb9dc0458c18e226 F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c c93b1287721c2ef680186867ee1a6b5cc6659014aeffb542309101af72c77b81 +F ext/fts3/fts3_write.c 3109c1a232da86474e196cc7db754445a354409f141e08cb11c846cdb17bdf31 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -993,6 +993,7 @@ F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 F test/fts3expr5.test a5b9a053becbdb8e973fbf4d6d3abaabeb42d511d1848bd57931f3e0a1cf983e +F test/fts3f.test 8c438d5e1cab526b0021988fb1dc70cf3597b006a33ffd6c955ee89929077fe3 F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 @@ -1928,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1ceb73f316ddc736aebd1e82ef3a0d9c173d025ac5b7fcfbde0a65a0eeb60a4b -R 638916a5819730f8ce4b6f0dcd3abd60 -U mistachkin -Z cc9900a3def07dfadb4c80cb5f6cec6b +P b54c0db0fd686b85269cf4c301c9b483c5272269d0cd69a1c7141a91101192f0 +R c524f7b304405ad0bf714fb5e3f3379e +U dan +Z b56afbc09e0411ff3bd255f2ad430220 diff --git a/manifest.uuid b/manifest.uuid index c227d8204d..53d5996c48 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b54c0db0fd686b85269cf4c301c9b483c5272269d0cd69a1c7141a91101192f0 \ No newline at end of file +8124b2ceb71447157283b16f9a7fa6e250003b9ddf1c1b45f91db64aed79b5da \ No newline at end of file diff --git a/test/fts3f.test b/test/fts3f.test new file mode 100644 index 0000000000..d9a57cbc30 --- /dev/null +++ b/test/fts3f.test @@ -0,0 +1,57 @@ +# 2006 September 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 file implements regression tests for SQLite library. The +# focus of this script is testing the FTS3 module. +# +# $Id: fts3aa.test,v 1.1 2007/08/20 17:38:42 shess Exp $ +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix fts3f + +# If SQLITE_ENABLE_FTS3 is defined, omit this file. +ifcapable !fts3 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE ft USING fts3(x); + BEGIN; + INSERT INTO ft VALUES('a one'), ('b one'), ('c one'); +} + +do_test 1.1 { + set ret [list] + db eval { SELECT docid FROM ft WHERE ft MATCH 'one' } { + if { $docid==2 } { + db eval COMMIT + } + lappend ret $docid + } + set ret +} {1 2 3} + +do_execsql_test 1.2 { + BEGIN; + INSERT INTO ft VALUES('a one'), ('b one'), ('c one'); +} + +do_execsql_test 1.3 { + SELECT docid, optimize(ft) FROM ft WHERE ft MATCH 'one' +} { + 1 {Index optimized} 2 {Index already optimal} 3 {Index already optimal} + 4 {Index already optimal} + 5 {Index already optimal} 6 {Index already optimal} +} + +finish_test From ffa5b054ddbdffd93d6d1215a8eddffc6a40398d Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 12 Oct 2021 18:05:55 +0000 Subject: [PATCH 38/64] Fix an incorrect assert() in SQLITE_ENABLE_SORTER_REFERENCES logic - a new assert() introduced 5 days ago by [87e2f5eb436fc448]. FossilOrigin-Name: 7cfc839e5f1f28514cba7d11b0c0eb56d5ea65caacb8893dcf9fcf2d409e2ba5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 10 ++++++---- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 87ffcdd487..5d6416aff0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\suse-after-free\sin\sfts3\sthat\scould\sfollow\san\soptimize()\sin\sthe\smiddle\sof\sa\sSELECT\sstatement\swhen\sthe\shash\stable\sis\snon-empty. -D 2021-10-12T11:30:07.454 +C Fix\san\sincorrect\sassert()\sin\sSQLITE_ENABLE_SORTER_REFERENCES\slogic\s-\sa\snew\nassert()\sintroduced\s5\sdays\sago\sby\s[87e2f5eb436fc448]. +D 2021-10-12T18:05:55.167 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 9eab80721a24fb05eb03d4bb93d26d1ade0ac707bbb45d917ed39546427b5b3f +F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b54c0db0fd686b85269cf4c301c9b483c5272269d0cd69a1c7141a91101192f0 -R c524f7b304405ad0bf714fb5e3f3379e -U dan -Z b56afbc09e0411ff3bd255f2ad430220 +P 8124b2ceb71447157283b16f9a7fa6e250003b9ddf1c1b45f91db64aed79b5da +R a825a5ddf8510781349a95abcba73170 +U drh +Z df779db7cf34a78d9e65954cf5f5be50 diff --git a/manifest.uuid b/manifest.uuid index 53d5996c48..53404069a4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8124b2ceb71447157283b16f9a7fa6e250003b9ddf1c1b45f91db64aed79b5da \ No newline at end of file +7cfc839e5f1f28514cba7d11b0c0eb56d5ea65caacb8893dcf9fcf2d409e2ba5 \ No newline at end of file diff --git a/src/select.c b/src/select.c index d437283a4a..33c8b27629 100644 --- a/src/select.c +++ b/src/select.c @@ -942,10 +942,12 @@ static void selectExprDefer( if( pItem->u.x.iOrderByCol==0 ){ Expr *pExpr = pItem->pExpr; Table *pTab; - assert( ExprUseYTab(pExpr) ); - pTab = pExpr->y.pTab; - if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab) - && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF) + if( pExpr->op==TK_COLUMN + && pExpr->iColumn>=0 + && ALWAYS( ExprUseYTab(pExpr) ) + && (pTab = pExpr->y.pTab)!=0 + && IsOrdinaryTable(pTab) + && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)!=0 ){ int j; for(j=0; j Date: Tue, 12 Oct 2021 22:55:04 +0000 Subject: [PATCH 39/64] Fix the group_concat() inverse function implementation so that it correctly handles BLOB inputs when database text encoding is UTF16. FossilOrigin-Name: 38a1326b4bd11bbe2846990d099c28520d17ab4cace1af67248c2472f89df929 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/func.c | 6 +++++- test/windowC.test | 11 +++++++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5d6416aff0..2c27c1982a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\sassert()\sin\sSQLITE_ENABLE_SORTER_REFERENCES\slogic\s-\sa\snew\nassert()\sintroduced\s5\sdays\sago\sby\s[87e2f5eb436fc448]. -D 2021-10-12T18:05:55.167 +C Fix\sthe\sgroup_concat()\sinverse\sfunction\simplementation\sso\sthat\sit\scorrectly\nhandles\sBLOB\sinputs\swhen\sdatabase\stext\sencoding\sis\sUTF16. +D 2021-10-12T22:55:04.923 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -504,7 +504,7 @@ F src/delete.c 0c151975fa99560767d7747f9b60543d0093d9f8b89f13d2d6058e9c83ad19e7 F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 -F src/func.c 9577175a1459f65c9e3c4bbe7ed0bdf97ee928f693c81ee9f61e2642414c917c +F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -1800,7 +1800,7 @@ F test/window8.test 4ab16817414af0c904abe2ebdf88eb6c2b00058b84f9748c6174ff11fc45 F test/window9.test 349c71eab4288a1ffc19e2f65872ec2c37e6cf8a1dda2ad300364b7450ae4836 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowB.test b67bda5645f3226790e1a360c4225241840b84adb5aa2e69bfb0b27eef3b84d9 -F test/windowC.test ecf1831b995408b03f708386b37ece7a05108faf2288c0c55cff873c100e145f +F test/windowC.test 8799158a2a3ea365980371400f08fd4dff70eadffa5a1e45d42430246da70706 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 15094c1529424e62f798bc679e3fe9dfab6e8ba2f7dfe8c923b6248c31660a7c @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8124b2ceb71447157283b16f9a7fa6e250003b9ddf1c1b45f91db64aed79b5da -R a825a5ddf8510781349a95abcba73170 +P 7cfc839e5f1f28514cba7d11b0c0eb56d5ea65caacb8893dcf9fcf2d409e2ba5 +R 872a60ea606b884508fe691c518ed856 U drh -Z df779db7cf34a78d9e65954cf5f5be50 +Z 816c0f947b8549463a54c2d75025fa43 diff --git a/manifest.uuid b/manifest.uuid index 53404069a4..613ac761b2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cfc839e5f1f28514cba7d11b0c0eb56d5ea65caacb8893dcf9fcf2d409e2ba5 \ No newline at end of file +38a1326b4bd11bbe2846990d099c28520d17ab4cace1af67248c2472f89df929 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 208da48e27..6a2903d328 100644 --- a/src/func.c +++ b/src/func.c @@ -1820,7 +1820,11 @@ static void groupConcatInverse( /* pGCC is always non-NULL since groupConcatStep() will have always ** run frist to initialize it */ if( ALWAYS(pGCC) ){ - int nVS = sqlite3_value_bytes(argv[0]); + int nVS; + /* Must call sqlite3_value_text() to convert the argument into text prior + ** to invoking sqlite3_value_bytes(), in case the text encoding is UTF16 */ + (void)sqlite3_value_text(argv[0]); + nVS = sqlite3_value_bytes(argv[0]); pGCC->nAccum -= 1; if( pGCC->pnSepLengths!=0 ){ assert(pGCC->nAccum >= 0); diff --git a/test/windowC.test b/test/windowC.test index 54eb7cadc4..499c2f50fd 100644 --- a/test/windowC.test +++ b/test/windowC.test @@ -63,4 +63,15 @@ foreach {tn bBlob seps} { } } +# 2021-10-12 dbsqlfuzz 6c31db077a14149a7b22a1069294bdb068be8a96 +# +reset_db +do_execsql_test 2.0 { + PRAGMA encoding=UTF16; + WITH separator(x) AS (VALUES(',a,'),(',bc,')), + value(y) AS (VALUES(1),(x'5585d09013455178cd11ce4a')) + SELECT group_concat(y,x) OVER (ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) + FROM separator, value; +} {{} 1 蕕郐䔓硑ᇍ䫎 1} + finish_test From dbe349dfa5d705810de4783dd5417d7e9320981c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 13 Oct 2021 13:00:34 +0000 Subject: [PATCH 40/64] The sqlite3_result_text() routine (and similar) should record OOM errors in addition to SQLITE_TOOBIG errors. dbsqlfuzz FossilOrigin-Name: eca434362652fe2edd6090b29417b35bc88a170609810aa9d266f6fc27baeab8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeapi.c | 16 ++++++++++++---- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 2c27c1982a..a09c290217 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sgroup_concat()\sinverse\sfunction\simplementation\sso\sthat\sit\scorrectly\nhandles\sBLOB\sinputs\swhen\sdatabase\stext\sencoding\sis\sUTF16. -D 2021-10-12T22:55:04.923 +C The\ssqlite3_result_text()\sroutine\s(and\ssimilar)\sshould\srecord\sOOM\serrors\nin\saddition\sto\sSQLITE_TOOBIG\serrors.\ndbsqlfuzz +D 2021-10-13T13:00:34.679 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -624,7 +624,7 @@ F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c b42cf4c8518ef237586258528cd7ecff14134e1ceee741e6f95b68848b844eff F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b -F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 +F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 F src/vdbeaux.c 897912feb91ec3cd8dedc3fce21d192fd6d37d299538a13d9d93100b22e4d4a0 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7cfc839e5f1f28514cba7d11b0c0eb56d5ea65caacb8893dcf9fcf2d409e2ba5 -R 872a60ea606b884508fe691c518ed856 +P 38a1326b4bd11bbe2846990d099c28520d17ab4cace1af67248c2472f89df929 +R 3ac35cfe1e440382b52029abbcbec3d1 U drh -Z 816c0f947b8549463a54c2d75025fa43 +Z a8a18ec99357f7bcf816519aebe60764 diff --git a/manifest.uuid b/manifest.uuid index 613ac761b2..55c4f9dbf1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -38a1326b4bd11bbe2846990d099c28520d17ab4cace1af67248c2472f89df929 \ No newline at end of file +eca434362652fe2edd6090b29417b35bc88a170609810aa9d266f6fc27baeab8 \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 5de7c64c25..5c4c321b39 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -362,8 +362,8 @@ void sqlite3_value_free(sqlite3_value *pOld){ ** the function result. ** ** The setStrOrError() function calls sqlite3VdbeMemSetStr() to store the -** result as a string or blob but if the string or blob is too large, it -** then sets the error code to SQLITE_TOOBIG +** result as a string or blob. Appropriate errors are set if the string/blob +** is too big or if an OOM occurs. ** ** The invokeValueDestructor(P,X) routine invokes destructor function X() ** on value P is not going to be used and need to be destroyed. @@ -375,8 +375,16 @@ static void setResultStrOrError( u8 enc, /* Encoding of z. 0 for BLOBs */ void (*xDel)(void*) /* Destructor function */ ){ - if( sqlite3VdbeMemSetStr(pCtx->pOut, z, n, enc, xDel)==SQLITE_TOOBIG ){ - sqlite3_result_error_toobig(pCtx); + int rc = sqlite3VdbeMemSetStr(pCtx->pOut, z, n, enc, xDel); + if( rc ){ + if( rc==SQLITE_TOOBIG ){ + sqlite3_result_error_toobig(pCtx); + }else{ + /* The only errors possible from sqlite3VdbeMemSetStr are + ** SQLITE_TOOBIG and SQLITE_NOMEM */ + assert( rc==SQLITE_NOMEM ); + sqlite3_result_error_nomem(pCtx); + } } } static int invokeValueDestructor( From febf0352cd53900849289db9beca69e25de8b981 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 13 Oct 2021 14:01:44 +0000 Subject: [PATCH 41/64] Remove a NEVER() macro in ALTER TABLE due to an obscure case of a nested CTE inside an UPDATE within a trigger. dbsqlfuzz e89174cbfad2d904f06b5e24df0a22510b6a1c1e FossilOrigin-Name: 9e2f06b84f9942772c30bed2ac71b3296c9adf9661dbf8916d56996253ee8d28 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 3 ++- test/alter.test | 20 ++++++++++++++++++++ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a09c290217..a966a2200d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3_result_text()\sroutine\s(and\ssimilar)\sshould\srecord\sOOM\serrors\nin\saddition\sto\sSQLITE_TOOBIG\serrors.\ndbsqlfuzz -D 2021-10-13T13:00:34.679 +C Remove\sa\sNEVER()\smacro\sin\sALTER\sTABLE\sdue\sto\san\nobscure\scase\sof\sa\snested\sCTE\sinside\san\sUPDATE\swithin\sa\ntrigger.\s\sdbsqlfuzz\se89174cbfad2d904f06b5e24df0a22510b6a1c1e +D 2021-10-13T14:01:44.495 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 9578c5a54027166688ec3e679ed10e85a3d08b986210e98d736f57aacc63335a +F src/alter.c 9179b778315243bd2935f7f1564b1e72c723f049805105c1bb7125b5e4e4f90d F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c e3f9d9a2a4a844750f3f348f37afb244535f21382cbfcd840152cb21cb41cfaf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -648,7 +648,7 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test cc47afa5e11e0d6771a85a4993fa6ff721480ddb53ea538ec3fdbafb720bd505 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test f53d8a4ecd35f051c07e54a36beec5d0a30d30a9d98bc723f6cde6afbfb3c5ca +F test/alter.test 313073774ab5c3f2ef1d3f0d03757c9d3a81284ae7e1b4a6ca34db088f886896 F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680fba3 F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 38a1326b4bd11bbe2846990d099c28520d17ab4cace1af67248c2472f89df929 -R 3ac35cfe1e440382b52029abbcbec3d1 +P eca434362652fe2edd6090b29417b35bc88a170609810aa9d266f6fc27baeab8 +R da7a34f7a690fe95abeb67fb64a7687a U drh -Z a8a18ec99357f7bcf816519aebe60764 +Z 5d044be66ea45db93717f2c3818a48a4 diff --git a/manifest.uuid b/manifest.uuid index 55c4f9dbf1..baed48e6f7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eca434362652fe2edd6090b29417b35bc88a170609810aa9d266f6fc27baeab8 \ No newline at end of file +9e2f06b84f9942772c30bed2ac71b3296c9adf9661dbf8916d56996253ee8d28 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 89e5a30faa..681322e5b7 100644 --- a/src/alter.c +++ b/src/alter.c @@ -869,7 +869,8 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ Parse *pParse = pWalker->pParse; int i; if( pParse->nErr ) return WRC_Abort; - if( NEVER(p->selFlags & (SF_View|SF_CopyCte)) ){ + assert( (p->selFlags & SF_View)==0 ); + if( p->selFlags & (SF_View|SF_CopyCte) ){ return WRC_Prune; } if( ALWAYS(p->pEList) ){ diff --git a/test/alter.test b/test/alter.test index 634e318e3d..0088858a15 100644 --- a/test/alter.test +++ b/test/alter.test @@ -915,4 +915,24 @@ do_catchsql_test alter-18.1 { ALTER TABLE log RENAME COLUMN a TO x; } {1 {error in trigger tr1: no such table: main.logx}} +# 2021-10-13 dbsqlfuzz e89174cbfad2d904f06b5e24df0a22510b6a1c1e +reset_db +do_execsql_test alter-19.1 { + CREATE TABLE t1(x); + CREATE TABLE t2(c); + CREATE TRIGGER r1 AFTER INSERT ON t2 BEGIN + UPDATE t2 SET (c)=( + EXISTS(SELECT 1 WHERE (WITH cte1(a) AS (SELECT 1 FROM t1 WHERE (SELECT 1 WHERE (WITH cte2(b) AS (VALUES(1))SELECT b FROM cte2)))SELECT a FROM cte1)) + ); + END; + ALTER TABLE t2 RENAME TO t3; +} {} +do_execsql_test alter-19.2 { + SELECT name FROM sqlite_schema WHERE sql LIKE '%t2%'; +} {} +do_execsql_test alter-19.3 { + SELECT name FROM sqlite_schema WHERE sql LIKE '%t3%' ORDER BY name; +} {r1 t3} + + finish_test From f6d07c83fcc2f5f904e900da6f9cac9a690d8cd6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 13 Oct 2021 14:45:35 +0000 Subject: [PATCH 42/64] Back out the SQLITE_OPEN_EXCLUSIVE changes because it does not work on Windows and it does not work always on unix. FossilOrigin-Name: d008ad793dfb11c287f366377cbc561acedef6c9d08b1557f463484eda41a84e --- manifest | 19 ++++++++++--------- manifest.uuid | 2 +- src/main.c | 1 + src/os_unix.c | 2 -- src/shell.c.in | 2 -- src/sqlite.h.in | 7 ------- 6 files changed, 12 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index a966a2200d..fe446f15bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\smacro\sin\sALTER\sTABLE\sdue\sto\san\nobscure\scase\sof\sa\snested\sCTE\sinside\san\sUPDATE\swithin\sa\ntrigger.\s\sdbsqlfuzz\se89174cbfad2d904f06b5e24df0a22510b6a1c1e -D 2021-10-13T14:01:44.495 +C Back\sout\sthe\sSQLITE_OPEN_EXCLUSIVE\schanges\sbecause\sit\sdoes\snot\swork\son\nWindows\sand\sit\sdoes\snot\swork\salways\son\sunix. +D 2021-10-13T14:45:35.903 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c b32e2dcbca838cb8acd4777a59243db4bcea53089e3181b0ea3e4dc75b43aeff F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c d375bb6f761b3fa2cd2c1afaa5d4b282c7128a2c4d2fe7da6294fe8eaca9fa1a +F src/main.c bfe067d61ebbd0e6eb023f1fb6b353021e621cf1657e061d629064a740bfbf6f F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -533,7 +533,7 @@ F src/os.c 91fc69f95ef0528368174dca20f01e1d8f82934f719e1cb50fd0260b18c028a6 F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 +F src/os_unix.c feac74a0ba7652c405ba30f61d9e738be717d15899f2915a129ef160a3e5b26b F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c e20778eee03916035f5fb861bab7edb894779b1c448c3725fd4cde5f6a3edc6d @@ -550,8 +550,8 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in ac685e63c506fb2e39375c83347c88bff84dc48fa5d6a59f508d7d67951693a0 -F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a +F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa637 +F src/sqlite.h.in ef6ece2096f7d94635d239376c6cda84a33b2534b61ddd77be9673a5e4b1a6bc F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h 642c17df9e5a3517db452ac73a2b953143449a8bc2f6570c60de455a89a8571c @@ -1929,7 +1929,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 eca434362652fe2edd6090b29417b35bc88a170609810aa9d266f6fc27baeab8 -R da7a34f7a690fe95abeb67fb64a7687a +P 9e2f06b84f9942772c30bed2ac71b3296c9adf9661dbf8916d56996253ee8d28 +Q -d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 +R 0ec263c471728799142e5e4ea834f323 U drh -Z 5d044be66ea45db93717f2c3818a48a4 +Z 15eb8964bd4da467af110c75425680d3 diff --git a/manifest.uuid b/manifest.uuid index baed48e6f7..297c88d584 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e2f06b84f9942772c30bed2ac71b3296c9adf9661dbf8916d56996253ee8d28 \ No newline at end of file +d008ad793dfb11c287f366377cbc561acedef6c9d08b1557f463484eda41a84e \ No newline at end of file diff --git a/src/main.c b/src/main.c index ade9bd0d9f..bf33b640b8 100644 --- a/src/main.c +++ b/src/main.c @@ -3161,6 +3161,7 @@ static int openDatabase( ** off all other flags. */ flags &= ~( SQLITE_OPEN_DELETEONCLOSE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TRANSIENT_DB | diff --git a/src/os_unix.c b/src/os_unix.c index aa6b3b8e4c..d45fdabab2 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6185,8 +6185,6 @@ static int unixOpen( /* If unable to create a journal because the directory is not ** writable, change the error code to indicate that. */ rc = SQLITE_READONLY_DIRECTORY; - }else if( errno==EEXIST ){ - rc = SQLITE_CANTOPEN_EXISTS; }else if( errno!=EISDIR && isReadWrite ){ /* Failed to open the file for read/write access. Try read-only. */ flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); diff --git a/src/shell.c.in b/src/shell.c.in index b33d6155e8..27dbe98957 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8904,8 +8904,6 @@ static int do_meta_command(char *zLine, ShellState *p){ p->openMode = SHELL_OPEN_READONLY; }else if( optionMatch(z, "nofollow") ){ p->openFlags |= SQLITE_OPEN_NOFOLLOW; - }else if( optionMatch(z, "excl") ){ - p->openFlags |= SQLITE_OPEN_EXCLUSIVE; #ifndef SQLITE_OMIT_DESERIALIZE }else if( optionMatch(z, "deserialize") ){ p->openMode = SHELL_OPEN_DESERIALIZE; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 6fab852b69..84f9e6fdbf 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -539,7 +539,6 @@ int sqlite3_exec( #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) -#define SQLITE_CANTOPEN_EXISTS (SQLITE_CANTOPEN | (7<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) @@ -3419,12 +3418,6 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ** [[OPEN_NOFOLLOW]] ^(
[SQLITE_OPEN_NOFOLLOW]
**
The database filename is not allowed to be a symbolic link
-** -** [[OPEN_EXCLUSIVE]] ^(
[SQLITE_OPEN_EXCLUSIVE]
-**
This flag causes the open to fail if the database file already -** exists. The open will only be success if this flag is used in combination -** with the SQLITE_OPEN_CREATE and SQLITE_OPEN_READWRITE flags and if -** the file does not previously exist.
** )^ ** ** If the 3rd parameter to sqlite3_open_v2() is not one of the From c380f79112f6e0f8dd24964909c8c73bd11dd6e5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 13 Oct 2021 15:09:37 +0000 Subject: [PATCH 43/64] Attempt to clarify the sqlite3_open_v2() documentation so that people do not come away with the idea that SQLITE_OPEN_EXCLUSIVE is an allowed bit value for the 3rd argument bitmask. FossilOrigin-Name: 1310a126deae6974277d281ff78a7c34bd21829dd822a9fd8d6bda23cfba3f15 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 23 ++++++++++++++++++++++- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index fe446f15bf..4f24fe338a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\sthe\sSQLITE_OPEN_EXCLUSIVE\schanges\sbecause\sit\sdoes\snot\swork\son\nWindows\sand\sit\sdoes\snot\swork\salways\son\sunix. -D 2021-10-13T14:45:35.903 +C Attempt\sto\sclarify\sthe\ssqlite3_open_v2()\sdocumentation\sso\sthat\speople\sdo\snot\ncome\saway\swith\sthe\sidea\sthat\sSQLITE_OPEN_EXCLUSIVE\sis\san\sallowed\sbit\svalue\nfor\sthe\s3rd\sargument\sbitmask. +D 2021-10-13T15:09:37.468 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -551,7 +551,7 @@ F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa637 -F src/sqlite.h.in ef6ece2096f7d94635d239376c6cda84a33b2534b61ddd77be9673a5e4b1a6bc +F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h 642c17df9e5a3517db452ac73a2b953143449a8bc2f6570c60de455a89a8571c @@ -1929,8 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9e2f06b84f9942772c30bed2ac71b3296c9adf9661dbf8916d56996253ee8d28 -Q -d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 -R 0ec263c471728799142e5e4ea834f323 +P d008ad793dfb11c287f366377cbc561acedef6c9d08b1557f463484eda41a84e +R 644c30e18e947a05fafdb5df2b0f8d2d U drh -Z 15eb8964bd4da467af110c75425680d3 +Z e7301d7f781cb8ce94d114b2a893f0d7 diff --git a/manifest.uuid b/manifest.uuid index 297c88d584..7c225c6221 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d008ad793dfb11c287f366377cbc561acedef6c9d08b1557f463484eda41a84e \ No newline at end of file +1310a126deae6974277d281ff78a7c34bd21829dd822a9fd8d6bda23cfba3f15 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 84f9e6fdbf..4435925de4 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -574,6 +574,19 @@ int sqlite3_exec( ** These bit values are intended for use in the ** 3rd parameter to the [sqlite3_open_v2()] interface and ** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +** +** Only those flags marked as "Ok for sqlite3_open_v2()" may be +** used as the third argument to the [sqlite3_open_v2()] interface. +** The other flags have historically been ignored by sqlite3_open_v2(), +** though future versions of SQLite might change so that an error is +** raised if any of the disallowed bits are passed into sqlite3_open_v2(). +** Applications should not depend on the historical behavior. +** +** Note in particular that passing the SQLITE_OPEN_EXCLUSIVE flag into +** [sqlite3_open_v2()] does *not* cause the underlying database file +** to be opened using O_EXCL. Passing SQLITE_OPEN_EXCLUSIVE into +** [sqlite3_open_v2()] has historically be a no-op and might become an +** error in future versions of SQLite. */ #define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ @@ -3423,7 +3436,15 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** If the 3rd parameter to sqlite3_open_v2() is not one of the ** required combinations shown above optionally combined with other ** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] -** then the behavior is undefined. +** then the behavior is undefined. Historic versions of SQLite +** have silently ignored surplus bits in the flags parameter to +** sqlite3_open_v2(), however that behavior might not be carried through +** into future versions of SQLite and so applications should not rely +** upon it. Note in particular that the SQLITE_OPEN_EXCLUSIVE flag is a no-op +** for sqlite3_open_v2(). The SQLITE_OPEN_EXCLUSIVE does *not* cause +** the open to fail if the database already exists. The SQLITE_OPEN_EXCLUSIVE +** flag is intended for use by the [sqlite3_vfs|VFS interface] only, and not +** by sqlite3_open_v2(). ** ** ^The fourth parameter to sqlite3_open_v2() is the name of the ** [sqlite3_vfs] object that defines the operating system interface that From a71490889e0146404553ad682c251ba8b5fb051e Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 13 Oct 2021 20:11:30 +0000 Subject: [PATCH 44/64] Convert an assert() into a corruption detection branch in sqlite3BtreePayload(). dbsqlfuzz 848171b5d58f6e4a62257466e0e7de16696d4f02. FossilOrigin-Name: f038d7f90e04838479e44ded00f627ec5ad8e1bd477edea8e87e66dd37485f30 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4f24fe338a..303751989b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Attempt\sto\sclarify\sthe\ssqlite3_open_v2()\sdocumentation\sso\sthat\speople\sdo\snot\ncome\saway\swith\sthe\sidea\sthat\sSQLITE_OPEN_EXCLUSIVE\sis\san\sallowed\sbit\svalue\nfor\sthe\s3rd\sargument\sbitmask. -D 2021-10-13T15:09:37.468 +C Convert\san\sassert()\sinto\sa\scorruption\sdetection\sbranch\sin\nsqlite3BtreePayload().\s\sdbsqlfuzz\s848171b5d58f6e4a62257466e0e7de16696d4f02. +D 2021-10-13T20:11:30.248 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 472cc43a2631d9bd917475e0a0ab43949ae27c8541473a90b55c51011f6121cc +F src/btree.c 35782a608c940e219a01cf9d84de55e11668a42ede3b7b2d2fb4a6edb52e97e5 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c f70d6375ea5b78daac5b1d24eab53ed7b81c3e68a17dff9581c50c0c06180e00 @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d008ad793dfb11c287f366377cbc561acedef6c9d08b1557f463484eda41a84e -R 644c30e18e947a05fafdb5df2b0f8d2d +P 1310a126deae6974277d281ff78a7c34bd21829dd822a9fd8d6bda23cfba3f15 +R ddd28488cf1a451a13c0cb716c97747e U drh -Z e7301d7f781cb8ce94d114b2a893f0d7 +Z 5667237680aeda2d46fd0828f30e8bb5 diff --git a/manifest.uuid b/manifest.uuid index 7c225c6221..660c03c92b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1310a126deae6974277d281ff78a7c34bd21829dd822a9fd8d6bda23cfba3f15 \ No newline at end of file +f038d7f90e04838479e44ded00f627ec5ad8e1bd477edea8e87e66dd37485f30 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 8b7f1137c8..766fd0805b 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4836,7 +4836,9 @@ static int accessPayload( assert( pPage ); assert( eOp==0 || eOp==1 ); assert( pCur->eState==CURSOR_VALID ); - assert( pCur->ixnCell ); + if( pCur->ix>=pPage->nCell ){ + return SQLITE_CORRUPT_PAGE(pPage); + } assert( cursorHoldsMutex(pCur) ); getCellInfo(pCur); @@ -5023,7 +5025,6 @@ int sqlite3BtreePayload(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ assert( cursorHoldsMutex(pCur) ); assert( pCur->eState==CURSOR_VALID ); assert( pCur->iPage>=0 && pCur->pPage ); - assert( pCur->ixpPage->nCell ); return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0); } From 8436f53ebe369e0d646068d3b25ea11673debf0e Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 13 Oct 2021 20:29:05 +0000 Subject: [PATCH 45/64] New tests added to test/fuzzdata8.db. FossilOrigin-Name: e944d71760e3ee3de5dd518a04dad54d66ae4d40dac172b64d16c508471e30a1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2724864 -> 2748416 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 303751989b..7ec49970cf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Convert\san\sassert()\sinto\sa\scorruption\sdetection\sbranch\sin\nsqlite3BtreePayload().\s\sdbsqlfuzz\s848171b5d58f6e4a62257466e0e7de16696d4f02. -D 2021-10-13T20:11:30.248 +C New\stests\sadded\sto\stest/fuzzdata8.db. +D 2021-10-13T20:29:05.636 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1063,7 +1063,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db d6293be0c83e97c2b6c2d35507de1643cd04650938ea05f0096b5f53096b5178 +F test/fuzzdata8.db 62c5303ef5a570b1a302d7e495ecfaf007dd4752618ed6378913df671fd0cb2a F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1310a126deae6974277d281ff78a7c34bd21829dd822a9fd8d6bda23cfba3f15 -R ddd28488cf1a451a13c0cb716c97747e +P f038d7f90e04838479e44ded00f627ec5ad8e1bd477edea8e87e66dd37485f30 +R 870bdbe1eb2c9cb4e58fceb75c7ce534 U drh -Z 5667237680aeda2d46fd0828f30e8bb5 +Z 99c3329e6e6492e729250b2951bb94b6 diff --git a/manifest.uuid b/manifest.uuid index 660c03c92b..a237bff91e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f038d7f90e04838479e44ded00f627ec5ad8e1bd477edea8e87e66dd37485f30 \ No newline at end of file +e944d71760e3ee3de5dd518a04dad54d66ae4d40dac172b64d16c508471e30a1 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 5f66c63ce644b63d19535b8b51db1d2775a2cd6f..808d8065f7deb0599532ab66d4f19e4cdb43ba8a 100644 GIT binary patch delta 53039 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