From 46c425b4dd4e0e6371d8794b671135593d2ddf8c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 10 Nov 2021 10:59:10 +0000 Subject: [PATCH 01/24] Make SQLITE_CORRUPT sticky: If a CORRUPT error is returned, all subsequent write statements within the same transaction also fail early with SQLITE_CORRUPT. FossilOrigin-Name: 3feb0f1c3840904d28fc9a61262820e2b9b764addc1dd178aecc2cd0f952042c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/btree.c | 6 +++--- src/main.c | 2 +- src/sqliteInt.h | 1 + src/vdbe.c | 15 +++++++++++++-- 6 files changed, 28 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 944f5f2d29..f23b2c55dd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\stest\scase\serror\smessage\stext\sto\smatch\sthe\scurrent\simplementation. -D 2021-11-09T13:31:42.748 +C Make\sSQLITE_CORRUPT\ssticky:\s\sIf\sa\sCORRUPT\serror\sis\sreturned,\sall\ssubsequent\nwrite\sstatements\swithin\sthe\ssame\stransaction\salso\sfail\searly\swith\nSQLITE_CORRUPT. +D 2021-11-10T10:59:10.748 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,7 +491,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 2c8a52a7fd84b1aec4a79e7861b6368aecbf011a43247cc7d9a2946c7f0ae5ea +F src/btree.c 6fd5c54a2edec870a0ba0c2c8b28577bf587e05a6f183da6febe09e3700ded6f F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c 1b41a6417e5bb260a5988588764863229905b07b3e9a47878030a1c92d49010f @@ -514,7 +514,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 7fcbbe9114ac402ea3c0c6a3810f13fc89cae8131ea1659ec472be7caac10192 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e1dcff1c916bf6834e150b492eddda5d9792453182d2ad64294d2266b6e93c4c -F src/main.c 5ed1babdec5bbf935fb4586fcb12debbff760c301948ac46cf90e720b4405a8b +F src/main.c 7bd4fdc41ef53535271a1816ff043ba153cda03842b444b6e2f57b27b2cb9090 F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -555,7 +555,7 @@ F src/shell.c.in f8854bcb0d14707d661732698d5210d7f01694000c46e8014b323ad18f575be F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8ff2fd2c166150b2e48639f5e506fb44e29f1a3f65031710b9e89d1c126ac839 -F src/sqliteInt.h 8e770859062a87254dabd183b3f7bd29f89fd5905515beac00877958e88e06ce +F src/sqliteInt.h c36cdf01fcd624f9988305158e89bf1d7246b3a05f0fe578bc7dd2507e53e59d F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -622,7 +622,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c f2b30e312d2dc69d429998f17fab74298a4d9ed8c6d57c0d23d0284414c6ea1b +F src/vdbe.c 34a0bc8b9e934523fd528885689334821d7a1d7048e739a32801a810ac848c39 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 31fbabdc1ed61d9695337dfe5269ea94e1cf615c17f5cafeaa1bb01066820bab F src/vdbeapi.c f4bd14b42d9717a35baac5f20c0c4bfccbf3691d64dc6ec02fc0ef19374d3c92 @@ -1932,7 +1932,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 ba4fb51853fbcb8c142a350b4db0d59153f28ba0a63ad9a2d6fea7096d3dd544 -R 53a575150d86630b94dc195691567d17 +P de10795a1cf70925088e9652998e813665b2e147ffa4a4edab18c7e2c66bf5ae +R e127d9e9bc185c201fc0d430c0552522 U drh -Z 2471e2a59037263eea8aada9ef5e2a3c +Z 644a270e60b1b5e3bf9aa34104968aa1 diff --git a/manifest.uuid b/manifest.uuid index 72257e642d..ec8cdc26ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de10795a1cf70925088e9652998e813665b2e147ffa4a4edab18c7e2c66bf5ae \ No newline at end of file +3feb0f1c3840904d28fc9a61262820e2b9b764addc1dd178aecc2cd0f952042c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 67611c3bf5..49f80b5b39 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1488,7 +1488,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; - }else if( iFree+sz>usableSize ){ + }else if( NEVER(iFree+sz>usableSize) ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -7111,7 +7111,7 @@ static int rebuildPage( assert( i(u32)usableSize ){ j = 0; } + if( NEVER(j>(u32)usableSize) ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kpDbPage)!=1 || pPage->isInit ){ + if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || NEVER(pPage->isInit) ){ rc = SQLITE_CORRUPT_BKPT; }else{ if( iOffset+ovflPageSize<(u32)nTotal ){ diff --git a/src/main.c b/src/main.c index 7eb42f7ae4..4b2d0592c9 100644 --- a/src/main.c +++ b/src/main.c @@ -1460,7 +1460,7 @@ void sqlite3RollbackAll(sqlite3 *db, int tripCode){ /* Any deferred constraint violations have now been resolved. */ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~(u64)SQLITE_DeferFKs; + db->flags &= ~(u64)(SQLITE_DeferFKs|SQLITE_CorruptRdOnly); /* If one has been configured, invoke the rollback-hook callback */ if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 75f3bfca2d..cece2360e8 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1712,6 +1712,7 @@ struct sqlite3 { #define SQLITE_CountRows HI(0x00001) /* Count rows changed by INSERT, */ /* DELETE, or UPDATE and return */ /* the count using a callback. */ +#define SQLITE_CorruptRdOnly HI(0x00002) /* Prohibit writes due to error */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG diff --git a/src/vdbe.c b/src/vdbe.c index 5b794ff942..b2390e0567 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3604,6 +3604,7 @@ case OP_AutoCommit: { sqlite3CloseSavepoints(db); if( p->rc==SQLITE_OK ){ rc = SQLITE_DONE; + if( db->autoCommit ) db->flags &= ~SQLITE_CorruptRdOnly; }else{ rc = SQLITE_ERROR; } @@ -3665,8 +3666,15 @@ case OP_Transaction: { assert( pOp->p1>=0 && pOp->p1nDb ); assert( DbMaskTest(p->btreeMask, pOp->p1) ); assert( rc==SQLITE_OK ); - if( pOp->p2 && (db->flags & SQLITE_QueryOnly)!=0 ){ - rc = SQLITE_READONLY; + if( pOp->p2 && (db->flags & (SQLITE_QueryOnly|SQLITE_CorruptRdOnly))!=0 ){ + if( db->flags & SQLITE_QueryOnly ){ + /* Writes prohibited by the "PRAGMA query_only=TRUE" statement */ + rc = SQLITE_READONLY; + }else{ + /* Writes prohibited due to a prior SQLITE_CORRUPT in the current + ** transaction */ + rc = SQLITE_CORRUPT; + } goto abort_due_to_error; } pBt = db->aDb[pOp->p1].pBt; @@ -8391,6 +8399,9 @@ abort_due_to_error: (int)(pOp - aOp), p->zSql, p->zErrMsg); sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); + if( rc==SQLITE_CORRUPT && db->autoCommit==0 ){ + db->flags |= SQLITE_CorruptRdOnly; + } rc = SQLITE_ERROR; if( resetSchemaOnFault>0 ){ sqlite3ResetOneSchema(db, resetSchemaOnFault-1); From 34e71830de58302cd1922927234006e798374316 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 10 Nov 2021 15:23:00 +0000 Subject: [PATCH 02/24] Load new test cases into test/fuzzdata8.db FossilOrigin-Name: 8b53ffe99df6f5443bd22a9d95433819eb44c7e8f044c2f3e9d52661741d5612 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2993152 -> 3015680 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f23b2c55dd..8a498f5922 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sSQLITE_CORRUPT\ssticky:\s\sIf\sa\sCORRUPT\serror\sis\sreturned,\sall\ssubsequent\nwrite\sstatements\swithin\sthe\ssame\stransaction\salso\sfail\searly\swith\nSQLITE_CORRUPT. -D 2021-11-10T10:59:10.748 +C Load\snew\stest\scases\sinto\stest/fuzzdata8.db +D 2021-11-10T15:23:00.325 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1065,7 +1065,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db b0e8db9e34a52e97e6df2101e445e0d9780a1dbd772137de71c5c9def63e3ee0 +F test/fuzzdata8.db 9dfcee537307260af05cfa72ffdb8ffd4920fd6a774229b7459fe8bd2fe90817 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1932,7 +1932,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 de10795a1cf70925088e9652998e813665b2e147ffa4a4edab18c7e2c66bf5ae -R e127d9e9bc185c201fc0d430c0552522 +P 3feb0f1c3840904d28fc9a61262820e2b9b764addc1dd178aecc2cd0f952042c +R 1cdf4bc20eaeb0eb0948586b5fb86978 U drh -Z 644a270e60b1b5e3bf9aa34104968aa1 +Z 87340a94cc4e7d9e4722384f4b564545 diff --git a/manifest.uuid b/manifest.uuid index ec8cdc26ad..0bc9833f7b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3feb0f1c3840904d28fc9a61262820e2b9b764addc1dd178aecc2cd0f952042c \ No newline at end of file +8b53ffe99df6f5443bd22a9d95433819eb44c7e8f044c2f3e9d52661741d5612 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 514bffd0855061a0ee90210f137a0c860938fe60..9d0a962d91264d48123cdbf7220bc17b040d95fb 100644 GIT binary patch delta 48426 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

OZin?pCYMo-w(gV0@9c zsHiAWOiD=l9`yJUX>^G-zWeP*9v?8!|Dv?0$cvKx*;9jK{@qvS(ypV? zCjbA(B9s0qvSYiBY3UjNUF@y=f@5dS_6Di$!-!bw{$T{V$%hel4H=Ud^d*Ye?D6Z& zx!#uhV4^rHIBs%q2EM?HF#MT4c?SQ#4*yQ_0_`1-XBW+y!1ZAK+oGWKS`5yaNX2cS zJsmnFBAN!}TO&+-2=X!X&jHlZ091NYZs1L;T=K65`d=dtnWO<`{#GBGF@COuB47B> z%%bt#$9VthYTd_nPv!kA8w>pbSwp#OnDpy7zvp%*yK|Th%j$jay#w%y`s|H}Taw-h zO6!czHVAf|1%*wfcM7B8LpQIK+JG8o0ocPzU`CrmvOyXEcL>TW2-fkADrH6`tx5mGR z{z5S8R$rJkbMEAEi5QIYAbQaC#QsCXp@Z+umL$+G9&s!}{zSx4pMm;VYVH^rE6k(T z>*S{Nzenrsy4+dMTkVqq=1T*ckL#H;##4$_24|T`5o+p^55-&Qz;K22AJXgJO*L>H z`?FIZL!kt!7T780fz5RnC~LW?Cne=sYhILRL6LlsDf$Gk?6^ez?nxL- z4O)$sjqVrtQ!QHtly;4Z$&$f-j@4Qpq&qaF$;X0Ng~yc5M`koE7*1>&v>9_lWki(ue@} zos1q@T@?77je9V#NhUP0#x7PYjiWwS9b}EcfL$gu<7h^;@_#H$^$dl7rsQh(dyFgj z^7`NOJSYf1Qgp5v8lHl{^W2E_)N1qN4COr}7k*}iCph{@)cn9o)Lc%_6$hp$ukRkY z3}B}vf&a*qKcF7JQpwQP0VbN_DrBtg(LfrH+Mai}60noY1G{+C_L6VBPHZSAd$ACE zB5<1P;!7%9!P0km!^NH>u!1kUJ6CkqgNh8TA!==()fX zGFf;S1^umY99R+fPA(4@Fey&-$FCV>iDRi-0`>BUa9Jn#cc*n6i?s-q6(;#6Z{P~0I z-NS+1YD9ex`*KRhoA?8Rbae{bb38Cet_oM8mD&}5+NkR1XzaKxAuhGL> zQE-ZU5}SD=P$pN8N$-qDkrZ6h7HitYiF;Umx1;?&A@O$9RM$@v%S;%Iz7~iVccN#O|am<@GR#l>2b} z7IySn5?s%5Hh=-|WS)|AAIVq>lcD!B=2Neu#si9h@8oGxs*5?Jl1c(^!c zeinF>?_|RDYqA_LtGY$dey$O3zBm41YC09@M;o3_S`S3M#OGze+`NM*_`&~+DD#~} z#U%cqQ30Z~WL-B_o1NHIrX7cp5Cm(HmIJ^7D9UN&lv*-G5Ofv9A3cR8e%#xSU%J2?_sqLyk*) zNG<4Ck7Hx2C1RhPp z?T*8J9vJTPM0cMTy8D3poUvsv;4CR3*ZacV2g~(-81CbNy3Y;hKH%PFtobSk!+pW% z?h8S8Unq9>g(15y9K(GP$nLWNg&!}}eE~rCMdNT^42Jt+(cKq^?!I{J?n^*+Um~*m zzlsm=T1n5jqF`B=9;||fIz!hE>wFQ`_2P|R&?T+9sn9lf3%Mnz_D=}?PPtu*k z$XGc2;cYSbX>HZOnGlH>B$ZGZz_ZP7hqprUa>u zreD}A&N1C#t~h8>Hh1y##`|LG(*rnkLV$asbz4AZa0a&M+}(bAhORtlxfyrq_P`FE zT*mF$b9KSD+HjY_y`jF{yF%BAlTl!MU!!gz6D#nXBJRq`hN4&CMeR!9upzK!0^K_c zTqeN4T{Yb?okIj#=sxJwRR#{AZ{K)BdmGr*o=m{u@{fBZWYJuz0@7MLec?szlIcK4 z?%i%WRTp@5S>1NMC)$^QixJzkL1XFM_1pC=gB)*b89n4Y0(nV2fR_BzCyh9vcK@jIn@GV;7<_ zCN@Y+(OAHkZh^!kYD|R0#Ms|C*C#yR=lTAAYrSi|f4r`B20Uf&nc1^v&wTc5vR52q z*|iqrO~*q4X3Y8T7u=TBBB_!NI1qP_jSiT3dKB--8I zgJ@@eccMxDZbTFOU5U2#cOlx+pGY*`pFp&kza!Boe+Qxs{OyQF_}dT-^S31G^0y#r z_s0{p`I`|n`{Rg)`kNA^$Bh*V?vX!+=tF-L(Q1DqqPP6@51-bw<}~SnY4l#2zfC~9 zOv{#Oxn){@nO0b)6_;t1%e1OxTJnsPprDPN#Bkb{(0mSRszW1jS3#(T z!zLeue!Q;?$w5kzwhF#^C$u4yOIi{qz- zS!fvU`yzB82d^CpO~p?xhPG$yHw-Th{hq_=XG2{~AYSi5;?dA7*k;oDVRA|6L5w;O z$}^0)5Za5Cd>xu2utt!3HT1UlXJLrHA!J<(-6GZ;Pw+Ru$m^lknRuJp_#G-{h}3hX z-18q8>CwK;%X|)zJGc*#UhPq+d=f3dZ)3D3$mt>3p)xj9iFa>>+Ewf?NLOnUp}?WN zh&g?Hq70=a@V9dnrW z3CCh!ji3b$_ju{c{%Cp#>2Z7_lndH=(BQV#h}%VN8pm-@pm1~O7A#b2(|L}23dT{| zd(d=8XedUcYI|_d&7eKbanHawMmrFsPeQvx`A{Z8kH14lp(awB%y587dq`vo%J$xy;`?MY%C}~dRb<60^EqvhUH%mbwWaK z?N?f|5TRhMKUPqby;}P`LdiX+2O|1=YUeY|2+`&+Ff`TPXG*NR8S3Ss{NvCSwR|O$ zZg>?w^lJAoIDIr!4=E=akA~^z?fr0iOYM4*X)w31b~?lAky?q>3Ohr#0X_tC`_VI~ z9<6=#{~+&VR?=C!Q4pI7iqm6d4#$MjN7^kD{7nSKafnN@1$7)%D;JVn{WvwfBwsox z8ysze>KLt77FvFIhG+W!;^ZdB4F5Lm}lEGSDU`8ms5jqS< z4cG4AnF+7o4Bg5>{xCKPyaTjDp-F6LAJ{jXh2p6(+8F|i!?+3BUYy_)6h|Rf8`1_U z&zik?l?isNo}@J}Q6groP}nTQ2UAorS$KGgR;yvnuynRIfn%2Z1=dC&0EEtuz0eS#4-OemuQjXMH_?YeBKQ_dgHyICqQo zI@5Spdi<>f#T)HkJlLj96T|8KNGRK-P2O3a-gW)MkQdJTqScTX8KZ<~Ue`dj=IG_K{Ow6kQ~r6$BZUlW89%}|)<;jt zLGm$>!s|NZKUKAc?A|c}C}=DWz~r;qBOHr`%!cab;8p89aG{wP2h#*~BUm>xrVU&Y z)Zvh=QVUS6);ZC8LHmP}H9_Hu_Bqd*!cb)+7mz&l@ujb69x@*kUe(UVVK=qQdD+V2 z!2de)ptn-HRn0o$>08=Fo;5DHs~ska34&r%P-vtPNaI-ZlKa}8f|w{MwvPNqiUv@< zSQi4)P>Tu6|JF9;S&Nb<+FgR!g@$kJKX28OHPCUzNPlNRk(>A*cRReU_rD}4)_ecC z`>z%&*J~Xhak|&V_HT~%cYl`CNYzDe={RUalw4rB-yc#iUQk!{AGzu9Rc# z@_$p2P-@*ni_leedAV1tiLxDq;k+616r*&XsaSWc@adZHVkdf~D;VQ-J-{2U)8Wu~-5#EGL!q_qqDJT; zD2_p-#~tj`3DRd=QykezSIAhG{LZ>Ov8SL|GyESJ%y_4>&dIZ0D0J7=QwzNX#YQNb z6OxEiQglBuO`p7Qe=k9?t5$Dj+}}^vpRt}L19UXwli^}}{SEwKu+A02`rxzCI>uPv zlCip11d&`|p$XWpy1_K1MdJ&LBi8$`jr8}W$r$Vh5`Wb>q3AuW0dGXdgfSd7Nmszc zRC;d!s%PouFkCQIw_M3yMq!qY%xVx6%+S@vhI4fO5V0Q(X}H|Q7L#wnC>E8UayPe*$DXdgsvARZ`2*( z*+>{!q07c4n{|g&Vt+w#ahBY|WGE6OJ$Cs>cb?(GUAh3%4HGFKn#&dvy=k+^m3$e!LzaCoBX4cA{AUE7AD@3(;8t6VWLFS^$L60X@;d z0b1gOfdLKCo&lP9LYIJ&Xi|XGFSHGiKM~>s9MQM{BicAX;~_-*vxs{Ai->ys3y50% z^NFhcS@USP9{T4H{nP&{(cAvnL~rV$qe-hDM{s~0i_KzXD z$v>KCjz5j4-#?1zBL8rr^Zc^ez2+Z6bh>{q(TV<-iH`FRAUew5pD$1-lw-02Q|QOA z05z-Z9GFP7Re%;4Wuw4YqV)sRxH2q|PSg>g#+AmvNTQ(u>O!dsP!~!T7)nF*BtRXB z4+GSZ_-kMg(c6K6M6U*@JMn`+KcYtieTnV~^d`DJK;gK!Igr(ZeryPIC%Pm+@woVE zfFf}*Gw>48DS;%S69WlE#|AnQ9TaF!G$qi6WEkwHM*07bkv@&f{|@yPL;v50`v3Px zpMugK{q>06^w%Z&gFlkAH9IhsdK{D9dfe!i@vWN2q3)ROFP@EsMdx(`amWeXcr_b< zrDt>ryeJRsEAZ(qT^L4ws{5X26R;?s92=}Uq1%MpF6b7MI|8YNe)tRLT@A*K zy@V;1y2Cu1hLMuD6T_}Q>h39p!L+o$2#qp!=$b=zdnpn=zN>2{X6&5qAB0cu>NsAU zO#Eg-d3&iLTo2{zK*Eo_1brI{7BKv-Q-SX{T|?YftsBd;8F1~IEbe{XUKN{#!V}q} z&OR#W>Bp-m2>K+AKsmy>7i*UHR*VOxr|8tsEY$IrCFa9ZJCtW)%9 z9W0H~CvYnAqI`Da#u!$}v<&XQ%)7C1WBp7O8wG{&`bpyA*JJ!6kyPJ|X##nT{Uc~? z8X4>cax(Q{SlUvbz*tsEYdtA?39!P34k#bM8_;)NzmVbX4*FqAwhRtwVmpC%I~Rq% z+4}h$-s!4$GPWE~&Cz$_;nGOyRXEX0-;J%n$fw*54xSf_t-+nFzr|J}o92DY@Oi3U z;MnVs{=h?l&mM0jhsif1_+a!-OMWZsWXu@v&7l{E$S*2sOB;CKmqVX5cq&K! z|MNHWd*I#}y@joXZRz@GY%*5=1<%$&=1$&$o(X!JMwuom{O`Aap-U2SIwvlr7T$oQ z!MqJ!v-G!lmIra&^xa`?H~kFA@shX~=IC4UY(1nO6cfQPN@^*~(-}`K(0Ae42I!is ze;<7#yyrP6@27uN<|rSNGQ6jG$VdybgLja=fqWA%X_mJRr8ZZ*=b(C(-mKo(Cay)R zxHc`pKfr6l$klq99&bW%wU;aay&;g%KSBl13XK{FYv}y}Ur*DY;7Zo(mx$tMK~Wi8 zLkG)46{@4=-}-EnRS$#CnETIrO2v zt|*QX6bC!M;JE07KA9H_iQS!$o@xugcabJ@{#N}JICROQ&Z}%MLiP~8B^H(G_bP=6 zf}#Klw@Znz^;3OA&A}D({jX326O30ngXyfkt#}}(i+?<%o+Vq~SCHr*2c`0_@8osy zkHx0v^yN(4L7nYJ;k-O&_n=TN|J(~~HW!KYujsF<*#26x*J7iq`tL&7AxMf3v!e5s z{*H0yhR-=xLhi#rtRU2EjjqOmuy6|9eENum46^Hn z*=1`w1~uEGo8%vNS+J|taFW-(=WE$=T+8t-o41T>)f_5jIW2JdzN-%$df*BNZ*`O% zoF&Roxca73gYQd*9z1&=YBECyLHP_$2`Mvd5twZ;Eaus9*wo(iG7fbZC=fnD@QCxT z{HKjm!FMyZK4yd&@;G)9as#$F2%p8L;Rdf^8qZEac2BXrJhC71>@@iMiqTLo*w*e} zR@2BZo@b>{(OhZ@*Zwp#z#*{)@|qt&=Ie%T*el+!Q_ZG9O?$&<;)SA4{;5#b!7xeu zWaCTzDd6i!zn*zxpno!M>u5-0Vi}455l9IJnz4xnnz0{aWmkijL2NI>FwE*=SfXT~ zLSYndfhipfeV}x;D=csF#L4(;Z-b3zXCXbul?0Wq7`*W7HiH@Gq!?E5>>T90ZJ3PH z2N>4#>@$#_+Q?@NHvG)9^I-IHX^=64I|SZHE)}5AYk-{Pb_*PA#`OimY{O$LA8BYV zvWt*;U#RWO%tN->8SJVqyM*IX3~%vrFX{3CmczIKhS5-7M2i1ufPt{Dj^pe;SUJe> zTCj7V&U;X_##c1=wf6aZalZJFyxb2wkdSO|g6|DB*a%^%`yC;5vB`@oi7rEl$C~NKz>~hu+s38%*N%CC5CW;Wy&zvOF+-# zq4bX!3+!EC7%6_WX0ks6bt?_ObK)2D^4Hk$fT4on7i$bnIQ9*;e%J6R!}Ga@Rvh~l zh4lu?wyz#epBUiaQC~w>kRr^QJZa%HC|#;n!pUUAOSK9K>fXk#p->=O`t`huX_USV zFtmE1k(oOTH&xWlq~48=VA9*C{a@X`@OJkNeW;h5aZO}O=@p%l-YFeLEoN07>B0Ioi8)`QYV<}P@t zRDSm-EI(`bk-;dJyAeztVbGxKW5aEc-2(Qy6akm&newpYydg&=&ZbG9^8zkODVFNW zS<{{Tj{aGK;(!8-#nK3Q!mBaj3qvKR`X=Y|mIL^k!LIkKUZ@e@##v z9$Ndt3K@L+i>}9Uz7|l}U5xo(deJic(J6&-9RCE?43?Z2=8=9R7M^16aEVyRxoPmC z{we1O#t+XhH%;2h@L+vu0DbZtGX5|`VBJPiCC?O4F;xnOoS!)no@UrA*e+K3l&9FV zaEeqw$tii6c^4WPA&28bVdNi%?Xr@dLHh{=@wRU+eZn{_%#aK$|DM4F&;Bwbz-PY` z-gEkaAqg9{l&*?Q0FNQICAMuZo#hE*t-2qx99Jbub9knNq6az`hIc03nF%IjyJ#s3w%jq8VfZW3 zJA`p&#z^bn;;-a~N5x9tQ$#dbYR)7~tTA+8m^4-TfFoct@lOMdT88u!0h^Hc&`^dS z&5}B*m<7_WO7FnhpNwNDtTA@RehZ~g6`PMEmq>-YXeP1k7&piGA%~y5F12U8qjfy` zUpJ0tIAx6l9CJeEa#e3k$&o1dcR|fxPFj-IOSB}pp`s<{#d;g1xgl%;Zrv`WGtov3 zhC^JsaR!v(rC6}jnok`c$W(I?U4>BmHtJ7;&L-6bQoXD zPnC>NS|CQq`E%r!G5&?9E0)Mn%ISHX{11e2Sg_yd;bAFCi&$MKTWLIvA0Cqkma7L+ zxzrllpO8M0p~}eNy81YIgOo-<@UP~_Q1sN?1T0rVB`7KijfCNi3GmJt71jzCY?R!v zZLP5Zlx~!u~J875WVyM&% zuJtq;px0AF7f9P^)I#+nlKfCFqXj(|q@Ot!1r=jVO<~<;<2qRLo$+Ou&LkUDK9k(o zqe8l*QTnsU_coHn-v?*ElUj;0P!S9MQR-+obj>Sa$E(spwWtsj`)A2-{fY;El=^X^ zjB_-_OwPE90+=4gH?h$j={rUkX5=bkD{OaHdP_rdMRBYp(norRBbm`G$F4#Xx|&1T z4yh^LSYd3%aMDAmN-1y@G`>LQD;>s5^6Q11*o@w72{lI~$}|Ndh0?8{SY>R0(j#dl z!<x*r8HPqCHdjfG-G>E8;p8d1O^5EJ3?B=M#FKu z&bWnRZNT5t;Dk|j<6xXE85^pZfLk2KQl@UVPZ=Np_DeYwo%LerOj%CDkny!JMwXxj zUF|{oP)LF5YNHO*J;v=k>wpFKjR!e=w~jGYWC>7_C&plDYom?HhF^xtXya4H5+V1w zAr4!_8q?IGC@4<0mi6-qBsOD2rt3)!{pOOi2pKbxz(3=))^{R z8Jj}W=Z1<}AKe3+t}*sy|2@>r6O4a|qLMa0Z2#5Wr?Nnu=;{V+uJK*CcUaQ>XHVN` zWE4VoU<-|-q4Jh-F?PHt*(h=AV-z^PN4F>_8^_t?tM&vg)QCxK2=-{x^cw-qOkTp_oOoT--Obu(M8$Gb~RpT&dnW?kmw-by}JWGL! zN7ASNZ7)dn63ny&MW<&dK^MPboHNnn_^ z%GgL0Lj}c+XnB2u9kKN1t`%NF9aVChr;p3+aP@}wFWYMCwAOo{D>noH}09#7CROg zKO!_2g&jtU^wJ=eH|@jhrP2agGk!OIA-A6n#V931tMW z*r8*_CQLK_Eh(TA6eaa!AvQ8ut}z=Y1+)Y$50)jJAqzu5oiG-%s*NL%Tv`hb5=WV4 zL*;5wfb7qV*&xj@X38CoL;nn87Gd30-tLsvM$^8<8F?gL!Lk-cBe~QR(|D{*Gm6CH zXQTw$w)&a;Tfur!`NA~-xrPon>Y{On$R=U#2IF*29*WNL>tn(FmGKsv3}p+9+mQ@f z;;`gf<2q50h<_+v6CJl9+jt$w3U|wx>eRO;1Pp=#gU$(MTMkavRvkR3%J1MzoV<}8D* zSFz@%v4r9KqNxYRUIU|s20u(~`bov+Lc!O31w@clqt41QKq;Qg+vo20?Sb7EdN{%+q#+Jv2}M7Z3(S} z^pWaFNYqH_xGcq#r52nNo4$bWC^53a$RVaJ;;Ot^0Y}MD({m=SpypR&>QZSRhh+as z21iGk`m!~cImx(=LFs$aBq*P0^vSmQIV%|}%e@X#Q%o&ngUn}mX`(5fV>ysE)7S~S zPBHbHJy|CUQ(|1gKgF4>;k$*<4g!1n# zi&65M{@_?XjQm{O4v8J3W1#63kt^kaeb<44 z6i>rth7$3s&89}YxSkl=0u@n8+IKB5UDU9!cb@MtapGpWUjVsl2&r)FH+`rP!wJre z2cy~C38oB*Qe$+9=?f-qqu1WXxSf_q44=Jc5;?X54(+iJ(sIIdhi5zC&;d&d4k$Gp z;@K`dRBRC$YCbYO;@CS-bj_TGV?Q-*(cFwcq@Z|vtSlJ;fID=d@XaIB`jEq=lLB7K8~iT^Wrj~5n_7u`N#rBY{-Nnh z{Pu|{DwIH_(<2--A=Kt!YO%hcxIN=VJ1Nzi0jnf)Lry%NGc`~TbY}A$&3ieM0(A+( zBFAhtPm||k30?0)ag+Ks+Q&A>;;15P3d7ABGws@bVKX-o2{bCI=W2*|)65ng5+clJ z*hv(;W}0uO(DjoRY8H)K{pNH|yi5-%UVYGb6qGkqx*+9{ zy(llGmxLXbnqN^1F@je~IN~OtQ(QK$wv54b-f# z^*o$*wSdpd-a*TaLiiSHR@=TlT)xOhRXs7b8pz&kHiHD_KiGHZf5S|x_4Qpgj^WZx z=0%KM1%JMI9X!8otAo;B+cI{zD3HSPN;785ja>s{tle_B;O-L!H#+gg!wXLyrV^j# zwnp;P>yVLcw;#?~k-_I}c@q5K#^KEKLn(*YW8O)C(U|ynUyE@*A5?U4+w35#HG>6CdH=6n#7KtRjsm{_nJH{T=lD5)sy z2p&6O?j@r~#;5v7X!>EJ#?WDo$%5lc&82E(EKNTd2$m-%4N5)SebzjP6Tc=_Z$ZT; zmKdl$9;3nty`_qk?6M4IF#VEwJ-ZFR8Z7}_R&HL%vpdlHlqnpxMT%Bzvfon8LAcZM zjV$di(E9_^WjyP$v|_Mm6@9VpTk|YN5K-h2OMeD^BP{Pi!8%JgHoR`W%BW86aipaS z_NX+!&r@;SSER19Ed|D=q6ILw_hOqvRud0;eaO z#oQ6U|J&^4IpIE(J$5EQ+H#dn?&Dp$^(SPWCa9q37jp`DMT-Q9HS}BMS;H5#N${^F zf~8zwO`t+;*&ZT1c+xGriRmFtVvKkDnyOGZ0mKZiR^3nno%KL>C~u~35mKP zhQWzgs~g`)wS=gd54Q}ljOHi_Rft-MYi0dRX5=zb=s}Y_d#H6PbR1>*hybI=;UOeZ zL4tJzM89s5a8y^zT6rKuJw~R5(4;3WdQh4>SDgTB&lfdaA50Bl`ZdbY<8x(_&C5n~_EAXabS(*5#0_vD5(? z{v0v}(R?B?5QhbGEu%O!h32BAbu%9%U2AB@v@c9QFnqeuqU4wrwp=t{hM4zFZ^Lt= zWgg7kZRw9)1D2DF*+BA&R;WHpY8qMSjbt5O&-&5f23{sSLh5VWQROe=_f5-dgs7*k1|{Pnk~Qjb)Zd zRx8GjEb@N|vX~yztf&C2>P?}ntK|Vy3sxbE^s+!6;;zkbsv=nc32z*q+` z-W4}M$`aErkkHjK7oSF2X&QC}W3@<#Xgw<-q6uicFE(PZuxoTHm~&Nh!iBEU2HIc@ zxr`&Ct-EAk>~xCdbK3E+mO|fLQ+q706elofVziFItxc^91u9PV#9NPRI+dscR7rZ* zB9Bdwy{RQFt(3a8BlcdxxV6?OhK<`;zvKuZGY+*r$9)xIIE5FZqw*0uT6kmAmO2N_Ao!C@uC9l_UfLb@2PDq2zKa(JTU+p~H?q-$P|5zjFAf}GJ;)K{#l}Ysh03~C0Zt9GYT;0KO9mvT zhX7n09i_s8h1RwVOGaD!P$?m>Nl~;#G}gM9Cmf7Ti@JtY6Rfk;a*6I8Z%{>;#wlYM zw4Q1GM3jr0`eEE~i;joN_SSl^Iw52hcrS~CWTWbjsl!8_u#$OJo}+4?)U=QdthUcF z92VPuLWlkWU8c#zoJS`3MkLrUS)WNUcI3hP^f zNENmP6XYRiw#h}hiJ<+^ z+CVcdw?lwRl(#Q>p_{A^t=V#kl{g-SGxE0+pn9%j6J%$GOoXCkj&Mj^<`|6=XM_OD z9~3hH2G0s zWSu0k3{2g^@$6lz$e{A;*h!f2yL}nMC-*X9OGWN3%vp(3x6=zYybD-uu+hzPxYirCC%vH9HkAlQJb16`I zG7HmrRfFs_$G7p(!5;F$rz+7LWvk{`_Tl2Gc82c8wp$$Y z=OxD!=UxBx)IYfn?QPv@W}||tKwfgwV#s;f;J{LkZ9JFv+mj127mM>U%SS*?xh*7b zRN85bZeycT+-^v9WQUn%>3j16T?NG-b4U-b)ha1pBuq_Q2EOICT-?yvHciFoutjH^ z1t>py6Bc%{wZ&h0+h|*OWnNrT8kEQI4!E&NpAO~o_z*~Grz7y9yV#uJxqh}bj4HSM zr}PPs^OHvdMT7Yext6Fu)o1NBM}lD&Ul)EIWV5kVIBbW$n&JH+HUkxL!RZ5*Y&B# z^MPuZ?O|<0FLNvxeBqJu-lC267T+6Z0Sh&4NHA2B?;#@3b)G_2WU`!HxQ)Z-?oIY7rq$W%hG?|R!&p1lP% z#kLRM`DCLlM5H3~o9z!5kN3$t0%AU0Tgh@tDGN2&;xMt)c8}#H*C)J9A#MYM$u{Hg zwfc3ryy?@P!h){$N%H*yFxYI>hpXS0$iMk)PlEof5Ngux4f5KZDuz)z3>GMQn=-6_ zrOSJ{k|Q=coIwTbS4U%wk%ba=9%;9tRNod6PF z=i=MM%RZayaf_ z^St8NI#At--v;M;+7IB&A8k2GRs_ZU9QE^33ia4-hMh*t*P72@c{w%>ESzm$C9AU- z3OCpZP)V}iL#f6_vD&+N-bUo7@7sRhm4|(;e9hyaxQBfvF8JHFoM%U%pd0@Zc6(ye zs99f36$m5IlpN_5=tB#XD<~7JTkJHwn1RkV_D0xIX)j~qA?gfa`WEg-*)JmbMLWxX zW`8U*aSU>I*~{U1+t~itP-nl&vG<^G2iFF&jP@_kWVF|CRKn#CvD03=#ZHHWjzi65 zj%sN?cMioP4m)8_Cn2Maor)*h+gEdW)f2VQWRBSd9bdNJkUKa9zHe;<;q)xK4pNrt zn?aGmCP0%m{0vzcNXlr)u%O!ZLC~5`L%7*S;mCDcb4+ezKSK3fnEIFP5X*ad!UU&! z*vA7Yqh4O(UM;5FwACeKqYK{-Zj83m84ZP41~pxHa1;O< z^oN-X>?>$xdSLU)0wD?1g(LhgGuz&S!#;iOB_frGC8_Mw@kFLQgbpkWv@heRP%QUj zrB61T4BRo;K1!|@qnRIp>pJih=r z+LLhJIQvSDU4lz@Z1u3w1p9X?RsqF-#8^RUV~>*!h1Ndmvm3`Q=atP5gFdbKeULTC z?#Di}?Ij%hJg=}H?V``If6B8fd1V=tC@rv4qVxrpj@E*vpXU1j@{30K;~9E+2uCce91X$--mzg zw(EFS3I2U_Jf!Y^I~DO%LF77D3rLAD6hVP0L<`}|%uAuP1677)9JC*RLk}A_0bi9z zfCGCBDxCJNeFG!Vuh4F<52e5-V&4@!1-R7*xkeN$@uOvVe}IZIJ1sTG?6lO}#JHpO zOXMDlxp8pN&vyXtaeEKAcg!wA^>E$<^P>!enJUB|^K#d9F4@G7CS-UvFJRFrI{|EG zKCmZ<>}N>&#eNzJ8YwN9xXa#&qQiEvaoF>m{XIsdWmO|$spKWku0}f4s8b6AX|w-D zsd{;9dqb?eVvpd(pQw*tAh*We4HGNuy~wIV$v>oQwfC>pPzG!}%5{MG-;pif-4N%P zfv;Y*f1#Em_U991{mX|N#oso!2)rzxY$}eAsSmyoTRc>^wyWfBt_OYp9eU{=q>A>$ zpl^D^`UHG6ra-Z2_7q3I6NGB+d3#C79f4UIRYBH>1bM9d&lKq zo!EAM0MG>M3t0~usqjFeg8&I7#5puwYx{V@@U^ZEhnfw;oW73fOysC(4fbr~=)zN>Jv_bA5z$gc0u;h;8-)^yHy zwBska)~lw0qX87T9SLx}fn&J*n-(j^I-2ppGB3wENQrSIL5@e$6G&vL>b7WTPb6mp z!Cf;Z5J>fOl7lc$2~xu~bi84TgEo6c;`CXLeM~g%>k$}%5wAKbnMf`|X@)2)>kpPjsAqPLF(HCF&J)J&FI_c_?%}R zU>{f#puuX#D!jPau|*}O3yKfwfj`$FS1l^TcMcAu35w6C_AJ*ipAIw}b4-+bq2pJ| z2z)j*<{8WX%KAiR^e7zO=SX2*j9lip!QlA`$7UcdJK%|fj&4kh^o<|i4E%#*9Ox|~ ztD!P6mgjhk)S^ITVwiQ#;V1LEYE_Xha~SZglaAljY&5R@*pbP^I@Di7NX-bbG+PoFQ_`_Y=kLayKYed z#7yUOSp2gin>EF%i%wcWs6^e0t#3O%Q_@-H)ZU)%{C~301PcCejG+U|sVN?+@=WaK z+6vNP7`V99Tl5Ye!&fi2f9=B?pO_`?k34LIkp!nMhWdUaz40h?Y zke%<*V~XBMr*J54QMQ4KF!vH%Avx#sjBxw&E-GiYIFIpk>bSUvvm=!qxtvsX)E$2&PYGm+}blwC1(wX1-KtPLtUY@|?j!_*v??C-yGP>`!ocE{B9E~;)c&fPEg#Zb)M?IFP5u+3EizGG?v zCJJ0F86HDtcOirh2q_r*LBW1NV=4Cy6Amv7Ou}v1P6sCrB;}02nh7ogjb@Qc2j0`p zALz(#)z7X7Bs-KyurA7hRFC8Q9w&X^e3M`+tmx_{S6z^z5ioI}hjtEV`oDp9K6VmP zkp>k#-OpqbZHjScom7XMj>gu`CWLFZQO?8t7o3AQHX4lWoq%tZJ7=lc6p+4g{;nB& zd`Mujpm@+yHoiT0KDq?n86s-?RYRIdsaZ&5IWKF&oDRV*(*@A z+IdEHPiFk?rjwF}V1uj&#vlk+R8IMA<kU7Sy;^@S0>KB?_A5140MQqj*R^6 z{F!G{;q-Ev=v|&TPthqvsBj8>p|XPM20w|O-uI+E?T_3PH5Z72)gH6A8R?wi+kmUDwy(+UZ7vkcS`9Q8=0H(w_$$+byxXg?|wj{Ib zG-QXmv#?W~tBhmwF*nmWop`G248=t)T}v5ZY`L@LTZubd_rdpv)c~)ybFEOp~oqt-*?q#|E+8MY?N!9K;s=Z)}>|YxM;r0zU@Ef!DL#UTrWOd4M{g0NwSx7QDNm=7lmR})HcxBhr`4H z?kTj@m*wh85S{lfMSyhvqdpjRx?*9^edmG~Cy|_f*By=!yDIry&8okhafJ8hORM1a z8N+QT_>jP;mmWJ$1`7fp<($EXPnNq>0>O8|L#8?3IHzOfw^1Gfv#vRZ1SjGf7`eiE zgQWXW8751YN9QG-{n@VmE{X_!PFk4%C1#JHnCmez$El?1qoB@=8j2RU3rJR)El9JaZjkj&RD0swfoWr%gM;0^1%9J)8hZP= zD*uc3zCqqMgWsx51Bpd1`u93iJ619_q@+5#6lWFC0QEz!m*x?aPj^%05_9gAA8&<< z0nSeHvn6}AD%>CoULQBrL2n;B|;z(C74$G?@#lh|gHtgdn2k%OE z-P-ss7<{EcVwIErqEf2oH<)nA^%mQXHK{IgETsPhxbCuxDpB6Xnt{Pv@y>iGnC1*a z8iBUKc6VUS5cyI0c_%>$!(GPU-JMu7!u2i9txe9CG5)&ilE~i4tD0y>??hKy4hR0^ zI>^XJ(mHe=%Wt{J$?t*GXHoCr$-Azu@?p(XE}DS3YS#}u+XscMm1&rA#5sW`pjxC| zS%q>x6t<^8HSM{B7T*5u6iDpg+=%-hx&|rvgDuBkoXPnX0~#DN9%1fej_UQ2{&Xlg z9NyKv44&Ui44 zb``bX)lEJ%0n503n4Nb06^Vs?rvA*k$k7@ZKUi6wY% z`YZ0-S}uaBT@{>2gdzG|shIfGLD2*GX>}2<1I!{{MMi~bSr@I%! zwB~Ll(7L97+qY@Viet;Bqm=2p(JQKpP&IEUre7rPim!|_H-ii7>s3;^w zb>vj%;(X2M5GS5Wad+Zn8$2Rw_cKU3=vfTjJ*p11V=tk4w!4l>m_x;@wFph!;CcYQ zcwU!RJzo94N4=Zuh(4n0A|~z7P&Gz`PBjdqJUTw?`#Wq~P=-sGRH|{%T6M~O2YgRG zpWuaM?v{*|L(&-yt;*lUDk+C{Q#4)y>21TlfYRT>Ct=aeur^eUy-2l0=J+zyRKzSI z=*jQ_cFuKoRf%&2#jh>p3~4YJYTV9}H{H)U@dCa21txXY$RSECCk1OYv=^Me%{`TU ziGE+Wno2siyB{$27359~Yl6*oxGQ+VB8!!VUAT9*dkD|I!Qv1D;R;3G@YnF%0r$5` zaUONZ)pqEn4l9E$`wI1W6$+2Xi~{e1h#1JJtD1s|Cp3f^$Sh#S`|do(u0h;8noF4N zjcCO|$Z7XOb{*pO$#?2SQ2sIc19u@K;E}!KKC>&FP@1&8VXcGOs|2>s{T!+*VzOlM z%aK@WNHgr9y8)y$jYuy!@Aiwrd_w$REa25g+_AwEs#v7;{3+vVN;;*gqzHV6hVZ|C zYlX&Vda#F^U@Xe74X@)aE|=sWMojINJCi7iQf~Wzd+#$&HMk!=Yt@hcOiGTrnJ_K-pA^16yWC%0D5!CE3z^k7qg0DgT0sTWS|1hJ~le>@1;M4WDws+lrINHMVR_^T`U8~!RkK{3<;By>aKaGJTO1QXYVD+rwc(z#GUDiOuly>w zbYgXT=NbB&AEQ0P7*kR4Jl6`mAu(F0EOdmzjUx^#EukJOE*MK%WokUW%+rN}%=w-V zFm#gVZz?P-S>&O;h|W_zr#XToPp|b*J$i$4pXrhH} z<2+WVT;lm146k^;z{kr%R^Y3UBOrZoHW>MvHHA>UKY=)h zmKUJ1)XcD~v`nF_tTex`*_fH{KF{;}=T{HA=Iq%sYi8E0nOU>eYrV!#KW)BGm=snP zCSf&LX~t?0N2z^uxR9wZ<3c8$ng$wiL|kje5ixIyRup*gGmC5Qpw9yWyoz*AJEurqwyUMzRu_s+K?ceXl zg2nZA{JE*}GxMFac&IOul7B+)l^izLL~39`w~C~ZEwia1S>1wO+!XA<)hEq>`;qaH zk57DS7N%;a%}?vK(AG4JA}L_WC1aDhoiVUHHw@>(O=eN$P^wE$h;P={gC-x>H<{b3 zv|f}Fq?(}R1}++9%~kRIU(M4bXdfNP#th);S;vyC82w-Uf^i_()69Fh_IEQ3+LEc} zTWceAOSj;l8|yQ1^d&PcZ`;$knxx#Fd6w-0NpD-85y}ybv0k$xf^ zvh^_B*WCnrFRO*`wOc;aOD0bBS>BfnJzi@chS%SD#aoODKC+~h_k|V3#DL`sZRV>n zVFL{aTB?LLQJ;mQy%~P{1-DodRP=2Ji$&-ZFBpvOp9h{Xz9%rpy(RVq&CZlKx$mUL(u3%@{SA++ui(n)_KRgSlepn`|>Ekvcu zgi~o*7i$kuT~8_zJK^Y0b^Yk5)-sU`?yx+s6XtUHxV^6EZ5^!QP4`%aO0bkG{oM?Z zhEbxo`%vj6a~gLVYdN5XeO%=hql-({CE)^N!bA)Fxo_ptu{JDvja`gO`RQWIAOr9& ze|*>iucF?ds2|1r3Wm?Cu*RvV)hf#x>NL}G0CsLUt*z7OOD~`USCm-B3$0*H8w*Sk z;;d8nu?<$`7^cso?(?m0Q}$M4Cwi;a5JLrBET3LoLvfq%lC_i4@O(beXwAVE$Ysgo z84E3QC21f@M(Y^by40Fa1$y%m?q6nUVbH>Z@sB8~-(i_j{xlRK4>TIko}HH8#Nw~d z#ouilQ)qbxyUb{7F@xgs5;TKFyOW-QcIJ|KCRv`hd<&gmU5zCLdX6~DK%TqKGDDJv zQuO5{SnF-DIMvVs=8V%1ORYKsTqF(uc1-DnTz6CbM&o)a2wRf) zy=qH0HLTQ%N9rNb_E;d%3aDw9Krz^BS*h2;3-UYYa(7rBDgP*`<<$oFlb~?a-&fr; z+zNV^Qk|Io_u%GHf6vRehN08_rupVAdZ*=vtKU(B&vGxl^syyhb0>0A>P|0iMZU1! z19Mr6B`mfHdU!l_upHu)BHI$MY6mRY5A06LPzGr<`%LQh#-YH0uRwYV9&b*iO+X7_|u%P~(216Q1} zjMPKLSKkmjnXCF(^3>%~dcc)NU{hK6W&jI$QHA9$g{+B`zXk_O4Bls4ecXa&4wGiN zLe~9U_#X07wAH+s2dJz&B}`1L_9{=>2eV>;J*Eg1wdl&>ap@n3k) z_A}PLfE-p?o#Lx0P`O*huZ`9@@U0nVJ0*Ud%EdbTN>!pRNNFyBu1&$1YJ?;LA86)&nzN|9*G0P7HG7UgG|6*8dIJol0@ z%nbvrE=dYgemC>7tF+7ox#RSU`NtvFI7yn##nVL9U&qH$UXJzlUBj)f=rpmKh{k3W z61qxYs_N&yni+<(>`#;b-NRy1ctlq|hQG&^O#(+hXFUUbWq17rF?+aE?Lk3QEABOZp^?;(m%O|OFUed$V zey*i^`K6@kbbPMmgI$xXxYM7{rCY2sRa`yLm<{IIAAsd)gnj{+ZWF&&IjwnMlUe!@ zUw+i8(Lf(q`7D$c9p1JIt?z3|TLeLE`2AT{KyxqRoC*t$-{{-p+~Bm?!M(FButJE? zFQ$A9HD!nNUs3i+Ly%GutbG{te1trILBoH`eCun_4VI18-~1m!x&ViXfyNc0q$ON7 zP7l|pf>V}8Zgns)TM{CAu(Xuwcej~O4cXSI^xRJCT%Nz&s?|$vxooBNezo=~d|FP$ zpIUCG=tcT7Tr%7SZ}Go-QyhEsM8!uf{jcd)!Ulhv(i%c*j*C1isQ9=A`>zewIReMc zu|8>Sxz!x_zZRE~66^vUo07i#KaZ59qSR-x)EIBRy3|xq^+8J^qZRY@+BmE?lm5*y zV!e^YF+sl^f2-ILg1lpEjrAJ=+jimwV=80A)PO!(9{7psN-e8sahdT>QBwt-*k~jn z`2Exv&*13Tvk5-=?BkopIgs*m#z#wcwa@F54z6qGThN?!oSe zin>_dW1Nw1l%yBAxXx--)0S4YK~()%Kv@0hH&Kn&3?u&Y)-!r(3pb6jwwFY82Nfaz z5|y>or}GQ3Ybkv4Od6~RYAoNs0izG%&U~z0k6JJrKerLS#PC+{x;}!M@4FO#oE^Ew29bA z{)dcMCpu{}{&rH0(_!Vhd#x#wBJWZzTl2Zv0-~i|lp1Xr%-Jc{4MGpC2fEx>*jhFm zx7d{xYpc@ES6I@ux{MZ?A@k^tpzTHJRhCSxZi2^EvJGo~J6sDr_P>L<3Rmc_!@eN< zC&Nxb%?|wSrfrM#eZ_pbUlKic6QJX`vcj@N;__~`i7LRxRj##6!@uH7l*9a zN#Q8IoGv>oX4sV(E2wUtE=Dx>T`C=ISwekcEMqw(RxF}Lr>p~%QGAbz)2&}q-ZZ_D z8%NpN2z$W7)4G`w{h4Taj_vo^zLsDMSf8a&f)IT+$=AFni}h@yC>oG*7YrV;vaNuT zhr`l`8jEdR`KC!Qr4^3yzo!4Yzl2!7RUA9s(!PVwVKP`?f!)A#8|(%SQ0ZI7nOu-! zouQ1d6ZIZg>M_P4u#CUA% zg|Rs{rGy9K84Ty)=?M?Ovt1a_zNWU}Ts))0eesM8!w1Hs3IpHQcqx2yM8r(v&*7Vp z_&(eV&y(Svcs7J{@H`gI#`AEv2c92=VKHH>4R^ycGu#!=jBr*&gyHKjjA9IB;m&ww zg|XK*q=eJ)42H2t8*E{$#)h~sFpmr^!XZ2j;Q*eRupguNTiA!^%%8&IgncIL#`9Fz zh3CmI?11#g!wx);hHZEr3S0544_om3Fl@&2?QjyFuZ7#;xjmeS=h|=ro-4y~crFXK z#dA(L7SD&mt??`jN8>pxEOzmO!We&j->?wXoo9wk_>VuV$I}yr7DVq1iwV#=tb#)9 z@~oM7UYLc=imq|i3_MTI0te_$%z6~hqqD#Vx{qgp4|MxyO~Z4~EO3)<$1HG@j%H29 zbM7qgQN$z>Sfm+cSU2)t*v>P-2>*Y8J4Y7IM*AXfpN-~4_M2_Q^TyebVv$+1(bUKe zv!PCmG|$#z3?f_4#&JK=FdHp4{WV*{^ZabV?PtSiz3D_4t=Au>+T*qvy!Zp#!xHDd zf_N9AmyWPzvu&YC16Yck3R*9Jy36L5w4dSKF{=5{)<@)JwLnGOZ7Vit9h!)$D41^b zpjY?Uyv8qAMTYJ04{nZ6fS(+E%e%H+DuI5ehk9B7^j4<>rP$6kH{ZP1wp*CTHoa(r zck_PR9=-H6rEau+zz06DyxPU;Q!4Fnm&QOTc~N#c9)z{#!Vm0Sf!b$lQi-4|`mL#`DtiGX+-%RGf>riNt}@sMs#W?X zD*M$AWS1893wlZB)L8ogwNC#dzBtd1&9FZPt?9288#m0dV<$RbqrHbH?3d;B_IH#< z5E}6ux3$`TlvMg(x#_gMm5RUA*|D#%x$Ffxz&e!p?JmirzgXEejMMeo?f=!PVPd*m zsEiAH@Tz%d^LK;q6ssc;6!pLJj2ZTs*AoJVuL%7gTv{w%{S6@8K=y%AM&Szx-FSrl z&t`%M1f}qeo$POERr*U@60(=5F$~b=N9h0Jk`yEn9;P{cnaT!71*!Tg_$>D5Wd}1z zwC#kgEo}AeyX1I~58xn;hkEoBMx7gnioGa`ZhD9MlLY3XmQwQ6hF-U%n zxyyc5@k}@9I492jI?g@AjehJ3Z3)UZdMZ26Hl7!!+HtM}8B?TPW9=uj+5jw%n}bA% z9$~ORt%OMi*tiG-ZR-|gZyprJplrio^`s42l?X#5*UYu|kjn2c{UYdxkK%z}ZSfR! zSCpGZJZZmY*EIWBjW(o-sP6U8Ks2nk+l(z&C4^z0y*vHt@1o8lVvlUVL^nh=AFCGM zWuE{#2a3iQO|d89QqB%%{0KuUN`2j4%hng|Ujg&$q)k!t8=@)oEqg6hncI49y@O5&L8Rp}Tsmy-sC}-_RkPtcj?*=jsa*4b{eg*aS|^wbx>}hD0Gtgdveq^Xzug zy=gDt*_-V%1uSCWAv@rntL#Jc&@7i+vc1P2zGBZ3n&m>t-tj8?PvqO)u*1dF%7t3{ z9EqQ(u|KTWrocGx)_*ESPr}pnL;GBVeT^rK{@T-wm-IKY{~&r9i;uxUF%Q_=a))Gl zz3OjK0XL8cgA;&K_7Os8K;}HrXlK1P4Vv^8|LU6-6#2V7(-_)f52tD(j$Xr>=(vMi_=kO!;wFx5 z_^VNl8$ocL_44o>&Ti|@!xdTBsebXxiQ^=qfzw}@p0VB z>3}}6Gu3A}aH-~Yz@j3Po4VpX|KWFZGiW*ibE|oHK|~j0mo;f&7~Ad{t5mAc72DDA zgEj-z-N2f3QB7BXLG3WPTP?RBB2$ywX5S*wXVB>!%d<5SCc)IvaGe1 z)3Y784#{TQG1mz-O^3<9-XydXh8(svC_l;WBr)1O*>+M%``t!5JIK)%cCazS9Z75( z>;S||FSeZ#ueT<<^>pS=N4(UVZH>wY8A_ShJ{oRf+j;R*U4=tOKa6xFKs)Ui<%s2B zRnB#4dUK4UH{!(DF1ntPc-1(^X!vmNjB@`3h3Xi$mQr>*aSsw46;O zcH>qcx6HvRU=l|8l-z5aCLv@8rvr!tLmUjbp&SmLYA)k8ph}1l8$vakA&#=wJ2l+@ zjPqqc_&@JRhf+E!QxsBkPjeMRIjXBj2QM^#eg{WoE9r~P>0unzOQZ`fJ2lHYxP%(g za3>Ys?ug%+>)L@r8HEn#s9fbEgG-_NE{e)?0}x}k1ArKJbJSqvWpwk)5gavCq^pNI zOxTVY3eqyDxXIau>IOI>x&3g_slkNiyoHo<(PiW00`~}sw^^9&n`6sWEQY5KnZpAPk=(MMhHLZYS(gKXHszOQX23TFLtm@-|L(;F7bAGmY$>-37DH{Z5Cdd<+-vR|*V^0w+1F zgkgn3Ji;)RQaifhDX*P7#4{4y!&JQUF*j6{XMOdO zfbm*6TbnXc?@1Xg<|Z)zR=8Z{{hY11|62FUm{5Phe`K}2nG+tQ(z{)Lx_=k&P8K&g zy799c+@par5$n{@nRsWsG?{8%arflAH@nxszHhucing9>X0j=4t`Y>;lbRa|qk!3N z8{e?Q{Vu3-fvSh7W}X{2Vs0mH#HLZsTz3wY{O*Y1`**vSU<8^RN=qJAx(u_^UC-8s zU0vfr2L zsA`@fk5l1zCm7~}!Z2gdm-DFXXE!AOSiulaEH}$P@VN=jShe&dmCbcJsptu(kNX!n z;l4bd%?4QvOkQ&}3&^p`<>i7st_n0~oy$t6A9c2aM|X``#>hs?7+L$H&3PBHIaYl8 zcdKC~`j``~PLR>+Q;&m?#T3(0hT?3VbF@L%SsU@>1`nM$>{7h^V|e@#SDA{YA94aR zeW}x}#fjUn^lI86mX6mHNxF>Q?CZcf(QqZb91DcoLZ1(C$YSwm&Qwls4icG8T}czY zdAmrTxsqN1SPe%{s(#vG;=B#c?LxEr<_MAF{FNNf(3>Mg`ofj;vvguRq*BA5E*)ET zIKNd(E2(xo=6gylmKltJjv8tmun(Q!Sgp|c9PB;avGk+b4J9~M7RJf~PFh7LegfD{ zMG1tz)$Q7)G6h z#%zy56e7y(SBeQY7xOv{1##%cI00)ED?@u_Yp|OdJGmfiGF=chZ;+JeypbxNbnCf) zR~LHmP1^UfBZKPNIXiIQc~`jMEf{4>LO_XcV8pfF4Vl-+1({bv#g{~<=ep48Z&Q7_ zJDFowxN8-H-l2VZX9iWTbhl*xN_X?**+Zq{v4)+FbjDv@9o8$^-=)Htm;{Y0AVk}) zbstoIe2@0EK^e8%uzPCQCAnzgE~(wsHKC7^=Y87N1~VHALoC_Pie+vy1eEB>y}j79as$e*$aPAD@QB$d!Ekl5>l5LWeNEp?6Mb_4 zXcDNRuCLR;_UWR?gXHK4{YJYI*J+_>Eh~gDwai9esO!>F>BNgJ2fefyz1?G;Ymcyy z%(=VYT!T?Yj{T%ex7y0wn)?RL#&i*p9gOC@0~MDW@-FbisC)hAqb++(mOf zp*OlXU39juvo#g8aw==WW_5Y4OGDcp#fyf6*gx7&y5CW9e@Z#~T{&0?-EH`WQ&-yi z8ST3r)m9C^W_2i6vL7bLo#_7KcRHPHZgj)w^6#}_xkAwq+BZTFJi>{vHs{^1D<2)D zoH3|atP+e>0^RmG6<-h?x&s}mJqBdE3@Z4|owd^~H&2}}sBDeP$D!S>&k(|c>hqmg zOsido)G(mj_Yf+m7z8R7H-YF8dt7UU=XOq>XzE_U^Cw^jFK4kmR&H+NS5z3|wn1s{ z>d09M@{8(SpSV5;loKC2>~g6E;H}{sI0FLI{2+%geK4HjU5VpX|T7LiDyud>iaC3k?QWnMH`%p)l{XHHT1>L zE|2sBO~+vYD=3&iWjI6Av)rB7HpWmCkU%&GL$f zZ_ay;j*kIhVy7uYLGyHIgeg3v2W0yfO8+-e(^LoAk1eJU>z|;`pQ!8&XEz}hnmhbw z%74%SNdB)K@XdVKAydg`j@CS2ntK4$b#d;VlFD$NiXU}gOcLCms?~;HGJ%wVSp@A;9m#Rp*$!fzk(rguM%+Paz-mIS3mT0osyZ&_ zZ=M_TS4}n5jy6J`zl|L4H0RK8Fk1QI{pPfmgRx3_UvpYV{dPDZs|(OdNsma+t}n3} z-tEM-N`%qC4!e@BZcZE7;a1Xnn$vKz_PIVKyGAz9q9#X6K3C+%-YF6{uu8W5&DmN| zOtB;D>bUJtOMpyF7ddKwa3~c;v8Ke0gIFtebQQl>H#wr{$j^>ef{JK%WaGzjh;U;@ z=d>*B4~;SG=p`}=QLazxjJpJ5Yj*SzKQ;d4NHnBnrWWG2HUQ)jzwJ{uQxXdxE+vo7 zX`&yWb;sd8+%Z`E68%>*B~bPbRlaD|{6###9Ywl2#;K?8*Sixn2`O1=lt0Ja?cbst zN2f$~j1qaX|CG#HXw{AF*fCZq%+_335<4b{bOHK`8rj_jvfWW6eks{0DII}04wIEH z&NY)`CC4<^C6;R3z>%`iiE&PVL+^2aua@j2U3P;Z_qwriIoL5<`Rs<~ik#$_=NiEy z>)aJ;ETN7C;$=e*h}|!4bViC!b;ID-neuPR4Uj#V9m_;s?4`A0p%5ntqlX)>|#;toz1ld$g$Cd7Bq?$1lh4! z zt|Xlubt0WT6VvPWB>8p3bjGH91(m*_ft}6j7B;pYaUE;kleaXbjLNuI99vF`y0=`6 znsXH-_jwBJ^R?mevb;~H>#B{IQ!|N9Eb#T9s_xMy8s5TWC_kXm(bAAy8@YP!OLF)I zZN!3Oxs=*o?m?TA<>}h2r8kGWaB_S3BT0+rhiv2QI8U|2{c~lDSOtyUx%i~KL&dN3l>16h5oTw~!?~cB{Ja`& z*!h`qd&EV^7xPi7MfK-9;WljRWO7L}faNp>C)u zrMnz2_GrdlqUyGs@~d2jC?rL4yi#><@oPtst1o9vR46H&bOd*)57$0E>>HvWCyzD#N7*L@Kt6#y*^? z@zksM(0y`yNxG$(mb_f~1{G}%%N7Jzle>uj1E^|uxtBult<9v_=Xn%`l(8?T7RhLM zN)K5l@+-nNSE*PeE9urMk6XMoGYbAqX|P5a=OdA$}aI8?g_fft6;0PPKNEu-=yT1 zXUjRwuPZjl1(00JWj7Takf95WFb)!BCx~Kzx;)Th;>F87u$HfAk}If?8FnZ9aE-#V+?m5r1PhCD4eRSJo(Fy3I73I@pj~I?8&?ige z{PO8?FE05}EQ%;m7a`p-t8=~Adw!Qt=3Q5l%AcF$n7^pKz;T~M)CU4B@O%RPsc+4v~XRWaAa05|tnafW9Jc=q?1) zMH6R;%2Grpo>17X4^@ru82R4rp64V9n3Fv{_@$eSP_NzPrz9abGDHbZ@qfyXif0SV zS7Ij1=ad$!uI;891TmyZn8`CM?0z9?1>Zqw*%xVZR;cZRONP0JFXio{|48?|88AKlIBy> zEzRvifq6@@5P-Ym{-cQ*S?^ zk$?s)y0tvh6Q@We(U`B*r0(j0UJ6o5bkm2pe_JPC5XCIvoE>ssg{!uSG$0d~$UUx~ zmO`LDC=e8D${|v-f0B3d9Z!2+R7uOJ=6?CGU@OJZ8oq_-z{G#pY9QyW@obkQVtaSF z9+2R6Pf+316{0!q1#!v|$@uhji!KZ%v5pfYnUDKcd0s&aMtPi~1@M(Gle3}bzrs9M zL_P$EVoz*bNmYYA?+AV=X`TpYR(S5`6|Z^5OVV>(cwSzO9?FsL60Kb&Y6%K*0SpF4 zf#`h46V^x-wEvXnKB}$rMDt^NJ#*Bi%1)`Bfq2s?-9-7Hd3;p$na50dXFc#dwR`n^ z_kPa{Lff|O2P_6HtzJaSI_inRrLorw-+7OgC)arvsio&>+c{4!coG6He!)SH3n1EF zGbNt);5_@i$3odr-WXbZ$fM_DpLo1NFIV}i2gmZm9_Tqi7!S%Gj;UL7U(@ka8N1`j}_*3-71K+D3*n17cpdD;PL)~lh4qaGa`csw`4 zmXbB6JeSqljcC`sRCV5CVfl>bxKPPe{@}rhxzU58_a>^ZM^zvZd)LjZxqwfgja%8^ zfoH%)&orTpi_v)zSo5T3Jhl7M({g8pccf6sU6Q<+RCN@q@l6`<8){V*Lbe@6LzUjy z@~y{?Xf_@z?K|sjf!0DCQH7hXV=TBWh_ULKdKh3V!gk=UdEPXa;vt%wEh&s~rVFDK|6- znl7cGlM6DvojC0FmOwqn8lNcYReCGai=(?6qqiu{YvisW)MR)qqtocl>FMcIe51Dm zcS-TWU+#5SCwp;zO!wmaxSQVUu?+vPp^0r(0KtC;Y@OriE>*~d& z=$lj~qkJ%po*L4;ChnZ=g?{lZl6rV?r0M0wk*1nXr+X10ppO^Z_ZljT(?CU=>wQNZ z`F5AWsfFVv6y7soG}-U;#!^X^Y97Cs=Y{L+J5)2+JB1$}?0r%#?V3DBhaOz&u!1oz1)-rU z@fr=9ZkmYN=0iu(F|U`W%tOP3iKDTeH4D74Mgf+*sf##L4B!dNy-QWvI=uV@yF4+F zhsbf*2OxuU!FWpf+8Y3rsBbV%o8Ni`R-N%vDt*t3C_)w9)oS=7m!$gAsHk12Gp#Q5 z_UG5vdOMl`)pYJ9FKp^RM*gGZko}#hV7}Kx4c<@`532H336)vVQ6CUFcX*#LXaSH6 zY)sHIjYq%XeMY4{f)9_g<7ux9hl@YFtN8sIFYsZ3bGX49r0AfpCl~MWK48RYLLQZ+CiNgEv{!(Vs3K@qNQc@7TkwDOa$0 zL@)UKcXN!x*90OiP}vKqa*ds@MU-7pgpBbq?$S(T^Qp&?XofK?JVAD2K z(C9102HUrTUrzPqq3A!UFb4o#iwavIruxOU1};eVt-R$WIMNh#_D$fa zU3{0c+MD6uK8n$XNEL^B`W{6ienTTJQ_Mqg=cr<@>RsA8&AXP`uSe{eI)=!YdDu5m zbf+l-cdfn;`CuPkh8oLj`6(e;j{9z-sueyx#h&)wd>ysinCtskuK@({Tf$1M2iczT z$uRgdsb9zn_t8XrI8_kxt}vD|{)L}4Vw~k&IleIVhvT&goPEf*82|f%PaNk=TB<)A zgn{93Unk){yzPw7#ohwnF}-A&!6wzL=CdP5RDjMtX>MyTK}47}BN z8gSek4DQV&M2G^hkrp$V5j7kwSL<6>W(8unZ(d`QOJ0MKs4Ux7W5qx{bz!GmMNYJU-A9Qf2{Qxg$r=Z2C-gj@L|13 zq{dmk#k_2@?>)VyKWxSoNypihzDI=npegD3@!@_f?ehJl1gwj8 zDx2VgGx2U;t#Ar1?hzeJ1BM`6_2SQ4>8Rj6-${1V_;9qaEv-Ztr1(8P$a6atf8&j# zOEut+l$i+CGIOtQHuPuIm>YQuZVG+71R!Bknm>;Rf8qnUnwwJVz3?_Z?1S1;rW|W4 zFI5-#n1?6&$6<4*@oO2}R&9X8Wz2WJvyre&Hu=POWOSy=i#`|J;C#a<`U91X`I1kA zPagAyD50%?DmCcAFVRPQ0e-Wsf40KRey&{Qg+W(IvhQ|M-9Pk?u!}Tl%!z?vn2`9EUkI&Tq#Sf0cJAPnZ0UD?vNH@IgzY@vkrl z9OK%1MbRQ6fhqL`O*kJ@rp49Dl(0mm5Zol z%GZH%XZj{FMAx4NX)sl$`tQ?rdA1;ofTU^ubBeaiB(!Ay%W7lSl$1^i8VLe7`La1T z)6aT%3g_P+*_OKJL_W+*vi+huth)yu*K=vDbp>;h~y{r>7%JXXZQneN@_>=z!i-n9;VJ?6;ea?fO;= zrPm8tfgZ{*-$W^Q$DZaN3;c0vD73QYh>$p={NThsl>J2OC-|wc{;9$}IQyyA4qkn$ zsSv8JK7rv>kZXE?g0}=Vmyc_k$Z-$&f7D2Q+0-RU;6_dHzo>w)ZWboaomn@-|GP>= zv@rFj;+-vFkyhfz=4$|L3i~meXZt%Db;IGS`m!))%b>MS`8R0upS6YW+eNlx+YbLpy>!>onEP;0&9d;WC-+pjnqzzRSQ^K#zi5 zCF;29fFF>m_psEII061O_5Sa5+Pfjkx{6-qWrzK1=Jugehx9)*$hasNpPe!P|CdPso0KQy<|9V_&)g5b_7X$(A|6OUX+A%Vg#sqj1h z8sXl%O5cXgz7N2=y0S!UmiPLLVTQ9tFV6F(akOoFVvq`Sf!lcY8UIYRbRSETl8kWE z{XSuyAiG#%-Ov6@8fn71k+?i9Y6EZ^U~5G4gx~$}OP@%^afx#+ zecx^g-Tk$Hjp$IB>Yhs6AxQiM0D%AM#^(X3c!j9@lo{{<7pJycDp9w6{>g&K+Zd$5 zT)2p9fAj+lvqGI{KA5Opo7*NnI5%?CthO{J!9{YBLEegB@T zWG@hhb<;!C^u0e{z+Bn?O?t&Y++bE3IE|amiptQC0s_M4e(n(n_;uQmnuw*jV1qQE zIR$naOJAN8z6ajnVh*P9qSV0clJU{UM}-SD5sO5&403l2q-q~|RToC=;ktw@(Fqfz zNxRYm@SKLp)9_X>=H5f^O@w4FigC;D&T-F*UE zTWRlwo$n;jlR_0k0}G9F7Zry`17PD`{FF*#?+9cVW-k~L9t9~V_Ea7D@ErjJ)trSc zL;Ts{0bss9PE98~ZD{2i08hCvv}G&$yf+Z{yNn8afH1UN|4dR4B5Y+6B4+{ru`O3! zFx!BFaJNxFJ(`~6`Y3$|4E18;$K^EvHwPvKjtCu6OlR|WAS?%PTd{zPR|eh({KvzA zOn~=MOb;_8$n*dt$U;ti#Ci}scnVMwk+T8-XIVruyZI_<`p1FUI3{Z%>4R~qII{kj z)Rsrg3G_2aV|dF`fq^RRJXF7g3LlSZ&lNxEhC>jyM_l@uy^M`lae{t^w{799q%FK{ zSzw?V%Avx!N!T;22w=~!oC}{65I8A&1B&OoshkTJCOs&zX-41)g{O!Lmn1FW^0k49 zYSjuaIeJF6r+xK-7TjY)V2?1qs!Y&~5RjP$9=|!TLWHMXea=!yjol(OR5v$p1Fx+L zOgBnn+3{N7xTGxu#m{kSFJt%XAeSCgICB*hr&urUstKso(&}ry0QZ1DqzW$1w0_i5Lc$>IBGz;}Tv?ONpAKnr6L(zBqI z8UbHViAHZ^&6xmBurIQvQT%rkYt9QU+CrP=x5%RxsYPqP_hMk1K|28lU?Cn-I9D6o zuF`Hsc~$Tk3|gqbs?yVlwkkbB7X?QfwD%)C&U7W~2hqWgCGE>g28AbbW$PdUmu~aSO>9j?fh;lI@Q+Qq=_>d&++7$}MO4?#g#Qb5( z&$lE8e-WX2dZY*M(^fw*B|Mp4N)KMtzEv3tKS*0Mf^QjLpRWy1LOEg?@N-3{;0Q_k zD(ce}lUy)tqa4gNPC^Z)tTx9>;eJo)K=NH7nxl_>=5lhe+r{qW^-^ zc4Ka^jUGCWs7Dfp@!f-iP`vG7&CuXfgJ!Bg(^s(W7f%efgM3d|0Ka7fC?bS8+A22J zZ{zQM0ouK5ba0G8`;dq*3%cBl4<10w2)u@h<3=sa){271^#+x6B0}|;bV8u%9+C`C z8^b_BdpQoD*y+Hupq`>12~ITbUot5?O%w5gkY|V{`AG0KspSVK>cHrc<9*)Asb0ho z1?sqMdhnz$Kbl@R)qk0|G`xd$b`V5?rQ zej11Sk72hR1XFxMeP$*Mqz0qG$RjF(f9X}>={#ZsI??!PWlR{jWN&*=RvVhMDfpDO z9z_9kje&>#H-^?+i2`p1=g{H@Fx%F>7aRt8y-%kROn#V3cP9+Brif@29NTnox#;A=_sFAXoKL2KB{|@PrMp*s)R++&${{l zAvO{jl^@Xpo~`)Vr1?VlT~E(l5=@L@DlFK1?+rdLOpNM}Tb^XpHwA`8Tx_wzIV-w8 zI3F#4jGj9T&iiW1@bC<7aU}S&N_!0L_?k-RwFtZ`A_qt0A}< zm}^{`;df)be-)_v9li;EqJoi8>7kaevDzJVfOV&XmvqpW)cx2J-nxxJ==4s*^&OhD z77s^FCtJ_x<2>b;;8QA<>3hTyZv_?Yh2VE;wdn^KC~zQt>D|^iPP-Va!{PQ!XL!`5 zXN<)9L}ec&2WX>NJ-&Qk+)C~th2B94Ke9#>nqbt20Ri@VK?cQ0?R$!d?R{y>!03zR ztwNWz-=Rs3TzJAO6#g-xCVbUI#T$LF+l>viQL9WpQBG0_u(~ti?xiA2D3c2lLzT$& zGt_l$+fl;{-dyqfUHrZ|v_)@<&_sN3U&dwpL&aP4sl3%48lcvh&Y_xL0hQi1d3#mt zZBlcTnq7azk5nY+Z&Y}ndMpruLS<_GJ)N?U`2rQb-v$!r)6iC~O9`cclHZrs4*=dr zT)d0>4G(Qs>pP|4{@(Nl#Y|U^;<1^bXOIcdX{)2)v)48BAyO9sZWruMc@M_5ip+2KR_R&eM&3O_g~`mN+f zN{)+n3no=|?j0uaM<+t5!W%9Bz4)nAaZ6|dfrSUtqV4f8&+8p}S+(m_2-{fi z|G_7||KSt=^$Z=jelUXnJs6>D2P66FU>NvTP4cTEP{TEYVMqqA=&taJ2mOb@SO3Y! zh+}cxgzI=MeXvA|TnYu*wev0Gzsc)#EqR@;I6~ z?OO5#XLP^5`+EF0ec9L22bp3x z-*mxn=Zg4*oa%cmU5W_E{Wo10R^yd^>jnA-{9gh-GVgx`d}RK=1$;-fH1I#=dnCdm zT#@h3s-cy-hQ8abrB9IoL$0N7Lvo`*2XD2~71_;lG;&mDKqW->$KM^i?M&NuasBQO zMFY%kjY?P~MGhnBreKbc^-dL!c`bRRB;83TTE*MS-$WdpFHa{U7DP%2>+oyeB&R~9 zH&@*q@YczL)WcKZ*12BiY+jhCt|{I?+4b?lG%oTkDs2<*rM!aBV4k@rc{VgBlz%Mr z1%KX{Y!kKsks~<2Av96q@xLT15d$J|GQA?oyxg}gxu+2(pbL*A7pt^Gk$vRS)V7~o zT|qbEe1`=}#CW?&6gCPL*oN3EBDdj0vP&h6=4~mVT?*B=sHA(TsVTv79i?vZ=@_c? zhb9wIs4kH~S{esO3MF57=e9;}k?!-k?&JF%21WWFJ> k>W^fNUe^MB{;Zp@c0I=_N0ax1!l(4QrB$(|qKtd~AAXcqUjP6A From 3ab4ffce1f2e3be98ca5d0896d92d70908d694e2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 11 Nov 2021 11:23:08 +0000 Subject: [PATCH 03/24] New assert() statements to help prove correct usage of VdbeCursor objects. FossilOrigin-Name: 7cee62f77a9e7c3cf886f136e75a93c3bbbb88e48b66035883bea5503d9fc03c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbe.c | 3 +++ src/vdbeapi.c | 1 + src/vdbeaux.c | 2 ++ src/vdbeblob.c | 7 ++++++- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 8a498f5922..67a86c9784 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Load\snew\stest\scases\sinto\stest/fuzzdata8.db -D 2021-11-10T15:23:00.325 +C New\sassert()\sstatements\sto\shelp\sprove\scorrect\susage\sof\sVdbeCursor\sobjects. +D 2021-11-11T11:23:08.228 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -622,12 +622,12 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c 34a0bc8b9e934523fd528885689334821d7a1d7048e739a32801a810ac848c39 +F src/vdbe.c 81edf086e4884f99e03231ec3bfe78c90c94ea4f13a0a492efc7339178c4fd47 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 31fbabdc1ed61d9695337dfe5269ea94e1cf615c17f5cafeaa1bb01066820bab -F src/vdbeapi.c f4bd14b42d9717a35baac5f20c0c4bfccbf3691d64dc6ec02fc0ef19374d3c92 -F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 -F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 +F src/vdbeapi.c 22c79072ae7d8a01e9bcae8ba16e918d60d202eaa9553b5fda38f99f7464d99a +F src/vdbeaux.c e1b2b66bf6444ec1c108ea5200157a83b48470cd00a8c5f7760d07793cdeffd9 +F src/vdbeblob.c 29c4118f7ee615cdee829e8401f6ead1b96b95d545b4de0042f6de39c962c652 F src/vdbemem.c a3d91dc9bb9ef725db77e4e9de7e1acef43192c9f8406c307665d503e3c2837c F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 @@ -1932,7 +1932,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 3feb0f1c3840904d28fc9a61262820e2b9b764addc1dd178aecc2cd0f952042c -R 1cdf4bc20eaeb0eb0948586b5fb86978 +P 8b53ffe99df6f5443bd22a9d95433819eb44c7e8f044c2f3e9d52661741d5612 +R e2a8f18e2779e9ff21f0f2d9c1d32f6b U drh -Z 87340a94cc4e7d9e4722384f4b564545 +Z b74eff6ed379bb9a94a26e84f3376dd5 diff --git a/manifest.uuid b/manifest.uuid index 0bc9833f7b..873fed824e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8b53ffe99df6f5443bd22a9d95433819eb44c7e8f044c2f3e9d52661741d5612 \ No newline at end of file +7cee62f77a9e7c3cf886f136e75a93c3bbbb88e48b66035883bea5503d9fc03c \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b2390e0567..b175c51646 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7743,6 +7743,7 @@ case OP_VFilter: { /* jump */ pCur = p->apCsr[pOp->p1]; assert( memIsValid(pQuery) ); REGISTER_TRACE(pOp->p3, pQuery); + assert( pCur!=0 ); assert( pCur->eCurType==CURTYPE_VTAB ); pVCur = pCur->uc.pVCur; pVtab = pVCur->pVtab; @@ -7791,6 +7792,7 @@ case OP_VColumn: { sqlite3_context sContext; VdbeCursor *pCur = p->apCsr[pOp->p1]; + assert( pCur!=0 ); assert( pCur->eCurType==CURTYPE_VTAB ); assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pDest = &aMem[pOp->p3]; @@ -7844,6 +7846,7 @@ case OP_VNext: { /* jump */ VdbeCursor *pCur; pCur = p->apCsr[pOp->p1]; + assert( pCur!=0 ); assert( pCur->eCurType==CURTYPE_VTAB ); if( pCur->nullRow ){ break; diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 5eeb5d1c0e..17df807de4 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1850,6 +1850,7 @@ int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ u32 nRec; u8 *aRec; + assert( p->pCsr->eCurType==CURTYPE_BTREE ); nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor); aRec = sqlite3DbMallocRaw(db, nRec); if( !aRec ) goto preupdate_old_out; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 6e2fb7b190..1de6a99245 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -5214,6 +5214,8 @@ void sqlite3VdbePreUpdateHook( } } + assert( pCsr!=0 ); + assert( pCsr->eCurType==CURTYPE_BTREE ); assert( pCsr->nField==pTab->nCol || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1) ); diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 9cf6b5495e..512442fd2a 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -75,7 +75,10 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ } if( rc==SQLITE_ROW ){ VdbeCursor *pC = v->apCsr[0]; - u32 type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0; + u32 type; + assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0; testcase( pC->nHdrParsed==p->iCol ); testcase( pC->nHdrParsed==p->iCol+1 ); if( type<12 ){ @@ -420,6 +423,8 @@ static int blobReadWrite( */ sqlite3_int64 iKey; iKey = sqlite3BtreeIntegerKey(p->pCsr); + assert( v->apCsr[0]!=0 ); + assert( v->apCsr[0]->eCurType==CURTYPE_BTREE ); sqlite3VdbePreUpdateHook( v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1, p->iCol ); From f9241a5fd01d3083dd96f5ac4ecaa5a4264e7e68 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 11 Nov 2021 16:26:46 +0000 Subject: [PATCH 04/24] Remove a NEVER() that was add yesterday. The fuzzer found a new test case to make it happen. FossilOrigin-Name: 83e6ac71073edfa0cd73788c30bdd5f09cb04c8a6a7d5123123dbcd354f430b8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 3015680 -> 3019776 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 67a86c9784..8293d373df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()\sstatements\sto\shelp\sprove\scorrect\susage\sof\sVdbeCursor\sobjects. -D 2021-11-11T11:23:08.228 +C Remove\sa\sNEVER()\sthat\swas\sadd\syesterday.\s\sThe\sfuzzer\sfound\sa\snew\stest\scase\nto\smake\sit\shappen. +D 2021-11-11T16:26:46.155 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,7 +491,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 6fd5c54a2edec870a0ba0c2c8b28577bf587e05a6f183da6febe09e3700ded6f +F src/btree.c 13b965a0f3cd57221e3b4e61e24452ec264a5b163de347b03b5039ddcd95cd54 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c 1b41a6417e5bb260a5988588764863229905b07b3e9a47878030a1c92d49010f @@ -1065,7 +1065,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 9dfcee537307260af05cfa72ffdb8ffd4920fd6a774229b7459fe8bd2fe90817 +F test/fuzzdata8.db ef4d280ee69d6da0ebda7f81c0c66839fa577a97b29cc5790a564fde88be7183 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1932,7 +1932,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 8b53ffe99df6f5443bd22a9d95433819eb44c7e8f044c2f3e9d52661741d5612 -R e2a8f18e2779e9ff21f0f2d9c1d32f6b +P 7cee62f77a9e7c3cf886f136e75a93c3bbbb88e48b66035883bea5503d9fc03c +R a7cf2a119263d3bc8f43e4fc93371ff4 U drh -Z b74eff6ed379bb9a94a26e84f3376dd5 +Z 327ac6f3eb951d7d7c5741ef57de279f diff --git a/manifest.uuid b/manifest.uuid index 873fed824e..c5d8897e3d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cee62f77a9e7c3cf886f136e75a93c3bbbb88e48b66035883bea5503d9fc03c \ No newline at end of file +83e6ac71073edfa0cd73788c30bdd5f09cb04c8a6a7d5123123dbcd354f430b8 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 49f80b5b39..ba35af03f0 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8747,7 +8747,7 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ do{ rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); if( rc ) return rc; - if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || NEVER(pPage->isInit) ){ + if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){ rc = SQLITE_CORRUPT_BKPT; }else{ if( iOffset+ovflPageSize<(u32)nTotal ){ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 9d0a962d91264d48123cdbf7220bc17b040d95fb..966b73730c2c0c73069714e73127ecf2b056a306 100644 GIT binary patch delta 42181 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

)DP2w3{eV6q50q|5G!yrCd!{J`O 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 DqMOGq delta 41836 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 From 9135ebb7db2fd24819c4d76ea7a6e9fedc78489e Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 11 Nov 2021 23:52:44 +0000 Subject: [PATCH 05/24] Make sure the rowid value returned by the VUpdate opcode is always initialized. FossilOrigin-Name: 150b5be5d5771485f521e3a58312596ecdcd35f3a0ae9d42d88bb99348a197c4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8293d373df..69b59f1286 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sthat\swas\sadd\syesterday.\s\sThe\sfuzzer\sfound\sa\snew\stest\scase\nto\smake\sit\shappen. -D 2021-11-11T16:26:46.155 +C Make\ssure\sthe\srowid\svalue\sreturned\sby\sthe\sVUpdate\sopcode\sis\salways\sinitialized. +D 2021-11-11T23:52:44.183 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -622,7 +622,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c 81edf086e4884f99e03231ec3bfe78c90c94ea4f13a0a492efc7339178c4fd47 +F src/vdbe.c bd7efb299299ad3f9d272adf75afd4b985096583b4c4d797d13ea6b9fb5329ae F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 31fbabdc1ed61d9695337dfe5269ea94e1cf615c17f5cafeaa1bb01066820bab F src/vdbeapi.c 22c79072ae7d8a01e9bcae8ba16e918d60d202eaa9553b5fda38f99f7464d99a @@ -1932,7 +1932,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 7cee62f77a9e7c3cf886f136e75a93c3bbbb88e48b66035883bea5503d9fc03c -R a7cf2a119263d3bc8f43e4fc93371ff4 +P 83e6ac71073edfa0cd73788c30bdd5f09cb04c8a6a7d5123123dbcd354f430b8 +R 644c566293a1fbdf23cc26ec0bb862f7 U drh -Z 327ac6f3eb951d7d7c5741ef57de279f +Z 85ba657b24546f78f23e11e2342a59c2 diff --git a/manifest.uuid b/manifest.uuid index c5d8897e3d..82f0f99a41 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83e6ac71073edfa0cd73788c30bdd5f09cb04c8a6a7d5123123dbcd354f430b8 \ No newline at end of file +150b5be5d5771485f521e3a58312596ecdcd35f3a0ae9d42d88bb99348a197c4 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b175c51646..71b51c6347 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7942,7 +7942,7 @@ case OP_VUpdate: { const sqlite3_module *pModule; int nArg; int i; - sqlite_int64 rowid; + sqlite_int64 rowid = 0; Mem **apArg; Mem *pX; From 146121f5cb5ca97da56c1bf48bc22ba7629409c9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 12 Nov 2021 14:39:49 +0000 Subject: [PATCH 06/24] Improved handling of OOM while reallocating a column name to add type information. dbsqlfuzz 5a195b4233649e49e0aa34f1b743ca192d85b198 FossilOrigin-Name: 5995dd4de4997c43b43befc1281ef6378f33f781134c7f368299d64db2344f1d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 3 ++- src/select.c | 3 +++ 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 69b59f1286..1285128aa0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\srowid\svalue\sreturned\sby\sthe\sVUpdate\sopcode\sis\salways\sinitialized. -D 2021-11-11T23:52:44.183 +C Improved\shandling\sof\sOOM\swhile\sreallocating\sa\scolumn\sname\sto\sadd\stype\ninformation.\s\sdbsqlfuzz\s5a195b4233649e49e0aa34f1b743ca192d85b198 +D 2021-11-12T14:39:49.682 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -502,7 +502,7 @@ F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 0c151975fa99560767d7747f9b60543d0093d9f8b89f13d2d6058e9c83ad19e7 -F src/expr.c 5c021ca2495b1e908610276cf5d462133d63ec47863235c8958d36e61841c72d +F src/expr.c 6c55bf2170ae882369d2b87ad93ea976b8afb12cecc37a3dd86bc31eed9d8232 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b @@ -550,7 +550,7 @@ F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 4a1db4aadd802683db40ca2dbbb268187bd195f10cbdb7206dbd8ac988795571 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c b4b3a0f32e70d93efbb357783846853dbd8b266ec0d7035aa0a245c33eecf72d +F src/select.c 7fa20486dd1c372fd59ebf7642e279f76432f77875c9ab88f0331256ddae2f12 F src/shell.c.in f8854bcb0d14707d661732698d5210d7f01694000c46e8014b323ad18f575be6 F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1932,7 +1932,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 83e6ac71073edfa0cd73788c30bdd5f09cb04c8a6a7d5123123dbcd354f430b8 -R 644c566293a1fbdf23cc26ec0bb862f7 +P 150b5be5d5771485f521e3a58312596ecdcd35f3a0ae9d42d88bb99348a197c4 +R 02a5ea84da0b0ec1dc829fdadfdaad66 U drh -Z 85ba657b24546f78f23e11e2342a59c2 +Z f7e0f9ca9813d06efb398d97a353f90e diff --git a/manifest.uuid b/manifest.uuid index 82f0f99a41..a74c668dd0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -150b5be5d5771485f521e3a58312596ecdcd35f3a0ae9d42d88bb99348a197c4 \ No newline at end of file +5995dd4de4997c43b43befc1281ef6378f33f781134c7f368299d64db2344f1d \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 62d2691bc4..126a870f9d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2803,7 +2803,8 @@ int sqlite3FindInIndex( CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); int j; - assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); + assert( pReq!=0 || pRhs->iColumn==XN_ROWID + || pParse->nErr || db->mallocFailed ); for(j=0; jaiColumn[j]!=pRhs->iColumn ) continue; assert( pIdx->azColl[j] ); diff --git a/src/select.c b/src/select.c index ebb746467d..5cf6ebf1e7 100644 --- a/src/select.c +++ b/src/select.c @@ -2209,6 +2209,9 @@ void sqlite3SelectAddColumnTypeAndCollation( if( pCol->zCnName ){ memcpy(&pCol->zCnName[n+1], zType, m+1); pCol->colFlags |= COLFLAG_HASTYPE; + }else{ + testcase( pCol->colFlags & COLFLAG_HASTYPE ); + pCol->colFlags &= ~(COLFLAG_HASTYPE|COLFLAG_HASCOLL); } } if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; From a2852ac4d279922959035429d81f38cd43f46ca4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 15 Nov 2021 01:45:11 +0000 Subject: [PATCH 07/24] Fix a faulty JSON assert() added 30 days ago by check-in [7b8ea2298927fd34]. dbsqlfuzz f30366e7b02562398a387ddcc681422fd4251190. FossilOrigin-Name: 0e0c23fcc493a5d6beb6ab9554981bbc36ba1554fea0f8ba78dc41738f4bd1c2 --- ext/misc/json1.c | 5 ++++- manifest | 14 +++++++------- manifest.uuid | 2 +- test/json104.test | 3 +++ 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 0adf710ef0..7fcd7342a6 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1662,8 +1662,11 @@ static JsonNode *jsonMergePatch( if( pNew==0 ) return 0; pTarget = &pParse->aNode[iTarget]; if( pNew!=&pTarget[j+1] ){ - assert( pTarget[j+1].eU==0 || pTarget[j+1].eU==1 ); + assert( pTarget[j+1].eU==0 + || pTarget[j+1].eU==1 + || pTarget[j+1].eU==2 ); testcase( pTarget[j+1].eU==1 ); + testcase( pTarget[j+1].eU==2 ); VVA( pTarget[j+1].eU = 5 ); pTarget[j+1].u.pPatch = pNew; pTarget[j+1].jnFlags |= JNODE_PATCH; diff --git a/manifest b/manifest index 1285128aa0..373bf7cb03 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\shandling\sof\sOOM\swhile\sreallocating\sa\scolumn\sname\sto\sadd\stype\ninformation.\s\sdbsqlfuzz\s5a195b4233649e49e0aa34f1b743ca192d85b198 -D 2021-11-12T14:39:49.682 +C Fix\sa\sfaulty\sJSON\sassert()\sadded\s30\sdays\sago\sby\scheck-in\s[7b8ea2298927fd34].\ndbsqlfuzz\sf30366e7b02562398a387ddcc681422fd4251190. +D 2021-11-15T01:45:11.575 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -306,7 +306,7 @@ F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab900 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c 91a5594071143a4ab79c638fe9f059af1db09932faf2e704c3e29216a7d4f511 -F ext/misc/json1.c 1ad9d8f04f60f7a7c99e6a22ecf84d8f9bc0881782bed6c3d3a7bc6bf0213e2d +F ext/misc/json1.c 89a988f06dcb3da0d0af9fdb2b09892452ad12dfd8f432600ee6437a6dcac310 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c 7dffa8cc89c7f2d73da4bd4ccea1bcbd2bd283e3bb4cea398df7c372a197291b @@ -1147,7 +1147,7 @@ F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa F test/json101.test bb71538005f2d9e18620bdd3b76839a93ca0be61903eb8d751a64e78cf99b8fb F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b -F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f +F test/json104.test 2cb7ff2cca2c8214d3e5260eeb9ce45faec0926f68b3e40c1aaa6ca247284144 F test/json105.test 45f7d6a9a54c85f8a9589b68d3e7a1f42d02f2359911a8cdbad1f9988f571173 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/kvtest.c feb4358fb022da8ebd098c45811f2f6507688bb6c43aa72b3e840df19026317b @@ -1932,7 +1932,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 150b5be5d5771485f521e3a58312596ecdcd35f3a0ae9d42d88bb99348a197c4 -R 02a5ea84da0b0ec1dc829fdadfdaad66 +P 5995dd4de4997c43b43befc1281ef6378f33f781134c7f368299d64db2344f1d +R e485cb8d82384b30dcd2186c506d1700 U drh -Z f7e0f9ca9813d06efb398d97a353f90e +Z 311485b1fa0a63f2008cf2b78c6fc705 diff --git a/manifest.uuid b/manifest.uuid index a74c668dd0..1e7bde7329 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5995dd4de4997c43b43befc1281ef6378f33f781134c7f368299d64db2344f1d \ No newline at end of file +0e0c23fcc493a5d6beb6ab9554981bbc36ba1554fea0f8ba78dc41738f4bd1c2 \ No newline at end of file diff --git a/test/json104.test b/test/json104.test index e56e7edeff..8d95e60140 100644 --- a/test/json104.test +++ b/test/json104.test @@ -125,6 +125,9 @@ do_execsql_test json104-313 { do_execsql_test json104-314 { SELECT json_patch('{}','{"a":{"bb":{"ccc":null}}}'); } {{{"a":{"bb":{}}}}} +do_execsql_test json104-320 { + SELECT json_patch('{"x":{"one":1}}','{"x":{"two":2},"x":"three"}'); +} {{{"x":"three"}}} #------------------------------------------------------------------------- From 5b001cc25df8f9413894cf81e3291df651f936d3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 15 Nov 2021 13:22:42 +0000 Subject: [PATCH 08/24] Improved context shown for the "ABORT-due-to-error" output line when using "PRAGMA vdbe_debug=on" in an SQLITE_DEBUG build. FossilOrigin-Name: c7776369bcd0dbeb418b14d5dc681a81ee426234cc3f4f79a3c899d7892e1560 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 9 ++++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 373bf7cb03..81ee2bfc12 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfaulty\sJSON\sassert()\sadded\s30\sdays\sago\sby\scheck-in\s[7b8ea2298927fd34].\ndbsqlfuzz\sf30366e7b02562398a387ddcc681422fd4251190. -D 2021-11-15T01:45:11.575 +C Improved\scontext\sshown\sfor\sthe\s"ABORT-due-to-error"\soutput\sline\swhen\susing\n"PRAGMA\svdbe_debug=on"\sin\san\sSQLITE_DEBUG\sbuild. +D 2021-11-15T13:22:42.150 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -622,7 +622,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c bd7efb299299ad3f9d272adf75afd4b985096583b4c4d797d13ea6b9fb5329ae +F src/vdbe.c bd1cd776d9eb9cc94aa91d10b5ef9f1f88749bc4f88bdf76133c7fff579de79d F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 31fbabdc1ed61d9695337dfe5269ea94e1cf615c17f5cafeaa1bb01066820bab F src/vdbeapi.c 22c79072ae7d8a01e9bcae8ba16e918d60d202eaa9553b5fda38f99f7464d99a @@ -1932,7 +1932,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 5995dd4de4997c43b43befc1281ef6378f33f781134c7f368299d64db2344f1d -R e485cb8d82384b30dcd2186c506d1700 +P 0e0c23fcc493a5d6beb6ab9554981bbc36ba1554fea0f8ba78dc41738f4bd1c2 +R 339b48aa5ef26ccfb084541f653c0517 U drh -Z 311485b1fa0a63f2008cf2b78c6fc705 +Z 3b67cc05d03160af201256c3a06eb0ac diff --git a/manifest.uuid b/manifest.uuid index 1e7bde7329..11ba0a29bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e0c23fcc493a5d6beb6ab9554981bbc36ba1554fea0f8ba78dc41738f4bd1c2 \ No newline at end of file +c7776369bcd0dbeb418b14d5dc681a81ee426234cc3f4f79a3c899d7892e1560 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 71b51c6347..b28976987f 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -8389,7 +8389,14 @@ abort_due_to_error: assert( rc ); #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ - printf("ABORT-due-to-error. rc=%d\n", rc); + const char *zTrace = p->zSql; + if( zTrace==0 ){ + if( aOp[0].opcode==OP_Trace ){ + zTrace = aOp[0].p4.z; + } + if( zTrace==0 ) zTrace = "???"; + } + printf("ABORT-due-to-error (rc=%d): %s\n", rc, zTrace); } #endif if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){ From 8745f8a3c3a27b504de3a1f923500b9d22c11042 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 15 Nov 2021 14:11:23 +0000 Subject: [PATCH 09/24] Fix a problem causing the count(*) optimization to be misapplied in some cases where an aggregate sub-query uses a count() expression that is aggregated against the outer query. FossilOrigin-Name: e30917278c0ec750b1756ddc5e32d65c55464531d6ef64d2e72a412dfe634f58 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 1 + test/count.test | 11 +++++++++++ 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 81ee2bfc12..825703ff6e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scontext\sshown\sfor\sthe\s"ABORT-due-to-error"\soutput\sline\swhen\susing\n"PRAGMA\svdbe_debug=on"\sin\san\sSQLITE_DEBUG\sbuild. -D 2021-11-15T13:22:42.150 +C Fix\sa\sproblem\scausing\sthe\scount(*)\soptimization\sto\sbe\smisapplied\sin\ssome\scases\swhere\san\saggregate\ssub-query\suses\sa\scount()\sexpression\sthat\sis\saggregated\sagainst\sthe\souter\squery. +D 2021-11-15T14:11:23.319 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 4a1db4aadd802683db40ca2dbbb268187bd195f10cbdb7206dbd8ac988795571 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 7fa20486dd1c372fd59ebf7642e279f76432f77875c9ab88f0331256ddae2f12 +F src/select.c 187e57a53c747e4d05b5751b133434574e333b512a5c89773d33cac06860f412 F src/shell.c.in f8854bcb0d14707d661732698d5210d7f01694000c46e8014b323ad18f575be6 F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -812,7 +812,7 @@ F test/corruptL.test 7d3440831ca24ba64305583c4d4506d417d3f89f5775c0b7cc8102db078 F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 F test/corruptN.test 60b5a62944b4f0029ba07edaa5fd8e670539d6b0a8d99db26c068d435675cbfe F test/cost.test b11cdbf9f11ffe8ef99c9881bf390e61fe92baf2182bad1dbe6de59a7295c576 -F test/count.test 5364003488249957750a5f15ee42ca1cd7b100b1131c2dc71fff266a1250bf55 +F test/count.test 013d64569c15563c59472d17ec4ddc681034aaee65e8b01880bc88315fd4c673 F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 F test/coveridxscan.test f35c7208dedc4f98e471c569df64c0f95a49f6e072d8dc7c8f99bdee2697de1b F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f @@ -1932,7 +1932,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 0e0c23fcc493a5d6beb6ab9554981bbc36ba1554fea0f8ba78dc41738f4bd1c2 -R 339b48aa5ef26ccfb084541f653c0517 -U drh -Z 3b67cc05d03160af201256c3a06eb0ac +P c7776369bcd0dbeb418b14d5dc681a81ee426234cc3f4f79a3c899d7892e1560 +R 89129d825b239a2fc17c1c7959a81b46 +U dan +Z e4b6089fb1e945dc9b3ae4589bd1374c diff --git a/manifest.uuid b/manifest.uuid index 11ba0a29bc..16ec50c5a6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7776369bcd0dbeb418b14d5dc681a81ee426234cc3f4f79a3c899d7892e1560 \ No newline at end of file +e30917278c0ec750b1756ddc5e32d65c55464531d6ef64d2e72a412dfe634f58 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5cf6ebf1e7..8067e5bc69 100644 --- a/src/select.c +++ b/src/select.c @@ -4980,6 +4980,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ pExpr = p->pEList->a[0].pExpr; assert( pExpr!=0 ); if( pExpr->op!=TK_AGG_FUNCTION ) return 0; + if( pExpr->pAggInfo!=pAggInfo ) return 0; if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; assert( pAggInfo->aFunc[0].pFExpr==pExpr ); testcase( ExprHasProperty(pExpr, EP_Distinct) ); diff --git a/test/count.test b/test/count.test index 9769b765f4..fdcb21e81d 100644 --- a/test/count.test +++ b/test/count.test @@ -233,5 +233,16 @@ do_eqp_test count-7.4 { `--SCAN t1 } +do_execsql_test count-8.0 { + CREATE TABLE t7(a INT,b TEXT,c BLOB,d REAL); + CREATE TABLE t8(a INT,b TEXT,c BLOB,d REAL); + CREATE INDEX t8a ON t8(a); +} +do_catchsql_test count-8.1 { + SELECT * FROM t8 WHERE (a, b) IN ( + SELECT count(t8.b), count(*) FROM t7 AS ra0 ORDER BY count(*) + ) AND t8.b=0; +} {1 {misuse of aggregate: count()}} + finish_test From 3ce76a0bbb4d2acbbe4cafccef32f1f9c47a45ef Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 15 Nov 2021 18:50:02 +0000 Subject: [PATCH 10/24] Small performance optimization in sqlite3VdbeHalt(). FossilOrigin-Name: 9e1ecf438cb01d3d76950bcce1b3e4df29bedbb8176c8cede27e66f8e53e2098 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 12 +++++++++--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 825703ff6e..efe83c3246 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\scausing\sthe\scount(*)\soptimization\sto\sbe\smisapplied\sin\ssome\scases\swhere\san\saggregate\ssub-query\suses\sa\scount()\sexpression\sthat\sis\saggregated\sagainst\sthe\souter\squery. -D 2021-11-15T14:11:23.319 +C Small\sperformance\soptimization\sin\ssqlite3VdbeHalt(). +D 2021-11-15T18:50:02.793 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -626,7 +626,7 @@ F src/vdbe.c bd1cd776d9eb9cc94aa91d10b5ef9f1f88749bc4f88bdf76133c7fff579de79d F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 31fbabdc1ed61d9695337dfe5269ea94e1cf615c17f5cafeaa1bb01066820bab F src/vdbeapi.c 22c79072ae7d8a01e9bcae8ba16e918d60d202eaa9553b5fda38f99f7464d99a -F src/vdbeaux.c e1b2b66bf6444ec1c108ea5200157a83b48470cd00a8c5f7760d07793cdeffd9 +F src/vdbeaux.c 1a405561e5d181ec16f6e3e00ccc75bb6b134e408f11975bf19d7b39adf1ea7e F src/vdbeblob.c 29c4118f7ee615cdee829e8401f6ead1b96b95d545b4de0042f6de39c962c652 F src/vdbemem.c a3d91dc9bb9ef725db77e4e9de7e1acef43192c9f8406c307665d503e3c2837c F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7 @@ -1932,7 +1932,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 c7776369bcd0dbeb418b14d5dc681a81ee426234cc3f4f79a3c899d7892e1560 -R 89129d825b239a2fc17c1c7959a81b46 -U dan -Z e4b6089fb1e945dc9b3ae4589bd1374c +P e30917278c0ec750b1756ddc5e32d65c55464531d6ef64d2e72a412dfe634f58 +R 8f9f088ac95915690504584acdead8cf +U drh +Z 4d0d9cdd2d0e0ce70ad4e3a4aadf572b diff --git a/manifest.uuid b/manifest.uuid index 16ec50c5a6..5a9b74a650 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e30917278c0ec750b1756ddc5e32d65c55464531d6ef64d2e72a412dfe634f58 \ No newline at end of file +9e1ecf438cb01d3d76950bcce1b3e4df29bedbb8176c8cede27e66f8e53e2098 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 1de6a99245..4005b1eb16 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3056,9 +3056,15 @@ int sqlite3VdbeHalt(Vdbe *p){ sqlite3VdbeEnter(p); /* Check for one of the special errors */ - mrc = p->rc & 0xff; - isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR - || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL; + if( p->rc ){ + mrc = p->rc & 0xff; + isSpecialError = mrc==SQLITE_NOMEM + || mrc==SQLITE_IOERR + || mrc==SQLITE_INTERRUPT + || mrc==SQLITE_FULL; + }else{ + mrc = isSpecialError = 0; + } if( isSpecialError ){ /* If the query was read-only and the error code is SQLITE_INTERRUPT, ** no rollback is necessary. Otherwise, at least a savepoint From 9dc718856f47d8c68f2194d4ead673035ee51d7b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 15 Nov 2021 19:10:13 +0000 Subject: [PATCH 11/24] Strengthen the sticky-CORRUPT idea of check-in [3feb0f1c3840904d] by automatically changing the first COMMIT after an SQLITE_CORRUPT error into a ROLLBACK. FossilOrigin-Name: bd66ab8a1bc3c43a57c7caff5f54545b0feb0177f1f51492f30d308c123c43ba --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 1 - src/vdbeaux.c | 3 +++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index efe83c3246..c941b84118 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\soptimization\sin\ssqlite3VdbeHalt(). -D 2021-11-15T18:50:02.793 +C Strengthen\sthe\ssticky-CORRUPT\sidea\sof\scheck-in\s[3feb0f1c3840904d]\sby\nautomatically\schanging\sthe\sfirst\sCOMMIT\safter\san\sSQLITE_CORRUPT\serror\sinto\na\sROLLBACK. +D 2021-11-15T19:10:13.878 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -622,11 +622,11 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c bd1cd776d9eb9cc94aa91d10b5ef9f1f88749bc4f88bdf76133c7fff579de79d +F src/vdbe.c e98f1baf54a00db2c4669dbd04f8bbc89b5909a5b43e76fbbbf1a97007adba2b F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 31fbabdc1ed61d9695337dfe5269ea94e1cf615c17f5cafeaa1bb01066820bab F src/vdbeapi.c 22c79072ae7d8a01e9bcae8ba16e918d60d202eaa9553b5fda38f99f7464d99a -F src/vdbeaux.c 1a405561e5d181ec16f6e3e00ccc75bb6b134e408f11975bf19d7b39adf1ea7e +F src/vdbeaux.c 21db442d159fd745a7693d157b5f998260b6af4ca60de559fa3b7b68c7405af2 F src/vdbeblob.c 29c4118f7ee615cdee829e8401f6ead1b96b95d545b4de0042f6de39c962c652 F src/vdbemem.c a3d91dc9bb9ef725db77e4e9de7e1acef43192c9f8406c307665d503e3c2837c F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7 @@ -1932,7 +1932,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 e30917278c0ec750b1756ddc5e32d65c55464531d6ef64d2e72a412dfe634f58 -R 8f9f088ac95915690504584acdead8cf +P 9e1ecf438cb01d3d76950bcce1b3e4df29bedbb8176c8cede27e66f8e53e2098 +R 8502cb577f96122347daa35ce5c6ba62 U drh -Z 4d0d9cdd2d0e0ce70ad4e3a4aadf572b +Z 8ae9bdb2af913bcacdf4433e1e237b15 diff --git a/manifest.uuid b/manifest.uuid index 5a9b74a650..82ba03b8c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e1ecf438cb01d3d76950bcce1b3e4df29bedbb8176c8cede27e66f8e53e2098 \ No newline at end of file +bd66ab8a1bc3c43a57c7caff5f54545b0feb0177f1f51492f30d308c123c43ba \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b28976987f..3476c02daa 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3604,7 +3604,6 @@ case OP_AutoCommit: { sqlite3CloseSavepoints(db); if( p->rc==SQLITE_OK ){ rc = SQLITE_DONE; - if( db->autoCommit ) db->flags &= ~SQLITE_CorruptRdOnly; }else{ rc = SQLITE_ERROR; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4005b1eb16..f03196bffe 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3116,6 +3116,9 @@ int sqlite3VdbeHalt(Vdbe *p){ return SQLITE_ERROR; } rc = SQLITE_CONSTRAINT_FOREIGNKEY; + }else if( db->flags & SQLITE_CorruptRdOnly ){ + rc = SQLITE_CORRUPT; + db->flags &= ~SQLITE_CorruptRdOnly; }else{ /* The auto-commit flag is true, the vdbe program was successful ** or hit an 'OR FAIL' constraint and there are no deferred foreign From 488b55856e794bd2f267781474cbaade9e523700 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 16 Nov 2021 13:36:50 +0000 Subject: [PATCH 12/24] Fix a problem causing an OOM within an ALTER TABLE ADD COLUMN command that adds a column with a CHECK constraint to go unreported. FossilOrigin-Name: a33f5e93ecb7d84291f6fecc7b60f0c555034aa47e24584c63c78d8a94710d82 --- manifest | 17 +++++++++-------- manifest.uuid | 2 +- src/sqliteInt.h | 1 - src/tokenize.c | 6 +++--- test/alterfault.test | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 test/alterfault.test diff --git a/manifest b/manifest index c941b84118..d42e91c2b4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Strengthen\sthe\ssticky-CORRUPT\sidea\sof\scheck-in\s[3feb0f1c3840904d]\sby\nautomatically\schanging\sthe\sfirst\sCOMMIT\safter\san\sSQLITE_CORRUPT\serror\sinto\na\sROLLBACK. -D 2021-11-15T19:10:13.878 +C Fix\sa\sproblem\scausing\san\sOOM\swithin\san\sALTER\sTABLE\sADD\sCOLUMN\scommand\sthat\sadds\sa\scolumn\swith\sa\sCHECK\sconstraint\sto\sgo\sunreported. +D 2021-11-16T13:36:50.684 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -555,7 +555,7 @@ F src/shell.c.in f8854bcb0d14707d661732698d5210d7f01694000c46e8014b323ad18f575be F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8ff2fd2c166150b2e48639f5e506fb44e29f1a3f65031710b9e89d1c126ac839 -F src/sqliteInt.h c36cdf01fcd624f9988305158e89bf1d7246b3a05f0fe578bc7dd2507e53e59d +F src/sqliteInt.h 42c8f4c05ddbe8214d439aa80d98914d1883104f8f518820ce2e9e4e183c31fb F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -614,7 +614,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 bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e +F src/tokenize.c 865911afa00fed589cd03b25c140ca88544842aaef7b81f7d41ed769a7a54120 F src/treeview.c 9dfdb7ff7f6645d0a6458dbdf4ffac041c071c4533a6db8bb6e502b979ac67bc F src/trigger.c 2ef56f0b7b75349a5557d0604b475126329c2e1a02432e7d49c4c710613e8254 F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d @@ -659,6 +659,7 @@ F test/altercol.test b11fa1b131e80ab5b6ecfb3b725fb0419c14ca6efba5adb57aeabfc9baa F test/altercorrupt.test 2e1d705342cf9d7de884518ddbb053fd52d7e60d2b8869b7b63b2fda68435c12 F test/alterdropcol.test a653a3945f964d26845ec0cd0a8e74189f46de3119a984c5bc45457da392612e F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41 +F test/alterfault.test 2a19a9b8d4e42e2915ea82598341f089c2c16bb55b3f474572c9176eba0b9bc1 F test/alterlegacy.test f38c6d06cda39e1f7b955bbce57f2e3ef5b7cb566d3d1234502093e228c15811 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test ca3ebc01670d9313953a2b7628d8cc00dc5ea9988f229b3cbbbe1cca506dae45 @@ -1932,7 +1933,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 9e1ecf438cb01d3d76950bcce1b3e4df29bedbb8176c8cede27e66f8e53e2098 -R 8502cb577f96122347daa35ce5c6ba62 -U drh -Z 8ae9bdb2af913bcacdf4433e1e237b15 +P bd66ab8a1bc3c43a57c7caff5f54545b0feb0177f1f51492f30d308c123c43ba +R 8e910d7ef9b9683ef8c5339395ac64ec +U dan +Z ce8501e7bda0295d8dc505431c6919db diff --git a/manifest.uuid b/manifest.uuid index 82ba03b8c8..2f4df70c92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd66ab8a1bc3c43a57c7caff5f54545b0feb0177f1f51492f30d308c123c43ba \ No newline at end of file +a33f5e93ecb7d84291f6fecc7b60f0c555034aa47e24584c63c78d8a94710d82 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index cece2360e8..09bccc92fe 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3555,7 +3555,6 @@ struct Parse { AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ - Parse *pParentParse; /* Parent parser if this parser is nested */ union { int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ Returning *pReturning; /* The RETURNING clause */ diff --git a/src/tokenize.c b/src/tokenize.c index 5d250e6f6a..e128d16148 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -573,6 +573,7 @@ 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 */ + Parse *pParentParse = 0; /* Outer parse context, if any */ #ifdef sqlite3Parser_ENGINEALWAYSONSTACK yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif @@ -608,7 +609,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ assert( pParse->pNewTrigger==0 ); assert( pParse->nVar==0 ); assert( pParse->pVList==0 ); - pParse->pParentParse = db->pParse; + pParentParse = db->pParse; db->pParse = pParse; while( 1 ){ n = sqlite3GetToken((u8*)zSql, &tokenType); @@ -723,8 +724,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ sqlite3DeleteTrigger(db, pParse->pNewTrigger); } sqlite3DbFree(db, pParse->pVList); - db->pParse = pParse->pParentParse; - pParse->pParentParse = 0; + db->pParse = pParentParse; assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } diff --git a/test/alterfault.test b/test/alterfault.test new file mode 100644 index 0000000000..a2a9677c9e --- /dev/null +++ b/test/alterfault.test @@ -0,0 +1,35 @@ +# 2021 November 16 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix alterfault + +do_execsql_test 1.0 { + CREATE TABLE t1(a); +} +faultsim_save_and_close + +do_faultsim_test 1.1 -faults oom* -prep { + faultsim_restore_and_reopen +} -body { + execsql { + ALTER TABLE t1 ADD COLUMN b CHECK (a!=1) + } +} -test { + faultsim_test_result {0 {}} +} + + + +finish_test From e41d30ffdd4ac37d55089c0eecba5239e7fa3cc8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 18 Nov 2021 13:25:31 +0000 Subject: [PATCH 13/24] Fix an obscure problem associated with quoting of CSV output in the CLI. FossilOrigin-Name: 38a9b660214c06aa6650c6bb11a429a8c74c09f1e0e5c18d691e36de4af7af71 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 8 +++++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index d42e91c2b4..3fbb301052 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\scausing\san\sOOM\swithin\san\sALTER\sTABLE\sADD\sCOLUMN\scommand\sthat\sadds\sa\scolumn\swith\sa\sCHECK\sconstraint\sto\sgo\sunreported. -D 2021-11-16T13:36:50.684 +C Fix\san\sobscure\sproblem\sassociated\swith\squoting\sof\sCSV\soutput\sin\sthe\sCLI. +D 2021-11-18T13:25:31.636 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -551,7 +551,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 4a1db4aadd802683db40ca2dbbb268187bd195f10cbdb7206dbd8ac988795571 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 187e57a53c747e4d05b5751b133434574e333b512a5c89773d33cac06860f412 -F src/shell.c.in f8854bcb0d14707d661732698d5210d7f01694000c46e8014b323ad18f575be6 +F src/shell.c.in 110c63de78d63a678e9b46e376ea6b8498ab62726dc84dca32161fe88acf325e F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8ff2fd2c166150b2e48639f5e506fb44e29f1a3f65031710b9e89d1c126ac839 @@ -1933,7 +1933,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 bd66ab8a1bc3c43a57c7caff5f54545b0feb0177f1f51492f30d308c123c43ba -R 8e910d7ef9b9683ef8c5339395ac64ec -U dan -Z ce8501e7bda0295d8dc505431c6919db +P a33f5e93ecb7d84291f6fecc7b60f0c555034aa47e24584c63c78d8a94710d82 +R 5b5c595cccff4840ecd5a386ffa8a172 +U drh +Z 83dd77702836190e973908b753380a9f diff --git a/manifest.uuid b/manifest.uuid index 2f4df70c92..8e749dbf15 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a33f5e93ecb7d84291f6fecc7b60f0c555034aa47e24584c63c78d8a94710d82 \ No newline at end of file +38a9b660214c06aa6650c6bb11a429a8c74c09f1e0e5c18d691e36de4af7af71 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f136103b34..672c80a25b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1764,10 +1764,12 @@ static void output_csv(ShellState *p, const char *z, int bSep){ }else{ int i; int nSep = strlen30(p->colSeparator); - for(i=0; z[i]; i++){ + int n = strlen30(z); + for(i=0; icolSeparator[0] && - (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){ + || (z[i]==p->colSeparator[0] && + (nSep==1 || (i+nSepcolSeparator, nSep)==0))) + ){ i = 0; break; } From 9cd0c3d4c5ccdb7fd2ae7e47aeefe33517f8a56c Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 18 Nov 2021 15:40:05 +0000 Subject: [PATCH 14/24] Improve CSV quoting in the CLI using the strstr() function. FossilOrigin-Name: b7927bf91049c903730a280484bbcdcdedc259a31fbcc3d3b0c7d046ec321633 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 13 ++++--------- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 3fbb301052..93fdec1bc9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sobscure\sproblem\sassociated\swith\squoting\sof\sCSV\soutput\sin\sthe\sCLI. -D 2021-11-18T13:25:31.636 +C Improve\sCSV\squoting\sin\sthe\sCLI\susing\sthe\sstrstr()\sfunction. +D 2021-11-18T15:40:05.165 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -551,7 +551,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 4a1db4aadd802683db40ca2dbbb268187bd195f10cbdb7206dbd8ac988795571 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 187e57a53c747e4d05b5751b133434574e333b512a5c89773d33cac06860f412 -F src/shell.c.in 110c63de78d63a678e9b46e376ea6b8498ab62726dc84dca32161fe88acf325e +F src/shell.c.in 975f268ef261773fcbed1e519dfa10c4f33e8b1cffc12120563e61857fff07c6 F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8ff2fd2c166150b2e48639f5e506fb44e29f1a3f65031710b9e89d1c126ac839 @@ -1933,7 +1933,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 a33f5e93ecb7d84291f6fecc7b60f0c555034aa47e24584c63c78d8a94710d82 -R 5b5c595cccff4840ecd5a386ffa8a172 +P 38a9b660214c06aa6650c6bb11a429a8c74c09f1e0e5c18d691e36de4af7af71 +R 2ee5b92e6ce9847c1776b48a09f2609c U drh -Z 83dd77702836190e973908b753380a9f +Z a0f452e68984f34f7588f861e0269864 diff --git a/manifest.uuid b/manifest.uuid index 8e749dbf15..40289b0c68 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -38a9b660214c06aa6650c6bb11a429a8c74c09f1e0e5c18d691e36de4af7af71 \ No newline at end of file +b7927bf91049c903730a280484bbcdcdedc259a31fbcc3d3b0c7d046ec321633 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 672c80a25b..b4b4e2fcce 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1762,19 +1762,14 @@ static void output_csv(ShellState *p, const char *z, int bSep){ if( z==0 ){ utf8_printf(out,"%s",p->nullValue); }else{ - int i; - int nSep = strlen30(p->colSeparator); - int n = strlen30(z); - for(i=0; icolSeparator[0] && - (nSep==1 || (i+nSepcolSeparator, nSep)==0))) - ){ + unsigned i; + for(i=0; z[i]; i++){ + if( needCsvQuote[((unsigned char*)z)[i]] ){ i = 0; break; } } - if( i==0 ){ + if( i==0 || strstr(z, p->colSeparator)!=0 ){ char *zQuoted = sqlite3_mprintf("\"%w\"", z); utf8_printf(out, "%s", zQuoted); sqlite3_free(zQuoted); From 895c807a6da10aa6a9e84716cddd44a27591980e Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 18 Nov 2021 19:15:40 +0000 Subject: [PATCH 15/24] Fix a problem slowing down the handling of == constraints in the rtree module. FossilOrigin-Name: 509027e964f28efca088a41fe32f01c38316f7a919de63a8835e3bc7c3fb0787 --- ext/rtree/rtree.c | 18 +++++++++++++----- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index cd718073e7..4098aa7036 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1285,14 +1285,20 @@ static void rtreeNonleafConstraint( || p->op==RTREE_FALSE ); assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ switch( p->op ){ - case RTREE_TRUE: return; /* Always satisfied */ - case RTREE_FALSE: break; /* Never satisfied */ + case RTREE_TRUE: /* Always satisfied */ + break; + case RTREE_FALSE: /* Never satisfied */ + *peWithin = NOT_WITHIN; + break; case RTREE_LE: case RTREE_LT: case RTREE_EQ: RTREE_DECODE_COORD(eInt, pCellData, val); /* val now holds the lower bound of the coordinate pair */ - if( p->u.rValue>=val ) return; + if( p->u.rValueop!=RTREE_EQ ) break; /* RTREE_LE and RTREE_LT end here */ /* Fall through for the RTREE_EQ case */ @@ -1300,9 +1306,11 @@ static void rtreeNonleafConstraint( pCellData += 4; RTREE_DECODE_COORD(eInt, pCellData, val); /* val now holds the upper bound of the coordinate pair */ - if( p->u.rValue<=val ) return; + if( p->u.rValue>val ){ + *peWithin = NOT_WITHIN; + } + break; } - *peWithin = NOT_WITHIN; } /* diff --git a/manifest b/manifest index 93fdec1bc9..33a07c64e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sCSV\squoting\sin\sthe\sCLI\susing\sthe\sstrstr()\sfunction. -D 2021-11-18T15:40:05.165 +C Fix\sa\sproblem\sslowing\sdown\sthe\shandling\sof\s==\sconstraints\sin\sthe\srtree\smodule. +D 2021-11-18T19:15:40.541 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -395,7 +395,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c a7021cb524621573ccda213a35b0339371849dd4acc4909f689786ee1f964b7f -F ext/rtree/rtree.c a602c5ba860c93a3087ec0c41ad4c4c0c2e9ba2f0008617d4b444200e3b3625d +F ext/rtree/rtree.c c1731f33253199ede524592d0fbbd2220ac7cc3c1dcd3b5d08b68b7dcf8b7f2c F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1933,7 +1933,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 38a9b660214c06aa6650c6bb11a429a8c74c09f1e0e5c18d691e36de4af7af71 -R 2ee5b92e6ce9847c1776b48a09f2609c -U drh -Z a0f452e68984f34f7588f861e0269864 +P b7927bf91049c903730a280484bbcdcdedc259a31fbcc3d3b0c7d046ec321633 +R bc14a509a5e37dbab8e0eef05b4363ac +U dan +Z 827b0b30e8a22a49654c8ffaf9e8d5f4 diff --git a/manifest.uuid b/manifest.uuid index 40289b0c68..283dd9e165 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b7927bf91049c903730a280484bbcdcdedc259a31fbcc3d3b0c7d046ec321633 \ No newline at end of file +509027e964f28efca088a41fe32f01c38316f7a919de63a8835e3bc7c3fb0787 \ No newline at end of file From 826ec6013c1aebb4bbc2f01edbc89f6830cc5feb Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 18 Nov 2021 20:11:31 +0000 Subject: [PATCH 16/24] Fix a performance regression in rtree introduced by the previous commit. FossilOrigin-Name: 7f42b8e1a25c0830fe81e4668318998af595826784a50780a5c1c0b4d95a2482 --- ext/rtree/rtree.c | 33 +++++++++++++++++---------------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 4098aa7036..49053a2bcc 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1285,32 +1285,33 @@ static void rtreeNonleafConstraint( || p->op==RTREE_FALSE ); assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ switch( p->op ){ - case RTREE_TRUE: /* Always satisfied */ - break; - case RTREE_FALSE: /* Never satisfied */ - *peWithin = NOT_WITHIN; - break; - case RTREE_LE: - case RTREE_LT: + case RTREE_TRUE: return; /* Always satisfied */ + case RTREE_FALSE: break; /* Never satisfied */ case RTREE_EQ: RTREE_DECODE_COORD(eInt, pCellData, val); /* val now holds the lower bound of the coordinate pair */ - if( p->u.rValueu.rValue>=val ){ + pCellData += 4; + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the upper bound of the coordinate pair */ + if( p->u.rValue<=val ) return; } - if( p->op!=RTREE_EQ ) break; /* RTREE_LE and RTREE_LT end here */ - /* Fall through for the RTREE_EQ case */ + break; + case RTREE_LE: + case RTREE_LT: + RTREE_DECODE_COORD(eInt, pCellData, val); + /* val now holds the lower bound of the coordinate pair */ + if( p->u.rValue>=val ) return; + break; - default: /* RTREE_GT or RTREE_GE, or fallthrough of RTREE_EQ */ + default: pCellData += 4; RTREE_DECODE_COORD(eInt, pCellData, val); /* val now holds the upper bound of the coordinate pair */ - if( p->u.rValue>val ){ - *peWithin = NOT_WITHIN; - } + if( p->u.rValue<=val ) return; break; } + *peWithin = NOT_WITHIN; } /* diff --git a/manifest b/manifest index 33a07c64e2..7d997fe1d8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sslowing\sdown\sthe\shandling\sof\s==\sconstraints\sin\sthe\srtree\smodule. -D 2021-11-18T19:15:40.541 +C Fix\sa\sperformance\sregression\sin\srtree\sintroduced\sby\sthe\sprevious\scommit. +D 2021-11-18T20:11:31.718 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -395,7 +395,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c a7021cb524621573ccda213a35b0339371849dd4acc4909f689786ee1f964b7f -F ext/rtree/rtree.c c1731f33253199ede524592d0fbbd2220ac7cc3c1dcd3b5d08b68b7dcf8b7f2c +F ext/rtree/rtree.c d7b4b8b81d8d54376a7f81de5be85ec58b37c11604bcf42984a8418b34158d93 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 35c3bc0def71317b7601ee0d1149e7df2cd8fc4f13ec89a64761ac3f46ca123f F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -1933,7 +1933,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 b7927bf91049c903730a280484bbcdcdedc259a31fbcc3d3b0c7d046ec321633 -R bc14a509a5e37dbab8e0eef05b4363ac +P 509027e964f28efca088a41fe32f01c38316f7a919de63a8835e3bc7c3fb0787 +R c2cdaff31ea77237329e59841c0f182a U dan -Z 827b0b30e8a22a49654c8ffaf9e8d5f4 +Z 4c54e10f3cfe7975c8bc532dcc527100 diff --git a/manifest.uuid b/manifest.uuid index 283dd9e165..979a1d53c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -509027e964f28efca088a41fe32f01c38316f7a919de63a8835e3bc7c3fb0787 \ No newline at end of file +7f42b8e1a25c0830fe81e4668318998af595826784a50780a5c1c0b4d95a2482 \ No newline at end of file From 5e90794b67e8c683d6b4c7175240dcfd4379829e Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 18 Nov 2021 20:56:59 +0000 Subject: [PATCH 17/24] Minor tweaks to the way auxiliary tools are built, to make it easier to customize the builds without having to alter the code. FossilOrigin-Name: 90b06b6f42918852cfb15258be462c6bed260c6a618b86fa9084bac72fa2f58f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/tclsqlite.c | 4 +++- tool/sqlite3_analyzer.c.in | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 7d997fe1d8..4bc51a1e0c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sperformance\sregression\sin\srtree\sintroduced\sby\sthe\sprevious\scommit. -D 2021-11-18T20:11:31.718 +C Minor\stweaks\sto\sthe\sway\sauxiliary\stools\sare\sbuilt,\sto\smake\sit\seasier\sto\ncustomize\sthe\sbuilds\swithout\shaving\sto\salter\sthe\scode. +D 2021-11-18T20:56:59.677 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -559,7 +559,7 @@ F src/sqliteInt.h 42c8f4c05ddbe8214d439aa80d98914d1883104f8f518820ce2e9e4e183c31 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 428e813dabf82804bc13196af35a0c3c6ef4347fe557fa6717c5c66bba6e8520 +F src/tclsqlite.c 50c2b759f4a918e41ed7a038baaef087ff264c7b3adddf39741315a53fd92e47 F src/test1.c d6c945a8bb211ed72ea515f0b9743caeaf38c66da6418a7b1dcf3764e1368bbb F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1899,7 +1899,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c F tool/sqldiff.c 9c639de9fa541a947ea9776435c84adf00f43945e262556e15219ef09f0d912c -F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 +F tool/sqlite3_analyzer.c.in f88615bf33098945e0a42f17733f472083d150b58bdaaa5555a7129d0a51621c F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f @@ -1933,7 +1933,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 509027e964f28efca088a41fe32f01c38316f7a919de63a8835e3bc7c3fb0787 -R c2cdaff31ea77237329e59841c0f182a -U dan -Z 4c54e10f3cfe7975c8bc532dcc527100 +P 7f42b8e1a25c0830fe81e4668318998af595826784a50780a5c1c0b4d95a2482 +R 7fc4ecd1448b6305c428d5164e326f71 +U drh +Z 3efafb7c09c67bd8bd80d6c3aff384ef diff --git a/manifest.uuid b/manifest.uuid index 979a1d53c1..d396453832 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f42b8e1a25c0830fe81e4668318998af595826784a50780a5c1c0b4d95a2482 \ No newline at end of file +90b06b6f42918852cfb15258be462c6bed260c6a618b86fa9084bac72fa2f58f \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index b9b78b42b9..1934944841 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -3975,7 +3975,9 @@ static const char *tclsh_main_loop(void){ return zMainloop; } -#define TCLSH_MAIN main /* Needed to fake out mktclapp */ +#ifndef TCLSH_MAIN +# define TCLSH_MAIN main +#endif int SQLITE_CDECL TCLSH_MAIN(int argc, char **argv){ Tcl_Interp *interp; int i; diff --git a/tool/sqlite3_analyzer.c.in b/tool/sqlite3_analyzer.c.in index e830521e08..d8b000209f 100644 --- a/tool/sqlite3_analyzer.c.in +++ b/tool/sqlite3_analyzer.c.in @@ -14,7 +14,7 @@ #define SQLITE_DEFAULT_MEMSTATUS 0 #define SQLITE_MAX_EXPR_DEPTH 0 #define SQLITE_OMIT_LOAD_EXTENSION 1 -#ifndef USE_EXTERNAL_SQLITE +#if !defined(SQLITE_AMALGAMATION) && !defined(USE_EXTERNAL_SQLITE) INCLUDE sqlite3.c #endif INCLUDE $ROOT/src/tclsqlite.c From d9137e3be0321774dd759340edd3d5d552b4f7ea Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 Nov 2021 14:02:43 +0000 Subject: [PATCH 18/24] Fix a benign data race in os_unix.c that might trouble tsan and similar tools. FossilOrigin-Name: 95806ac1dabe4598170061d903ae30f09bafac149ff6696963a7e056ac846cdb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 37 +++++++++++++++++++++++++------------ 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 4bc51a1e0c..9017b565cc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\stweaks\sto\sthe\sway\sauxiliary\stools\sare\sbuilt,\sto\smake\sit\seasier\sto\ncustomize\sthe\sbuilds\swithout\shaving\sto\salter\sthe\scode. -D 2021-11-18T20:56:59.677 +C Fix\sa\sbenign\sdata\srace\sin\sos_unix.c\sthat\smight\strouble\stsan\sand\ssimilar\stools. +D 2021-11-19T14:02:43.242 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/os.c b1c4f2d485961e9a5b6b648c36687d25047c252222e9660b7cc25a6e1ea436ab F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 8e14b40fd02f70e234030c2bee45215ff8835293adc13a08e9718c29bff61401 +F src/os_unix.c f5ad51cfd024116db8531feab9efd831c2621436dca1464e4ff1e8af9bf3252e F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c bc10c191d18bffd3d76eda5f162799e43a9f875ecfe7c4869f752e2ddef87ea2 @@ -1933,7 +1933,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 7f42b8e1a25c0830fe81e4668318998af595826784a50780a5c1c0b4d95a2482 -R 7fc4ecd1448b6305c428d5164e326f71 -U drh -Z 3efafb7c09c67bd8bd80d6c3aff384ef +P 90b06b6f42918852cfb15258be462c6bed260c6a618b86fa9084bac72fa2f58f +R 05a833efc38b4a3220b81b2f3a5823e3 +U dan +Z fc95c03200d563c04629cc3672f249c7 diff --git a/manifest.uuid b/manifest.uuid index d396453832..61530bc496 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -90b06b6f42918852cfb15258be462c6bed260c6a618b86fa9084bac72fa2f58f \ No newline at end of file +95806ac1dabe4598170061d903ae30f09bafac149ff6696963a7e056ac846cdb \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index 0e184af3c1..cd619f5c04 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -5798,25 +5798,35 @@ static int fillInUnixFile( return rc; } +/* +** Directories to consider for temp files. +*/ +static const char *azTempDirs[] = { + 0, + 0, + "/var/tmp", + "/usr/tmp", + "/tmp", + "." +}; + +/* +** Initialize first two members of azTempDirs[] array. +*/ +static void unixTempFileInit(void){ + azTempDirs[0] = getenv("SQLITE_TMPDIR"); + azTempDirs[1] = getenv("TMPDIR"); +} + /* ** Return the name of a directory in which to put temporary files. ** If no suitable temporary file directory can be found, return NULL. */ static const char *unixTempFileDir(void){ - static const char *azDirs[] = { - 0, - 0, - "/var/tmp", - "/usr/tmp", - "/tmp", - "." - }; unsigned int i = 0; struct stat buf; const char *zDir = sqlite3_temp_directory; - if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); - if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); while(1){ if( zDir!=0 && osStat(zDir, &buf)==0 @@ -5825,8 +5835,8 @@ static const char *unixTempFileDir(void){ ){ return zDir; } - if( i>=sizeof(azDirs)/sizeof(azDirs[0]) ) break; - zDir = azDirs[i++]; + if( i>=sizeof(azTempDirs)/sizeof(azTempDirs[0]) ) break; + zDir = azTempDirs[i++]; } return 0; } @@ -8098,6 +8108,9 @@ int sqlite3_os_init(void){ assert( UNIX_SHM_DMS==128 ); /* Byte offset of the deadman-switch */ #endif + /* Initialize temp file dir array. */ + unixTempFileInit(); + return SQLITE_OK; } From a51e60079fa415661b5942afb2b271968327f441 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 19 Nov 2021 19:11:58 +0000 Subject: [PATCH 19/24] Small performance increase and size reduction for sqlite3ExprCompare(). This change also handles some corner cases without the need for ALWAYS(). FossilOrigin-Name: d814ba6effc7c5b021ff625b57371627f3ee326687c508da99f78bc164386b7e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 16 +++++++++------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 9017b565cc..b67cba76c0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbenign\sdata\srace\sin\sos_unix.c\sthat\smight\strouble\stsan\sand\ssimilar\stools. -D 2021-11-19T14:02:43.242 +C Small\sperformance\sincrease\sand\ssize\sreduction\sfor\ssqlite3ExprCompare().\nThis\schange\salso\shandles\ssome\scorner\scases\swithout\sthe\sneed\sfor\sALWAYS(). +D 2021-11-19T19:11:58.858 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -502,7 +502,7 @@ F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 0c151975fa99560767d7747f9b60543d0093d9f8b89f13d2d6058e9c83ad19e7 -F src/expr.c 6c55bf2170ae882369d2b87ad93ea976b8afb12cecc37a3dd86bc31eed9d8232 +F src/expr.c 89c4a225af2ccf5e7f1d53a70170c405036c63cc55130467e013ec9553261cb1 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b @@ -1933,7 +1933,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 90b06b6f42918852cfb15258be462c6bed260c6a618b86fa9084bac72fa2f58f -R 05a833efc38b4a3220b81b2f3a5823e3 -U dan -Z fc95c03200d563c04629cc3672f249c7 +P 95806ac1dabe4598170061d903ae30f09bafac149ff6696963a7e056ac846cdb +R 0db7fc688bd69b655cfa0f3bed689f81 +U drh +Z e3e9adffefbcbe1772add8e69eede097 diff --git a/manifest.uuid b/manifest.uuid index 61530bc496..2d21a95d56 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -95806ac1dabe4598170061d903ae30f09bafac149ff6696963a7e056ac846cdb \ No newline at end of file +d814ba6effc7c5b021ff625b57371627f3ee326687c508da99f78bc164386b7e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 126a870f9d..e41a4fd4e5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5469,12 +5469,9 @@ int sqlite3ExprCompare( } return 2; } - if( pA->op!=TK_COLUMN - && pA->op!=TK_AGG_COLUMN - && ALWAYS(!ExprHasProperty(pA, EP_IntValue)) - && pA->u.zToken - ){ - assert( !ExprHasProperty(pB, EP_IntValue) ); + assert( !ExprHasProperty(pA, EP_IntValue) ); + assert( !ExprHasProperty(pB, EP_IntValue) ); + if( pA->u.zToken ){ if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; #ifndef SQLITE_OMIT_WINDOWFUNC @@ -5492,7 +5489,12 @@ int sqlite3ExprCompare( return 0; }else if( pA->op==TK_COLLATE ){ if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; - }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + }else + if( pB->u.zToken!=0 + && pA->op!=TK_COLUMN + && pA->op!=TK_AGG_COLUMN + && strcmp(pA->u.zToken,pB->u.zToken)!=0 + ){ return 2; } } From 6f991147bd68e4d4909921103b419667ff353bce Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 20 Nov 2021 13:30:03 +0000 Subject: [PATCH 20/24] New test cases for STRICT and NOT NULL in PRIMARY KEY. FossilOrigin-Name: 0eafbc2f31b83f48833b19894ff3252a63c319ff501506ef9f744cca813a3a24 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/e_createtable.test | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index b67cba76c0..01cca42e37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\sincrease\sand\ssize\sreduction\sfor\ssqlite3ExprCompare().\nThis\schange\salso\shandles\ssome\scorner\scases\swithout\sthe\sneed\sfor\sALWAYS(). -D 2021-11-19T19:11:58.858 +C New\stest\scases\sfor\sSTRICT\sand\sNOT\sNULL\sin\sPRIMARY\sKEY. +D 2021-11-20T13:30:03.615 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -862,7 +862,7 @@ F test/e_blobclose.test 692fc02a058476c2222a63d97e3f3b2b809c1842e5525ded7f854d54 F test/e_blobopen.test 29f6055ee453b8e679fe9570c4d3acfedbef821622c5dad16875148c5952ef50 F test/e_blobwrite.test 3075ff539827576d9a34cbb5a2ac75eb65fb49cd5aadc27686b0719fbf99c156 F test/e_changes.test 0f8c3e6aab7335cb772d5a3ea34ca4c82f98d0eb896e2eb3add971c16984b405 -F test/e_createtable.test 7997c0106c181243e0ac7db7ba8b9ae7233d0bfb0188605650322a7a02ea326e +F test/e_createtable.test 04c50b7fe41c12ed9cd88fbbc09b4900bcfc66f98ad198874fc993a2771f3913 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 235c610f8bf8ec44513e222b9085c7e49fad65ad0c1975ac2577109dd06fd8fa F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 @@ -1933,7 +1933,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 95806ac1dabe4598170061d903ae30f09bafac149ff6696963a7e056ac846cdb -R 0db7fc688bd69b655cfa0f3bed689f81 +P d814ba6effc7c5b021ff625b57371627f3ee326687c508da99f78bc164386b7e +R b4ad209c907e3449339c5f32dea41ff4 U drh -Z e3e9adffefbcbe1772add8e69eede097 +Z c8a41b263c4adfdb01ebfdbdc9f72a97 diff --git a/manifest.uuid b/manifest.uuid index 2d21a95d56..247beb902f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d814ba6effc7c5b021ff625b57371627f3ee326687c508da99f78bc164386b7e \ No newline at end of file +0eafbc2f31b83f48833b19894ff3252a63c319ff501506ef9f744cca813a3a24 \ No newline at end of file diff --git a/test/e_createtable.test b/test/e_createtable.test index c2cd1bc2c1..fa43d94b54 100644 --- a/test/e_createtable.test +++ b/test/e_createtable.test @@ -1272,9 +1272,10 @@ do_createtable_tests 4.4 { 14 "INSERT INTO t2 VALUES(NULL, NULL)" {} } -# EVIDENCE-OF: R-35113-43214 Unless the column is an INTEGER PRIMARY KEY -# or the table is a WITHOUT ROWID table or the column is declared NOT -# NULL, SQLite allows NULL values in a PRIMARY KEY column. +# EVIDENCE-OF: R-40010-16873 Unless the column is an INTEGER PRIMARY KEY +# or the table is a WITHOUT ROWID table or a STRICT table or the column +# is declared NOT NULL, SQLite allows NULL values in a PRIMARY KEY +# column. # # If the column is an integer primary key, attempting to insert a NULL # into the column triggers the auto-increment behavior. Attempting @@ -1304,6 +1305,14 @@ do_catchsql_test 4.5.5 { CREATE TABLE t5(s, u INT PRIMARY KEY NOT NULL, v); INSERT INTO t5 VALUES(1, NULL, 2); } {1 {NOT NULL constraint failed: t5.u}} +do_catchsql_test 4.5.6 { + CREATE TABLE t6(s INT, u INT PRIMARY KEY, v INT) STRICT; + INSERT INTO t6 VALUES(1, NULL, 2); +} {1 {NOT NULL constraint failed: t6.u}} +do_catchsql_test 4.5.7 { + CREATE TABLE t7(s INT, u INT PRIMARY KEY NOT NULL, v INT) STRICT; + INSERT INTO t7 VALUES(1, NULL, 2); +} {1 {NOT NULL constraint failed: t7.u}} # EVIDENCE-OF: R-00227-21080 A UNIQUE constraint is similar to a PRIMARY # KEY constraint, except that a single table may have any number of From bb0c54283d10397aa123872102dba97be793fe13 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 22 Nov 2021 08:12:14 +0000 Subject: [PATCH 21/24] Fix a crash in the fts3aux code that could occur handling corrupt records. FossilOrigin-Name: cdcd65b89ecffd380483404f5b1379beffd7ff107acaa5bc1185651cfacaa220 --- ext/fts3/fts3_aux.c | 4 + manifest | 16 ++-- manifest.uuid | 2 +- test/fts3corrupt4.test | 196 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 209 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index b6e651853b..1053f5d40b 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -340,6 +340,10 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ /* State 3. The integer just read is a column number. */ default: assert( eState==3 ); iCol = (int)v; + if( iCol<1 ){ + rc = SQLITE_CORRUPT_VTAB; + break; + } if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM; pCsr->aStat[iCol+1].nDoc++; eState = 2; diff --git a/manifest b/manifest index 01cca42e37..c7aac75aa9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sfor\sSTRICT\sand\sNOT\sNULL\sin\sPRIMARY\sKEY. -D 2021-11-20T13:30:03.615 +C Fix\sa\scrash\sin\sthe\sfts3aux\scode\sthat\scould\soccur\shandling\scorrupt\srecords. +D 2021-11-22T08:12:14.863 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -87,7 +87,7 @@ F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c da41de21622774b1cb8c3415e8d2a6961ad7c978ab534f2a54434f76a5c4dfbc F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h cff59b8b13dafe9d59924a5d710f771ed8b121a55cccbc99b6e2a723fcde14dc -F ext/fts3/fts3_aux.c 1af58af8f2b00a49f4fb1c2602f8da2054ad60076f46c8ebf85c5410eccccb65 +F ext/fts3/fts3_aux.c e0588984d16449bd1a5334606627a9db79913bb0f6003efded166a67cae7b2ed F ext/fts3/fts3_expr.c 903bfb9433109fffb10e910d7066c49cbf8eeae316adc93f0499c4da7dfc932a F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf @@ -981,7 +981,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test c0f71af1c5a5b73d66f2ab86be94190ba75576d22a3945fd8edc5aaf35e0b376 +F test/fts3corrupt4.test 799ff994b964fed7201be6b6b62c7ff2ef7bb3da6c02b9eaf0d96a5a4d9b6ca3 F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3corrupt6.test 657b4b8e5791d8d4adc93c90588fb25f1c7346544dd877c6c298a0746749146d F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf @@ -1933,7 +1933,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 d814ba6effc7c5b021ff625b57371627f3ee326687c508da99f78bc164386b7e -R b4ad209c907e3449339c5f32dea41ff4 -U drh -Z c8a41b263c4adfdb01ebfdbdc9f72a97 +P 0eafbc2f31b83f48833b19894ff3252a63c319ff501506ef9f744cca813a3a24 +R c8d194f01ea70c0f8e9ded20e982f86d +U dan +Z 5b833fcd8d1687ed54ab4812425b362e diff --git a/manifest.uuid b/manifest.uuid index 247beb902f..b2cfa4cd19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0eafbc2f31b83f48833b19894ff3252a63c319ff501506ef9f744cca813a3a24 \ No newline at end of file +cdcd65b89ecffd380483404f5b1379beffd7ff107acaa5bc1185651cfacaa220 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 41847c5062..f0b83a3901 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -7031,6 +7031,202 @@ do_catchsql_test 51.1 { } {1 {database disk image is malformed}} set sqlite_fts3_enable_parentheses $saved +#------------------------------------------------------------------------- +# +reset_db +do_test 52.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-fd33f4b1c8348b.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 92 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 ................ +| 96: 00 00 00 00 0d 0e ef 00 08 0d 13 00 0f bd 0f 5f ..............._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 0d 13 00 00 00 00 .........M...... +| 3344: 00 00 00 38 08 06 17 11 11 08 5f 74 61 62 6c 65 ...8......_table +| 3360: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3376: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3392: 47 20 66 74 73 34 61 75 78 28 74 31 29 55 07 07 G fts4aux(t1)U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 64 45 47 45 52 2c 73 74 61 72 74 dx INdEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 e6 50 52 49 4d 41 52 d INTEGER.PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 22 00 0f c4 0f 00 00 00 00 00 ................ +| 3616: 00 00 42 08 04 00 81 09 73 75 6e 74 20 69 6e 20 ..B.....sunt in +| 3632: 63 75 6c 70 61 20 71 75 69 20 6f 66 66 69 63 69 culpa qui offici +| 3648: 61 20 64 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 a deserunt molli +| 3664: 74 20 61 6e 69 6d 20 69 64 20 65 73 74 20 7c 61 t anim id est |a +| 3680: 62 6f 72 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 borum.2...kExcep +| 3696: 74 65 75 72 20 73 69 6e 74 20 6f 63 63 61 65 63 teur sint occaec +| 3712: 61 74 20 63 75 70 69 64 61 74 61 74 20 6e 6f 6e at cupidatat non +| 3728: 20 70 72 6f 69 64 65 6e 74 2c 29 06 03 00 59 63 proident,)...Yc +| 3744: 69 6c 6c 75 6d 20 64 6f 6c 6f 72 65 20 65 20 66 illum dolore e f +| 3760: 75 67 69 61 74 20 6e 75 6c 6c 61 20 70 61 72 69 ugiat nulla pari +| 3776: 61 74 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 atur.B.....Duis +| 3792: 61 75 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 aute irure dolor +| 3808: 20 69 6e 20 72 65 60 72 65 68 65 6e 64 65 72 69 in re`rehenderi +| 3824: 74 20 69 6e 20 76 70 6c 75 70 74 61 74 65 20 76 t in vpluptate v +| 3840: 65 6c 69 72 c0 65 73 73 65 29 04 03 00 59 6e 69 elir.esse)...Yni +| 3856: 73 6a 20 75 74 20 61 6c 69 71 75 69 70 20 65 20 sj ut aliquip e +| 3872: 65 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 e commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 29 11 55 74 20 65 6e 69 uat.F...).Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 7a 71 74 69 6f 6e 20 75 6c 6c exercizqtion ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 72 63 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 rcum dolor sit a +| 4064: 6d 65 74 2c 20 63 6f 6e 78 65 63 74 65 64 75 72 met, conxectedur +| 4080: 20 61 64 69 70 69 73 00 00 00 00 00 00 00 00 00 adipis......... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a c1 00 0d 61 0c 54 0a c1 00 00 .........a.T.... +| 2752: 00 83 10 03 08 02 08 08 08 17 86 0e 08 00 30 20 ..............0 +| 2768: 33 38 35 00 02 61 64 06 01 08 00 02 04 00 01 01 385..ad......... +| 2784: 6c 06 02 0c 00 02 04 00 01 01 6d 03 01 06 10 01 l.........m..... +| 2800: 01 6e 03 08 09 00 01 01 75 03 05 03 00 00 02 63 .n......u......c +| 2816: 69 03 06 02 00 01 01 6f 07 01 07 00 03 07 03 00 i......o........ +| 2832: 01 01 75 06 75 05 00 01 04 00 00 02 64 65 03 08 ..u.u.......de.. +| 2848: 07 00 01 01 6f 0d 01 04 00 01 03 09 00 03 05 00 ....o........... +| 2864: 01 03 00 01 01 75 03 05 02 00 00 02 65 69 03 02 .....u......ei.. +| 2880: 04 00 01 01 6c 03 01 44 00 01 01 6e 03 03 03 00 ....l..D...n.... +| 2896: 01 01 73 06 05 0b 00 03 0b 00 01 01 74 03 02 09 ..s.........t... +| 2912: 00 01 01 78 06 03 09 00 04 02 00 00 02 66 75 03 ...x.........fu. +| 2928: 06 05 00 00 02 69 64 03 08 0a 00 01 01 6e 0a 02 .....id......n.. +| 2944: 06 00 03 06 04 00 03 03 00 01 01 70 03 01 03 00 ...........p.... +| 2960: 01 01 72 03 05 04 00 00 02 6c 61 09 02 08 00 01 ..r......la..... +| 2976: 0b 00 05 0c 00 01 01 6f 03 01 02 00 00 02 6d 61 .......o......ma +| 2992: 03 02 0b 00 01 01 69 03 03 05 00 01 01 6f 03 08 ......i......o.. +| 3008: 08 00 00 02 6e 69 03 04 02 00 01 01 6f 06 03 08 ....ni......o... +| 3024: 00 04 06 00 01 01 75 03 06 06 00 00 02 6f 63 03 ......u......oc. +| 3040: 07 04 00 01 01 66 03 08 06 00 00 02 70 61 03 06 .....f......pa.. +| 3056: 07 00 01 11 72 03 07 07 00 00 02 71 75 06 03 07 ....r......qu... +| 3072: 00 05 05 00 00 02 72 65 03 05 07 00 00 02 73 65 ......re......se +| 3088: 03 02 02 00 01 01 69 06 01 05 00 06 03 00 01 01 ......i......... +| 3104: 75 03 08 02 00 00 02 74 65 03 02 05 00 00 02 75 u......te......u +| 3120: 6c 13 03 0a 00 01 01 74 09 02 07 00 01 02 00 01 l......t........ +| 3136: 02 ff ff 02 76 65 06 03 06 00 02 0a 00 01 01 6f ....ve.........o +| 3152: 03 05 09 00 82 0a 02 08 02 08 08 08 17 84 02 04 ................ +| 3168: 00 30 20 32 35 31 00 01 61 13 01 06 04 00 01 0c .0 251..a....... +| 3184: 00 01 04 00 01 04 00 01 03 00 03 09 00 00 01 63 ...............c +| 3200: 10 01 07 00 03 07 03 00 02 02 00 01 05 00 01 04 ................ +| 3216: 00 00 01 64 11 01 04 00 01 03 09 00 03 02 05 00 ...d............ +| 3232: 01 03 00 02 07 00 00 01 65 1b 01 09 00 01 04 07 ........e....... +| 3248: 00 01 03 08 00 01 05 03 00 01 1c eb 01 04 00 01 ................ +| 3264: 0e 80 01 0b 00 00 01 66 03 06 05 00 00 01 69 0f .......f......i. +| 3280: 01 03 00 01 06 0b 23 04 04 04 00 03 03 09 00 00 ......#......... +| 3296: 01 6c 0c 01 02 00 01 08 00 01 0b 00 05 0c 00 00 .l.............. +| 3312: 01 6d 09 02 0b 00 01 05 00 05 08 00 00 01 6e 0c .m............n. +| 3328: 03 08 00 01 02 00 02 06 00 01 06 00 00 01 6f 06 ..............o. +| 3344: 07 04 00 01 06 00 00 01 70 06 06 07 00 01 07 00 ........p....... +| 3360: 00 01 71 06 03 07 00 05 05 00 00 01 72 03 05 07 ..q.........r... +| 3376: 00 00 02 73 0c 01 05 00 01 02 00 05 03 00 01 02 ...s............ +| 3392: 00 00 01 74 03 02 05 00 00 01 75 0a 02 07 00 01 ...t......u..... +| 3408: 02 0a 00 01 03 00 00 01 76 07 03 06 00 02 09 03 ........v....... +| 3424: 00 85 1c 01 08 08 08 08 08 17 8a 2a 30 20 36 35 ...........*0 65 +| 3440: 35 00 02 61 64 03 03 04 00 02 08 69 70 69 73 63 5..ad......ipisc +| 3456: 69 6e 67 03 01 08 00 01 05 6c 69 71 75 61 03 02 ing......liqua.. +| 3472: 0c 00 05 02 69 70 03 04 04 00 01 03 6d 65 74 03 ....ip......met. +| 3488: 01 06 00 01 03 6e 69 6d 03 08 09 00 01 03 75 74 .....nim......ut +| 3504: 65 03 05 03 00 00 06 63 69 6c 6c 75 6d 03 06 02 e......cillum... +| 3520: 00 01 06 6f 6d 6d 6f 64 6f 03 04 07 00 02 09 6e ...ommodo......n +| 3536: 73 65 63 74 65 74 75 72 03 01 07 00 05 04 71 75 sectetur......qu +| 3552: 61 73 03 04 08 00 01 04 75 6c 70 61 03 08 04 00 as......ulpa.... +| 3568: 02 07 70 69 64 61 74 61 74 03 07 05 00 00 08 64 ..pidatat......d +| 3584: 65 73 65 72 75 6e 74 03 08 07 00 01 01 6f 03 09 eserunt......o.. +| 3600: b3 00 02 03 6c 6f 72 06 01 04 00 04 05 00 05 01 ....lor......... +| 3616: 65 06 02 0a 00 04 03 00 01 03 75 69 73 03 05 02 e.........uis... +| 3632: 00 00 01 65 07 04 05 03 00 02 04 00 01 06 69 75 ...e..........iu +| 3648: 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 03 01 09 smod......lit... +| 3664: 00 01 03 6e 69 6d 03 03 03 00 01 03 73 73 65 03 ...nim......sse. +| 3680: 05 0b 00 02 01 74 03 08 0b 00 01 01 74 03 02 09 .....t......t... +| 3696: 00 01 08 78 63 65 70 64 65 75 72 03 07 02 00 02 ...xcepdeur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6c f3 01 03 00 01 04 72 75 72 65 03 05 04 00 ul......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 15 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 01 ff ff f0 t......sed...... +| 4000: b9 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 .nt......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0d fa 04 02 03 00 0e 0b 04 00 00 00 00 00 ................ +| page 7 offset 24576 +| 4080: 00 00 00 00 00 00 00 07 00 03 00 00 00 00 00 00 ................ +| end crash-fd33f4b1c8348b.db +}]} {} + +do_catchsql_test 52.1 { + SELECT * FROM t1, t2; +} {1 {database disk image is malformed}} finish_test From 156d44104af2c412ae487ee270ca9de29f9e815b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 22 Nov 2021 12:59:44 +0000 Subject: [PATCH 22/24] In the previous check-in, do not overwrite the SQLITE_CORRUPT signal with an SQLITE_OK before exiting fts3auxNextMethod(). FossilOrigin-Name: 396688ae5c10b9e7df1c76a3c6f548abf7a7ddad50c25fb23e194201dbb2e857 --- ext/fts3/fts3_aux.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index 1053f5d40b..d3b194c942 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -297,6 +297,7 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM; memset(pCsr->aStat, 0, sizeof(struct Fts3auxColstats) * pCsr->nStat); iCol = 0; + rc = SQLITE_OK; while( iiCol = 0; - rc = SQLITE_OK; }else{ pCsr->isEof = 1; } diff --git a/manifest b/manifest index c7aac75aa9..4087b34bd4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sin\sthe\sfts3aux\scode\sthat\scould\soccur\shandling\scorrupt\srecords. -D 2021-11-22T08:12:14.863 +C In\sthe\sprevious\scheck-in,\sdo\snot\soverwrite\sthe\sSQLITE_CORRUPT\ssignal\swith\nan\sSQLITE_OK\sbefore\sexiting\sfts3auxNextMethod(). +D 2021-11-22T12:59:44.150 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -87,7 +87,7 @@ F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c da41de21622774b1cb8c3415e8d2a6961ad7c978ab534f2a54434f76a5c4dfbc F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h cff59b8b13dafe9d59924a5d710f771ed8b121a55cccbc99b6e2a723fcde14dc -F ext/fts3/fts3_aux.c e0588984d16449bd1a5334606627a9db79913bb0f6003efded166a67cae7b2ed +F ext/fts3/fts3_aux.c f0dc9bd98582615b7750218899bd0c729879b6bbf94d1be57ca1833ff49afc6f F ext/fts3/fts3_expr.c 903bfb9433109fffb10e910d7066c49cbf8eeae316adc93f0499c4da7dfc932a F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf @@ -1933,7 +1933,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 0eafbc2f31b83f48833b19894ff3252a63c319ff501506ef9f744cca813a3a24 -R c8d194f01ea70c0f8e9ded20e982f86d -U dan -Z 5b833fcd8d1687ed54ab4812425b362e +P cdcd65b89ecffd380483404f5b1379beffd7ff107acaa5bc1185651cfacaa220 +R 208501928dfb9dc3efdb2329a03f3d97 +U drh +Z 888c3a6e3f637c09abad8905bf2a9680 diff --git a/manifest.uuid b/manifest.uuid index b2cfa4cd19..f42ae966c7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cdcd65b89ecffd380483404f5b1379beffd7ff107acaa5bc1185651cfacaa220 \ No newline at end of file +396688ae5c10b9e7df1c76a3c6f548abf7a7ddad50c25fb23e194201dbb2e857 \ No newline at end of file From 9f9bdf93453b61d7db051f12b7eee657a1439c08 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 22 Nov 2021 13:35:40 +0000 Subject: [PATCH 23/24] Fix the build for SQLITE_OMIT_CTE. FossilOrigin-Name: d7ef96bae459f800241483fe8784552d18ee7f92f408f6453ac687de5530bbb9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4087b34bd4..e336ed7bb1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sprevious\scheck-in,\sdo\snot\soverwrite\sthe\sSQLITE_CORRUPT\ssignal\swith\nan\sSQLITE_OK\sbefore\sexiting\sfts3auxNextMethod(). -D 2021-11-22T12:59:44.150 +C Fix\sthe\sbuild\sfor\sSQLITE_OMIT_CTE. +D 2021-11-22T13:35:40.091 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -555,7 +555,7 @@ F src/shell.c.in 975f268ef261773fcbed1e519dfa10c4f33e8b1cffc12120563e61857fff07c F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8ff2fd2c166150b2e48639f5e506fb44e29f1a3f65031710b9e89d1c126ac839 -F src/sqliteInt.h 42c8f4c05ddbe8214d439aa80d98914d1883104f8f518820ce2e9e4e183c31fb +F src/sqliteInt.h 524adaf6fe699cea554987647392baa2f7ee35df840c79245b8059ebc58831df F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1933,7 +1933,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 cdcd65b89ecffd380483404f5b1379beffd7ff107acaa5bc1185651cfacaa220 -R 208501928dfb9dc3efdb2329a03f3d97 +P 396688ae5c10b9e7df1c76a3c6f548abf7a7ddad50c25fb23e194201dbb2e857 +R 130700c2b8fec194a6351fb9cbd33306 U drh -Z 888c3a6e3f637c09abad8905bf2a9680 +Z 8be64a1a6d76669a25afb7588f5f68ce diff --git a/manifest.uuid b/manifest.uuid index f42ae966c7..d0ea29c82d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -396688ae5c10b9e7df1c76a3c6f548abf7a7ddad50c25fb23e194201dbb2e857 \ No newline at end of file +d7ef96bae459f800241483fe8784552d18ee7f92f408f6453ac687de5530bbb9 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 09bccc92fe..90068fc7aa 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -5112,7 +5112,7 @@ const char *sqlite3JournalModename(int); # define sqlite3CteDelete(D,C) # define sqlite3CteWithAdd(P,W,C) ((void*)0) # define sqlite3WithDelete(x,y) -# define sqlite3WithPush(x,y,z) +# define sqlite3WithPush(x,y,z) ((void*)0) #endif #ifndef SQLITE_OMIT_UPSERT Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*,Upsert*); From 81258cc911cd513afedf181252325d21605b17da Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 22 Nov 2021 13:59:06 +0000 Subject: [PATCH 24/24] In fuzzcheck, improve the defense against long delays due to rogue busy_timeout macros in fuzzer-generated scripts. FossilOrigin-Name: 3024d7ca03541a6fe3d264fdc82dd49f8f6b51d2fbeec4dfc9c6dd72806b271a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e336ed7bb1..9ebb0d1931 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbuild\sfor\sSQLITE_OMIT_CTE. -D 2021-11-22T13:35:40.091 +C In\sfuzzcheck,\simprove\sthe\sdefense\sagainst\slong\sdelays\sdue\sto\s\nrogue\sbusy_timeout\smacros\sin\sfuzzer-generated\sscripts. +D 2021-11-22T13:59:06.242 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1058,7 +1058,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 7a07718e3c017f31e88b56a891bb79a3eb42a413a811fd65b89a7b09fdd1adbd +F test/fuzzcheck.c bdb852815048a0beebbe5768bca61e75295324a811a8d7216f97b96501befd1e F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1933,7 +1933,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 396688ae5c10b9e7df1c76a3c6f548abf7a7ddad50c25fb23e194201dbb2e857 -R 130700c2b8fec194a6351fb9cbd33306 +P d7ef96bae459f800241483fe8784552d18ee7f92f408f6453ac687de5530bbb9 +R 11b44234bac388e17f8ad6bfd1668b2e U drh -Z 8be64a1a6d76669a25afb7588f5f68ce +Z b4ee0248beb1997226750d4c0ca87d1d diff --git a/manifest.uuid b/manifest.uuid index d0ea29c82d..a1fe0cd668 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7ef96bae459f800241483fe8784552d18ee7f92f408f6453ac687de5530bbb9 \ No newline at end of file +3024d7ca03541a6fe3d264fdc82dd49f8f6b51d2fbeec4dfc9c6dd72806b271a \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index b8b0fee460..f5a7b092e3 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -843,7 +843,7 @@ static int block_troublesome_sql( (void)zArg4; if( eCode==SQLITE_PRAGMA ){ if( sqlite3_stricmp("busy_timeout",zArg1)==0 - && (zArg2==0 || strtoll(zArg2,0,0)>100) + && (zArg2==0 || strtoll(zArg2,0,0)>100 || strtoll(zArg2,0,10)>100) ){ return SQLITE_DENY; }else if( eVerbosity==0 ){