From 56785a0a8048e1b7076fae06e7118c1e24633c81 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 16 Feb 2019 22:45:55 +0000 Subject: [PATCH 01/48] Fix an assert() that might be false for a corrupt database. FossilOrigin-Name: 0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 31ec0424b9..5f67f503cc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\soversized\scell\sdetection\swhen\supdating\sptrmap\spages\sin\nbalance_nonroot(). -D 2019-02-14T15:27:12.650 +C Fix\san\sassert()\sthat\smight\sbe\sfalse\sfor\sa\scorrupt\sdatabase. +D 2019-02-16T22:45:55.998 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 161b6a57b91d160065e512a4d0be180e402a16a059034a380cbdc2411924f8ac +F src/btree.c 2105865a621c211cd76d8d21a6831249c31c876d7d1fe7d7ebe27410cd893747 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 @@ -1804,7 +1804,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 167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 -R 5fce60e5e60143c7168638176073d3e9 +P aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 +R 17aed5b419bf8f1e5cfa29ef4f74b9e7 U drh -Z 1127274df05b3c005a32360404b93266 +Z d53e7c6537b08070a7f2249013f3162e diff --git a/manifest.uuid b/manifest.uuid index c6a49cf8da..f696d7c70f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 \ No newline at end of file +0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fe0112ced7..0a8e6a99e4 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6730,7 +6730,7 @@ static void insertCell( pPage->nCell++; /* increment the cell count */ if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; - assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell ); + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); #ifndef SQLITE_OMIT_AUTOVACUUM if( pPage->pBt->autoVacuum ){ /* The cell may contain a pointer to an overflow page. If so, write From b43ac0021ff4f9e389551fc36b57664e265d4bc0 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 18 Feb 2019 12:16:03 +0000 Subject: [PATCH 02/48] Fix an assert() that might not be true if the %_segdir table of FTS3 contains corrupt entries. FossilOrigin-Name: a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 --- ext/fts3/fts3_write.c | 4 +++- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 980992 -> 987136 bytes 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 130a7fbdea..a788be7e02 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1348,7 +1348,9 @@ static int fts3SegReaderNext( /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf ** blocks have already been traversed. */ - assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock ); +#ifdef CORRUPT_DB + assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock || CORRUPT_DB ); +#endif if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ return SQLITE_OK; } diff --git a/manifest b/manifest index 5f67f503cc..b2fe3366be 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\smight\sbe\sfalse\sfor\sa\scorrupt\sdatabase. -D 2019-02-16T22:45:55.998 +C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\s%_segdir\stable\sof\sFTS3\scontains\ncorrupt\sentries. +D 2019-02-18T12:16:03.611 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -98,7 +98,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 3732d0495b248a23a8f92af3d582c5d910d607b2bf54985e81a3d4d09b4745ea +F ext/fts3/fts3_write.c 8174c14b1027c01751c5671878927dc855507bc3248848f91cebe3950b7da24a F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 267bc89b51f4f0fca01f80ff432ff9b26e65131e806c5ca20119dfc63dd47a90 +F test/fuzzdata8.db b7f93d26fb1d29af7c5181eda877f1a20bdbb3d286bc14622e77d08752b6da61 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 -R 17aed5b419bf8f1e5cfa29ef4f74b9e7 +P 0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 +R 4804fb0a39426f38f5e4fc938e4a29ae U drh -Z d53e7c6537b08070a7f2249013f3162e +Z cb283c5b86f11d6cac5693b69d717c32 diff --git a/manifest.uuid b/manifest.uuid index f696d7c70f..d18260ebb1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 \ No newline at end of file +a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index e81a9dea0a1b516ee462a804fe98ee55f59f2592..6ae5d76f4a9e4ea18af4be55f09953fec3f0e3f3 100644 GIT binary patch delta 11095 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 VFI20@ea?^1ev%fNuUqdQ{69DPoPPiS delta 10628 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 From 9df385ec3d1167d6abba905f39fc7cc84a2d24b8 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 13:08:35 +0000 Subject: [PATCH 03/48] Always use the symbolic name SQLITE_IDXTYPE_PRIMARYKEY rather than a hard-coded magic number 2. FossilOrigin-Name: 55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b2fe3366be..1f12f24de1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\s%_segdir\stable\sof\sFTS3\scontains\ncorrupt\sentries. -D 2019-02-18T12:16:03.611 +C Always\suse\sthe\ssymbolic\sname\sSQLITE_IDXTYPE_PRIMARYKEY\srather\sthan\sa\shard-coded\nmagic\snumber\s2. +D 2019-02-19T13:08:35.738 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -475,7 +475,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 4cf069988908f650bec92fd821a082f6eda87c01191047e49a1a5007af93274c +F src/insert.c 305f6ea82a90c3d506ad26d3b6530655bcf08dbff20403ce9f20c21758fbd5c0 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f @@ -1804,7 +1804,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 0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 -R 4804fb0a39426f38f5e4fc938e4a29ae +P a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 +R 704b4d956a0ce2c9b781aab7a71ed157 U drh -Z cb283c5b86f11d6cac5693b69d717c32 +Z b0619f705fb89193b6dad39d43e9fd99 diff --git a/manifest.uuid b/manifest.uuid index d18260ebb1..253003811b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 \ No newline at end of file +55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 1b6235d4d0..6f044db5a7 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1669,7 +1669,9 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); VdbeComment((v, "for %s", pIdx->zName)); #ifdef SQLITE_ENABLE_NULL_TRIM - if( pIdx->idxType==2 ) sqlite3SetMakeRecordP5(v, pIdx->pTable); + if( pIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + sqlite3SetMakeRecordP5(v, pIdx->pTable); + } #endif /* In an UPDATE operation, if this index is the PRIMARY KEY index @@ -2410,7 +2412,7 @@ static int xferOptimization( sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); } } - if( !HasRowid(pSrc) && pDestIdx->idxType==2 ){ + if( !HasRowid(pSrc) && pDestIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ idxInsFlags |= OPFLAG_NCHANGE; } sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); From 3cbd2b7245ad0b262d5e0810ac3200e9797db1eb Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 13:51:58 +0000 Subject: [PATCH 04/48] New assert() to verify the TF_HasprimaryKey flag. FossilOrigin-Name: 0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1f12f24de1..c980667aed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\suse\sthe\ssymbolic\sname\sSQLITE_IDXTYPE_PRIMARYKEY\srather\sthan\sa\shard-coded\nmagic\snumber\s2. -D 2019-02-19T13:08:35.738 +C New\sassert()\sto\sverify\sthe\sTF_HasprimaryKey\sflag. +D 2019-02-19T13:51:58.095 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 2105865a621c211cd76d8d21a6831249c31c876d7d1fe7d7ebe27410cd893747 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 +F src/build.c ac41c86b486f480b2bcad7e55c6cc19d7151082f74682ab048c45980d6c9ddac F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -1804,7 +1804,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 a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 -R 704b4d956a0ce2c9b781aab7a71ed157 +P 55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e +R 4957484ea90ae4ee926291ee2f0443fe U drh -Z b0619f705fb89193b6dad39d43e9fd99 +Z 06b0b1933b49b6d18ffce83176015625 diff --git a/manifest.uuid b/manifest.uuid index 253003811b..a65f486535 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e \ No newline at end of file +0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 \ No newline at end of file diff --git a/src/build.c b/src/build.c index f7e46d0a95..0cf9f52701 100644 --- a/src/build.c +++ b/src/build.c @@ -1991,6 +1991,11 @@ void sqlite3EndTable( if( p->tnum==1 ) p->tabFlags |= TF_Readonly; } + assert( (p->tabFlags & TF_HasPrimaryKey)==0 + || p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 ); + assert( (p->tabFlags & TF_HasPrimaryKey)!=0 + || (p->iPKey<0 && sqlite3PrimaryKeyIndex(p)==0) ); + /* Special processing for WITHOUT ROWID Tables */ if( tabOpts & TF_WithoutRowid ){ if( (p->tabFlags & TF_Autoincrement) ){ From 12fe9a0d2512ebbbcc9c492af187ff76404b913e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 16:42:54 +0000 Subject: [PATCH 05/48] Fix an assert() that might not be true if the database file is corrupt. FossilOrigin-Name: f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 987136 -> 991232 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c980667aed..d4cd296435 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()\sto\sverify\sthe\sTF_HasprimaryKey\sflag. -D 2019-02-19T13:51:58.095 +C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\sdatabase\sfile\sis\scorrupt. +D 2019-02-19T16:42:54.196 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 2105865a621c211cd76d8d21a6831249c31c876d7d1fe7d7ebe27410cd893747 +F src/btree.c 026f48c39b179a5602423904fcaaae87bbd75f659fd672b3756fea43356d9909 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c ac41c86b486f480b2bcad7e55c6cc19d7151082f74682ab048c45980d6c9ddac @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db b7f93d26fb1d29af7c5181eda877f1a20bdbb3d286bc14622e77d08752b6da61 +F test/fuzzdata8.db 04d95f81db43fa4a247531d25573544125d9dd2777ae43594c9eb57e2a8b901c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e -R 4957484ea90ae4ee926291ee2f0443fe +P 0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 +R bfae54bdd2f15a7a8fbc764b3228c6f1 U drh -Z 06b0b1933b49b6d18ffce83176015625 +Z aaec93d3bd3865148d42c2428c55baee diff --git a/manifest.uuid b/manifest.uuid index a65f486535..7a8eaf1d80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 \ No newline at end of file +f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 0a8e6a99e4..aa2c84999c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8261,7 +8261,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ } assert( sqlite3PagerIswriteable(pChild->pDbPage) ); assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); - assert( pChild->nCell==pRoot->nCell ); + assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 6ae5d76f4a9e4ea18af4be55f09953fec3f0e3f3..ed0d3497b4622f8ea25c591ae96612ee07a24d8e 100644 GIT binary patch delta 15031 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 delta 14454 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 It?v*1ADO){3jhEB From 6d7f18d60cef4bcae013aa8bc57f153f69693b7c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 17:45:31 +0000 Subject: [PATCH 06/48] Fix a potential memory leak in RBU if the rbu_fossil_delta() SQL function is misused. Misuse never happens in a working RBU system, so this is not a particularly important fix. FossilOrigin-Name: 12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 --- ext/rbu/sqlite3rbu.c | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index e86606be99..1a78adc851 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -684,6 +684,7 @@ static void rbuFossilDeltaFunc( }else{ nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); if( nOut2!=nOut ){ + sqlite3_free(aOut); sqlite3_result_error(context, "corrupt fossil delta", -1); }else{ sqlite3_result_blob(context, aOut, nOut, sqlite3_free); diff --git a/manifest b/manifest index d4cd296435..c4848176e4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\sdatabase\sfile\sis\scorrupt. -D 2019-02-19T16:42:54.196 +C Fix\sa\spotential\smemory\sleak\sin\sRBU\sif\sthe\srbu_fossil_delta()\sSQL\sfunction\sis\nmisused.\s\sMisuse\snever\shappens\sin\sa\sworking\sRBU\ssystem,\sso\sthis\sis\snot\sa\s\nparticularly\simportant\sfix. +D 2019-02-19T17:45:31.317 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -354,7 +354,7 @@ F ext/rbu/rbutemplimit.test 7f408f49b90fa0a720d7599f3aec74a3c85e6cd78e56fdf726ce F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc -F ext/rbu/sqlite3rbu.c d643661c7c85e79f4d0bc56c73f6f2dd55c35732dd41f378b0fd3b182a33242d +F ext/rbu/sqlite3rbu.c d0627582dc894d96e70a1f4b3c8953abdd9fd4870f9a229479309ebfca9eda41 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -1804,7 +1804,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 0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 -R bfae54bdd2f15a7a8fbc764b3228c6f1 +P f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d +R 8d9f63c20f18bc4035bf1d3926ca6101 U drh -Z aaec93d3bd3865148d42c2428c55baee +Z 3f3200a2e92dbd4c9a6a6ed07ff60873 diff --git a/manifest.uuid b/manifest.uuid index 7a8eaf1d80..34fb63dc13 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d \ No newline at end of file +12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 \ No newline at end of file From 4bec44bdfa1fea3374a8e262b6a8da6fc79f08b8 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 18:39:16 +0000 Subject: [PATCH 07/48] Add the fossildelta.c extension in ext/misc with implementations of the Fossil delta functions. FossilOrigin-Name: b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 --- ext/misc/fossildelta.c | 791 +++++++++++++++++++++++++++++++++++++++++ manifest | 11 +- manifest.uuid | 2 +- 3 files changed, 798 insertions(+), 6 deletions(-) create mode 100644 ext/misc/fossildelta.c diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c new file mode 100644 index 0000000000..3d845faa98 --- /dev/null +++ b/ext/misc/fossildelta.c @@ -0,0 +1,791 @@ +/* +** 2019-02-19 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This SQLite extension implements the delta functions used by Fossil. +*/ +#include +#include +#include +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + +/* +** The "u32" type must be an unsigned 32-bit integer. Adjust this +*/ +typedef unsigned int u32; + +/* +** Must be a 16-bit value +*/ +typedef short int s16; +typedef unsigned short int u16; + + +/* +** The width of a hash window in bytes. The algorithm only works if this +** is a power of 2. +*/ +#define NHASH 16 + +/* +** The current state of the rolling hash. +** +** z[] holds the values that have been hashed. z[] is a circular buffer. +** z[i] is the first entry and z[(i+NHASH-1)%NHASH] is the last entry of +** the window. +** +** Hash.a is the sum of all elements of hash.z[]. Hash.b is a weighted +** sum. Hash.b is z[i]*NHASH + z[i+1]*(NHASH-1) + ... + z[i+NHASH-1]*1. +** (Each index for z[] should be module NHASH, of course. The %NHASH operator +** is omitted in the prior expression for brevity.) +*/ +typedef struct hash hash; +struct hash { + u16 a, b; /* Hash values */ + u16 i; /* Start of the hash window */ + char z[NHASH]; /* The values that have been hashed */ +}; + +/* +** Initialize the rolling hash using the first NHASH characters of z[] +*/ +static void hash_init(hash *pHash, const char *z){ + u16 a, b, i; + a = b = z[0]; + for(i=1; iz, z, NHASH); + pHash->a = a & 0xffff; + pHash->b = b & 0xffff; + pHash->i = 0; +} + +/* +** Advance the rolling hash by a single character "c" +*/ +static void hash_next(hash *pHash, int c){ + u16 old = pHash->z[pHash->i]; + pHash->z[pHash->i] = c; + pHash->i = (pHash->i+1)&(NHASH-1); + pHash->a = pHash->a - old + c; + pHash->b = pHash->b - NHASH*old + pHash->a; +} + +/* +** Return a 32-bit hash value +*/ +static u32 hash_32bit(hash *pHash){ + return (pHash->a & 0xffff) | (((u32)(pHash->b & 0xffff))<<16); +} + +/* +** Compute a hash on NHASH bytes. +** +** This routine is intended to be equivalent to: +** hash h; +** hash_init(&h, zInput); +** return hash_32bit(&h); +*/ +static u32 hash_once(const char *z){ + u16 a, b, i; + a = b = z[0]; + for(i=1; i0; i++, v>>=6){ + zBuf[i] = zDigits[v&0x3f]; + } + for(j=i-1; j>=0; j--){ + *(*pz)++ = zBuf[j]; + } +} + +/* +** Read bytes from *pz and convert them into a positive integer. When +** finished, leave *pz pointing to the first character past the end of +** the integer. The *pLen parameter holds the length of the string +** in *pz and is decremented once for each character in the integer. +*/ +static unsigned int getInt(const char **pz, int *pLen){ + static const signed char zValue[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, + -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1, + }; + unsigned int v = 0; + int c; + unsigned char *z = (unsigned char*)*pz; + unsigned char *zStart = z; + while( (c = zValue[0x7f&*(z++)])>=0 ){ + v = (v<<6) + c; + } + z--; + *pLen -= z - zStart; + *pz = (char*)z; + return v; +} + +/* +** Return the number digits in the base-64 representation of a positive integer +*/ +static int digit_count(int v){ + unsigned int i, x; + for(i=1, x=64; v>=x; i++, x <<= 6){} + return i; +} + +#ifdef __GNUC__ +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif + +/* +** Compute a 32-bit big-endian checksum on the N-byte buffer. If the +** buffer is not a multiple of 4 bytes length, compute the sum that would +** have occurred if the buffer was padded with zeros to the next multiple +** of four bytes. +*/ +static unsigned int checksum(const char *zIn, size_t N){ + static const int byteOrderTest = 1; + const unsigned char *z = (const unsigned char *)zIn; + const unsigned char *zEnd = (const unsigned char*)&zIn[N&~3]; + unsigned sum = 0; + assert( (z - (const unsigned char*)0)%4==0 ); /* Four-byte alignment */ + if( 0==*(char*)&byteOrderTest ){ + /* This is a big-endian machine */ + while( z=4003000 + while( z=1300 + while( z= 16){ + sum0 += ((unsigned)z[0] + z[4] + z[8] + z[12]); + sum1 += ((unsigned)z[1] + z[5] + z[9] + z[13]); + sum2 += ((unsigned)z[2] + z[6] + z[10]+ z[14]); + sum += ((unsigned)z[3] + z[7] + z[11]+ z[15]); + z += 16; + N -= 16; + } + while(N >= 4){ + sum0 += z[0]; + sum1 += z[1]; + sum2 += z[2]; + sum += z[3]; + z += 4; + N -= 4; + } + sum += (sum2 << 8) + (sum1 << 16) + (sum0 << 24); +#endif + } + switch(N&3){ + case 3: sum += (z[2] << 8); + case 2: sum += (z[1] << 16); + case 1: sum += (z[0] << 24); + default: ; + } + return sum; +} + +/* +** Create a new delta. +** +** The delta is written into a preallocated buffer, zDelta, which +** should be at least 60 bytes longer than the target file, zOut. +** The delta string will be NUL-terminated, but it might also contain +** embedded NUL characters if either the zSrc or zOut files are +** binary. This function returns the length of the delta string +** in bytes, excluding the final NUL terminator character. +** +** Output Format: +** +** The delta begins with a base64 number followed by a newline. This +** number is the number of bytes in the TARGET file. Thus, given a +** delta file z, a program can compute the size of the output file +** simply by reading the first line and decoding the base-64 number +** found there. The delta_output_size() routine does exactly this. +** +** After the initial size number, the delta consists of a series of +** literal text segments and commands to copy from the SOURCE file. +** A copy command looks like this: +** +** NNN@MMM, +** +** where NNN is the number of bytes to be copied and MMM is the offset +** into the source file of the first byte (both base-64). If NNN is 0 +** it means copy the rest of the input file. Literal text is like this: +** +** NNN:TTTTT +** +** where NNN is the number of bytes of text (base-64) and TTTTT is the text. +** +** The last term is of the form +** +** NNN; +** +** In this case, NNN is a 32-bit bigendian checksum of the output file +** that can be used to verify that the delta applied correctly. All +** numbers are in base-64. +** +** Pure text files generate a pure text delta. Binary files generate a +** delta that may contain some binary data. +** +** Algorithm: +** +** The encoder first builds a hash table to help it find matching +** patterns in the source file. 16-byte chunks of the source file +** sampled at evenly spaced intervals are used to populate the hash +** table. +** +** Next we begin scanning the target file using a sliding 16-byte +** window. The hash of the 16-byte window in the target is used to +** search for a matching section in the source file. When a match +** is found, a copy command is added to the delta. An effort is +** made to extend the matching section to regions that come before +** and after the 16-byte hash window. A copy command is only issued +** if the result would use less space that just quoting the text +** literally. Literal text is added to the delta for sections that +** do not match or which can not be encoded efficiently using copy +** commands. +*/ +static int delta_create( + const char *zSrc, /* The source or pattern file */ + unsigned int lenSrc, /* Length of the source file */ + const char *zOut, /* The target file */ + unsigned int lenOut, /* Length of the target file */ + char *zDelta /* Write the delta into this buffer */ +){ + int i, base; + char *zOrigDelta = zDelta; + hash h; + int nHash; /* Number of hash table entries */ + int *landmark; /* Primary hash table */ + int *collide; /* Collision chain */ + int lastRead = -1; /* Last byte of zSrc read by a COPY command */ + + /* Add the target file size to the beginning of the delta + */ + putInt(lenOut, &zDelta); + *(zDelta++) = '\n'; + + /* If the source file is very small, it means that we have no + ** chance of ever doing a copy command. Just output a single + ** literal segment for the entire target and exit. + */ + if( lenSrc<=NHASH ){ + putInt(lenOut, &zDelta); + *(zDelta++) = ':'; + memcpy(zDelta, zOut, lenOut); + zDelta += lenOut; + putInt(checksum(zOut, lenOut), &zDelta); + *(zDelta++) = ';'; + return zDelta - zOrigDelta; + } + + /* Compute the hash table used to locate matching sections in the + ** source file. + */ + nHash = lenSrc/NHASH; + collide = sqlite3_malloc64( (sqlite3_int64)nHash*2*sizeof(int) ); + memset(collide, -1, nHash*2*sizeof(int)); + landmark = &collide[nHash]; + for(i=0; i=0 && (limit--)>0 ){ + /* + ** The hash window has identified a potential match against + ** landmark block iBlock. But we need to investigate further. + ** + ** Look for a region in zOut that matches zSrc. Anchor the search + ** at zSrc[iSrc] and zOut[base+i]. Do not include anything prior to + ** zOut[base] or after zOut[outLen] nor anything after zSrc[srcLen]. + ** + ** Set cnt equal to the length of the match and set ofst so that + ** zSrc[ofst] is the first element of the match. litsz is the number + ** of characters between zOut[base] and the beginning of the match. + ** sz will be the overhead (in bytes) needed to encode the copy + ** command. Only generate copy command if the overhead of the + ** copy command is less than the amount of literal text to be copied. + */ + int cnt, ofst, litsz; + int j, k, x, y; + int sz; + int limitX; + + /* Beginning at iSrc, match forwards as far as we can. j counts + ** the number of characters that match */ + iSrc = iBlock*NHASH; + y = base+i; + limitX = ( lenSrc-iSrc <= lenOut-y ) ? lenSrc : iSrc + lenOut - y; + for(x=iSrc; x=sz && cnt>bestCnt ){ + /* Remember this match only if it is the best so far and it + ** does not increase the file size */ + bestCnt = cnt; + bestOfst = iSrc-k; + bestLitsz = litsz; + } + + /* Check the next matching block */ + iBlock = collide[iBlock]; + } + + /* We have a copy command that does not cause the delta to be larger + ** than a literal insert. So add the copy command to the delta. + */ + if( bestCnt>0 ){ + if( bestLitsz>0 ){ + /* Add an insert command before the copy */ + putInt(bestLitsz,&zDelta); + *(zDelta++) = ':'; + memcpy(zDelta, &zOut[base], bestLitsz); + zDelta += bestLitsz; + base += bestLitsz; + } + base += bestCnt; + putInt(bestCnt, &zDelta); + *(zDelta++) = '@'; + putInt(bestOfst, &zDelta); + *(zDelta++) = ','; + if( bestOfst + bestCnt -1 > lastRead ){ + lastRead = bestOfst + bestCnt - 1; + } + bestCnt = 0; + break; + } + + /* If we reach this point, it means no match is found so far */ + if( base+i+NHASH>=lenOut ){ + /* We have reached the end of the file and have not found any + ** matches. Do an "insert" for everything that does not match */ + putInt(lenOut-base, &zDelta); + *(zDelta++) = ':'; + memcpy(zDelta, &zOut[base], lenOut-base); + zDelta += lenOut-base; + base = lenOut; + break; + } + + /* Advance the hash by one character. Keep looking for a match */ + hash_next(&h, zOut[base+i+NHASH]); + i++; + } + } + /* Output a final "insert" record to get all the text at the end of + ** the file that does not match anything in the source file. + */ + if( base0 ){ + unsigned int cnt, ofst; + cnt = getInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + ofst = getInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: copy exceeds output file size */ + return -1; + } + if( ofst+cnt > lenSrc ){ + /* ERROR: copy extends past end of input */ + return -1; + } + memcpy(zOut, &zSrc[ofst], cnt); + zOut += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: insert command gives an output larger than predicted */ + return -1; + } + if( cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + memcpy(zOut, zDelta, cnt); + zOut += cnt; + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + zDelta++; lenDelta--; + zOut[0] = 0; +#ifdef FOSSIL_ENABLE_DELTA_CKSUM_TEST + if( cnt!=checksum(zOrigOut, total) ){ + /* ERROR: bad checksum */ + return -1; + } +#endif + if( total!=limit ){ + /* ERROR: generated size does not match predicted size */ + return -1; + } + return total; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +/* +** Analyze a delta. Figure out the total number of bytes copied from +** source to target, and the total number of bytes inserted by the delta, +** and return both numbers. +*/ +static int delta_analyze( + const char *zDelta, /* Delta to apply to the pattern */ + int lenDelta, /* Length of the delta */ + int *pnCopy, /* OUT: Number of bytes copied */ + int *pnInsert /* OUT: Number of bytes inserted */ +){ + unsigned int nInsert = 0; + unsigned int nCopy = 0; + + (void)getInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + zDelta++; lenDelta--; + while( *zDelta && lenDelta>0 ){ + unsigned int cnt; + cnt = getInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + (void)getInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + nCopy += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + nInsert += cnt; + if( cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + *pnCopy = nCopy; + *pnInsert = nInsert; + return 0; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +/* +** SQL functions: fossildelta_create(X,Y) +** +** Return a delta for carrying X into Y. +*/ +static void deltaCreateFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aOrig; int nOrig; /* old blob */ + const char *aNew; int nNew; /* new blob */ + char *aOut; int nOut; /* output delta */ + + assert( argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + if( sqlite3_value_type(argv[1])==SQLITE_NULL ) return; + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nNew = sqlite3_value_bytes(argv[1]); + aNew = (const char*)sqlite3_value_blob(argv[1]); + aOut = sqlite3_malloc64(nNew+70); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut = delta_create(aOrig, nOrig, aNew, nNew, aOut); + if( nOut<0 ){ + sqlite3_free(aOut); + sqlite3_result_error(context, "cannot create fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + +/* +** SQL functions: fossildelta_apply(X,D) +** +** Return the result of applying delta D to input X. +*/ +static void deltaApplyFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aOrig; int nOrig; /* The X input */ + const char *aDelta; int nDelta; /* The input delta (D) */ + char *aOut; int nOut, nOut2; /* The output */ + + assert( argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + if( sqlite3_value_type(argv[1])==SQLITE_NULL ) return; + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nDelta = sqlite3_value_bytes(argv[1]); + aDelta = (const char*)sqlite3_value_blob(argv[1]); + + /* Figure out the size of the output */ + nOut = delta_output_size(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + } + aOut = sqlite3_malloc64((sqlite3_int64)nOut+1); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut2 = delta_apply(aOrig, nOrig, aDelta, nDelta, aOut); + if( nOut2!=nOut ){ + sqlite3_free(aOut); + sqlite3_result_error(context, "corrupt fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + + +/* +** SQL functions: fossildelta_output_size(D) +** +** Return the size of the output that results from applying delta D. +*/ +static void deltaOutputSizeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aDelta; int nDelta; /* The input delta (D) */ + int nOut; /* Size of output */ + assert( argc==1 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + nDelta = sqlite3_value_bytes(argv[0]); + aDelta = (const char*)sqlite3_value_blob(argv[0]); + + /* Figure out the size of the output */ + nOut = delta_output_size(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + }else{ + sqlite3_result_int(context, nOut); + } +} + + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_fossildelta_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + rc = sqlite3_create_function(db, "delta_create", 2, SQLITE_UTF8, 0, + deltaCreateFunc, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "delta_apply", 2, SQLITE_UTF8, 0, + deltaApplyFunc, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "delta_output_size", 1, SQLITE_UTF8, 0, + deltaOutputSizeFunc, 0, 0); + } + return rc; +} diff --git a/manifest b/manifest index c4848176e4..dc80c37b38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\smemory\sleak\sin\sRBU\sif\sthe\srbu_fossil_delta()\sSQL\sfunction\sis\nmisused.\s\sMisuse\snever\shappens\sin\sa\sworking\sRBU\ssystem,\sso\sthis\sis\snot\sa\s\nparticularly\simportant\sfix. -D 2019-02-19T17:45:31.317 +C Add\sthe\sfossildelta.c\sextension\sin\sext/misc\swith\simplementations\sof\sthe\sFossil\ndelta\sfunctions. +D 2019-02-19T18:39:16.475 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,6 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 +F ext/misc/fossildelta.c 64619ac4ff0d865e01f25436fd1b82c3dd7f6bc6184c9a06e002b16a121cd652 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1804,7 +1805,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 f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d -R 8d9f63c20f18bc4035bf1d3926ca6101 +P 12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 +R e38db5ccc4de4d9df319413343ad8fcf U drh -Z 3f3200a2e92dbd4c9a6a6ed07ff60873 +Z 993efe1b585ff08956441be0e9d0910b diff --git a/manifest.uuid b/manifest.uuid index 34fb63dc13..2ff6534024 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 \ No newline at end of file +b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 \ No newline at end of file From 2d441ce3f3c10af9dd884b11cadd5a14ae566b01 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 20:19:51 +0000 Subject: [PATCH 08/48] Add the delta_parse(DELTA) table-valued function to the fossildelta extension. FossilOrigin-Name: d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 --- ext/misc/fossildelta.c | 379 ++++++++++++++++++++++++++++++++++------- manifest | 12 +- manifest.uuid | 2 +- 3 files changed, 320 insertions(+), 73 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index 3d845faa98..d1b5a2c6a0 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -134,7 +134,7 @@ static void putInt(unsigned int v, char **pz){ ** the integer. The *pLen parameter holds the length of the string ** in *pz and is decremented once for each character in the integer. */ -static unsigned int getInt(const char **pz, int *pLen){ +static unsigned int deltaGetInt(const char **pz, int *pLen){ static const signed char zValue[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -484,7 +484,7 @@ static int delta_create( */ static int delta_output_size(const char *zDelta, int lenDelta){ int size; - size = getInt(&zDelta, &lenDelta); + size = deltaGetInt(&zDelta, &lenDelta); if( *zDelta!='\n' ){ /* ERROR: size integer not terminated by "\n" */ return -1; @@ -526,7 +526,7 @@ static int delta_apply( char *zOrigOut = zOut; #endif - limit = getInt(&zDelta, &lenDelta); + limit = deltaGetInt(&zDelta, &lenDelta); if( *zDelta!='\n' ){ /* ERROR: size integer not terminated by "\n" */ return -1; @@ -534,11 +534,11 @@ static int delta_apply( zDelta++; lenDelta--; while( *zDelta && lenDelta>0 ){ unsigned int cnt, ofst; - cnt = getInt(&zDelta, &lenDelta); + cnt = deltaGetInt(&zDelta, &lenDelta); switch( zDelta[0] ){ case '@': { zDelta++; lenDelta--; - ofst = getInt(&zDelta, &lenDelta); + ofst = deltaGetInt(&zDelta, &lenDelta); if( lenDelta>0 && zDelta[0]!=',' ){ /* ERROR: copy command not terminated by ',' */ return -1; @@ -599,67 +599,6 @@ static int delta_apply( return -1; } -/* -** Analyze a delta. Figure out the total number of bytes copied from -** source to target, and the total number of bytes inserted by the delta, -** and return both numbers. -*/ -static int delta_analyze( - const char *zDelta, /* Delta to apply to the pattern */ - int lenDelta, /* Length of the delta */ - int *pnCopy, /* OUT: Number of bytes copied */ - int *pnInsert /* OUT: Number of bytes inserted */ -){ - unsigned int nInsert = 0; - unsigned int nCopy = 0; - - (void)getInt(&zDelta, &lenDelta); - if( *zDelta!='\n' ){ - /* ERROR: size integer not terminated by "\n" */ - return -1; - } - zDelta++; lenDelta--; - while( *zDelta && lenDelta>0 ){ - unsigned int cnt; - cnt = getInt(&zDelta, &lenDelta); - switch( zDelta[0] ){ - case '@': { - zDelta++; lenDelta--; - (void)getInt(&zDelta, &lenDelta); - if( lenDelta>0 && zDelta[0]!=',' ){ - /* ERROR: copy command not terminated by ',' */ - return -1; - } - zDelta++; lenDelta--; - nCopy += cnt; - break; - } - case ':': { - zDelta++; lenDelta--; - nInsert += cnt; - if( cnt>lenDelta ){ - /* ERROR: insert count exceeds size of delta */ - return -1; - } - zDelta += cnt; - lenDelta -= cnt; - break; - } - case ';': { - *pnCopy = nCopy; - *pnInsert = nInsert; - return 0; - } - default: { - /* ERROR: unknown delta operator */ - return -1; - } - } - } - /* ERROR: unterminated delta */ - return -1; -} - /* ** SQL functions: fossildelta_create(X,Y) ** @@ -765,6 +704,311 @@ static void deltaOutputSizeFunc( } } +/* The deltaparse(DELTA) table-valued function parses the DELTA in +** its input and returns a table that describes that delta. +*/ +typedef struct deltaparsevtab_vtab deltaparsevtab_vtab; +typedef struct deltaparsevtab_cursor deltaparsevtab_cursor; +struct deltaparsevtab_vtab { + sqlite3_vtab base; /* Base class - must be first */ + /* No additional information needed */ +}; +struct deltaparsevtab_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + char *aDelta; /* The delta being parsed */ + int nDelta; /* Number of bytes in the delta */ + int iCursor; /* Current cursor location */ + int eOp; /* Name of current operator */ + unsigned int a1, a2; /* Arguments to current operator */ + int iNext; /* Next cursor value */ +}; + +/* Operator names: +*/ +static const char *azOp[] = { + "SIZE", "COPY", "INSERT", "CHECKSUM", "ERROR", "EOF" +}; +#define DELTAPARSE_OP_SIZE 0 +#define DELTAPARSE_OP_COPY 1 +#define DELTAPARSE_OP_INSERT 2 +#define DELTAPARSE_OP_CHECKSUM 3 +#define DELTAPARSE_OP_ERROR 4 +#define DELTAPARSE_OP_EOF 5 + +/* +** The deltaparsevtabConnect() method is invoked to create a new +** deltaparse virtual table. +** +** Think of this routine as the constructor for deltaparsevtab_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the deltaparsevtab_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against the virtual table will look like. +*/ +static int deltaparsevtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + deltaparsevtab_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(op,a1,a2,delta HIDDEN)" + ); + /* For convenience, define symbolic names for the index to each column. */ +#define DELTAPARSEVTAB_OP 0 +#define DELTAPARSEVTAB_A1 1 +#define DELTAPARSEVTAB_A2 2 +#define DELTAPARSEVTAB_DELTA 3 + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc64( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +/* +** This method is the destructor for deltaparsevtab_vtab objects. +*/ +static int deltaparsevtabDisconnect(sqlite3_vtab *pVtab){ + deltaparsevtab_vtab *p = (deltaparsevtab_vtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new deltaparsevtab_cursor object. +*/ +static int deltaparsevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + deltaparsevtab_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a deltaparsevtab_cursor. +*/ +static int deltaparsevtabClose(sqlite3_vtab_cursor *cur){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a deltaparsevtab_cursor to its next row of output. +*/ +static int deltaparsevtabNext(sqlite3_vtab_cursor *cur){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + const char *z; + int i = 0; + + pCur->iCursor = pCur->iNext; + z = pCur->aDelta + pCur->iCursor; + pCur->a1 = deltaGetInt(&z, &i); + switch( z[0] ){ + case '@': { + z++; + pCur->a2 = deltaGetInt(&z, &i); + pCur->eOp = DELTAPARSE_OP_COPY; + pCur->iNext = (int)(&z[1] - pCur->aDelta); + break; + } + case ':': { + z++; + pCur->a2 = (unsigned int)(z - pCur->aDelta); + pCur->eOp = DELTAPARSE_OP_INSERT; + pCur->iNext = (int)(&z[pCur->a1] - pCur->aDelta); + break; + } + case ';': { + pCur->eOp = DELTAPARSE_OP_CHECKSUM; + pCur->iNext = pCur->nDelta; + break; + } + default: { + if( pCur->iNext==pCur->nDelta ){ + pCur->eOp = DELTAPARSE_OP_EOF; + }else{ + pCur->eOp = DELTAPARSE_OP_ERROR; + pCur->iNext = pCur->nDelta; + } + break; + } + } + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the deltaparsevtab_cursor +** is currently pointing. +*/ +static int deltaparsevtabColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + switch( i ){ + case DELTAPARSEVTAB_OP: { + sqlite3_result_text(ctx, azOp[pCur->eOp], -1, SQLITE_STATIC); + break; + } + case DELTAPARSEVTAB_A1: { + sqlite3_result_int(ctx, pCur->a1); + break; + } + case DELTAPARSEVTAB_A2: { + if( pCur->eOp==DELTAPARSE_OP_COPY ){ + sqlite3_result_int(ctx, pCur->a2); + }else if( pCur->eOp==DELTAPARSE_OP_INSERT ){ + sqlite3_result_blob(ctx, pCur->aDelta+pCur->a2, pCur->a1, + SQLITE_TRANSIENT); + } + break; + } + case DELTAPARSEVTAB_DELTA: { + sqlite3_result_blob(ctx, pCur->aDelta, pCur->nDelta, SQLITE_TRANSIENT); + break; + } + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int deltaparsevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + *pRowid = pCur->iCursor; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int deltaparsevtabEof(sqlite3_vtab_cursor *cur){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + return pCur->eOp==DELTAPARSE_OP_EOF; +} + +/* +** This method is called to "rewind" the deltaparsevtab_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to deltaparsevtabColumn() or deltaparsevtabRowid() or +** deltaparsevtabEof(). +*/ +static int deltaparsevtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor *)pVtabCursor; + const char *a; + int i = 0; + pCur->eOp = DELTAPARSE_OP_ERROR; + if( idxNum!=1 ){ + return SQLITE_OK; + } + pCur->nDelta = sqlite3_value_bytes(argv[0]); + a = (const char*)sqlite3_value_blob(argv[0]); + if( pCur->nDelta==0 || a==0 ){ + return SQLITE_OK; + } + pCur->aDelta = sqlite3_malloc64( pCur->nDelta+1 ); + if( pCur->aDelta==0 ){ + pCur->nDelta = 0; + return SQLITE_NOMEM; + } + memcpy(pCur->aDelta, a, pCur->nDelta); + pCur->aDelta[pCur->nDelta] = 0; + a = pCur->aDelta; + pCur->eOp = DELTAPARSE_OP_SIZE; + pCur->a1 = deltaGetInt(&a, &i); + if( a[0]!='\n' ){ + pCur->eOp = DELTAPARSE_OP_ERROR; + pCur->a1 = pCur->a2 = 0; + pCur->iNext = pCur->nDelta; + return SQLITE_OK; + } + a++; + pCur->iNext = (unsigned int)(a - pCur->aDelta); + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int deltaparsevtabBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; + for(i=0; inConstraint; i++){ + if( pIdxInfo->aConstraint[i].iColumn != DELTAPARSEVTAB_DELTA ) continue; + if( pIdxInfo->aConstraint[i].usable==0 ) continue; + if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->estimatedCost = (double)1; + pIdxInfo->estimatedRows = 10; + pIdxInfo->idxNum = 1; + return SQLITE_OK; + } + pIdxInfo->idxNum = 0; + pIdxInfo->estimatedCost = (double)0x7fffffff; + pIdxInfo->estimatedRows = 0x7fffffff; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module deltaparsevtabModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ deltaparsevtabConnect, + /* xBestIndex */ deltaparsevtabBestIndex, + /* xDisconnect */ deltaparsevtabDisconnect, + /* xDestroy */ 0, + /* xOpen */ deltaparsevtabOpen, + /* xClose */ deltaparsevtabClose, + /* xFilter */ deltaparsevtabFilter, + /* xNext */ deltaparsevtabNext, + /* xEof */ deltaparsevtabEof, + /* xColumn */ deltaparsevtabColumn, + /* xRowid */ deltaparsevtabRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + + #ifdef _WIN32 __declspec(dllexport) @@ -787,5 +1031,8 @@ int sqlite3_fossildelta_init( rc = sqlite3_create_function(db, "delta_output_size", 1, SQLITE_UTF8, 0, deltaOutputSizeFunc, 0, 0); } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_module(db, "delta_parse", &deltaparsevtabModule, 0); + } return rc; } diff --git a/manifest b/manifest index dc80c37b38..3affb0af3f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sfossildelta.c\sextension\sin\sext/misc\swith\simplementations\sof\sthe\sFossil\ndelta\sfunctions. -D 2019-02-19T18:39:16.475 +C Add\sthe\sdelta_parse(DELTA)\stable-valued\sfunction\sto\sthe\sfossildelta\nextension. +D 2019-02-19T20:19:51.952 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 -F ext/misc/fossildelta.c 64619ac4ff0d865e01f25436fd1b82c3dd7f6bc6184c9a06e002b16a121cd652 +F ext/misc/fossildelta.c 990fcc25a41be22c648d3e362f5d4616562869c613e75790bf71fa7c54d029fa F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 -R e38db5ccc4de4d9df319413343ad8fcf +P b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 +R 28b47243faa86a15a5dab72f9f6d43db U drh -Z 993efe1b585ff08956441be0e9d0910b +Z 704f00932f29d8380bf4a3f8f9e7b2af diff --git a/manifest.uuid b/manifest.uuid index 2ff6534024..57af7c8c30 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 \ No newline at end of file +d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 \ No newline at end of file From 2a98b586c8f4c9b00e64d77668917ce8fc0304b9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 20:29:05 +0000 Subject: [PATCH 09/48] Enhance the xBestIndex method on delta_parse() to return SQLITE_CONSTRAINT if no delta argument is supplied. FossilOrigin-Name: f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 --- ext/misc/fossildelta.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index d1b5a2c6a0..7a9c5c1d72 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -974,7 +974,7 @@ static int deltaparsevtabBestIndex( pIdxInfo->idxNum = 0; pIdxInfo->estimatedCost = (double)0x7fffffff; pIdxInfo->estimatedRows = 0x7fffffff; - return SQLITE_OK; + return SQLITE_CONSTRAINT; } /* diff --git a/manifest b/manifest index 3affb0af3f..eb13e2dec5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sdelta_parse(DELTA)\stable-valued\sfunction\sto\sthe\sfossildelta\nextension. -D 2019-02-19T20:19:51.952 +C Enhance\sthe\sxBestIndex\smethod\son\sdelta_parse()\sto\sreturn\sSQLITE_CONSTRAINT\sif\nno\sdelta\sargument\sis\ssupplied. +D 2019-02-19T20:29:05.526 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 -F ext/misc/fossildelta.c 990fcc25a41be22c648d3e362f5d4616562869c613e75790bf71fa7c54d029fa +F ext/misc/fossildelta.c 31b64084789228ac0d1113e5e39dc79c2ae16dd131d5c988ad9550ae1b9bc4b4 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 -R 28b47243faa86a15a5dab72f9f6d43db +P d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 +R c6e533968a2ece3b69b351a227132130 U drh -Z 704f00932f29d8380bf4a3f8f9e7b2af +Z d8453dece5a7987c62030d39d3c1b091 diff --git a/manifest.uuid b/manifest.uuid index 57af7c8c30..f9ba20353f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 \ No newline at end of file +f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 \ No newline at end of file From 042666e4fa379ddd29eb049d77319e32dc94126f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 12:52:47 +0000 Subject: [PATCH 10/48] When an IN operator drives a query loop, mark it as "CODED" so that it will not be used afterwards for a (pointless) membership test. This is a better fix for ticket [df46dfb631f75694] than the previous fix that is now on a branch as it preserves the full optimization of check-in [e130319317e76119]. FossilOrigin-Name: fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b --- manifest | 14 +++++------ manifest.uuid | 2 +- src/wherecode.c | 1 + test/in.test | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index eb13e2dec5..b85d244af4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sxBestIndex\smethod\son\sdelta_parse()\sto\sreturn\sSQLITE_CONSTRAINT\sif\nno\sdelta\sargument\sis\ssupplied. -D 2019-02-19T20:29:05.526 +C When\san\sIN\soperator\sdrives\sa\squery\sloop,\smark\sit\sas\s"CODED"\sso\sthat\sit\nwill\snot\sbe\sused\safterwards\sfor\sa\s(pointless)\smembership\stest.\s\sThis\sis\na\sbetter\sfix\sfor\sticket\s[df46dfb631f75694]\sthan\sthe\sprevious\sfix\sthat\sis\nnow\son\sa\sbranch\sas\sit\spreserves\sthe\sfull\soptimization\sof\ncheck-in\s[e130319317e76119]. +D 2019-02-20T12:52:47.452 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c a571d8d7c19d6db786a201f2df8788b320fefcb2842f2a1eb9a85b85e91bc35f +F src/wherecode.c 5ee878f714218352a2f452907572d4bf1e4303393288458f87ffc86edaf2cfbe F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1007,7 +1007,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 2fa2dfba1afe30eb830f327e7131dfadaa7a701d677de0eb65f9303d99e18fe0 +F test/in.test 63933d7b71eed01a49df55541a73a75398302b50a05b5333f90481460a32ff49 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 @@ -1805,7 +1805,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 d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 -R c6e533968a2ece3b69b351a227132130 +P f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 +R 305348511782a1081a30b2475753ee53 U drh -Z d8453dece5a7987c62030d39d3c1b091 +Z ef9d1f96fc42c68bd56fd0d4769bee0b diff --git a/manifest.uuid b/manifest.uuid index f9ba20353f..a0b2fe474e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 \ No newline at end of file +fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 19315779bf..5441752ed1 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1344,6 +1344,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; + pTerm->wtFlags |= TERM_CODED; }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ diff --git a/test/in.test b/test/in.test index 478c0087b8..246cd76edf 100644 --- a/test/in.test +++ b/test/in.test @@ -651,4 +651,68 @@ do_execsql_test in-14.1 { SELECT * FROM c1 WHERE a IN (SELECT a FROM c1) ORDER BY 1 } {1 2 3 4} +# 2019-02-20 Ticket https://www.sqlite.org/src/tktview/df46dfb631f75694fbb97033b69 +# +do_execsql_test in-15.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE IF NOT EXISTS t1(id INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES(1); + SELECT a.id FROM t1 AS a JOIN t1 AS b ON a.id=b.id WHERE a.id IN (1,2,3); +} {1} +do_execsql_test in-15.1 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER PRIMARY KEY,b); + INSERT INTO t2 VALUES(1,11); + INSERT INTO t2 VALUES(2,22); + INSERT INTO t2 VALUES(3,33); + SELECT b, a IN (3,4,5) FROM t2 ORDER BY b; +} {11 0 22 0 33 1} +do_execsql_test in-15.2 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(x INTEGER PRIMARY KEY); + INSERT INTO t3 VALUES(8); + SELECT CASE WHEN x NOT IN (5,6,7) THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.3 { + SELECT CASE WHEN x NOT IN (5,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.4 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(a INTEGER PRIMARY KEY, b INT); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) + INSERT INTO t4(a,b) SELECT x, x+100 FROM c; + SELECT b FROM t4 WHERE a IN (3,null,8) ORDER BY +b; +} {103 108} +do_execsql_test in-15.5 { + SELECT b FROM t4 WHERE a NOT IN (3,null,8); +} {} +do_execsql_test in-15.6 { + DROP TABLE IF EXISTS t5; + DROP TABLE IF EXISTS t6; + CREATE TABLE t5(id INTEGER PRIMARY KEY, name TEXT); + CREATE TABLE t6(id INTEGER PRIMARY KEY, name TEXT, t5_id INT); + INSERT INTO t5 VALUES(1,'Alice'),(2,'Emma'); + INSERT INTO t6 VALUES(1,'Bob',1),(2,'Cindy',1),(3,'Dave',2); + SELECT a.* + FROM t5 AS 'a' JOIN t5 AS 'b' ON b.id=a.id + WHERE b.id IN ( + SELECT t6.t5_id + FROM t6 + WHERE name='Bob' + AND t6.t5_id IS NOT NULL + AND t6.id IN ( + SELECT id + FROM (SELECT t6.id, count(*) AS x + FROM t6 + WHERE name='Bob' + ) AS 't' + WHERE x=1 + ) + AND t6.id IN (1,id) + ); +} {1 Alice} + + finish_test From b1af9c603c70535a61b5785a4b29ce9cecc8f78d Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 13:55:45 +0000 Subject: [PATCH 11/48] Progress handler improvements: (1) Invoke the callback after OP_Program opcodes (2) Invoke the callback multiple times in a row to catch up after a long run of no progress checks. FossilOrigin-Name: 0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index b85d244af4..7586b9cdec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\san\sIN\soperator\sdrives\sa\squery\sloop,\smark\sit\sas\s"CODED"\sso\sthat\sit\nwill\snot\sbe\sused\safterwards\sfor\sa\s(pointless)\smembership\stest.\s\sThis\sis\na\sbetter\sfix\sfor\sticket\s[df46dfb631f75694]\sthan\sthe\sprevious\sfix\sthat\sis\nnow\son\sa\sbranch\sas\sit\spreserves\sthe\sfull\soptimization\sof\ncheck-in\s[e130319317e76119]. -D 2019-02-20T12:52:47.452 +C Progress\shandler\simprovements:\n(1)\sInvoke\sthe\scallback\safter\sOP_Program\sopcodes\n(2)\sInvoke\sthe\scallback\smultiple\stimes\sin\sa\srow\sto\scatch\sup\safter\sa\nlong\srun\sof\sno\sprogress\schecks. +D 2019-02-20T13:55:45.206 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -586,7 +586,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c c67c8c46bea825421ee97511328fe1405537b586cbbe4db06e17c4ac5ab4dbed +F src/vdbe.c f11f5b935d0858ffeb3b2f0f50d9f4c368b8100c2ae6761178828e2aa38b63f2 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1805,7 +1805,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 f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 -R 305348511782a1081a30b2475753ee53 +P fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b +R cb450b63e0ffca7c3eab4ce48996cd46 U drh -Z ef9d1f96fc42c68bd56fd0d4769bee0b +Z b23f78f7b715d3492f6587cfb6b97b37 diff --git a/manifest.uuid b/manifest.uuid index a0b2fe474e..d00de21324 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b \ No newline at end of file +0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 880d16adfe..e536238524 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -819,9 +819,9 @@ check_for_interrupt: ** If the progress callback returns non-zero, exit the virtual machine with ** a return code SQLITE_ABORT. */ - if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ assert( db->nProgressOps!=0 ); - nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps); + nProgressLimit += db->nProgressOps; if( db->xProgress(db->pProgressArg) ){ nProgressLimit = 0xffffffff; rc = SQLITE_INTERRUPT; @@ -6174,8 +6174,7 @@ case OP_Program: { /* jump */ } #endif pOp = &aOp[-1]; - - break; + goto check_for_interrupt; } /* Opcode: Param P1 P2 * * * @@ -7585,7 +7584,8 @@ abort_due_to_error: ** top. */ vdbe_return: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + nProgressLimit += db->nProgressOps; if( db->xProgress(db->pProgressArg) ){ nProgressLimit = 0xffffffff; rc = SQLITE_INTERRUPT; From 8cf92890f28ace3c510c448b5be6de2ca96016c2 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 18:13:57 +0000 Subject: [PATCH 12/48] Avoid the use of function pointers in columnName(), as function pointers appear to be a source of consternation to LLVM. FossilOrigin-Name: c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeapi.c | 46 ++++++++++++++++++++-------------------------- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/manifest b/manifest index 7586b9cdec..8de63b54bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Progress\shandler\simprovements:\n(1)\sInvoke\sthe\scallback\safter\sOP_Program\sopcodes\n(2)\sInvoke\sthe\scallback\smultiple\stimes\sin\sa\srow\sto\scatch\sup\safter\sa\nlong\srun\sof\sno\sprogress\schecks. -D 2019-02-20T13:55:45.206 +C Avoid\sthe\suse\sof\sfunction\spointers\sin\scolumnName(),\sas\sfunction\spointers\nappear\sto\sbe\sa\ssource\sof\sconsternation\sto\sLLVM. +D 2019-02-20T18:13:57.436 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -589,7 +589,7 @@ F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca F src/vdbe.c f11f5b935d0858ffeb3b2f0f50d9f4c368b8100c2ae6761178828e2aa38b63f2 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f -F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 +F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923 @@ -1805,7 +1805,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 fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b -R cb450b63e0ffca7c3eab4ce48996cd46 +P 0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b +R f560accc195a8327b3c508cd93ca6133 U drh -Z b23f78f7b715d3492f6587cfb6b97b37 +Z c7b49bfb62bb08bc015b1f1c480e7f4b diff --git a/manifest.uuid b/manifest.uuid index d00de21324..714e64dc0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b \ No newline at end of file +c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 23b19273b6..5b9ba4d89c 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1120,10 +1120,10 @@ int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ ** or a constant) then useTypes 2, 3, and 4 return NULL. */ static const void *columnName( - sqlite3_stmt *pStmt, - int N, - const void *(*xFunc)(Mem*), - int useType + sqlite3_stmt *pStmt, /* The statement */ + int N, /* Which column to get the name for */ + int useUtf16, /* True to return the name as UTF16 */ + int useType /* What type of name */ ){ const void *ret; Vdbe *p; @@ -1144,8 +1144,12 @@ static const void *columnName( N += useType*n; sqlite3_mutex_enter(db->mutex); assert( db->mallocFailed==0 ); - ret = xFunc(&p->aColName[N]); - /* A malloc may have failed inside of the xFunc() call. If this + if( useUtf16 ){ + ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); + }else{ + ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); + } + /* A malloc may have failed inside of the _text() call. If this ** is the case, clear the mallocFailed flag and return NULL. */ if( db->mallocFailed ){ @@ -1162,13 +1166,11 @@ static const void *columnName( ** statement pStmt. */ const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME); + return columnName(pStmt, N, 0, COLNAME_NAME); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME); + return columnName(pStmt, N, 1, COLNAME_NAME); } #endif @@ -1187,13 +1189,11 @@ const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ ** of the result set of SQL statement pStmt. */ const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE); + return columnName(pStmt, N, 0, COLNAME_DECLTYPE); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE); + return columnName(pStmt, N, 1, COLNAME_DECLTYPE); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_OMIT_DECLTYPE */ @@ -1205,13 +1205,11 @@ const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE); + return columnName(pStmt, N, 0, COLNAME_DATABASE); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE); + return columnName(pStmt, N, 1, COLNAME_DATABASE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -1221,13 +1219,11 @@ const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE); + return columnName(pStmt, N, 0, COLNAME_TABLE); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE); + return columnName(pStmt, N, 1, COLNAME_TABLE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -1237,13 +1233,11 @@ const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN); + return columnName(pStmt, N, 0, COLNAME_COLUMN); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN); + return columnName(pStmt, N, 1, COLNAME_COLUMN); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_ENABLE_COLUMN_METADATA */ From 7e85e9033ff34f8f75e5bb56152be39be39a62a5 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 19:06:16 +0000 Subject: [PATCH 13/48] Disable unix-specific features of dbfuzz2 when compiling on windows. FossilOrigin-Name: af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 8de63b54bc..2f0d2e78db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sthe\suse\sof\sfunction\spointers\sin\scolumnName(),\sas\sfunction\spointers\nappear\sto\sbe\sa\ssource\sof\sconsternation\sto\sLLVM. -D 2019-02-20T18:13:57.436 +C Disable\sunix-specific\sfeatures\sof\sdbfuzz2\swhen\scompiling\son\swindows. +D 2019-02-20T19:06:16.881 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -785,7 +785,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 29b6c6b39a701b6b5b08035c637674b76e1ecea515b1a184b29e3bd0f2d02dad F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 5d5eb817dc8195e0228227510ee6a4b49f46e679fc2d5be96841cce819bf42f7 +F test/dbfuzz2.c 1065d6debd1003c70dccc498c54fd18f4e9da2a73943ba4a953be7dcaf4f724e F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1805,7 +1805,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 0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b -R f560accc195a8327b3c508cd93ca6133 +P c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 +R c53acd05ed5644e7475bccbd6fd360d7 U drh -Z c7b49bfb62bb08bc015b1f1c480e7f4b +Z 28f4d380ceac9c7278e8092207ce3937 diff --git a/manifest.uuid b/manifest.uuid index 714e64dc0b..7861669d7a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 \ No newline at end of file +af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 1649d42d54..caf39215e1 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -43,8 +43,10 @@ #include #include #include +#ifndef _WIN32 #include #include +#endif #include "sqlite3.h" /* @@ -261,6 +263,7 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ szMax = strtol(argv[++i], 0, 0); continue; } +#ifndef _WIN32 if( strcmp(z,"max-stack")==0 || strcmp(z,"max-data")==0 || strcmp(z,"max-as")==0 @@ -291,6 +294,7 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ zType, (int)x.rlim_cur, (int)y.rlim_cur); continue; } +#endif /* _WIN32 */ } argv[j++] = argv[i]; } From 6a1bfc9a6d5b2367a84d367290d3bf5dba708a16 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 19:20:16 +0000 Subject: [PATCH 14/48] Changes to the unix VFS that allegedly enable it to build of Fuchsia. We have no way of testing this. FossilOrigin-Name: be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 2f0d2e78db..20f026f991 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sunix-specific\sfeatures\sof\sdbfuzz2\swhen\scompiling\son\swindows. -D 2019-02-20T19:06:16.881 +C Changes\sto\sthe\sunix\sVFS\sthat\sallegedly\senable\sit\sto\sbuild\sof\sFuchsia.\nWe\shave\sno\sway\sof\stesting\sthis. +D 2019-02-20T19:20:16.043 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -499,7 +499,7 @@ F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 +F src/os_unix.c 2b9604eb5c12f40a0613e832b6267f5814f84479d570d482ba6f98d7affa7c1c F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 38022624ac9fba1f601d3068d7c393fcc909727fccab556242c93d9c7897b640 @@ -1805,7 +1805,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 c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 -R c53acd05ed5644e7475bccbd6fd360d7 +P af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb +R a6f27facbdb7dc40d5575aa8c5ace55a U drh -Z 28f4d380ceac9c7278e8092207ce3937 +Z ca0997b8ac8e61eb0d0c0b024412021b diff --git a/manifest.uuid b/manifest.uuid index 7861669d7a..82410f900a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb \ No newline at end of file +be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index f20763e5b0..4e434334b8 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -7822,6 +7822,9 @@ int sqlite3_os_init(void){ UNIXVFS("unix", autolockIoFinder ), #elif OS_VXWORKS UNIXVFS("unix", vxworksIoFinder ), +#elif __Fuchsia__ + /* We are told that Fuchsia only supports dot-file locking */ + UNIXVFS("unix", dotlockIoFinder ), #else UNIXVFS("unix", posixIoFinder ), #endif From dbdddc99d83130fe22ed63a4bfc19a53a408c51b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 21 Feb 2019 16:41:34 +0000 Subject: [PATCH 15/48] Detect oversized strings in the OP_String opcode even if the P4 argument is originally UTF8 and has to be converted to UTF16 to match the database file and that conversion causes the string to become shorter and cross below SQLITE_LIMIT_LENGTH threshold. This might fix an OSSFuzz problem that we have been so far unable to reproduce. FossilOrigin-Name: c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 20f026f991..ea467fade7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\sthe\sunix\sVFS\sthat\sallegedly\senable\sit\sto\sbuild\sof\sFuchsia.\nWe\shave\sno\sway\sof\stesting\sthis. -D 2019-02-20T19:20:16.043 +C Detect\soversized\sstrings\sin\sthe\sOP_String\sopcode\seven\sif\sthe\sP4\sargument\nis\soriginally\sUTF8\sand\shas\sto\sbe\sconverted\sto\sUTF16\sto\smatch\sthe\sdatabase\nfile\sand\sthat\sconversion\scauses\sthe\sstring\sto\sbecome\sshorter\sand\scross\nbelow\sSQLITE_LIMIT_LENGTH\sthreshold.\s\sThis\smight\sfix\san\sOSSFuzz\sproblem\nthat\swe\shave\sbeen\sso\sfar\sunable\sto\sreproduce. +D 2019-02-21T16:41:34.321 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -586,7 +586,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c f11f5b935d0858ffeb3b2f0f50d9f4c368b8100c2ae6761178828e2aa38b63f2 +F src/vdbe.c c2ebe27a1e4176f5e4b48269917b7a3df096b125d3c407da90e769a9fe4e406e F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 @@ -1805,7 +1805,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 af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb -R a6f27facbdb7dc40d5575aa8c5ace55a +P be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 +R c5273df2e86448fbe31848ca521a60a4 U drh -Z ca0997b8ac8e61eb0d0c0b024412021b +Z 34aa1885dbc38a0426f19597b6e0799d diff --git a/manifest.uuid b/manifest.uuid index 82410f900a..a0f17d4ac0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 \ No newline at end of file +c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index e536238524..5085273bc7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1102,6 +1102,7 @@ case OP_String8: { /* same as TK_STRING, out2 */ if( encoding!=SQLITE_UTF8 ){ rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); + if( rc ) goto too_big; if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); assert( VdbeMemDynamic(pOut)==0 ); @@ -1114,7 +1115,6 @@ case OP_String8: { /* same as TK_STRING, out2 */ pOp->p4.z = pOut->z; pOp->p1 = pOut->n; } - testcase( rc==SQLITE_TOOBIG ); #endif if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; From 255a81f10a5885a17d99ea20e13e1641029e6e3b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 15:42:10 +0000 Subject: [PATCH 16/48] Modify sqlite3_str_finish() and sqlite3VMPrintf() so that they always return NULL on any OOM or SQLITE_LIMIT_LENGTH error. FossilOrigin-Name: e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/printf.c | 8 ++++---- test/printf.test | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index ea467fade7..1cfea83bdc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\soversized\sstrings\sin\sthe\sOP_String\sopcode\seven\sif\sthe\sP4\sargument\nis\soriginally\sUTF8\sand\shas\sto\sbe\sconverted\sto\sUTF16\sto\smatch\sthe\sdatabase\nfile\sand\sthat\sconversion\scauses\sthe\sstring\sto\sbecome\sshorter\sand\scross\nbelow\sSQLITE_LIMIT_LENGTH\sthreshold.\s\sThis\smight\sfix\san\sOSSFuzz\sproblem\nthat\swe\shave\sbeen\sso\sfar\sunable\sto\sreproduce. -D 2019-02-21T16:41:34.321 +C Modify\ssqlite3_str_finish()\sand\ssqlite3VMPrintf()\sso\sthat\sthey\salways\nreturn\sNULL\son\sany\sOOM\sor\sSQLITE_LIMIT_LENGTH\serror. +D 2019-02-22T15:42:10.523 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -511,7 +511,7 @@ F src/pcache1.c a72804486dfa8e4b6bc30d666c97ecf1155f91a4351fc6e48ea4097e4eb304fb F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 -F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a +F src/printf.c 93a3d539019264683a444bc043c875e9a6cca43fe935ae7bf6cfff0af3bba118 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 1588690ee4cc39b4b9ea3230d4e3543d5ec3b5e898c87521f1375af0f1934cd4 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 @@ -1205,7 +1205,7 @@ F test/pragma4.test 52d8186f9e8d09b87189432cdd401dfa66d0b32445e837fa19046c8ae762 F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test a3e559bc9d922e7fe44e9d05c6965fee34fe3bc28300a4248c6a063425246ffd +F test/printf.test 0300699733e53101b2ce48800518427249edd4053bb50fa0621c6607482f0fdb F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc @@ -1805,7 +1805,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 be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 -R c5273df2e86448fbe31848ca521a60a4 +P c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 +R 86ff0d78e3b0371bb1c17329fcb2b62e U drh -Z 34aa1885dbc38a0426f19597b6e0799d +Z 1f9977e43574c881ad05ccf22d06573e diff --git a/manifest.uuid b/manifest.uuid index a0f17d4ac0..07a899e00e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 \ No newline at end of file +e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index f11fb66641..3a12f51b39 100644 --- a/src/printf.c +++ b/src/printf.c @@ -136,7 +136,7 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ static void setStrAccumError(StrAccum *p, u8 eError){ assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); p->accError = eError; - p->nAlloc = 0; + if( p->mxAlloc ) sqlite3_str_reset(p); } /* @@ -166,6 +166,7 @@ static char *getTextArg(PrintfArguments *p){ */ static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ char *z; + if( pAccum->accError ) return 0; if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ setStrAccumError(pAccum, SQLITE_TOOBIG); return 0; @@ -885,9 +886,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ return 0; } if( p->mxAlloc==0 ){ - N = p->nAlloc - p->nChar - 1; setStrAccumError(p, SQLITE_TOOBIG); - return N; + return p->nAlloc - p->nChar - 1; }else{ char *zOld = isMalloced(p) ? p->zText : 0; i64 szNew = p->nChar; @@ -959,7 +959,7 @@ void sqlite3_str_append(sqlite3_str *p, const char *z, int N){ assert( z!=0 || N==0 ); assert( p->zText!=0 || p->nChar==0 || p->accError ); assert( N>=0 ); - assert( p->accError==0 || p->nAlloc==0 ); + assert( p->accError==0 || p->nAlloc==0 || p->mxAlloc==0 ); if( p->nChar+N >= p->nAlloc ){ enlargeAndAppend(p,z,N); }else if( N ){ diff --git a/test/printf.test b/test/printf.test index d768898fb9..d099da8fa2 100644 --- a/test/printf.test +++ b/test/printf.test @@ -540,7 +540,7 @@ do_test printf-2.1.2.9 { } {abc: 1 1 (1e-20) :xyz} do_test printf-2.1.2.10 { sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20 -} {abc: } +} {} do_test printf-2.1.3.1 { sqlite3_mprintf_double {abc: (%*.*f) :xyz} 1 1 1.0 } {abc: (1.0) :xyz} From 480c572f2da02cb6446a55df6c8b2df271446a66 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 16:18:12 +0000 Subject: [PATCH 17/48] In sqlite3NestedParse() be sure to detect all SQLITE_NOMEM and SQLITE_TOOBIG errors and to distinguish between them. FossilOrigin-Name: 73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 6 +++++- test/indexfault.test | 10 ++++++++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1cfea83bdc..28890120e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\ssqlite3_str_finish()\sand\ssqlite3VMPrintf()\sso\sthat\sthey\salways\nreturn\sNULL\son\sany\sOOM\sor\sSQLITE_LIMIT_LENGTH\serror. -D 2019-02-22T15:42:10.523 +C In\ssqlite3NestedParse()\sbe\ssure\sto\sdetect\sall\sSQLITE_NOMEM\sand\sSQLITE_TOOBIG\nerrors\sand\sto\sdistinguish\sbetween\sthem. +D 2019-02-22T16:18:12.478 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -459,7 +459,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 026f48c39b179a5602423904fcaaae87bbd75f659fd672b3756fea43356d9909 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c ac41c86b486f480b2bcad7e55c6cc19d7151082f74682ab048c45980d6c9ddac +F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -1036,7 +1036,7 @@ F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e F test/indexexpr2.test 38020c247ee77ba19322fadde99db84bdf2aef34f714866786563c3834bb2dce -F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d +F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 @@ -1805,7 +1805,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 c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 -R 86ff0d78e3b0371bb1c17329fcb2b62e +P e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 +R 11deec5828b62a731a0a037d39c47b89 U drh -Z 1f9977e43574c881ad05ccf22d06573e +Z cf16021848b0cf5e1e8ad8e5d4d2b4c8 diff --git a/manifest.uuid b/manifest.uuid index 07a899e00e..da0fd9f02b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 \ No newline at end of file +73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e \ No newline at end of file diff --git a/src/build.c b/src/build.c index 0cf9f52701..79ad744c52 100644 --- a/src/build.c +++ b/src/build.c @@ -260,7 +260,11 @@ void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ zSql = sqlite3VMPrintf(db, zFormat, ap); va_end(ap); if( zSql==0 ){ - return; /* A malloc must have failed */ + /* This can result either from an OOM or because the formatted string + ** exceeds SQLITE_LIMIT_LENGTH. In the latter case, we need to set + ** an error */ + if( !db->mallocFailed ) pParse->rc = SQLITE_TOOBIG; + return; } pParse->nested++; memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); diff --git a/test/indexfault.test b/test/indexfault.test index efe493219e..0e65179a32 100644 --- a/test/indexfault.test +++ b/test/indexfault.test @@ -337,6 +337,16 @@ do_faultsim_test 4.2 -faults custom -prep { faultsim_test_result {0 {}} } +do_faultsim_test 5 -prep { + reset_db +} -body { + execsql { + CREATE TABLE reallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongname(a PRIMARY KEY) WITHOUT ROWID; + } +} -test { + faultsim_test_result {0 {}} +} + uninstall_custom_faultsim finish_test From f030b376820102ff6cda49565c8b8173b2d44606 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 22 Feb 2019 19:24:16 +0000 Subject: [PATCH 18/48] Internally, remove all references to a Window object that belongs to an expression in an ORDER BY clause if that expression is converted to an alias of a result-set expression. Fix for [4feb3159c6]. FossilOrigin-Name: 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 49 ++++++++++++++++++++++++++++++++++------------- test/window1.test | 20 +++++++++++++++++++ 4 files changed, 65 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 28890120e9..1c480ce80d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\ssqlite3NestedParse()\sbe\ssure\sto\sdetect\sall\sSQLITE_NOMEM\sand\sSQLITE_TOOBIG\nerrors\sand\sto\sdistinguish\sbetween\sthem. -D 2019-02-22T16:18:12.478 +C Internally,\sremove\sall\sreferences\sto\sa\sWindow\sobject\sthat\sbelongs\sto\san\sexpression\sin\san\sORDER\sBY\sclause\sif\sthat\sexpression\sis\sconverted\sto\san\salias\sof\sa\sresult-set\sexpression.\sFix\sfor\s[4feb3159c6]. +D 2019-02-22T19:24:16.635 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -513,7 +513,7 @@ F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 93a3d539019264683a444bc043c875e9a6cca43fe935ae7bf6cfff0af3bba118 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 1588690ee4cc39b4b9ea3230d4e3543d5ec3b5e898c87521f1375af0f1934cd4 +F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d @@ -1676,7 +1676,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 2798c8249e0f122c9bacce6aa7324765a5cd9106e49e7aacc81f6033d281577b +F test/window1.test d141eba02ee4d7441dcb45148d776aded21992e8de6ddbbe2aae8151e5fad45e F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1805,7 +1805,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 e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 -R 11deec5828b62a731a0a037d39c47b89 -U drh -Z cf16021848b0cf5e1e8ad8e5d4d2b4c8 +P 73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e +R 0862848065a4a98f23b3c741ebf45b9f +U dan +Z 231e5f595c30e40261d6e69369fc6dc0 diff --git a/manifest.uuid b/manifest.uuid index da0fd9f02b..8b38972d81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e \ No newline at end of file +579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 9410bc0202..fd2cf539a9 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1243,6 +1243,38 @@ int sqlite3ResolveOrderGroupBy( return 0; } +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for resolveRemoveWindows(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window **pp; + for(pp=&pWalker->u.pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ + if( *pp==pExpr->y.pWin ){ + *pp = (*pp)->pNextWin; + break; + } + } + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void resolveRemoveWindows(Select *pSelect, Expr *pExpr){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); +} +#else +# define resolveRemoveWindows(x,y) +#endif + /* ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. ** The Name context of the SELECT statement is pNC. zType is either @@ -1309,19 +1341,10 @@ static int resolveOrderGroupBy( } for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ -#ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pE, EP_WinFunc) ){ - /* Since this window function is being changed into a reference - ** to the same window function the result set, remove the instance - ** of this window function from the Select.pWin list. */ - Window **pp; - for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ - if( *pp==pE->y.pWin ){ - *pp = (*pp)->pNextWin; - } - } - } -#endif + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + resolveRemoveWindows(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } diff --git a/test/window1.test b/test/window1.test index 2c504205e5..b3073985be 100644 --- a/test/window1.test +++ b/test/window1.test @@ -700,5 +700,25 @@ do_execsql_test 16.2 { 3 101 } +#------------------------------------------------------------------------- +do_execsql_test 17.0 { + CREATE TABLE t8(a); + INSERT INTO t8 VALUES(1), (2), (3); +} + +do_execsql_test 17.1 { + SELECT +sum(0) OVER () ORDER BY +sum(0) OVER (); +} {0} + +do_execsql_test 17.2 { + select +sum(a) OVER () FROM t8 ORDER BY +sum(a) OVER () DESC; +} {6 6 6} + +do_execsql_test 17.3 { + SELECT 10+sum(a) OVER (ORDER BY a) + FROM t8 + ORDER BY 10+sum(a) OVER (ORDER BY a) DESC; +} {16 13 11} + finish_test From bc0a55cf0b4c47fbb551583bfda3ed5a1d57d453 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 21:33:56 +0000 Subject: [PATCH 19/48] Check-in [fa792714ae62fa980] is not a valid fix for ticket [df46dfb631f75694], as the new test case in this check-in demonstrates. The fix here causes test cases for the [df46dfb631f75694] bug to fail again, so this check-in is on a branch. A new fix is needed for [df46dfb631f75694]. FossilOrigin-Name: 0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/wherecode.c | 4 +++- test/where.test | 12 ++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 1c480ce80d..1851f3ee0f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Internally,\sremove\sall\sreferences\sto\sa\sWindow\sobject\sthat\sbelongs\sto\san\sexpression\sin\san\sORDER\sBY\sclause\sif\sthat\sexpression\sis\sconverted\sto\san\salias\sof\sa\sresult-set\sexpression.\sFix\sfor\s[4feb3159c6]. -D 2019-02-22T19:24:16.635 +C Check-in\s[fa792714ae62fa980]\sis\snot\sa\svalid\sfix\sfor\sticket\n[df46dfb631f75694],\sas\sthe\snew\stest\scase\sin\sthis\scheck-in\sdemonstrates.\nThe\sfix\shere\scauses\stest\scases\sfor\sthe\s[df46dfb631f75694]\sbug\sto\sfail\nagain,\sso\sthis\scheck-in\sis\son\sa\sbranch.\s\sA\snew\sfix\sis\sneeded\sfor\n[df46dfb631f75694]. +D 2019-02-22T21:33:56.743 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c 5ee878f714218352a2f452907572d4bf1e4303393288458f87ffc86edaf2cfbe +F src/wherecode.c cdeb7c7028dfcf1c473c5d91c4ae4e579a8d35337e0042788022063bb6db2a51 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1646,7 +1646,7 @@ F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 -F test/where.test 8215d220633f08da331781cf9ede7fb7aed50eb113473c10acd39a643fd258ba +F test/where.test 93738e224cd5e7819565a9f272c19fd0ee5893d9cd7f5238ce026bae09b8d710 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1805,7 +1805,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e -R 0862848065a4a98f23b3c741ebf45b9f -U dan -Z 231e5f595c30e40261d6e69369fc6dc0 +P 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a +R 44233d0aa266189ff2ae6bf0b0a0a078 +T *branch * tkt-df46dfb631 +T *sym-tkt-df46dfb631 * +T -sym-trunk * +U drh +Z ab4cb17ec0e626c52e7694e3fdcbcc49 diff --git a/manifest.uuid b/manifest.uuid index 8b38972d81..a2aa927f76 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a \ No newline at end of file +0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 5441752ed1..4ca9c8853b 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1344,7 +1344,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; - pTerm->wtFlags |= TERM_CODED; + if( (pTerm->prereqAll & pLevel->notReady)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ diff --git a/test/where.test b/test/where.test index 1f38065c65..e1b81aa053 100644 --- a/test/where.test +++ b/test/where.test @@ -1425,5 +1425,17 @@ do_execsql_test where-22.1 { SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL; } {5} +# 20190-02-22: A bug introduced by checkin +# https://www.sqlite.org/src/info/fa792714ae62fa98. +# +do_execsql_test where-23.0 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INTEGER PRIMARY KEY); + INSERT INTO t1(a) VALUES(1),(2),(3); + CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); + INSERT INTO t2(y) VALUES(2),(3); + SELECT * FROM t1, t2 WHERE a=y AND y=3; +} {3 2 3} finish_test From 50ef6716d2ac75314e76546d074efd694969dba2 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 23:29:56 +0000 Subject: [PATCH 20/48] Make all ephemeral tables built to hold the RHS of an IN operator be index-btrees, never table-btrees, regardless of whether or not they are used as IN_INDEX_LOOP or IN_INDEX_MEMBERSHIP. That way, the same ephmerial table can be reused for both cases. FossilOrigin-Name: c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 --- manifest | 21 +++++++++------------ manifest.uuid | 2 +- src/expr.c | 40 +++++++--------------------------------- src/insert.c | 7 +++++-- src/sqliteInt.h | 2 +- src/vdbe.c | 24 ++++++------------------ 6 files changed, 29 insertions(+), 67 deletions(-) diff --git a/manifest b/manifest index 1851f3ee0f..83c7b99bb1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Check-in\s[fa792714ae62fa980]\sis\snot\sa\svalid\sfix\sfor\sticket\n[df46dfb631f75694],\sas\sthe\snew\stest\scase\sin\sthis\scheck-in\sdemonstrates.\nThe\sfix\shere\scauses\stest\scases\sfor\sthe\s[df46dfb631f75694]\sbug\sto\sfail\nagain,\sso\sthis\scheck-in\sis\son\sa\sbranch.\s\sA\snew\sfix\sis\sneeded\sfor\n[df46dfb631f75694]. -D 2019-02-22T21:33:56.743 +C Make\sall\sephemeral\stables\sbuilt\sto\shold\sthe\sRHS\sof\san\sIN\soperator\sbe\nindex-btrees,\snever\stable-btrees,\sregardless\sof\swhether\sor\snot\sthey\sare\nused\sas\sIN_INDEX_LOOP\sor\sIN_INDEX_MEMBERSHIP.\s\sThat\sway,\sthe\ssame\sephmerial\ntable\scan\sbe\sreused\sfor\sboth\scases. +D 2019-02-22T23:29:56.457 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -467,7 +467,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 182dc9ff30aa6a430b7f728ce84fda85ec10890e29fdf75be1e871d13222a99c +F src/expr.c f2d0ecf68213770be4fad83128ce02e67667deebaa0a44061313f7e4f2a4ae28 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 @@ -476,7 +476,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 305f6ea82a90c3d506ad26d3b6530655bcf08dbff20403ce9f20c21758fbd5c0 +F src/insert.c 4ce12b5ba3bcbfa17ec37ce960d499fc287b6289df2c00b31201f716a3c7df45 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f @@ -520,7 +520,7 @@ F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251 F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 8628c582eafa5ca93523cdaa7c45b2f38a11132e419c7923850706da7fa36bc2 +F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d0b F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -586,7 +586,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c c2ebe27a1e4176f5e4b48269917b7a3df096b125d3c407da90e769a9fe4e406e +F src/vdbe.c f1e7b5320df80ff58c67176e35cb48062cbda2a9c9811f11db5faa48071d3fe4 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 @@ -1805,10 +1805,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 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a -R 44233d0aa266189ff2ae6bf0b0a0a078 -T *branch * tkt-df46dfb631 -T *sym-tkt-df46dfb631 * -T -sym-trunk * +P 0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 +R 63e80740e79601900e62b0317140d8ef U drh -Z ab4cb17ec0e626c52e7694e3fdcbcc49 +Z b87326ad069ad8da755635bc9cbd9517 diff --git a/manifest.uuid b/manifest.uuid index a2aa927f76..2e02e213eb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 \ No newline at end of file +c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 03ecf1567d..e39b6408c4 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2552,14 +2552,11 @@ int sqlite3FindInIndex( eType = IN_INDEX_EPH; if( inFlags & IN_INDEX_LOOP ){ pParse->nQueryLoop = 0; - if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){ - eType = IN_INDEX_ROWID; - } }else if( prRhsHasNull ){ *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } assert( pX->op==TK_IN ); - sqlite3CodeRhsOfIN(pParse, pX, iTab, eType==IN_INDEX_ROWID); + sqlite3CodeRhsOfIN(pParse, pX, iTab); if( rMayHaveNull ){ sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); } @@ -2660,12 +2657,6 @@ void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ ** however the cursor number returned might not be the same, as it might ** have been duplicated using OP_OpenDup. ** -** If parameter isRowid is non-zero, then LHS of the IN operator is guaranteed -** to be a non-null integer. In this case, the ephemeral table can be an -** table B-Tree that keyed by only integers. The more general cases uses -** an index B-Tree which can have arbitrary keys, but is slower to both -** read and write. -** ** If the LHS expression ("x" in the examples) is a column value, or ** the SELECT statement returns a column value, then the affinity of that ** column is used to build the index keys. If both 'x' and the @@ -2677,8 +2668,7 @@ void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ void sqlite3CodeRhsOfIN( Parse *pParse, /* Parsing context */ Expr *pExpr, /* The IN operator */ - int iTab, /* Use this cursor number */ - int isRowid /* If true, LHS is a rowid */ + int iTab /* Use this cursor number */ ){ int addrOnce = 0; /* Address of the OP_Once instruction at top */ int addr; /* Address of OP_OpenEphemeral instruction */ @@ -2731,14 +2721,12 @@ void sqlite3CodeRhsOfIN( /* Check to see if this is a vector IN operator */ pLeft = pExpr->pLeft; nVal = sqlite3ExprVectorSize(pLeft); - assert( !isRowid || nVal==1 ); /* Construct the ephemeral table that will contain the content of ** RHS of the IN operator. */ pExpr->iTable = iTab; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, - pExpr->iTable, (isRowid?0:nVal)); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS if( ExprHasProperty(pExpr, EP_xIsSelect) ){ VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); @@ -2746,7 +2734,7 @@ void sqlite3CodeRhsOfIN( VdbeComment((v, "RHS of IN operator")); } #endif - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ /* Case 1: expr IN (SELECT ...) @@ -2760,7 +2748,6 @@ void sqlite3CodeRhsOfIN( ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", addrOnce?"":"CORRELATED ", pSelect->selId )); - assert( !isRowid ); /* If the LHS and RHS of the IN operator do not match, that ** error will have been caught long before we reach this point. */ if( ALWAYS(pEList->nExpr==nVal) ){ @@ -2813,10 +2800,8 @@ void sqlite3CodeRhsOfIN( /* Loop through each expression in . */ r1 = sqlite3GetTempReg(pParse); r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ Expr *pE2 = pItem->pExpr; - int iValToIns; /* If the expression is not constant then we will need to ** disable the test that was generated above that makes sure @@ -2829,20 +2814,9 @@ void sqlite3CodeRhsOfIN( } /* Evaluate the expression and insert it into the temp table */ - if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ - sqlite3VdbeAddOp3(v, OP_InsertInt, iTab, r2, iValToIns); - }else{ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, - sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Insert, iTab, r2, r3); - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); - } - } + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); } sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); diff --git a/src/insert.c b/src/insert.c index 6f044db5a7..a68db1a1d2 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1921,10 +1921,13 @@ void sqlite3CompleteInsertion( pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( update_flags==0 ){ - sqlite3VdbeAddOp4(v, OP_InsertInt, - iIdxCur+i, aRegIdx[i], 0, (char*)pTab, P4_TABLE + int r = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, + iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE ); sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); } #endif } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e568677759..f12e2b6228 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4281,7 +4281,7 @@ void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); int sqlite3GetToken(const unsigned char *, int *); void sqlite3NestedParse(Parse*, const char*, ...); void sqlite3ExpirePreparedStatements(sqlite3*, int); -void sqlite3CodeRhsOfIN(Parse*, Expr*, int, int); +void sqlite3CodeRhsOfIN(Parse*, Expr*, int); int sqlite3CodeSubselect(Parse*, Expr*); void sqlite3SelectPrep(Parse*, Select*, NameContext*); void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); diff --git a/src/vdbe.c b/src/vdbe.c index 5085273bc7..425a03e0e6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4569,14 +4569,7 @@ case OP_NewRowid: { /* out2 */ ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ -/* Opcode: InsertInt P1 P2 P3 P4 P5 -** Synopsis: intkey=P3 data=r[P2] -** -** This works exactly like OP_Insert except that the key is the -** integer value P3, not the value of the integer stored in register P3. -*/ -case OP_Insert: -case OP_InsertInt: { +case OP_Insert: { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ VdbeCursor *pC; /* Cursor to table into which insert is written */ @@ -4597,16 +4590,11 @@ case OP_InsertInt: { REGISTER_TRACE(pOp->p2, pData); sqlite3VdbeIncrWriteCounter(p, pC); - if( pOp->opcode==OP_Insert ){ - pKey = &aMem[pOp->p3]; - assert( pKey->flags & MEM_Int ); - assert( memIsValid(pKey) ); - REGISTER_TRACE(pOp->p3, pKey); - x.nKey = pKey->u.i; - }else{ - assert( pOp->opcode==OP_InsertInt ); - x.nKey = pOp->p3; - } + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ assert( pC->iDb>=0 ); From 4bdd26dfab8408645b1e32e657355e332b098350 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 23 Feb 2019 00:08:09 +0000 Subject: [PATCH 21/48] Remove a testcase() macro which is now unreachable due to the contraction of the use of IN_INDEX_ROWID. FossilOrigin-Name: 90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 83c7b99bb1..d7d81d4706 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sall\sephemeral\stables\sbuilt\sto\shold\sthe\sRHS\sof\san\sIN\soperator\sbe\nindex-btrees,\snever\stable-btrees,\sregardless\sof\swhether\sor\snot\sthey\sare\nused\sas\sIN_INDEX_LOOP\sor\sIN_INDEX_MEMBERSHIP.\s\sThat\sway,\sthe\ssame\sephmerial\ntable\scan\sbe\sreused\sfor\sboth\scases. -D 2019-02-22T23:29:56.457 +C Remove\sa\stestcase()\smacro\swhich\sis\snow\sunreachable\sdue\sto\sthe\scontraction\sof\nthe\suse\sof\sIN_INDEX_ROWID. +D 2019-02-23T00:08:09.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c cdeb7c7028dfcf1c473c5d91c4ae4e579a8d35337e0042788022063bb6db2a51 +F src/wherecode.c 061848646cc46a137d9038e47e666a955b3b2a1b458365eeed76b004c0053f3b F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1805,7 +1805,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 0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 -R 63e80740e79601900e62b0317140d8ef +P c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 +R c922ba3f62286cb9bc5a2acd31d21a66 U drh -Z b87326ad069ad8da755635bc9cbd9517 +Z 4c57ce6adbcc41ffca57692643360ae6 diff --git a/manifest.uuid b/manifest.uuid index 2e02e213eb..2c4694a5fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 \ No newline at end of file +90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 4ca9c8853b..79189386b6 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -582,7 +582,6 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ){ int iOut = iReg + i - iEq; if( eType==IN_INDEX_ROWID ){ - testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); }else{ int iCol = aiMap ? aiMap[iMap++] : 0; From f2e5c986130ad4e4aa88aab75ad42a49aaf55551 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 23 Feb 2019 20:48:41 +0000 Subject: [PATCH 22/48] Fix a couple of assert() statements in fts3 that can be false if the database is corrupt. FossilOrigin-Name: 84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 --- ext/fts3/fts3_snippet.c | 4 +- manifest | 17 ++-- manifest.uuid | 2 +- test/fts3corrupt4.test | 219 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 229 insertions(+), 13 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 115e98abfc..58a71d2dd6 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1543,7 +1543,7 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ nTerm = pExpr->pPhrase->nToken; if( pList ){ fts3GetDeltaPosition(&pList, &iPos); - assert( iPos>=0 ); + assert_fts3_nc( iPos>=0 ); } for(iTerm=0; iTermpList) ){ pTerm->pList = 0; }else{ diff --git a/manifest b/manifest index 5bceb98aca..634de25e24 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Check-in\s[fa792714ae62fa98]\sis\sincorrect.\s\sAdd\sa\stest\scase\sto\srefute\sit\sand\nalso\sa\sfix\sto\smake\sit\sright.\s\nThen\sadd\san\salternative\sfix\sto\sticket\s[df46dfb631f75694]\sin\swhich\nall\sephemeral\stables\sused\sas\sthe\sRHS\sof\san\sIN\soperator\sbe\sindex\sbtrees\nand\snever\stable\sbtrees\sso\sthat\sthey\scan\salways\sbe\sreused. -D 2019-02-23T00:21:00.186 +C Fix\sa\scouple\sof\sassert()\sstatements\sin\sfts3\sthat\scan\sbe\sfalse\sif\sthe\sdatabase\sis\scorrupt. +D 2019-02-23T20:48:41.063 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -89,7 +89,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 ac1f8945375d07076b7178de1fe549982e6ae6f050095e7f7e400ec4448f31df +F ext/fts3/fts3_snippet.c d002c29d3e71c15b27326b818c1e49a4d0d5fc342cc8e9522e2bf2a3077c75a2 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -919,7 +919,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 2afb0da4fe1fb6468a485f96d6a1bc4959734f515176ec29294dd49b0ad4c946 +F test/fts3corrupt4.test 8733b9589701df24cf5f35ed36fec865edd67f24961f24ac69d751b4221494f7 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1805,8 +1805,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 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a 90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c -R c922ba3f62286cb9bc5a2acd31d21a66 -T +closed 90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c -U drh -Z 6d379fa0271550d77de94db4756b85a3 +P d3915230e3ee5878fe2e65a0afb7e91ee124aaf46b4e28c6e00053d6df13d445 +R 6e690e8ab06a9d23902df3ac745bd5b0 +U dan +Z 7adf75902be04c3b9b4844266efca292 diff --git a/manifest.uuid b/manifest.uuid index 7f507cdb90..3094fb5b67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d3915230e3ee5878fe2e65a0afb7e91ee124aaf46b4e28c6e00053d6df13d445 \ No newline at end of file +84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 55e52c4cdd..d200c95fa9 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -2586,7 +2586,6 @@ do_test 17.0 { | end crash-f15972acf5bc1c.db }]} {} -breakpoint do_execsql_test 17.1 { BEGIN; INSERT INTO t1(t1) SELECT x FROM t2; @@ -3259,6 +3258,224 @@ do_execsql_test 20.2 { INSERT INTO t1(t1) VALUES('optimize'); } +#------------------------------------------------------------------------- +reset_db +do_test 21.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-18cc014e42e828.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 66 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 ft2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 75 67 64 69 72 .5tablet1_sugdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 46 47 45 52 rt_block INTFGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4e 0d 35 0d 1b 0c fb .......h.N.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 00 00 .......x.W.>.$.. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 43 53 VTAB ENABLE FCS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 20 21 05 00 33 0f 19 4f 4d 0XRTRIM !..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 39 NABLE GEOPOLYXB9 +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 1e 4c NARY....)..ENA.L +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 16 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 48 4e 41 52 59 17 0b LE FTS4XBHNARY.. +| 3776: 05 00 23 0e 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 2e 52 49 4d 1e ABLE FTS4XR.RIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 da 41 52 59 27 20160609XBI.ARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 00 00 00 00 OMPILER=gcc-.... +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 3a 03 25 07 00 00 01 34 03 25 05 00 00 01 35 0:.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 57 63 63 03 25 03 00 01 .5.%....Wcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 64 64 73 61 66 65 03 %....threddsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 12 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 0e 97 02 00 ................ +| 3504: 01 02 00 01 cb 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 01 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 ab 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 12 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 01 f0 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 08 a2 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 02 01 01 02 00 ................ +| 3936: 01 01 01 01 ff f1 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 01 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 03 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 02 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 00 00 00 00 00 00 00 00 uild............ +| end crash-18cc014e42e828.db +}]} {} + +breakpoint +do_catchsql_test 21.1 { + SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'R*'; +} {1 {database disk image is malformed}} + finish_test From 7edcb11ca7153b3e8a0b01d14142453e2b11ea6f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 Feb 2019 14:16:19 +0000 Subject: [PATCH 23/48] Fix a typo in the documentation for sqlite3_total_changes(). FossilOrigin-Name: 8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 634de25e24..7db9d11be5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scouple\sof\sassert()\sstatements\sin\sfts3\sthat\scan\sbe\sfalse\sif\sthe\sdatabase\sis\scorrupt. -D 2019-02-23T20:48:41.063 +C Fix\sa\stypo\sin\sthe\sdocumentation\sfor\ssqlite3_total_changes(). +D 2019-02-25T14:16:19.183 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -517,7 +517,7 @@ F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d -F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 +F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d0b @@ -1805,7 +1805,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 d3915230e3ee5878fe2e65a0afb7e91ee124aaf46b4e28c6e00053d6df13d445 -R 6e690e8ab06a9d23902df3ac745bd5b0 -U dan -Z 7adf75902be04c3b9b4844266efca292 +P 84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 +R a2b016f8e876d7afed026960b97cfb9a +U drh +Z 55e24971867c6a920f00e5ee1b3ee79b diff --git a/manifest.uuid b/manifest.uuid index 3094fb5b67..3940420865 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 \ No newline at end of file +8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 392532a6f7..f29102727e 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2369,7 +2369,7 @@ int sqlite3_changes(sqlite3*); ** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** -** This the [sqlite3_total_changes(D)] interface only reports the number +** The [sqlite3_total_changes(D)] interface only reports the number ** of rows that changed due to SQL statement run against database ** connection D. Any changes by other database connections are ignored. ** To detect changes against a database file from other database From c3017e7b4a1829f3e8bc4f26f5b05b31836120e0 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 Feb 2019 14:52:43 +0000 Subject: [PATCH 24/48] Update comments on the fossildelta extension. No changes to code. FossilOrigin-Name: 9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 --- ext/misc/fossildelta.c | 40 +++++++++++++++++++++++++++++++++++----- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index 7a9c5c1d72..b58d358b55 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -600,7 +600,7 @@ static int delta_apply( } /* -** SQL functions: fossildelta_create(X,Y) +** SQL functions: delta_create(X,Y) ** ** Return a delta for carrying X into Y. */ @@ -635,7 +635,7 @@ static void deltaCreateFunc( } /* -** SQL functions: fossildelta_apply(X,D) +** SQL functions: delta_apply(X,D) ** ** Return the result of applying delta D to input X. */ @@ -678,7 +678,7 @@ static void deltaApplyFunc( /* -** SQL functions: fossildelta_output_size(D) +** SQL functions: delta_output_size(D) ** ** Return the size of the output that results from applying delta D. */ @@ -704,8 +704,38 @@ static void deltaOutputSizeFunc( } } -/* The deltaparse(DELTA) table-valued function parses the DELTA in -** its input and returns a table that describes that delta. +/***************************************************************************** +** Table-valued SQL function: delta_parse(DELTA) +** +** Schema: +** +** CREATE TABLE delta_parse( +** op TEXT, +** a1 INT, +** a2 ANY, +** delta HIDDEN BLOB +** ); +** +** Given an input DELTA, this function parses the delta and returns +** rows for each entry in the delta. The op column has one of the +** values SIZE, COPY, INSERT, CHECKSUM, ERROR. +** +** Assuming no errors, the first row has op='SIZE'. a1 is the size of +** the output in bytes and a2 is NULL. +** +** After the initial SIZE row, there are zero or more 'COPY' and/or 'INSERT' +** rows. A COPY row means content is copied from the source into the +** output. Column a1 is the number of bytes to copy and a2 is the offset +** into source from which to begin copying. An INSERT row means to +** insert text into the output stream. Column a1 is the number of bytes +** to insert and column is a BLOB that contains the text to be inserted. +** +** The last row of a well-formed delta will have an op value of 'CHECKSUM'. +** The a1 column will be the value of the checksum and a2 will be NULL. +** +** If the input delta is not well-formed, then a row with an op value +** of 'ERROR' is returned. The a1 value of the ERROR row is the offset +** into the delta where the error was encountered and a2 is NULL. */ typedef struct deltaparsevtab_vtab deltaparsevtab_vtab; typedef struct deltaparsevtab_cursor deltaparsevtab_cursor; diff --git a/manifest b/manifest index 7db9d11be5..a725656c76 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sthe\sdocumentation\sfor\ssqlite3_total_changes(). -D 2019-02-25T14:16:19.183 +C Update\scomments\son\sthe\sfossildelta\sextension.\s\sNo\schanges\sto\scode. +D 2019-02-25T14:52:43.832 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 -F ext/misc/fossildelta.c 31b64084789228ac0d1113e5e39dc79c2ae16dd131d5c988ad9550ae1b9bc4b4 +F ext/misc/fossildelta.c 3cc9a9b2f39889b43cd176c19f286bc7dd652f4c202c202d008481252d820316 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 -R a2b016f8e876d7afed026960b97cfb9a +P 8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 +R b6b94692df1ff68d1775b0307c4b76d3 U drh -Z 55e24971867c6a920f00e5ee1b3ee79b +Z 398771f938c8db2543123478ba7fdec9 diff --git a/manifest.uuid b/manifest.uuid index 3940420865..3326c630fa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 \ No newline at end of file +9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 \ No newline at end of file From 8b738d086584191e8d2f44165f9f380610690e7f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 Feb 2019 18:43:54 +0000 Subject: [PATCH 25/48] Enhance the command-line shell to accept bound parameters, using the TEMP table named "$Parameters" to look up the values for bound parameters. FossilOrigin-Name: 7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a725656c76..bc7ae72323 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\scomments\son\sthe\sfossildelta\sextension.\s\sNo\schanges\sto\scode. -D 2019-02-25T14:52:43.832 +C Enhance\sthe\scommand-line\sshell\sto\saccept\sbound\sparameters,\susing\sthe\nTEMP\stable\snamed\s"$Parameters"\sto\slook\sup\sthe\svalues\sfor\sbound\sparameters. +D 2019-02-25T18:43:54.244 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -516,7 +516,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 -F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d +F src/shell.c.in a238f3f80f7085d31056c69930ec13a87872da0d0d08fd561f5aff78cc618f5d F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1805,7 +1805,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 8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 -R b6b94692df1ff68d1775b0307c4b76d3 +P 9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 +R 6ea2c77700991e615d8d2faccc53ab72 U drh -Z 398771f938c8db2543123478ba7fdec9 +Z 82b4b57ac959f29e2a6d5db5cac484ef diff --git a/manifest.uuid b/manifest.uuid index 3326c630fa..40b6b070f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 \ No newline at end of file +7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index c7d94dbee8..3474c10ca8 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2747,6 +2747,55 @@ static void restore_debug_trace_modes(void){ #endif } +/* Name of the TEMP table that holds bind parameter values */ +#define BIND_PARAM_TABLE "$Parameters" + +/* +** Bind parameters on a prepared statement. +** +** Parameter bindings are taken from a TEMP table of the form: +** +** CREATE TEMP TABLE "$Parameters"(key TEXT PRIMARY KEY, value) +** WITHOUT ROWID; +** +** No bindings occur if this table does not exist. The special character '$' +** is included in the table name to help prevent collisions with actual tables. +** The table must be in the TEMP schema. +*/ +static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ + int nVar; + int i; + int rc; + sqlite3_stmt *pQ = 0; + + nVar = sqlite3_bind_parameter_count(pStmt); + if( nVar==0 ) return; /* Nothing to do */ + if( sqlite3_table_column_metadata(pArg->db, "TEMP", BIND_PARAM_TABLE, + "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ + return; /* Parameter table does not exist */ + } + rc = sqlite3_prepare_v2(pArg->db, + "SELECT value FROM temp.\"" BIND_PARAM_TABLE "\"" + " WHERE key=?1", -1, &pQ, 0); + if( rc || pQ==0 ) return; + for(i=1; i<=nVar; i++){ + char zNum[30]; + const char *zVar = sqlite3_bind_parameter_name(pStmt, i); + if( zVar==0 ){ + sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); + zVar = zNum; + } + sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); + if( sqlite3_step(pQ)==SQLITE_ROW ){ + sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); + }else{ + sqlite3_bind_null(pStmt, i); + } + sqlite3_reset(pQ); + } + sqlite3_finalize(pQ); +} + /* ** Run a prepared statement */ @@ -3066,6 +3115,7 @@ static int shell_exec( } } + bind_prepared_stmt(pArg, pStmt); exec_prepared_stmt(pArg, pStmt); explain_data_delete(pArg); eqp_render(pArg); From 9ebe59d6fffc2a4d6799d7c8e9c4071948291a33 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 12:29:25 +0000 Subject: [PATCH 26/48] Update the configure-generated makekfile to generate a portable pkgIndex.tcl. FossilOrigin-Name: 35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 --- Makefile.in | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile.in b/Makefile.in index 65530e33c5..2312f4165b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1424,7 +1424,7 @@ install: sqlite3$(TEXE) lib_install sqlite3.h sqlite3.pc ${HAVE_TCL:1=tcl_instal $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(pkgconfigdir) pkgIndex.tcl: - echo 'package ifneeded sqlite3 $(RELEASE) [list load $(TCLLIBDIR)/libtclsqlite3$(SHLIB_SUFFIX) sqlite3]' > $@ + echo 'package ifneeded sqlite3 $(RELEASE) [list load [file join $$dir libtclsqlite3[info sharedlibextension]] sqlite3]' > $@ tcl_install: lib_install libtclsqlite3.la pkgIndex.tcl $(INSTALL) -d $(DESTDIR)$(TCLLIBDIR) $(LTINSTALL) libtclsqlite3.la $(DESTDIR)$(TCLLIBDIR) diff --git a/manifest b/manifest index bc7ae72323..9b2e82c3e6 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -C Enhance\sthe\scommand-line\sshell\sto\saccept\sbound\sparameters,\susing\sthe\nTEMP\stable\snamed\s"$Parameters"\sto\slook\sup\sthe\svalues\sfor\sbound\sparameters. -D 2019-02-25T18:43:54.244 +C Update\sthe\sconfigure-generated\smakekfile\sto\sgenerate\sa\sportable\spkgIndex.tcl. +D 2019-02-26T12:29:25.097 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 +F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee @@ -1805,7 +1805,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 9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 -R 6ea2c77700991e615d8d2faccc53ab72 +P 7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 +R ba8a1248c5f79d4761a702c6089dec67 U drh -Z 82b4b57ac959f29e2a6d5db5cac484ef +Z 71e12f1b2a3ae7b8dbcc15250648d27c diff --git a/manifest.uuid b/manifest.uuid index 40b6b070f6..3700d27aac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 \ No newline at end of file +35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 \ No newline at end of file From 2b454e0335cbe14bc96b460ff3695007185fbb6e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 16:11:46 +0000 Subject: [PATCH 27/48] Fix a harmless compiler warning that only comes up during debug builds. FossilOrigin-Name: 848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tokenize.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9b2e82c3e6..d53ad9b26b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sconfigure-generated\smakekfile\sto\sgenerate\sa\sportable\spkgIndex.tcl. -D 2019-02-26T12:29:25.097 +C Fix\sa\sharmless\scompiler\swarning\sthat\sonly\scomes\sup\sduring\sdebug\sbuilds. +D 2019-02-26T16:11:46.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -578,7 +578,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c e61ead283dff63762a9f5be462dbd258dba948e5fb4e3b261fc03703426eb12e +F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 @@ -1805,7 +1805,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 7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 -R ba8a1248c5f79d4761a702c6089dec67 +P 35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 +R d5f269750441e62c6e89c0272d884f83 U drh -Z 71e12f1b2a3ae7b8dbcc15250648d27c +Z 26f5e510f6fdca054128434e6c62bf8f diff --git a/manifest.uuid b/manifest.uuid index 3700d27aac..251770c676 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 \ No newline at end of file +848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 \ No newline at end of file diff --git a/src/tokenize.c b/src/tokenize.c index d22b46371f..40f7b4aad9 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -560,10 +560,10 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ int lastTokenParsed = -1; /* type of the previous token */ sqlite3 *db = pParse->db; /* The database connection */ int mxSqlLen; /* Max length of an SQL string */ - VVA_ONLY( u8 startedWithOom = db->mallocFailed ); #ifdef sqlite3Parser_ENGINEALWAYSONSTACK yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif + VVA_ONLY( u8 startedWithOom = db->mallocFailed ); assert( zSql!=0 ); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; From eaac9996edf679fd9b081508e23f98e70f5cdcd9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 16:17:06 +0000 Subject: [PATCH 28/48] Use unsigned integers to count the number of pages in a freelist during an integrity_check, to avoid any possibility of a signed integer overflow. FossilOrigin-Name: 05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index d53ad9b26b..70da095425 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sthat\sonly\scomes\sup\sduring\sdebug\sbuilds. -D 2019-02-26T16:11:46.752 +C Use\sunsigned\sintegers\sto\scount\sthe\snumber\sof\spages\sin\sa\sfreelist\sduring\nan\sintegrity_check,\sto\savoid\sany\spossibility\sof\sa\ssigned\sinteger\soverflow. +D 2019-02-26T16:17:06.560 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -456,7 +456,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 026f48c39b179a5602423904fcaaae87bbd75f659fd672b3756fea43356d9909 +F src/btree.c f85f8abe99ec3e72671f0fc9b09114188974fe0b9a3ea9edc77977e853ff75e9 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 @@ -1805,7 +1805,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 35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 -R d5f269750441e62c6e89c0272d884f83 +P 848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 +R 5bfaa50c9d0b312e0c5de93392fc2854 U drh -Z 26f5e510f6fdca054128434e6c62bf8f +Z d36c5219418a3d97914eaaa4ccab9e4b diff --git a/manifest.uuid b/manifest.uuid index 251770c676..56360e4947 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 \ No newline at end of file +05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index aa2c84999c..9e7a9c0426 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9616,10 +9616,10 @@ static void checkList( IntegrityCk *pCheck, /* Integrity checking context */ int isFreeList, /* True for a freelist. False for overflow page list */ int iPage, /* Page number for first page in the list */ - int N /* Expected number of pages in the list */ + u32 N /* Expected number of pages in the list */ ){ int i; - int expected = N; + u32 expected = N; int nErrAtStart = pCheck->nErr; while( iPage!=0 && pCheck->mxErr ){ DbPage *pOvflPage; @@ -9878,7 +9878,7 @@ static int checkTreePage( /* Check the content overflow list */ if( info.nPayload>info.nLocal ){ - int nPage; /* Number of pages on the overflow chain */ + u32 nPage; /* Number of pages on the overflow chain */ Pgno pgnoOvfl; /* First page of the overflow chain */ assert( pc + info.nSize - 4 <= usableSize ); nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); From 5cb1ffc1bd1cae42c5846b10e6cb23c53290bdad Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 17:49:07 +0000 Subject: [PATCH 29/48] Allocate a few extra bytes for the pager temp page as an overrun buffer while processing corrupt database files. FossilOrigin-Name: e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 10 ++++++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 70da095425..0a7fc9d1a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sunsigned\sintegers\sto\scount\sthe\snumber\sof\spages\sin\sa\sfreelist\sduring\nan\sintegrity_check,\sto\savoid\sany\spossibility\sof\sa\ssigned\sinteger\soverflow. -D 2019-02-26T16:17:06.560 +C Allocate\sa\sfew\sextra\sbytes\sfor\sthe\spager\stemp\spage\sas\san\soverrun\sbuffer\swhile\nprocessing\scorrupt\sdatabase\sfiles. +D 2019-02-26T17:49:07.980 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -502,7 +502,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 2b9604eb5c12f40a0613e832b6267f5814f84479d570d482ba6f98d7affa7c1c F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 38022624ac9fba1f601d3068d7c393fcc909727fccab556242c93d9c7897b640 +F src/pager.c 5420ef6ea46db11b6ba1231f39fc2a1bf19ccad185efc6dc46f1520a608de4f8 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -1805,7 +1805,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 848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 -R 5bfaa50c9d0b312e0c5de93392fc2854 +P 05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d +R 77af06549b97efcb59d5193751ddb805 U drh -Z d36c5219418a3d97914eaaa4ccab9e4b +Z 56c9cac7536ccfb12071d041335842f8 diff --git a/manifest.uuid b/manifest.uuid index 56360e4947..3a39dd1fe1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d \ No newline at end of file +e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index cc4f87a572..4660bbfaba 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3786,8 +3786,14 @@ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ rc = sqlite3OsFileSize(pPager->fd, &nByte); } if( rc==SQLITE_OK ){ - pNew = (char *)sqlite3PageMalloc(pageSize); - if( !pNew ) rc = SQLITE_NOMEM_BKPT; + /* 8 bytes of zeroed overrun space is sufficient so that the b-tree + * cell header parser will never run off the end of the allocation */ + pNew = (char *)sqlite3PageMalloc(pageSize+8); + if( !pNew ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memset(pNew+pageSize, 0, 8); + } } if( rc==SQLITE_OK ){ From bfa70de11729499021b5cf91e78fd49fa1784d43 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 17:52:44 +0000 Subject: [PATCH 30/48] New test cases added to test/fuzzdata8.db. FossilOrigin-Name: 61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 991232 -> 1010688 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 0a7fc9d1a1..c082475ac2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allocate\sa\sfew\sextra\sbytes\sfor\sthe\spager\stemp\spage\sas\san\soverrun\sbuffer\swhile\nprocessing\scorrupt\sdatabase\sfiles. -D 2019-02-26T17:49:07.980 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db. +D 2019-02-26T17:52:44.425 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 04d95f81db43fa4a247531d25573544125d9dd2777ae43594c9eb57e2a8b901c +F test/fuzzdata8.db 2328494c8c0c18d95e5e04b05cc6dd94bc6b5baf9641fc36b1e881619b897b54 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1805,7 +1805,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 05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d -R 77af06549b97efcb59d5193751ddb805 +P e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 +R a16512abbf69d78b036f59b691e0a9de U drh -Z 56c9cac7536ccfb12071d041335842f8 +Z 48cb44477903aa54b0e5eb2c3b8cff1f diff --git a/manifest.uuid b/manifest.uuid index 3a39dd1fe1..86dc56247b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 \ No newline at end of file +61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index ed0d3497b4622f8ea25c591ae96612ee07a24d8e..8ebedd1d765978c511fcf38d6c4f6727bdc928b7 100644 GIT binary patch delta 19493 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 aX8M&tp#5h(x_+%edEJb?<_p&QAN@bTR2RAc delta 16350 zcmaJ|30zgh_kS~U_j?}?6x_jwdv5StP;&v?HxzO$H*nulFg16X=Te=Zm9BCf&R*$sqYwl1?%`Nh6t-q>@~oq>!AMB$J$+BuI`*;v@$pF_JM!c1Jzt zlV~@OM3Xrr8qFe6dnSp%86+xACsBSH33Dn5%3&my3?VUZFp0^7NQ`-wMC?EkeFl)| z)Q?2FJ|tQ^Ln0)GMD=JAzP%g{_D4^G&aQVOajpxA!j2?PcOa3|p2S<>BsRAtvAzw7 zwALhEdYZ(HRwNQykQg3DqHi-2J;@@hgNH<$P!f$oNYrjj!rh2OY?<^4xyPxH?v{w(CF3Is*Rl4lP-=F0Qmsilh(%{AdJ_v^m=34{<@au1d zW3L7LZ3gq_@gyn#NOF@Fy4&9F}j&*W^&!@mC>udSgzjBgzdG3BN1=$pVx zIfk#}%XK+Ga;ypVw(r`?&uZJ3m-m+(YaiOBCl{K=#4jF zM1O+Q-KPRn`H}Cm4Y8X(2O+YMRY1D*y-Z9}9`EF%w^Oi{*lygynse-rjqF?lCZ>mYAZl4`Jmzs|B`hC{7A?Dm6K( zK8B9c3OU|wB4ox+qtr}L;Q9zWE3|6pZYiz`ab}bONs?9t-EHVkXF+IK*r>44VNJt4 zEt*2nN!1^6*Jx3&7qlQ;6(ObyRtRM&d;mmGyOWM73BG6 z;Y^5V;zbbKQ*0LOV@R2&cp&IU7K^V&i%Ei=gP~_xe;5>_EQ7}1@a1Xwybi>E%rw~W zj4~c3uVpe?{l%}0eFFKHomG((^p#+r!ugq^6}BBL{!*o?lH(X;%#=IOa(HVwM&k!F7b{R?rJ729;ImJ04?Q3pA z^vj|?>|7`YvSQpjM>JxPIn?Q6-*s7I)i7wKC}HwN>iH^of~6_&(k3wrOOr);!M?)a zZDKgX(XWaP3e8W$!Hms*78C171fp}j_=(G3(u3bZOtPpA1s6mBw#yWAHJRLh*ED;0 z(;$9~upn_W)1mZ+7=gRru?PAMJ#`HeJ{7MJny%7oSnsI#g0UYUxQ9eOk|);ba&-z! zE&ij8ML6^mQQjLyzo%wyKz_0a!7E**77WLKBuW(7Ejjk|`(ICHaQQktRt5>D1g)Cq z?b-GdWPKs(pzj&6jA8O^QG=qyo1zBzHkSSb?W*vxC+^SSx6P~zZLf-BY2nrk99<&T zb9RgVpMcZ867@7z12_CA@|gC^P9<1!eCqcY1SAExm|RM2{R#zdNJB8LRBRILH!Mh( z_Hcar7ZELU#~+xPBt;SekCczfU2%tT$DdGmNqF`*mtr-!rsO!%>OY#c7={|s8KyXX zrylOY<&7c;hFlO{i+%>lr^N(F93wg5!e&ty+*eIMtm-3uORe97q8?HROuA&-Z=0yV zFeFOq#bCvYQh%tlLxf?=@=|?St}Qu!>hf66wpBxD-D7Nhw_1|pP{qf7w+C%8AY_{$ zGsCI?)mupm?a2EVJ;R~o4RV~s>*5O}g-m1^A0(wRCcv+%l!S}j(mcT=@VhIjWABTi zI>+{Pqwz;z}<wN2B>~Lu#lU;PXKj!O_ zAI&V%H{M(>nH&gMce~AnEC3P~N~<7wi%{-6Jdne;#bM*6Ei$W!`7NbLj`J5tN#uca z4QJPvSVyyec{$?(t0)c^+63K$9{<6sy8Z!{X04h zg9YoPxiaPOtOg|INU>0QT}-e&vzcHuF`>S+ieYXoQX)*cEUx8jk+_8XfOJ-t8dCxW zzUxI#taViSg2}b0jk=H@!2Kb5p8Om7=1V_wRu7}zkSR>Heos2d$$C-g@(G3ob>v_M zd#}h{;QM^J67)DF9bok_YKzPn95^O-#aQQKuV)+&^)2-XmycF9wq-YK~N zJAEQWsd9+q_^Y}-*a-aWqEt`F_I@P<$`&czvtuu&i`2v|l$bhLD3mQ#&Sw|S3uW17 zawG=6-_rc>VA7Yii(THNaE6PoN%I(M0!iPHtK9osse!)RlqD=Xb3rsq&5NIAx6?Fx zPyJ_D>gDT4;mSegmp%7LHcOq?xSsu6Gl=(BD`qDzjTfow?|5%-o}F;|Ifg@jm$q^i zhSD90*0mN;utBS|znc85U@al$4|2e&lKh=utsu*kd&B%?dLb0}$V)J}jx(G=R840? z@Hgd~>}l{lukXVHmfScSh&Z{YF7fF6 zkY7Xo6-pP$7OJDw_(D*fKed+eUl_^6SeBAp8ui&()u|huH`68`GEr z-;$FUMo7vQk}t?Z6v_rS%#@okwckObspPl?!7C{|7dMxid7*`NU@i!{BrSlQv*gP5 zOpl^Ze{>C&%LF8TDw}q91JD&KzszuDl01#Gf#A16{t*cz72zuZbSKFh&Vyb_9~LvK*UM8yRCtH zG7E#iO!<&DB1fZ5?2iHe*y6!}lkwLqS>rM>9c(0e4CN_?jrPl*ayAP5K9%pmvP5|f zWd1BiLu{Pf3TWt+VZt%#Rm?dkM=>@UQbx#>3?G)S3N{A(F3VdnWT_m=pg}#^7b#j) z;cP6VOpwcC#pCjif{g>eZ{+LH`mEFnGLz+%c;ExM2WR8K)7st^otD2<*+lUBkm!Jj zQu%E>b53q9*z*tFekJz1An)O9lGnxW2PmKbRS$D6+lVGZ+f&jpJ2q8d;I5{0fw#8G z*+7<%@#2?qUB=@7@pd3@Z-ymb$x}7Ch2*#v{BI2*xx@elEpN&v&gx8X^lbdcp%lH*=m8_EcKX_~ojd`rpk{j*PE`_;R&6Ya%j{j+hh zK{w~|o?3DFgpls2CB zkeLBu8)Ys96s2N6v#LUIHg`Y#73kM0HmX-3FG_jF-l+B=YTyqk7+gWTCS32MRA9?- zP&HA?@K!&?#n}qTjg%8{_c-Mu!`SDP&5W&lHNzT+g9j^b5?=<1+pYGHC@c@Sb4g@Y zv3lUov5GHoXef}}GkGbE zbZxe0ter6|Rw!e54a+i=_ZWV#OnI8K*RgD?a?EQl>Tn&D?NB0sEM;J?WM#h~GOTR3 za_r3$YZOCnLw0JLoi#et>(f9DZ_JJupU0peMDbw6VdW-E?OnT?t=n{PHBqKyU#eY` zr%s;q7kuxdj<>I8fGbQX%`QFYODVwiW6=8`GqdxiQ2I$fZURqvwN7g5qggO4Uiec? zlcFEw0B`Y}Oyz(ix0M_hM_`#BqkJ^}oT*`9juOIT;=LBcQCI;>JOWx|Mb&nd}fQ{#2oS zXEzjYQYypzw`p74>b&xyQ1*-r^MsCoSw8Ae2t`&1+g)lKeBqLk%=zA?saXwcKeobf;i?iPf#b9a>Pnd%#gZ~sm1F!obrgd|)z$ed z7ls9}+x7r~1~?w$m#E1U4=Xdx9%dc{|H3X}aV@o`VEK@s`83B?_0$gqdlw^peX7&e z;(+rSIvcCM$m}>IG;pngQs(>|N`urj5dVXc4AD*0K9D&<1VHi-br~#Zp(YVMmC!_O z^6=_T{H3Mpw27*un!GyJY@-$n;-i8?wB``qTV$q2M{AJ$BC#tsx~T?(4RNk;*fC9* zIH|q*DkGvQ<5#6N^FeP+k#a|R;ktGSTAPxZ%$Ftt4`s+*l2>^@X|hp_@EdCxfllIyA(PL5Tb z8taI2$Epj2{1H8R7E%_gT`*#l+Jn6K2ZdQ?D-Im+C z)FS$PT2N3x$Y;xLC>Clpud}ZXxPyn1)i1o^;4>_%r;lFlsuDwOnffOu#;atex|!k2YY8`mtWwXhFEDtqO3X5O*ZX#h z1MH_RV(>Ei;`0rC+M*lOs}j46F%7kJ0b5WV#;#yYs777&x~oRn_ZMSKGfiP=98rJg ztOR3PYVUA7@~+yMu`e;Ajg}{1cd$lr(!s7`M1=S6+V}td3L-jcO|ivk^#j%Z{Tq8u zQ8sm6rESZ%kcR4bh~KCV#@GXDn6U5o4n22ON@b|G<=$NSd+=~A1ETwCzL0mq2!@ES zR3C`1qTR!p`D&o|o@+QiQ1fTF=eYWv_rec2KUnL@G5Us@&Df8?+6(eeA8jnwKdnv_ z+is~++ICY`*>s0k&8BDjS>u_=p4$yG&Z(8SbR(}`S2*&iI$r*oAl<~QZdz|*sOKqq zYWhS8WB*V$G0sXcD@xNCL<>C=CNxSuu?cS%}*vg^+f?W51ZL`_?ua&{a2JVXt{<%{Y7%rB=!(nG&M)>5rHuFOzr zfNn`A+s58g(;?Yq_(6O{Z8c}V!sM;$#}JRYKNPCE3B^^Ml_8U9&qM4uU54bzT1W8R zp_RvwmKxARN!C(qUH^tz$(kmh`ZVp9{rB&fwMMJWVEo6L0Y^(U9ae>F2}s7xR#;Dn ztEWxY_<_znBuAN_?e^X*@X!4JVQ4O0$l!9=mNQ{52yn>x*&r?=>H=kE+~q1F)Z zHl`szAh7S7_b&{-s9q7^+gt?N8174# z5#Z?}RmRL}dOBsnG!UeL&>BcjNsvEA3x^F$w99zm08JnJq73;H=wkdaL&NB1TBdk4 z-IVPg6!4rdsvvplw`9z}(by`c^TPZW>~>abn}8ragYI1_rwQuP10nWB%>|jdw$8p$ zgZvk@aO^Nx%Tt;0Z_RzonF(cnS|Ln&iM+1#OU;+Tp3T}b;69_f;LJfa1;$R$)-emq z0yGzYs7M9LC%1u+Y?J+e*@ zluIocR}tcOI-?-^p0;as?{au^y&A%>-x6&PW95NHbQ%knYE1?6hnTOdK-fzTYHM-VYuW%sR1O<~o(<|cnpy|c^0+U9raP;Gxd+uqBCLwl_i*qx+7@!iXEX_- zRXU1GKB^LHCH8?X2AjHSoUL8?L*^dg0-k3eoL|`ae;sh2qvsZKz;DSok45ixKB3 z;9#2^?Ms=`{OX6b@sj&!pWe9Qur@`=m8hv;h^wXt;Gn;>4F0!bn|WPN6l3p1T{k3pz!+VqQ1|DFj*MP~Yp7L*mUX{P%9Z^Hrvy8kWg0R ztWlay9zEBkFN8@SYYLsmYMlgY3}um&e#e&A(_vBvnpV4OYqmOm(H1B~^IW;3xrJPh z;CL`)gWCE(A=}!V~VO{#mSL?k7)<7#tH zXp_)TkBzOpAWz+ADu?3s9vDTeI&t73K9S9J$ZCw&nv9jVVIo)J9V^d8uItiDgsvgwJ^ zXW_hw`eK!+MZcSJ-PGuwoiVmVPp81V&PastgND}1bKEnH z*TBM~h8;LeqXCv?7}F^a_{-3}gN%V#r!fI1C+cei(T*u+by_nP>91%+3KlHaM=`B$ zcEkRX@zJQXvi>d}IhSDnZs2Oo@apIaL#ERj#z)<4Z4eW4Kx#qD%^ zPtAuw+#g0X_RZAy3gRB)zO-+4*E6a>dYD*^y>s+^j15Ega$_;WD~z}$EQ~Tbv2BNS zg$+dZu6~!v&rw6eF?Wa&$>C;O{e2jcXw-zpC-hG+Cdt^#(LG1+<<%#p2GeqImY8it(FX(v4jbH^Dis8FNC2*+7x^<_5C=xL=@hHyo04e=+9&mnQ8(HLVt z(I=_Iy%t>5LxpTtaE;raV5|~pPpN^Bc~$Sj#$$qH(C#C4hF;l=24DGFpTXG#h>6q( zz^-6QDNY6(RXE;!O()y${z30g^kYmXeW?wmh=Hqtz7UIV=rtLUkTKo#H4kAep`|#4 zntcGO4PO6AufW(OOz^isyr@=y=nMLQoZs|!6nT*3DD`{j9My=}674{7wFr{_>n`bV*X~EXbKc%I0GScol$7}@+mwl8(lbi0hq@bgz-m=WJ(Lk zcOiMWeiB-BGN?-jp9&w{F=pai%UB}VG)(Gd%qQa<&|inb@%mN!j_H^bWnbL8g4M>* z6k{OEsbo-^HUsi2uwY0W8t*p()n2+BHodEDF4h!JpepT5?Aw~22_?2)JtDZlz)iPmsrRmOMV54&+F4+eT=aLU-1~Utr(0cEsaS+evukW zObuQambS_1Z`bcQaZnp$yI@HeuNdTF(d&37lC=+ey>EdHrUn$}8t#W0b0R@qZ1ayr z$7mcu`}K`Bu*UXoi7$ep6GjL|v~toJL}+VKi1WU;&Uo8e48ceAE;dSv5lv}P%iE^M zAz^$)m4`@X8@!x(`w`VGdg7|oyQqRI9m>^s`DK>bTG~m z5%9F8z|Gde4+tu`nS-zRN3}qzJ&$IBu~wCbQ4VQ71PM%Ab+G?X$#L8B@LFA)lH)JY zCmE8G_09O^9AmIuw3i>OKZ`WSx7pNVer^3ta5r^YY14T%jDAhmXi{A?YJ0Vmib-$i zzc38{%A#4;uEhA%MzjVKCK^Gst=(z#f$$HFSL}elm zl5fM(xrQ&f(hRcB^Pd`N#7)||TFo%+g7G|O+ab8Avo=JG(EH$=i^faDQDRIz<7tLu znD;n)i)adi4i6rfWdqjz#<<9clkz_eN!v4M$I@aYo2nsmnc>a9n?# z;zk+s#&L>wUcbnO(D@X|DDK43A+TG zo0K{u#Q$m}KfdzWYf%HQ_Z)zfI(nELHGQyaHS-X$kPzC{*o3t5(Q#Nou-S~WgOC!h zH9}7p7^I+*!;$=9)0BQuN3`w7C4N9yg6B9fay@7*Txz7BpA z*aXwFx~7GROU-i(1H#N3jOAk4b<;(KhUZN>2(8}Q{7Pc^I5)|p&}^3_{?kZ1yODP> zX`21hgVMcXaDT{k`^;>v{qwQ=tpT+biXFO}!HP6Sa-6zfSn!}6uoI{HZ2n$G0PQ#4 zyhq#?)qkjq`?;}7O22BO}{R9@C;WVA?j%k-~9`jy33593vLe72W zQ#gIFxxy~2`*(rmKka0D4R8vAhsXgCJCb&Dg{#ym7=DK5|I_SGEN7xwBFkfm<_m_H zhUO+)wNt&*j_T3)8O&c|hBF&i76+=+v}|w%nEx_eg~GXXdi5t04H(o~X|B(iV~&$# zIxfiTWH)6~E4*k!rE!wuaPx<4Cvls<1%vq{DiBjMm zUPwSTS`BT^m`k*;Hr07vavYC&csQ*m2-6D+yM;%kxnQ(2rh*|LKUjc+Y@3%c@IL74nparge_6lFi!P$_8}64 zf+bnv-(Q|tr~*L6&*r@=q*+VHXUpg3M%u=?_q_*s_j-&`&6|qu8*}w3p(b_ z?@gC|hbmOz6Kz$cBi^-i+G-CBXkdLGs%;_qkFiumo=V}gwmpK2_IB3hJcSdoUUoi> z?c%NX1oHv5#2JdsrdkDps!I}PQ|eJ^hDC>5zNr}%D8ZRyQ8|Pkkl8B0Uo)+K5SlCb z;`~Hwk)ZRM(uuqqMlG^@4Kl*el~x8b>2N~?*!pSS0y4H(H6e40<+KlQCn9dOB=Yv| zRzs+C#F`HD)`bF-8(a19=n-p?J#B~(%BW%uV^r^AK!j}d$3OF|4{5jCg=+a|z^&lW zE-TEwu_Bi3vZ5(+K1FraS7NMv=zQJkrbyH2Z3TOg2#55QR(E{rfJNox@d93MJ?^t;sVO7kk2-c}LSA*s8wwtek$!Q4>P-$@l`hpj7u z_9`iHq>K1Gi|Q6?K*}g03(xGP;@6jtTQgNw3u0FC0B9G-XX5J9Rz+Q!DLHo7l|b$A zhfgejF4IdhqAn7NLhpb)piL;Bsb}XicXBRSLa?Xqr!$mfw#FJIRtcv%xP(HT6!`=_ z@+$FX&8XJHSSi5ORHqQ=5Dg*WJZ;WGi3Z2QAFazOn}vICS<&8FI4Tm3timasx0v%+ zPGxXO^Nd=MSHh;kQN#HR#J5zR!iuuN}nr1Yd4Jm(Fxps}2Xh!FY79HgJI_V&{IaSl^ z12Hz#xq*m^UkqRLY2y5ej8;dNZ0KR&sb*G$(7O6$SlP_^IgYIC+{jrAEU9BwC*O-E zLY9WP8A}44H8>T^x&7@F%h@oyLB`vN)hK1W2JBJVlMi>logiz;Z z!P-EfVZ4mg{4_yFgW=y;A&{);5?nc}U!d)<^A|-~=U}>Ho&Bnr*xqy=tdDSxm%?`s zo{Ltb^Jgx%qP`-4{Z2I`58facA*lSVsE-JNRk0K)u3V+F*a2OgyNCco-*Q$1yPDW} zjuYEebc*T`LwC^Jp(0H6M-MNO@^>ZQ$BD>n^ z`8!hY!U{8;*Ew-t_F`a1l~Z_gj?mYKWGZzwPDx)EOv9l${B{`|0CK@sdVfQX~l6Ur`4*Njd4Y^TvrhmV`YX)*wt0TOj zr7y&N$;RU3!_E|;4iB?U&=2A&%5>J!&Sx(cu65E0L;uvG-b4odqSVBwmN+#oIh#wc9|n- zZClKjeOhyUB=tnab%JW+j_IL~C=b&QI!7=z_6eZlfPh}WOW!%`2sZw4kQ1H&S!RQr z_$bKd9|ifFt++{#g1qDWS!06OBcBdj9!=O1vXlH5{bSQOuT7^wLSxr)+~{_lq&E(H zd|qJ0G)1=aIRj+Ql^E;iL)}h&9Nx4i;CXd8{ZV)?J_^rk*BOt(tK~y;PR4c(eP%FY z*6F|`>2ZC=6Xx0AQGHHjC;Af|`JjO1Rokp{AV0&o9ik6&Iz8It{NVlwfJU&z{(0`J z`OY4YnCm3Qv7JwW?VH2B?l2F0>$*yz(Jx9Z+dsYM+hRThZ*&Gj{XVWwA@rmZApM#$ z3V)6Cu{cWvzw#7P3jeMUs|Dn>AJMxatO>?;vXzqrDMf6m?YdM|e72j9hf}3nOn-Gc zq-QxN0y%JBSk=KUtJqC0oD=OsoZF)R;Urr-t@oqmO=P-{m=Nk`^osc=ZW~d_rK$F z=A-dB>rs4fKZ?&gkFy`e=j$rfsIHG!tRhOw`rNp00Evc`(Z5p~U1aRU~HCb@dVN zc%Fjb&*)vcplH_@Heo9cLekGlU5GyE?2Gdox+tSQ1Th_bF5wpgUDdsJ9LAWgKF>3p zFvPXW8vu?x1YZ|>v~;!Csn&C4q$|No=ZL&iPr$kRk%sW@pp7RjEq0k)XS=(62>wX- z|2tR~cXQR`R7aMz)|unQ+KsbgQ1pcwcz@x8!o{ivR25arew1E$OmR*H0(k_R_j8@$ z>^*F}#d%iP+O2Qj@jf>G&AF4|-XX5O_UnvPyHdqo1HCYhFyzBslB!sw>2 Date: Tue, 26 Feb 2019 18:21:08 +0000 Subject: [PATCH 31/48] Minor change to dbfuzz2 that allows it to be compiled against older versions of SQLite. FossilOrigin-Name: 6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c082475ac2..7721fba7b0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\stest/fuzzdata8.db. -D 2019-02-26T17:52:44.425 +C Minor\schange\sto\sdbfuzz2\sthat\sallows\sit\sto\sbe\scompiled\sagainst\solder\sversions\nof\sSQLite. +D 2019-02-26T18:21:08.097 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -785,7 +785,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 29b6c6b39a701b6b5b08035c637674b76e1ecea515b1a184b29e3bd0f2d02dad F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 1065d6debd1003c70dccc498c54fd18f4e9da2a73943ba4a953be7dcaf4f724e +F test/dbfuzz2.c 9a6d58fc669e0881c89342a3ab408a98abd64cab9cb8a51cc85aeee9b96e398a F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1805,7 +1805,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 e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 -R a16512abbf69d78b036f59b691e0a9de +P 61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a +R 8a086356711bdae53b7d275ff93df2e6 U drh -Z 48cb44477903aa54b0e5eb2c3b8cff1f +Z 49f6be04f686338ed5b2d5276a561231 diff --git a/manifest.uuid b/manifest.uuid index 86dc56247b..05691b35c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a \ No newline at end of file +6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index caf39215e1..67aa88cbb5 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -183,7 +183,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE); x = szMax; +#ifdef SQLITE_FCNTL_SIZE_LIMIT sqlite3_file_control(db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); +#endif if( bVdbeDebug ){ sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0); } From 69e224f88adb337cb48ba3e432dcad0e43434bce Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 26 Feb 2019 19:16:49 +0000 Subject: [PATCH 32/48] Reformat the white-space in a few test cases so that the tests work with Tcl 8.6.9. FossilOrigin-Name: 29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 --- ext/session/sessionB.test | 3 +-- manifest | 18 +++++++++--------- manifest.uuid | 2 +- test/fts3expr4.test | 2 +- test/scanstatus.test | 2 +- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/ext/session/sessionB.test b/ext/session/sessionB.test index eae41f76ad..2c103d5e36 100644 --- a/ext/session/sessionB.test +++ b/ext/session/sessionB.test @@ -258,8 +258,7 @@ do_patchconcat_test 4.3.3 { INSERT INTO t2 VALUES('a', 'a', 'a', 'a'); } { DELETE FROM t2 WHERE c = 'a'; -} { -} +} {} # INSERT + UPDATE do_patchconcat_test 4.3.4 { diff --git a/manifest b/manifest index 7721fba7b0..dc02c7c9b6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schange\sto\sdbfuzz2\sthat\sallows\sit\sto\sbe\scompiled\sagainst\solder\sversions\nof\sSQLite. -D 2019-02-26T18:21:08.097 +C Reformat\sthe\swhite-space\sin\sa\sfew\stest\scases\sso\sthat\sthe\stests\swork\swith\sTcl\s8.6.9. +D 2019-02-26T19:16:49.866 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -411,7 +411,7 @@ F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26 F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f -F ext/session/sessionB.test 886252dcb7e692e62ef7e357456200912e367823 +F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724 F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d @@ -930,7 +930,7 @@ F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c77e526 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 -F test/fts3expr4.test cac5dd815fe6b5921741abdccdde3b7f50b86394de91e13308ee7986859c4a9f +F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 @@ -1251,7 +1251,7 @@ F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7 F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 -F test/scanstatus.test d14842d0a2757ee059bcffa365746453d60952ba1077980c9a348a9fefbd232a +F test/scanstatus.test 874e35011779b07725a47dbf1dd6282b0ca04af7e028fb0b534ee544b571be42 F test/schema.test 8f7999be894260f151adf15c2c7540f1c6d6a481 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 @@ -1805,7 +1805,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 61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a -R 8a086356711bdae53b7d275ff93df2e6 -U drh -Z 49f6be04f686338ed5b2d5276a561231 +P 6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 +R 671879425f3f9b82caeef04f70c245b6 +U dan +Z 7bb0b1b162b8573d979a1b96ab7f58d3 diff --git a/manifest.uuid b/manifest.uuid index 05691b35c1..92063a1f4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 \ No newline at end of file +29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 \ No newline at end of file diff --git a/test/fts3expr4.test b/test/fts3expr4.test index 1bf039e55f..4a6bd293c4 100644 --- a/test/fts3expr4.test +++ b/test/fts3expr4.test @@ -68,7 +68,7 @@ do_icu_expr_test 3.2 {*lOl* *h4h*} { AND {AND {AND {PHRASE 3 0 *} {PHRASE 3 0 lol+}} {PHRASE 3 0 *}} {PHRASE 3 0 h4h+} } -do_simple_expr_test 3.3 { * } { } +do_simple_expr_test 3.3 { * } {} do_simple_expr_test 3.4 { *a } { PHRASE 3 0 a } do_simple_expr_test 3.5 { a*b } { AND {PHRASE 3 0 a+} {PHRASE 3 0 b} } do_simple_expr_test 3.6 { *a*b } { AND {PHRASE 3 0 a+} {PHRASE 3 0 b} } diff --git a/test/scanstatus.test b/test/scanstatus.test index 778a0c911e..1b92ef3fe1 100644 --- a/test/scanstatus.test +++ b/test/scanstatus.test @@ -254,7 +254,7 @@ do_execsql_test 4.0 { } do_execsql_test 4.1.1 { INSERT INTO t1 VALUES(1, 2, 3); } -do_scanstatus_test 4.1.2 { } +do_scanstatus_test 4.1.2 {} do_execsql_test 4.2 { CREATE TABLE p1(x PRIMARY KEY); From f26b1453855dc4d651b59239ef39b43e9447ab15 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 27 Feb 2019 15:26:03 +0000 Subject: [PATCH 33/48] Verify that fts5 auxiliary functions cannot be used in aggregate queries. FossilOrigin-Name: 122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 --- ext/fts5/test/fts5aux.test | 31 +++++++++++++++++++++++++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/ext/fts5/test/fts5aux.test b/ext/fts5/test/fts5aux.test index 0216b52539..561067c4bc 100644 --- a/ext/fts5/test/fts5aux.test +++ b/ext/fts5/test/fts5aux.test @@ -275,6 +275,37 @@ do_execsql_test 9.3 { 9 10 } +#------------------------------------------------------------------------- +# Test that aux. functions may not be used in aggregate queries. +# +reset_db +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE t1 USING fts5(x, y, z); + INSERT INTO t1 VALUES('a', 'one two', 1); + INSERT INTO t1 VALUES('b', 'two three', 2); + INSERT INTO t1 VALUES('c', 'three four', 1); + INSERT INTO t1 VALUES('d', 'four five', 2); + INSERT INTO t1 VALUES('e', 'five six', 1); + INSERT INTO t1 VALUES('f', 'six seven', 2); +} +proc firstcol {cmd} { $cmd xColumnText 0 } +sqlite3_fts5_create_function db firstcol firstcol + +do_execsql_test 10.1.1 { + SELECT firstcol(t1) FROM t1 +} {a b c d e f} +do_execsql_test 10.1.2 { + SELECT group_concat(x, '.') FROM t1 +} {a.b.c.d.e.f} + +do_catchsql_test 10.1.3 { + SELECT group_concat(firstcol(t1), '.') FROM t1 +} {1 {unable to use function firstcol in the requested context}} + +do_catchsql_test 10.1.4 { + SELECT group_concat(firstcol(t1), '.') FROM t1 GROUP BY rowid +} {1 {unable to use function firstcol in the requested context}} finish_test + diff --git a/manifest b/manifest index dc02c7c9b6..91e378ed90 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reformat\sthe\swhite-space\sin\sa\sfew\stest\scases\sso\sthat\sthe\stests\swork\swith\sTcl\s8.6.9. -D 2019-02-26T19:16:49.866 +C Verify\sthat\sfts5\sauxiliary\sfunctions\scannot\sbe\sused\sin\saggregate\squeries. +D 2019-02-27T15:26:03.846 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -142,7 +142,7 @@ F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60 F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 -F ext/fts5/test/fts5aux.test 8e7f9c96f8570f48402f2fd7b74e1ccfadd319fa56ef677321880000f9739846 +F ext/fts5/test/fts5aux.test ebf6f2ff7cb556e83f66991b7f12bff016d3c83d4eab36704b649dd6b1437318 F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f24137eb1fc079e7611 F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 @@ -1805,7 +1805,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 6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 -R 671879425f3f9b82caeef04f70c245b6 +P 29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 +R 71be3f9cadb3d3db22b5f61c5be60610 U dan -Z 7bb0b1b162b8573d979a1b96ab7f58d3 +Z a18dd99afd6d91ff1d4c6dbed66d97ea diff --git a/manifest.uuid b/manifest.uuid index 92063a1f4e..042a028add 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 \ No newline at end of file +122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 \ No newline at end of file From 89d249364e4cdee732374cfdf2966b17bc3fe44a Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 27 Feb 2019 16:38:19 +0000 Subject: [PATCH 34/48] Add the "-returntype" option to the "db function" Tcl method. FossilOrigin-Name: 789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 --- manifest | 14 +++---- manifest.uuid | 2 +- src/tclsqlite.c | 98 ++++++++++++++++++++++++++++++++++----------- test/tclsqlite.test | 77 +++++++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 91e378ed90..331c3ed6ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Verify\sthat\sfts5\sauxiliary\sfunctions\scannot\sbe\sused\sin\saggregate\squeries. -D 2019-02-27T15:26:03.846 +C Add\sthe\s"-returntype"\soption\sto\sthe\s"db\sfunction"\sTcl\smethod. +D 2019-02-27T16:38:19.320 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -524,7 +524,7 @@ F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c 6b19e7562195aaf881f3e35e2472dc01ae3cb156961db5126c3d616744729b7e +F src/tclsqlite.c de81c50e5112a8106da871b4d2dfef7748fe7625e148f85cc89ec7499b8e4de5 F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1366,7 +1366,7 @@ F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test dca8aa30d84175e7d8c8fc43d3ffa11fa56e23fbdac2679d03833a0f326edf34 +F test/tclsqlite.test 0037c0ca7fd3da08202a807f7b76590019841edb9f459fcfcf52aed7212bf853 F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 2479226e4cb96f4c663eccd2d12c077cf6bda29ca5cc69a8a58a06127105dd62 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1805,7 +1805,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 29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 -R 71be3f9cadb3d3db22b5f61c5be60610 +P 122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 +R 4166c9e01ccb9a254eef55033738e8bf U dan -Z a18dd99afd6d91ff1d4c6dbed66d97ea +Z f227401976c706870557af555984f5d5 diff --git a/manifest.uuid b/manifest.uuid index 042a028add..a8da48124d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 \ No newline at end of file +789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index eb3bedf9d4..1b0086c7d5 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -93,6 +93,14 @@ typedef struct SqliteDb SqliteDb; /* ** New SQL functions can be created as TCL scripts. Each such function ** is described by an instance of the following structure. +** +** Variable eType may be set to SQLITE_INTEGER, SQLITE_FLOAT, SQLITE_TEXT, +** SQLITE_BLOB or SQLITE_NULL. If it is SQLITE_NULL, then the implementation +** attempts to determine the type of the result based on the Tcl object. +** If it is SQLITE_TEXT or SQLITE_BLOB, then a text (sqlite3_result_text()) +** or blob (sqlite3_result_blob()) is returned. If it is SQLITE_INTEGER +** or SQLITE_FLOAT, then an attempt is made to return an integer or float +** value, falling back to float and then text if this is not possible. */ typedef struct SqlFunc SqlFunc; struct SqlFunc { @@ -100,6 +108,7 @@ struct SqlFunc { Tcl_Obj *pScript; /* The Tcl_Obj representation of the script */ SqliteDb *pDb; /* Database connection that owns this function */ int useEvalObjv; /* True if it is safe to use Tcl_EvalObjv */ + int eType; /* Type of value to return */ char *zName; /* Name of this function */ SqlFunc *pNext; /* Next function on the list of them all */ }; @@ -995,27 +1004,54 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){ u8 *data; const char *zType = (pVar->typePtr ? pVar->typePtr->name : ""); char c = zType[0]; - if( c=='b' && strcmp(zType,"bytearray")==0 && pVar->bytes==0 ){ - /* Only return a BLOB type if the Tcl variable is a bytearray and - ** has no string representation. */ - data = Tcl_GetByteArrayFromObj(pVar, &n); - sqlite3_result_blob(context, data, n, SQLITE_TRANSIENT); - }else if( c=='b' && strcmp(zType,"boolean")==0 ){ - Tcl_GetIntFromObj(0, pVar, &n); - sqlite3_result_int(context, n); - }else if( c=='d' && strcmp(zType,"double")==0 ){ - double r; - Tcl_GetDoubleFromObj(0, pVar, &r); - sqlite3_result_double(context, r); - }else if( (c=='w' && strcmp(zType,"wideInt")==0) || - (c=='i' && strcmp(zType,"int")==0) ){ - Tcl_WideInt v; - Tcl_GetWideIntFromObj(0, pVar, &v); - sqlite3_result_int64(context, v); - }else{ - data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n); - sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT); + int eType = p->eType; + + if( eType==SQLITE_NULL ){ + if( c=='b' && strcmp(zType,"bytearray")==0 && pVar->bytes==0 ){ + /* Only return a BLOB type if the Tcl variable is a bytearray and + ** has no string representation. */ + eType = SQLITE_BLOB; + }else if( (c=='b' && strcmp(zType,"boolean")==0) + || (c=='w' && strcmp(zType,"wideInt")==0) + || (c=='i' && strcmp(zType,"int")==0) + ){ + eType = SQLITE_INTEGER; + }else if( c=='d' && strcmp(zType,"double")==0 ){ + eType = SQLITE_FLOAT; + }else{ + eType = SQLITE_TEXT; + } } + + switch( eType ){ + case SQLITE_BLOB: { + data = Tcl_GetByteArrayFromObj(pVar, &n); + sqlite3_result_blob(context, data, n, SQLITE_TRANSIENT); + break; + } + case SQLITE_INTEGER: { + Tcl_WideInt v; + if( TCL_OK==Tcl_GetWideIntFromObj(0, pVar, &v) ){ + sqlite3_result_int64(context, v); + break; + } + /* fall-through */ + } + case SQLITE_FLOAT: { + double r; + if( TCL_OK==Tcl_GetDoubleFromObj(0, pVar, &r) ){ + sqlite3_result_double(context, r); + break; + } + /* fall-through */ + } + default: { + data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n); + sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT); + break; + } + } + } } @@ -2646,6 +2682,7 @@ deserialize_error: char *zName; int nArg = -1; int i; + int eType = SQLITE_NULL; if( objc<4 ){ Tcl_WrongNumArgs(interp, 2, objv, "NAME ?SWITCHES? SCRIPT"); return TCL_ERROR; @@ -2653,7 +2690,7 @@ deserialize_error: for(i=3; i<(objc-1); i++){ const char *z = Tcl_GetString(objv[i]); int n = strlen30(z); - if( n>2 && strncmp(z, "-argcount",n)==0 ){ + if( n>1 && strncmp(z, "-argcount",n)==0 ){ if( i==(objc-2) ){ Tcl_AppendResult(interp, "option requires an argument: ", z,(char*)0); return TCL_ERROR; @@ -2666,11 +2703,25 @@ deserialize_error: } i++; }else - if( n>2 && strncmp(z, "-deterministic",n)==0 ){ + if( n>1 && strncmp(z, "-deterministic",n)==0 ){ flags |= SQLITE_DETERMINISTIC; + }else + if( n>1 && strncmp(z, "-returntype", n)==0 ){ + const char *azType[] = {"integer", "real", "text", "blob", "any", 0}; + assert( SQLITE_INTEGER==1 && SQLITE_FLOAT==2 && SQLITE_TEXT==3 ); + assert( SQLITE_BLOB==4 && SQLITE_NULL==5 ); + if( i==(objc-2) ){ + Tcl_AppendResult(interp, "option requires an argument: ", z,(char*)0); + return TCL_ERROR; + } + i++; + if( Tcl_GetIndexFromObj(interp, objv[i], azType, "type", 0, &eType) ){ + return TCL_ERROR; + } + eType++; }else{ Tcl_AppendResult(interp, "bad option \"", z, - "\": must be -argcount or -deterministic", (char*)0 + "\": must be -argcount, -deterministic or -returntype", (char*)0 ); return TCL_ERROR; } @@ -2686,6 +2737,7 @@ deserialize_error: pFunc->pScript = pScript; Tcl_IncrRefCount(pScript); pFunc->useEvalObjv = safeToUseEvalObjv(interp, pScript); + pFunc->eType = eType; rc = sqlite3_create_function(pDb->db, zName, nArg, flags, pFunc, tclSqlFunc, 0, 0); if( rc!=SQLITE_OK ){ diff --git a/test/tclsqlite.test b/test/tclsqlite.test index 36063bc46d..4a674a8f24 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -21,6 +21,7 @@ catch {sqlite3} set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix tcl # Check the error messages generated by tclsqlite # @@ -711,8 +712,84 @@ do_test tcl-16.103 { set res } {1 {a b *} 2 {a *} 3 {a b *}} +#------------------------------------------------------------------------- +# Test the -type option to [db function]. +# +reset_db +proc add {a b} { return [expr $a + $b] } +proc ret {a} { return $a } +db function add_i -returntype integer add +db function add_r -ret real add +db function add_t -return text add +db function add_b -returntype blob add +db function add_a -returntype any add +db function ret_i -returntype int ret +db function ret_r -returntype real ret +db function ret_t -returntype text ret +db function ret_b -returntype blob ret +db function ret_a -r any ret +do_execsql_test 17.0 { + SELECT quote( add_i(2, 3) ); + SELECT quote( add_r(2, 3) ); + SELECT quote( add_t(2, 3) ); + SELECT quote( add_b(2, 3) ); + SELECT quote( add_a(2, 3) ); +} {5 5.0 '5' X'35' 5} + +do_execsql_test 17.1 { + SELECT quote( add_i(2.2, 3.3) ); + SELECT quote( add_r(2.2, 3.3) ); + SELECT quote( add_t(2.2, 3.3) ); + SELECT quote( add_b(2.2, 3.3) ); + SELECT quote( add_a(2.2, 3.3) ); +} {5.5 5.5 '5.5' X'352E35' 5.5} + +do_execsql_test 17.2 { + SELECT quote( ret_i(2.5) ); + SELECT quote( ret_r(2.5) ); + SELECT quote( ret_t(2.5) ); + SELECT quote( ret_b(2.5) ); + SELECT quote( ret_a(2.5) ); +} {2.5 2.5 '2.5' X'322E35' 2.5} + +do_execsql_test 17.3 { + SELECT quote( ret_i('2.5') ); + SELECT quote( ret_r('2.5') ); + SELECT quote( ret_t('2.5') ); + SELECT quote( ret_b('2.5') ); + SELECT quote( ret_a('2.5') ); +} {2.5 2.5 '2.5' X'322E35' '2.5'} + +do_execsql_test 17.4 { + SELECT quote( ret_i('abc') ); + SELECT quote( ret_r('abc') ); + SELECT quote( ret_t('abc') ); + SELECT quote( ret_b('abc') ); + SELECT quote( ret_a('abc') ); +} {'abc' 'abc' 'abc' X'616263' 'abc'} + +do_execsql_test 17.5 { + SELECT quote( ret_i(X'616263') ); + SELECT quote( ret_r(X'616263') ); + SELECT quote( ret_t(X'616263') ); + SELECT quote( ret_b(X'616263') ); + SELECT quote( ret_a(X'616263') ); +} {'abc' 'abc' 'abc' X'616263' X'616263'} + +do_test 17.6.1 { + list [catch { db function xyz -return object ret } msg] $msg +} {1 {bad type "object": must be integer, real, text, blob, or any}} + +do_test 17.6.2 { + list [catch { db function xyz -return ret } msg] $msg +} {1 {option requires an argument: -return}} + +do_test 17.6.3 { + list [catch { db function xyz -n object ret } msg] $msg +} {1 {bad option "-n": must be -argcount, -deterministic or -returntype}} finish_test + From 03199343222fdf2db1ee4b264e79e52d251eb483 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 Feb 2019 19:59:56 +0000 Subject: [PATCH 35/48] Fix the readfile() UDF so that it returns an empty BLOB, not an OOM error, when reading an empty file. FossilOrigin-Name: 0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb --- ext/misc/fileio.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index b15e0fda1b..255a4fa2e7 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -152,13 +152,13 @@ static void readFileContents(sqlite3_context *ctx, const char *zName){ fclose(in); return; } - pBuf = sqlite3_malloc64( nIn ); + pBuf = sqlite3_malloc64( nIn ? nIn : 1 ); if( pBuf==0 ){ sqlite3_result_error_nomem(ctx); fclose(in); return; } - if( 1==fread(pBuf, nIn, 1, in) ){ + if( nIn==fread(pBuf, 1, nIn, in) ){ sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); }else{ sqlite3_result_error_code(ctx, SQLITE_IOERR); diff --git a/manifest b/manifest index 331c3ed6ec..1a05243c1a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"-returntype"\soption\sto\sthe\s"db\sfunction"\sTcl\smethod. -D 2019-02-27T16:38:19.320 +C Fix\sthe\sreadfile()\sUDF\sso\sthat\sit\sreturns\san\sempty\sBLOB,\snot\san\sOOM\serror,\nwhen\sreading\san\sempty\sfile. +D 2019-02-27T19:59:56.536 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -285,7 +285,7 @@ F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ce F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 +F ext/misc/fileio.c e7864c391e14ccaf73ee4b22f5a55c1eb40ecc93a7f5ee77a1b41b87367ec7ae F ext/misc/fossildelta.c 3cc9a9b2f39889b43cd176c19f286bc7dd652f4c202c202d008481252d820316 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c @@ -1805,7 +1805,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 122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 -R 4166c9e01ccb9a254eef55033738e8bf -U dan -Z f227401976c706870557af555984f5d5 +P 789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 +R 8430a5ae199ad097ee7aa582e73883cd +U drh +Z 4cf753a6552dd62b27fdf5e7f3a478a4 diff --git a/manifest.uuid b/manifest.uuid index a8da48124d..0a8e027f6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 \ No newline at end of file +0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb \ No newline at end of file From 8e0f794d17e110e145466d99fb8b106ac7ca30fe Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 Feb 2019 23:05:14 +0000 Subject: [PATCH 36/48] Enable the LIKE optimization when the ESCAPE keyword is present and the PRAGMA case_sensitive_like pragma is ON. FossilOrigin-Name: 6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/func.c | 4 ++++ test/like3.test | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1a05243c1a..c9649035b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sreadfile()\sUDF\sso\sthat\sit\sreturns\san\sempty\sBLOB,\snot\san\sOOM\serror,\nwhen\sreading\san\sempty\sfile. -D 2019-02-27T19:59:56.536 +C Enable\sthe\sLIKE\soptimization\swhen\sthe\sESCAPE\skeyword\sis\spresent\sand\sthe\nPRAGMA\scase_sensitive_like\spragma\sis\sON. +D 2019-02-27T23:05:14.316 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -470,7 +470,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c f2d0ecf68213770be4fad83128ce02e67667deebaa0a44061313f7e4f2a4ae28 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 -F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 +F src/func.c 2ccf4ae12430b1ae7096be5f0675887e1bd0732828af0ac0f7496339b7c6edee F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -1081,7 +1081,7 @@ F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 F test/like.test 11cfd7d4ef8625389df9efc46735ff0b0b41d5e62047ef0f3bc24c380d28a7a6 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test 430691e6057e11a59e934be74c06b85605b80061d45af5714d52886a811efeb7 +F test/like3.test 0ce2630e39e32e42ce02d171f0a315189ca71fec37c5ddfb0191eecc3fe9d4da F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 @@ -1805,7 +1805,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 789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 -R 8430a5ae199ad097ee7aa582e73883cd +P 0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb +R 5105eecccd0b13c8698eaccb6e160d90 U drh -Z 4cf753a6552dd62b27fdf5e7f3a478a4 +Z 96b31332bdac2a0724df8a5af90860de diff --git a/manifest.uuid b/manifest.uuid index 0a8e027f6d..f38f308993 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb \ No newline at end of file +6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 8b1d4416a4..03595b70d2 100644 --- a/src/func.c +++ b/src/func.c @@ -1806,6 +1806,10 @@ static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){ if( ALWAYS(pDef) ){ pDef->funcFlags |= flagVal; } + pDef = sqlite3FindFunction(db, zName, 3, SQLITE_UTF8, 0); + if( pDef ){ + pDef->funcFlags |= flagVal; + } } /* diff --git a/test/like3.test b/test/like3.test index 575faaf104..622f8335eb 100644 --- a/test/like3.test +++ b/test/like3.test @@ -178,4 +178,56 @@ do_eqp_test like3-5.211 { `--SEARCH TABLE t5b USING COVERING INDEX sqlite_autoindex_t5b_1 (x>? AND x? AND path? AND path? AND path? AND path? AND path? AND path Date: Thu, 28 Feb 2019 13:21:36 +0000 Subject: [PATCH 37/48] Add an "|| CORRUPT_DB" term to an assert() statement in the btree defragmenter. FossilOrigin-Name: 6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 1010688 -> 1013760 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c9649035b7..2d22cfef55 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sthe\sLIKE\soptimization\swhen\sthe\sESCAPE\skeyword\sis\spresent\sand\sthe\nPRAGMA\scase_sensitive_like\spragma\sis\sON. -D 2019-02-27T23:05:14.316 +C Add\san\s"||\sCORRUPT_DB"\sterm\sto\san\sassert()\sstatement\sin\sthe\sbtree\sdefragmenter. +D 2019-02-28T13:21:36.882 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -456,7 +456,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c f85f8abe99ec3e72671f0fc9b09114188974fe0b9a3ea9edc77977e853ff75e9 +F src/btree.c 59695c6e5eb527bfefc2b3d8ffebd178ad8686eaeb810c9f57719d6d2b72822e F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 2328494c8c0c18d95e5e04b05cc6dd94bc6b5baf9641fc36b1e881619b897b54 +F test/fuzzdata8.db 91d6b30312ae7661d8b772314f51759a8a4c565957b25e16cdb9109f89624423 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1805,7 +1805,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 0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb -R 5105eecccd0b13c8698eaccb6e160d90 +P 6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 +R 4025c666f5821a2daa8fcb5b9013eca1 U drh -Z 96b31332bdac2a0724df8a5af90860de +Z a4ece4dce331064a24f4679f8d9a11f2 diff --git a/manifest.uuid b/manifest.uuid index f38f308993..65fb11bfb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 \ No newline at end of file +6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9e7a9c0426..d133395659 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1421,7 +1421,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ hdr = pPage->hdrOffset; cellOffset = pPage->cellOffset; nCell = pPage->nCell; - assert( nCell==get2byte(&data[hdr+3]) ); + assert( nCell==get2byte(&data[hdr+3]) || CORRUPT_DB ); iCellFirst = cellOffset + 2*nCell; usableSize = pPage->pBt->usableSize; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 8ebedd1d765978c511fcf38d6c4f6727bdc928b7..8b1cf405720ed53761b5d0251da7d810a84c5406 100644 GIT binary patch delta 15350 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 Q9o%Qwnne2r=kX8!5Bz~6sQ>@~ delta 14994 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 Date: Thu, 28 Feb 2019 13:41:35 +0000 Subject: [PATCH 38/48] Avoid an assert() failure and an undefined left-shift operation in the fts3 snippet() function that could occur if the database was corrupt. FossilOrigin-Name: d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 --- ext/fts3/fts3_snippet.c | 2 +- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 220 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 230 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 58a71d2dd6..1a04b71927 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -429,7 +429,7 @@ static void fts3SnippetDetails( char *pCsr = pPhrase->pTail; int iCsr = pPhrase->iTail; - while( iCsr<(iStart+pIter->nSnippet) ){ + while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ int j; u64 mPhrase = (u64)1 << i; u64 mPos = (u64)1 << (iCsr - iStart); diff --git a/manifest b/manifest index 2d22cfef55..c39a4e9d9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\s"||\sCORRUPT_DB"\sterm\sto\san\sassert()\sstatement\sin\sthe\sbtree\sdefragmenter. -D 2019-02-28T13:21:36.882 +C Avoid\san\sassert()\sfailure\sand\san\sundefined\sleft-shift\soperation\sin\sthe\sfts3\ssnippet()\sfunction\sthat\scould\soccur\sif\sthe\sdatabase\swas\scorrupt. +D 2019-02-28T13:41:35.509 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -89,7 +89,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 d002c29d3e71c15b27326b818c1e49a4d0d5fc342cc8e9522e2bf2a3077c75a2 +F ext/fts3/fts3_snippet.c 0d8362efa59637dc7c09dc88899eb072aa409fe1e0d0fdeda55ec1e562c50310 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -919,7 +919,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 8733b9589701df24cf5f35ed36fec865edd67f24961f24ac69d751b4221494f7 +F test/fts3corrupt4.test 3f2b9abb5b2fcabb51da09a5956c292e8fc2bf2c27e1f2b86f313e8e232b5bff F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1805,7 +1805,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 6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 -R 4025c666f5821a2daa8fcb5b9013eca1 -U drh -Z a4ece4dce331064a24f4679f8d9a11f2 +P 6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 +R ec544e5efe12bbc6177aac59b37c5a1c +U dan +Z d16afbf29591bc852a3e6830b1d24630 diff --git a/manifest.uuid b/manifest.uuid index 65fb11bfb3..6989a978b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 \ No newline at end of file +d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index d200c95fa9..27b42cb965 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -3476,6 +3476,226 @@ do_catchsql_test 21.1 { SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'R*'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 22.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-b794c89d922ac9.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 61 6c 65 74 31 5f 73 65 67 64 69 72 .5taalet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 84 65 6e 74 74 31 5f 63 6f 6e 74 1_con.entt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 49 53 35 20 45 4e 41 42 4c 45 20 MEMSIS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 26 0f READSAFE=0.$..&. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 55 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LU RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 19 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE.FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4e f5 20 46 54 53 34 ..#..ENABN. FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 41 53 ...1..ENABLE DAS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 ab 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 48 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d HRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 43 49 4e 41 52 59 27 20160609XCINARY' +| 4016: 02 04 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 d4 01 02 ff 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 64 d3 09 01 03 ..........gd.... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 19 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 12 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 07 80 00 f3 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| end crash-b794c89d922ac9.db +}]} {} + +do_catchsql_test 22.1 { + SELECT snippet(t1,'', '', '--',-1,01)==0 + FROM t1 WHERE a MATCH 'rtree OR json1rtree OR json1'; +} {0 {0 0 0 0 0 0 0}} finish_test From 4ddf7f42115eb93c489f966e035dec00af57aa39 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 Feb 2019 14:09:14 +0000 Subject: [PATCH 39/48] New test case loaded into test/fuzzdata8.db. FossilOrigin-Name: 00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1013760 -> 1021952 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c39a4e9d9c..baa5726857 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\san\sassert()\sfailure\sand\san\sundefined\sleft-shift\soperation\sin\sthe\sfts3\ssnippet()\sfunction\sthat\scould\soccur\sif\sthe\sdatabase\swas\scorrupt. -D 2019-02-28T13:41:35.509 +C New\stest\scase\sloaded\sinto\stest/fuzzdata8.db. +D 2019-02-28T14:09:14.893 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 91d6b30312ae7661d8b772314f51759a8a4c565957b25e16cdb9109f89624423 +F test/fuzzdata8.db bcdd2175b8876c3679aa1c00874a9f69368f464e498f800d3917bd74a0563127 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1805,7 +1805,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 6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 -R ec544e5efe12bbc6177aac59b37c5a1c -U dan -Z d16afbf29591bc852a3e6830b1d24630 +P d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 +R 76ee1637810bdaf539a762a9c646979d +U drh +Z ac7f7b28caabfd1523a4f739ee67d612 diff --git a/manifest.uuid b/manifest.uuid index 6989a978b4..cba481dcd3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 \ No newline at end of file +00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 8b1cf405720ed53761b5d0251da7d810a84c5406..230960b9d9e2b144b800e203900d61bce23e5e56 100644 GIT binary patch delta 10610 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 delta 9937 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 Date: Thu, 28 Feb 2019 17:29:19 +0000 Subject: [PATCH 40/48] Add the new "bind_fallback" method to the "sqlite3" object in the TCL interface. FossilOrigin-Name: c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 --- manifest | 14 ++--- manifest.uuid | 2 +- src/tclsqlite.c | 127 ++++++++++++++++++++++++++++++++++---------- test/tclsqlite.test | 59 +++++++++++++++++++- 4 files changed, 164 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index baa5726857..4f2d856111 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sloaded\sinto\stest/fuzzdata8.db. -D 2019-02-28T14:09:14.893 +C Add\sthe\snew\s"bind_fallback"\smethod\sto\sthe\s"sqlite3"\sobject\sin\sthe\sTCL\ninterface. +D 2019-02-28T17:29:19.212 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -524,7 +524,7 @@ F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c de81c50e5112a8106da871b4d2dfef7748fe7625e148f85cc89ec7499b8e4de5 +F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1366,7 +1366,7 @@ F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 0037c0ca7fd3da08202a807f7b76590019841edb9f459fcfcf52aed7212bf853 +F test/tclsqlite.test 5a06962d8f18edf4703931f6b7dacd83678d02fa5c8ced9a7958c007ad58626a F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 2479226e4cb96f4c663eccd2d12c077cf6bda29ca5cc69a8a58a06127105dd62 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1805,7 +1805,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 d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 -R 76ee1637810bdaf539a762a9c646979d +P 00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 +R 448ca78435be9ef8ac1ee1c7bdd459a0 U drh -Z ac7f7b28caabfd1523a4f739ee67d612 +Z 8dd6bd727b5289a2522f6d5168203921 diff --git a/manifest.uuid b/manifest.uuid index cba481dcd3..2283367472 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 \ No newline at end of file +c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 1b0086c7d5..a78d5676c7 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -159,6 +159,7 @@ struct SqliteDb { char *zTraceV2; /* The trace_v2 callback routine */ char *zProfile; /* The profile callback routine */ char *zProgress; /* The progress callback routine */ + char *zBindFallback; /* Callback to invoke on a binding miss */ char *zAuth; /* The authorization callback routine */ int disableAuth; /* Disable the authorizer if it exists */ char *zNull; /* Text to substitute for an SQL NULL value */ @@ -549,6 +550,9 @@ static void SQLITE_TCLAPI DbDeleteCmd(void *db){ if( pDb->zProfile ){ Tcl_Free(pDb->zProfile); } + if( pDb->zBindFallback ){ + Tcl_Free(pDb->zBindFallback); + } if( pDb->zAuth ){ Tcl_Free(pDb->zAuth); } @@ -1301,6 +1305,8 @@ static int dbPrepareAndBind( int iParm = 0; /* Next free entry in apParm */ char c; int i; + int needResultReset = 0; /* Need to invoke Tcl_ResetResult() */ + int rc = SQLITE_OK; /* Value to return */ Tcl_Interp *interp = pDb->interp; *ppPreStmt = 0; @@ -1388,6 +1394,25 @@ static int dbPrepareAndBind( const char *zVar = sqlite3_bind_parameter_name(pStmt, i); if( zVar!=0 && (zVar[0]=='$' || zVar[0]==':' || zVar[0]=='@') ){ Tcl_Obj *pVar = Tcl_GetVar2Ex(interp, &zVar[1], 0, 0); + if( pVar==0 && pDb->zBindFallback!=0 ){ + Tcl_Obj *pCmd; + int rx; + pCmd = Tcl_NewStringObj(pDb->zBindFallback, -1); + Tcl_IncrRefCount(pCmd); + Tcl_ListObjAppendElement(interp, pCmd, Tcl_NewStringObj(zVar,-1)); + if( needResultReset ) Tcl_ResetResult(interp); + needResultReset = 1; + rx = Tcl_EvalObjEx(interp, pCmd, TCL_EVAL_DIRECT); + Tcl_DecrRefCount(pCmd); + if( rx==TCL_OK ){ + pVar = Tcl_GetObjResult(interp); + }else if( rx==TCL_ERROR ){ + rc = TCL_ERROR; + break; + }else{ + pVar = 0; + } + } if( pVar ){ int n; u8 *data; @@ -1423,12 +1448,14 @@ static int dbPrepareAndBind( }else{ sqlite3_bind_null(pStmt, i); } + if( needResultReset ) Tcl_ResetResult(pDb->interp); } } pPreStmt->nParm = iParm; *ppPreStmt = pPreStmt; + if( needResultReset && rc==TCL_OK ) Tcl_ResetResult(pDb->interp); - return TCL_OK; + return rc; } /* @@ -1887,35 +1914,36 @@ static int SQLITE_TCLAPI DbObjCmd( int choice; int rc = TCL_OK; static const char *DB_strs[] = { - "authorizer", "backup", "busy", - "cache", "changes", "close", - "collate", "collation_needed", "commit_hook", - "complete", "copy", "deserialize", - "enable_load_extension", "errorcode", "eval", - "exists", "function", "incrblob", - "interrupt", "last_insert_rowid", "nullvalue", - "onecolumn", "preupdate", "profile", - "progress", "rekey", "restore", - "rollback_hook", "serialize", "status", - "timeout", "total_changes", "trace", - "trace_v2", "transaction", "unlock_notify", - "update_hook", "version", "wal_hook", - 0 + "authorizer", "backup", "bind_fallback", + "busy", "cache", "changes", + "close", "collate", "collation_needed", + "commit_hook", "complete", "copy", + "deserialize", "enable_load_extension", "errorcode", + "eval", "exists", "function", + "incrblob", "interrupt", "last_insert_rowid", + "nullvalue", "onecolumn", "preupdate", + "profile", "progress", "rekey", + "restore", "rollback_hook", "serialize", + "status", "timeout", "total_changes", + "trace", "trace_v2", "transaction", + "unlock_notify", "update_hook", "version", + "wal_hook", 0 }; enum DB_enum { - DB_AUTHORIZER, DB_BACKUP, DB_BUSY, - DB_CACHE, DB_CHANGES, DB_CLOSE, - DB_COLLATE, DB_COLLATION_NEEDED, DB_COMMIT_HOOK, - DB_COMPLETE, DB_COPY, DB_DESERIALIZE, - DB_ENABLE_LOAD_EXTENSION, DB_ERRORCODE, DB_EVAL, - DB_EXISTS, DB_FUNCTION, DB_INCRBLOB, - DB_INTERRUPT, DB_LAST_INSERT_ROWID, DB_NULLVALUE, - DB_ONECOLUMN, DB_PREUPDATE, DB_PROFILE, - DB_PROGRESS, DB_REKEY, DB_RESTORE, - DB_ROLLBACK_HOOK, DB_SERIALIZE, DB_STATUS, - DB_TIMEOUT, DB_TOTAL_CHANGES, DB_TRACE, - DB_TRACE_V2, DB_TRANSACTION, DB_UNLOCK_NOTIFY, - DB_UPDATE_HOOK, DB_VERSION, DB_WAL_HOOK + DB_AUTHORIZER, DB_BACKUP, DB_BIND_FALLBACK, + DB_BUSY, DB_CACHE, DB_CHANGES, + DB_CLOSE, DB_COLLATE, DB_COLLATION_NEEDED, + DB_COMMIT_HOOK, DB_COMPLETE, DB_COPY, + DB_DESERIALIZE, DB_ENABLE_LOAD_EXTENSION,DB_ERRORCODE, + DB_EVAL, DB_EXISTS, DB_FUNCTION, + DB_INCRBLOB, DB_INTERRUPT, DB_LAST_INSERT_ROWID, + DB_NULLVALUE, DB_ONECOLUMN, DB_PREUPDATE, + DB_PROFILE, DB_PROGRESS, DB_REKEY, + DB_RESTORE, DB_ROLLBACK_HOOK, DB_SERIALIZE, + DB_STATUS, DB_TIMEOUT, DB_TOTAL_CHANGES, + DB_TRACE, DB_TRACE_V2, DB_TRANSACTION, + DB_UNLOCK_NOTIFY, DB_UPDATE_HOOK, DB_VERSION, + DB_WAL_HOOK }; /* don't leave trailing commas on DB_enum, it confuses the AIX xlc compiler */ @@ -2037,6 +2065,49 @@ static int SQLITE_TCLAPI DbObjCmd( break; } + /* $db bind_fallback ?CALLBACK? + ** + ** When resolving bind parameters in an SQL statement, if the parameter + ** cannot be associated with a TCL variable then invoke CALLBACK with a + ** single argument that is the name of the parameter and use the return + ** value of the CALLBACK as the binding. If CALLBACK returns something + ** other than TCL_OK or TCL_ERROR then bind a NULL. + ** + ** If CALLBACK is an empty string, then revert to the default behavior + ** which is to set the binding to NULL. + ** + ** If CALLBACK returns an error, that causes the statement execution to + ** abort. Hence, to configure a connection so that it throws an error + ** on an attempt to bind an unknown variable, do something like this: + ** + ** proc bind_error {name} {error "no such variable: $name"} + ** db bind_fallback bind_error + */ + case DB_BIND_FALLBACK: { + if( objc>3 ){ + Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?"); + return TCL_ERROR; + }else if( objc==2 ){ + if( pDb->zBindFallback ){ + Tcl_AppendResult(interp, pDb->zBindFallback, (char*)0); + } + }else{ + char *zCallback; + int len; + if( pDb->zBindFallback ){ + Tcl_Free(pDb->zBindFallback); + } + zCallback = Tcl_GetStringFromObj(objv[2], &len); + if( zCallback && len>0 ){ + pDb->zBindFallback = Tcl_Alloc( len + 1 ); + memcpy(pDb->zBindFallback, zCallback, len+1); + }else{ + pDb->zBindFallback = 0; + } + } + break; + } + /* $db busy ?CALLBACK? ** ** Invoke the given callback if an SQL statement attempts to open diff --git a/test/tclsqlite.test b/test/tclsqlite.test index 4a674a8f24..319737426f 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -42,7 +42,7 @@ do_test tcl-1.1.1 { do_test tcl-1.2 { set v [catch {db bogus} msg] lappend v $msg -} {1 {bad option "bogus": must be authorizer, backup, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, copy, deserialize, enable_load_extension, errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, preupdate, profile, progress, rekey, restore, rollback_hook, serialize, status, timeout, total_changes, trace, trace_v2, transaction, unlock_notify, update_hook, version, or wal_hook}} +} {1 {bad option "bogus": must be authorizer, backup, bind_fallback, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, copy, deserialize, enable_load_extension, errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, preupdate, profile, progress, rekey, restore, rollback_hook, serialize, status, timeout, total_changes, trace, trace_v2, transaction, unlock_notify, update_hook, version, or wal_hook}} do_test tcl-1.2.1 { set v [catch {db cache bogus} msg] lappend v $msg @@ -791,5 +791,60 @@ do_test 17.6.3 { list [catch { db function xyz -n object ret } msg] $msg } {1 {bad option "-n": must be -argcount, -deterministic or -returntype}} -finish_test +# 2019-02-28: The "bind_fallback" command. +# +do_test 18.100 { + unset -nocomplain bindings abc def ghi jkl mno e01 e02 + set bindings(abc) [expr {1+2}] + set bindings(def) {hello} + set bindings(ghi) [expr {3.1415926*1.0}] + proc bind_callback {nm} { + global bindings + set n2 [string range $nm 1 end] + if {[info exists bindings($n2)]} { + return $bindings($n2) + } + if {[string match e* $n2]} { + error "no such variable: $nm" + } + return -code return {} + } + db bind_fallback bind_callback + db eval {SELECT $abc, typeof($abc), $def, typeof($def), $ghi, typeof($ghi)} +} {3 integer hello text 3.1415926 real} +do_test 18.110 { + db eval {SELECT quote(@def), typeof(@def)} +} {X'68656C6C6F' blob} +do_execsql_test 18.120 { + SELECT typeof($mno); +} {null} +do_catchsql_test 18.130 { + SELECT $e01; +} {1 {no such variable: $e01}} +do_test 18.140 { + db bind_fallback +} {bind_callback} +do_test 18.200 { + db bind_fallback {} + db eval {SELECT $abc, typeof($abc), $def, typeof($def), $ghi, typeof($ghi)} +} {{} null {} null {} null} +do_test 18.300 { + unset -nocomplain bindings + proc bind_callback {nm} {lappend ::bindings $nm} + db bind_fallback bind_callback + db eval {SELECT $abc, @def, $ghi(123), :mno} + set bindings +} {{$abc} @def {$ghi(123)} :mno} +do_test 18.900 { + set rc [catch {db bind_fallback a b} msg] + lappend rc $msg +} {1 {wrong # args: should be "db bind_fallback ?CALLBACK?"}} +do_test 18.910 { + db bind_fallback bind_fallback_does_not_exist +} {} +do_catchsql_test 19.911 { + SELECT $abc, typeof($abc), $def, typeof($def), $ghi, typeof($ghi); +} {1 {invalid command name "bind_fallback_does_not_exist"}} +db bind_fallback {} +finish_test From 9cb02640419614ae3771ebbffce076474380029b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 Feb 2019 20:10:52 +0000 Subject: [PATCH 41/48] Add the ".parameter" command to the CLI. FossilOrigin-Name: 1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 --- manifest | 12 ++--- manifest.uuid | 2 +- src/shell.c.in | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4f2d856111..e2da2af99e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\snew\s"bind_fallback"\smethod\sto\sthe\s"sqlite3"\sobject\sin\sthe\sTCL\ninterface. -D 2019-02-28T17:29:19.212 +C Add\sthe\s".parameter"\scommand\sto\sthe\sCLI. +D 2019-02-28T20:10:52.766 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -516,7 +516,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 -F src/shell.c.in a238f3f80f7085d31056c69930ec13a87872da0d0d08fd561f5aff78cc618f5d +F src/shell.c.in 249c0bf34f7ce272cb17162c297c45ab674a52a5d85193a86191f131196de47f F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1805,7 +1805,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 00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 -R 448ca78435be9ef8ac1ee1c7bdd459a0 +P c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 +R 2fecd2e603ada3a0c6460ef11e6e9c28 U drh -Z 8dd6bd727b5289a2522f6d5168203921 +Z f7dd879e1ba76ea61ec7d6d44725ec74 diff --git a/manifest.uuid b/manifest.uuid index 2283367472..91cf4ac998 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 \ No newline at end of file +1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 3474c10ca8..df81c2e99c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2750,6 +2750,16 @@ static void restore_debug_trace_modes(void){ /* Name of the TEMP table that holds bind parameter values */ #define BIND_PARAM_TABLE "$Parameters" +/* Create the TEMP table used to store parameter bindings */ +static void bind_table_init(ShellState *p){ + sqlite3_exec(p->db, + "CREATE TABLE IF NOT EXISTS temp.[" BIND_PARAM_TABLE "](\n" + " key TEXT PRIMARY KEY,\n" + " value ANY\n" + ") WITHOUT ROWID;", + 0, 0, 0); +} + /* ** Bind parameters on a prepared statement. ** @@ -3547,6 +3557,13 @@ static const char *(azHelp[]) = { " --zip FILE is a ZIP archive", ".output ?FILE? Send output to FILE or stdout if FILE is omitted", " If FILE begins with '|' then open it as a pipe.", + ".parameter CMD ... Manage SQL parameter bindings", + " clear Erase all bindings", + " init Initialize the TEMP table that holds bindings", + " list List the current parameter bindings", + " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", + " PARAMETER should start with '$', ':', '@', or '?'", + " unset PARAMETER Remove PARAMETER from the binding table", ".print STRING... Print literal STRING", #ifndef SQLITE_OMIT_PROGRESS_CALLBACK ".progress N Invoke progress handler after every N opcodes", @@ -7078,6 +7095,110 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else + if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ + open_db(p,0); + if( nArg<=1 ) goto parameter_syntax_error; + + /* .parameter clear + ** Clear all bind parameters by dropping the TEMP table that holds them. + */ + if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ + sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.[" BIND_PARAM_TABLE "];", + 0, 0, 0); + }else + + /* .parameter list + ** List all bind parameters. + */ + if( nArg==2 && strcmp(azArg[1],"list")==0 ){ + sqlite3_stmt *pStmt = 0; + int rx; + int len = 0; + rx = sqlite3_prepare_v2(p->db, + "SELECT max(length(key)) " + "FROM temp.[" BIND_PARAM_TABLE "];", -1, &pStmt, 0); + if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ + len = sqlite3_column_int(pStmt, 0); + if( len>40 ) len = 40; + } + sqlite3_finalize(pStmt); + pStmt = 0; + if( len ){ + rx = sqlite3_prepare_v2(p->db, + "SELECT key, quote(value) " + "FROM temp.[" BIND_PARAM_TABLE "];", -1, &pStmt, 0); + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), + sqlite3_column_text(pStmt,1)); + } + sqlite3_finalize(pStmt); + } + }else + + /* .parameter init + ** Make sure the TEMP table used to hold bind parameters exists. + ** Create it if necessary. + */ + if( nArg==2 && strcmp(azArg[1],"init")==0 ){ + bind_table_init(p); + }else + + /* .parameter set NAME VALUE + ** Set or reset a bind parameter. NAME should be the full parameter + ** name exactly as it appears in the query. (ex: $abc, @def). The + ** VALUE can be in either SQL literal notation, or if not it will be + ** understood to be a text string. + */ + if( nArg==4 && strcmp(azArg[1],"set")==0 ){ + int rx; + char *zSql; + sqlite3_stmt *pStmt; + const char *zKey = azArg[2]; + const char *zValue = azArg[3]; + bind_table_init(p); + zSql = sqlite3_mprintf( + "REPLACE INTO temp.[" BIND_PARAM_TABLE "](key,value)" + "VALUES(%Q,%s);", zKey, zValue); + if( zSql==0 ) shell_out_of_memory(); + pStmt = 0; + rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rx!=SQLITE_OK ){ + sqlite3_finalize(pStmt); + pStmt = 0; + zSql = sqlite3_mprintf( + "REPLACE INTO temp.[" BIND_PARAM_TABLE "](key,value)" + "VALUES(%Q,%Q);", zKey, zValue); + if( zSql==0 ) shell_out_of_memory(); + rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rx!=SQLITE_OK ){ + utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); + sqlite3_finalize(pStmt); + pStmt = 0; + rc = 1; + } + } + sqlite3_step(pStmt); + sqlite3_finalize(pStmt); + }else + + /* .parameter unset NAME + ** Remove the NAME binding from the parameter binding table, if it + ** exists. + */ + if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ + char *zSql = sqlite3_mprintf( + "DELETE FROM temp.[" BIND_PARAM_TABLE "] WHERE key=%Q", azArg[2]); + if( zSql==0 ) shell_out_of_memory(); + sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + }else + /* If no command name matches, show a syntax error */ + parameter_syntax_error: + showHelp(p->out, "parameter"); + }else + if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ int i; for(i=1; i Date: Fri, 1 Mar 2019 18:07:05 +0000 Subject: [PATCH 42/48] In a query that uses a partial index, the expression that is the WHERE clause of the partial index must always be true. Use this fact to avoid evaluating identical terms in the WHERE clause of the query. FossilOrigin-Name: 9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index e2da2af99e..1191584f39 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s".parameter"\scommand\sto\sthe\sCLI. -D 2019-02-28T20:10:52.766 +C In\sa\squery\sthat\suses\sa\spartial\sindex,\sthe\sexpression\sthat\sis\sthe\sWHERE\sclause\nof\sthe\spartial\sindex\smust\salways\sbe\strue.\s\sUse\sthis\sfact\sto\savoid\sevaluating\nidentical\sterms\sin\sthe\sWHERE\sclause\sof\sthe\squery. +D 2019-03-01T18:07:05.251 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c 061848646cc46a137d9038e47e666a955b3b2a1b458365eeed76b004c0053f3b +F src/wherecode.c ce7b21e1be2b981d62683fc59c4ca73a04a7ff2f1ebec23d41baf2da2349afd6 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1805,7 +1805,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 c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 -R 2fecd2e603ada3a0c6460ef11e6e9c28 +P 1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 +R 999cfe5c6c09ddc9e9ba3498e400f74c U drh -Z f7dd879e1ba76ea61ec7d6d44725ec74 +Z 0f8a04d58b07ebfff6d09b88278bd01c diff --git a/manifest.uuid b/manifest.uuid index 91cf4ac998..5f1016277a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 \ No newline at end of file +9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 79189386b6..758d6b5eec 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1159,6 +1159,34 @@ static void whereIndexExprTrans( } } +/* +** The pTruth expression is always tree because it is the WHERE clause +** a partial index that is driving a query loop. Look through all of the +** WHERE clause terms on the query, and if any of those terms must be +** true because pTruth is true, then mark those WHERE clause terms as +** coded. +*/ +static void whereApplyPartialIndexConstraints( + Expr *pTruth, + int iTabCur, + WhereClause *pWC +){ + int i; + WhereTerm *pTerm; + while( pTruth->op==TK_AND ){ + whereApplyPartialIndexConstraints(pTruth->pLeft, iTabCur, pWC); + pTruth = pTruth->pRight; + } + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + if( pTerm->wtFlags & TERM_CODED ) continue; + pExpr = pTerm->pExpr; + if( sqlite3ExprCompare(0, pExpr, pTruth, iTabCur)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } +} + /* ** Generate code for the start of the iLevel-th loop in the WHERE clause ** implementation described by pWInfo. @@ -1768,6 +1796,14 @@ Bitmask sqlite3WhereCodeOneLoopStart( whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } + /* If a partial index is driving the loop, try to eliminate WHERE clause + ** terms from the query that must be true due to the WHERE clause of + ** the partial index + */ + if( pIdx->pPartIdxWhere ){ + whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); + } + /* Record the instruction used to terminate the loop. */ if( pLoop->wsFlags & WHERE_ONEROW ){ pLevel->op = OP_Noop; From 10cc16c95418f3c178637026fbc9206a063ec841 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Mar 2019 21:12:40 +0000 Subject: [PATCH 43/48] Fix a minor comment typo. No code changes. FossilOrigin-Name: 9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1191584f39..126183ceaf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sa\squery\sthat\suses\sa\spartial\sindex,\sthe\sexpression\sthat\sis\sthe\sWHERE\sclause\nof\sthe\spartial\sindex\smust\salways\sbe\strue.\s\sUse\sthis\sfact\sto\savoid\sevaluating\nidentical\sterms\sin\sthe\sWHERE\sclause\sof\sthe\squery. -D 2019-03-01T18:07:05.251 +C Fix\sa\sminor\scomment\stypo.\s\sNo\scode\schanges. +D 2019-03-01T21:12:40.335 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -515,7 +515,7 @@ F src/printf.c 93a3d539019264683a444bc043c875e9a6cca43fe935ae7bf6cfff0af3bba118 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 +F src/select.c 9263f5c30dd44c7ac2eb29f40a7ec64322a96885b71c00de6bc30b756c2e1c49 F src/shell.c.in 249c0bf34f7ce272cb17162c297c45ab674a52a5d85193a86191f131196de47f F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1805,7 +1805,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 1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 -R 999cfe5c6c09ddc9e9ba3498e400f74c +P 9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 +R a99ec8575458a788b44781da2613b38d U drh -Z 0f8a04d58b07ebfff6d09b88278bd01c +Z 40bc36502bb14ccf3651e57aebfa3d90 diff --git a/manifest.uuid b/manifest.uuid index 5f1016277a..ec9d0645e4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 \ No newline at end of file +9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 \ No newline at end of file diff --git a/src/select.c b/src/select.c index f30cea50de..7d8a425416 100644 --- a/src/select.c +++ b/src/select.c @@ -5306,7 +5306,7 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ ** ** If regAcc is non-zero and there are no min() or max() aggregates ** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator -** registers i register regAcc contains 0. The caller will take care +** registers if register regAcc contains 0. The caller will take care ** of setting and clearing regAcc. */ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ From f10c535fa5de97318abfec7d325a6a8a35919fd0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Mar 2019 21:33:29 +0000 Subject: [PATCH 44/48] The fts3_tokenizer() function returns NULL if the SQLITE_DBCONFIG_ENABLE_FTS_TOKENIZER setting is disabled, which is is by default. FossilOrigin-Name: f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 --- ext/fts3/README.tokenizers | 6 ++++-- ext/fts3/fts3_tokenizer.c | 4 +++- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/sqlite.h.in | 4 ++-- test/fts3atoken.test | 1 + 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ext/fts3/README.tokenizers b/ext/fts3/README.tokenizers index 7f2345a81f..70bdceff06 100644 --- a/ext/fts3/README.tokenizers +++ b/ext/fts3/README.tokenizers @@ -52,8 +52,10 @@ SECURITY: If the fts3 extension is used in an environment where potentially malicious users may execute arbitrary SQL (i.e. gears), they should be - prevented from invoking the fts3_tokenizer() function, possibly using the - authorisation callback. + prevented from invoking the fts3_tokenizer() function. The + fts3_tokenizer() function is disabled by default. It is only enabled + by SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER. Do not enable it in + security sensitive environments. See "Sample code" below for an example of calling the fts3_tokenizer() function from C code. diff --git a/ext/fts3/fts3_tokenizer.c b/ext/fts3/fts3_tokenizer.c index bfc36af3e3..33c133a228 100644 --- a/ext/fts3/fts3_tokenizer.c +++ b/ext/fts3/fts3_tokenizer.c @@ -106,7 +106,9 @@ static void fts3TokenizerFunc( return; } } - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + if( fts3TokenizerEnabled(context) ){ + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + } } int sqlite3Fts3IsIdChar(char c){ diff --git a/manifest b/manifest index 126183ceaf..bcfe8dba8e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\scomment\stypo.\s\sNo\scode\schanges. -D 2019-03-01T21:12:40.335 +C The\sfts3_tokenizer()\sfunction\sreturns\sNULL\sif\sthe\nSQLITE_DBCONFIG_ENABLE_FTS_TOKENIZER\ssetting\sis\sdisabled,\swhich\sis\sis\nby\sdefault. +D 2019-03-01T21:33:29.039 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -78,7 +78,7 @@ F ext/fts2/fts2_tokenizer1.c 07e223eecb483d448313b5f1553a4f299a7fb7a1 F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a -F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 +F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 5da1329ccf66b6d597dfb16b1f81aa204133c1ec96117d82a59c20126f483b17 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe @@ -93,7 +93,7 @@ F ext/fts3/fts3_snippet.c 0d8362efa59637dc7c09dc88899eb072aa409fe1e0d0fdeda55ec1 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 -F ext/fts3/fts3_tokenizer.c a22bf311a71f3efa9d7012d8cc48fc9b0f3dace7 +F ext/fts3/fts3_tokenizer.c ee670e9e0f0dc67fb78d235b2059397e4bf6a3ad8819885c2be6db08b3d35cde F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d @@ -517,7 +517,7 @@ F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9263f5c30dd44c7ac2eb29f40a7ec64322a96885b71c00de6bc30b756c2e1c49 F src/shell.c.in 249c0bf34f7ce272cb17162c297c45ab674a52a5d85193a86191f131196de47f -F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 +F src/sqlite.h.in f19f7b7646ccd331511b123e2e23d4dc3f3d02f74e1c04d2bb560ea50a323e4c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d0b @@ -908,7 +908,7 @@ F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test 4b4c16fdcfc972f2cdbba212375a060a86ccf5f1 +F test/fts3atoken.test b7a50a58177af017ecda446e66e84d48e21e850e39e8750f1aedad0fd891450e F test/fts3auto.test 19097050a3ca7ab7a43b2be967cb3dfd8ddf841dfdc4eac88deb172ad2f209f2 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f @@ -1805,7 +1805,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 9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 -R a99ec8575458a788b44781da2613b38d +P 9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 +R 6bb845ba94b22e31200ba286777e2ff0 U drh -Z 40bc36502bb14ccf3651e57aebfa3d90 +Z f12ee49595ceb9a1e0b9ecd89bae7dff diff --git a/manifest.uuid b/manifest.uuid index ec9d0645e4..900a959e9c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 \ No newline at end of file +f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f29102727e..21382be201 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2086,8 +2086,8 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
-**
^This option is used to enable or disable the two-argument -** version of the [fts3_tokenizer()] function which is part of the +**
^This option is used to enable or disable the +** [fts3_tokenizer()] function which is part of the ** [FTS3] full-text search engine extension. ** There should be two additional arguments. ** The first argument is an integer which is 0 to disable fts3_tokenizer() or diff --git a/test/fts3atoken.test b/test/fts3atoken.test index 4ce38762d6..4df0be2a02 100644 --- a/test/fts3atoken.test +++ b/test/fts3atoken.test @@ -107,6 +107,7 @@ do_test fts3atoken-2.1 { # simple input string via the built-in test function. This is as much # to test the test function as the tokenizer implementations. # +sqlite3_db_config db SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1 do_test fts3atoken-3.1 { execsql { SELECT fts3_tokenizer_test('simple', 'I don''t see how'); From 8f46f34e2d1ef30c7e7afa2c33029c5abcf37ded Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Mar 2019 12:17:35 +0000 Subject: [PATCH 45/48] Remove a redundant parameter extraction call from the percentile.c extension. FossilOrigin-Name: d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b --- ext/misc/percentile.c | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/misc/percentile.c b/ext/misc/percentile.c index a8e4981f70..88fc5a96ff 100644 --- a/ext/misc/percentile.c +++ b/ext/misc/percentile.c @@ -108,8 +108,8 @@ static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){ /* Requirement 3: P must be a number between 0 and 100 */ eType = sqlite3_value_numeric_type(argv[1]); rPct = sqlite3_value_double(argv[1]); - if( (eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT) || - ((rPct = sqlite3_value_double(argv[1]))<0.0 || rPct>100.0) ){ + if( (eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT) + || rPct<0.0 || rPct>100.0 ){ sqlite3_result_error(pCtx, "2nd argument to percentile() is not " "a number between 0.0 and 100.0", -1); return; diff --git a/manifest b/manifest index bcfe8dba8e..683ca9c0a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sfts3_tokenizer()\sfunction\sreturns\sNULL\sif\sthe\nSQLITE_DBCONFIG_ENABLE_FTS_TOKENIZER\ssetting\sis\sdisabled,\swhich\sis\sis\nby\sdefault. -D 2019-03-01T21:33:29.039 +C Remove\sa\sredundant\sparameter\sextraction\scall\sfrom\sthe\spercentile.c\sextension. +D 2019-03-02T12:17:35.599 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -296,7 +296,7 @@ F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e +F ext/misc/percentile.c 148dd07286b16e50f232bb638a47850085ad37d51f270429905bd865e595d1ca F ext/misc/prefixes.c 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17 F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c @@ -1805,7 +1805,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 9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 -R 6bb845ba94b22e31200ba286777e2ff0 +P f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 +R 8c1a5c619573aadfcf11f42bd8a532d3 U drh -Z f12ee49595ceb9a1e0b9ecd89bae7dff +Z d54032ab771b9f2b12d64cf88c6e15a6 diff --git a/manifest.uuid b/manifest.uuid index 900a959e9c..286b76ea18 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 \ No newline at end of file +d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b \ No newline at end of file From e22976c5357fb6501cb0dd40220b8d48bd9295bb Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Mar 2019 15:25:24 +0000 Subject: [PATCH 46/48] Fix the SQLITE_DIRECT_OVERFLOW_READ compile-time option so that it works with SQLITE_HAS_CODEC. FossilOrigin-Name: fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 683ca9c0a1..844bd02081 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sredundant\sparameter\sextraction\scall\sfrom\sthe\spercentile.c\sextension. -D 2019-03-02T12:17:35.599 +C Fix\sthe\sSQLITE_DIRECT_OVERFLOW_READ\scompile-time\soption\sso\sthat\sit\sworks\nwith\sSQLITE_HAS_CODEC. +D 2019-03-02T15:25:24.014 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -502,7 +502,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 2b9604eb5c12f40a0613e832b6267f5814f84479d570d482ba6f98d7affa7c1c F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 5420ef6ea46db11b6ba1231f39fc2a1bf19ccad185efc6dc46f1520a608de4f8 +F src/pager.c 5ff85a1dafdbbc3d27e21dbb52ac02066507b1e2d7da4cd4961408eed2cce23a F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -1805,7 +1805,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 f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 -R 8c1a5c619573aadfcf11f42bd8a532d3 +P d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b +R 50571770f9cddd9f6937b98986c246b4 U drh -Z d54032ab771b9f2b12d64cf88c6e15a6 +Z 39fd6294d7f36d7da03a65b55eee9cda diff --git a/manifest.uuid b/manifest.uuid index 286b76ea18..5a3c4e431a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b \ No newline at end of file +fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 4660bbfaba..9dd3dfe007 100644 --- a/src/pager.c +++ b/src/pager.c @@ -837,6 +837,9 @@ static const unsigned char aJournalMagic[] = { int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ if( pPager->fd->pMethods==0 ) return 0; if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; +#ifdef SQLITE_HAS_CODEC + if( pPager->xCodec!=0 ) return 0; +#endif #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ u32 iRead = 0; From 75db74fdaeaeef414793f03c0fea93fb6ed8c92b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Mar 2019 20:09:35 +0000 Subject: [PATCH 47/48] Improved comments on the fossildelta.c extension. FossilOrigin-Name: d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 --- ext/misc/fossildelta.c | 20 +++++++++++++++++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index b58d358b55..7e78f6fb12 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -10,7 +10,25 @@ ** ****************************************************************************** ** -** This SQLite extension implements the delta functions used by Fossil. +** This SQLite extension implements the delta functions used by the RBU +** extension. Three scalar functions and one table-valued function are +** implemented here: +** +** delta_apply(X,D) -- apply delta D to file X and return the result +** delta_create(X,Y) -- compute and return a delta that carries X into Y +** delta_output_size(D) -- blob size in bytes output from applying delta D +** delta_parse(D) -- returns rows describing delta D +** +** The delta format is the Fossil delta format, described in a comment +** on the delete_create() function implementation below, and also at +** +** https://www.fossil-scm.org/fossil/doc/trunk/www/delta_format.wiki +** +** This delta format is used by the RBU extension, which is the main +** reason that these routines are included in the extension library. +** RBU does not use this extension directly. Rather, this extension is +** provided as a convenience to developers who want to analyze RBU files +** that contain deltas. */ #include #include diff --git a/manifest b/manifest index 844bd02081..99d80ef9bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sSQLITE_DIRECT_OVERFLOW_READ\scompile-time\soption\sso\sthat\sit\sworks\nwith\sSQLITE_HAS_CODEC. -D 2019-03-02T15:25:24.014 +C Improved\scomments\son\sthe\sfossildelta.c\sextension. +D 2019-03-02T20:09:35.788 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c e7864c391e14ccaf73ee4b22f5a55c1eb40ecc93a7f5ee77a1b41b87367ec7ae -F ext/misc/fossildelta.c 3cc9a9b2f39889b43cd176c19f286bc7dd652f4c202c202d008481252d820316 +F ext/misc/fossildelta.c 910510968a30ab77b8ac1a27931f2cb834e9db9fd5ab122f53b6045b4315665d F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b -R 50571770f9cddd9f6937b98986c246b4 +P fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa +R 2f413ab89884ce894ab037220c4ef892 U drh -Z 39fd6294d7f36d7da03a65b55eee9cda +Z 4ebc8a2db088c512de2eab3689f25c24 diff --git a/manifest.uuid b/manifest.uuid index 5a3c4e431a..c0e58c4f51 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa \ No newline at end of file +d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 \ No newline at end of file From 4474e869fed2a30237b68e2e5c6d383d3fc7d9fe Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 Mar 2019 07:15:57 +0000 Subject: [PATCH 48/48] Fix a problem preventing compilation with SQLITE_OMIT_UTF16. FossilOrigin-Name: 906d1fd8650874236e0bf5734d5347dcc45ec036164a56570fec37da4ffeaf8f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeapi.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 99d80ef9bf..d2655343e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomments\son\sthe\sfossildelta.c\sextension. -D 2019-03-02T20:09:35.788 +C Fix\sa\sproblem\spreventing\scompilation\swith\sSQLITE_OMIT_UTF16. +D 2019-03-04T07:15:57.844 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -589,7 +589,7 @@ F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca F src/vdbe.c f1e7b5320df80ff58c67176e35cb48062cbda2a9c9811f11db5faa48071d3fe4 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f -F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 +F src/vdbeapi.c 0eb687d3287d6ab45661f7ffcabbda6f345713e800ef0f29053597933ca2a0bf F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923 @@ -1805,7 +1805,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 fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa -R 2f413ab89884ce894ab037220c4ef892 -U drh -Z 4ebc8a2db088c512de2eab3689f25c24 +P d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 +R dc88e96e04121683ea3d6378eccdabf0 +U dan +Z 97fe7239616646a62550c014b5d021f5 diff --git a/manifest.uuid b/manifest.uuid index c0e58c4f51..821cac909e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 \ No newline at end of file +906d1fd8650874236e0bf5734d5347dcc45ec036164a56570fec37da4ffeaf8f \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 5b9ba4d89c..2aa93e60a7 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1144,9 +1144,12 @@ static const void *columnName( N += useType*n; sqlite3_mutex_enter(db->mutex); assert( db->mallocFailed==0 ); +#ifndef SQLITE_OMIT_UTF16 if( useUtf16 ){ ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); - }else{ + }else +#endif + { ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); } /* A malloc may have failed inside of the _text() call. If this