From 69b72d5a29c2e2db120376ebae702ee353fb9bfd Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 1 Jun 2015 20:28:03 +0000 Subject: [PATCH 01/49] For FROM-clause subqueries that cannot be flattened, try to push WHERE clause terms of the outer query down into the subquery in order to help the subquery run faster and/or use less memory. FossilOrigin-Name: 297fae7551a2af9e600d833801ff79fca0602ad5 --- manifest | 15 +++-- manifest.uuid | 2 +- src/select.c | 181 ++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 140 insertions(+), 58 deletions(-) diff --git a/manifest b/manifest index 879a00fb94..ca7b8564e1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Corrections\sto\scomments\sin\sexpr.c.\s\sNo\scode\schanges. -D 2015-06-01T18:13:16.094 +C For\sFROM-clause\ssubqueries\sthat\scannot\sbe\sflattened,\stry\sto\spush\sWHERE\sclause\nterms\sof\sthe\souter\squery\sdown\sinto\sthe\ssubquery\sin\sorder\sto\shelp\sthe\ssubquery\nrun\sfaster\sand/or\suse\sless\smemory. +D 2015-06-01T20:28:03.248 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -250,7 +250,7 @@ F src/printf.c 13ce37e5574f9b0682fa86dbcf9faf76b9d82a15 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 5978cc521cb8fc1aa6a0089e35edaf531accb52a +F src/select.c 7acdb105dccfa226ea30f3c08a847d448e216240 F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1281,7 +1281,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9b8e5823bccf69f5cdedd8655e75df6e9718b809 -R 79c21798380eea59e3e40be5d7ba64b0 +P f925389eaf5bf8962a28fcaa652b75caa606efba +R 033219587dbe88756604bf887ec3da43 +T *branch * subquery-opt +T *sym-subquery-opt * +T -sym-trunk * U drh -Z 59ba12ae4d822d8c7d37e1e41f2f9dfd +Z 48ce2765ca9875a4f4c27e6792269bfa diff --git a/manifest.uuid b/manifest.uuid index f27f0a3260..d83252b194 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f925389eaf5bf8962a28fcaa652b75caa606efba \ No newline at end of file +297fae7551a2af9e600d833801ff79fca0602ad5 \ No newline at end of file diff --git a/src/select.c b/src/select.c index e5e1a9988b..0558c79281 100644 --- a/src/select.c +++ b/src/select.c @@ -3718,6 +3718,73 @@ static int flattenSubquery( } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) +/* +** Make copies of relevant WHERE clause terms of the outer query into +** the WHERE clause of subquery. Example: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1) WHERE x=5 AND y=10; +** +** Transformed into: +** +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1 WHERE a=5 AND c-d=10) +** WHERE x=5 AND y=10; +** +** The hope is that the terms added to the inner query will make it more +** efficient. +** +** Do not attempt this optimization if: +** +** (1) The inner query is an aggregate. (In that case, we'd really want +** to copy the outer WHERE-clause terms onto the HAVING clause of the +** inner query. But they probably won't help there so do not bother.) +** +** (2) The inner query is the recursive part of a common table expression. +** +** (3) The inner query has a LIMIT clause (since the changes to the WHERE +** close would change the meaning of the LIMIT). +** +** (4) The inner query is the right operand of a LEFT JOIN. (The caller +** enforces this restriction since this routine does not have enough +** information to know.) +** +** Return 0 if no changes are made and non-zero if one or more WHERE clause +** terms are duplicated into the subquery. +*/ +static int pushDownWhereTerms( + sqlite3 *db, /* The database connection (for malloc()) */ + Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ + Expr *pWhere, /* The WHERE clause of the outer query */ + int iCursor /* Cursor number of the subquery */ +){ + Expr *pNew; + int nChng = 0; + if( pWhere==0 ) return 0; + if( (pSubq->selFlags & (SF_Aggregate|SF_Recursive))!=0 ){ + return 0; /* restrictions (1) and (2) */ + } + if( pSubq->pLimit!=0 ){ + return 0; /* restriction (3) */ + } + while( pWhere->op==TK_AND ){ + nChng += pushDownWhereTerms(db, pSubq, pWhere->pRight, iCursor); + pWhere = pWhere->pLeft; + } + if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ + nChng++; + while( pSubq ){ + pNew = sqlite3ExprDup(db, pWhere, 0); + pNew = substExpr(db, pNew, iCursor, pSubq->pEList); + pSubq->pWhere = sqlite3ExprAnd(db, pSubq->pWhere, pNew); + pSubq = pSubq->pPrior; + } + } + return nChng; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + /* ** Based on the contents of the AggInfo structure indicated by the first ** argument, this function checks if the following are true: @@ -4816,60 +4883,72 @@ int sqlite3Select( p->selFlags |= SF_Aggregate; } i = -1; - }else if( pTabList->nSrc==1 - && (p->selFlags & SF_All)==0 - && OptimizationEnabled(db, SQLITE_SubqCoroutine) - ){ - /* Implement a co-routine that will return a single row of the result - ** set on each invocation. - */ - int addrTop = sqlite3VdbeCurrentAddr(v)+1; - pItem->regReturn = ++pParse->nMem; - sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); - VdbeComment((v, "%s", pItem->pTab->zName)); - pItem->addrFillSub = addrTop; - sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); - explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); - sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); - pItem->viaCoroutine = 1; - pItem->regResult = dest.iSdst; - sqlite3VdbeAddOp1(v, OP_EndCoroutine, pItem->regReturn); - sqlite3VdbeJumpHere(v, addrTop-1); - sqlite3ClearTempRegCache(pParse); }else{ - /* Generate a subroutine that will fill an ephemeral table with - ** the content of this subquery. pItem->addrFillSub will point - ** to the address of the generated subroutine. pItem->regReturn - ** is a register allocated to hold the subroutine return address - */ - int topAddr; - int onceAddr = 0; - int retAddr; - assert( pItem->addrFillSub==0 ); - pItem->regReturn = ++pParse->nMem; - topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); - pItem->addrFillSub = topAddr+1; - if( pItem->isCorrelated==0 ){ - /* If the subquery is not correlated and if we are not inside of - ** a trigger, then we only need to compute the value of the subquery - ** once. */ - onceAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); - VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); - }else{ - VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); + if( (pItem->jointype & JT_OUTER)==0 + && pushDownWhereTerms(db, pSub, p->pWhere, pItem->iCursor) + ){ +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + sqlite3DebugPrintf("After WHERE-clause push-down:\n"); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + } + if( pTabList->nSrc==1 + && (p->selFlags & SF_All)==0 + && OptimizationEnabled(db, SQLITE_SubqCoroutine) + ){ + /* Implement a co-routine that will return a single row of the result + ** set on each invocation. + */ + int addrTop = sqlite3VdbeCurrentAddr(v)+1; + pItem->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); + VdbeComment((v, "%s", pItem->pTab->zName)); + pItem->addrFillSub = addrTop; + sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); + explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); + pItem->viaCoroutine = 1; + pItem->regResult = dest.iSdst; + sqlite3VdbeAddOp1(v, OP_EndCoroutine, pItem->regReturn); + sqlite3VdbeJumpHere(v, addrTop-1); + sqlite3ClearTempRegCache(pParse); + }else{ + /* Generate a subroutine that will fill an ephemeral table with + ** the content of this subquery. pItem->addrFillSub will point + ** to the address of the generated subroutine. pItem->regReturn + ** is a register allocated to hold the subroutine return address + */ + int topAddr; + int onceAddr = 0; + int retAddr; + assert( pItem->addrFillSub==0 ); + pItem->regReturn = ++pParse->nMem; + topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + pItem->addrFillSub = topAddr+1; + if( pItem->isCorrelated==0 ){ + /* If the subquery is not correlated and if we are not inside of + ** a trigger, then we only need to compute the value of the subquery + ** once. */ + onceAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); + VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); + }else{ + VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); + } + sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); + explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); + if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); + retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); + VdbeComment((v, "end %s", pItem->pTab->zName)); + sqlite3VdbeChangeP1(v, topAddr, retAddr); + sqlite3ClearTempRegCache(pParse); } - sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); - explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); - sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); - if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); - retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); - VdbeComment((v, "end %s", pItem->pTab->zName)); - sqlite3VdbeChangeP1(v, topAddr, retAddr); - sqlite3ClearTempRegCache(pParse); } - if( /*pParse->nErr ||*/ db->mallocFailed ){ + if( db->mallocFailed ){ goto select_end; } pParse->nHeight -= sqlite3SelectExprHeight(p); From 24dee9d2143c9dcc4026c9958f2fa07b155958ab Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 2 Jun 2015 19:36:29 +0000 Subject: [PATCH 02/49] Always check for cell overflow before returning a slot from the pageFindSlot routine in btree.c. FossilOrigin-Name: 9f035c45a4b84203e67b6e1b23cf11691dc43f1e --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/btree.c | 8 ++++---- test/fuzzdata3.db | Bin 10724352 -> 10728448 bytes 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index eb6aa8009c..31c398c461 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sFROM-clause\ssubqueries\sthat\scannot\sbe\sflattened,\stry\sto\spush\srelevant\nWHERE\sclause\sterms\sof\sthe\souter\squery\sdown\sinto\sthe\ssubquery\sin\sorder\sto\shelp\nthe\ssubquery\srun\sfaster\sand/or\suse\sless\smemory. -D 2015-06-02T18:09:18.284 +C Always\scheck\sfor\scell\soverflow\sbefore\sreturning\sa\sslot\sfrom\sthe\npageFindSlot\sroutine\sin\sbtree.c. +D 2015-06-02T19:36:29.792 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,7 +192,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c c73a170115df068764126a85288cdec092ec180c +F src/btree.c 5166c27883c24768c2f7f53479714f03ef34c612 F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4 F src/build.c 73da2b9e9311abc4fcb4e36f76c7800c2d2504a4 @@ -656,7 +656,7 @@ F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 F test/fuzzcheck.c a60f926e3fa86c8d33908406d75eec868c22b9ca F test/fuzzdata1.db b60254eeb6bc11474071b883059662a73c48da7f F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 -F test/fuzzdata3.db 3632e598ff8574228aadf09897bd040d3c5f5ffb +F test/fuzzdata3.db a6e9bf75b8bfad0b7e60e57038908f4237b9c5d2 F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1282,8 +1282,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9678646d9a14ba283a83839be329599a676a537a 297fae7551a2af9e600d833801ff79fca0602ad5 -R 4cb9a66e53feaa59f815d8d8fff07191 -T +closed 297fae7551a2af9e600d833801ff79fca0602ad5 +P 6df18e949d3676290785143993513ea1b917d729 +R df67992b4dca09a3ed79d8f1ab3e61e2 U drh -Z 655d5f5f5a9ad84ec56fa650e3297ec0 +Z ecf49562dd93a4ec8af623b100b6b686 diff --git a/manifest.uuid b/manifest.uuid index 800c657dd8..501e5da639 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6df18e949d3676290785143993513ea1b917d729 \ No newline at end of file +9f035c45a4b84203e67b6e1b23cf11691dc43f1e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index c81059f5b4..53e0ebbfc1 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1272,7 +1272,10 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc, int *pbDefrag){ int x = size - nByte; testcase( x==4 ); testcase( x==3 ); - if( x<4 ){ + if( pc < pPg->cellOffset+2*pPg->nCell || size+pc > usableSize ){ + *pRc = SQLITE_CORRUPT_BKPT; + return 0; + }else if( x<4 ){ /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total ** number of bytes in fragments may not exceed 60. */ if( aData[hdr+7]>=60 ){ @@ -1283,9 +1286,6 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc, int *pbDefrag){ ** fragmented bytes within the page. */ memcpy(&aData[iAddr], &aData[pc], 2); aData[hdr+7] += (u8)x; - }else if( pc < pPg->cellOffset+2*pPg->nCell || size+pc > usableSize ){ - *pRc = SQLITE_CORRUPT_BKPT; - return 0; }else{ /* The slot remains on the free-list. Reduce its size to account ** for the portion used by the new allocation. */ diff --git a/test/fuzzdata3.db b/test/fuzzdata3.db index 376459f2d624ff28e69b8f0b3892e89d2fc43c88..29be55e7a6df4ee35ae2d5e27cc0e1a4ed75ea77 100644 GIT binary patch delta 611 zcmW-fS62-H0D!yqwy0EA$SA@!B0DP~JEQEKeD=sD!VRBYZbsLND~^BQ+;?951J7RU zj2Ca6qvP>A-`jV-$ouA$$d~4nXnsn!q@-|1tfeWQA1nWuTGYkGpE4SefCMEZ$&wXq`wT1d>JT%WUvg80x6WCGE9nOxQvjI z5|&XiTE@s&DVA|EUP@$wOq5A7S*FNTnI@$&U1rEknI*HOOy)?r%$0dEUn*pQER;pE zSeD3AStgaTTvo_RStV6cEvsdXtd(`LUN*=^*(94~i)@u`vR!Iqht$eW>1wr0cFP{w zEBj=>9FT)@NDfP#9Fe1POpeP5IVq>)w49N8IVVd5N6nf{sA!_q%v@;M+eYyZ4#^ delta 546 zcmW;K=~j#Z0D$4Cd>KTtGf@;G`<7cE*UaP0?Cxo5|%MC zR>nz|jF$u6tCbe>0PRL0)C8woM&d6CgC+Fp#)djgIm*lcsk*jh| zuFDO%DYv9v8sxS#${o2Y_vF4jkcaX}n&h!Ok!E=+F=>%jc_zbqS zo5bb4v`dG4kWTq1UD7QH>5)(JS-wcGe3d@wm!y3ANh&!Iu1+rt{ST1!J=Hy!Q<2e^ LHW>Yp`t^4N9SGi) From d62fbb50e6a927279856fcd0cb4cff675159dc1d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 4 Jun 2015 12:08:53 +0000 Subject: [PATCH 03/49] Change the name of SrcList.a[].zIndex to the more descriptive SrcList.a[0].zIndexedBy. FossilOrigin-Name: 6a9cf063379118dbb95c6cdc6d60af50e9867177 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/build.c | 6 +++--- src/expr.c | 2 +- src/select.c | 8 ++++---- src/sqliteInt.h | 2 +- src/where.c | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 31c398c461..eb67a9af5b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\scheck\sfor\scell\soverflow\sbefore\sreturning\sa\sslot\sfrom\sthe\npageFindSlot\sroutine\sin\sbtree.c. -D 2015-06-02T19:36:29.792 +C Change\sthe\sname\sof\sSrcList.a[].zIndex\sto\sthe\smore\sdescriptive\nSrcList.a[0].zIndexedBy. +D 2015-06-04T12:08:53.261 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,14 +195,14 @@ F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c 5166c27883c24768c2f7f53479714f03ef34c612 F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4 -F src/build.c 73da2b9e9311abc4fcb4e36f76c7800c2d2504a4 +F src/build.c 6770b74ccb51cb485e81057c625f77455d5ddc06 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575 F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e -F src/expr.c 52f5c1c2c16bf47234dc276d9f72b5ea85ae14af +F src/expr.c d953b9f03c3c0f701f87a418fcfb9cba8befc6e0 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c9b63a217d86582c22121699a47f22f524608869 F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6 @@ -250,12 +250,12 @@ F src/printf.c 13ce37e5574f9b0682fa86dbcf9faf76b9d82a15 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 498342ba48543a13804a49f9620c6eba419a1159 +F src/select.c 36416c13e4a156fa7e8f29181e28964612767ddf F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 2ebeb634e751a61a6f0eebfa0f4669f46a42f6cd -F src/sqliteInt.h bcf51f6ec3ad67dbdf1acf78fcb94884af93c183 +F src/sqliteInt.h 851cc2ee6ec9a853f3fbcf1ce582590531fd7528 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -326,7 +326,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c dcdfee81d35ae9261a4c5bda6289ed5fa6d7e1ae +F src/where.c 2db8137f14644e2117c2e2350e08a05e02d6bdab F src/whereInt.h a6f5a762bc1b4b1c76e1cea79976b437ac35a435 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1282,7 +1282,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6df18e949d3676290785143993513ea1b917d729 -R df67992b4dca09a3ed79d8f1ab3e61e2 +P 9f035c45a4b84203e67b6e1b23cf11691dc43f1e +R ad5ce5f5b8d17995393297d9ed2a0d0e U drh -Z ecf49562dd93a4ec8af623b100b6b686 +Z de80e81db21512cdc452bca7645bb7ca diff --git a/manifest.uuid b/manifest.uuid index 501e5da639..e2792cff66 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9f035c45a4b84203e67b6e1b23cf11691dc43f1e \ No newline at end of file +6a9cf063379118dbb95c6cdc6d60af50e9867177 \ No newline at end of file diff --git a/src/build.c b/src/build.c index ad83a6a7dd..8c62fd18d5 100644 --- a/src/build.c +++ b/src/build.c @@ -3701,7 +3701,7 @@ void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ sqlite3DbFree(db, pItem->zDatabase); sqlite3DbFree(db, pItem->zName); sqlite3DbFree(db, pItem->zAlias); - sqlite3DbFree(db, pItem->zIndex); + sqlite3DbFree(db, pItem->zIndexedBy); sqlite3DeleteTable(db, pItem->pTab); sqlite3SelectDelete(db, pItem->pSelect); sqlite3ExprDelete(db, pItem->pOn); @@ -3774,13 +3774,13 @@ void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ assert( pIndexedBy!=0 ); if( p && ALWAYS(p->nSrc>0) ){ struct SrcList_item *pItem = &p->a[p->nSrc-1]; - assert( pItem->notIndexed==0 && pItem->zIndex==0 ); + assert( pItem->notIndexed==0 && pItem->zIndexedBy==0 ); if( pIndexedBy->n==1 && !pIndexedBy->z ){ /* A "NOT INDEXED" clause was supplied. See parse.y ** construct "indexed_opt" for details. */ pItem->notIndexed = 1; }else{ - pItem->zIndex = sqlite3NameFromToken(pParse->db, pIndexedBy); + pItem->zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy); } } } diff --git a/src/expr.c b/src/expr.c index fa5715c04f..56a62e0c3f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1041,7 +1041,7 @@ SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ pNewItem->isCorrelated = pOldItem->isCorrelated; pNewItem->viaCoroutine = pOldItem->viaCoroutine; pNewItem->isRecursive = pOldItem->isRecursive; - pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex); + pNewItem->zIndexedBy = sqlite3DbStrDup(db, pOldItem->zIndexedBy); pNewItem->notIndexed = pOldItem->notIndexed; pNewItem->pIndex = pOldItem->pIndex; pTab = pNewItem->pTab = pOldItem->pTab; diff --git a/src/select.c b/src/select.c index 69b7a790c9..d50ff7965e 100644 --- a/src/select.c +++ b/src/select.c @@ -3868,16 +3868,16 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ ** pFrom->pIndex and return SQLITE_OK. */ int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){ - if( pFrom->pTab && pFrom->zIndex ){ + if( pFrom->pTab && pFrom->zIndexedBy ){ Table *pTab = pFrom->pTab; - char *zIndex = pFrom->zIndex; + char *zIndexedBy = pFrom->zIndexedBy; Index *pIdx; for(pIdx=pTab->pIndex; - pIdx && sqlite3StrICmp(pIdx->zName, zIndex); + pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy); pIdx=pIdx->pNext ); if( !pIdx ){ - sqlite3ErrorMsg(pParse, "no such index: %s", zIndex, 0); + sqlite3ErrorMsg(pParse, "no such index: %s", zIndexedBy, 0); pParse->checkSchema = 1; return SQLITE_ERROR; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a31f363708..5b7fbbc835 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2260,7 +2260,7 @@ struct SrcList { Expr *pOn; /* The ON clause of a join */ IdList *pUsing; /* The USING clause of a join */ Bitmask colUsed; /* Bit N (1<" clause */ + char *zIndexedBy; /* Identifier from "INDEXED BY " clause */ Index *pIndex; /* Index structure corresponding to zIndex, if any */ } a[1]; /* One entry for each identifier on the list */ }; diff --git a/src/where.c b/src/where.c index ecd6bd2a8f..2dc3b17754 100644 --- a/src/where.c +++ b/src/where.c @@ -6396,7 +6396,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pItem = pWInfo->pTabList->a; pTab = pItem->pTab; if( IsVirtual(pTab) ) return 0; - if( pItem->zIndex ) return 0; + if( pItem->zIndexedBy ) return 0; iCur = pItem->iCursor; pWC = &pWInfo->sWC; pLoop = pBuilder->pNew; From 97bae794c202a995b9073866e894a3fc03381e1f Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Jun 2015 15:59:57 +0000 Subject: [PATCH 04/49] Add a new opcode to the VDBE that gives the b-tree a hint about the set of columns in a table or index that are actually used by the query. FossilOrigin-Name: f167bba446b78dd7538d0b2bae3e6678f3b1ba28 --- manifest | 25 ++++++++++++++----------- manifest.uuid | 2 +- src/expr.c | 19 ++----------------- src/vdbe.c | 20 ++++++++++++++++++++ src/vdbe.h | 1 + src/vdbeInt.h | 3 +++ src/vdbeaux.c | 17 +++++++++++++++++ src/where.c | 19 +++++++++++++++++++ 8 files changed, 77 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index eb67a9af5b..73909a70b4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sname\sof\sSrcList.a[].zIndex\sto\sthe\smore\sdescriptive\nSrcList.a[0].zIndexedBy. -D 2015-06-04T12:08:53.261 +C Add\sa\snew\sopcode\sto\sthe\sVDBE\sthat\sgives\sthe\sb-tree\sa\shint\sabout\sthe\sset\nof\scolumns\sin\sa\stable\sor\sindex\sthat\sare\sactually\sused\sby\sthe\squery. +D 2015-06-05T15:59:57.203 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -202,7 +202,7 @@ F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e -F src/expr.c d953b9f03c3c0f701f87a418fcfb9cba8befc6e0 +F src/expr.c 1980fffc7505d7696b5ec53475ed4bd6fd39f490 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c9b63a217d86582c22121699a47f22f524608869 F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6 @@ -312,11 +312,11 @@ F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c a6431c92803b975b7322724a7b433e538d243539 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 -F src/vdbe.c 0a6a1df5c31415a0e974e74e7bd412616889453d -F src/vdbe.h 7e538ecf47dccb307ea2d087c3ddc2dd8d70e79d -F src/vdbeInt.h f0ccddac48583d5f762dc554a9f79e85ea8807e0 +F src/vdbe.c c9b8985dfc5df9bd512342ea2e56af4be30cb31a +F src/vdbe.h 90048aea1910f9df93e6044592bd4a466dc9c5e7 +F src/vdbeInt.h 20295e482121d13437f69985f77db211cdc8bac1 F src/vdbeapi.c 6a0d7757987018ff6b1b81bc5293219cd26bb299 -F src/vdbeaux.c 46f9bc4b32866082eb87a36b461e487a0bbdbe8e +F src/vdbeaux.c 89c85926ce346988d275132e05ddb0c9681807c2 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c 67b302dc6df64b4d6785881c5d22bd4f9b17739d F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b @@ -326,7 +326,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c 2db8137f14644e2117c2e2350e08a05e02d6bdab +F src/where.c f957a39866d126cfe45bc20737085a01d241dab2 F src/whereInt.h a6f5a762bc1b4b1c76e1cea79976b437ac35a435 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1282,7 +1282,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9f035c45a4b84203e67b6e1b23cf11691dc43f1e -R ad5ce5f5b8d17995393297d9ed2a0d0e +P 6a9cf063379118dbb95c6cdc6d60af50e9867177 +R 26fb3dd084da8ca4266e7b6ea31232cf +T *branch * column-usage-hint +T *sym-column-usage-hint * +T -sym-trunk * U drh -Z de80e81db21512cdc452bca7645bb7ca +Z 4c54f566ac1c4e0f96dff99143c1643e diff --git a/manifest.uuid b/manifest.uuid index e2792cff66..206cd98c3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6a9cf063379118dbb95c6cdc6d60af50e9867177 \ No newline at end of file +f167bba446b78dd7538d0b2bae3e6678f3b1ba28 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 56a62e0c3f..f3933b930a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2208,17 +2208,6 @@ static void sqlite3ExprCodeIN( } #endif /* SQLITE_OMIT_SUBQUERY */ -/* -** Duplicate an 8-byte value -*/ -static char *dup8bytes(Vdbe *v, const char *in){ - char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8); - if( out ){ - memcpy(out, in, 8); - } - return out; -} - #ifndef SQLITE_OMIT_FLOATING_POINT /* ** Generate an instruction that will put the floating point @@ -2231,12 +2220,10 @@ static char *dup8bytes(Vdbe *v, const char *in){ static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ if( ALWAYS(z!=0) ){ double value; - char *zV; sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ if( negateFlag ) value = -value; - zV = dup8bytes(v, (char*)&value); - sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL); + sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL); } } #endif @@ -2262,10 +2249,8 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ assert( z!=0 ); c = sqlite3DecOrHexToI64(z, &value); if( c==0 || (c==2 && negFlag) ){ - char *zV; if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } - zV = dup8bytes(v, (char*)&value); - sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64); + sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); }else{ #ifdef SQLITE_OMIT_FLOATING_POINT sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); diff --git a/src/vdbe.c b/src/vdbe.c index 962d6fc3e3..d3fb3cb2d7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3511,6 +3511,26 @@ case OP_Close: { break; } +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK +/* Opcode: ColumnsUsed P1 * * P4 * +** +** This opcode (which only exists if SQLite was compiled with +** SQLITE_ENABLE_COLUMN_USED_MASK) identifies which columns of the +** table or index for cursor P1 are used. P4 is a 64-bit integer +** (P4_INT64) in which the first 63 bits are one for each of the +** first 63 columns of the table or index that are actually used +** by the cursor. The high-order bit is set if any column after +** the 64th is used. +*/ +case OP_ColumnsUsed: { + VdbeCursor *pC; + pC = p->apCsr[pOp->p1]; + assert( pC->pCursor ); + pC->maskUsed = *(u64*)pOp->p4.pI64; + break; +} +#endif + /* Opcode: SeekGE P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** diff --git a/src/vdbe.h b/src/vdbe.h index bb597b68d7..da1410282a 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -169,6 +169,7 @@ int sqlite3VdbeAddOp1(Vdbe*,int,int); int sqlite3VdbeAddOp2(Vdbe*,int,int,int); int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); +int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int); int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno); void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index bb32bddc29..7ebd41d6ea 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -83,6 +83,9 @@ struct VdbeCursor { i64 seqCount; /* Sequence counter */ i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + u64 maskUsed; /* Mask of columns used by this cursor */ +#endif /* Cached information about the header for the data record that the ** cursor is currently pointing to. Only valid if cacheStatus matches diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4c736fb33f..fc667ed47d 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -233,6 +233,23 @@ int sqlite3VdbeAddOp4( return addr; } +/* +** Add an opcode that includes the p4 value with a P4_INT64 type. +*/ +int sqlite3VdbeAddOp4Dup8( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + const u8 *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + char *p4copy = sqlite3DbMallocRaw(sqlite3VdbeDb(p), 8); + if( p4copy ) memcpy(p4copy, zP4, 8); + return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type); +} + /* ** Add an OP_ParseSchema opcode. This routine is broken out from ** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees diff --git a/src/where.c b/src/where.c index 2dc3b17754..744448b01b 100644 --- a/src/where.c +++ b/src/where.c @@ -6871,6 +6871,10 @@ WhereInfo *sqlite3WhereBegin( SQLITE_INT_TO_PTR(n), P4_INT32); assert( n<=pTab->nCol ); } +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0, + (const u8*)&pTabItem->colUsed, P4_INT64); +#endif }else{ sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); } @@ -6916,6 +6920,21 @@ WhereInfo *sqlite3WhereBegin( sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */ } VdbeComment((v, "%s", pIx->zName)); +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + { + u64 colUsed = 0; + int ii, jj; + for(ii=0; iinColumn; ii++){ + jj = pIx->aiColumn[ii]; + if( jj<0 ) continue; + if( jj>63 ) jj = 63; + if( (pTabItem->colUsed & MASKBIT(jj))==0 ) continue; + colUsed |= ((u64)1)<<(ii<63 ? ii : 63); + } + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, iIndexCur, 0, 0, + (u8*)&colUsed, P4_INT64); + } +#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */ } } if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); From bc8edba10a19a477022353fc34766a3390c8c31d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Jun 2015 20:27:26 +0000 Subject: [PATCH 05/49] Provide one final Select tree dump prior to WHERE clause analysis when ".selecttrace 0x400" tracing bit is set with SELECTTRACE_ENABLED. Analysis and debug changes only - normal builds are unaffected. FossilOrigin-Name: 283bf0b64da7acc5aa5812fc659954965002d409 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 11 +++++++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index eb67a9af5b..4d3f877745 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sname\sof\sSrcList.a[].zIndex\sto\sthe\smore\sdescriptive\nSrcList.a[0].zIndexedBy. -D 2015-06-04T12:08:53.261 +C Provide\sone\sfinal\sSelect\stree\sdump\sprior\sto\sWHERE\sclause\sanalysis\s\nwhen\s".selecttrace\s0x400"\stracing\sbit\sis\sset\swith\sSELECTTRACE_ENABLED.\nAnalysis\sand\sdebug\schanges\sonly\s-\snormal\sbuilds\sare\sunaffected. +D 2015-06-05T20:27:26.103 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -250,7 +250,7 @@ F src/printf.c 13ce37e5574f9b0682fa86dbcf9faf76b9d82a15 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 36416c13e4a156fa7e8f29181e28964612767ddf +F src/select.c b2dfbc9ca9e4d04a34c1b4defdfda7867fee0eb8 F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1282,7 +1282,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9f035c45a4b84203e67b6e1b23cf11691dc43f1e -R ad5ce5f5b8d17995393297d9ed2a0d0e +P 6a9cf063379118dbb95c6cdc6d60af50e9867177 +R 7720d4f64678b0c7b4af503d2d9c054f U drh -Z de80e81db21512cdc452bca7645bb7ca +Z 95e994f89cb6168fd34736cd7cbf5b60 diff --git a/manifest.uuid b/manifest.uuid index e2792cff66..c711a8d149 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6a9cf063379118dbb95c6cdc6d60af50e9867177 \ No newline at end of file +283bf0b64da7acc5aa5812fc659954965002d409 \ No newline at end of file diff --git a/src/select.c b/src/select.c index d50ff7965e..a3e92655b1 100644 --- a/src/select.c +++ b/src/select.c @@ -3709,7 +3709,7 @@ static int flattenSubquery( #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x100 ){ - sqlite3DebugPrintf("After flattening:\n"); + SELECTTRACE(0x100,pParse,p,("After flattening:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -4889,7 +4889,7 @@ int sqlite3Select( ){ #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x100 ){ - sqlite3DebugPrintf("After WHERE-clause push-down:\n"); + SELECTTRACE(0x100,pParse,p,("After WHERE-clause push-down:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -4964,6 +4964,13 @@ int sqlite3Select( pHaving = p->pHaving; sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + #ifndef SQLITE_OMIT_COMPOUND_SELECT /* If there is are a sequence of queries, do the earlier ones first. */ From 4490c40b90039ea48db8c88c81234787ec0ab0ba Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Jun 2015 22:33:39 +0000 Subject: [PATCH 06/49] Split FROM-clause subquery flattening and code generation into separate loops. FossilOrigin-Name: be8e3fc70e4c13b28b07985df3457960f58ffddd --- manifest | 17 +++-- manifest.uuid | 2 +- src/expr.c | 8 --- src/select.c | 188 +++++++++++++++++++++++++++----------------------- 4 files changed, 111 insertions(+), 104 deletions(-) diff --git a/manifest b/manifest index 4d3f877745..d868635d2e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\sone\sfinal\sSelect\stree\sdump\sprior\sto\sWHERE\sclause\sanalysis\s\nwhen\s".selecttrace\s0x400"\stracing\sbit\sis\sset\swith\sSELECTTRACE_ENABLED.\nAnalysis\sand\sdebug\schanges\sonly\s-\snormal\sbuilds\sare\sunaffected. -D 2015-06-05T20:27:26.103 +C Split\sFROM-clause\ssubquery\sflattening\sand\scode\sgeneration\sinto\sseparate\sloops. +D 2015-06-05T22:33:39.408 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -202,7 +202,7 @@ F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e -F src/expr.c d953b9f03c3c0f701f87a418fcfb9cba8befc6e0 +F src/expr.c 12e04f322956076b1f8748ca572568968f8155d9 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c9b63a217d86582c22121699a47f22f524608869 F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6 @@ -250,7 +250,7 @@ F src/printf.c 13ce37e5574f9b0682fa86dbcf9faf76b9d82a15 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c b2dfbc9ca9e4d04a34c1b4defdfda7867fee0eb8 +F src/select.c 6a8f2c442dc69ff343411788e5146b45ddb87609 F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1282,7 +1282,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6a9cf063379118dbb95c6cdc6d60af50e9867177 -R 7720d4f64678b0c7b4af503d2d9c054f +P 283bf0b64da7acc5aa5812fc659954965002d409 +R 7215f59414fcbc308f2938a5f5f79857 +T *branch * view-optimization +T *sym-view-optimization * +T -sym-trunk * U drh -Z 95e994f89cb6168fd34736cd7cbf5b60 +Z b4c3a234d5928895ab25f2763d32a4ad diff --git a/manifest.uuid b/manifest.uuid index c711a8d149..39d8550257 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -283bf0b64da7acc5aa5812fc659954965002d409 \ No newline at end of file +be8e3fc70e4c13b28b07985df3457960f58ffddd \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 56a62e0c3f..d62346e39d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3559,14 +3559,6 @@ void sqlite3TreeViewExprList( sqlite3TreeViewLine(pView, "%s", zLabel); for(i=0; inExpr; i++){ sqlite3TreeViewExpr(pView, pList->a[i].pExpr, inExpr-1); -#if 0 - if( pList->a[i].zName ){ - sqlite3ExplainPrintf(pOut, " AS %s", pList->a[i].zName); - } - if( pList->a[i].bSpanIsTab ){ - sqlite3ExplainPrintf(pOut, " (%s)", pList->a[i].zSpan); - } -#endif } } sqlite3TreeViewPop(pView); diff --git a/src/select.c b/src/select.c index a3e92655b1..2341e84509 100644 --- a/src/select.c +++ b/src/select.c @@ -4842,14 +4842,54 @@ int sqlite3Select( } #endif - /* Generate code for all sub-queries in the FROM clause + /* Try to flatten subqueries in the FROM clause into the main query */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) for(i=0; !p->pPrior && inSrc; i++){ struct SrcList_item *pItem = &pTabList->a[i]; - SelectDest dest; Select *pSub = pItem->pSelect; int isAggSub; + if( pSub==0 ) continue; + isAggSub = (pSub->selFlags & SF_Aggregate)!=0; + if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){ + /* This subquery can be absorbed into its parent. */ + if( isAggSub ){ + isAgg = 1; + p->selFlags |= SF_Aggregate; + } + i = -1; + } + pTabList = p->pSrc; + if( db->mallocFailed ) goto select_end; + if( !IgnorableOrderby(pDest) ){ + sSort.pOrderBy = p->pOrderBy; + } + } +#endif + + +#ifndef SQLITE_OMIT_COMPOUND_SELECT + /* Handle compound SELECT statements using the separate multiSelect() + ** procedure. + */ + if( p->pPrior ){ + rc = multiSelect(pParse, p, pDest); + explainSetInteger(pParse->iSelectId, iRestoreSelectId); +#if SELECTTRACE_ENABLED + SELECTTRACE(1,pParse,p,("end compound-select processing\n")); + pParse->nSelectIndent--; +#endif + return rc; + } +#endif + + /* Generate code for all sub-queries in the FROM clause + */ +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + for(i=0; inSrc; i++){ + struct SrcList_item *pItem = &pTabList->a[i]; + SelectDest dest; + Select *pSub = pItem->pSelect; if( pSub==0 ) continue; @@ -4875,87 +4915,73 @@ int sqlite3Select( */ pParse->nHeight += sqlite3SelectExprHeight(p); - isAggSub = (pSub->selFlags & SF_Aggregate)!=0; - if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){ - /* This subquery can be absorbed into its parent. */ - if( isAggSub ){ - isAgg = 1; - p->selFlags |= SF_Aggregate; - } - i = -1; - }else{ - if( (pItem->jointype & JT_OUTER)==0 - && pushDownWhereTerms(db, pSub, p->pWhere, pItem->iCursor) - ){ + if( (pItem->jointype & JT_OUTER)==0 + && pushDownWhereTerms(db, pSub, p->pWhere, pItem->iCursor) + ){ #if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x100 ){ - SELECTTRACE(0x100,pParse,p,("After WHERE-clause push-down:\n")); - sqlite3TreeViewSelect(0, p, 0); - } + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After WHERE-clause push-down:\n")); + sqlite3TreeViewSelect(0, p, 0); + } #endif - } - if( pTabList->nSrc==1 - && (p->selFlags & SF_All)==0 - && OptimizationEnabled(db, SQLITE_SubqCoroutine) - ){ - /* Implement a co-routine that will return a single row of the result - ** set on each invocation. - */ - int addrTop = sqlite3VdbeCurrentAddr(v)+1; - pItem->regReturn = ++pParse->nMem; - sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); - VdbeComment((v, "%s", pItem->pTab->zName)); - pItem->addrFillSub = addrTop; - sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); - explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); - sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); - pItem->viaCoroutine = 1; - pItem->regResult = dest.iSdst; - sqlite3VdbeAddOp1(v, OP_EndCoroutine, pItem->regReturn); - sqlite3VdbeJumpHere(v, addrTop-1); - sqlite3ClearTempRegCache(pParse); + } + if( pTabList->nSrc==1 + && (p->selFlags & SF_All)==0 + && OptimizationEnabled(db, SQLITE_SubqCoroutine) + ){ + /* Implement a co-routine that will return a single row of the result + ** set on each invocation. + */ + int addrTop = sqlite3VdbeCurrentAddr(v)+1; + pItem->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); + VdbeComment((v, "%s", pItem->pTab->zName)); + pItem->addrFillSub = addrTop; + sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); + explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); + pItem->viaCoroutine = 1; + pItem->regResult = dest.iSdst; + sqlite3VdbeAddOp1(v, OP_EndCoroutine, pItem->regReturn); + sqlite3VdbeJumpHere(v, addrTop-1); + sqlite3ClearTempRegCache(pParse); + }else{ + /* Generate a subroutine that will fill an ephemeral table with + ** the content of this subquery. pItem->addrFillSub will point + ** to the address of the generated subroutine. pItem->regReturn + ** is a register allocated to hold the subroutine return address + */ + int topAddr; + int onceAddr = 0; + int retAddr; + assert( pItem->addrFillSub==0 ); + pItem->regReturn = ++pParse->nMem; + topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + pItem->addrFillSub = topAddr+1; + if( pItem->isCorrelated==0 ){ + /* If the subquery is not correlated and if we are not inside of + ** a trigger, then we only need to compute the value of the subquery + ** once. */ + onceAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); + VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); }else{ - /* Generate a subroutine that will fill an ephemeral table with - ** the content of this subquery. pItem->addrFillSub will point - ** to the address of the generated subroutine. pItem->regReturn - ** is a register allocated to hold the subroutine return address - */ - int topAddr; - int onceAddr = 0; - int retAddr; - assert( pItem->addrFillSub==0 ); - pItem->regReturn = ++pParse->nMem; - topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); - pItem->addrFillSub = topAddr+1; - if( pItem->isCorrelated==0 ){ - /* If the subquery is not correlated and if we are not inside of - ** a trigger, then we only need to compute the value of the subquery - ** once. */ - onceAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); - VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); - }else{ - VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); - } - sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); - explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); - sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); - if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); - retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); - VdbeComment((v, "end %s", pItem->pTab->zName)); - sqlite3VdbeChangeP1(v, topAddr, retAddr); - sqlite3ClearTempRegCache(pParse); + VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); } + sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); + explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); + sqlite3Select(pParse, pSub, &dest); + pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); + if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); + retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); + VdbeComment((v, "end %s", pItem->pTab->zName)); + sqlite3VdbeChangeP1(v, topAddr, retAddr); + sqlite3ClearTempRegCache(pParse); } if( db->mallocFailed ){ goto select_end; } pParse->nHeight -= sqlite3SelectExprHeight(p); - pTabList = p->pSrc; - if( !IgnorableOrderby(pDest) ){ - sSort.pOrderBy = p->pOrderBy; - } } pEList = p->pEList; #endif @@ -4971,20 +4997,6 @@ int sqlite3Select( } #endif -#ifndef SQLITE_OMIT_COMPOUND_SELECT - /* If there is are a sequence of queries, do the earlier ones first. - */ - if( p->pPrior ){ - rc = multiSelect(pParse, p, pDest); - explainSetInteger(pParse->iSelectId, iRestoreSelectId); -#if SELECTTRACE_ENABLED - SELECTTRACE(1,pParse,p,("end compound-select processing\n")); - pParse->nSelectIndent--; -#endif - return rc; - } -#endif - /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and ** if the select-list is the same as the ORDER BY list, then this query ** can be rewritten as a GROUP BY. In other words, this: From adc57f6834167cd55e8c4d1129cf2c32ee3cfde0 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 6 Jun 2015 00:18:01 +0000 Subject: [PATCH 07/49] Minor cleanup of the sqlite3Select() procedure. FossilOrigin-Name: f4c90d06bb941453d8110680c7b279e471e8f034 --- manifest | 15 ++++++-------- manifest.uuid | 2 +- src/select.c | 54 ++++++++++++++++++++++++++------------------------- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/manifest b/manifest index d868635d2e..26d43362ba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Split\sFROM-clause\ssubquery\sflattening\sand\scode\sgeneration\sinto\sseparate\sloops. -D 2015-06-05T22:33:39.408 +C Minor\scleanup\sof\sthe\ssqlite3Select()\sprocedure. +D 2015-06-06T00:18:01.663 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -250,7 +250,7 @@ F src/printf.c 13ce37e5574f9b0682fa86dbcf9faf76b9d82a15 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 6a8f2c442dc69ff343411788e5146b45ddb87609 +F src/select.c 630623e6536115ec360e07be3cb5e01fab9166f9 F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1282,10 +1282,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 283bf0b64da7acc5aa5812fc659954965002d409 -R 7215f59414fcbc308f2938a5f5f79857 -T *branch * view-optimization -T *sym-view-optimization * -T -sym-trunk * +P be8e3fc70e4c13b28b07985df3457960f58ffddd +R c9ba4b66998c994d5a4d88f3868eca18 U drh -Z b4c3a234d5928895ab25f2763d32a4ad +Z f5a7ad6c64c16a42ea0d51c96b63ee57 diff --git a/manifest.uuid b/manifest.uuid index 39d8550257..e0f55059d7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -be8e3fc70e4c13b28b07985df3457960f58ffddd \ No newline at end of file +f4c90d06bb941453d8110680c7b279e471e8f034 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 2341e84509..9dd34dc567 100644 --- a/src/select.c +++ b/src/select.c @@ -4814,12 +4814,11 @@ int sqlite3Select( memset(&sSort, 0, sizeof(sSort)); sSort.pOrderBy = p->pOrderBy; pTabList = p->pSrc; - pEList = p->pEList; if( pParse->nErr || db->mallocFailed ){ goto select_end; } + assert( p->pEList!=0 ); isAgg = (p->selFlags & SF_Aggregate)!=0; - assert( pEList!=0 ); #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x100 ){ SELECTTRACE(0x100,pParse,p, ("after name resolution:\n")); @@ -4828,21 +4827,16 @@ int sqlite3Select( #endif - /* Begin generating code. - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ) goto select_end; - /* If writing to memory or generating a set ** only a single column may be output. */ #ifndef SQLITE_OMIT_SUBQUERY - if( checkForMultiColumnSelectError(pParse, pDest, pEList->nExpr) ){ + if( checkForMultiColumnSelectError(pParse, pDest, p->pEList->nExpr) ){ goto select_end; } #endif - /* Try to flatten subqueries in the FROM clause into the main query + /* Try to flatten subqueries in the FROM clause up into the main query */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) for(i=0; !p->pPrior && inSrc; i++){ @@ -4867,6 +4861,10 @@ int sqlite3Select( } #endif + /* Get a pointer the VDBE under construction, allocating a new VDBE if one + ** does not already exist */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto select_end; #ifndef SQLITE_OMIT_COMPOUND_SELECT /* Handle compound SELECT statements using the separate multiSelect() @@ -4890,7 +4888,6 @@ int sqlite3Select( struct SrcList_item *pItem = &pTabList->a[i]; SelectDest dest; Select *pSub = pItem->pSelect; - if( pSub==0 ) continue; /* Sometimes the code for a subquery will be generated more than @@ -4915,6 +4912,9 @@ int sqlite3Select( */ pParse->nHeight += sqlite3SelectExprHeight(p); + /* Make copies of constant WHERE-clause terms in the outer query down + ** inside the subquery. This can help the subquery to run more efficiently. + */ if( (pItem->jointype & JT_OUTER)==0 && pushDownWhereTerms(db, pSub, p->pWhere, pItem->iCursor) ){ @@ -4925,6 +4925,9 @@ int sqlite3Select( } #endif } + + /* Generate code to implement the subquery + */ if( pTabList->nSrc==1 && (p->selFlags & SF_All)==0 && OptimizationEnabled(db, SQLITE_SubqCoroutine) @@ -4978,13 +4981,13 @@ int sqlite3Select( sqlite3VdbeChangeP1(v, topAddr, retAddr); sqlite3ClearTempRegCache(pParse); } - if( db->mallocFailed ){ - goto select_end; - } + if( db->mallocFailed ) goto select_end; pParse->nHeight -= sqlite3SelectExprHeight(p); } - pEList = p->pEList; #endif + + /* Various elements of the SELECT copied into local variables for convenience */ + pEList = p->pEList; pWhere = p->pWhere; pGroupBy = p->pGroupBy; pHaving = p->pHaving; @@ -5013,23 +5016,23 @@ int sqlite3Select( ** BY and DISTINCT, and an index or separate temp-table for the other. */ if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct - && sqlite3ExprListCompare(sSort.pOrderBy, p->pEList, -1)==0 + && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 ){ p->selFlags &= ~SF_Distinct; - p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0); - pGroupBy = p->pGroupBy; + pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0); /* Notice that even thought SF_Distinct has been cleared from p->selFlags, ** the sDistinct.isTnct is still set. Hence, isTnct represents the ** original setting of the SF_Distinct flag, not the current setting */ assert( sDistinct.isTnct ); } - /* If there is an ORDER BY clause, then this sorting - ** index might end up being unused if the data can be - ** extracted in pre-sorted order. If that is the case, then the - ** OP_OpenEphemeral instruction will be changed to an OP_Noop once - ** we figure out that the sorting index is not needed. The addrSortIndex - ** variable is used to facilitate that change. + /* If there is an ORDER BY clause, then create an ephemeral index to + ** do the sorting. But this sorting ephemeral index might end up + ** being unused if the data can be extracted in pre-sorted order. + ** If that is the case, then the OP_OpenEphemeral instruction will be + ** changed to an OP_Noop once we figure out that the sorting index is + ** not needed. The sSort.addrSortIndex variable is used to facilitate + ** that change. */ if( sSort.pOrderBy ){ KeyInfo *pKeyInfo; @@ -5060,7 +5063,7 @@ int sqlite3Select( sSort.sortFlags |= SORTFLAG_UseSorter; } - /* Open a virtual index to use for the distinct set. + /* Open an ephemeral index to use for the distinct set. */ if( p->selFlags & SF_Distinct ){ sDistinct.tabTnct = pParse->nTab++; @@ -5145,11 +5148,10 @@ int sqlite3Select( p->nSelectRow = 1; } - /* If there is both a GROUP BY and an ORDER BY clause and they are ** identical, then it may be possible to disable the ORDER BY clause ** on the grounds that the GROUP BY will cause elements to come out - ** in the correct order. It also may not - the GROUP BY may use a + ** in the correct order. It also may not - the GROUP BY might use a ** database index that causes rows to be grouped together as required ** but not actually sorted. Either way, record the fact that the ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp From b121dd14ac5a2675f439b72700fd8f9162510fc9 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 6 Jun 2015 18:30:17 +0000 Subject: [PATCH 08/49] Code simplifications in select.c and where.c. FossilOrigin-Name: 4f20ac90bce8bd7ba43ef59af5cc4ef7aa282fe8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 21 ++++++++++----------- src/where.c | 51 +++++++++++++++++++++++---------------------------- 4 files changed, 41 insertions(+), 47 deletions(-) diff --git a/manifest b/manifest index 26d43362ba..056725afea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\scleanup\sof\sthe\ssqlite3Select()\sprocedure. -D 2015-06-06T00:18:01.663 +C Code\ssimplifications\sin\sselect.c\sand\swhere.c. +D 2015-06-06T18:30:17.822 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -250,7 +250,7 @@ F src/printf.c 13ce37e5574f9b0682fa86dbcf9faf76b9d82a15 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 630623e6536115ec360e07be3cb5e01fab9166f9 +F src/select.c d507fe715b12e6aba157fa34b0a5680809e59bac F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -326,7 +326,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c 2db8137f14644e2117c2e2350e08a05e02d6bdab +F src/where.c 5cc416ad6d8b6d2027735fcf7c5a6165bb745636 F src/whereInt.h a6f5a762bc1b4b1c76e1cea79976b437ac35a435 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1282,7 +1282,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P be8e3fc70e4c13b28b07985df3457960f58ffddd -R c9ba4b66998c994d5a4d88f3868eca18 +P f4c90d06bb941453d8110680c7b279e471e8f034 +R 042f84cf941d82ab55744b287e51eff7 U drh -Z f5a7ad6c64c16a42ea0d51c96b63ee57 +Z f6bc4d318934fdab6d55b7066c6ff342 diff --git a/manifest.uuid b/manifest.uuid index e0f55059d7..c2c5ef4ae1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f4c90d06bb941453d8110680c7b279e471e8f034 \ No newline at end of file +4f20ac90bce8bd7ba43ef59af5cc4ef7aa282fe8 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 9dd34dc567..f801d1033a 100644 --- a/src/select.c +++ b/src/select.c @@ -1310,28 +1310,27 @@ static void generateSortTail( */ #ifdef SQLITE_ENABLE_COLUMN_METADATA # define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,C,D,E,F) +#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */ +# define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,F) +#endif static const char *columnTypeImpl( NameContext *pNC, Expr *pExpr, +#ifdef SQLITE_ENABLE_COLUMN_METADATA const char **pzOrigDb, const char **pzOrigTab, const char **pzOrigCol, +#endif u8 *pEstWidth ){ - char const *zOrigDb = 0; - char const *zOrigTab = 0; - char const *zOrigCol = 0; -#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */ -# define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,F) -static const char *columnTypeImpl( - NameContext *pNC, - Expr *pExpr, - u8 *pEstWidth -){ -#endif /* !defined(SQLITE_ENABLE_COLUMN_METADATA) */ char const *zType = 0; int j; u8 estWidth = 1; +#ifdef SQLITE_ENABLE_COLUMN_METADATA + char const *zOrigDb = 0; + char const *zOrigTab = 0; + char const *zOrigCol = 0; +#endif if( NEVER(pExpr==0) || pNC->pSrcList==0 ) return 0; switch( pExpr->op ){ diff --git a/src/where.c b/src/where.c index 2dc3b17754..f98616f9fc 100644 --- a/src/where.c +++ b/src/where.c @@ -616,6 +616,11 @@ static void exprAnalyze(SrcList*, WhereClause*, int); /* ** Call exprAnalyze on all terms in a WHERE clause. +** +** Note that exprAnalyze() might add new virtual terms onto the +** end of the WHERE clause. We do not want to analyze these new +** virtual terms, so start analyzing at the end and work forward +** so that the added virtual terms are never processed. */ static void exprAnalyzeAll( SrcList *pTabList, /* the FROM clause */ @@ -891,7 +896,7 @@ static void whereCombineDisjuncts( ** ** CASE 2: ** -** If there are exactly two disjuncts one side has x>A and the other side +** If there are exactly two disjuncts and one side has x>A and the other side ** has x=A (for the same x and A) then add a new virtual conjunct term to the ** WHERE clause of the form "x>=A". Example: ** @@ -920,22 +925,22 @@ static void whereCombineDisjuncts( ** is decided elsewhere. This analysis only looks at whether subterms ** appropriate for indexing exist. ** -** All examples A through E above satisfy case 2. But if a term +** All examples A through E above satisfy case 3. But if a term ** also satisfies case 1 (such as B) we know that the optimizer will -** always prefer case 1, so in that case we pretend that case 2 is not +** always prefer case 1, so in that case we pretend that case 3 is not ** satisfied. ** ** It might be the case that multiple tables are indexable. For example, ** (E) above is indexable on tables P, Q, and R. ** -** Terms that satisfy case 2 are candidates for lookup by using +** Terms that satisfy case 3 are candidates for lookup by using ** separate indices to find rowids for each subterm and composing ** the union of all rowids using a RowSet object. This is similar ** to "bitmap indices" in other database engines. ** ** OTHERWISE: ** -** If neither case 1 nor case 2 apply, then leave the eOperator set to +** If none of cases 1, 2, or 3 apply, then leave the eOperator set to ** zero. This term is not useful for search. */ static void exprAnalyzeOrTerm( @@ -973,7 +978,7 @@ static void exprAnalyzeOrTerm( assert( pOrWc->nTerm>=2 ); /* - ** Compute the set of tables that might satisfy cases 1 or 2. + ** Compute the set of tables that might satisfy cases 1 or 3. */ indexable = ~(Bitmask)0; chngToIN = ~(Bitmask)0; @@ -1188,7 +1193,7 @@ static void exprAnalyzeOrTerm( ** relation: ** 1. The SQLITE_Transitive optimization must be enabled ** 2. Must be either an == or an IS operator -** 3. Not originating the ON clause of an OUTER JOIN +** 3. Not originating in the ON clause of an OUTER JOIN ** 4. The affinities of A and B must be compatible ** 5a. Both operands use the same collating sequence OR ** 5b. The overall collating sequence is BINARY @@ -1589,8 +1594,8 @@ static int findIndexCol( ** Return true if the DISTINCT expression-list passed as the third argument ** is redundant. ** -** A DISTINCT list is redundant if the database contains some subset of -** columns that are unique and non-null. +** A DISTINCT list is redundant if any subset of the columns in the +** DISTINCT list are collectively unique and individually non-null. */ static int isDistinctRedundant( Parse *pParse, /* Parsing context */ @@ -6689,15 +6694,9 @@ WhereInfo *sqlite3WhereBegin( } #endif - /* Analyze all of the subexpressions. Note that exprAnalyze() might - ** add new virtual terms onto the end of the WHERE clause. We do not - ** want to analyze these virtual terms, so start analyzing at the end - ** and work forward so that the added virtual terms are never processed. - */ + /* Analyze all of the subexpressions. */ exprAnalyzeAll(pTabList, &pWInfo->sWC); - if( db->mallocFailed ){ - goto whereBeginError; - } + if( db->mallocFailed ) goto whereBeginError; if( wctrlFlags & WHERE_WANT_DISTINCT ){ if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ @@ -6713,8 +6712,7 @@ WhereInfo *sqlite3WhereBegin( /* Construct the WhereLoop objects */ WHERETRACE(0xffff,("*** Optimizer Start ***\n")); #if defined(WHERETRACE_ENABLED) - /* Display all terms of the WHERE clause */ - if( sqlite3WhereTrace & 0x100 ){ + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ int i; for(i=0; inTerm; i++){ whereTermPrint(&sWLB.pWC->a[i], i); @@ -6726,13 +6724,12 @@ WhereInfo *sqlite3WhereBegin( rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; - /* Display all of the WhereLoop objects if wheretrace is enabled */ -#ifdef WHERETRACE_ENABLED /* !=0 */ - if( sqlite3WhereTrace ){ +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ /* Display all of the WhereLoop objects */ WhereLoop *p; int i; - static char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" - "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; + static const char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" + "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%sizeof(zLabel)]; whereLoopPrint(p, sWLB.pWC); @@ -6753,7 +6750,7 @@ WhereInfo *sqlite3WhereBegin( if( pParse->nErr || NEVER(db->mallocFailed) ){ goto whereBeginError; } -#ifdef WHERETRACE_ENABLED /* !=0 */ +#ifdef WHERETRACE_ENABLED if( sqlite3WhereTrace ){ sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); if( pWInfo->nOBSat>0 ){ @@ -6816,7 +6813,7 @@ WhereInfo *sqlite3WhereBegin( /* If the caller is an UPDATE or DELETE statement that is requesting ** to use a one-pass algorithm, determine if this is appropriate. ** The one-pass algorithm only works if the WHERE clause constrains - ** the statement to update a single row. + ** the statement to update or delete a single row. */ assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 ); if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 @@ -6830,7 +6827,6 @@ WhereInfo *sqlite3WhereBegin( /* Open all tables in the pTabList and any indices selected for ** searching those tables. */ - notReady = ~(Bitmask)0; for(ii=0, pLevel=pWInfo->a; ii=0 ) sqlite3CodeVerifySchema(pParse, iDb); - notReady &= ~getMask(&pWInfo->sMaskSet, pTabItem->iCursor); } pWInfo->iTop = sqlite3VdbeCurrentAddr(v); if( db->mallocFailed ) goto whereBeginError; From 6f82e85a802742c347275e529202a7fd22cdfcbe Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 6 Jun 2015 20:12:09 +0000 Subject: [PATCH 09/49] Split out the bulk of the actual VDBE code generation logic from where.c into a new file, leaving behind the analysis logic. This makes the original where.c smaller and hopefully easier to edit. FossilOrigin-Name: faa0e420e93a2bc1c84df9eb9fef4748d29ce339 --- Makefile.in | 7 +- Makefile.msc | 7 +- main.mk | 4 +- manifest | 23 +- manifest.uuid | 2 +- src/where.c | 1528 +------------------------------------------ src/whereInt.h | 52 +- src/wherecode.c | 1501 ++++++++++++++++++++++++++++++++++++++++++ tool/mksqlite3c.tcl | 1 + 9 files changed, 1605 insertions(+), 1520 deletions(-) create mode 100644 src/wherecode.c diff --git a/Makefile.in b/Makefile.in index 1d06c40e12..48dba42e63 100644 --- a/Makefile.in +++ b/Makefile.in @@ -184,7 +184,7 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ table.lo threads.lo tokenize.lo trigger.lo \ update.lo util.lo vacuum.lo \ vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ - vdbetrace.lo wal.lo walker.lo where.lo utf.lo vtab.lo + vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo utf.lo vtab.lo # Object files for the amalgamation. # @@ -293,6 +293,7 @@ SRC = \ $(TOP)/src/wal.h \ $(TOP)/src/walker.c \ $(TOP)/src/where.c \ + $(TOP)/src/wherecode.c \ $(TOP)/src/whereInt.h # Source code for extensions @@ -454,6 +455,7 @@ TESTSRC2 = \ $(TOP)/src/vdbemem.c \ $(TOP)/src/vdbetrace.c \ $(TOP)/src/where.c \ + $(TOP)/src/wherecode.c \ parse.c \ $(TOP)/ext/fts3/fts3.c \ $(TOP)/ext/fts3/fts3_aux.c \ @@ -849,6 +851,9 @@ walker.lo: $(TOP)/src/walker.c $(HDR) where.lo: $(TOP)/src/where.c $(HDR) $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/where.c +wherecode.lo: $(TOP)/src/wherecode.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/wherecode.c + tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR) $(LTCOMPILE) -DUSE_TCL_STUBS=1 -c $(TOP)/src/tclsqlite.c diff --git a/Makefile.msc b/Makefile.msc index 642616e935..6cd1f37b81 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -838,7 +838,7 @@ LIBOBJS0 = vdbe.lo parse.lo alter.lo analyze.lo attach.lo auth.lo \ table.lo threads.lo tokenize.lo trigger.lo \ update.lo util.lo vacuum.lo \ vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ - vdbetrace.lo wal.lo walker.lo where.lo utf.lo vtab.lo + vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo utf.lo vtab.lo # Object files for the amalgamation. # @@ -959,6 +959,7 @@ SRC2 = \ $(TOP)\src\wal.h \ $(TOP)\src\walker.c \ $(TOP)\src\where.c \ + $(TOP)\src\wherecode.c \ $(TOP)\src\whereInt.h # Source code for extensions @@ -1121,6 +1122,7 @@ TESTSRC2 = \ $(TOP)\src\vdbesort.c \ $(TOP)\src\vdbetrace.c \ $(TOP)\src\where.c \ + $(TOP)\src\wherecode.c \ parse.c \ $(TOP)\ext\fts3\fts3.c \ $(TOP)\ext\fts3\fts3_aux.c \ @@ -1530,6 +1532,9 @@ walker.lo: $(TOP)\src\walker.c $(HDR) where.lo: $(TOP)\src\where.c $(HDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\where.c +wherecode.lo: $(TOP)\src\wherecode.c $(HDR) + $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\wherecode.c + tclsqlite.lo: $(TOP)\src\tclsqlite.c $(HDR) $(LTCOMPILE) $(NO_WARN) -DUSE_TCL_STUBS=1 -DBUILD_sqlite -I$(TCLINCDIR) -c $(TOP)\src\tclsqlite.c diff --git a/main.mk b/main.mk index 49f78c3ad4..71ce38ad32 100644 --- a/main.mk +++ b/main.mk @@ -69,7 +69,7 @@ LIBOBJ+= vdbe.o parse.o \ table.o threads.o tokenize.o trigger.o \ update.o userauth.o util.o vacuum.o \ vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o vdbesort.o \ - vdbetrace.o wal.o walker.o where.o utf.o vtab.o + vdbetrace.o wal.o walker.o where.o wherecode.o utf.o vtab.o @@ -171,6 +171,7 @@ SRC = \ $(TOP)/src/wal.h \ $(TOP)/src/walker.c \ $(TOP)/src/where.c \ + $(TOP)/src/wherecode.c \ $(TOP)/src/whereInt.h # Source code for extensions @@ -337,6 +338,7 @@ TESTSRC2 = \ $(TOP)/src/vdbe.c \ $(TOP)/src/vdbemem.c \ $(TOP)/src/where.c \ + $(TOP)/src/wherecode.c \ parse.c \ $(TOP)/ext/fts3/fts3.c \ $(TOP)/ext/fts3/fts3_aux.c \ diff --git a/manifest b/manifest index 056725afea..e7b9ade388 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Code\ssimplifications\sin\sselect.c\sand\swhere.c. -D 2015-06-06T18:30:17.822 +C Split\sout\sthe\sbulk\sof\sthe\sactual\sVDBE\scode\sgeneration\slogic\sfrom\swhere.c\ninto\sa\snew\sfile,\sleaving\sbehind\sthe\sanalysis\slogic.\s\sThis\smakes\sthe\soriginal\nwhere.c\ssmaller\sand\shopefully\seasier\sto\sedit. +D 2015-06-06T20:12:09.183 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964 +F Makefile.in 64136f59edd49b389b5c5d24388e204929b807e5 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc d37d2c2323df3acae6e24c71a478889421c17264 +F Makefile.msc e2f1f95dc4a0af0b9ac3c2ee66878700b71ad93f F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ce0ae95abd7121c534f6917c1c8f2b70d9acd4db @@ -171,7 +171,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 8d418497da6a152a59b00d64ae3d66f3c665974c +F main.mk b9e0c806c04739b20f281680f8771bc2e20acd54 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk d5e22023b5238985bb54a72d33e0ac71fe4f8a32 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -326,8 +326,9 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c 5cc416ad6d8b6d2027735fcf7c5a6165bb745636 -F src/whereInt.h a6f5a762bc1b4b1c76e1cea79976b437ac35a435 +F src/where.c c9d804dcf02388207096e4da19487d9a2a7a9a67 +F src/whereInt.h 40e1d060b6aa02edbb7b8a1f3dfc0cc4ff140881 +F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 @@ -1247,7 +1248,7 @@ F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 40c287d3f929ece67da6e9e7c49885789960accf F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 69bae8ce4aa52d2ff82d4a8a856bf283ec035b2e -F tool/mksqlite3c.tcl fdeab4c1eed90b7ab741ec12a7bc5c2fb60188bd +F tool/mksqlite3c.tcl 9f60238b2273048a4089077a43716d3b33a67c51 F tool/mksqlite3h.tcl 44730d586c9031638cdd2eb443b801c0d2dbd9f8 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl 3b58b9398f91c7dbf18d49eb87cefeee9efdbce1 @@ -1282,7 +1283,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f4c90d06bb941453d8110680c7b279e471e8f034 -R 042f84cf941d82ab55744b287e51eff7 +P 4f20ac90bce8bd7ba43ef59af5cc4ef7aa282fe8 +R f7b66d3e1070ad2d563a494aba699c70 U drh -Z f6bc4d318934fdab6d55b7066c6ff342 +Z 85351aea272e066665037522f98406f9 diff --git a/manifest.uuid b/manifest.uuid index c2c5ef4ae1..a3541920e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f20ac90bce8bd7ba43ef59af5cc4ef7aa282fe8 \ No newline at end of file +faa0e420e93a2bc1c84df9eb9fef4748d29ce339 \ No newline at end of file diff --git a/src/where.c b/src/where.c index f98616f9fc..e446f6db8c 100644 --- a/src/where.c +++ b/src/where.c @@ -19,6 +19,15 @@ #include "sqliteInt.h" #include "whereInt.h" +/* Forward declaration of methods */ +static int whereLoopResize(sqlite3*, WhereLoop*, int); + +/* Test variable that can be set to enable WHERE tracing */ +#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) +/***/ int sqlite3WhereTrace = 0; +#endif + + /* ** Return the estimated number of output rows from a WHERE clause */ @@ -275,7 +284,7 @@ static void whereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ ** Return the bitmask for the given cursor number. Return 0 if ** iCursor is not in the set. */ -static Bitmask getMask(WhereMaskSet *pMaskSet, int iCursor){ +Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ int i; assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); for(i=0; in; i++){ @@ -310,7 +319,7 @@ static Bitmask exprTableUsage(WhereMaskSet *pMaskSet, Expr *p){ Bitmask mask = 0; if( p==0 ) return 0; if( p->op==TK_COLUMN ){ - mask = getMask(pMaskSet, p->iTable); + mask = sqlite3WhereGetMask(pMaskSet, p->iTable); return mask; } mask = exprTableUsage(pMaskSet, p->pRight); @@ -584,7 +593,7 @@ static WhereTerm *whereScanInit( ** the form "X " exist. If no terms with a constant RHS ** exist, try to return a term that does not use WO_EQUIV. */ -static WhereTerm *findTerm( +WhereTerm *sqlite3WhereFindTerm( WhereClause *pWC, /* The WHERE clause to be searched */ int iCur, /* Cursor number of LHS */ int iColumn, /* Column number of LHS */ @@ -1006,7 +1015,7 @@ static void exprAnalyzeOrTerm( for(j=0, pAndTerm=pAndWC->a; jnTerm; j++, pAndTerm++){ assert( pAndTerm->pExpr ); if( allowedOp(pAndTerm->pExpr->op) ){ - b |= getMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); } } } @@ -1017,10 +1026,10 @@ static void exprAnalyzeOrTerm( ** corresponding TERM_VIRTUAL term */ }else{ Bitmask b; - b = getMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); + b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); if( pOrTerm->wtFlags & TERM_VIRTUAL ){ WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; - b |= getMask(&pWInfo->sMaskSet, pOther->leftCursor); + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pOther->leftCursor); } indexable &= b; if( (pOrTerm->eOperator & WO_EQ)==0 ){ @@ -1096,7 +1105,7 @@ static void exprAnalyzeOrTerm( assert( j==1 ); continue; } - if( (chngToIN & getMask(&pWInfo->sMaskSet, pOrTerm->leftCursor))==0 ){ + if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor))==0 ){ /* This term must be of the form t1.a==t2.b where t2 is in the ** chngToIN set but t1 is not. This term will be either preceded ** or follwed by an inverted copy (t2.b==t1.a). Skip this term @@ -1115,7 +1124,7 @@ static void exprAnalyzeOrTerm( ** on the second iteration */ assert( j==1 ); assert( IsPowerOfTwo(chngToIN) ); - assert( chngToIN==getMask(&pWInfo->sMaskSet, iCursor) ); + assert( chngToIN==sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor) ); break; } testcase( j==1 ); @@ -1287,7 +1296,7 @@ static void exprAnalyze( } prereqAll = exprTableUsage(pMaskSet, pExpr); if( ExprHasProperty(pExpr, EP_FromJoin) ){ - Bitmask x = getMask(pMaskSet, pExpr->iRightJoinTable); + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); prereqAll |= x; extraRight = x-1; /* ON clause terms may not be used with an index ** on left table of a LEFT JOIN. Ticket #3015 */ @@ -1641,7 +1650,7 @@ static int isDistinctRedundant( if( !IsUniqueIndex(pIdx) ) continue; for(i=0; inKeyCol; i++){ i16 iCol = pIdx->aiColumn[i]; - if( 0==findTerm(pWC, iBase, iCol, ~(Bitmask)0, WO_EQ, pIdx) ){ + if( 0==sqlite3WhereFindTerm(pWC, iBase, iCol, ~(Bitmask)0, WO_EQ, pIdx) ){ int iIdxCol = findIndexCol(pParse, pDistinct, iBase, pIdx, i); if( iIdxCol<0 || pTab->aCol[iCol].notNull==0 ){ break; @@ -2763,1487 +2772,6 @@ static int whereInScanEst( } #endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ -/* -** Disable a term in the WHERE clause. Except, do not disable the term -** if it controls a LEFT OUTER JOIN and it did not originate in the ON -** or USING clause of that join. -** -** Consider the term t2.z='ok' in the following queries: -** -** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok' -** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok' -** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok' -** -** The t2.z='ok' is disabled in the in (2) because it originates -** in the ON clause. The term is disabled in (3) because it is not part -** of a LEFT OUTER JOIN. In (1), the term is not disabled. -** -** Disabling a term causes that term to not be tested in the inner loop -** of the join. Disabling is an optimization. When terms are satisfied -** by indices, we disable them to prevent redundant tests in the inner -** loop. We would get the correct results if nothing were ever disabled, -** but joins might run a little slower. The trick is to disable as much -** as we can without disabling too much. If we disabled in (1), we'd get -** the wrong answer. See ticket #813. -** -** If all the children of a term are disabled, then that term is also -** automatically disabled. In this way, terms get disabled if derived -** virtual terms are tested first. For example: -** -** x GLOB 'abc*' AND x>='abc' AND x<'acd' -** \___________/ \______/ \_____/ -** parent child1 child2 -** -** Only the parent term was in the original WHERE clause. The child1 -** and child2 terms were added by the LIKE optimization. If both of -** the virtual child terms are valid, then testing of the parent can be -** skipped. -** -** Usually the parent term is marked as TERM_CODED. But if the parent -** term was originally TERM_LIKE, then the parent gets TERM_LIKECOND instead. -** The TERM_LIKECOND marking indicates that the term should be coded inside -** a conditional such that is only evaluated on the second pass of a -** LIKE-optimization loop, when scanning BLOBs instead of strings. -*/ -static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ - int nLoop = 0; - while( pTerm - && (pTerm->wtFlags & TERM_CODED)==0 - && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) - && (pLevel->notReady & pTerm->prereqAll)==0 - ){ - if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ - pTerm->wtFlags |= TERM_LIKECOND; - }else{ - pTerm->wtFlags |= TERM_CODED; - } - if( pTerm->iParent<0 ) break; - pTerm = &pTerm->pWC->a[pTerm->iParent]; - pTerm->nChild--; - if( pTerm->nChild!=0 ) break; - nLoop++; - } -} - -/* -** Code an OP_Affinity opcode to apply the column affinity string zAff -** to the n registers starting at base. -** -** As an optimization, SQLITE_AFF_BLOB entries (which are no-ops) at the -** beginning and end of zAff are ignored. If all entries in zAff are -** SQLITE_AFF_BLOB, then no code gets generated. -** -** This routine makes its own copy of zAff so that the caller is free -** to modify zAff after this routine returns. -*/ -static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ - Vdbe *v = pParse->pVdbe; - if( zAff==0 ){ - assert( pParse->db->mallocFailed ); - return; - } - assert( v!=0 ); - - /* Adjust base and n to skip over SQLITE_AFF_BLOB entries at the beginning - ** and end of the affinity string. - */ - while( n>0 && zAff[0]==SQLITE_AFF_BLOB ){ - n--; - base++; - zAff++; - } - while( n>1 && zAff[n-1]==SQLITE_AFF_BLOB ){ - n--; - } - - /* Code the OP_Affinity opcode if there is anything left to do. */ - if( n>0 ){ - sqlite3VdbeAddOp2(v, OP_Affinity, base, n); - sqlite3VdbeChangeP4(v, -1, zAff, n); - sqlite3ExprCacheAffinityChange(pParse, base, n); - } -} - - -/* -** Generate code for a single equality term of the WHERE clause. An equality -** term can be either X=expr or X IN (...). pTerm is the term to be -** coded. -** -** The current value for the constraint is left in register iReg. -** -** For a constraint of the form X=expr, the expression is evaluated and its -** result is left on the stack. For constraints of the form X IN (...) -** this routine sets up a loop that will iterate over all values of X. -*/ -static int codeEqualityTerm( - Parse *pParse, /* The parsing context */ - WhereTerm *pTerm, /* The term of the WHERE clause to be coded */ - WhereLevel *pLevel, /* The level of the FROM clause we are working on */ - int iEq, /* Index of the equality term within this level */ - int bRev, /* True for reverse-order IN operations */ - int iTarget /* Attempt to leave results in this register */ -){ - Expr *pX = pTerm->pExpr; - Vdbe *v = pParse->pVdbe; - int iReg; /* Register holding results */ - - assert( iTarget>0 ); - if( pX->op==TK_EQ || pX->op==TK_IS ){ - iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); - }else if( pX->op==TK_ISNULL ){ - iReg = iTarget; - sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); -#ifndef SQLITE_OMIT_SUBQUERY - }else{ - int eType; - int iTab; - struct InLoop *pIn; - WhereLoop *pLoop = pLevel->pWLoop; - - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 - && pLoop->u.btree.pIndex!=0 - && pLoop->u.btree.pIndex->aSortOrder[iEq] - ){ - testcase( iEq==0 ); - testcase( bRev ); - bRev = !bRev; - } - assert( pX->op==TK_IN ); - iReg = iTarget; - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0); - if( eType==IN_INDEX_INDEX_DESC ){ - testcase( bRev ); - bRev = !bRev; - } - iTab = pX->iTable; - sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); - VdbeCoverageIf(v, bRev); - VdbeCoverageIf(v, !bRev); - assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); - pLoop->wsFlags |= WHERE_IN_ABLE; - if( pLevel->u.in.nIn==0 ){ - pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - } - pLevel->u.in.nIn++; - pLevel->u.in.aInLoop = - sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, - sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); - pIn = pLevel->u.in.aInLoop; - if( pIn ){ - pIn += pLevel->u.in.nIn - 1; - pIn->iCur = iTab; - if( eType==IN_INDEX_ROWID ){ - pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iReg); - }else{ - pIn->addrInTop = sqlite3VdbeAddOp3(v, OP_Column, iTab, 0, iReg); - } - pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen; - sqlite3VdbeAddOp1(v, OP_IsNull, iReg); VdbeCoverage(v); - }else{ - pLevel->u.in.nIn = 0; - } -#endif - } - disableTerm(pLevel, pTerm); - return iReg; -} - -/* -** Generate code that will evaluate all == and IN constraints for an -** index scan. -** -** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). -** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 -** The index has as many as three equality constraints, but in this -** example, the third "c" value is an inequality. So only two -** constraints are coded. This routine will generate code to evaluate -** a==5 and b IN (1,2,3). The current values for a and b will be stored -** in consecutive registers and the index of the first register is returned. -** -** In the example above nEq==2. But this subroutine works for any value -** of nEq including 0. If nEq==0, this routine is nearly a no-op. -** The only thing it does is allocate the pLevel->iMem memory cell and -** compute the affinity string. -** -** The nExtraReg parameter is 0 or 1. It is 0 if all WHERE clause constraints -** are == or IN and are covered by the nEq. nExtraReg is 1 if there is -** an inequality constraint (such as the "c>=5 AND c<10" in the example) that -** occurs after the nEq quality constraints. -** -** This routine allocates a range of nEq+nExtraReg memory cells and returns -** the index of the first memory cell in that range. The code that -** calls this routine will use that memory range to store keys for -** start and termination conditions of the loop. -** key value of the loop. If one or more IN operators appear, then -** this routine allocates an additional nEq memory cells for internal -** use. -** -** Before returning, *pzAff is set to point to a buffer containing a -** copy of the column affinity string of the index allocated using -** sqlite3DbMalloc(). Except, entries in the copy of the string associated -** with equality constraints that use BLOB or NONE affinity are set to -** SQLITE_AFF_BLOB. This is to deal with SQL such as the following: -** -** CREATE TABLE t1(a TEXT PRIMARY KEY, b); -** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b; -** -** In the example above, the index on t1(a) has TEXT affinity. But since -** the right hand side of the equality constraint (t2.b) has BLOB/NONE affinity, -** no conversion should be attempted before using a t2.b value as part of -** a key to search the index. Hence the first byte in the returned affinity -** string in this example would be set to SQLITE_AFF_BLOB. -*/ -static int codeAllEqualityTerms( - Parse *pParse, /* Parsing context */ - WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */ - int bRev, /* Reverse the order of IN operators */ - int nExtraReg, /* Number of extra registers to allocate */ - char **pzAff /* OUT: Set to point to affinity string */ -){ - u16 nEq; /* The number of == or IN constraints to code */ - u16 nSkip; /* Number of left-most columns to skip */ - Vdbe *v = pParse->pVdbe; /* The vm under construction */ - Index *pIdx; /* The index being used for this loop */ - WhereTerm *pTerm; /* A single constraint term */ - WhereLoop *pLoop; /* The WhereLoop object */ - int j; /* Loop counter */ - int regBase; /* Base register */ - int nReg; /* Number of registers to allocate */ - char *zAff; /* Affinity string to return */ - - /* This module is only called on query plans that use an index. */ - pLoop = pLevel->pWLoop; - assert( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ); - nEq = pLoop->u.btree.nEq; - nSkip = pLoop->nSkip; - pIdx = pLoop->u.btree.pIndex; - assert( pIdx!=0 ); - - /* Figure out how many memory cells we will need then allocate them. - */ - regBase = pParse->nMem + 1; - nReg = pLoop->u.btree.nEq + nExtraReg; - pParse->nMem += nReg; - - zAff = sqlite3DbStrDup(pParse->db, sqlite3IndexAffinityStr(v, pIdx)); - if( !zAff ){ - pParse->db->mallocFailed = 1; - } - - if( nSkip ){ - int iIdxCur = pLevel->iIdxCur; - sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); - j = sqlite3VdbeAddOp0(v, OP_Goto); - pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), - iIdxCur, 0, regBase, nSkip); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - sqlite3VdbeJumpHere(v, j); - for(j=0; jaiColumn[j]>=0 ); - VdbeComment((v, "%s", pIdx->pTable->aCol[pIdx->aiColumn[j]].zName)); - } - } - - /* Evaluate the equality constraints - */ - assert( zAff==0 || (int)strlen(zAff)>=nEq ); - for(j=nSkip; jaLTerm[j]; - assert( pTerm!=0 ); - /* The following testcase is true for indices with redundant columns. - ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ - testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j); - if( r1!=regBase+j ){ - if( nReg==1 ){ - sqlite3ReleaseTempReg(pParse, regBase); - regBase = r1; - }else{ - sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j); - } - } - testcase( pTerm->eOperator & WO_ISNULL ); - testcase( pTerm->eOperator & WO_IN ); - if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){ - Expr *pRight = pTerm->pExpr->pRight; - if( (pTerm->wtFlags & TERM_IS)==0 && sqlite3ExprCanBeNull(pRight) ){ - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); - VdbeCoverage(v); - } - if( zAff ){ - if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ - zAff[j] = SQLITE_AFF_BLOB; - } - if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ - zAff[j] = SQLITE_AFF_BLOB; - } - } - } - } - *pzAff = zAff; - return regBase; -} - -#ifndef SQLITE_OMIT_EXPLAIN -/* -** This routine is a helper for explainIndexRange() below -** -** pStr holds the text of an expression that we are building up one term -** at a time. This routine adds a new term to the end of the expression. -** Terms are separated by AND so add the "AND" text for second and subsequent -** terms only. -*/ -static void explainAppendTerm( - StrAccum *pStr, /* The text expression being built */ - int iTerm, /* Index of this term. First is zero */ - const char *zColumn, /* Name of the column */ - const char *zOp /* Name of the operator */ -){ - if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5); - sqlite3StrAccumAppendAll(pStr, zColumn); - sqlite3StrAccumAppend(pStr, zOp, 1); - sqlite3StrAccumAppend(pStr, "?", 1); -} - -/* -** Argument pLevel describes a strategy for scanning table pTab. This -** function appends text to pStr that describes the subset of table -** rows scanned by the strategy in the form of an SQL expression. -** -** For example, if the query: -** -** SELECT * FROM t1 WHERE a=1 AND b>2; -** -** is run and there is an index on (a, b), then this function returns a -** string similar to: -** -** "a=? AND b>?" -*/ -static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop, Table *pTab){ - Index *pIndex = pLoop->u.btree.pIndex; - u16 nEq = pLoop->u.btree.nEq; - u16 nSkip = pLoop->nSkip; - int i, j; - Column *aCol = pTab->aCol; - i16 *aiColumn = pIndex->aiColumn; - - if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; - sqlite3StrAccumAppend(pStr, " (", 2); - for(i=0; i=nSkip ){ - explainAppendTerm(pStr, i, z, "="); - }else{ - if( i ) sqlite3StrAccumAppend(pStr, " AND ", 5); - sqlite3XPrintf(pStr, 0, "ANY(%s)", z); - } - } - - j = i; - if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ - char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; - explainAppendTerm(pStr, i++, z, ">"); - } - if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ - char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; - explainAppendTerm(pStr, i, z, "<"); - } - sqlite3StrAccumAppend(pStr, ")", 1); -} - -/* -** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN -** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was -** defined at compile-time. If it is not a no-op, a single OP_Explain opcode -** is added to the output to describe the table scan strategy in pLevel. -** -** If an OP_Explain opcode is added to the VM, its address is returned. -** Otherwise, if no OP_Explain is coded, zero is returned. -*/ -static int explainOneScan( - Parse *pParse, /* Parse context */ - SrcList *pTabList, /* Table list this loop refers to */ - WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ - int iLevel, /* Value for "level" column of output */ - int iFrom, /* Value for "from" column of output */ - u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ -){ - int ret = 0; -#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) - if( pParse->explain==2 ) -#endif - { - struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom]; - Vdbe *v = pParse->pVdbe; /* VM being constructed */ - sqlite3 *db = pParse->db; /* Database handle */ - int iId = pParse->iSelectId; /* Select id (left-most output column) */ - int isSearch; /* True for a SEARCH. False for SCAN. */ - WhereLoop *pLoop; /* The controlling WhereLoop object */ - u32 flags; /* Flags that describe this loop */ - char *zMsg; /* Text to add to EQP output */ - StrAccum str; /* EQP output string */ - char zBuf[100]; /* Initial space for EQP output string */ - - pLoop = pLevel->pWLoop; - flags = pLoop->wsFlags; - if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_ONETABLE_ONLY) ) return 0; - - isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 - || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) - || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX)); - - sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); - sqlite3StrAccumAppendAll(&str, isSearch ? "SEARCH" : "SCAN"); - if( pItem->pSelect ){ - sqlite3XPrintf(&str, 0, " SUBQUERY %d", pItem->iSelectId); - }else{ - sqlite3XPrintf(&str, 0, " TABLE %s", pItem->zName); - } - - if( pItem->zAlias ){ - sqlite3XPrintf(&str, 0, " AS %s", pItem->zAlias); - } - if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ - const char *zFmt = 0; - Index *pIdx; - - assert( pLoop->u.btree.pIndex!=0 ); - pIdx = pLoop->u.btree.pIndex; - assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); - if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ - if( isSearch ){ - zFmt = "PRIMARY KEY"; - } - }else if( flags & WHERE_PARTIALIDX ){ - zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; - }else if( flags & WHERE_AUTO_INDEX ){ - zFmt = "AUTOMATIC COVERING INDEX"; - }else if( flags & WHERE_IDX_ONLY ){ - zFmt = "COVERING INDEX %s"; - }else{ - zFmt = "INDEX %s"; - } - if( zFmt ){ - sqlite3StrAccumAppend(&str, " USING ", 7); - sqlite3XPrintf(&str, 0, zFmt, pIdx->zName); - explainIndexRange(&str, pLoop, pItem->pTab); - } - }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ - const char *zRange; - if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ - zRange = "(rowid=?)"; - }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ - zRange = "(rowid>? AND rowid?)"; - }else{ - assert( flags&WHERE_TOP_LIMIT); - zRange = "(rowidu.vtab.idxNum, pLoop->u.vtab.idxStr); - } -#endif -#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS - if( pLoop->nOut>=10 ){ - sqlite3XPrintf(&str, 0, " (~%llu rows)", sqlite3LogEstToInt(pLoop->nOut)); - }else{ - sqlite3StrAccumAppend(&str, " (~1 row)", 9); - } -#endif - zMsg = sqlite3StrAccumFinish(&str); - ret = sqlite3VdbeAddOp4(v, OP_Explain, iId, iLevel, iFrom, zMsg,P4_DYNAMIC); - } - return ret; -} -#else -# define explainOneScan(u,v,w,x,y,z) 0 -#endif /* SQLITE_OMIT_EXPLAIN */ - -#ifdef SQLITE_ENABLE_STMT_SCANSTATUS -/* -** Configure the VM passed as the first argument with an -** sqlite3_stmt_scanstatus() entry corresponding to the scan used to -** implement level pLvl. Argument pSrclist is a pointer to the FROM -** clause that the scan reads data from. -** -** If argument addrExplain is not 0, it must be the address of an -** OP_Explain instruction that describes the same loop. -*/ -static void addScanStatus( - Vdbe *v, /* Vdbe to add scanstatus entry to */ - SrcList *pSrclist, /* FROM clause pLvl reads data from */ - WhereLevel *pLvl, /* Level to add scanstatus() entry for */ - int addrExplain /* Address of OP_Explain (or 0) */ -){ - const char *zObj = 0; - WhereLoop *pLoop = pLvl->pWLoop; - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ - zObj = pLoop->u.btree.pIndex->zName; - }else{ - zObj = pSrclist->a[pLvl->iFrom].zName; - } - sqlite3VdbeScanStatus( - v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj - ); -} -#else -# define addScanStatus(a, b, c, d) ((void)d) -#endif - -/* -** If the most recently coded instruction is a constant range contraint -** that originated from the LIKE optimization, then change the P3 to be -** pLoop->iLikeRepCntr and set P5. -** -** The LIKE optimization trys to evaluate "x LIKE 'abc%'" as a range -** expression: "x>='ABC' AND x<'abd'". But this requires that the range -** scan loop run twice, once for strings and a second time for BLOBs. -** The OP_String opcodes on the second pass convert the upper and lower -** bound string contants to blobs. This routine makes the necessary changes -** to the OP_String opcodes for that to happen. -*/ -static void whereLikeOptimizationStringFixup( - Vdbe *v, /* prepared statement under construction */ - WhereLevel *pLevel, /* The loop that contains the LIKE operator */ - WhereTerm *pTerm /* The upper or lower bound just coded */ -){ - if( pTerm->wtFlags & TERM_LIKEOPT ){ - VdbeOp *pOp; - assert( pLevel->iLikeRepCntr>0 ); - pOp = sqlite3VdbeGetOp(v, -1); - assert( pOp!=0 ); - assert( pOp->opcode==OP_String8 - || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); - pOp->p3 = pLevel->iLikeRepCntr; - pOp->p5 = 1; - } -} - -/* -** Generate code for the start of the iLevel-th loop in the WHERE clause -** implementation described by pWInfo. -*/ -static Bitmask codeOneLoopStart( - WhereInfo *pWInfo, /* Complete information about the WHERE clause */ - int iLevel, /* Which level of pWInfo->a[] should be coded */ - Bitmask notReady /* Which tables are currently available */ -){ - int j, k; /* Loop counters */ - int iCur; /* The VDBE cursor for the table */ - int addrNxt; /* Where to jump to continue with the next IN case */ - int omitTable; /* True if we use the index only */ - int bRev; /* True if we need to scan in reverse order */ - WhereLevel *pLevel; /* The where level to be coded */ - WhereLoop *pLoop; /* The WhereLoop object being coded */ - WhereClause *pWC; /* Decomposition of the entire WHERE clause */ - WhereTerm *pTerm; /* A WHERE clause term */ - Parse *pParse; /* Parsing context */ - sqlite3 *db; /* Database connection */ - Vdbe *v; /* The prepared stmt under constructions */ - struct SrcList_item *pTabItem; /* FROM clause term being coded */ - int addrBrk; /* Jump here to break out of the loop */ - int addrCont; /* Jump here to continue with next cycle */ - int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ - int iReleaseReg = 0; /* Temp register to free before returning */ - - pParse = pWInfo->pParse; - v = pParse->pVdbe; - pWC = &pWInfo->sWC; - db = pParse->db; - pLevel = &pWInfo->a[iLevel]; - pLoop = pLevel->pWLoop; - pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; - iCur = pTabItem->iCursor; - pLevel->notReady = notReady & ~getMask(&pWInfo->sMaskSet, iCur); - bRev = (pWInfo->revMask>>iLevel)&1; - omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_FORCE_TABLE)==0; - VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); - - /* Create labels for the "break" and "continue" instructions - ** for the current loop. Jump to addrBrk to break out of a loop. - ** Jump to cont to go immediately to the next iteration of the - ** loop. - ** - ** When there is an IN operator, we also have a "addrNxt" label that - ** means to continue with the next IN value combination. When - ** there are no IN operators in the constraints, the "addrNxt" label - ** is the same as "addrBrk". - */ - addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); - - /* If this is the right table of a LEFT OUTER JOIN, allocate and - ** initialize a memory cell that records if this table matches any - ** row of the left table of the join. - */ - if( pLevel->iFrom>0 && (pTabItem[0].jointype & JT_LEFT)!=0 ){ - pLevel->iLeftJoin = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); - VdbeComment((v, "init LEFT JOIN no-match flag")); - } - - /* Special case of a FROM clause subquery implemented as a co-routine */ - if( pTabItem->viaCoroutine ){ - int regYield = pTabItem->regReturn; - sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); - pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); - VdbeCoverage(v); - VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); - pLevel->op = OP_Goto; - }else - -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ - /* Case 1: The table is a virtual-table. Use the VFilter and VNext - ** to access the data. - */ - int iReg; /* P3 Value for OP_VFilter */ - int addrNotFound; - int nConstraint = pLoop->nLTerm; - - sqlite3ExprCachePush(pParse); - iReg = sqlite3GetTempRange(pParse, nConstraint+2); - addrNotFound = pLevel->addrBrk; - for(j=0; jaLTerm[j]; - if( pTerm==0 ) continue; - if( pTerm->eOperator & WO_IN ){ - codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); - addrNotFound = pLevel->addrNxt; - }else{ - sqlite3ExprCode(pParse, pTerm->pExpr->pRight, iTarget); - } - } - sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); - sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); - sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, - pLoop->u.vtab.idxStr, - pLoop->u.vtab.needFree ? P4_MPRINTF : P4_STATIC); - VdbeCoverage(v); - pLoop->u.vtab.needFree = 0; - for(j=0; ju.vtab.omitMask>>j)&1 ){ - disableTerm(pLevel, pLoop->aLTerm[j]); - } - } - pLevel->op = OP_VNext; - pLevel->p1 = iCur; - pLevel->p2 = sqlite3VdbeCurrentAddr(v); - sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); - sqlite3ExprCachePop(pParse); - }else -#endif /* SQLITE_OMIT_VIRTUALTABLE */ - - if( (pLoop->wsFlags & WHERE_IPK)!=0 - && (pLoop->wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_EQ))!=0 - ){ - /* Case 2: We can directly reference a single row using an - ** equality comparison against the ROWID field. Or - ** we reference multiple rows using a "rowid IN (...)" - ** construct. - */ - assert( pLoop->u.btree.nEq==1 ); - pTerm = pLoop->aLTerm[0]; - assert( pTerm!=0 ); - assert( pTerm->pExpr!=0 ); - assert( omitTable==0 ); - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - iReleaseReg = ++pParse->nMem; - iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); - if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); - addrNxt = pLevel->addrNxt; - sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addrNxt, iRowidReg); - VdbeCoverage(v); - sqlite3ExprCacheAffinityChange(pParse, iRowidReg, 1); - sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); - VdbeComment((v, "pk")); - pLevel->op = OP_Noop; - }else if( (pLoop->wsFlags & WHERE_IPK)!=0 - && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 - ){ - /* Case 3: We have an inequality comparison against the ROWID field. - */ - int testOp = OP_Noop; - int start; - int memEndValue = 0; - WhereTerm *pStart, *pEnd; - - assert( omitTable==0 ); - j = 0; - pStart = pEnd = 0; - if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; - if( pLoop->wsFlags & WHERE_TOP_LIMIT ) pEnd = pLoop->aLTerm[j++]; - assert( pStart!=0 || pEnd!=0 ); - if( bRev ){ - pTerm = pStart; - pStart = pEnd; - pEnd = pTerm; - } - if( pStart ){ - Expr *pX; /* The expression that defines the start bound */ - int r1, rTemp; /* Registers for holding the start boundary */ - - /* The following constant maps TK_xx codes into corresponding - ** seek opcodes. It depends on a particular ordering of TK_xx - */ - const u8 aMoveOp[] = { - /* TK_GT */ OP_SeekGT, - /* TK_LE */ OP_SeekLE, - /* TK_LT */ OP_SeekLT, - /* TK_GE */ OP_SeekGE - }; - assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ - assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ - assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ - - assert( (pStart->wtFlags & TERM_VNULL)==0 ); - testcase( pStart->wtFlags & TERM_VIRTUAL ); - pX = pStart->pExpr; - assert( pX!=0 ); - testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ - r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); - sqlite3VdbeAddOp3(v, aMoveOp[pX->op-TK_GT], iCur, addrBrk, r1); - VdbeComment((v, "pk")); - VdbeCoverageIf(v, pX->op==TK_GT); - VdbeCoverageIf(v, pX->op==TK_LE); - VdbeCoverageIf(v, pX->op==TK_LT); - VdbeCoverageIf(v, pX->op==TK_GE); - sqlite3ExprCacheAffinityChange(pParse, r1, 1); - sqlite3ReleaseTempReg(pParse, rTemp); - disableTerm(pLevel, pStart); - }else{ - sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - } - if( pEnd ){ - Expr *pX; - pX = pEnd->pExpr; - assert( pX!=0 ); - assert( (pEnd->wtFlags & TERM_VNULL)==0 ); - testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */ - testcase( pEnd->wtFlags & TERM_VIRTUAL ); - memEndValue = ++pParse->nMem; - sqlite3ExprCode(pParse, pX->pRight, memEndValue); - if( pX->op==TK_LT || pX->op==TK_GT ){ - testOp = bRev ? OP_Le : OP_Ge; - }else{ - testOp = bRev ? OP_Lt : OP_Gt; - } - disableTerm(pLevel, pEnd); - } - start = sqlite3VdbeCurrentAddr(v); - pLevel->op = bRev ? OP_Prev : OP_Next; - pLevel->p1 = iCur; - pLevel->p2 = start; - assert( pLevel->p5==0 ); - if( testOp!=OP_Noop ){ - iRowidReg = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); - sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); - sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); - VdbeCoverageIf(v, testOp==OP_Le); - VdbeCoverageIf(v, testOp==OP_Lt); - VdbeCoverageIf(v, testOp==OP_Ge); - VdbeCoverageIf(v, testOp==OP_Gt); - sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); - } - }else if( pLoop->wsFlags & WHERE_INDEXED ){ - /* Case 4: A scan using an index. - ** - ** The WHERE clause may contain zero or more equality - ** terms ("==" or "IN" operators) that refer to the N - ** left-most columns of the index. It may also contain - ** inequality constraints (>, <, >= or <=) on the indexed - ** column that immediately follows the N equalities. Only - ** the right-most column can be an inequality - the rest must - ** use the "==" and "IN" operators. For example, if the - ** index is on (x,y,z), then the following clauses are all - ** optimized: - ** - ** x=5 - ** x=5 AND y=10 - ** x=5 AND y<10 - ** x=5 AND y>5 AND y<10 - ** x=5 AND y=5 AND z<=10 - ** - ** The z<10 term of the following cannot be used, only - ** the x=5 term: - ** - ** x=5 AND z<10 - ** - ** N may be zero if there are inequality constraints. - ** If there are no inequality constraints, then N is at - ** least one. - ** - ** This case is also used when there are no WHERE clause - ** constraints but an index is selected anyway, in order - ** to force the output order to conform to an ORDER BY. - */ - static const u8 aStartOp[] = { - 0, - 0, - OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ - OP_Last, /* 3: (!start_constraints && startEq && bRev) */ - OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ - OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ - OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ - OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ - }; - static const u8 aEndOp[] = { - OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ - OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ - OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ - OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ - }; - u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ - int regBase; /* Base register holding constraint values */ - WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ - WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ - int startEq; /* True if range start uses ==, >= or <= */ - int endEq; /* True if range end uses ==, >= or <= */ - int start_constraints; /* Start of range is constrained */ - int nConstraint; /* Number of constraint terms */ - Index *pIdx; /* The index we will be using */ - int iIdxCur; /* The VDBE cursor for the index */ - int nExtraReg = 0; /* Number of extra registers needed */ - int op; /* Instruction opcode */ - char *zStartAff; /* Affinity for start of range constraint */ - char cEndAff = 0; /* Affinity for end of range constraint */ - u8 bSeekPastNull = 0; /* True to seek past initial nulls */ - u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ - - pIdx = pLoop->u.btree.pIndex; - iIdxCur = pLevel->iIdxCur; - assert( nEq>=pLoop->nSkip ); - - /* If this loop satisfies a sort order (pOrderBy) request that - ** was passed to this function to implement a "SELECT min(x) ..." - ** query, then the caller will only allow the loop to run for - ** a single iteration. This means that the first row returned - ** should not have a NULL value stored in 'x'. If column 'x' is - ** the first one after the nEq equality constraints in the index, - ** this requires some special handling. - */ - assert( pWInfo->pOrderBy==0 - || pWInfo->pOrderBy->nExpr==1 - || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); - if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 - && pWInfo->nOBSat>0 - && (pIdx->nKeyCol>nEq) - ){ - assert( pLoop->nSkip==0 ); - bSeekPastNull = 1; - nExtraReg = 1; - } - - /* Find any inequality constraint terms for the start and end - ** of the range. - */ - j = nEq; - if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ - pRangeStart = pLoop->aLTerm[j++]; - nExtraReg = 1; - /* Like optimization range constraints always occur in pairs */ - assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || - (pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 ); - } - if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ - pRangeEnd = pLoop->aLTerm[j++]; - nExtraReg = 1; - if( (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0 ){ - assert( pRangeStart!=0 ); /* LIKE opt constraints */ - assert( pRangeStart->wtFlags & TERM_LIKEOPT ); /* occur in pairs */ - pLevel->iLikeRepCntr = ++pParse->nMem; - testcase( bRev ); - testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC ); - sqlite3VdbeAddOp2(v, OP_Integer, - bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC), - pLevel->iLikeRepCntr); - VdbeComment((v, "LIKE loop counter")); - pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v); - } - if( pRangeStart==0 - && (j = pIdx->aiColumn[nEq])>=0 - && pIdx->pTable->aCol[j].notNull==0 - ){ - bSeekPastNull = 1; - } - } - assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); - - /* Generate code to evaluate all constraint terms using == or IN - ** and store the values of those terms in an array of registers - ** starting at regBase. - */ - regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); - assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); - if( zStartAff ) cEndAff = zStartAff[nEq]; - addrNxt = pLevel->addrNxt; - - /* If we are doing a reverse order scan on an ascending index, or - ** a forward order scan on a descending index, interchange the - ** start and end terms (pRangeStart and pRangeEnd). - */ - if( (nEqnKeyCol && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) - || (bRev && pIdx->nKeyCol==nEq) - ){ - SWAP(WhereTerm *, pRangeEnd, pRangeStart); - SWAP(u8, bSeekPastNull, bStopAtNull); - } - - testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); - testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); - testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); - testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); - startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE); - endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE); - start_constraints = pRangeStart || nEq>0; - - /* Seek the index cursor to the start of the range. */ - nConstraint = nEq; - if( pRangeStart ){ - Expr *pRight = pRangeStart->pExpr->pRight; - sqlite3ExprCode(pParse, pRight, regBase+nEq); - whereLikeOptimizationStringFixup(v, pLevel, pRangeStart); - if( (pRangeStart->wtFlags & TERM_VNULL)==0 - && sqlite3ExprCanBeNull(pRight) - ){ - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); - VdbeCoverage(v); - } - if( zStartAff ){ - if( sqlite3CompareAffinity(pRight, zStartAff[nEq])==SQLITE_AFF_BLOB){ - /* Since the comparison is to be performed with no conversions - ** applied to the operands, set the affinity to apply to pRight to - ** SQLITE_AFF_BLOB. */ - zStartAff[nEq] = SQLITE_AFF_BLOB; - } - if( sqlite3ExprNeedsNoAffinityChange(pRight, zStartAff[nEq]) ){ - zStartAff[nEq] = SQLITE_AFF_BLOB; - } - } - nConstraint++; - testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); - }else if( bSeekPastNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - nConstraint++; - startEq = 0; - start_constraints = 1; - } - codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); - op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; - assert( op!=0 ); - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - VdbeCoverage(v); - VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); - VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); - VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); - VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); - VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); - VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); - - /* Load the value for the inequality constraint at the end of the - ** range (if any). - */ - nConstraint = nEq; - if( pRangeEnd ){ - Expr *pRight = pRangeEnd->pExpr->pRight; - sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); - sqlite3ExprCode(pParse, pRight, regBase+nEq); - whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); - if( (pRangeEnd->wtFlags & TERM_VNULL)==0 - && sqlite3ExprCanBeNull(pRight) - ){ - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); - VdbeCoverage(v); - } - if( sqlite3CompareAffinity(pRight, cEndAff)!=SQLITE_AFF_BLOB - && !sqlite3ExprNeedsNoAffinityChange(pRight, cEndAff) - ){ - codeApplyAffinity(pParse, regBase+nEq, 1, &cEndAff); - } - nConstraint++; - testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); - }else if( bStopAtNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - endEq = 0; - nConstraint++; - } - sqlite3DbFree(db, zStartAff); - - /* Top of the loop body */ - pLevel->p2 = sqlite3VdbeCurrentAddr(v); - - /* Check if the index cursor is past the end of the range. */ - if( nConstraint ){ - op = aEndOp[bRev*2 + endEq]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); - testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); - testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); - testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); - } - - /* Seek the table cursor, if required */ - disableTerm(pLevel, pRangeStart); - disableTerm(pLevel, pRangeEnd); - if( omitTable ){ - /* pIdx is a covering index. No need to access the main table. */ - }else if( HasRowid(pIdx->pTable) ){ - iRowidReg = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); - sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); - sqlite3VdbeAddOp2(v, OP_Seek, iCur, iRowidReg); /* Deferred seek */ - }else if( iCur!=iIdxCur ){ - Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); - iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); - for(j=0; jnKeyCol; j++){ - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); - sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); - } - sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, - iRowidReg, pPk->nKeyCol); VdbeCoverage(v); - } - - /* Record the instruction used to terminate the loop. Disable - ** WHERE clause terms made redundant by the index range scan. - */ - if( pLoop->wsFlags & WHERE_ONEROW ){ - pLevel->op = OP_Noop; - }else if( bRev ){ - pLevel->op = OP_Prev; - }else{ - pLevel->op = OP_Next; - } - pLevel->p1 = iIdxCur; - pLevel->p3 = (pLoop->wsFlags&WHERE_UNQ_WANTED)!=0 ? 1:0; - if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ - pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; - }else{ - assert( pLevel->p5==0 ); - } - }else - -#ifndef SQLITE_OMIT_OR_OPTIMIZATION - if( pLoop->wsFlags & WHERE_MULTI_OR ){ - /* Case 5: Two or more separately indexed terms connected by OR - ** - ** Example: - ** - ** CREATE TABLE t1(a,b,c,d); - ** CREATE INDEX i1 ON t1(a); - ** CREATE INDEX i2 ON t1(b); - ** CREATE INDEX i3 ON t1(c); - ** - ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13) - ** - ** In the example, there are three indexed terms connected by OR. - ** The top of the loop looks like this: - ** - ** Null 1 # Zero the rowset in reg 1 - ** - ** Then, for each indexed term, the following. The arguments to - ** RowSetTest are such that the rowid of the current row is inserted - ** into the RowSet. If it is already present, control skips the - ** Gosub opcode and jumps straight to the code generated by WhereEnd(). - ** - ** sqlite3WhereBegin() - ** RowSetTest # Insert rowid into rowset - ** Gosub 2 A - ** sqlite3WhereEnd() - ** - ** Following the above, code to terminate the loop. Label A, the target - ** of the Gosub above, jumps to the instruction right after the Goto. - ** - ** Null 1 # Zero the rowset in reg 1 - ** Goto B # The loop is finished. - ** - ** A: # Return data, whatever. - ** - ** Return 2 # Jump back to the Gosub - ** - ** B: - ** - ** Added 2014-05-26: If the table is a WITHOUT ROWID table, then - ** use an ephemeral index instead of a RowSet to record the primary - ** keys of the rows we have already seen. - ** - */ - WhereClause *pOrWc; /* The OR-clause broken out into subterms */ - SrcList *pOrTab; /* Shortened table list or OR-clause generation */ - Index *pCov = 0; /* Potential covering index (or NULL) */ - int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */ - - int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ - int regRowset = 0; /* Register for RowSet object */ - int regRowid = 0; /* Register holding rowid */ - int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ - int iRetInit; /* Address of regReturn init */ - int untestedTerms = 0; /* Some terms not completely tested */ - int ii; /* Loop counter */ - u16 wctrlFlags; /* Flags for sub-WHERE clause */ - Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ - Table *pTab = pTabItem->pTab; - - pTerm = pLoop->aLTerm[0]; - assert( pTerm!=0 ); - assert( pTerm->eOperator & WO_OR ); - assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); - pOrWc = &pTerm->u.pOrInfo->wc; - pLevel->op = OP_Return; - pLevel->p1 = regReturn; - - /* Set up a new SrcList in pOrTab containing the table being scanned - ** by this loop in the a[0] slot and all notReady tables in a[1..] slots. - ** This becomes the SrcList in the recursive call to sqlite3WhereBegin(). - */ - if( pWInfo->nLevel>1 ){ - int nNotReady; /* The number of notReady tables */ - struct SrcList_item *origSrc; /* Original list of tables */ - nNotReady = pWInfo->nLevel - iLevel - 1; - pOrTab = sqlite3StackAllocRaw(db, - sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); - if( pOrTab==0 ) return notReady; - pOrTab->nAlloc = (u8)(nNotReady + 1); - pOrTab->nSrc = pOrTab->nAlloc; - memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem)); - origSrc = pWInfo->pTabList->a; - for(k=1; k<=nNotReady; k++){ - memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k])); - } - }else{ - pOrTab = pWInfo->pTabList; - } - - /* Initialize the rowset register to contain NULL. An SQL NULL is - ** equivalent to an empty rowset. Or, create an ephemeral index - ** capable of holding primary keys in the case of a WITHOUT ROWID. - ** - ** Also initialize regReturn to contain the address of the instruction - ** immediately following the OP_Return at the bottom of the loop. This - ** is required in a few obscure LEFT JOIN cases where control jumps - ** over the top of the loop into the body of it. In this case the - ** correct response for the end-of-loop code (the OP_Return) is to - ** fall through to the next instruction, just as an OP_Next does if - ** called on an uninitialized cursor. - */ - if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ - if( HasRowid(pTab) ){ - regRowset = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); - }else{ - Index *pPk = sqlite3PrimaryKeyIndex(pTab); - regRowset = pParse->nTab++; - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, regRowset, pPk->nKeyCol); - sqlite3VdbeSetP4KeyInfo(pParse, pPk); - } - regRowid = ++pParse->nMem; - } - iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); - - /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y - ** Then for every term xN, evaluate as the subexpression: xN AND z - ** That way, terms in y that are factored into the disjunction will - ** be picked up by the recursive calls to sqlite3WhereBegin() below. - ** - ** Actually, each subexpression is converted to "xN AND w" where w is - ** the "interesting" terms of z - terms that did not originate in the - ** ON or USING clause of a LEFT JOIN, and terms that are usable as - ** indices. - ** - ** This optimization also only applies if the (x1 OR x2 OR ...) term - ** is not contained in the ON clause of a LEFT JOIN. - ** See ticket http://www.sqlite.org/src/info/f2369304e4 - */ - if( pWC->nTerm>1 ){ - int iTerm; - for(iTerm=0; iTermnTerm; iTerm++){ - Expr *pExpr = pWC->a[iTerm].pExpr; - if( &pWC->a[iTerm] == pTerm ) continue; - if( ExprHasProperty(pExpr, EP_FromJoin) ) continue; - if( (pWC->a[iTerm].wtFlags & TERM_VIRTUAL)!=0 ) continue; - if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; - testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); - pExpr = sqlite3ExprDup(db, pExpr, 0); - pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); - } - if( pAndExpr ){ - pAndExpr = sqlite3PExpr(pParse, TK_AND, 0, pAndExpr, 0); - } - } - - /* Run a separate WHERE clause for each term of the OR clause. After - ** eliminating duplicates from other WHERE clauses, the action for each - ** sub-WHERE clause is to to invoke the main loop body as a subroutine. - */ - wctrlFlags = WHERE_OMIT_OPEN_CLOSE - | WHERE_FORCE_TABLE - | WHERE_ONETABLE_ONLY - | WHERE_NO_AUTOINDEX; - for(ii=0; iinTerm; ii++){ - WhereTerm *pOrTerm = &pOrWc->a[ii]; - if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ - WhereInfo *pSubWInfo; /* Info for single OR-term scan */ - Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ - int j1 = 0; /* Address of jump operation */ - if( pAndExpr && !ExprHasProperty(pOrExpr, EP_FromJoin) ){ - pAndExpr->pLeft = pOrExpr; - pOrExpr = pAndExpr; - } - /* Loop through table entries that match term pOrTerm. */ - WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); - pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, - wctrlFlags, iCovCur); - assert( pSubWInfo || pParse->nErr || db->mallocFailed ); - if( pSubWInfo ){ - WhereLoop *pSubLoop; - int addrExplain = explainOneScan( - pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0 - ); - addScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain); - - /* This is the sub-WHERE clause body. First skip over - ** duplicate rows from prior sub-WHERE clauses, and record the - ** rowid (or PRIMARY KEY) for the current row so that the same - ** row will be skipped in subsequent sub-WHERE clauses. - */ - if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ - int r; - int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); - if( HasRowid(pTab) ){ - r = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, regRowid, 0); - j1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, r,iSet); - VdbeCoverage(v); - }else{ - Index *pPk = sqlite3PrimaryKeyIndex(pTab); - int nPk = pPk->nKeyCol; - int iPk; - - /* Read the PK into an array of temp registers. */ - r = sqlite3GetTempRange(pParse, nPk); - for(iPk=0; iPkaiColumn[iPk]; - sqlite3ExprCodeGetColumn(pParse, pTab, iCol, iCur, r+iPk, 0); - } - - /* Check if the temp table already contains this key. If so, - ** the row has already been included in the result set and - ** can be ignored (by jumping past the Gosub below). Otherwise, - ** insert the key into the temp table and proceed with processing - ** the row. - ** - ** Use some of the same optimizations as OP_RowSetTest: If iSet - ** is zero, assume that the key cannot already be present in - ** the temp table. And if iSet is -1, assume that there is no - ** need to insert the key into the temp table, as it will never - ** be tested for. */ - if( iSet ){ - j1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); - VdbeCoverage(v); - } - if( iSet>=0 ){ - sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); - sqlite3VdbeAddOp3(v, OP_IdxInsert, regRowset, regRowid, 0); - if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); - } - - /* Release the array of temp registers */ - sqlite3ReleaseTempRange(pParse, r, nPk); - } - } - - /* Invoke the main loop body as a subroutine */ - sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); - - /* Jump here (skipping the main loop body subroutine) if the - ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ - if( j1 ) sqlite3VdbeJumpHere(v, j1); - - /* The pSubWInfo->untestedTerms flag means that this OR term - ** contained one or more AND term from a notReady table. The - ** terms from the notReady table could not be tested and will - ** need to be tested later. - */ - if( pSubWInfo->untestedTerms ) untestedTerms = 1; - - /* If all of the OR-connected terms are optimized using the same - ** index, and the index is opened using the same cursor number - ** by each call to sqlite3WhereBegin() made by this loop, it may - ** be possible to use that index as a covering index. - ** - ** If the call to sqlite3WhereBegin() above resulted in a scan that - ** uses an index, and this is either the first OR-connected term - ** processed or the index is the same as that used by all previous - ** terms, set pCov to the candidate covering index. Otherwise, set - ** pCov to NULL to indicate that no candidate covering index will - ** be available. - */ - pSubLoop = pSubWInfo->a[0].pWLoop; - assert( (pSubLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); - if( (pSubLoop->wsFlags & WHERE_INDEXED)!=0 - && (ii==0 || pSubLoop->u.btree.pIndex==pCov) - && (HasRowid(pTab) || !IsPrimaryKeyIndex(pSubLoop->u.btree.pIndex)) - ){ - assert( pSubWInfo->a[0].iIdxCur==iCovCur ); - pCov = pSubLoop->u.btree.pIndex; - wctrlFlags |= WHERE_REOPEN_IDX; - }else{ - pCov = 0; - } - - /* Finish the loop through table entries that match term pOrTerm. */ - sqlite3WhereEnd(pSubWInfo); - } - } - } - pLevel->u.pCovidx = pCov; - if( pCov ) pLevel->iIdxCur = iCovCur; - if( pAndExpr ){ - pAndExpr->pLeft = 0; - sqlite3ExprDelete(db, pAndExpr); - } - sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); - sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk); - sqlite3VdbeResolveLabel(v, iLoopBody); - - if( pWInfo->nLevel>1 ) sqlite3StackFree(db, pOrTab); - if( !untestedTerms ) disableTerm(pLevel, pTerm); - }else -#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ - - { - /* Case 6: There is no usable index. We must do a complete - ** scan of the entire table. - */ - static const u8 aStep[] = { OP_Next, OP_Prev }; - static const u8 aStart[] = { OP_Rewind, OP_Last }; - assert( bRev==0 || bRev==1 ); - if( pTabItem->isRecursive ){ - /* Tables marked isRecursive have only a single row that is stored in - ** a pseudo-cursor. No need to Rewind or Next such cursors. */ - pLevel->op = OP_Noop; - }else{ - pLevel->op = aStep[bRev]; - pLevel->p1 = iCur; - pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; - } - } - -#ifdef SQLITE_ENABLE_STMT_SCANSTATUS - pLevel->addrVisit = sqlite3VdbeCurrentAddr(v); -#endif - - /* Insert code to test every subexpression that can be completely - ** computed using the current set of tables. - */ - for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ - Expr *pE; - int skipLikeAddr = 0; - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - testcase( pTerm->wtFlags & TERM_CODED ); - if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ - testcase( pWInfo->untestedTerms==0 - && (pWInfo->wctrlFlags & WHERE_ONETABLE_ONLY)!=0 ); - pWInfo->untestedTerms = 1; - continue; - } - pE = pTerm->pExpr; - assert( pE!=0 ); - if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){ - continue; - } - if( pTerm->wtFlags & TERM_LIKECOND ){ - assert( pLevel->iLikeRepCntr>0 ); - skipLikeAddr = sqlite3VdbeAddOp1(v, OP_IfNot, pLevel->iLikeRepCntr); - VdbeCoverage(v); - } - sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); - if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); - pTerm->wtFlags |= TERM_CODED; - } - - /* Insert code to test for implied constraints based on transitivity - ** of the "==" operator. - ** - ** Example: If the WHERE clause contains "t1.a=t2.b" and "t2.b=123" - ** and we are coding the t1 loop and the t2 loop has not yet coded, - ** then we cannot use the "t1.a=t2.b" constraint, but we can code - ** the implied "t1.a=123" constraint. - */ - for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ - Expr *pE, *pEAlt; - WhereTerm *pAlt; - if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; - if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; - if( pTerm->leftCursor!=iCur ) continue; - if( pLevel->iLeftJoin ) continue; - pE = pTerm->pExpr; - assert( !ExprHasProperty(pE, EP_FromJoin) ); - assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); - pAlt = findTerm(pWC, iCur, pTerm->u.leftColumn, notReady, - WO_EQ|WO_IN|WO_IS, 0); - if( pAlt==0 ) continue; - if( pAlt->wtFlags & (TERM_CODED) ) continue; - testcase( pAlt->eOperator & WO_EQ ); - testcase( pAlt->eOperator & WO_IS ); - testcase( pAlt->eOperator & WO_IN ); - VdbeModuleComment((v, "begin transitive constraint")); - pEAlt = sqlite3StackAllocRaw(db, sizeof(*pEAlt)); - if( pEAlt ){ - *pEAlt = *pAlt->pExpr; - pEAlt->pLeft = pE->pLeft; - sqlite3ExprIfFalse(pParse, pEAlt, addrCont, SQLITE_JUMPIFNULL); - sqlite3StackFree(db, pEAlt); - } - } - - /* For a LEFT OUTER JOIN, generate code that will record the fact that - ** at least one row of the right table has matched the left table. - */ - if( pLevel->iLeftJoin ){ - pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); - VdbeComment((v, "record LEFT JOIN hit")); - sqlite3ExprCacheClear(pParse); - for(pTerm=pWC->a, j=0; jnTerm; j++, pTerm++){ - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - testcase( pTerm->wtFlags & TERM_CODED ); - if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ - assert( pWInfo->untestedTerms ); - continue; - } - assert( pTerm->pExpr ); - sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); - pTerm->wtFlags |= TERM_CODED; - } - } - - return pLevel->notReady; -} #ifdef WHERETRACE_ENABLED /* @@ -5670,7 +4198,7 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ whereLoopInit(pNew); for(iTab=0, pItem=pTabList->a; iTabiTab = iTab; - pNew->maskSelf = getMask(&pWInfo->sMaskSet, pItem->iCursor); + pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); if( ((pItem->jointype|priorJoinType) & (JT_LEFT|JT_CROSS))!=0 ){ mExtra = mPrior; } @@ -5791,7 +4319,7 @@ static i8 wherePathSatisfiesOrderBy( pOBExpr = sqlite3ExprSkipCollate(pOrderBy->a[i].pExpr); if( pOBExpr->op!=TK_COLUMN ) continue; if( pOBExpr->iTable!=iCur ) continue; - pTerm = findTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, + pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, ~ready, WO_EQ|WO_ISNULL|WO_IS, 0); if( pTerm==0 ) continue; if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ @@ -6407,7 +4935,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pLoop = pBuilder->pNew; pLoop->wsFlags = 0; pLoop->nSkip = 0; - pTerm = findTerm(pWC, iCur, -1, 0, WO_EQ|WO_IS, 0); + pTerm = sqlite3WhereFindTerm(pWC, iCur, -1, 0, WO_EQ|WO_IS, 0); if( pTerm ){ testcase( pTerm->eOperator & WO_IS ); pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW; @@ -6426,7 +4954,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ ) continue; opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ; for(j=0; jnKeyCol; j++){ - pTerm = findTerm(pWC, iCur, pIdx->aiColumn[j], 0, opMask, pIdx); + pTerm = sqlite3WhereFindTerm(pWC, iCur, pIdx->aiColumn[j], 0, opMask, pIdx); if( pTerm==0 ) break; testcase( pTerm->eOperator & WO_IS ); pLoop->aLTerm[j] = pTerm; @@ -6447,7 +4975,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ if( pLoop->wsFlags ){ pLoop->nOut = (LogEst)1; pWInfo->a[0].pWLoop = pLoop; - pLoop->maskSelf = getMask(&pWInfo->sMaskSet, iCur); + pLoop->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); pWInfo->a[0].iTabCur = iCur; pWInfo->nRowOut = 1; if( pWInfo->pOrderBy ) pWInfo->nOBSat = pWInfo->pOrderBy->nExpr; @@ -6687,7 +5215,7 @@ WhereInfo *sqlite3WhereBegin( { Bitmask toTheLeft = 0; for(ii=0; iinSrc; ii++){ - Bitmask m = getMask(pMaskSet, pTabList->a[ii].iCursor); + Bitmask m = sqlite3WhereGetMask(pMaskSet, pTabList->a[ii].iCursor); assert( (m-1)==toTheLeft ); toTheLeft |= m; } @@ -6936,14 +5464,14 @@ WhereInfo *sqlite3WhereBegin( if( db->mallocFailed ) goto whereBeginError; } #endif - addrExplain = explainOneScan( + addrExplain = sqlite3WhereExplainOneScan( pParse, pTabList, pLevel, ii, pLevel->iFrom, wctrlFlags ); pLevel->addrBody = sqlite3VdbeCurrentAddr(v); - notReady = codeOneLoopStart(pWInfo, ii, notReady); + notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady); pWInfo->iContinue = pLevel->addrCont; if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_ONETABLE_ONLY)==0 ){ - addScanStatus(v, pTabList, pLevel, addrExplain); + sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); } } diff --git a/src/whereInt.h b/src/whereInt.h index 3a5a48e840..075deed4a2 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -19,7 +19,7 @@ ** Trace output macros */ #if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) -/***/ int sqlite3WhereTrace = 0; +/***/ int sqlite3WhereTrace; #endif #if defined(SQLITE_DEBUG) \ && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE)) @@ -161,10 +161,6 @@ struct WhereOrSet { WhereOrCost a[N_OR_COST]; /* Set of best costs */ }; - -/* Forward declaration of methods */ -static int whereLoopResize(sqlite3*, WhereLoop*, int); - /* ** Each instance of this object holds a sequence of WhereLoop objects ** that implement some or all of a query plan. @@ -423,6 +419,52 @@ struct WhereInfo { WhereLevel a[1]; /* Information about each nest loop in WHERE */ }; +/* +** Private interfaces - callable only by other where.c routines. +*/ +Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); +WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +); +#ifndef SQLITE_OMIT_EXPLAIN +int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + int iLevel, /* Value for "level" column of output */ + int iFrom, /* Value for "from" column of output */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +); +#else +# define sqlite3WhereExplainOneScan(u,v,w,x,y,z) 0 +#endif /* SQLITE_OMIT_EXPLAIN */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +); +#else +# define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) +#endif +Bitmask sqlite3WhereCodeOneLoopStart( + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + Bitmask notReady /* Which tables are currently available */ +); + + + + + + + /* ** Bitmasks for the operators on WhereTerm objects. These are all ** operators that are of interest to the query planner. An diff --git a/src/wherecode.c b/src/wherecode.c new file mode 100644 index 0000000000..e1f0f86615 --- /dev/null +++ b/src/wherecode.c @@ -0,0 +1,1501 @@ +/* +** 2015-06-06 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was split off from where.c on 2015-06-06 in order to reduce the +** size of where.c and make it easier to edit. This file contains the routines +** that actually generate the bulk of the WHERE loop code. The original where.c +** file retains the code that does query planning and analysis. +*/ +#include "sqliteInt.h" +#include "whereInt.h" + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** This routine is a helper for explainIndexRange() below +** +** pStr holds the text of an expression that we are building up one term +** at a time. This routine adds a new term to the end of the expression. +** Terms are separated by AND so add the "AND" text for second and subsequent +** terms only. +*/ +static void explainAppendTerm( + StrAccum *pStr, /* The text expression being built */ + int iTerm, /* Index of this term. First is zero */ + const char *zColumn, /* Name of the column */ + const char *zOp /* Name of the operator */ +){ + if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5); + sqlite3StrAccumAppendAll(pStr, zColumn); + sqlite3StrAccumAppend(pStr, zOp, 1); + sqlite3StrAccumAppend(pStr, "?", 1); +} + +/* +** Argument pLevel describes a strategy for scanning table pTab. This +** function appends text to pStr that describes the subset of table +** rows scanned by the strategy in the form of an SQL expression. +** +** For example, if the query: +** +** SELECT * FROM t1 WHERE a=1 AND b>2; +** +** is run and there is an index on (a, b), then this function returns a +** string similar to: +** +** "a=? AND b>?" +*/ +static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop, Table *pTab){ + Index *pIndex = pLoop->u.btree.pIndex; + u16 nEq = pLoop->u.btree.nEq; + u16 nSkip = pLoop->nSkip; + int i, j; + Column *aCol = pTab->aCol; + i16 *aiColumn = pIndex->aiColumn; + + if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; + sqlite3StrAccumAppend(pStr, " (", 2); + for(i=0; i=nSkip ){ + explainAppendTerm(pStr, i, z, "="); + }else{ + if( i ) sqlite3StrAccumAppend(pStr, " AND ", 5); + sqlite3XPrintf(pStr, 0, "ANY(%s)", z); + } + } + + j = i; + if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ + char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; + explainAppendTerm(pStr, i++, z, ">"); + } + if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ + char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; + explainAppendTerm(pStr, i, z, "<"); + } + sqlite3StrAccumAppend(pStr, ")", 1); +} + +/* +** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN +** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was +** defined at compile-time. If it is not a no-op, a single OP_Explain opcode +** is added to the output to describe the table scan strategy in pLevel. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + int iLevel, /* Value for "level" column of output */ + int iFrom, /* Value for "from" column of output */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +){ + int ret = 0; +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) + if( pParse->explain==2 ) +#endif + { + struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom]; + Vdbe *v = pParse->pVdbe; /* VM being constructed */ + sqlite3 *db = pParse->db; /* Database handle */ + int iId = pParse->iSelectId; /* Select id (left-most output column) */ + int isSearch; /* True for a SEARCH. False for SCAN. */ + WhereLoop *pLoop; /* The controlling WhereLoop object */ + u32 flags; /* Flags that describe this loop */ + char *zMsg; /* Text to add to EQP output */ + StrAccum str; /* EQP output string */ + char zBuf[100]; /* Initial space for EQP output string */ + + pLoop = pLevel->pWLoop; + flags = pLoop->wsFlags; + if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_ONETABLE_ONLY) ) return 0; + + isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 + || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) + || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX)); + + sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); + sqlite3StrAccumAppendAll(&str, isSearch ? "SEARCH" : "SCAN"); + if( pItem->pSelect ){ + sqlite3XPrintf(&str, 0, " SUBQUERY %d", pItem->iSelectId); + }else{ + sqlite3XPrintf(&str, 0, " TABLE %s", pItem->zName); + } + + if( pItem->zAlias ){ + sqlite3XPrintf(&str, 0, " AS %s", pItem->zAlias); + } + if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ + const char *zFmt = 0; + Index *pIdx; + + assert( pLoop->u.btree.pIndex!=0 ); + pIdx = pLoop->u.btree.pIndex; + assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); + if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ + if( isSearch ){ + zFmt = "PRIMARY KEY"; + } + }else if( flags & WHERE_PARTIALIDX ){ + zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; + }else if( flags & WHERE_AUTO_INDEX ){ + zFmt = "AUTOMATIC COVERING INDEX"; + }else if( flags & WHERE_IDX_ONLY ){ + zFmt = "COVERING INDEX %s"; + }else{ + zFmt = "INDEX %s"; + } + if( zFmt ){ + sqlite3StrAccumAppend(&str, " USING ", 7); + sqlite3XPrintf(&str, 0, zFmt, pIdx->zName); + explainIndexRange(&str, pLoop, pItem->pTab); + } + }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ + const char *zRange; + if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ + zRange = "(rowid=?)"; + }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ + zRange = "(rowid>? AND rowid?)"; + }else{ + assert( flags&WHERE_TOP_LIMIT); + zRange = "(rowidu.vtab.idxNum, pLoop->u.vtab.idxStr); + } +#endif +#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS + if( pLoop->nOut>=10 ){ + sqlite3XPrintf(&str, 0, " (~%llu rows)", sqlite3LogEstToInt(pLoop->nOut)); + }else{ + sqlite3StrAccumAppend(&str, " (~1 row)", 9); + } +#endif + zMsg = sqlite3StrAccumFinish(&str); + ret = sqlite3VdbeAddOp4(v, OP_Explain, iId, iLevel, iFrom, zMsg,P4_DYNAMIC); + } + return ret; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Configure the VM passed as the first argument with an +** sqlite3_stmt_scanstatus() entry corresponding to the scan used to +** implement level pLvl. Argument pSrclist is a pointer to the FROM +** clause that the scan reads data from. +** +** If argument addrExplain is not 0, it must be the address of an +** OP_Explain instruction that describes the same loop. +*/ +void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +){ + const char *zObj = 0; + WhereLoop *pLoop = pLvl->pWLoop; + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ + zObj = pLoop->u.btree.pIndex->zName; + }else{ + zObj = pSrclist->a[pLvl->iFrom].zName; + } + sqlite3VdbeScanStatus( + v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj + ); +} +#endif + + +/* +** Disable a term in the WHERE clause. Except, do not disable the term +** if it controls a LEFT OUTER JOIN and it did not originate in the ON +** or USING clause of that join. +** +** Consider the term t2.z='ok' in the following queries: +** +** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok' +** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok' +** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok' +** +** The t2.z='ok' is disabled in the in (2) because it originates +** in the ON clause. The term is disabled in (3) because it is not part +** of a LEFT OUTER JOIN. In (1), the term is not disabled. +** +** Disabling a term causes that term to not be tested in the inner loop +** of the join. Disabling is an optimization. When terms are satisfied +** by indices, we disable them to prevent redundant tests in the inner +** loop. We would get the correct results if nothing were ever disabled, +** but joins might run a little slower. The trick is to disable as much +** as we can without disabling too much. If we disabled in (1), we'd get +** the wrong answer. See ticket #813. +** +** If all the children of a term are disabled, then that term is also +** automatically disabled. In this way, terms get disabled if derived +** virtual terms are tested first. For example: +** +** x GLOB 'abc*' AND x>='abc' AND x<'acd' +** \___________/ \______/ \_____/ +** parent child1 child2 +** +** Only the parent term was in the original WHERE clause. The child1 +** and child2 terms were added by the LIKE optimization. If both of +** the virtual child terms are valid, then testing of the parent can be +** skipped. +** +** Usually the parent term is marked as TERM_CODED. But if the parent +** term was originally TERM_LIKE, then the parent gets TERM_LIKECOND instead. +** The TERM_LIKECOND marking indicates that the term should be coded inside +** a conditional such that is only evaluated on the second pass of a +** LIKE-optimization loop, when scanning BLOBs instead of strings. +*/ +static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ + int nLoop = 0; + while( pTerm + && (pTerm->wtFlags & TERM_CODED)==0 + && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pLevel->notReady & pTerm->prereqAll)==0 + ){ + if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ + pTerm->wtFlags |= TERM_LIKECOND; + }else{ + pTerm->wtFlags |= TERM_CODED; + } + if( pTerm->iParent<0 ) break; + pTerm = &pTerm->pWC->a[pTerm->iParent]; + pTerm->nChild--; + if( pTerm->nChild!=0 ) break; + nLoop++; + } +} + +/* +** Code an OP_Affinity opcode to apply the column affinity string zAff +** to the n registers starting at base. +** +** As an optimization, SQLITE_AFF_BLOB entries (which are no-ops) at the +** beginning and end of zAff are ignored. If all entries in zAff are +** SQLITE_AFF_BLOB, then no code gets generated. +** +** This routine makes its own copy of zAff so that the caller is free +** to modify zAff after this routine returns. +*/ +static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ + Vdbe *v = pParse->pVdbe; + if( zAff==0 ){ + assert( pParse->db->mallocFailed ); + return; + } + assert( v!=0 ); + + /* Adjust base and n to skip over SQLITE_AFF_BLOB entries at the beginning + ** and end of the affinity string. + */ + while( n>0 && zAff[0]==SQLITE_AFF_BLOB ){ + n--; + base++; + zAff++; + } + while( n>1 && zAff[n-1]==SQLITE_AFF_BLOB ){ + n--; + } + + /* Code the OP_Affinity opcode if there is anything left to do. */ + if( n>0 ){ + sqlite3VdbeAddOp2(v, OP_Affinity, base, n); + sqlite3VdbeChangeP4(v, -1, zAff, n); + sqlite3ExprCacheAffinityChange(pParse, base, n); + } +} + + +/* +** Generate code for a single equality term of the WHERE clause. An equality +** term can be either X=expr or X IN (...). pTerm is the term to be +** coded. +** +** The current value for the constraint is left in register iReg. +** +** For a constraint of the form X=expr, the expression is evaluated and its +** result is left on the stack. For constraints of the form X IN (...) +** this routine sets up a loop that will iterate over all values of X. +*/ +static int codeEqualityTerm( + Parse *pParse, /* The parsing context */ + WhereTerm *pTerm, /* The term of the WHERE clause to be coded */ + WhereLevel *pLevel, /* The level of the FROM clause we are working on */ + int iEq, /* Index of the equality term within this level */ + int bRev, /* True for reverse-order IN operations */ + int iTarget /* Attempt to leave results in this register */ +){ + Expr *pX = pTerm->pExpr; + Vdbe *v = pParse->pVdbe; + int iReg; /* Register holding results */ + + assert( iTarget>0 ); + if( pX->op==TK_EQ || pX->op==TK_IS ){ + iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); + }else if( pX->op==TK_ISNULL ){ + iReg = iTarget; + sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); +#ifndef SQLITE_OMIT_SUBQUERY + }else{ + int eType; + int iTab; + struct InLoop *pIn; + WhereLoop *pLoop = pLevel->pWLoop; + + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 + && pLoop->u.btree.pIndex!=0 + && pLoop->u.btree.pIndex->aSortOrder[iEq] + ){ + testcase( iEq==0 ); + testcase( bRev ); + bRev = !bRev; + } + assert( pX->op==TK_IN ); + iReg = iTarget; + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0); + if( eType==IN_INDEX_INDEX_DESC ){ + testcase( bRev ); + bRev = !bRev; + } + iTab = pX->iTable; + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); + VdbeCoverageIf(v, bRev); + VdbeCoverageIf(v, !bRev); + assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); + pLoop->wsFlags |= WHERE_IN_ABLE; + if( pLevel->u.in.nIn==0 ){ + pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + } + pLevel->u.in.nIn++; + pLevel->u.in.aInLoop = + sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + pIn = pLevel->u.in.aInLoop; + if( pIn ){ + pIn += pLevel->u.in.nIn - 1; + pIn->iCur = iTab; + if( eType==IN_INDEX_ROWID ){ + pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iReg); + }else{ + pIn->addrInTop = sqlite3VdbeAddOp3(v, OP_Column, iTab, 0, iReg); + } + pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen; + sqlite3VdbeAddOp1(v, OP_IsNull, iReg); VdbeCoverage(v); + }else{ + pLevel->u.in.nIn = 0; + } +#endif + } + disableTerm(pLevel, pTerm); + return iReg; +} + +/* +** Generate code that will evaluate all == and IN constraints for an +** index scan. +** +** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). +** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 +** The index has as many as three equality constraints, but in this +** example, the third "c" value is an inequality. So only two +** constraints are coded. This routine will generate code to evaluate +** a==5 and b IN (1,2,3). The current values for a and b will be stored +** in consecutive registers and the index of the first register is returned. +** +** In the example above nEq==2. But this subroutine works for any value +** of nEq including 0. If nEq==0, this routine is nearly a no-op. +** The only thing it does is allocate the pLevel->iMem memory cell and +** compute the affinity string. +** +** The nExtraReg parameter is 0 or 1. It is 0 if all WHERE clause constraints +** are == or IN and are covered by the nEq. nExtraReg is 1 if there is +** an inequality constraint (such as the "c>=5 AND c<10" in the example) that +** occurs after the nEq quality constraints. +** +** This routine allocates a range of nEq+nExtraReg memory cells and returns +** the index of the first memory cell in that range. The code that +** calls this routine will use that memory range to store keys for +** start and termination conditions of the loop. +** key value of the loop. If one or more IN operators appear, then +** this routine allocates an additional nEq memory cells for internal +** use. +** +** Before returning, *pzAff is set to point to a buffer containing a +** copy of the column affinity string of the index allocated using +** sqlite3DbMalloc(). Except, entries in the copy of the string associated +** with equality constraints that use BLOB or NONE affinity are set to +** SQLITE_AFF_BLOB. This is to deal with SQL such as the following: +** +** CREATE TABLE t1(a TEXT PRIMARY KEY, b); +** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b; +** +** In the example above, the index on t1(a) has TEXT affinity. But since +** the right hand side of the equality constraint (t2.b) has BLOB/NONE affinity, +** no conversion should be attempted before using a t2.b value as part of +** a key to search the index. Hence the first byte in the returned affinity +** string in this example would be set to SQLITE_AFF_BLOB. +*/ +static int codeAllEqualityTerms( + Parse *pParse, /* Parsing context */ + WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */ + int bRev, /* Reverse the order of IN operators */ + int nExtraReg, /* Number of extra registers to allocate */ + char **pzAff /* OUT: Set to point to affinity string */ +){ + u16 nEq; /* The number of == or IN constraints to code */ + u16 nSkip; /* Number of left-most columns to skip */ + Vdbe *v = pParse->pVdbe; /* The vm under construction */ + Index *pIdx; /* The index being used for this loop */ + WhereTerm *pTerm; /* A single constraint term */ + WhereLoop *pLoop; /* The WhereLoop object */ + int j; /* Loop counter */ + int regBase; /* Base register */ + int nReg; /* Number of registers to allocate */ + char *zAff; /* Affinity string to return */ + + /* This module is only called on query plans that use an index. */ + pLoop = pLevel->pWLoop; + assert( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ); + nEq = pLoop->u.btree.nEq; + nSkip = pLoop->nSkip; + pIdx = pLoop->u.btree.pIndex; + assert( pIdx!=0 ); + + /* Figure out how many memory cells we will need then allocate them. + */ + regBase = pParse->nMem + 1; + nReg = pLoop->u.btree.nEq + nExtraReg; + pParse->nMem += nReg; + + zAff = sqlite3DbStrDup(pParse->db, sqlite3IndexAffinityStr(v, pIdx)); + if( !zAff ){ + pParse->db->mallocFailed = 1; + } + + if( nSkip ){ + int iIdxCur = pLevel->iIdxCur; + sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); + j = sqlite3VdbeAddOp0(v, OP_Goto); + pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), + iIdxCur, 0, regBase, nSkip); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + sqlite3VdbeJumpHere(v, j); + for(j=0; jaiColumn[j]>=0 ); + VdbeComment((v, "%s", pIdx->pTable->aCol[pIdx->aiColumn[j]].zName)); + } + } + + /* Evaluate the equality constraints + */ + assert( zAff==0 || (int)strlen(zAff)>=nEq ); + for(j=nSkip; jaLTerm[j]; + assert( pTerm!=0 ); + /* The following testcase is true for indices with redundant columns. + ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ + testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j); + if( r1!=regBase+j ){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, regBase); + regBase = r1; + }else{ + sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j); + } + } + testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_IN ); + if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){ + Expr *pRight = pTerm->pExpr->pRight; + if( (pTerm->wtFlags & TERM_IS)==0 && sqlite3ExprCanBeNull(pRight) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); + VdbeCoverage(v); + } + if( zAff ){ + if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ + zAff[j] = SQLITE_AFF_BLOB; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ + zAff[j] = SQLITE_AFF_BLOB; + } + } + } + } + *pzAff = zAff; + return regBase; +} + +/* +** If the most recently coded instruction is a constant range contraint +** that originated from the LIKE optimization, then change the P3 to be +** pLoop->iLikeRepCntr and set P5. +** +** The LIKE optimization trys to evaluate "x LIKE 'abc%'" as a range +** expression: "x>='ABC' AND x<'abd'". But this requires that the range +** scan loop run twice, once for strings and a second time for BLOBs. +** The OP_String opcodes on the second pass convert the upper and lower +** bound string contants to blobs. This routine makes the necessary changes +** to the OP_String opcodes for that to happen. +*/ +static void whereLikeOptimizationStringFixup( + Vdbe *v, /* prepared statement under construction */ + WhereLevel *pLevel, /* The loop that contains the LIKE operator */ + WhereTerm *pTerm /* The upper or lower bound just coded */ +){ + if( pTerm->wtFlags & TERM_LIKEOPT ){ + VdbeOp *pOp; + assert( pLevel->iLikeRepCntr>0 ); + pOp = sqlite3VdbeGetOp(v, -1); + assert( pOp!=0 ); + assert( pOp->opcode==OP_String8 + || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); + pOp->p3 = pLevel->iLikeRepCntr; + pOp->p5 = 1; + } +} + + +/* +** Generate code for the start of the iLevel-th loop in the WHERE clause +** implementation described by pWInfo. +*/ +Bitmask sqlite3WhereCodeOneLoopStart( + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + Bitmask notReady /* Which tables are currently available */ +){ + int j, k; /* Loop counters */ + int iCur; /* The VDBE cursor for the table */ + int addrNxt; /* Where to jump to continue with the next IN case */ + int omitTable; /* True if we use the index only */ + int bRev; /* True if we need to scan in reverse order */ + WhereLevel *pLevel; /* The where level to be coded */ + WhereLoop *pLoop; /* The WhereLoop object being coded */ + WhereClause *pWC; /* Decomposition of the entire WHERE clause */ + WhereTerm *pTerm; /* A WHERE clause term */ + Parse *pParse; /* Parsing context */ + sqlite3 *db; /* Database connection */ + Vdbe *v; /* The prepared stmt under constructions */ + struct SrcList_item *pTabItem; /* FROM clause term being coded */ + int addrBrk; /* Jump here to break out of the loop */ + int addrCont; /* Jump here to continue with next cycle */ + int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ + int iReleaseReg = 0; /* Temp register to free before returning */ + + pParse = pWInfo->pParse; + v = pParse->pVdbe; + pWC = &pWInfo->sWC; + db = pParse->db; + pLevel = &pWInfo->a[iLevel]; + pLoop = pLevel->pWLoop; + pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + iCur = pTabItem->iCursor; + pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); + bRev = (pWInfo->revMask>>iLevel)&1; + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_FORCE_TABLE)==0; + VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); + + /* Create labels for the "break" and "continue" instructions + ** for the current loop. Jump to addrBrk to break out of a loop. + ** Jump to cont to go immediately to the next iteration of the + ** loop. + ** + ** When there is an IN operator, we also have a "addrNxt" label that + ** means to continue with the next IN value combination. When + ** there are no IN operators in the constraints, the "addrNxt" label + ** is the same as "addrBrk". + */ + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); + + /* If this is the right table of a LEFT OUTER JOIN, allocate and + ** initialize a memory cell that records if this table matches any + ** row of the left table of the join. + */ + if( pLevel->iFrom>0 && (pTabItem[0].jointype & JT_LEFT)!=0 ){ + pLevel->iLeftJoin = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); + VdbeComment((v, "init LEFT JOIN no-match flag")); + } + + /* Special case of a FROM clause subquery implemented as a co-routine */ + if( pTabItem->viaCoroutine ){ + int regYield = pTabItem->regReturn; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); + VdbeCoverage(v); + VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); + pLevel->op = OP_Goto; + }else + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + /* Case 1: The table is a virtual-table. Use the VFilter and VNext + ** to access the data. + */ + int iReg; /* P3 Value for OP_VFilter */ + int addrNotFound; + int nConstraint = pLoop->nLTerm; + + sqlite3ExprCachePush(pParse); + iReg = sqlite3GetTempRange(pParse, nConstraint+2); + addrNotFound = pLevel->addrBrk; + for(j=0; jaLTerm[j]; + if( pTerm==0 ) continue; + if( pTerm->eOperator & WO_IN ){ + codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); + addrNotFound = pLevel->addrNxt; + }else{ + sqlite3ExprCode(pParse, pTerm->pExpr->pRight, iTarget); + } + } + sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); + sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); + sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, + pLoop->u.vtab.idxStr, + pLoop->u.vtab.needFree ? P4_MPRINTF : P4_STATIC); + VdbeCoverage(v); + pLoop->u.vtab.needFree = 0; + for(j=0; ju.vtab.omitMask>>j)&1 ){ + disableTerm(pLevel, pLoop->aLTerm[j]); + } + } + pLevel->op = OP_VNext; + pLevel->p1 = iCur; + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); + sqlite3ExprCachePop(pParse); + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_EQ))!=0 + ){ + /* Case 2: We can directly reference a single row using an + ** equality comparison against the ROWID field. Or + ** we reference multiple rows using a "rowid IN (...)" + ** construct. + */ + assert( pLoop->u.btree.nEq==1 ); + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->pExpr!=0 ); + assert( omitTable==0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + iReleaseReg = ++pParse->nMem; + iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); + if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); + addrNxt = pLevel->addrNxt; + sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt); VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addrNxt, iRowidReg); + VdbeCoverage(v); + sqlite3ExprCacheAffinityChange(pParse, iRowidReg, 1); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + VdbeComment((v, "pk")); + pLevel->op = OP_Noop; + }else if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 + ){ + /* Case 3: We have an inequality comparison against the ROWID field. + */ + int testOp = OP_Noop; + int start; + int memEndValue = 0; + WhereTerm *pStart, *pEnd; + + assert( omitTable==0 ); + j = 0; + pStart = pEnd = 0; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; + if( pLoop->wsFlags & WHERE_TOP_LIMIT ) pEnd = pLoop->aLTerm[j++]; + assert( pStart!=0 || pEnd!=0 ); + if( bRev ){ + pTerm = pStart; + pStart = pEnd; + pEnd = pTerm; + } + if( pStart ){ + Expr *pX; /* The expression that defines the start bound */ + int r1, rTemp; /* Registers for holding the start boundary */ + + /* The following constant maps TK_xx codes into corresponding + ** seek opcodes. It depends on a particular ordering of TK_xx + */ + const u8 aMoveOp[] = { + /* TK_GT */ OP_SeekGT, + /* TK_LE */ OP_SeekLE, + /* TK_LT */ OP_SeekLT, + /* TK_GE */ OP_SeekGE + }; + assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ + assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ + assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ + + assert( (pStart->wtFlags & TERM_VNULL)==0 ); + testcase( pStart->wtFlags & TERM_VIRTUAL ); + pX = pStart->pExpr; + assert( pX!=0 ); + testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ + r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); + sqlite3VdbeAddOp3(v, aMoveOp[pX->op-TK_GT], iCur, addrBrk, r1); + VdbeComment((v, "pk")); + VdbeCoverageIf(v, pX->op==TK_GT); + VdbeCoverageIf(v, pX->op==TK_LE); + VdbeCoverageIf(v, pX->op==TK_LT); + VdbeCoverageIf(v, pX->op==TK_GE); + sqlite3ExprCacheAffinityChange(pParse, r1, 1); + sqlite3ReleaseTempReg(pParse, rTemp); + disableTerm(pLevel, pStart); + }else{ + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + } + if( pEnd ){ + Expr *pX; + pX = pEnd->pExpr; + assert( pX!=0 ); + assert( (pEnd->wtFlags & TERM_VNULL)==0 ); + testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */ + testcase( pEnd->wtFlags & TERM_VIRTUAL ); + memEndValue = ++pParse->nMem; + sqlite3ExprCode(pParse, pX->pRight, memEndValue); + if( pX->op==TK_LT || pX->op==TK_GT ){ + testOp = bRev ? OP_Le : OP_Ge; + }else{ + testOp = bRev ? OP_Lt : OP_Gt; + } + disableTerm(pLevel, pEnd); + } + start = sqlite3VdbeCurrentAddr(v); + pLevel->op = bRev ? OP_Prev : OP_Next; + pLevel->p1 = iCur; + pLevel->p2 = start; + assert( pLevel->p5==0 ); + if( testOp!=OP_Noop ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); + VdbeCoverageIf(v, testOp==OP_Le); + VdbeCoverageIf(v, testOp==OP_Lt); + VdbeCoverageIf(v, testOp==OP_Ge); + VdbeCoverageIf(v, testOp==OP_Gt); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); + } + }else if( pLoop->wsFlags & WHERE_INDEXED ){ + /* Case 4: A scan using an index. + ** + ** The WHERE clause may contain zero or more equality + ** terms ("==" or "IN" operators) that refer to the N + ** left-most columns of the index. It may also contain + ** inequality constraints (>, <, >= or <=) on the indexed + ** column that immediately follows the N equalities. Only + ** the right-most column can be an inequality - the rest must + ** use the "==" and "IN" operators. For example, if the + ** index is on (x,y,z), then the following clauses are all + ** optimized: + ** + ** x=5 + ** x=5 AND y=10 + ** x=5 AND y<10 + ** x=5 AND y>5 AND y<10 + ** x=5 AND y=5 AND z<=10 + ** + ** The z<10 term of the following cannot be used, only + ** the x=5 term: + ** + ** x=5 AND z<10 + ** + ** N may be zero if there are inequality constraints. + ** If there are no inequality constraints, then N is at + ** least one. + ** + ** This case is also used when there are no WHERE clause + ** constraints but an index is selected anyway, in order + ** to force the output order to conform to an ORDER BY. + */ + static const u8 aStartOp[] = { + 0, + 0, + OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ + OP_Last, /* 3: (!start_constraints && startEq && bRev) */ + OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ + OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ + OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ + OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ + }; + static const u8 aEndOp[] = { + OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ + OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ + OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ + OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ + }; + u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ + int regBase; /* Base register holding constraint values */ + WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ + WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ + int startEq; /* True if range start uses ==, >= or <= */ + int endEq; /* True if range end uses ==, >= or <= */ + int start_constraints; /* Start of range is constrained */ + int nConstraint; /* Number of constraint terms */ + Index *pIdx; /* The index we will be using */ + int iIdxCur; /* The VDBE cursor for the index */ + int nExtraReg = 0; /* Number of extra registers needed */ + int op; /* Instruction opcode */ + char *zStartAff; /* Affinity for start of range constraint */ + char cEndAff = 0; /* Affinity for end of range constraint */ + u8 bSeekPastNull = 0; /* True to seek past initial nulls */ + u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + + pIdx = pLoop->u.btree.pIndex; + iIdxCur = pLevel->iIdxCur; + assert( nEq>=pLoop->nSkip ); + + /* If this loop satisfies a sort order (pOrderBy) request that + ** was passed to this function to implement a "SELECT min(x) ..." + ** query, then the caller will only allow the loop to run for + ** a single iteration. This means that the first row returned + ** should not have a NULL value stored in 'x'. If column 'x' is + ** the first one after the nEq equality constraints in the index, + ** this requires some special handling. + */ + assert( pWInfo->pOrderBy==0 + || pWInfo->pOrderBy->nExpr==1 + || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); + if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 + && pWInfo->nOBSat>0 + && (pIdx->nKeyCol>nEq) + ){ + assert( pLoop->nSkip==0 ); + bSeekPastNull = 1; + nExtraReg = 1; + } + + /* Find any inequality constraint terms for the start and end + ** of the range. + */ + j = nEq; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ + pRangeStart = pLoop->aLTerm[j++]; + nExtraReg = 1; + /* Like optimization range constraints always occur in pairs */ + assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || + (pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 ); + } + if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ + pRangeEnd = pLoop->aLTerm[j++]; + nExtraReg = 1; + if( (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0 ){ + assert( pRangeStart!=0 ); /* LIKE opt constraints */ + assert( pRangeStart->wtFlags & TERM_LIKEOPT ); /* occur in pairs */ + pLevel->iLikeRepCntr = ++pParse->nMem; + testcase( bRev ); + testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC ); + sqlite3VdbeAddOp2(v, OP_Integer, + bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC), + pLevel->iLikeRepCntr); + VdbeComment((v, "LIKE loop counter")); + pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v); + } + if( pRangeStart==0 + && (j = pIdx->aiColumn[nEq])>=0 + && pIdx->pTable->aCol[j].notNull==0 + ){ + bSeekPastNull = 1; + } + } + assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); + + /* Generate code to evaluate all constraint terms using == or IN + ** and store the values of those terms in an array of registers + ** starting at regBase. + */ + regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); + assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); + if( zStartAff ) cEndAff = zStartAff[nEq]; + addrNxt = pLevel->addrNxt; + + /* If we are doing a reverse order scan on an ascending index, or + ** a forward order scan on a descending index, interchange the + ** start and end terms (pRangeStart and pRangeEnd). + */ + if( (nEqnKeyCol && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) + || (bRev && pIdx->nKeyCol==nEq) + ){ + SWAP(WhereTerm *, pRangeEnd, pRangeStart); + SWAP(u8, bSeekPastNull, bStopAtNull); + } + + testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); + testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); + startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE); + endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE); + start_constraints = pRangeStart || nEq>0; + + /* Seek the index cursor to the start of the range. */ + nConstraint = nEq; + if( pRangeStart ){ + Expr *pRight = pRangeStart->pExpr->pRight; + sqlite3ExprCode(pParse, pRight, regBase+nEq); + whereLikeOptimizationStringFixup(v, pLevel, pRangeStart); + if( (pRangeStart->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zStartAff ){ + if( sqlite3CompareAffinity(pRight, zStartAff[nEq])==SQLITE_AFF_BLOB){ + /* Since the comparison is to be performed with no conversions + ** applied to the operands, set the affinity to apply to pRight to + ** SQLITE_AFF_BLOB. */ + zStartAff[nEq] = SQLITE_AFF_BLOB; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zStartAff[nEq]) ){ + zStartAff[nEq] = SQLITE_AFF_BLOB; + } + } + nConstraint++; + testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); + }else if( bSeekPastNull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + nConstraint++; + startEq = 0; + start_constraints = 1; + } + codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; + assert( op!=0 ); + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + + /* Load the value for the inequality constraint at the end of the + ** range (if any). + */ + nConstraint = nEq; + if( pRangeEnd ){ + Expr *pRight = pRangeEnd->pExpr->pRight; + sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); + sqlite3ExprCode(pParse, pRight, regBase+nEq); + whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); + if( (pRangeEnd->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( sqlite3CompareAffinity(pRight, cEndAff)!=SQLITE_AFF_BLOB + && !sqlite3ExprNeedsNoAffinityChange(pRight, cEndAff) + ){ + codeApplyAffinity(pParse, regBase+nEq, 1, &cEndAff); + } + nConstraint++; + testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); + }else if( bStopAtNull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + endEq = 0; + nConstraint++; + } + sqlite3DbFree(db, zStartAff); + + /* Top of the loop body */ + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + + /* Check if the index cursor is past the end of the range. */ + if( nConstraint ){ + op = aEndOp[bRev*2 + endEq]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + } + + /* Seek the table cursor, if required */ + disableTerm(pLevel, pRangeStart); + disableTerm(pLevel, pRangeEnd); + if( omitTable ){ + /* pIdx is a covering index. No need to access the main table. */ + }else if( HasRowid(pIdx->pTable) ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + sqlite3VdbeAddOp2(v, OP_Seek, iCur, iRowidReg); /* Deferred seek */ + }else if( iCur!=iIdxCur ){ + Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); + iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; jnKeyCol; j++){ + k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); + } + sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, + iRowidReg, pPk->nKeyCol); VdbeCoverage(v); + } + + /* Record the instruction used to terminate the loop. Disable + ** WHERE clause terms made redundant by the index range scan. + */ + if( pLoop->wsFlags & WHERE_ONEROW ){ + pLevel->op = OP_Noop; + }else if( bRev ){ + pLevel->op = OP_Prev; + }else{ + pLevel->op = OP_Next; + } + pLevel->p1 = iIdxCur; + pLevel->p3 = (pLoop->wsFlags&WHERE_UNQ_WANTED)!=0 ? 1:0; + if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + }else{ + assert( pLevel->p5==0 ); + } + }else + +#ifndef SQLITE_OMIT_OR_OPTIMIZATION + if( pLoop->wsFlags & WHERE_MULTI_OR ){ + /* Case 5: Two or more separately indexed terms connected by OR + ** + ** Example: + ** + ** CREATE TABLE t1(a,b,c,d); + ** CREATE INDEX i1 ON t1(a); + ** CREATE INDEX i2 ON t1(b); + ** CREATE INDEX i3 ON t1(c); + ** + ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13) + ** + ** In the example, there are three indexed terms connected by OR. + ** The top of the loop looks like this: + ** + ** Null 1 # Zero the rowset in reg 1 + ** + ** Then, for each indexed term, the following. The arguments to + ** RowSetTest are such that the rowid of the current row is inserted + ** into the RowSet. If it is already present, control skips the + ** Gosub opcode and jumps straight to the code generated by WhereEnd(). + ** + ** sqlite3WhereBegin() + ** RowSetTest # Insert rowid into rowset + ** Gosub 2 A + ** sqlite3WhereEnd() + ** + ** Following the above, code to terminate the loop. Label A, the target + ** of the Gosub above, jumps to the instruction right after the Goto. + ** + ** Null 1 # Zero the rowset in reg 1 + ** Goto B # The loop is finished. + ** + ** A: # Return data, whatever. + ** + ** Return 2 # Jump back to the Gosub + ** + ** B: + ** + ** Added 2014-05-26: If the table is a WITHOUT ROWID table, then + ** use an ephemeral index instead of a RowSet to record the primary + ** keys of the rows we have already seen. + ** + */ + WhereClause *pOrWc; /* The OR-clause broken out into subterms */ + SrcList *pOrTab; /* Shortened table list or OR-clause generation */ + Index *pCov = 0; /* Potential covering index (or NULL) */ + int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */ + + int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ + int regRowset = 0; /* Register for RowSet object */ + int regRowid = 0; /* Register holding rowid */ + int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ + int iRetInit; /* Address of regReturn init */ + int untestedTerms = 0; /* Some terms not completely tested */ + int ii; /* Loop counter */ + u16 wctrlFlags; /* Flags for sub-WHERE clause */ + Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ + Table *pTab = pTabItem->pTab; + + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->eOperator & WO_OR ); + assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); + pOrWc = &pTerm->u.pOrInfo->wc; + pLevel->op = OP_Return; + pLevel->p1 = regReturn; + + /* Set up a new SrcList in pOrTab containing the table being scanned + ** by this loop in the a[0] slot and all notReady tables in a[1..] slots. + ** This becomes the SrcList in the recursive call to sqlite3WhereBegin(). + */ + if( pWInfo->nLevel>1 ){ + int nNotReady; /* The number of notReady tables */ + struct SrcList_item *origSrc; /* Original list of tables */ + nNotReady = pWInfo->nLevel - iLevel - 1; + pOrTab = sqlite3StackAllocRaw(db, + sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); + if( pOrTab==0 ) return notReady; + pOrTab->nAlloc = (u8)(nNotReady + 1); + pOrTab->nSrc = pOrTab->nAlloc; + memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem)); + origSrc = pWInfo->pTabList->a; + for(k=1; k<=nNotReady; k++){ + memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k])); + } + }else{ + pOrTab = pWInfo->pTabList; + } + + /* Initialize the rowset register to contain NULL. An SQL NULL is + ** equivalent to an empty rowset. Or, create an ephemeral index + ** capable of holding primary keys in the case of a WITHOUT ROWID. + ** + ** Also initialize regReturn to contain the address of the instruction + ** immediately following the OP_Return at the bottom of the loop. This + ** is required in a few obscure LEFT JOIN cases where control jumps + ** over the top of the loop into the body of it. In this case the + ** correct response for the end-of-loop code (the OP_Return) is to + ** fall through to the next instruction, just as an OP_Next does if + ** called on an uninitialized cursor. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + if( HasRowid(pTab) ){ + regRowset = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + regRowset = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, regRowset, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + regRowid = ++pParse->nMem; + } + iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); + + /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y + ** Then for every term xN, evaluate as the subexpression: xN AND z + ** That way, terms in y that are factored into the disjunction will + ** be picked up by the recursive calls to sqlite3WhereBegin() below. + ** + ** Actually, each subexpression is converted to "xN AND w" where w is + ** the "interesting" terms of z - terms that did not originate in the + ** ON or USING clause of a LEFT JOIN, and terms that are usable as + ** indices. + ** + ** This optimization also only applies if the (x1 OR x2 OR ...) term + ** is not contained in the ON clause of a LEFT JOIN. + ** See ticket http://www.sqlite.org/src/info/f2369304e4 + */ + if( pWC->nTerm>1 ){ + int iTerm; + for(iTerm=0; iTermnTerm; iTerm++){ + Expr *pExpr = pWC->a[iTerm].pExpr; + if( &pWC->a[iTerm] == pTerm ) continue; + if( ExprHasProperty(pExpr, EP_FromJoin) ) continue; + if( (pWC->a[iTerm].wtFlags & TERM_VIRTUAL)!=0 ) continue; + if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); + pExpr = sqlite3ExprDup(db, pExpr, 0); + pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); + } + if( pAndExpr ){ + pAndExpr = sqlite3PExpr(pParse, TK_AND, 0, pAndExpr, 0); + } + } + + /* Run a separate WHERE clause for each term of the OR clause. After + ** eliminating duplicates from other WHERE clauses, the action for each + ** sub-WHERE clause is to to invoke the main loop body as a subroutine. + */ + wctrlFlags = WHERE_OMIT_OPEN_CLOSE + | WHERE_FORCE_TABLE + | WHERE_ONETABLE_ONLY + | WHERE_NO_AUTOINDEX; + for(ii=0; iinTerm; ii++){ + WhereTerm *pOrTerm = &pOrWc->a[ii]; + if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ + WhereInfo *pSubWInfo; /* Info for single OR-term scan */ + Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ + int j1 = 0; /* Address of jump operation */ + if( pAndExpr && !ExprHasProperty(pOrExpr, EP_FromJoin) ){ + pAndExpr->pLeft = pOrExpr; + pOrExpr = pAndExpr; + } + /* Loop through table entries that match term pOrTerm. */ + WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); + pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, + wctrlFlags, iCovCur); + assert( pSubWInfo || pParse->nErr || db->mallocFailed ); + if( pSubWInfo ){ + WhereLoop *pSubLoop; + int addrExplain = sqlite3WhereExplainOneScan( + pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0 + ); + sqlite3WhereAddScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain); + + /* This is the sub-WHERE clause body. First skip over + ** duplicate rows from prior sub-WHERE clauses, and record the + ** rowid (or PRIMARY KEY) for the current row so that the same + ** row will be skipped in subsequent sub-WHERE clauses. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + int r; + int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); + if( HasRowid(pTab) ){ + r = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, regRowid, 0); + j1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, r,iSet); + VdbeCoverage(v); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk; + + /* Read the PK into an array of temp registers. */ + r = sqlite3GetTempRange(pParse, nPk); + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumn(pParse, pTab, iCol, iCur, r+iPk, 0); + } + + /* Check if the temp table already contains this key. If so, + ** the row has already been included in the result set and + ** can be ignored (by jumping past the Gosub below). Otherwise, + ** insert the key into the temp table and proceed with processing + ** the row. + ** + ** Use some of the same optimizations as OP_RowSetTest: If iSet + ** is zero, assume that the key cannot already be present in + ** the temp table. And if iSet is -1, assume that there is no + ** need to insert the key into the temp table, as it will never + ** be tested for. */ + if( iSet ){ + j1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); + VdbeCoverage(v); + } + if( iSet>=0 ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regRowset, regRowid, 0); + if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + + /* Release the array of temp registers */ + sqlite3ReleaseTempRange(pParse, r, nPk); + } + } + + /* Invoke the main loop body as a subroutine */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); + + /* Jump here (skipping the main loop body subroutine) if the + ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ + if( j1 ) sqlite3VdbeJumpHere(v, j1); + + /* The pSubWInfo->untestedTerms flag means that this OR term + ** contained one or more AND term from a notReady table. The + ** terms from the notReady table could not be tested and will + ** need to be tested later. + */ + if( pSubWInfo->untestedTerms ) untestedTerms = 1; + + /* If all of the OR-connected terms are optimized using the same + ** index, and the index is opened using the same cursor number + ** by each call to sqlite3WhereBegin() made by this loop, it may + ** be possible to use that index as a covering index. + ** + ** If the call to sqlite3WhereBegin() above resulted in a scan that + ** uses an index, and this is either the first OR-connected term + ** processed or the index is the same as that used by all previous + ** terms, set pCov to the candidate covering index. Otherwise, set + ** pCov to NULL to indicate that no candidate covering index will + ** be available. + */ + pSubLoop = pSubWInfo->a[0].pWLoop; + assert( (pSubLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + if( (pSubLoop->wsFlags & WHERE_INDEXED)!=0 + && (ii==0 || pSubLoop->u.btree.pIndex==pCov) + && (HasRowid(pTab) || !IsPrimaryKeyIndex(pSubLoop->u.btree.pIndex)) + ){ + assert( pSubWInfo->a[0].iIdxCur==iCovCur ); + pCov = pSubLoop->u.btree.pIndex; + wctrlFlags |= WHERE_REOPEN_IDX; + }else{ + pCov = 0; + } + + /* Finish the loop through table entries that match term pOrTerm. */ + sqlite3WhereEnd(pSubWInfo); + } + } + } + pLevel->u.pCovidx = pCov; + if( pCov ) pLevel->iIdxCur = iCovCur; + if( pAndExpr ){ + pAndExpr->pLeft = 0; + sqlite3ExprDelete(db, pAndExpr); + } + sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk); + sqlite3VdbeResolveLabel(v, iLoopBody); + + if( pWInfo->nLevel>1 ) sqlite3StackFree(db, pOrTab); + if( !untestedTerms ) disableTerm(pLevel, pTerm); + }else +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + + { + /* Case 6: There is no usable index. We must do a complete + ** scan of the entire table. + */ + static const u8 aStep[] = { OP_Next, OP_Prev }; + static const u8 aStart[] = { OP_Rewind, OP_Last }; + assert( bRev==0 || bRev==1 ); + if( pTabItem->isRecursive ){ + /* Tables marked isRecursive have only a single row that is stored in + ** a pseudo-cursor. No need to Rewind or Next such cursors. */ + pLevel->op = OP_Noop; + }else{ + pLevel->op = aStep[bRev]; + pLevel->p1 = iCur; + pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + } + } + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pLevel->addrVisit = sqlite3VdbeCurrentAddr(v); +#endif + + /* Insert code to test every subexpression that can be completely + ** computed using the current set of tables. + */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE; + int skipLikeAddr = 0; + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + testcase( pWInfo->untestedTerms==0 + && (pWInfo->wctrlFlags & WHERE_ONETABLE_ONLY)!=0 ); + pWInfo->untestedTerms = 1; + continue; + } + pE = pTerm->pExpr; + assert( pE!=0 ); + if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){ + continue; + } + if( pTerm->wtFlags & TERM_LIKECOND ){ + assert( pLevel->iLikeRepCntr>0 ); + skipLikeAddr = sqlite3VdbeAddOp1(v, OP_IfNot, pLevel->iLikeRepCntr); + VdbeCoverage(v); + } + sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); + if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); + pTerm->wtFlags |= TERM_CODED; + } + + /* Insert code to test for implied constraints based on transitivity + ** of the "==" operator. + ** + ** Example: If the WHERE clause contains "t1.a=t2.b" and "t2.b=123" + ** and we are coding the t1 loop and the t2 loop has not yet coded, + ** then we cannot use the "t1.a=t2.b" constraint, but we can code + ** the implied "t1.a=123" constraint. + */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE, *pEAlt; + WhereTerm *pAlt; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; + if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; + if( pTerm->leftCursor!=iCur ) continue; + if( pLevel->iLeftJoin ) continue; + pE = pTerm->pExpr; + assert( !ExprHasProperty(pE, EP_FromJoin) ); + assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); + pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady, + WO_EQ|WO_IN|WO_IS, 0); + if( pAlt==0 ) continue; + if( pAlt->wtFlags & (TERM_CODED) ) continue; + testcase( pAlt->eOperator & WO_EQ ); + testcase( pAlt->eOperator & WO_IS ); + testcase( pAlt->eOperator & WO_IN ); + VdbeModuleComment((v, "begin transitive constraint")); + pEAlt = sqlite3StackAllocRaw(db, sizeof(*pEAlt)); + if( pEAlt ){ + *pEAlt = *pAlt->pExpr; + pEAlt->pLeft = pE->pLeft; + sqlite3ExprIfFalse(pParse, pEAlt, addrCont, SQLITE_JUMPIFNULL); + sqlite3StackFree(db, pEAlt); + } + } + + /* For a LEFT OUTER JOIN, generate code that will record the fact that + ** at least one row of the right table has matched the left table. + */ + if( pLevel->iLeftJoin ){ + pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); + VdbeComment((v, "record LEFT JOIN hit")); + sqlite3ExprCacheClear(pParse); + for(pTerm=pWC->a, j=0; jnTerm; j++, pTerm++){ + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + assert( pWInfo->untestedTerms ); + continue; + } + assert( pTerm->pExpr ); + sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); + pTerm->wtFlags |= TERM_CODED; + } + } + + return pLevel->notReady; +} diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 0f1f8a4fce..8e7858896a 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -343,6 +343,7 @@ foreach file { update.c vacuum.c vtab.c + wherecode.c where.c parse.c From 6c1f4ef217deae6f288f86cb9b572256024fa97d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 8 Jun 2015 14:23:15 +0000 Subject: [PATCH 10/49] Split more subfunctions of where.c out into a new whereexpr.c source file, for improved maintainability. FossilOrigin-Name: 46ef95c108ad8961f2bf3d2dc839d4fb1fddd770 --- Makefile.in | 8 +- Makefile.msc | 8 +- main.mk | 5 +- manifest | 23 +- manifest.uuid | 2 +- src/where.c | 1240 +----------------------------------------- src/whereInt.h | 17 +- src/whereexpr.c | 1249 +++++++++++++++++++++++++++++++++++++++++++ tool/mksqlite3c.tcl | 1 + 9 files changed, 1306 insertions(+), 1247 deletions(-) create mode 100644 src/whereexpr.c diff --git a/Makefile.in b/Makefile.in index 48dba42e63..ea1715557e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -184,7 +184,8 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ table.lo threads.lo tokenize.lo trigger.lo \ update.lo util.lo vacuum.lo \ vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ - vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo utf.lo vtab.lo + vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo whereexpr.lo \ + utf.lo vtab.lo # Object files for the amalgamation. # @@ -294,6 +295,7 @@ SRC = \ $(TOP)/src/walker.c \ $(TOP)/src/where.c \ $(TOP)/src/wherecode.c \ + $(TOP)/src/whereexpr.c \ $(TOP)/src/whereInt.h # Source code for extensions @@ -456,6 +458,7 @@ TESTSRC2 = \ $(TOP)/src/vdbetrace.c \ $(TOP)/src/where.c \ $(TOP)/src/wherecode.c \ + $(TOP)/src/whereexpr.c \ parse.c \ $(TOP)/ext/fts3/fts3.c \ $(TOP)/ext/fts3/fts3_aux.c \ @@ -854,6 +857,9 @@ where.lo: $(TOP)/src/where.c $(HDR) wherecode.lo: $(TOP)/src/wherecode.c $(HDR) $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/wherecode.c +whereexpr.lo: $(TOP)/src/whereexpr.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/whereexpr.c + tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR) $(LTCOMPILE) -DUSE_TCL_STUBS=1 -c $(TOP)/src/tclsqlite.c diff --git a/Makefile.msc b/Makefile.msc index 6cd1f37b81..11b2097465 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -838,7 +838,8 @@ LIBOBJS0 = vdbe.lo parse.lo alter.lo analyze.lo attach.lo auth.lo \ table.lo threads.lo tokenize.lo trigger.lo \ update.lo util.lo vacuum.lo \ vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ - vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo utf.lo vtab.lo + vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo whereexpr.lo \ + utf.lo vtab.lo # Object files for the amalgamation. # @@ -960,6 +961,7 @@ SRC2 = \ $(TOP)\src\walker.c \ $(TOP)\src\where.c \ $(TOP)\src\wherecode.c \ + $(TOP)\src\whereexpr.c \ $(TOP)\src\whereInt.h # Source code for extensions @@ -1123,6 +1125,7 @@ TESTSRC2 = \ $(TOP)\src\vdbetrace.c \ $(TOP)\src\where.c \ $(TOP)\src\wherecode.c \ + $(TOP)\src\whereexpr.c \ parse.c \ $(TOP)\ext\fts3\fts3.c \ $(TOP)\ext\fts3\fts3_aux.c \ @@ -1535,6 +1538,9 @@ where.lo: $(TOP)\src\where.c $(HDR) wherecode.lo: $(TOP)\src\wherecode.c $(HDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\wherecode.c +whereexpr.lo: $(TOP)\src\whereexpr.c $(HDR) + $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\whereexpr.c + tclsqlite.lo: $(TOP)\src\tclsqlite.c $(HDR) $(LTCOMPILE) $(NO_WARN) -DUSE_TCL_STUBS=1 -DBUILD_sqlite -I$(TCLINCDIR) -c $(TOP)\src\tclsqlite.c diff --git a/main.mk b/main.mk index 71ce38ad32..27d56fb80f 100644 --- a/main.mk +++ b/main.mk @@ -69,7 +69,8 @@ LIBOBJ+= vdbe.o parse.o \ table.o threads.o tokenize.o trigger.o \ update.o userauth.o util.o vacuum.o \ vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o vdbesort.o \ - vdbetrace.o wal.o walker.o where.o wherecode.o utf.o vtab.o + vdbetrace.o wal.o walker.o where.o wherecode.o whereexpr.o \ + utf.o vtab.o @@ -172,6 +173,7 @@ SRC = \ $(TOP)/src/walker.c \ $(TOP)/src/where.c \ $(TOP)/src/wherecode.c \ + $(TOP)/src/whereexpr.c \ $(TOP)/src/whereInt.h # Source code for extensions @@ -339,6 +341,7 @@ TESTSRC2 = \ $(TOP)/src/vdbemem.c \ $(TOP)/src/where.c \ $(TOP)/src/wherecode.c \ + $(TOP)/src/whereexpr.c \ parse.c \ $(TOP)/ext/fts3/fts3.c \ $(TOP)/ext/fts3/fts3_aux.c \ diff --git a/manifest b/manifest index e7b9ade388..0307e1a087 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Split\sout\sthe\sbulk\sof\sthe\sactual\sVDBE\scode\sgeneration\slogic\sfrom\swhere.c\ninto\sa\snew\sfile,\sleaving\sbehind\sthe\sanalysis\slogic.\s\sThis\smakes\sthe\soriginal\nwhere.c\ssmaller\sand\shopefully\seasier\sto\sedit. -D 2015-06-06T20:12:09.183 +C Split\smore\ssubfunctions\sof\swhere.c\sout\sinto\sa\snew\swhereexpr.c\ssource\sfile,\nfor\simproved\smaintainability. +D 2015-06-08T14:23:15.485 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 64136f59edd49b389b5c5d24388e204929b807e5 +F Makefile.in d7bde8e39e88f23c99219e822aaab80a9ce48a53 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc e2f1f95dc4a0af0b9ac3c2ee66878700b71ad93f +F Makefile.msc e4e8cbbe98d77d62b1fed34d95d966d5db2a1b01 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ce0ae95abd7121c534f6917c1c8f2b70d9acd4db @@ -171,7 +171,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk b9e0c806c04739b20f281680f8771bc2e20acd54 +F main.mk 4aed2f4087f3880a92c505fba772f2368d699da5 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk d5e22023b5238985bb54a72d33e0ac71fe4f8a32 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -326,9 +326,10 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c c9d804dcf02388207096e4da19487d9a2a7a9a67 -F src/whereInt.h 40e1d060b6aa02edbb7b8a1f3dfc0cc4ff140881 +F src/where.c a328fcc3342044992644b6a11bf301593b8dafb4 +F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047 F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40 +F src/whereexpr.c 9ce1c9cfedbf80c93c7d899497025ec8256ce652 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 @@ -1248,7 +1249,7 @@ F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 40c287d3f929ece67da6e9e7c49885789960accf F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 69bae8ce4aa52d2ff82d4a8a856bf283ec035b2e -F tool/mksqlite3c.tcl 9f60238b2273048a4089077a43716d3b33a67c51 +F tool/mksqlite3c.tcl 9a4b87e86c6036b285b5f0fe1e4db0c79c4092ab F tool/mksqlite3h.tcl 44730d586c9031638cdd2eb443b801c0d2dbd9f8 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl 3b58b9398f91c7dbf18d49eb87cefeee9efdbce1 @@ -1283,7 +1284,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4f20ac90bce8bd7ba43ef59af5cc4ef7aa282fe8 -R f7b66d3e1070ad2d563a494aba699c70 +P faa0e420e93a2bc1c84df9eb9fef4748d29ce339 +R d7cd77de896255756abb541430f78771 U drh -Z 85351aea272e066665037522f98406f9 +Z 58efdf4d20fca9a444e5c6368ea56c89 diff --git a/manifest.uuid b/manifest.uuid index a3541920e7..1199d6a972 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -faa0e420e93a2bc1c84df9eb9fef4748d29ce339 \ No newline at end of file +46ef95c108ad8961f2bf3d2dc839d4fb1fddd770 \ No newline at end of file diff --git a/src/where.c b/src/where.c index e446f6db8c..5c5022c9f6 100644 --- a/src/where.c +++ b/src/where.c @@ -136,150 +136,6 @@ whereOrInsert_done: return 1; } -/* -** Initialize a preallocated WhereClause structure. -*/ -static void whereClauseInit( - WhereClause *pWC, /* The WhereClause to be initialized */ - WhereInfo *pWInfo /* The WHERE processing context */ -){ - pWC->pWInfo = pWInfo; - pWC->pOuter = 0; - pWC->nTerm = 0; - pWC->nSlot = ArraySize(pWC->aStatic); - pWC->a = pWC->aStatic; -} - -/* Forward reference */ -static void whereClauseClear(WhereClause*); - -/* -** Deallocate all memory associated with a WhereOrInfo object. -*/ -static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ - whereClauseClear(&p->wc); - sqlite3DbFree(db, p); -} - -/* -** Deallocate all memory associated with a WhereAndInfo object. -*/ -static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ - whereClauseClear(&p->wc); - sqlite3DbFree(db, p); -} - -/* -** Deallocate a WhereClause structure. The WhereClause structure -** itself is not freed. This routine is the inverse of whereClauseInit(). -*/ -static void whereClauseClear(WhereClause *pWC){ - int i; - WhereTerm *a; - sqlite3 *db = pWC->pWInfo->pParse->db; - for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){ - if( a->wtFlags & TERM_DYNAMIC ){ - sqlite3ExprDelete(db, a->pExpr); - } - if( a->wtFlags & TERM_ORINFO ){ - whereOrInfoDelete(db, a->u.pOrInfo); - }else if( a->wtFlags & TERM_ANDINFO ){ - whereAndInfoDelete(db, a->u.pAndInfo); - } - } - if( pWC->a!=pWC->aStatic ){ - sqlite3DbFree(db, pWC->a); - } -} - -/* -** Add a single new WhereTerm entry to the WhereClause object pWC. -** The new WhereTerm object is constructed from Expr p and with wtFlags. -** The index in pWC->a[] of the new WhereTerm is returned on success. -** 0 is returned if the new WhereTerm could not be added due to a memory -** allocation error. The memory allocation failure will be recorded in -** the db->mallocFailed flag so that higher-level functions can detect it. -** -** This routine will increase the size of the pWC->a[] array as necessary. -** -** If the wtFlags argument includes TERM_DYNAMIC, then responsibility -** for freeing the expression p is assumed by the WhereClause object pWC. -** This is true even if this routine fails to allocate a new WhereTerm. -** -** WARNING: This routine might reallocate the space used to store -** WhereTerms. All pointers to WhereTerms should be invalidated after -** calling this routine. Such pointers may be reinitialized by referencing -** the pWC->a[] array. -*/ -static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ - WhereTerm *pTerm; - int idx; - testcase( wtFlags & TERM_VIRTUAL ); - if( pWC->nTerm>=pWC->nSlot ){ - WhereTerm *pOld = pWC->a; - sqlite3 *db = pWC->pWInfo->pParse->db; - pWC->a = sqlite3DbMallocRaw(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); - if( pWC->a==0 ){ - if( wtFlags & TERM_DYNAMIC ){ - sqlite3ExprDelete(db, p); - } - pWC->a = pOld; - return 0; - } - memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm); - if( pOld!=pWC->aStatic ){ - sqlite3DbFree(db, pOld); - } - pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); - memset(&pWC->a[pWC->nTerm], 0, sizeof(pWC->a[0])*(pWC->nSlot-pWC->nTerm)); - } - pTerm = &pWC->a[idx = pWC->nTerm++]; - if( p && ExprHasProperty(p, EP_Unlikely) ){ - pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; - }else{ - pTerm->truthProb = 1; - } - pTerm->pExpr = sqlite3ExprSkipCollate(p); - pTerm->wtFlags = wtFlags; - pTerm->pWC = pWC; - pTerm->iParent = -1; - return idx; -} - -/* -** This routine identifies subexpressions in the WHERE clause where -** each subexpression is separated by the AND operator or some other -** operator specified in the op parameter. The WhereClause structure -** is filled with pointers to subexpressions. For example: -** -** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) -** \________/ \_______________/ \________________/ -** slot[0] slot[1] slot[2] -** -** The original WHERE clause in pExpr is unaltered. All this routine -** does is make slot[] entries point to substructure within pExpr. -** -** In the previous sentence and in the diagram, "slot[]" refers to -** the WhereClause.a[] array. The slot[] array grows as needed to contain -** all terms of the WHERE clause. -*/ -static void whereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ - Expr *pE2 = sqlite3ExprSkipCollate(pExpr); - pWC->op = op; - if( pE2==0 ) return; - if( pE2->op!=op ){ - whereClauseInsert(pWC, pExpr, 0); - }else{ - whereSplit(pWC, pE2->pLeft, op); - whereSplit(pWC, pE2->pRight, op); - } -} - -/* -** Initialize a WhereMaskSet object -*/ -#define initMaskSet(P) (P)->n=0 - /* ** Return the bitmask for the given cursor number. Return 0 if ** iCursor is not in the set. @@ -308,140 +164,6 @@ static void createMask(WhereMaskSet *pMaskSet, int iCursor){ pMaskSet->ix[pMaskSet->n++] = iCursor; } -/* -** These routines walk (recursively) an expression tree and generate -** a bitmask indicating which tables are used in that expression -** tree. -*/ -static Bitmask exprListTableUsage(WhereMaskSet*, ExprList*); -static Bitmask exprSelectTableUsage(WhereMaskSet*, Select*); -static Bitmask exprTableUsage(WhereMaskSet *pMaskSet, Expr *p){ - Bitmask mask = 0; - if( p==0 ) return 0; - if( p->op==TK_COLUMN ){ - mask = sqlite3WhereGetMask(pMaskSet, p->iTable); - return mask; - } - mask = exprTableUsage(pMaskSet, p->pRight); - mask |= exprTableUsage(pMaskSet, p->pLeft); - if( ExprHasProperty(p, EP_xIsSelect) ){ - mask |= exprSelectTableUsage(pMaskSet, p->x.pSelect); - }else{ - mask |= exprListTableUsage(pMaskSet, p->x.pList); - } - return mask; -} -static Bitmask exprListTableUsage(WhereMaskSet *pMaskSet, ExprList *pList){ - int i; - Bitmask mask = 0; - if( pList ){ - for(i=0; inExpr; i++){ - mask |= exprTableUsage(pMaskSet, pList->a[i].pExpr); - } - } - return mask; -} -static Bitmask exprSelectTableUsage(WhereMaskSet *pMaskSet, Select *pS){ - Bitmask mask = 0; - while( pS ){ - SrcList *pSrc = pS->pSrc; - mask |= exprListTableUsage(pMaskSet, pS->pEList); - mask |= exprListTableUsage(pMaskSet, pS->pGroupBy); - mask |= exprListTableUsage(pMaskSet, pS->pOrderBy); - mask |= exprTableUsage(pMaskSet, pS->pWhere); - mask |= exprTableUsage(pMaskSet, pS->pHaving); - if( ALWAYS(pSrc!=0) ){ - int i; - for(i=0; inSrc; i++){ - mask |= exprSelectTableUsage(pMaskSet, pSrc->a[i].pSelect); - mask |= exprTableUsage(pMaskSet, pSrc->a[i].pOn); - } - } - pS = pS->pPrior; - } - return mask; -} - -/* -** Return TRUE if the given operator is one of the operators that is -** allowed for an indexable WHERE clause term. The allowed operators are -** "=", "<", ">", "<=", ">=", "IN", and "IS NULL" -*/ -static int allowedOp(int op){ - assert( TK_GT>TK_EQ && TK_GTTK_EQ && TK_LTTK_EQ && TK_LE=TK_EQ && op<=TK_GE) || op==TK_ISNULL || op==TK_IS; -} - -/* -** Commute a comparison operator. Expressions of the form "X op Y" -** are converted into "Y op X". -** -** If left/right precedence rules come into play when determining the -** collating sequence, then COLLATE operators are adjusted to ensure -** that the collating sequence does not change. For example: -** "Y collate NOCASE op X" becomes "X op Y" because any collation sequence on -** the left hand side of a comparison overrides any collation sequence -** attached to the right. For the same reason the EP_Collate flag -** is not commuted. -*/ -static void exprCommute(Parse *pParse, Expr *pExpr){ - u16 expRight = (pExpr->pRight->flags & EP_Collate); - u16 expLeft = (pExpr->pLeft->flags & EP_Collate); - assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN ); - if( expRight==expLeft ){ - /* Either X and Y both have COLLATE operator or neither do */ - if( expRight ){ - /* Both X and Y have COLLATE operators. Make sure X is always - ** used by clearing the EP_Collate flag from Y. */ - pExpr->pRight->flags &= ~EP_Collate; - }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){ - /* Neither X nor Y have COLLATE operators, but X has a non-default - ** collating sequence. So add the EP_Collate marker on X to cause - ** it to be searched first. */ - pExpr->pLeft->flags |= EP_Collate; - } - } - SWAP(Expr*,pExpr->pRight,pExpr->pLeft); - if( pExpr->op>=TK_GT ){ - assert( TK_LT==TK_GT+2 ); - assert( TK_GE==TK_LE+2 ); - assert( TK_GT>TK_EQ ); - assert( TK_GTop>=TK_GT && pExpr->op<=TK_GE ); - pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; - } -} - -/* -** Translate from TK_xx operator to WO_xx bitmask. -*/ -static u16 operatorMask(int op){ - u16 c; - assert( allowedOp(op) ); - if( op==TK_IN ){ - c = WO_IN; - }else if( op==TK_ISNULL ){ - c = WO_ISNULL; - }else if( op==TK_IS ){ - c = WO_IS; - }else{ - assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); - c = (u16)(WO_EQ<<(op-TK_EQ)); - } - assert( op!=TK_ISNULL || c==WO_ISNULL ); - assert( op!=TK_IN || c==WO_IN ); - assert( op!=TK_EQ || c==WO_EQ ); - assert( op!=TK_LT || c==WO_LT ); - assert( op!=TK_LE || c==WO_LE ); - assert( op!=TK_GT || c==WO_GT ); - assert( op!=TK_GE || c==WO_GE ); - assert( op!=TK_IS || c==WO_IS ); - return c; -} - /* ** Advance to the next WhereTerm that matches according to the criteria ** established when the pScan object was initialized by whereScanInit(). @@ -620,952 +342,6 @@ WhereTerm *sqlite3WhereFindTerm( return pResult; } -/* Forward reference */ -static void exprAnalyze(SrcList*, WhereClause*, int); - -/* -** Call exprAnalyze on all terms in a WHERE clause. -** -** Note that exprAnalyze() might add new virtual terms onto the -** end of the WHERE clause. We do not want to analyze these new -** virtual terms, so start analyzing at the end and work forward -** so that the added virtual terms are never processed. -*/ -static void exprAnalyzeAll( - SrcList *pTabList, /* the FROM clause */ - WhereClause *pWC /* the WHERE clause to be analyzed */ -){ - int i; - for(i=pWC->nTerm-1; i>=0; i--){ - exprAnalyze(pTabList, pWC, i); - } -} - -#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION -/* -** Check to see if the given expression is a LIKE or GLOB operator that -** can be optimized using inequality constraints. Return TRUE if it is -** so and false if not. -** -** In order for the operator to be optimizible, the RHS must be a string -** literal that does not begin with a wildcard. The LHS must be a column -** that may only be NULL, a string, or a BLOB, never a number. (This means -** that virtual tables cannot participate in the LIKE optimization.) The -** collating sequence for the column on the LHS must be appropriate for -** the operator. -*/ -static int isLikeOrGlob( - Parse *pParse, /* Parsing and code generating context */ - Expr *pExpr, /* Test this expression */ - Expr **ppPrefix, /* Pointer to TK_STRING expression with pattern prefix */ - int *pisComplete, /* True if the only wildcard is % in the last character */ - int *pnoCase /* True if uppercase is equivalent to lowercase */ -){ - const char *z = 0; /* String on RHS of LIKE operator */ - Expr *pRight, *pLeft; /* Right and left size of LIKE operator */ - ExprList *pList; /* List of operands to the LIKE operator */ - int c; /* One character in z[] */ - int cnt; /* Number of non-wildcard prefix characters */ - char wc[3]; /* Wildcard characters */ - sqlite3 *db = pParse->db; /* Database connection */ - sqlite3_value *pVal = 0; - int op; /* Opcode of pRight */ - - if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){ - return 0; - } -#ifdef SQLITE_EBCDIC - if( *pnoCase ) return 0; -#endif - pList = pExpr->x.pList; - pLeft = pList->a[1].pExpr; - if( pLeft->op!=TK_COLUMN - || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT - || IsVirtual(pLeft->pTab) /* Value might be numeric */ - ){ - /* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must - ** be the name of an indexed column with TEXT affinity. */ - return 0; - } - assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */ - - pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); - op = pRight->op; - if( op==TK_VARIABLE ){ - Vdbe *pReprepare = pParse->pReprepare; - int iCol = pRight->iColumn; - pVal = sqlite3VdbeGetBoundValue(pReprepare, iCol, SQLITE_AFF_BLOB); - if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){ - z = (char *)sqlite3_value_text(pVal); - } - sqlite3VdbeSetVarmask(pParse->pVdbe, iCol); - assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); - }else if( op==TK_STRING ){ - z = pRight->u.zToken; - } - if( z ){ - cnt = 0; - while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ - cnt++; - } - if( cnt!=0 && 255!=(u8)z[cnt-1] ){ - Expr *pPrefix; - *pisComplete = c==wc[0] && z[cnt+1]==0; - pPrefix = sqlite3Expr(db, TK_STRING, z); - if( pPrefix ) pPrefix->u.zToken[cnt] = 0; - *ppPrefix = pPrefix; - if( op==TK_VARIABLE ){ - Vdbe *v = pParse->pVdbe; - sqlite3VdbeSetVarmask(v, pRight->iColumn); - if( *pisComplete && pRight->u.zToken[1] ){ - /* If the rhs of the LIKE expression is a variable, and the current - ** value of the variable means there is no need to invoke the LIKE - ** function, then no OP_Variable will be added to the program. - ** This causes problems for the sqlite3_bind_parameter_name() - ** API. To work around them, add a dummy OP_Variable here. - */ - int r1 = sqlite3GetTempReg(pParse); - sqlite3ExprCodeTarget(pParse, pRight, r1); - sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0); - sqlite3ReleaseTempReg(pParse, r1); - } - } - }else{ - z = 0; - } - } - - sqlite3ValueFree(pVal); - return (z!=0); -} -#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ - - -#ifndef SQLITE_OMIT_VIRTUALTABLE -/* -** Check to see if the given expression is of the form -** -** column MATCH expr -** -** If it is then return TRUE. If not, return FALSE. -*/ -static int isMatchOfColumn( - Expr *pExpr /* Test this expression */ -){ - ExprList *pList; - - if( pExpr->op!=TK_FUNCTION ){ - return 0; - } - if( sqlite3StrICmp(pExpr->u.zToken,"match")!=0 ){ - return 0; - } - pList = pExpr->x.pList; - if( pList->nExpr!=2 ){ - return 0; - } - if( pList->a[1].pExpr->op != TK_COLUMN ){ - return 0; - } - return 1; -} -#endif /* SQLITE_OMIT_VIRTUALTABLE */ - -/* -** If the pBase expression originated in the ON or USING clause of -** a join, then transfer the appropriate markings over to derived. -*/ -static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ - if( pDerived ){ - pDerived->flags |= pBase->flags & EP_FromJoin; - pDerived->iRightJoinTable = pBase->iRightJoinTable; - } -} - -/* -** Mark term iChild as being a child of term iParent -*/ -static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ - pWC->a[iChild].iParent = iParent; - pWC->a[iChild].truthProb = pWC->a[iParent].truthProb; - pWC->a[iParent].nChild++; -} - -/* -** Return the N-th AND-connected subterm of pTerm. Or if pTerm is not -** a conjunction, then return just pTerm when N==0. If N is exceeds -** the number of available subterms, return NULL. -*/ -static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ - if( pTerm->eOperator!=WO_AND ){ - return N==0 ? pTerm : 0; - } - if( Nu.pAndInfo->wc.nTerm ){ - return &pTerm->u.pAndInfo->wc.a[N]; - } - return 0; -} - -/* -** Subterms pOne and pTwo are contained within WHERE clause pWC. The -** two subterms are in disjunction - they are OR-ed together. -** -** If these two terms are both of the form: "A op B" with the same -** A and B values but different operators and if the operators are -** compatible (if one is = and the other is <, for example) then -** add a new virtual AND term to pWC that is the combination of the -** two. -** -** Some examples: -** -** x x<=y -** x=y OR x=y --> x=y -** x<=y OR x x<=y -** -** The following is NOT generated: -** -** xy --> x!=y -*/ -static void whereCombineDisjuncts( - SrcList *pSrc, /* the FROM clause */ - WhereClause *pWC, /* The complete WHERE clause */ - WhereTerm *pOne, /* First disjunct */ - WhereTerm *pTwo /* Second disjunct */ -){ - u16 eOp = pOne->eOperator | pTwo->eOperator; - sqlite3 *db; /* Database connection (for malloc) */ - Expr *pNew; /* New virtual expression */ - int op; /* Operator for the combined expression */ - int idxNew; /* Index in pWC of the next virtual term */ - - if( (pOne->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; - if( (pTwo->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; - if( (eOp & (WO_EQ|WO_LT|WO_LE))!=eOp - && (eOp & (WO_EQ|WO_GT|WO_GE))!=eOp ) return; - assert( pOne->pExpr->pLeft!=0 && pOne->pExpr->pRight!=0 ); - assert( pTwo->pExpr->pLeft!=0 && pTwo->pExpr->pRight!=0 ); - if( sqlite3ExprCompare(pOne->pExpr->pLeft, pTwo->pExpr->pLeft, -1) ) return; - if( sqlite3ExprCompare(pOne->pExpr->pRight, pTwo->pExpr->pRight, -1) )return; - /* If we reach this point, it means the two subterms can be combined */ - if( (eOp & (eOp-1))!=0 ){ - if( eOp & (WO_LT|WO_LE) ){ - eOp = WO_LE; - }else{ - assert( eOp & (WO_GT|WO_GE) ); - eOp = WO_GE; - } - } - db = pWC->pWInfo->pParse->db; - pNew = sqlite3ExprDup(db, pOne->pExpr, 0); - if( pNew==0 ) return; - for(op=TK_EQ; eOp!=(WO_EQ<<(op-TK_EQ)); op++){ assert( opop = op; - idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); - exprAnalyze(pSrc, pWC, idxNew); -} - -#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) -/* -** Analyze a term that consists of two or more OR-connected -** subterms. So in: -** -** ... WHERE (a=5) AND (b=7 OR c=9 OR d=13) AND (d=13) -** ^^^^^^^^^^^^^^^^^^^^ -** -** This routine analyzes terms such as the middle term in the above example. -** A WhereOrTerm object is computed and attached to the term under -** analysis, regardless of the outcome of the analysis. Hence: -** -** WhereTerm.wtFlags |= TERM_ORINFO -** WhereTerm.u.pOrInfo = a dynamically allocated WhereOrTerm object -** -** The term being analyzed must have two or more of OR-connected subterms. -** A single subterm might be a set of AND-connected sub-subterms. -** Examples of terms under analysis: -** -** (A) t1.x=t2.y OR t1.x=t2.z OR t1.y=15 OR t1.z=t3.a+5 -** (B) x=expr1 OR expr2=x OR x=expr3 -** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15) -** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*') -** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6) -** (F) x>A OR (x=A AND y>=B) -** -** CASE 1: -** -** If all subterms are of the form T.C=expr for some single column of C and -** a single table T (as shown in example B above) then create a new virtual -** term that is an equivalent IN expression. In other words, if the term -** being analyzed is: -** -** x = expr1 OR expr2 = x OR x = expr3 -** -** then create a new virtual term like this: -** -** x IN (expr1,expr2,expr3) -** -** CASE 2: -** -** If there are exactly two disjuncts and one side has x>A and the other side -** has x=A (for the same x and A) then add a new virtual conjunct term to the -** WHERE clause of the form "x>=A". Example: -** -** x>A OR (x=A AND y>B) adds: x>=A -** -** The added conjunct can sometimes be helpful in query planning. -** -** CASE 3: -** -** If all subterms are indexable by a single table T, then set -** -** WhereTerm.eOperator = WO_OR -** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T -** -** A subterm is "indexable" if it is of the form -** "T.C " where C is any column of table T and -** is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN". -** A subterm is also indexable if it is an AND of two or more -** subsubterms at least one of which is indexable. Indexable AND -** subterms have their eOperator set to WO_AND and they have -** u.pAndInfo set to a dynamically allocated WhereAndTerm object. -** -** From another point of view, "indexable" means that the subterm could -** potentially be used with an index if an appropriate index exists. -** This analysis does not consider whether or not the index exists; that -** is decided elsewhere. This analysis only looks at whether subterms -** appropriate for indexing exist. -** -** All examples A through E above satisfy case 3. But if a term -** also satisfies case 1 (such as B) we know that the optimizer will -** always prefer case 1, so in that case we pretend that case 3 is not -** satisfied. -** -** It might be the case that multiple tables are indexable. For example, -** (E) above is indexable on tables P, Q, and R. -** -** Terms that satisfy case 3 are candidates for lookup by using -** separate indices to find rowids for each subterm and composing -** the union of all rowids using a RowSet object. This is similar -** to "bitmap indices" in other database engines. -** -** OTHERWISE: -** -** If none of cases 1, 2, or 3 apply, then leave the eOperator set to -** zero. This term is not useful for search. -*/ -static void exprAnalyzeOrTerm( - SrcList *pSrc, /* the FROM clause */ - WhereClause *pWC, /* the complete WHERE clause */ - int idxTerm /* Index of the OR-term to be analyzed */ -){ - WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ - Parse *pParse = pWInfo->pParse; /* Parser context */ - sqlite3 *db = pParse->db; /* Database connection */ - WhereTerm *pTerm = &pWC->a[idxTerm]; /* The term to be analyzed */ - Expr *pExpr = pTerm->pExpr; /* The expression of the term */ - int i; /* Loop counters */ - WhereClause *pOrWc; /* Breakup of pTerm into subterms */ - WhereTerm *pOrTerm; /* A Sub-term within the pOrWc */ - WhereOrInfo *pOrInfo; /* Additional information associated with pTerm */ - Bitmask chngToIN; /* Tables that might satisfy case 1 */ - Bitmask indexable; /* Tables that are indexable, satisfying case 2 */ - - /* - ** Break the OR clause into its separate subterms. The subterms are - ** stored in a WhereClause structure containing within the WhereOrInfo - ** object that is attached to the original OR clause term. - */ - assert( (pTerm->wtFlags & (TERM_DYNAMIC|TERM_ORINFO|TERM_ANDINFO))==0 ); - assert( pExpr->op==TK_OR ); - pTerm->u.pOrInfo = pOrInfo = sqlite3DbMallocZero(db, sizeof(*pOrInfo)); - if( pOrInfo==0 ) return; - pTerm->wtFlags |= TERM_ORINFO; - pOrWc = &pOrInfo->wc; - whereClauseInit(pOrWc, pWInfo); - whereSplit(pOrWc, pExpr, TK_OR); - exprAnalyzeAll(pSrc, pOrWc); - if( db->mallocFailed ) return; - assert( pOrWc->nTerm>=2 ); - - /* - ** Compute the set of tables that might satisfy cases 1 or 3. - */ - indexable = ~(Bitmask)0; - chngToIN = ~(Bitmask)0; - for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0 && indexable; i--, pOrTerm++){ - if( (pOrTerm->eOperator & WO_SINGLE)==0 ){ - WhereAndInfo *pAndInfo; - assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 ); - chngToIN = 0; - pAndInfo = sqlite3DbMallocRaw(db, sizeof(*pAndInfo)); - if( pAndInfo ){ - WhereClause *pAndWC; - WhereTerm *pAndTerm; - int j; - Bitmask b = 0; - pOrTerm->u.pAndInfo = pAndInfo; - pOrTerm->wtFlags |= TERM_ANDINFO; - pOrTerm->eOperator = WO_AND; - pAndWC = &pAndInfo->wc; - whereClauseInit(pAndWC, pWC->pWInfo); - whereSplit(pAndWC, pOrTerm->pExpr, TK_AND); - exprAnalyzeAll(pSrc, pAndWC); - pAndWC->pOuter = pWC; - testcase( db->mallocFailed ); - if( !db->mallocFailed ){ - for(j=0, pAndTerm=pAndWC->a; jnTerm; j++, pAndTerm++){ - assert( pAndTerm->pExpr ); - if( allowedOp(pAndTerm->pExpr->op) ){ - b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); - } - } - } - indexable &= b; - } - }else if( pOrTerm->wtFlags & TERM_COPIED ){ - /* Skip this term for now. We revisit it when we process the - ** corresponding TERM_VIRTUAL term */ - }else{ - Bitmask b; - b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); - if( pOrTerm->wtFlags & TERM_VIRTUAL ){ - WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; - b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pOther->leftCursor); - } - indexable &= b; - if( (pOrTerm->eOperator & WO_EQ)==0 ){ - chngToIN = 0; - }else{ - chngToIN &= b; - } - } - } - - /* - ** Record the set of tables that satisfy case 3. The set might be - ** empty. - */ - pOrInfo->indexable = indexable; - pTerm->eOperator = indexable==0 ? 0 : WO_OR; - - /* For a two-way OR, attempt to implementation case 2. - */ - if( indexable && pOrWc->nTerm==2 ){ - int iOne = 0; - WhereTerm *pOne; - while( (pOne = whereNthSubterm(&pOrWc->a[0],iOne++))!=0 ){ - int iTwo = 0; - WhereTerm *pTwo; - while( (pTwo = whereNthSubterm(&pOrWc->a[1],iTwo++))!=0 ){ - whereCombineDisjuncts(pSrc, pWC, pOne, pTwo); - } - } - } - - /* - ** chngToIN holds a set of tables that *might* satisfy case 1. But - ** we have to do some additional checking to see if case 1 really - ** is satisfied. - ** - ** chngToIN will hold either 0, 1, or 2 bits. The 0-bit case means - ** that there is no possibility of transforming the OR clause into an - ** IN operator because one or more terms in the OR clause contain - ** something other than == on a column in the single table. The 1-bit - ** case means that every term of the OR clause is of the form - ** "table.column=expr" for some single table. The one bit that is set - ** will correspond to the common table. We still need to check to make - ** sure the same column is used on all terms. The 2-bit case is when - ** the all terms are of the form "table1.column=table2.column". It - ** might be possible to form an IN operator with either table1.column - ** or table2.column as the LHS if either is common to every term of - ** the OR clause. - ** - ** Note that terms of the form "table.column1=table.column2" (the - ** same table on both sizes of the ==) cannot be optimized. - */ - if( chngToIN ){ - int okToChngToIN = 0; /* True if the conversion to IN is valid */ - int iColumn = -1; /* Column index on lhs of IN operator */ - int iCursor = -1; /* Table cursor common to all terms */ - int j = 0; /* Loop counter */ - - /* Search for a table and column that appears on one side or the - ** other of the == operator in every subterm. That table and column - ** will be recorded in iCursor and iColumn. There might not be any - ** such table and column. Set okToChngToIN if an appropriate table - ** and column is found but leave okToChngToIN false if not found. - */ - for(j=0; j<2 && !okToChngToIN; j++){ - pOrTerm = pOrWc->a; - for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ - assert( pOrTerm->eOperator & WO_EQ ); - pOrTerm->wtFlags &= ~TERM_OR_OK; - if( pOrTerm->leftCursor==iCursor ){ - /* This is the 2-bit case and we are on the second iteration and - ** current term is from the first iteration. So skip this term. */ - assert( j==1 ); - continue; - } - if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor))==0 ){ - /* This term must be of the form t1.a==t2.b where t2 is in the - ** chngToIN set but t1 is not. This term will be either preceded - ** or follwed by an inverted copy (t2.b==t1.a). Skip this term - ** and use its inversion. */ - testcase( pOrTerm->wtFlags & TERM_COPIED ); - testcase( pOrTerm->wtFlags & TERM_VIRTUAL ); - assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) ); - continue; - } - iColumn = pOrTerm->u.leftColumn; - iCursor = pOrTerm->leftCursor; - break; - } - if( i<0 ){ - /* No candidate table+column was found. This can only occur - ** on the second iteration */ - assert( j==1 ); - assert( IsPowerOfTwo(chngToIN) ); - assert( chngToIN==sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor) ); - break; - } - testcase( j==1 ); - - /* We have found a candidate table and column. Check to see if that - ** table and column is common to every term in the OR clause */ - okToChngToIN = 1; - for(; i>=0 && okToChngToIN; i--, pOrTerm++){ - assert( pOrTerm->eOperator & WO_EQ ); - if( pOrTerm->leftCursor!=iCursor ){ - pOrTerm->wtFlags &= ~TERM_OR_OK; - }else if( pOrTerm->u.leftColumn!=iColumn ){ - okToChngToIN = 0; - }else{ - int affLeft, affRight; - /* If the right-hand side is also a column, then the affinities - ** of both right and left sides must be such that no type - ** conversions are required on the right. (Ticket #2249) - */ - affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight); - affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft); - if( affRight!=0 && affRight!=affLeft ){ - okToChngToIN = 0; - }else{ - pOrTerm->wtFlags |= TERM_OR_OK; - } - } - } - } - - /* At this point, okToChngToIN is true if original pTerm satisfies - ** case 1. In that case, construct a new virtual term that is - ** pTerm converted into an IN operator. - */ - if( okToChngToIN ){ - Expr *pDup; /* A transient duplicate expression */ - ExprList *pList = 0; /* The RHS of the IN operator */ - Expr *pLeft = 0; /* The LHS of the IN operator */ - Expr *pNew; /* The complete IN operator */ - - for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){ - if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue; - assert( pOrTerm->eOperator & WO_EQ ); - assert( pOrTerm->leftCursor==iCursor ); - assert( pOrTerm->u.leftColumn==iColumn ); - pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0); - pList = sqlite3ExprListAppend(pWInfo->pParse, pList, pDup); - pLeft = pOrTerm->pExpr->pLeft; - } - assert( pLeft!=0 ); - pDup = sqlite3ExprDup(db, pLeft, 0); - pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0, 0); - if( pNew ){ - int idxNew; - transferJoinMarkings(pNew, pExpr); - assert( !ExprHasProperty(pNew, EP_xIsSelect) ); - pNew->x.pList = pList; - idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); - testcase( idxNew==0 ); - exprAnalyze(pSrc, pWC, idxNew); - pTerm = &pWC->a[idxTerm]; - markTermAsChild(pWC, idxNew, idxTerm); - }else{ - sqlite3ExprListDelete(db, pList); - } - pTerm->eOperator = WO_NOOP; /* case 1 trumps case 3 */ - } - } -} -#endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */ - -/* -** We already know that pExpr is a binary operator where both operands are -** column references. This routine checks to see if pExpr is an equivalence -** relation: -** 1. The SQLITE_Transitive optimization must be enabled -** 2. Must be either an == or an IS operator -** 3. Not originating in the ON clause of an OUTER JOIN -** 4. The affinities of A and B must be compatible -** 5a. Both operands use the same collating sequence OR -** 5b. The overall collating sequence is BINARY -** If this routine returns TRUE, that means that the RHS can be substituted -** for the LHS anyplace else in the WHERE clause where the LHS column occurs. -** This is an optimization. No harm comes from returning 0. But if 1 is -** returned when it should not be, then incorrect answers might result. -*/ -static int termIsEquivalence(Parse *pParse, Expr *pExpr){ - char aff1, aff2; - CollSeq *pColl; - const char *zColl1, *zColl2; - if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; - if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; - if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; - aff1 = sqlite3ExprAffinity(pExpr->pLeft); - aff2 = sqlite3ExprAffinity(pExpr->pRight); - if( aff1!=aff2 - && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2)) - ){ - return 0; - } - pColl = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight); - if( pColl==0 || sqlite3StrICmp(pColl->zName, "BINARY")==0 ) return 1; - pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - /* Since pLeft and pRight are both a column references, their collating - ** sequence should always be defined. */ - zColl1 = ALWAYS(pColl) ? pColl->zName : 0; - pColl = sqlite3ExprCollSeq(pParse, pExpr->pRight); - zColl2 = ALWAYS(pColl) ? pColl->zName : 0; - return sqlite3StrICmp(zColl1, zColl2)==0; -} - -/* -** The input to this routine is an WhereTerm structure with only the -** "pExpr" field filled in. The job of this routine is to analyze the -** subexpression and populate all the other fields of the WhereTerm -** structure. -** -** If the expression is of the form " X" it gets commuted -** to the standard form of "X ". -** -** If the expression is of the form "X Y" where both X and Y are -** columns, then the original expression is unchanged and a new virtual -** term of the form "Y X" is added to the WHERE clause and -** analyzed separately. The original term is marked with TERM_COPIED -** and the new term is marked with TERM_DYNAMIC (because it's pExpr -** needs to be freed with the WhereClause) and TERM_VIRTUAL (because it -** is a commuted copy of a prior term.) The original term has nChild=1 -** and the copy has idxParent set to the index of the original term. -*/ -static void exprAnalyze( - SrcList *pSrc, /* the FROM clause */ - WhereClause *pWC, /* the WHERE clause */ - int idxTerm /* Index of the term to be analyzed */ -){ - WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ - WhereTerm *pTerm; /* The term to be analyzed */ - WhereMaskSet *pMaskSet; /* Set of table index masks */ - Expr *pExpr; /* The expression to be analyzed */ - Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ - Bitmask prereqAll; /* Prerequesites of pExpr */ - Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ - Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ - int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ - int noCase = 0; /* uppercase equivalent to lowercase */ - int op; /* Top-level operator. pExpr->op */ - Parse *pParse = pWInfo->pParse; /* Parsing context */ - sqlite3 *db = pParse->db; /* Database connection */ - - if( db->mallocFailed ){ - return; - } - pTerm = &pWC->a[idxTerm]; - pMaskSet = &pWInfo->sMaskSet; - pExpr = pTerm->pExpr; - assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); - prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft); - op = pExpr->op; - if( op==TK_IN ){ - assert( pExpr->pRight==0 ); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - pTerm->prereqRight = exprSelectTableUsage(pMaskSet, pExpr->x.pSelect); - }else{ - pTerm->prereqRight = exprListTableUsage(pMaskSet, pExpr->x.pList); - } - }else if( op==TK_ISNULL ){ - pTerm->prereqRight = 0; - }else{ - pTerm->prereqRight = exprTableUsage(pMaskSet, pExpr->pRight); - } - prereqAll = exprTableUsage(pMaskSet, pExpr); - if( ExprHasProperty(pExpr, EP_FromJoin) ){ - Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); - prereqAll |= x; - extraRight = x-1; /* ON clause terms may not be used with an index - ** on left table of a LEFT JOIN. Ticket #3015 */ - } - pTerm->prereqAll = prereqAll; - pTerm->leftCursor = -1; - pTerm->iParent = -1; - pTerm->eOperator = 0; - if( allowedOp(op) ){ - Expr *pLeft = sqlite3ExprSkipCollate(pExpr->pLeft); - Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); - u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV; - if( pLeft->op==TK_COLUMN ){ - pTerm->leftCursor = pLeft->iTable; - pTerm->u.leftColumn = pLeft->iColumn; - pTerm->eOperator = operatorMask(op) & opMask; - } - if( op==TK_IS ) pTerm->wtFlags |= TERM_IS; - if( pRight && pRight->op==TK_COLUMN ){ - WhereTerm *pNew; - Expr *pDup; - u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */ - if( pTerm->leftCursor>=0 ){ - int idxNew; - pDup = sqlite3ExprDup(db, pExpr, 0); - if( db->mallocFailed ){ - sqlite3ExprDelete(db, pDup); - return; - } - idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC); - if( idxNew==0 ) return; - pNew = &pWC->a[idxNew]; - markTermAsChild(pWC, idxNew, idxTerm); - if( op==TK_IS ) pNew->wtFlags |= TERM_IS; - pTerm = &pWC->a[idxTerm]; - pTerm->wtFlags |= TERM_COPIED; - - if( termIsEquivalence(pParse, pDup) ){ - pTerm->eOperator |= WO_EQUIV; - eExtraOp = WO_EQUIV; - } - }else{ - pDup = pExpr; - pNew = pTerm; - } - exprCommute(pParse, pDup); - pLeft = sqlite3ExprSkipCollate(pDup->pLeft); - pNew->leftCursor = pLeft->iTable; - pNew->u.leftColumn = pLeft->iColumn; - testcase( (prereqLeft | extraRight) != prereqLeft ); - pNew->prereqRight = prereqLeft | extraRight; - pNew->prereqAll = prereqAll; - pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; - } - } - -#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION - /* If a term is the BETWEEN operator, create two new virtual terms - ** that define the range that the BETWEEN implements. For example: - ** - ** a BETWEEN b AND c - ** - ** is converted into: - ** - ** (a BETWEEN b AND c) AND (a>=b) AND (a<=c) - ** - ** The two new terms are added onto the end of the WhereClause object. - ** The new terms are "dynamic" and are children of the original BETWEEN - ** term. That means that if the BETWEEN term is coded, the children are - ** skipped. Or, if the children are satisfied by an index, the original - ** BETWEEN term is skipped. - */ - else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){ - ExprList *pList = pExpr->x.pList; - int i; - static const u8 ops[] = {TK_GE, TK_LE}; - assert( pList!=0 ); - assert( pList->nExpr==2 ); - for(i=0; i<2; i++){ - Expr *pNewExpr; - int idxNew; - pNewExpr = sqlite3PExpr(pParse, ops[i], - sqlite3ExprDup(db, pExpr->pLeft, 0), - sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0); - transferJoinMarkings(pNewExpr, pExpr); - idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); - testcase( idxNew==0 ); - exprAnalyze(pSrc, pWC, idxNew); - pTerm = &pWC->a[idxTerm]; - markTermAsChild(pWC, idxNew, idxTerm); - } - } -#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */ - -#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) - /* Analyze a term that is composed of two or more subterms connected by - ** an OR operator. - */ - else if( pExpr->op==TK_OR ){ - assert( pWC->op==TK_AND ); - exprAnalyzeOrTerm(pSrc, pWC, idxTerm); - pTerm = &pWC->a[idxTerm]; - } -#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ - -#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION - /* Add constraints to reduce the search space on a LIKE or GLOB - ** operator. - ** - ** A like pattern of the form "x LIKE 'aBc%'" is changed into constraints - ** - ** x>='ABC' AND x<'abd' AND x LIKE 'aBc%' - ** - ** The last character of the prefix "abc" is incremented to form the - ** termination condition "abd". If case is not significant (the default - ** for LIKE) then the lower-bound is made all uppercase and the upper- - ** bound is made all lowercase so that the bounds also work when comparing - ** BLOBs. - */ - if( pWC->op==TK_AND - && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) - ){ - Expr *pLeft; /* LHS of LIKE/GLOB operator */ - Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */ - Expr *pNewExpr1; - Expr *pNewExpr2; - int idxNew1; - int idxNew2; - const char *zCollSeqName; /* Name of collating sequence */ - const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; - - pLeft = pExpr->x.pList->a[1].pExpr; - pStr2 = sqlite3ExprDup(db, pStr1, 0); - - /* Convert the lower bound to upper-case and the upper bound to - ** lower-case (upper-case is less than lower-case in ASCII) so that - ** the range constraints also work for BLOBs - */ - if( noCase && !pParse->db->mallocFailed ){ - int i; - char c; - pTerm->wtFlags |= TERM_LIKE; - for(i=0; (c = pStr1->u.zToken[i])!=0; i++){ - pStr1->u.zToken[i] = sqlite3Toupper(c); - pStr2->u.zToken[i] = sqlite3Tolower(c); - } - } - - if( !db->mallocFailed ){ - u8 c, *pC; /* Last character before the first wildcard */ - pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; - c = *pC; - if( noCase ){ - /* The point is to increment the last character before the first - ** wildcard. But if we increment '@', that will push it into the - ** alphabetic range where case conversions will mess up the - ** inequality. To avoid this, make sure to also run the full - ** LIKE on all candidate expressions by clearing the isComplete flag - */ - if( c=='A'-1 ) isComplete = 0; - c = sqlite3UpperToLower[c]; - } - *pC = c + 1; - } - zCollSeqName = noCase ? "NOCASE" : "BINARY"; - pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); - pNewExpr1 = sqlite3PExpr(pParse, TK_GE, - sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName), - pStr1, 0); - transferJoinMarkings(pNewExpr1, pExpr); - idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); - testcase( idxNew1==0 ); - exprAnalyze(pSrc, pWC, idxNew1); - pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); - pNewExpr2 = sqlite3PExpr(pParse, TK_LT, - sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), - pStr2, 0); - transferJoinMarkings(pNewExpr2, pExpr); - idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); - testcase( idxNew2==0 ); - exprAnalyze(pSrc, pWC, idxNew2); - pTerm = &pWC->a[idxTerm]; - if( isComplete ){ - markTermAsChild(pWC, idxNew1, idxTerm); - markTermAsChild(pWC, idxNew2, idxTerm); - } - } -#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ - -#ifndef SQLITE_OMIT_VIRTUALTABLE - /* Add a WO_MATCH auxiliary term to the constraint set if the - ** current expression is of the form: column MATCH expr. - ** This information is used by the xBestIndex methods of - ** virtual tables. The native query optimizer does not attempt - ** to do anything with MATCH functions. - */ - if( isMatchOfColumn(pExpr) ){ - int idxNew; - Expr *pRight, *pLeft; - WhereTerm *pNewTerm; - Bitmask prereqColumn, prereqExpr; - - pRight = pExpr->x.pList->a[0].pExpr; - pLeft = pExpr->x.pList->a[1].pExpr; - prereqExpr = exprTableUsage(pMaskSet, pRight); - prereqColumn = exprTableUsage(pMaskSet, pLeft); - if( (prereqExpr & prereqColumn)==0 ){ - Expr *pNewExpr; - pNewExpr = sqlite3PExpr(pParse, TK_MATCH, - 0, sqlite3ExprDup(db, pRight, 0), 0); - idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); - testcase( idxNew==0 ); - pNewTerm = &pWC->a[idxNew]; - pNewTerm->prereqRight = prereqExpr; - pNewTerm->leftCursor = pLeft->iTable; - pNewTerm->u.leftColumn = pLeft->iColumn; - pNewTerm->eOperator = WO_MATCH; - markTermAsChild(pWC, idxNew, idxTerm); - pTerm = &pWC->a[idxTerm]; - pTerm->wtFlags |= TERM_COPIED; - pNewTerm->prereqAll = pTerm->prereqAll; - } - } -#endif /* SQLITE_OMIT_VIRTUALTABLE */ - -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 - /* When sqlite_stat3 histogram data is available an operator of the - ** form "x IS NOT NULL" can sometimes be evaluated more efficiently - ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a - ** virtual term of that form. - ** - ** Note that the virtual term must be tagged with TERM_VNULL. - */ - if( pExpr->op==TK_NOTNULL - && pExpr->pLeft->op==TK_COLUMN - && pExpr->pLeft->iColumn>=0 - && OptimizationEnabled(db, SQLITE_Stat34) - ){ - Expr *pNewExpr; - Expr *pLeft = pExpr->pLeft; - int idxNew; - WhereTerm *pNewTerm; - - pNewExpr = sqlite3PExpr(pParse, TK_GT, - sqlite3ExprDup(db, pLeft, 0), - sqlite3PExpr(pParse, TK_NULL, 0, 0, 0), 0); - - idxNew = whereClauseInsert(pWC, pNewExpr, - TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL); - if( idxNew ){ - pNewTerm = &pWC->a[idxNew]; - pNewTerm->prereqRight = 0; - pNewTerm->leftCursor = pLeft->iTable; - pNewTerm->u.leftColumn = pLeft->iColumn; - pNewTerm->eOperator = WO_GT; - markTermAsChild(pWC, idxNew, idxTerm); - pTerm = &pWC->a[idxTerm]; - pTerm->wtFlags |= TERM_COPIED; - pNewTerm->prereqAll = pTerm->prereqAll; - } - } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ - - /* Prevent ON clause terms of a LEFT JOIN from being used to drive - ** an index for tables to the left of the join. - */ - pTerm->prereqRight |= extraRight; -} - /* ** This function searches pList for an entry that matches the iCol-th column ** of index pIdx. @@ -2938,7 +1714,7 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ sqlite3DbFree(db, pLevel->u.in.aInLoop); } } - whereClauseClear(&pWInfo->sWC); + sqlite3WhereClauseClear(&pWInfo->sWC); while( pWInfo->pLoops ){ WhereLoop *p = pWInfo->pLoops; pWInfo->pLoops = p->pNextLoop; @@ -4456,7 +3232,7 @@ static i8 wherePathSatisfiesOrderBy( Bitmask mTerm; if( MASKBIT(i) & obSat ) continue; p = pOrderBy->a[i].pExpr; - mTerm = exprTableUsage(&pWInfo->sMaskSet,p); + mTerm = sqlite3WhereExprUsage(&pWInfo->sMaskSet,p); if( mTerm==0 && !sqlite3ExprIsConstant(p) ) continue; if( (mTerm&~orderDistinctMask)==0 ){ obSat |= MASKBIT(i); @@ -5169,8 +3945,8 @@ WhereInfo *sqlite3WhereBegin( ** subexpression is separated by an AND operator. */ initMaskSet(pMaskSet); - whereClauseInit(&pWInfo->sWC, pWInfo); - whereSplit(&pWInfo->sWC, pWhere, TK_AND); + sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); + sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); /* Special case: a WHERE clause that is constant. Evaluate the ** expression and either jump over all of the code or fall thru. @@ -5223,7 +3999,7 @@ WhereInfo *sqlite3WhereBegin( #endif /* Analyze all of the subexpressions. */ - exprAnalyzeAll(pTabList, &pWInfo->sWC); + sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); if( db->mallocFailed ) goto whereBeginError; if( wctrlFlags & WHERE_WANT_DISTINCT ){ @@ -5309,8 +4085,10 @@ WhereInfo *sqlite3WhereBegin( && pResultSet!=0 && OptimizationEnabled(db, SQLITE_OmitNoopJoin) ){ - Bitmask tabUsed = exprListTableUsage(pMaskSet, pResultSet); - if( sWLB.pOrderBy ) tabUsed |= exprListTableUsage(pMaskSet, sWLB.pOrderBy); + Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet); + if( sWLB.pOrderBy ){ + tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy); + } while( pWInfo->nLevel>=2 ){ WhereTerm *pTerm, *pEnd; pLoop = pWInfo->a[pWInfo->nLevel-1].pWLoop; diff --git a/src/whereInt.h b/src/whereInt.h index 075deed4a2..8929d8c4be 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -368,6 +368,11 @@ struct WhereMaskSet { int ix[BMS]; /* Cursor assigned to each bit */ }; +/* +** Initialize a WhereMaskSet object +*/ +#define initMaskSet(P) (P)->n=0 + /* ** This object is a convenience wrapper holding all information needed ** to construct WhereLoop objects for a particular query. @@ -421,6 +426,8 @@ struct WhereInfo { /* ** Private interfaces - callable only by other where.c routines. +** +** where.c: */ Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); WhereTerm *sqlite3WhereFindTerm( @@ -431,6 +438,8 @@ WhereTerm *sqlite3WhereFindTerm( u32 op, /* Mask of WO_xx values describing operator */ Index *pIdx /* Must be compatible with this index, if not NULL */ ); + +/* wherecode.c: */ #ifndef SQLITE_OMIT_EXPLAIN int sqlite3WhereExplainOneScan( Parse *pParse, /* Parse context */ @@ -459,7 +468,13 @@ Bitmask sqlite3WhereCodeOneLoopStart( Bitmask notReady /* Which tables are currently available */ ); - +/* whereexpr.c: */ +void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); +void sqlite3WhereClauseClear(WhereClause*); +void sqlite3WhereSplit(WhereClause*,Expr*,u8); +Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*); +Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*); +void sqlite3WhereExprAnalyze(SrcList*, WhereClause*); diff --git a/src/whereexpr.c b/src/whereexpr.c new file mode 100644 index 0000000000..3607ef5352 --- /dev/null +++ b/src/whereexpr.c @@ -0,0 +1,1249 @@ +/* +** 2015-06-08 +** +** 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 module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was originally part of where.c but was split out to improve +** readability and editabiliity. This file contains utility routines for +** analyzing Expr objects in the WHERE clause. +*/ +#include "sqliteInt.h" +#include "whereInt.h" + +/* Forward declarations */ +static void exprAnalyze(SrcList*, WhereClause*, int); + +/* +** Deallocate all memory associated with a WhereOrInfo object. +*/ +static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Deallocate all memory associated with a WhereAndInfo object. +*/ +static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ + sqlite3WhereClauseClear(&p->wc); + sqlite3DbFree(db, p); +} + +/* +** Add a single new WhereTerm entry to the WhereClause object pWC. +** The new WhereTerm object is constructed from Expr p and with wtFlags. +** The index in pWC->a[] of the new WhereTerm is returned on success. +** 0 is returned if the new WhereTerm could not be added due to a memory +** allocation error. The memory allocation failure will be recorded in +** the db->mallocFailed flag so that higher-level functions can detect it. +** +** This routine will increase the size of the pWC->a[] array as necessary. +** +** If the wtFlags argument includes TERM_DYNAMIC, then responsibility +** for freeing the expression p is assumed by the WhereClause object pWC. +** This is true even if this routine fails to allocate a new WhereTerm. +** +** WARNING: This routine might reallocate the space used to store +** WhereTerms. All pointers to WhereTerms should be invalidated after +** calling this routine. Such pointers may be reinitialized by referencing +** the pWC->a[] array. +*/ +static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ + WhereTerm *pTerm; + int idx; + testcase( wtFlags & TERM_VIRTUAL ); + if( pWC->nTerm>=pWC->nSlot ){ + WhereTerm *pOld = pWC->a; + sqlite3 *db = pWC->pWInfo->pParse->db; + pWC->a = sqlite3DbMallocRaw(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); + if( pWC->a==0 ){ + if( wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, p); + } + pWC->a = pOld; + return 0; + } + memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm); + if( pOld!=pWC->aStatic ){ + sqlite3DbFree(db, pOld); + } + pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); + memset(&pWC->a[pWC->nTerm], 0, sizeof(pWC->a[0])*(pWC->nSlot-pWC->nTerm)); + } + pTerm = &pWC->a[idx = pWC->nTerm++]; + if( p && ExprHasProperty(p, EP_Unlikely) ){ + pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; + }else{ + pTerm->truthProb = 1; + } + pTerm->pExpr = sqlite3ExprSkipCollate(p); + pTerm->wtFlags = wtFlags; + pTerm->pWC = pWC; + pTerm->iParent = -1; + return idx; +} + +/* +** Return TRUE if the given operator is one of the operators that is +** allowed for an indexable WHERE clause term. The allowed operators are +** "=", "<", ">", "<=", ">=", "IN", and "IS NULL" +*/ +static int allowedOp(int op){ + assert( TK_GT>TK_EQ && TK_GTTK_EQ && TK_LTTK_EQ && TK_LE=TK_EQ && op<=TK_GE) || op==TK_ISNULL || op==TK_IS; +} + +/* +** Commute a comparison operator. Expressions of the form "X op Y" +** are converted into "Y op X". +** +** If left/right precedence rules come into play when determining the +** collating sequence, then COLLATE operators are adjusted to ensure +** that the collating sequence does not change. For example: +** "Y collate NOCASE op X" becomes "X op Y" because any collation sequence on +** the left hand side of a comparison overrides any collation sequence +** attached to the right. For the same reason the EP_Collate flag +** is not commuted. +*/ +static void exprCommute(Parse *pParse, Expr *pExpr){ + u16 expRight = (pExpr->pRight->flags & EP_Collate); + u16 expLeft = (pExpr->pLeft->flags & EP_Collate); + assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN ); + if( expRight==expLeft ){ + /* Either X and Y both have COLLATE operator or neither do */ + if( expRight ){ + /* Both X and Y have COLLATE operators. Make sure X is always + ** used by clearing the EP_Collate flag from Y. */ + pExpr->pRight->flags &= ~EP_Collate; + }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){ + /* Neither X nor Y have COLLATE operators, but X has a non-default + ** collating sequence. So add the EP_Collate marker on X to cause + ** it to be searched first. */ + pExpr->pLeft->flags |= EP_Collate; + } + } + SWAP(Expr*,pExpr->pRight,pExpr->pLeft); + if( pExpr->op>=TK_GT ){ + assert( TK_LT==TK_GT+2 ); + assert( TK_GE==TK_LE+2 ); + assert( TK_GT>TK_EQ ); + assert( TK_GTop>=TK_GT && pExpr->op<=TK_GE ); + pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; + } +} + +/* +** Translate from TK_xx operator to WO_xx bitmask. +*/ +static u16 operatorMask(int op){ + u16 c; + assert( allowedOp(op) ); + if( op==TK_IN ){ + c = WO_IN; + }else if( op==TK_ISNULL ){ + c = WO_ISNULL; + }else if( op==TK_IS ){ + c = WO_IS; + }else{ + assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); + c = (u16)(WO_EQ<<(op-TK_EQ)); + } + assert( op!=TK_ISNULL || c==WO_ISNULL ); + assert( op!=TK_IN || c==WO_IN ); + assert( op!=TK_EQ || c==WO_EQ ); + assert( op!=TK_LT || c==WO_LT ); + assert( op!=TK_LE || c==WO_LE ); + assert( op!=TK_GT || c==WO_GT ); + assert( op!=TK_GE || c==WO_GE ); + assert( op!=TK_IS || c==WO_IS ); + return c; +} + + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION +/* +** Check to see if the given expression is a LIKE or GLOB operator that +** can be optimized using inequality constraints. Return TRUE if it is +** so and false if not. +** +** In order for the operator to be optimizible, the RHS must be a string +** literal that does not begin with a wildcard. The LHS must be a column +** that may only be NULL, a string, or a BLOB, never a number. (This means +** that virtual tables cannot participate in the LIKE optimization.) The +** collating sequence for the column on the LHS must be appropriate for +** the operator. +*/ +static int isLikeOrGlob( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* Test this expression */ + Expr **ppPrefix, /* Pointer to TK_STRING expression with pattern prefix */ + int *pisComplete, /* True if the only wildcard is % in the last character */ + int *pnoCase /* True if uppercase is equivalent to lowercase */ +){ + const char *z = 0; /* String on RHS of LIKE operator */ + Expr *pRight, *pLeft; /* Right and left size of LIKE operator */ + ExprList *pList; /* List of operands to the LIKE operator */ + int c; /* One character in z[] */ + int cnt; /* Number of non-wildcard prefix characters */ + char wc[3]; /* Wildcard characters */ + sqlite3 *db = pParse->db; /* Database connection */ + sqlite3_value *pVal = 0; + int op; /* Opcode of pRight */ + + if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){ + return 0; + } +#ifdef SQLITE_EBCDIC + if( *pnoCase ) return 0; +#endif + pList = pExpr->x.pList; + pLeft = pList->a[1].pExpr; + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + || IsVirtual(pLeft->pTab) /* Value might be numeric */ + ){ + /* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must + ** be the name of an indexed column with TEXT affinity. */ + return 0; + } + assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */ + + pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); + op = pRight->op; + if( op==TK_VARIABLE ){ + Vdbe *pReprepare = pParse->pReprepare; + int iCol = pRight->iColumn; + pVal = sqlite3VdbeGetBoundValue(pReprepare, iCol, SQLITE_AFF_BLOB); + if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){ + z = (char *)sqlite3_value_text(pVal); + } + sqlite3VdbeSetVarmask(pParse->pVdbe, iCol); + assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); + }else if( op==TK_STRING ){ + z = pRight->u.zToken; + } + if( z ){ + cnt = 0; + while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ + cnt++; + } + if( cnt!=0 && 255!=(u8)z[cnt-1] ){ + Expr *pPrefix; + *pisComplete = c==wc[0] && z[cnt+1]==0; + pPrefix = sqlite3Expr(db, TK_STRING, z); + if( pPrefix ) pPrefix->u.zToken[cnt] = 0; + *ppPrefix = pPrefix; + if( op==TK_VARIABLE ){ + Vdbe *v = pParse->pVdbe; + sqlite3VdbeSetVarmask(v, pRight->iColumn); + if( *pisComplete && pRight->u.zToken[1] ){ + /* If the rhs of the LIKE expression is a variable, and the current + ** value of the variable means there is no need to invoke the LIKE + ** function, then no OP_Variable will be added to the program. + ** This causes problems for the sqlite3_bind_parameter_name() + ** API. To work around them, add a dummy OP_Variable here. + */ + int r1 = sqlite3GetTempReg(pParse); + sqlite3ExprCodeTarget(pParse, pRight, r1); + sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0); + sqlite3ReleaseTempReg(pParse, r1); + } + } + }else{ + z = 0; + } + } + + sqlite3ValueFree(pVal); + return (z!=0); +} +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Check to see if the given expression is of the form +** +** column MATCH expr +** +** If it is then return TRUE. If not, return FALSE. +*/ +static int isMatchOfColumn( + Expr *pExpr /* Test this expression */ +){ + ExprList *pList; + + if( pExpr->op!=TK_FUNCTION ){ + return 0; + } + if( sqlite3StrICmp(pExpr->u.zToken,"match")!=0 ){ + return 0; + } + pList = pExpr->x.pList; + if( pList->nExpr!=2 ){ + return 0; + } + if( pList->a[1].pExpr->op != TK_COLUMN ){ + return 0; + } + return 1; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/* +** If the pBase expression originated in the ON or USING clause of +** a join, then transfer the appropriate markings over to derived. +*/ +static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ + if( pDerived ){ + pDerived->flags |= pBase->flags & EP_FromJoin; + pDerived->iRightJoinTable = pBase->iRightJoinTable; + } +} + +/* +** Mark term iChild as being a child of term iParent +*/ +static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ + pWC->a[iChild].iParent = iParent; + pWC->a[iChild].truthProb = pWC->a[iParent].truthProb; + pWC->a[iParent].nChild++; +} + +/* +** Return the N-th AND-connected subterm of pTerm. Or if pTerm is not +** a conjunction, then return just pTerm when N==0. If N is exceeds +** the number of available subterms, return NULL. +*/ +static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ + if( pTerm->eOperator!=WO_AND ){ + return N==0 ? pTerm : 0; + } + if( Nu.pAndInfo->wc.nTerm ){ + return &pTerm->u.pAndInfo->wc.a[N]; + } + return 0; +} + +/* +** Subterms pOne and pTwo are contained within WHERE clause pWC. The +** two subterms are in disjunction - they are OR-ed together. +** +** If these two terms are both of the form: "A op B" with the same +** A and B values but different operators and if the operators are +** compatible (if one is = and the other is <, for example) then +** add a new virtual AND term to pWC that is the combination of the +** two. +** +** Some examples: +** +** x x<=y +** x=y OR x=y --> x=y +** x<=y OR x x<=y +** +** The following is NOT generated: +** +** xy --> x!=y +*/ +static void whereCombineDisjuncts( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* The complete WHERE clause */ + WhereTerm *pOne, /* First disjunct */ + WhereTerm *pTwo /* Second disjunct */ +){ + u16 eOp = pOne->eOperator | pTwo->eOperator; + sqlite3 *db; /* Database connection (for malloc) */ + Expr *pNew; /* New virtual expression */ + int op; /* Operator for the combined expression */ + int idxNew; /* Index in pWC of the next virtual term */ + + if( (pOne->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (pTwo->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (eOp & (WO_EQ|WO_LT|WO_LE))!=eOp + && (eOp & (WO_EQ|WO_GT|WO_GE))!=eOp ) return; + assert( pOne->pExpr->pLeft!=0 && pOne->pExpr->pRight!=0 ); + assert( pTwo->pExpr->pLeft!=0 && pTwo->pExpr->pRight!=0 ); + if( sqlite3ExprCompare(pOne->pExpr->pLeft, pTwo->pExpr->pLeft, -1) ) return; + if( sqlite3ExprCompare(pOne->pExpr->pRight, pTwo->pExpr->pRight, -1) )return; + /* If we reach this point, it means the two subterms can be combined */ + if( (eOp & (eOp-1))!=0 ){ + if( eOp & (WO_LT|WO_LE) ){ + eOp = WO_LE; + }else{ + assert( eOp & (WO_GT|WO_GE) ); + eOp = WO_GE; + } + } + db = pWC->pWInfo->pParse->db; + pNew = sqlite3ExprDup(db, pOne->pExpr, 0); + if( pNew==0 ) return; + for(op=TK_EQ; eOp!=(WO_EQ<<(op-TK_EQ)); op++){ assert( opop = op; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); +} + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) +/* +** Analyze a term that consists of two or more OR-connected +** subterms. So in: +** +** ... WHERE (a=5) AND (b=7 OR c=9 OR d=13) AND (d=13) +** ^^^^^^^^^^^^^^^^^^^^ +** +** This routine analyzes terms such as the middle term in the above example. +** A WhereOrTerm object is computed and attached to the term under +** analysis, regardless of the outcome of the analysis. Hence: +** +** WhereTerm.wtFlags |= TERM_ORINFO +** WhereTerm.u.pOrInfo = a dynamically allocated WhereOrTerm object +** +** The term being analyzed must have two or more of OR-connected subterms. +** A single subterm might be a set of AND-connected sub-subterms. +** Examples of terms under analysis: +** +** (A) t1.x=t2.y OR t1.x=t2.z OR t1.y=15 OR t1.z=t3.a+5 +** (B) x=expr1 OR expr2=x OR x=expr3 +** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15) +** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*') +** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6) +** (F) x>A OR (x=A AND y>=B) +** +** CASE 1: +** +** If all subterms are of the form T.C=expr for some single column of C and +** a single table T (as shown in example B above) then create a new virtual +** term that is an equivalent IN expression. In other words, if the term +** being analyzed is: +** +** x = expr1 OR expr2 = x OR x = expr3 +** +** then create a new virtual term like this: +** +** x IN (expr1,expr2,expr3) +** +** CASE 2: +** +** If there are exactly two disjuncts and one side has x>A and the other side +** has x=A (for the same x and A) then add a new virtual conjunct term to the +** WHERE clause of the form "x>=A". Example: +** +** x>A OR (x=A AND y>B) adds: x>=A +** +** The added conjunct can sometimes be helpful in query planning. +** +** CASE 3: +** +** If all subterms are indexable by a single table T, then set +** +** WhereTerm.eOperator = WO_OR +** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T +** +** A subterm is "indexable" if it is of the form +** "T.C " where C is any column of table T and +** is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN". +** A subterm is also indexable if it is an AND of two or more +** subsubterms at least one of which is indexable. Indexable AND +** subterms have their eOperator set to WO_AND and they have +** u.pAndInfo set to a dynamically allocated WhereAndTerm object. +** +** From another point of view, "indexable" means that the subterm could +** potentially be used with an index if an appropriate index exists. +** This analysis does not consider whether or not the index exists; that +** is decided elsewhere. This analysis only looks at whether subterms +** appropriate for indexing exist. +** +** All examples A through E above satisfy case 3. But if a term +** also satisfies case 1 (such as B) we know that the optimizer will +** always prefer case 1, so in that case we pretend that case 3 is not +** satisfied. +** +** It might be the case that multiple tables are indexable. For example, +** (E) above is indexable on tables P, Q, and R. +** +** Terms that satisfy case 3 are candidates for lookup by using +** separate indices to find rowids for each subterm and composing +** the union of all rowids using a RowSet object. This is similar +** to "bitmap indices" in other database engines. +** +** OTHERWISE: +** +** If none of cases 1, 2, or 3 apply, then leave the eOperator set to +** zero. This term is not useful for search. +*/ +static void exprAnalyzeOrTerm( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the complete WHERE clause */ + int idxTerm /* Index of the OR-term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + Parse *pParse = pWInfo->pParse; /* Parser context */ + sqlite3 *db = pParse->db; /* Database connection */ + WhereTerm *pTerm = &pWC->a[idxTerm]; /* The term to be analyzed */ + Expr *pExpr = pTerm->pExpr; /* The expression of the term */ + int i; /* Loop counters */ + WhereClause *pOrWc; /* Breakup of pTerm into subterms */ + WhereTerm *pOrTerm; /* A Sub-term within the pOrWc */ + WhereOrInfo *pOrInfo; /* Additional information associated with pTerm */ + Bitmask chngToIN; /* Tables that might satisfy case 1 */ + Bitmask indexable; /* Tables that are indexable, satisfying case 2 */ + + /* + ** Break the OR clause into its separate subterms. The subterms are + ** stored in a WhereClause structure containing within the WhereOrInfo + ** object that is attached to the original OR clause term. + */ + assert( (pTerm->wtFlags & (TERM_DYNAMIC|TERM_ORINFO|TERM_ANDINFO))==0 ); + assert( pExpr->op==TK_OR ); + pTerm->u.pOrInfo = pOrInfo = sqlite3DbMallocZero(db, sizeof(*pOrInfo)); + if( pOrInfo==0 ) return; + pTerm->wtFlags |= TERM_ORINFO; + pOrWc = &pOrInfo->wc; + sqlite3WhereClauseInit(pOrWc, pWInfo); + sqlite3WhereSplit(pOrWc, pExpr, TK_OR); + sqlite3WhereExprAnalyze(pSrc, pOrWc); + if( db->mallocFailed ) return; + assert( pOrWc->nTerm>=2 ); + + /* + ** Compute the set of tables that might satisfy cases 1 or 3. + */ + indexable = ~(Bitmask)0; + chngToIN = ~(Bitmask)0; + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0 && indexable; i--, pOrTerm++){ + if( (pOrTerm->eOperator & WO_SINGLE)==0 ){ + WhereAndInfo *pAndInfo; + assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 ); + chngToIN = 0; + pAndInfo = sqlite3DbMallocRaw(db, sizeof(*pAndInfo)); + if( pAndInfo ){ + WhereClause *pAndWC; + WhereTerm *pAndTerm; + int j; + Bitmask b = 0; + pOrTerm->u.pAndInfo = pAndInfo; + pOrTerm->wtFlags |= TERM_ANDINFO; + pOrTerm->eOperator = WO_AND; + pAndWC = &pAndInfo->wc; + sqlite3WhereClauseInit(pAndWC, pWC->pWInfo); + sqlite3WhereSplit(pAndWC, pOrTerm->pExpr, TK_AND); + sqlite3WhereExprAnalyze(pSrc, pAndWC); + pAndWC->pOuter = pWC; + testcase( db->mallocFailed ); + if( !db->mallocFailed ){ + for(j=0, pAndTerm=pAndWC->a; jnTerm; j++, pAndTerm++){ + assert( pAndTerm->pExpr ); + if( allowedOp(pAndTerm->pExpr->op) ){ + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); + } + } + } + indexable &= b; + } + }else if( pOrTerm->wtFlags & TERM_COPIED ){ + /* Skip this term for now. We revisit it when we process the + ** corresponding TERM_VIRTUAL term */ + }else{ + Bitmask b; + b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); + if( pOrTerm->wtFlags & TERM_VIRTUAL ){ + WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pOther->leftCursor); + } + indexable &= b; + if( (pOrTerm->eOperator & WO_EQ)==0 ){ + chngToIN = 0; + }else{ + chngToIN &= b; + } + } + } + + /* + ** Record the set of tables that satisfy case 3. The set might be + ** empty. + */ + pOrInfo->indexable = indexable; + pTerm->eOperator = indexable==0 ? 0 : WO_OR; + + /* For a two-way OR, attempt to implementation case 2. + */ + if( indexable && pOrWc->nTerm==2 ){ + int iOne = 0; + WhereTerm *pOne; + while( (pOne = whereNthSubterm(&pOrWc->a[0],iOne++))!=0 ){ + int iTwo = 0; + WhereTerm *pTwo; + while( (pTwo = whereNthSubterm(&pOrWc->a[1],iTwo++))!=0 ){ + whereCombineDisjuncts(pSrc, pWC, pOne, pTwo); + } + } + } + + /* + ** chngToIN holds a set of tables that *might* satisfy case 1. But + ** we have to do some additional checking to see if case 1 really + ** is satisfied. + ** + ** chngToIN will hold either 0, 1, or 2 bits. The 0-bit case means + ** that there is no possibility of transforming the OR clause into an + ** IN operator because one or more terms in the OR clause contain + ** something other than == on a column in the single table. The 1-bit + ** case means that every term of the OR clause is of the form + ** "table.column=expr" for some single table. The one bit that is set + ** will correspond to the common table. We still need to check to make + ** sure the same column is used on all terms. The 2-bit case is when + ** the all terms are of the form "table1.column=table2.column". It + ** might be possible to form an IN operator with either table1.column + ** or table2.column as the LHS if either is common to every term of + ** the OR clause. + ** + ** Note that terms of the form "table.column1=table.column2" (the + ** same table on both sizes of the ==) cannot be optimized. + */ + if( chngToIN ){ + int okToChngToIN = 0; /* True if the conversion to IN is valid */ + int iColumn = -1; /* Column index on lhs of IN operator */ + int iCursor = -1; /* Table cursor common to all terms */ + int j = 0; /* Loop counter */ + + /* Search for a table and column that appears on one side or the + ** other of the == operator in every subterm. That table and column + ** will be recorded in iCursor and iColumn. There might not be any + ** such table and column. Set okToChngToIN if an appropriate table + ** and column is found but leave okToChngToIN false if not found. + */ + for(j=0; j<2 && !okToChngToIN; j++){ + pOrTerm = pOrWc->a; + for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + pOrTerm->wtFlags &= ~TERM_OR_OK; + if( pOrTerm->leftCursor==iCursor ){ + /* This is the 2-bit case and we are on the second iteration and + ** current term is from the first iteration. So skip this term. */ + assert( j==1 ); + continue; + } + if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, + pOrTerm->leftCursor))==0 ){ + /* This term must be of the form t1.a==t2.b where t2 is in the + ** chngToIN set but t1 is not. This term will be either preceded + ** or follwed by an inverted copy (t2.b==t1.a). Skip this term + ** and use its inversion. */ + testcase( pOrTerm->wtFlags & TERM_COPIED ); + testcase( pOrTerm->wtFlags & TERM_VIRTUAL ); + assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) ); + continue; + } + iColumn = pOrTerm->u.leftColumn; + iCursor = pOrTerm->leftCursor; + break; + } + if( i<0 ){ + /* No candidate table+column was found. This can only occur + ** on the second iteration */ + assert( j==1 ); + assert( IsPowerOfTwo(chngToIN) ); + assert( chngToIN==sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor) ); + break; + } + testcase( j==1 ); + + /* We have found a candidate table and column. Check to see if that + ** table and column is common to every term in the OR clause */ + okToChngToIN = 1; + for(; i>=0 && okToChngToIN; i--, pOrTerm++){ + assert( pOrTerm->eOperator & WO_EQ ); + if( pOrTerm->leftCursor!=iCursor ){ + pOrTerm->wtFlags &= ~TERM_OR_OK; + }else if( pOrTerm->u.leftColumn!=iColumn ){ + okToChngToIN = 0; + }else{ + int affLeft, affRight; + /* If the right-hand side is also a column, then the affinities + ** of both right and left sides must be such that no type + ** conversions are required on the right. (Ticket #2249) + */ + affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight); + affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft); + if( affRight!=0 && affRight!=affLeft ){ + okToChngToIN = 0; + }else{ + pOrTerm->wtFlags |= TERM_OR_OK; + } + } + } + } + + /* At this point, okToChngToIN is true if original pTerm satisfies + ** case 1. In that case, construct a new virtual term that is + ** pTerm converted into an IN operator. + */ + if( okToChngToIN ){ + Expr *pDup; /* A transient duplicate expression */ + ExprList *pList = 0; /* The RHS of the IN operator */ + Expr *pLeft = 0; /* The LHS of the IN operator */ + Expr *pNew; /* The complete IN operator */ + + for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){ + if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue; + assert( pOrTerm->eOperator & WO_EQ ); + assert( pOrTerm->leftCursor==iCursor ); + assert( pOrTerm->u.leftColumn==iColumn ); + pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0); + pList = sqlite3ExprListAppend(pWInfo->pParse, pList, pDup); + pLeft = pOrTerm->pExpr->pLeft; + } + assert( pLeft!=0 ); + pDup = sqlite3ExprDup(db, pLeft, 0); + pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0, 0); + if( pNew ){ + int idxNew; + transferJoinMarkings(pNew, pExpr); + assert( !ExprHasProperty(pNew, EP_xIsSelect) ); + pNew->x.pList = pList; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + pTerm = &pWC->a[idxTerm]; + markTermAsChild(pWC, idxNew, idxTerm); + }else{ + sqlite3ExprListDelete(db, pList); + } + pTerm->eOperator = WO_NOOP; /* case 1 trumps case 3 */ + } + } +} +#endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */ + +/* +** We already know that pExpr is a binary operator where both operands are +** column references. This routine checks to see if pExpr is an equivalence +** relation: +** 1. The SQLITE_Transitive optimization must be enabled +** 2. Must be either an == or an IS operator +** 3. Not originating in the ON clause of an OUTER JOIN +** 4. The affinities of A and B must be compatible +** 5a. Both operands use the same collating sequence OR +** 5b. The overall collating sequence is BINARY +** If this routine returns TRUE, that means that the RHS can be substituted +** for the LHS anyplace else in the WHERE clause where the LHS column occurs. +** This is an optimization. No harm comes from returning 0. But if 1 is +** returned when it should not be, then incorrect answers might result. +*/ +static int termIsEquivalence(Parse *pParse, Expr *pExpr){ + char aff1, aff2; + CollSeq *pColl; + const char *zColl1, *zColl2; + if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; + if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; + if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; + aff1 = sqlite3ExprAffinity(pExpr->pLeft); + aff2 = sqlite3ExprAffinity(pExpr->pRight); + if( aff1!=aff2 + && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2)) + ){ + return 0; + } + pColl = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight); + if( pColl==0 || sqlite3StrICmp(pColl->zName, "BINARY")==0 ) return 1; + pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + /* Since pLeft and pRight are both a column references, their collating + ** sequence should always be defined. */ + zColl1 = ALWAYS(pColl) ? pColl->zName : 0; + pColl = sqlite3ExprCollSeq(pParse, pExpr->pRight); + zColl2 = ALWAYS(pColl) ? pColl->zName : 0; + return sqlite3StrICmp(zColl1, zColl2)==0; +} + +/* +** Recursively walk the expressions of a SELECT statement and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ + Bitmask mask = 0; + while( pS ){ + SrcList *pSrc = pS->pSrc; + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pEList); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pGroupBy); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pWhere); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pHaving); + if( ALWAYS(pSrc!=0) ){ + int i; + for(i=0; inSrc; i++){ + mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); + mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn); + } + } + pS = pS->pPrior; + } + return mask; +} + +/* +** The input to this routine is an WhereTerm structure with only the +** "pExpr" field filled in. The job of this routine is to analyze the +** subexpression and populate all the other fields of the WhereTerm +** structure. +** +** If the expression is of the form " X" it gets commuted +** to the standard form of "X ". +** +** If the expression is of the form "X Y" where both X and Y are +** columns, then the original expression is unchanged and a new virtual +** term of the form "Y X" is added to the WHERE clause and +** analyzed separately. The original term is marked with TERM_COPIED +** and the new term is marked with TERM_DYNAMIC (because it's pExpr +** needs to be freed with the WhereClause) and TERM_VIRTUAL (because it +** is a commuted copy of a prior term.) The original term has nChild=1 +** and the copy has idxParent set to the index of the original term. +*/ +static void exprAnalyze( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* the WHERE clause */ + int idxTerm /* Index of the term to be analyzed */ +){ + WhereInfo *pWInfo = pWC->pWInfo; /* WHERE clause processing context */ + WhereTerm *pTerm; /* The term to be analyzed */ + WhereMaskSet *pMaskSet; /* Set of table index masks */ + Expr *pExpr; /* The expression to be analyzed */ + Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ + Bitmask prereqAll; /* Prerequesites of pExpr */ + Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ + Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ + int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ + int noCase = 0; /* uppercase equivalent to lowercase */ + int op; /* Top-level operator. pExpr->op */ + Parse *pParse = pWInfo->pParse; /* Parsing context */ + sqlite3 *db = pParse->db; /* Database connection */ + + if( db->mallocFailed ){ + return; + } + pTerm = &pWC->a[idxTerm]; + pMaskSet = &pWInfo->sMaskSet; + pExpr = pTerm->pExpr; + assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); + prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); + op = pExpr->op; + if( op==TK_IN ){ + assert( pExpr->pRight==0 ); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect); + }else{ + pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); + } + }else if( op==TK_ISNULL ){ + pTerm->prereqRight = 0; + }else{ + pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); + } + prereqAll = sqlite3WhereExprUsage(pMaskSet, pExpr); + if( ExprHasProperty(pExpr, EP_FromJoin) ){ + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); + prereqAll |= x; + extraRight = x-1; /* ON clause terms may not be used with an index + ** on left table of a LEFT JOIN. Ticket #3015 */ + } + pTerm->prereqAll = prereqAll; + pTerm->leftCursor = -1; + pTerm->iParent = -1; + pTerm->eOperator = 0; + if( allowedOp(op) ){ + Expr *pLeft = sqlite3ExprSkipCollate(pExpr->pLeft); + Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); + u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV; + if( pLeft->op==TK_COLUMN ){ + pTerm->leftCursor = pLeft->iTable; + pTerm->u.leftColumn = pLeft->iColumn; + pTerm->eOperator = operatorMask(op) & opMask; + } + if( op==TK_IS ) pTerm->wtFlags |= TERM_IS; + if( pRight && pRight->op==TK_COLUMN ){ + WhereTerm *pNew; + Expr *pDup; + u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */ + if( pTerm->leftCursor>=0 ){ + int idxNew; + pDup = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDup); + return; + } + idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC); + if( idxNew==0 ) return; + pNew = &pWC->a[idxNew]; + markTermAsChild(pWC, idxNew, idxTerm); + if( op==TK_IS ) pNew->wtFlags |= TERM_IS; + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + + if( termIsEquivalence(pParse, pDup) ){ + pTerm->eOperator |= WO_EQUIV; + eExtraOp = WO_EQUIV; + } + }else{ + pDup = pExpr; + pNew = pTerm; + } + exprCommute(pParse, pDup); + pLeft = sqlite3ExprSkipCollate(pDup->pLeft); + pNew->leftCursor = pLeft->iTable; + pNew->u.leftColumn = pLeft->iColumn; + testcase( (prereqLeft | extraRight) != prereqLeft ); + pNew->prereqRight = prereqLeft | extraRight; + pNew->prereqAll = prereqAll; + pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; + } + } + +#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION + /* If a term is the BETWEEN operator, create two new virtual terms + ** that define the range that the BETWEEN implements. For example: + ** + ** a BETWEEN b AND c + ** + ** is converted into: + ** + ** (a BETWEEN b AND c) AND (a>=b) AND (a<=c) + ** + ** The two new terms are added onto the end of the WhereClause object. + ** The new terms are "dynamic" and are children of the original BETWEEN + ** term. That means that if the BETWEEN term is coded, the children are + ** skipped. Or, if the children are satisfied by an index, the original + ** BETWEEN term is skipped. + */ + else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){ + ExprList *pList = pExpr->x.pList; + int i; + static const u8 ops[] = {TK_GE, TK_LE}; + assert( pList!=0 ); + assert( pList->nExpr==2 ); + for(i=0; i<2; i++){ + Expr *pNewExpr; + int idxNew; + pNewExpr = sqlite3PExpr(pParse, ops[i], + sqlite3ExprDup(db, pExpr->pLeft, 0), + sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0); + transferJoinMarkings(pNewExpr, pExpr); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + exprAnalyze(pSrc, pWC, idxNew); + pTerm = &pWC->a[idxTerm]; + markTermAsChild(pWC, idxNew, idxTerm); + } + } +#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */ + +#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) + /* Analyze a term that is composed of two or more subterms connected by + ** an OR operator. + */ + else if( pExpr->op==TK_OR ){ + assert( pWC->op==TK_AND ); + exprAnalyzeOrTerm(pSrc, pWC, idxTerm); + pTerm = &pWC->a[idxTerm]; + } +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + +#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION + /* Add constraints to reduce the search space on a LIKE or GLOB + ** operator. + ** + ** A like pattern of the form "x LIKE 'aBc%'" is changed into constraints + ** + ** x>='ABC' AND x<'abd' AND x LIKE 'aBc%' + ** + ** The last character of the prefix "abc" is incremented to form the + ** termination condition "abd". If case is not significant (the default + ** for LIKE) then the lower-bound is made all uppercase and the upper- + ** bound is made all lowercase so that the bounds also work when comparing + ** BLOBs. + */ + if( pWC->op==TK_AND + && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) + ){ + Expr *pLeft; /* LHS of LIKE/GLOB operator */ + Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */ + Expr *pNewExpr1; + Expr *pNewExpr2; + int idxNew1; + int idxNew2; + const char *zCollSeqName; /* Name of collating sequence */ + const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; + + pLeft = pExpr->x.pList->a[1].pExpr; + pStr2 = sqlite3ExprDup(db, pStr1, 0); + + /* Convert the lower bound to upper-case and the upper bound to + ** lower-case (upper-case is less than lower-case in ASCII) so that + ** the range constraints also work for BLOBs + */ + if( noCase && !pParse->db->mallocFailed ){ + int i; + char c; + pTerm->wtFlags |= TERM_LIKE; + for(i=0; (c = pStr1->u.zToken[i])!=0; i++){ + pStr1->u.zToken[i] = sqlite3Toupper(c); + pStr2->u.zToken[i] = sqlite3Tolower(c); + } + } + + if( !db->mallocFailed ){ + u8 c, *pC; /* Last character before the first wildcard */ + pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; + c = *pC; + if( noCase ){ + /* The point is to increment the last character before the first + ** wildcard. But if we increment '@', that will push it into the + ** alphabetic range where case conversions will mess up the + ** inequality. To avoid this, make sure to also run the full + ** LIKE on all candidate expressions by clearing the isComplete flag + */ + if( c=='A'-1 ) isComplete = 0; + c = sqlite3UpperToLower[c]; + } + *pC = c + 1; + } + zCollSeqName = noCase ? "NOCASE" : "BINARY"; + pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr1 = sqlite3PExpr(pParse, TK_GE, + sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName), + pStr1, 0); + transferJoinMarkings(pNewExpr1, pExpr); + idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); + testcase( idxNew1==0 ); + exprAnalyze(pSrc, pWC, idxNew1); + pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); + pNewExpr2 = sqlite3PExpr(pParse, TK_LT, + sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), + pStr2, 0); + transferJoinMarkings(pNewExpr2, pExpr); + idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); + testcase( idxNew2==0 ); + exprAnalyze(pSrc, pWC, idxNew2); + pTerm = &pWC->a[idxTerm]; + if( isComplete ){ + markTermAsChild(pWC, idxNew1, idxTerm); + markTermAsChild(pWC, idxNew2, idxTerm); + } + } +#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Add a WO_MATCH auxiliary term to the constraint set if the + ** current expression is of the form: column MATCH expr. + ** This information is used by the xBestIndex methods of + ** virtual tables. The native query optimizer does not attempt + ** to do anything with MATCH functions. + */ + if( isMatchOfColumn(pExpr) ){ + int idxNew; + Expr *pRight, *pLeft; + WhereTerm *pNewTerm; + Bitmask prereqColumn, prereqExpr; + + pRight = pExpr->x.pList->a[0].pExpr; + pLeft = pExpr->x.pList->a[1].pExpr; + prereqExpr = sqlite3WhereExprUsage(pMaskSet, pRight); + prereqColumn = sqlite3WhereExprUsage(pMaskSet, pLeft); + if( (prereqExpr & prereqColumn)==0 ){ + Expr *pNewExpr; + pNewExpr = sqlite3PExpr(pParse, TK_MATCH, + 0, sqlite3ExprDup(db, pRight, 0), 0); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = prereqExpr; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_MATCH; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + } +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + /* When sqlite_stat3 histogram data is available an operator of the + ** form "x IS NOT NULL" can sometimes be evaluated more efficiently + ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a + ** virtual term of that form. + ** + ** Note that the virtual term must be tagged with TERM_VNULL. + */ + if( pExpr->op==TK_NOTNULL + && pExpr->pLeft->op==TK_COLUMN + && pExpr->pLeft->iColumn>=0 + && OptimizationEnabled(db, SQLITE_Stat34) + ){ + Expr *pNewExpr; + Expr *pLeft = pExpr->pLeft; + int idxNew; + WhereTerm *pNewTerm; + + pNewExpr = sqlite3PExpr(pParse, TK_GT, + sqlite3ExprDup(db, pLeft, 0), + sqlite3PExpr(pParse, TK_NULL, 0, 0, 0), 0); + + idxNew = whereClauseInsert(pWC, pNewExpr, + TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL); + if( idxNew ){ + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = 0; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_GT; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + } +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ + + /* Prevent ON clause terms of a LEFT JOIN from being used to drive + ** an index for tables to the left of the join. + */ + pTerm->prereqRight |= extraRight; +} + +/*************************************************************************** +** Routines with file scope above. Interface to the rest of the where.c +** subsystem follows. +***************************************************************************/ + +/* +** This routine identifies subexpressions in the WHERE clause where +** each subexpression is separated by the AND operator or some other +** operator specified in the op parameter. The WhereClause structure +** is filled with pointers to subexpressions. For example: +** +** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) +** \________/ \_______________/ \________________/ +** slot[0] slot[1] slot[2] +** +** The original WHERE clause in pExpr is unaltered. All this routine +** does is make slot[] entries point to substructure within pExpr. +** +** In the previous sentence and in the diagram, "slot[]" refers to +** the WhereClause.a[] array. The slot[] array grows as needed to contain +** all terms of the WHERE clause. +*/ +void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ + Expr *pE2 = sqlite3ExprSkipCollate(pExpr); + pWC->op = op; + if( pE2==0 ) return; + if( pE2->op!=op ){ + whereClauseInsert(pWC, pExpr, 0); + }else{ + sqlite3WhereSplit(pWC, pE2->pLeft, op); + sqlite3WhereSplit(pWC, pE2->pRight, op); + } +} + +/* +** Initialize a preallocated WhereClause structure. +*/ +void sqlite3WhereClauseInit( + WhereClause *pWC, /* The WhereClause to be initialized */ + WhereInfo *pWInfo /* The WHERE processing context */ +){ + pWC->pWInfo = pWInfo; + pWC->pOuter = 0; + pWC->nTerm = 0; + pWC->nSlot = ArraySize(pWC->aStatic); + pWC->a = pWC->aStatic; +} + +/* +** Deallocate a WhereClause structure. The WhereClause structure +** itself is not freed. This routine is the inverse of sqlite3WhereClauseInit(). +*/ +void sqlite3WhereClauseClear(WhereClause *pWC){ + int i; + WhereTerm *a; + sqlite3 *db = pWC->pWInfo->pParse->db; + for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){ + if( a->wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, a->pExpr); + } + if( a->wtFlags & TERM_ORINFO ){ + whereOrInfoDelete(db, a->u.pOrInfo); + }else if( a->wtFlags & TERM_ANDINFO ){ + whereAndInfoDelete(db, a->u.pAndInfo); + } + } + if( pWC->a!=pWC->aStatic ){ + sqlite3DbFree(db, pWC->a); + } +} + + +/* +** These routines walk (recursively) an expression tree and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ + Bitmask mask = 0; + if( p==0 ) return 0; + if( p->op==TK_COLUMN ){ + mask = sqlite3WhereGetMask(pMaskSet, p->iTable); + return mask; + } + mask = sqlite3WhereExprUsage(pMaskSet, p->pRight); + mask |= sqlite3WhereExprUsage(pMaskSet, p->pLeft); + if( ExprHasProperty(p, EP_xIsSelect) ){ + mask |= exprSelectUsage(pMaskSet, p->x.pSelect); + }else{ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); + } + return mask; +} +Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprList *pList){ + int i; + Bitmask mask = 0; + if( pList ){ + for(i=0; inExpr; i++){ + mask |= sqlite3WhereExprUsage(pMaskSet, pList->a[i].pExpr); + } + } + return mask; +} + + +/* +** Call exprAnalyze on all terms in a WHERE clause. +** +** Note that exprAnalyze() might add new virtual terms onto the +** end of the WHERE clause. We do not want to analyze these new +** virtual terms, so start analyzing at the end and work forward +** so that the added virtual terms are never processed. +*/ +void sqlite3WhereExprAnalyze( + SrcList *pTabList, /* the FROM clause */ + WhereClause *pWC /* the WHERE clause to be analyzed */ +){ + int i; + for(i=pWC->nTerm-1; i>=0; i--){ + exprAnalyze(pTabList, pWC, i); + } +} diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 8e7858896a..320a12eef1 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -344,6 +344,7 @@ foreach file { vacuum.c vtab.c wherecode.c + whereexpr.c where.c parse.c From 38b4149ca1308db644dbf55426cc366c45ad7579 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 8 Jun 2015 15:08:15 +0000 Subject: [PATCH 11/49] Factor out the TreeView parse tree printing module into a separate file. FossilOrigin-Name: c32ce54ca46a4be4373983be6fd44b1f3a0250d1 --- Makefile.in | 6 +- Makefile.msc | 6 +- main.mk | 3 +- manifest | 27 +-- manifest.uuid | 2 +- src/expr.c | 254 -------------------------- src/printf.c | 66 +------ src/select.c | 128 +++---------- src/sqliteInt.h | 4 - src/treeview.c | 425 ++++++++++++++++++++++++++++++++++++++++++++ tool/mksqlite3c.tcl | 1 + 11 files changed, 475 insertions(+), 447 deletions(-) create mode 100644 src/treeview.c diff --git a/Makefile.in b/Makefile.in index ea1715557e..1b7c7f9dc5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -181,7 +181,7 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ notify.lo opcodes.lo os.lo os_unix.lo os_win.lo \ pager.lo parse.lo pcache.lo pcache1.lo pragma.lo prepare.lo printf.lo \ random.lo resolve.lo rowset.lo rtree.lo select.lo status.lo \ - table.lo threads.lo tokenize.lo trigger.lo \ + table.lo threads.lo tokenize.lo treeview.lo trigger.lo \ update.lo util.lo vacuum.lo \ vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo whereexpr.lo \ @@ -274,6 +274,7 @@ SRC = \ $(TOP)/src/threads.c \ $(TOP)/src/tclsqlite.c \ $(TOP)/src/tokenize.c \ + $(TOP)/src/treeview.c \ $(TOP)/src/trigger.c \ $(TOP)/src/utf.c \ $(TOP)/src/update.c \ @@ -806,6 +807,9 @@ threads.lo: $(TOP)/src/threads.c $(HDR) tokenize.lo: $(TOP)/src/tokenize.c keywordhash.h $(HDR) $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/tokenize.c +treeview.lo: $(TOP)/src/treeview.c $(HDR) + $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/treeview.c + trigger.lo: $(TOP)/src/trigger.c $(HDR) $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/trigger.c diff --git a/Makefile.msc b/Makefile.msc index 11b2097465..c3272de0de 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -835,7 +835,7 @@ LIBOBJS0 = vdbe.lo parse.lo alter.lo analyze.lo attach.lo auth.lo \ notify.lo opcodes.lo os.lo os_unix.lo os_win.lo \ pager.lo pcache.lo pcache1.lo pragma.lo prepare.lo printf.lo \ random.lo resolve.lo rowset.lo rtree.lo select.lo status.lo \ - table.lo threads.lo tokenize.lo trigger.lo \ + table.lo threads.lo tokenize.lo treeview.lo trigger.lo \ update.lo util.lo vacuum.lo \ vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo whereexpr.lo \ @@ -940,6 +940,7 @@ SRC2 = \ $(TOP)\src\threads.c \ $(TOP)\src\tclsqlite.c \ $(TOP)\src\tokenize.c \ + $(TOP)\src\treeview.c \ $(TOP)\src\trigger.c \ $(TOP)\src\utf.c \ $(TOP)\src\update.c \ @@ -1487,6 +1488,9 @@ threads.lo: $(TOP)\src\threads.c $(HDR) tokenize.lo: $(TOP)\src\tokenize.c keywordhash.h $(HDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\tokenize.c +treeview.lo: $(TOP)\src\treeview.c $(HDR) + $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\treeview.c + trigger.lo: $(TOP)\src\trigger.c $(HDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) -c $(TOP)\src\trigger.c diff --git a/main.mk b/main.mk index 27d56fb80f..22fc700a75 100644 --- a/main.mk +++ b/main.mk @@ -66,7 +66,7 @@ LIBOBJ+= vdbe.o parse.o \ notify.o opcodes.o os.o os_unix.o os_win.o \ pager.o pcache.o pcache1.o pragma.o prepare.o printf.o \ random.o resolve.o rowset.o rtree.o select.o sqlite3ota.o status.o \ - table.o threads.o tokenize.o trigger.o \ + table.o threads.o tokenize.o treeview.o trigger.o \ update.o userauth.o util.o vacuum.o \ vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o vdbesort.o \ vdbetrace.o wal.o walker.o where.o wherecode.o whereexpr.o \ @@ -152,6 +152,7 @@ SRC = \ $(TOP)/src/tclsqlite.c \ $(TOP)/src/threads.c \ $(TOP)/src/tokenize.c \ + $(TOP)/src/treeview.c \ $(TOP)/src/trigger.c \ $(TOP)/src/utf.c \ $(TOP)/src/update.c \ diff --git a/manifest b/manifest index 0307e1a087..2ac088fd87 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Split\smore\ssubfunctions\sof\swhere.c\sout\sinto\sa\snew\swhereexpr.c\ssource\sfile,\nfor\simproved\smaintainability. -D 2015-06-08T14:23:15.485 +C Factor\sout\sthe\sTreeView\sparse\stree\sprinting\smodule\sinto\sa\sseparate\sfile. +D 2015-06-08T15:08:15.270 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in d7bde8e39e88f23c99219e822aaab80a9ce48a53 +F Makefile.in a7b384855b72378fd860425b128ea5f75296e9d6 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc e4e8cbbe98d77d62b1fed34d95d966d5db2a1b01 +F Makefile.msc 5438dc167466f51349ab0c4497aef547d0c9352c F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ce0ae95abd7121c534f6917c1c8f2b70d9acd4db @@ -171,7 +171,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 4aed2f4087f3880a92c505fba772f2368d699da5 +F main.mk dc931768b88e4417bc2f8b2d45dba385ad29f727 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk d5e22023b5238985bb54a72d33e0ac71fe4f8a32 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -202,7 +202,7 @@ F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e -F src/expr.c 12e04f322956076b1f8748ca572568968f8155d9 +F src/expr.c 0550baeca8dd7472e298d9e881e5e3484f7666f8 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c9b63a217d86582c22121699a47f22f524608869 F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6 @@ -246,16 +246,16 @@ F src/pcache1.c 69d137620a305f814398bd29a0c998038c0695e9 F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7 F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 -F src/printf.c 13ce37e5574f9b0682fa86dbcf9faf76b9d82a15 +F src/printf.c 9889e8826f8e2bd8c2718d7d3faa761bef8eac79 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c d507fe715b12e6aba157fa34b0a5680809e59bac +F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 2ebeb634e751a61a6f0eebfa0f4669f46a42f6cd -F src/sqliteInt.h 851cc2ee6ec9a853f3fbcf1ce582590531fd7528 +F src/sqliteInt.h 4c6731ce49b90582ea7d77c67b8792a4df8da237 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -307,6 +307,7 @@ F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 6bbcc9fe50c917864d48287b4792d46d6e873481 F src/tokenize.c baa0e550dfa76a8d781732a7bfb1f0aa094942f2 +F src/treeview.c 84aa2d2ed26627ccc8dd3a2becfa18dc86ee4607 F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c @@ -1249,7 +1250,7 @@ F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 40c287d3f929ece67da6e9e7c49885789960accf F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 69bae8ce4aa52d2ff82d4a8a856bf283ec035b2e -F tool/mksqlite3c.tcl 9a4b87e86c6036b285b5f0fe1e4db0c79c4092ab +F tool/mksqlite3c.tcl d79e450048b0bbf04d53677e01c249a012981182 F tool/mksqlite3h.tcl 44730d586c9031638cdd2eb443b801c0d2dbd9f8 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl 3b58b9398f91c7dbf18d49eb87cefeee9efdbce1 @@ -1284,7 +1285,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P faa0e420e93a2bc1c84df9eb9fef4748d29ce339 -R d7cd77de896255756abb541430f78771 +P 46ef95c108ad8961f2bf3d2dc839d4fb1fddd770 +R b8b4fb0f1a8beaad9f2b2c3f4237ea7b U drh -Z 58efdf4d20fca9a444e5c6368ea56c89 +Z 10e8e7d0fa9ce8baee6c4a1498d642ba diff --git a/manifest.uuid b/manifest.uuid index 1199d6a972..28f125a126 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46ef95c108ad8961f2bf3d2dc839d4fb1fddd770 \ No newline at end of file +c32ce54ca46a4be4373983be6fd44b1f3a0250d1 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index d62346e39d..89eee29ecd 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3311,260 +3311,6 @@ void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){ exprToRegister(pExpr, iMem); } -#ifdef SQLITE_DEBUG -/* -** Generate a human-readable explanation of an expression tree. -*/ -void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ - const char *zBinOp = 0; /* Binary operator */ - const char *zUniOp = 0; /* Unary operator */ - pView = sqlite3TreeViewPush(pView, moreToFollow); - if( pExpr==0 ){ - sqlite3TreeViewLine(pView, "nil"); - sqlite3TreeViewPop(pView); - return; - } - switch( pExpr->op ){ - case TK_AGG_COLUMN: { - sqlite3TreeViewLine(pView, "AGG{%d:%d}", - pExpr->iTable, pExpr->iColumn); - break; - } - case TK_COLUMN: { - if( pExpr->iTable<0 ){ - /* This only happens when coding check constraints */ - sqlite3TreeViewLine(pView, "COLUMN(%d)", pExpr->iColumn); - }else{ - sqlite3TreeViewLine(pView, "{%d:%d}", - pExpr->iTable, pExpr->iColumn); - } - break; - } - case TK_INTEGER: { - if( pExpr->flags & EP_IntValue ){ - sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); - }else{ - sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); - } - break; - } -#ifndef SQLITE_OMIT_FLOATING_POINT - case TK_FLOAT: { - sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); - break; - } -#endif - case TK_STRING: { - sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); - break; - } - case TK_NULL: { - sqlite3TreeViewLine(pView,"NULL"); - break; - } -#ifndef SQLITE_OMIT_BLOB_LITERAL - case TK_BLOB: { - sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); - break; - } -#endif - case TK_VARIABLE: { - sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", - pExpr->u.zToken, pExpr->iColumn); - break; - } - case TK_REGISTER: { - sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); - break; - } - case TK_AS: { - sqlite3TreeViewLine(pView,"AS %Q", pExpr->u.zToken); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - break; - } - case TK_ID: { - sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); - break; - } -#ifndef SQLITE_OMIT_CAST - case TK_CAST: { - /* Expressions of the form: CAST(pLeft AS token) */ - sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - break; - } -#endif /* SQLITE_OMIT_CAST */ - case TK_LT: zBinOp = "LT"; break; - case TK_LE: zBinOp = "LE"; break; - case TK_GT: zBinOp = "GT"; break; - case TK_GE: zBinOp = "GE"; break; - case TK_NE: zBinOp = "NE"; break; - case TK_EQ: zBinOp = "EQ"; break; - case TK_IS: zBinOp = "IS"; break; - case TK_ISNOT: zBinOp = "ISNOT"; break; - case TK_AND: zBinOp = "AND"; break; - case TK_OR: zBinOp = "OR"; break; - case TK_PLUS: zBinOp = "ADD"; break; - case TK_STAR: zBinOp = "MUL"; break; - case TK_MINUS: zBinOp = "SUB"; break; - case TK_REM: zBinOp = "REM"; break; - case TK_BITAND: zBinOp = "BITAND"; break; - case TK_BITOR: zBinOp = "BITOR"; break; - case TK_SLASH: zBinOp = "DIV"; break; - case TK_LSHIFT: zBinOp = "LSHIFT"; break; - case TK_RSHIFT: zBinOp = "RSHIFT"; break; - case TK_CONCAT: zBinOp = "CONCAT"; break; - case TK_DOT: zBinOp = "DOT"; break; - - case TK_UMINUS: zUniOp = "UMINUS"; break; - case TK_UPLUS: zUniOp = "UPLUS"; break; - case TK_BITNOT: zUniOp = "BITNOT"; break; - case TK_NOT: zUniOp = "NOT"; break; - case TK_ISNULL: zUniOp = "ISNULL"; break; - case TK_NOTNULL: zUniOp = "NOTNULL"; break; - - case TK_COLLATE: { - sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - break; - } - - case TK_AGG_FUNCTION: - case TK_FUNCTION: { - ExprList *pFarg; /* List of function arguments */ - if( ExprHasProperty(pExpr, EP_TokenOnly) ){ - pFarg = 0; - }else{ - pFarg = pExpr->x.pList; - } - if( pExpr->op==TK_AGG_FUNCTION ){ - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", - pExpr->op2, pExpr->u.zToken); - }else{ - sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); - } - if( pFarg ){ - sqlite3TreeViewExprList(pView, pFarg, 0, 0); - } - break; - } -#ifndef SQLITE_OMIT_SUBQUERY - case TK_EXISTS: { - sqlite3TreeViewLine(pView, "EXISTS-expr"); - sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); - break; - } - case TK_SELECT: { - sqlite3TreeViewLine(pView, "SELECT-expr"); - sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); - break; - } - case TK_IN: { - sqlite3TreeViewLine(pView, "IN"); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); - }else{ - sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); - } - break; - } -#endif /* SQLITE_OMIT_SUBQUERY */ - - /* - ** x BETWEEN y AND z - ** - ** This is equivalent to - ** - ** x>=y AND x<=z - ** - ** X is stored in pExpr->pLeft. - ** Y is stored in pExpr->pList->a[0].pExpr. - ** Z is stored in pExpr->pList->a[1].pExpr. - */ - case TK_BETWEEN: { - Expr *pX = pExpr->pLeft; - Expr *pY = pExpr->x.pList->a[0].pExpr; - Expr *pZ = pExpr->x.pList->a[1].pExpr; - sqlite3TreeViewLine(pView, "BETWEEN"); - sqlite3TreeViewExpr(pView, pX, 1); - sqlite3TreeViewExpr(pView, pY, 1); - sqlite3TreeViewExpr(pView, pZ, 0); - break; - } - case TK_TRIGGER: { - /* If the opcode is TK_TRIGGER, then the expression is a reference - ** to a column in the new.* or old.* pseudo-tables available to - ** trigger programs. In this case Expr.iTable is set to 1 for the - ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn - ** is set to the column of the pseudo-table to read, or to -1 to - ** read the rowid field. - */ - sqlite3TreeViewLine(pView, "%s(%d)", - pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); - break; - } - case TK_CASE: { - sqlite3TreeViewLine(pView, "CASE"); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); - sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); - break; - } -#ifndef SQLITE_OMIT_TRIGGER - case TK_RAISE: { - const char *zType = "unk"; - switch( pExpr->affinity ){ - case OE_Rollback: zType = "rollback"; break; - case OE_Abort: zType = "abort"; break; - case OE_Fail: zType = "fail"; break; - case OE_Ignore: zType = "ignore"; break; - } - sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); - break; - } -#endif - default: { - sqlite3TreeViewLine(pView, "op=%d", pExpr->op); - break; - } - } - if( zBinOp ){ - sqlite3TreeViewLine(pView, "%s", zBinOp); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); - sqlite3TreeViewExpr(pView, pExpr->pRight, 0); - }else if( zUniOp ){ - sqlite3TreeViewLine(pView, "%s", zUniOp); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - } - sqlite3TreeViewPop(pView); -} -#endif /* SQLITE_DEBUG */ - -#ifdef SQLITE_DEBUG -/* -** Generate a human-readable explanation of an expression list. -*/ -void sqlite3TreeViewExprList( - TreeView *pView, - const ExprList *pList, - u8 moreToFollow, - const char *zLabel -){ - int i; - pView = sqlite3TreeViewPush(pView, moreToFollow); - if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; - if( pList==0 ){ - sqlite3TreeViewLine(pView, "%s (empty)", zLabel); - }else{ - sqlite3TreeViewLine(pView, "%s", zLabel); - for(i=0; inExpr; i++){ - sqlite3TreeViewExpr(pView, pList->a[i].pExpr, inExpr-1); - } - } - sqlite3TreeViewPop(pView); -} -#endif /* SQLITE_DEBUG */ - /* ** Generate code that pushes the value of every element of the given ** expression list into a sequence of registers beginning at target. diff --git a/src/printf.c b/src/printf.c index edf2210e0a..ebdf44518f 100644 --- a/src/printf.c +++ b/src/printf.c @@ -1,9 +1,6 @@ /* ** The "printf" code that follows dates from the 1980's. It is in -** the public domain. The original comments are included here for -** completeness. They are very out-of-date but might be useful as -** an historical reference. Most of the "enhancements" have been backed -** out so that the functionality is now the same as standard printf(). +** the public domain. ** ************************************************************************** ** @@ -1058,67 +1055,6 @@ void sqlite3DebugPrintf(const char *zFormat, ...){ } #endif -#ifdef SQLITE_DEBUG -/************************************************************************* -** Routines for implementing the "TreeView" display of hierarchical -** data structures for debugging. -** -** The main entry points (coded elsewhere) are: -** sqlite3TreeViewExpr(0, pExpr, 0); -** sqlite3TreeViewExprList(0, pList, 0, 0); -** sqlite3TreeViewSelect(0, pSelect, 0); -** Insert calls to those routines while debugging in order to display -** a diagram of Expr, ExprList, and Select objects. -** -*/ -/* Add a new subitem to the tree. The moreToFollow flag indicates that this -** is not the last item in the tree. */ -TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ - if( p==0 ){ - p = sqlite3_malloc64( sizeof(*p) ); - if( p==0 ) return 0; - memset(p, 0, sizeof(*p)); - }else{ - p->iLevel++; - } - assert( moreToFollow==0 || moreToFollow==1 ); - if( p->iLevelbLine) ) p->bLine[p->iLevel] = moreToFollow; - return p; -} -/* Finished with one layer of the tree */ -void sqlite3TreeViewPop(TreeView *p){ - if( p==0 ) return; - p->iLevel--; - if( p->iLevel<0 ) sqlite3_free(p); -} -/* Generate a single line of output for the tree, with a prefix that contains -** all the appropriate tree lines */ -void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ - va_list ap; - int i; - StrAccum acc; - char zBuf[500]; - sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); - if( p ){ - for(i=0; iiLevel && ibLine)-1; i++){ - sqlite3StrAccumAppend(&acc, p->bLine[i] ? "| " : " ", 4); - } - sqlite3StrAccumAppend(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); - } - va_start(ap, zFormat); - sqlite3VXPrintf(&acc, 0, zFormat, ap); - va_end(ap); - if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1); - sqlite3StrAccumFinish(&acc); - fprintf(stdout,"%s", zBuf); - fflush(stdout); -} -/* Shorthand for starting a new tree item that consists of a single label */ -void sqlite3TreeViewItem(TreeView *p, const char *zLabel, u8 moreToFollow){ - p = sqlite3TreeViewPush(p, moreToFollow); - sqlite3TreeViewLine(p, "%s", zLabel); -} -#endif /* SQLITE_DEBUG */ /* ** variable-argument wrapper around sqlite3VXPrintf(). diff --git a/src/select.c b/src/select.c index f801d1033a..f030d2f4a4 100644 --- a/src/select.c +++ b/src/select.c @@ -21,7 +21,8 @@ /***/ int sqlite3SelectTrace = 0; # define SELECTTRACE(K,P,S,X) \ if(sqlite3SelectTrace&(K)) \ - sqlite3DebugPrintf("%*s%s.%p: ",(P)->nSelectIndent*2-2,"",(S)->zSelName,(S)),\ + sqlite3DebugPrintf("%*s%s.%p: ",(P)->nSelectIndent*2-2,"",\ + (S)->zSelName,(S)),\ sqlite3DebugPrintf X #else # define SELECTTRACE(K,P,S,X) @@ -774,7 +775,8 @@ static void selectInnerLoop( default: { assert( pDistinct->eTnctType==WHERE_DISTINCT_UNORDERED ); - codeDistinct(pParse, pDistinct->tabTnct, iContinue, nResultCol, regResult); + codeDistinct(pParse, pDistinct->tabTnct, iContinue, nResultCol, + regResult); break; } } @@ -827,7 +829,8 @@ static void selectInnerLoop( ** current row to the index and proceed with writing it to the ** output table as well. */ int addr = sqlite3VdbeCurrentAddr(v) + 4; - sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); VdbeCoverage(v); + sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r1); assert( pSort==0 ); } @@ -1704,7 +1707,8 @@ static void selectAddColumnTypeAndCollation( for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ p = a[i].pExpr; if( pCol->zType==0 ){ - pCol->zType = sqlite3DbStrDup(db, columnType(&sNC, p,0,0,0, &pCol->szEst)); + pCol->zType = sqlite3DbStrDup(db, + columnType(&sNC, p,0,0,0, &pCol->szEst)); } szAll += pCol->szEst; pCol->affinity = sqlite3ExprAffinity(p); @@ -3214,8 +3218,8 @@ static void substSelect( ** ** (**) Restriction (10) was removed from the code on 2005-02-05 but we ** accidently carried the comment forward until 2014-09-15. Original -** text: "The subquery does not use aggregates or the outer query does not -** use LIMIT." +** text: "The subquery does not use aggregates or the outer query +** does not use LIMIT." ** ** (11) The subquery and the outer query do not both have ORDER BY clauses. ** @@ -4985,7 +4989,8 @@ int sqlite3Select( } #endif - /* Various elements of the SELECT copied into local variables for convenience */ + /* Various elements of the SELECT copied into local variables for + ** convenience */ pEList = p->pEList; pWhere = p->pWhere; pGroupBy = p->pGroupBy; @@ -5067,9 +5072,9 @@ int sqlite3Select( if( p->selFlags & SF_Distinct ){ sDistinct.tabTnct = pParse->nTab++; sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, - sDistinct.tabTnct, 0, 0, - (char*)keyInfoFromExprList(pParse, p->pEList,0,0), - P4_KEYINFO); + sDistinct.tabTnct, 0, 0, + (char*)keyInfoFromExprList(pParse, p->pEList,0,0), + P4_KEYINFO); sqlite3VdbeChangeP5(v, BTREE_UNORDERED); sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED; }else{ @@ -5328,7 +5333,8 @@ int sqlite3Select( addrTopOfLoop = sqlite3VdbeCurrentAddr(v); sqlite3ExprCacheClear(pParse); if( groupBySort ){ - sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx, sortOut,sortPTab); + sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx, + sortOut, sortPTab); } for(j=0; jnExpr; j++){ if( groupBySort ){ @@ -5400,7 +5406,8 @@ int sqlite3Select( sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); sqlite3VdbeResolveLabel(v, addrOutputRow); addrOutputRow = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); + VdbeCoverage(v); VdbeComment((v, "Groupby result generator entry point")); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); finalizeAggFunctions(pParse, &sAggInfo); @@ -5564,7 +5571,8 @@ int sqlite3Select( ** and send them to the callback one by one. */ if( sSort.pOrderBy ){ - explainTempTable(pParse, sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY"); + explainTempTable(pParse, + sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY"); generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest); } @@ -5596,97 +5604,3 @@ select_end: #endif return rc; } - -#ifdef SQLITE_DEBUG -/* -** Generate a human-readable description of a the Select object. -*/ -void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ - int n = 0; - pView = sqlite3TreeViewPush(pView, moreToFollow); - sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x", - ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), - ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags - ); - if( p->pSrc && p->pSrc->nSrc ) n++; - if( p->pWhere ) n++; - if( p->pGroupBy ) n++; - if( p->pHaving ) n++; - if( p->pOrderBy ) n++; - if( p->pLimit ) n++; - if( p->pOffset ) n++; - if( p->pPrior ) n++; - sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); - if( p->pSrc && p->pSrc->nSrc ){ - int i; - pView = sqlite3TreeViewPush(pView, (n--)>0); - sqlite3TreeViewLine(pView, "FROM"); - for(i=0; ipSrc->nSrc; i++){ - struct SrcList_item *pItem = &p->pSrc->a[i]; - StrAccum x; - char zLine[100]; - sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); - sqlite3XPrintf(&x, 0, "{%d,*}", pItem->iCursor); - if( pItem->zDatabase ){ - sqlite3XPrintf(&x, 0, " %s.%s", pItem->zDatabase, pItem->zName); - }else if( pItem->zName ){ - sqlite3XPrintf(&x, 0, " %s", pItem->zName); - } - if( pItem->pTab ){ - sqlite3XPrintf(&x, 0, " tabname=%Q", pItem->pTab->zName); - } - if( pItem->zAlias ){ - sqlite3XPrintf(&x, 0, " (AS %s)", pItem->zAlias); - } - if( pItem->jointype & JT_LEFT ){ - sqlite3XPrintf(&x, 0, " LEFT-JOIN"); - } - sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, ipSrc->nSrc-1); - if( pItem->pSelect ){ - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); - } - sqlite3TreeViewPop(pView); - } - sqlite3TreeViewPop(pView); - } - if( p->pWhere ){ - sqlite3TreeViewItem(pView, "WHERE", (n--)>0); - sqlite3TreeViewExpr(pView, p->pWhere, 0); - sqlite3TreeViewPop(pView); - } - if( p->pGroupBy ){ - sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); - } - if( p->pHaving ){ - sqlite3TreeViewItem(pView, "HAVING", (n--)>0); - sqlite3TreeViewExpr(pView, p->pHaving, 0); - sqlite3TreeViewPop(pView); - } - if( p->pOrderBy ){ - sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY"); - } - if( p->pLimit ){ - sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); - sqlite3TreeViewExpr(pView, p->pLimit, 0); - sqlite3TreeViewPop(pView); - } - if( p->pOffset ){ - sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); - sqlite3TreeViewExpr(pView, p->pOffset, 0); - sqlite3TreeViewPop(pView); - } - if( p->pPrior ){ - const char *zOp = "UNION"; - switch( p->op ){ - case TK_ALL: zOp = "UNION ALL"; break; - case TK_INTERSECT: zOp = "INTERSECT"; break; - case TK_EXCEPT: zOp = "EXCEPT"; break; - } - sqlite3TreeViewItem(pView, zOp, (n--)>0); - sqlite3TreeViewSelect(pView, p->pPrior, 0); - sqlite3TreeViewPop(pView); - } - sqlite3TreeViewPop(pView); -} -#endif /* SQLITE_DEBUG */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5b7fbbc835..43e4b0be9b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3170,10 +3170,6 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); #endif #if defined(SQLITE_DEBUG) - TreeView *sqlite3TreeViewPush(TreeView*,u8); - void sqlite3TreeViewPop(TreeView*); - void sqlite3TreeViewLine(TreeView*, const char*, ...); - void sqlite3TreeViewItem(TreeView*, const char*, u8); void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); void sqlite3TreeViewSelect(TreeView*, const Select*, u8); diff --git a/src/treeview.c b/src/treeview.c new file mode 100644 index 0000000000..7b63c884e7 --- /dev/null +++ b/src/treeview.c @@ -0,0 +1,425 @@ +/* +** 2015-06-08 +** +** 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 contains C code to implement the TreeView debugging routines. +** These routines print a parse tree to standard output for debugging and +** analysis. +** +** The interfaces in this file is only available when compiling +** with SQLITE_DEBUG. +*/ +#include "sqliteInt.h" +#ifdef SQLITE_DEBUG + +/* +** Add a new subitem to the tree. The moreToFollow flag indicates that this +** is not the last item in the tree. +*/ +static TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ + if( p==0 ){ + p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return 0; + memset(p, 0, sizeof(*p)); + }else{ + p->iLevel++; + } + assert( moreToFollow==0 || moreToFollow==1 ); + if( p->iLevelbLine) ) p->bLine[p->iLevel] = moreToFollow; + return p; +} + +/* +** Finished with one layer of the tree +*/ +static void sqlite3TreeViewPop(TreeView *p){ + if( p==0 ) return; + p->iLevel--; + if( p->iLevel<0 ) sqlite3_free(p); +} + +/* +** Generate a single line of output for the tree, with a prefix that contains +** all the appropriate tree lines +*/ +static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ + va_list ap; + int i; + StrAccum acc; + char zBuf[500]; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + if( p ){ + for(i=0; iiLevel && ibLine)-1; i++){ + sqlite3StrAccumAppend(&acc, p->bLine[i] ? "| " : " ", 4); + } + sqlite3StrAccumAppend(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); + } + va_start(ap, zFormat); + sqlite3VXPrintf(&acc, 0, zFormat, ap); + va_end(ap); + if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1); + sqlite3StrAccumFinish(&acc); + fprintf(stdout,"%s", zBuf); + fflush(stdout); +} + +/* +** Shorthand for starting a new tree item that consists of a single label +*/ +static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ + p = sqlite3TreeViewPush(p, moreFollows); + sqlite3TreeViewLine(p, "%s", zLabel); +} + + +/* +** Generate a human-readable description of a the Select object. +*/ +void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ + int n = 0; + pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags + ); + if( p->pSrc && p->pSrc->nSrc ) n++; + if( p->pWhere ) n++; + if( p->pGroupBy ) n++; + if( p->pHaving ) n++; + if( p->pOrderBy ) n++; + if( p->pLimit ) n++; + if( p->pOffset ) n++; + if( p->pPrior ) n++; + sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); + if( p->pSrc && p->pSrc->nSrc ){ + int i; + pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewLine(pView, "FROM"); + for(i=0; ipSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + StrAccum x; + char zLine[100]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3XPrintf(&x, 0, "{%d,*}", pItem->iCursor); + if( pItem->zDatabase ){ + sqlite3XPrintf(&x, 0, " %s.%s", pItem->zDatabase, pItem->zName); + }else if( pItem->zName ){ + sqlite3XPrintf(&x, 0, " %s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3XPrintf(&x, 0, " tabname=%Q", pItem->pTab->zName); + } + if( pItem->zAlias ){ + sqlite3XPrintf(&x, 0, " (AS %s)", pItem->zAlias); + } + if( pItem->jointype & JT_LEFT ){ + sqlite3XPrintf(&x, 0, " LEFT-JOIN"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, ipSrc->nSrc-1); + if( pItem->pSelect ){ + sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + } + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } + if( p->pWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, p->pWhere, 0); + sqlite3TreeViewPop(pView); + } + if( p->pGroupBy ){ + sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); + } + if( p->pHaving ){ + sqlite3TreeViewItem(pView, "HAVING", (n--)>0); + sqlite3TreeViewExpr(pView, p->pHaving, 0); + sqlite3TreeViewPop(pView); + } + if( p->pOrderBy ){ + sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY"); + } + if( p->pLimit ){ + sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit, 0); + sqlite3TreeViewPop(pView); + } + if( p->pOffset ){ + sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); + sqlite3TreeViewExpr(pView, p->pOffset, 0); + sqlite3TreeViewPop(pView); + } + if( p->pPrior ){ + const char *zOp = "UNION"; + switch( p->op ){ + case TK_ALL: zOp = "UNION ALL"; break; + case TK_INTERSECT: zOp = "INTERSECT"; break; + case TK_EXCEPT: zOp = "EXCEPT"; break; + } + sqlite3TreeViewItem(pView, zOp, (n--)>0); + sqlite3TreeViewSelect(pView, p->pPrior, 0); + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); +} + +/* +** Generate a human-readable explanation of an expression tree. +*/ +void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ + const char *zBinOp = 0; /* Binary operator */ + const char *zUniOp = 0; /* Unary operator */ + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( pExpr==0 ){ + sqlite3TreeViewLine(pView, "nil"); + sqlite3TreeViewPop(pView); + return; + } + switch( pExpr->op ){ + case TK_AGG_COLUMN: { + sqlite3TreeViewLine(pView, "AGG{%d:%d}", + pExpr->iTable, pExpr->iColumn); + break; + } + case TK_COLUMN: { + if( pExpr->iTable<0 ){ + /* This only happens when coding check constraints */ + sqlite3TreeViewLine(pView, "COLUMN(%d)", pExpr->iColumn); + }else{ + sqlite3TreeViewLine(pView, "{%d:%d}", + pExpr->iTable, pExpr->iColumn); + } + break; + } + case TK_INTEGER: { + if( pExpr->flags & EP_IntValue ){ + sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); + }else{ + sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); + } + break; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_STRING: { + sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); + break; + } + case TK_NULL: { + sqlite3TreeViewLine(pView,"NULL"); + break; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_VARIABLE: { + sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", + pExpr->u.zToken, pExpr->iColumn); + break; + } + case TK_REGISTER: { + sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); + break; + } + case TK_AS: { + sqlite3TreeViewLine(pView,"AS %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + case TK_ID: { + sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); + break; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_LT: zBinOp = "LT"; break; + case TK_LE: zBinOp = "LE"; break; + case TK_GT: zBinOp = "GT"; break; + case TK_GE: zBinOp = "GE"; break; + case TK_NE: zBinOp = "NE"; break; + case TK_EQ: zBinOp = "EQ"; break; + case TK_IS: zBinOp = "IS"; break; + case TK_ISNOT: zBinOp = "ISNOT"; break; + case TK_AND: zBinOp = "AND"; break; + case TK_OR: zBinOp = "OR"; break; + case TK_PLUS: zBinOp = "ADD"; break; + case TK_STAR: zBinOp = "MUL"; break; + case TK_MINUS: zBinOp = "SUB"; break; + case TK_REM: zBinOp = "REM"; break; + case TK_BITAND: zBinOp = "BITAND"; break; + case TK_BITOR: zBinOp = "BITOR"; break; + case TK_SLASH: zBinOp = "DIV"; break; + case TK_LSHIFT: zBinOp = "LSHIFT"; break; + case TK_RSHIFT: zBinOp = "RSHIFT"; break; + case TK_CONCAT: zBinOp = "CONCAT"; break; + case TK_DOT: zBinOp = "DOT"; break; + + case TK_UMINUS: zUniOp = "UMINUS"; break; + case TK_UPLUS: zUniOp = "UPLUS"; break; + case TK_BITNOT: zUniOp = "BITNOT"; break; + case TK_NOT: zUniOp = "NOT"; break; + case TK_ISNULL: zUniOp = "ISNULL"; break; + case TK_NOTNULL: zUniOp = "NOTNULL"; break; + + case TK_COLLATE: { + sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_AGG_FUNCTION: + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + if( ExprHasProperty(pExpr, EP_TokenOnly) ){ + pFarg = 0; + }else{ + pFarg = pExpr->x.pList; + } + if( pExpr->op==TK_AGG_FUNCTION ){ + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", + pExpr->op2, pExpr->u.zToken); + }else{ + sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); + } + if( pFarg ){ + sqlite3TreeViewExprList(pView, pFarg, 0, 0); + } + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: { + sqlite3TreeViewLine(pView, "EXISTS-expr"); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_SELECT: { + sqlite3TreeViewLine(pView, "SELECT-expr"); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_IN: { + sqlite3TreeViewLine(pView, "IN"); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + }else{ + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + } + break; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + Expr *pX = pExpr->pLeft; + Expr *pY = pExpr->x.pList->a[0].pExpr; + Expr *pZ = pExpr->x.pList->a[1].pExpr; + sqlite3TreeViewLine(pView, "BETWEEN"); + sqlite3TreeViewExpr(pView, pX, 1); + sqlite3TreeViewExpr(pView, pY, 1); + sqlite3TreeViewExpr(pView, pZ, 0); + break; + } + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + */ + sqlite3TreeViewLine(pView, "%s(%d)", + pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); + break; + } + case TK_CASE: { + sqlite3TreeViewLine(pView, "CASE"); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + const char *zType = "unk"; + switch( pExpr->affinity ){ + case OE_Rollback: zType = "rollback"; break; + case OE_Abort: zType = "abort"; break; + case OE_Fail: zType = "fail"; break; + case OE_Ignore: zType = "ignore"; break; + } + sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); + break; + } +#endif + default: { + sqlite3TreeViewLine(pView, "op=%d", pExpr->op); + break; + } + } + if( zBinOp ){ + sqlite3TreeViewLine(pView, "%s", zBinOp); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + }else if( zUniOp ){ + sqlite3TreeViewLine(pView, "%s", zUniOp); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + } + sqlite3TreeViewPop(pView); +} + +/* +** Generate a human-readable explanation of an expression list. +*/ +void sqlite3TreeViewExprList( + TreeView *pView, + const ExprList *pList, + u8 moreToFollow, + const char *zLabel +){ + int i; + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; inExpr; i++){ + sqlite3TreeViewExpr(pView, pList->a[i].pExpr, inExpr-1); + } + } + sqlite3TreeViewPop(pView); +} + +#endif /* SQLITE_DEBUG */ diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 320a12eef1..5b00368427 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -289,6 +289,7 @@ foreach file { mutex_w32.c malloc.c printf.c + treeview.c random.c threads.c utf.c From f5b5f9b97211e772b49d37dbde0bec9a2bd2eef9 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 8 Jun 2015 17:42:57 +0000 Subject: [PATCH 12/49] Fix typo in comment. No changes to code. FossilOrigin-Name: e49c291735e613e384f6da044ef865dd274cabc8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/printf.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 107500a732..899c066981 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Split\sout\ssome\ssource\scode\sinto\snew\sfiles:\swherecode.c,\swhereexpr.c,\sand\ntreeview.c.\s\sOther\sminor\srefactoring\schanges. -D 2015-06-08T17:40:30.804 +C Fix\stypo\sin\scomment.\s\sNo\schanges\sto\scode. +D 2015-06-08T17:42:57.317 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in a7b384855b72378fd860425b128ea5f75296e9d6 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -246,7 +246,7 @@ F src/pcache1.c 69d137620a305f814398bd29a0c998038c0695e9 F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7 F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 -F src/printf.c 9889e8826f8e2bd8c2718d7d3faa761bef8eac79 +F src/printf.c db11b5960105ee661dcac690f2ae6276e49bf251 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e @@ -1285,7 +1285,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 283bf0b64da7acc5aa5812fc659954965002d409 c32ce54ca46a4be4373983be6fd44b1f3a0250d1 -R b8b4fb0f1a8beaad9f2b2c3f4237ea7b -U drh -Z 5b9788fbc214053ba5053f4dafcfebef +P 50f336818c8509d8b8bde282e9399d2b2b5ea70a +R 960d1cfe6672a4659b85889f9d77d89d +U mistachkin +Z 915f959f38ed01d6c5f7a7f0fd181c25 diff --git a/manifest.uuid b/manifest.uuid index 6f08cec969..3649605487 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -50f336818c8509d8b8bde282e9399d2b2b5ea70a \ No newline at end of file +e49c291735e613e384f6da044ef865dd274cabc8 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index ebdf44518f..72b9497d7b 100644 --- a/src/printf.c +++ b/src/printf.c @@ -7,7 +7,7 @@ ** This file contains code for a set of "printf"-like routines. These ** routines format strings much like the printf() from the standard C ** library, though the implementation here has enhancements to support -** SQLlite. +** SQLite. */ #include "sqliteInt.h" From 4f20cd402b5ba0aa7cccd76fda51ad71d1f8367b Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Jun 2015 18:05:54 +0000 Subject: [PATCH 13/49] Avoid passing constraints that are unusable due to LEFT or CROSS joins to virtual table xBestIndex() methods. FossilOrigin-Name: 80ee56dda7db3860f8be5f6968c8745138f8453f --- ext/rtree/rtreeC.test | 83 +++++++++++++++++++++++++++++++++++++++++++ manifest | 19 +++++----- manifest.uuid | 2 +- src/where.c | 69 +++++++++++++++++++++++++++-------- 4 files changed, 150 insertions(+), 23 deletions(-) diff --git a/ext/rtree/rtreeC.test b/ext/rtree/rtreeC.test index 94db05a4d1..9a64df51d5 100644 --- a/ext/rtree/rtreeC.test +++ b/ext/rtree/rtreeC.test @@ -269,5 +269,88 @@ ifcapable rtree { db close } +#-------------------------------------------------------------------- +# Test that queries featuring LEFT or CROSS JOINS are handled correctly. +# Handled correctly in this case means: +# +# * Terms with prereqs that appear to the left of a LEFT JOIN against +# the virtual table are always available to xBestIndex. +# +# * Terms with prereqs that appear to the right of a LEFT JOIN against +# the virtual table are never available to xBestIndex. +# +# And the same behaviour for CROSS joins. +# +reset_db +do_execsql_test 7.0 { + CREATE TABLE xdir(x1); + CREATE TABLE ydir(y1); + CREATE VIRTUAL TABLE rt USING rtree_i32(id, xmin, xmax, ymin, ymax); + + INSERT INTO xdir VALUES(5); + INSERT INTO ydir VALUES(10); + + INSERT INTO rt VALUES(1, 2, 7, 12, 14); -- Not a hit + INSERT INTO rt VALUES(2, 2, 7, 8, 12); -- A hit! + INSERT INTO rt VALUES(3, 7, 11, 8, 12); -- Not a hit! + INSERT INTO rt VALUES(4, 5, 5, 10, 10); -- A hit! + +} + +proc do_eqp_execsql_test {tn sql res} { + set query "EXPLAIN QUERY PLAN $sql ; $sql " + uplevel [list do_execsql_test $tn $query $res] +} + +do_eqp_execsql_test 7.1 { + SELECT id FROM xdir, rt, ydir + ON (y1 BETWEEN ymin AND ymax) + WHERE (x1 BETWEEN xmin AND xmax); +} { + 0 0 0 {SCAN TABLE xdir} + 0 1 2 {SCAN TABLE ydir} + 0 2 1 {SCAN TABLE rt VIRTUAL TABLE INDEX 2:B2D3B0D1} + 2 4 +} + +do_eqp_execsql_test 7.2 { + SELECT * FROM xdir, rt LEFT JOIN ydir + ON (y1 BETWEEN ymin AND ymax) + WHERE (x1 BETWEEN xmin AND xmax); +} { + 0 0 0 {SCAN TABLE xdir} + 0 1 1 {SCAN TABLE rt VIRTUAL TABLE INDEX 2:B0D1} + 0 2 2 {SCAN TABLE ydir} + + 5 1 2 7 12 14 {} + 5 2 2 7 8 12 10 + 5 4 5 5 10 10 10 +} + +do_eqp_execsql_test 7.3 { + SELECT id FROM xdir, rt CROSS JOIN ydir + ON (y1 BETWEEN ymin AND ymax) + WHERE (x1 BETWEEN xmin AND xmax); +} { + 0 0 0 {SCAN TABLE xdir} + 0 1 1 {SCAN TABLE rt VIRTUAL TABLE INDEX 2:B0D1} + 0 2 2 {SCAN TABLE ydir} + 2 4 +} + +do_eqp_execsql_test 7.4 { + SELECT id FROM rt, xdir CROSS JOIN ydir + ON (y1 BETWEEN ymin AND ymax) + WHERE (x1 BETWEEN xmin AND xmax); +} { + 0 0 1 {SCAN TABLE xdir} + 0 1 0 {SCAN TABLE rt VIRTUAL TABLE INDEX 2:B0D1} + 0 2 2 {SCAN TABLE ydir} + 2 4 +} + +finish_test + + finish_test diff --git a/manifest b/manifest index 899c066981..fb3c09a77c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypo\sin\scomment.\s\sNo\schanges\sto\scode. -D 2015-06-08T17:42:57.317 +C Avoid\spassing\sconstraints\sthat\sare\sunusable\sdue\sto\sLEFT\sor\sCROSS\sjoins\sto\svirtual\stable\sxBestIndex()\smethods. +D 2015-06-08T18:05:54.638 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in a7b384855b72378fd860425b128ea5f75296e9d6 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -156,7 +156,7 @@ F ext/rtree/rtree8.test db79c812f9e4a11f9b1f3f9934007884610a713a F ext/rtree/rtree9.test b5eb13849545dfd271a54ff16784cb00d8792aea F ext/rtree/rtreeA.test ace05e729a36e342d40cf94e9efc7b4723d9dcdf F ext/rtree/rtreeB.test c85f9ce78766c4e68b8b89fbf2979ee9cfa82b4e -F ext/rtree/rtreeC.test df158dcc81f1a43ce7eef361af03c48ec91f1e06 +F ext/rtree/rtreeC.test 90aaaffe2fd4f0dcd12289cad5515f6d41f45ffd F ext/rtree/rtreeD.test 636630357638f5983701550b37f0f5867130d2ca F ext/rtree/rtreeE.test 45a147a64a76306172819562309681d8e90f94bb F ext/rtree/rtreeF.test 66deb9fd1611c7ca2e374adba63debdc2dbb12b4 @@ -327,7 +327,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c a328fcc3342044992644b6a11bf301593b8dafb4 +F src/where.c 38b2c4bea9e7a76f882d49c2808e0907e29e2a6d F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047 F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40 F src/whereexpr.c 9ce1c9cfedbf80c93c7d899497025ec8256ce652 @@ -1285,7 +1285,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 50f336818c8509d8b8bde282e9399d2b2b5ea70a -R 960d1cfe6672a4659b85889f9d77d89d -U mistachkin -Z 915f959f38ed01d6c5f7a7f0fd181c25 +P e49c291735e613e384f6da044ef865dd274cabc8 +R 861f3c87e22a2bd19cbd1623c84fcecb +T *branch * vtab-left-join +T *sym-vtab-left-join * +T -sym-trunk * +U dan +Z 3d7670af603531efb0f4fc0b8b662b61 diff --git a/manifest.uuid b/manifest.uuid index 3649605487..2e337e3eb9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e49c291735e613e384f6da044ef865dd274cabc8 \ No newline at end of file +80ee56dda7db3860f8be5f6968c8745138f8453f \ No newline at end of file diff --git a/src/where.c b/src/where.c index 5c5022c9f6..738c5dbdc4 100644 --- a/src/where.c +++ b/src/where.c @@ -757,6 +757,7 @@ end_auto_index_create: static sqlite3_index_info *allocateIndexInfo( Parse *pParse, WhereClause *pWC, + Bitmask mUnusable, /* Ignore terms with these prereqs */ struct SrcList_item *pSrc, ExprList *pOrderBy ){ @@ -773,6 +774,7 @@ static sqlite3_index_info *allocateIndexInfo( ** to this virtual table */ for(i=nTerm=0, pTerm=pWC->a; inTerm; i++, pTerm++){ if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); testcase( pTerm->eOperator & WO_IN ); testcase( pTerm->eOperator & WO_ISNULL ); @@ -827,6 +829,7 @@ static sqlite3_index_info *allocateIndexInfo( for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ u8 op; if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); testcase( pTerm->eOperator & WO_IN ); testcase( pTerm->eOperator & WO_IS ); @@ -2666,10 +2669,32 @@ static int whereLoopAddBtree( /* ** Add all WhereLoop objects for a table of the join identified by ** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table. +** +** If there are no LEFT or CROSS JOIN joins in the query, both mExtra and +** mUnusable are set to 0. Otherwise, mExtra is a mask of all FROM clause +** entries that occur before the virtual table in the FROM clause and are +** separated from it by at least one LEFT or CROSS JOIN. Similarly, the +** mUnusable mask contains all FROM clause entries that occur after the +** virtual table and are separated from it by at least one LEFT or +** CROSS JOIN. +** +** For example, if the query were: +** +** ... FROM t1, t2 LEFT JOIN t3, t4, vt CROSS JOIN t5, t6; +** +** then mExtra corresponds to (t1, t2) and mUnusable to (t5, t6). +** +** All the tables in mExtra must be scanned before the current virtual +** table. So any terms for which all prerequisites are satisfied by +** mExtra may be specified as "usable" in all calls to xBestIndex. +** Conversely, all tables in mUnusable must be scanned after the current +** virtual table, so any terms for which the prerequisites overlap with +** mUnusable should always be configured as "not-usable" for xBestIndex. */ static int whereLoopAddVirtual( WhereLoopBuilder *pBuilder, /* WHERE clause information */ - Bitmask mExtra + Bitmask mExtra, /* Tables that must be scanned before this one */ + Bitmask mUnusable /* Tables that must be scanned after this one */ ){ WhereInfo *pWInfo; /* WHERE analysis context */ Parse *pParse; /* The parsing context */ @@ -2690,6 +2715,7 @@ static int whereLoopAddVirtual( WhereLoop *pNew; int rc = SQLITE_OK; + assert( (mExtra & mUnusable)==0 ); pWInfo = pBuilder->pWInfo; pParse = pWInfo->pParse; db = pParse->db; @@ -2698,7 +2724,7 @@ static int whereLoopAddVirtual( pSrc = &pWInfo->pTabList->a[pNew->iTab]; pTab = pSrc->pTab; assert( IsVirtual(pTab) ); - pIdxInfo = allocateIndexInfo(pParse, pWC, pSrc, pBuilder->pOrderBy); + pIdxInfo = allocateIndexInfo(pParse, pWC, mUnusable, pSrc,pBuilder->pOrderBy); if( pIdxInfo==0 ) return SQLITE_NOMEM; pNew->prereq = 0; pNew->rSetup = 0; @@ -2728,7 +2754,7 @@ static int whereLoopAddVirtual( if( (pTerm->eOperator & WO_IN)!=0 ){ seenIn = 1; } - if( pTerm->prereqRight!=0 ){ + if( (pTerm->prereqRight & ~mExtra)!=0 ){ seenVar = 1; }else if( (pTerm->eOperator & WO_IN)==0 ){ pIdxCons->usable = 1; @@ -2736,7 +2762,7 @@ static int whereLoopAddVirtual( break; case 1: /* Constants with IN operators */ assert( seenIn ); - pIdxCons->usable = (pTerm->prereqRight==0); + pIdxCons->usable = (pTerm->prereqRight & ~mExtra)==0; break; case 2: /* Variables without IN */ assert( seenVar ); @@ -2835,7 +2861,11 @@ whereLoopAddVtab_exit: ** Add WhereLoop entries to handle OR terms. This works for either ** btrees or virtual tables. */ -static int whereLoopAddOr(WhereLoopBuilder *pBuilder, Bitmask mExtra){ +static int whereLoopAddOr( + WhereLoopBuilder *pBuilder, + Bitmask mExtra, + Bitmask mUnusable +){ WhereInfo *pWInfo = pBuilder->pWInfo; WhereClause *pWC; WhereLoop *pNew; @@ -2894,14 +2924,14 @@ static int whereLoopAddOr(WhereLoopBuilder *pBuilder, Bitmask mExtra){ #endif #ifndef SQLITE_OMIT_VIRTUALTABLE if( IsVirtual(pItem->pTab) ){ - rc = whereLoopAddVirtual(&sSubBuild, mExtra); + rc = whereLoopAddVirtual(&sSubBuild, mExtra, mUnusable); }else #endif { rc = whereLoopAddBtree(&sSubBuild, mExtra); } if( rc==SQLITE_OK ){ - rc = whereLoopAddOr(&sSubBuild, mExtra); + rc = whereLoopAddOr(&sSubBuild, mExtra, mUnusable); } assert( rc==SQLITE_OK || sCur.n==0 ); if( sCur.n==0 ){ @@ -2963,33 +2993,44 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ int iTab; SrcList *pTabList = pWInfo->pTabList; struct SrcList_item *pItem; + struct SrcList_item *pEnd = &pTabList->a[pWInfo->nLevel]; sqlite3 *db = pWInfo->pParse->db; - int nTabList = pWInfo->nLevel; int rc = SQLITE_OK; - u8 priorJoinType = 0; WhereLoop *pNew; + pNew = pBuilder->pNew; + whereLoopInit(pNew); + /* Loop over the tables in the join, from left to right */ pNew = pBuilder->pNew; whereLoopInit(pNew); - for(iTab=0, pItem=pTabList->a; iTaba; pItemiTab = iTab; pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); - if( ((pItem->jointype|priorJoinType) & (JT_LEFT|JT_CROSS))!=0 ){ + if( (pItem->jointype & (JT_LEFT|JT_CROSS))!=0 ){ + /* This condition is true when pItem is the FROM clause term on the + ** right-hand-side of a LEFT or CROSS JOIN. */ mExtra = mPrior; } - priorJoinType = pItem->jointype; if( IsVirtual(pItem->pTab) ){ - rc = whereLoopAddVirtual(pBuilder, mExtra); + struct SrcList_item *p; + for(p=&pItem[1]; pjointype & (JT_LEFT|JT_CROSS)) ){ + mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); + } + } + rc = whereLoopAddVirtual(pBuilder, mExtra, mUnusable); }else{ rc = whereLoopAddBtree(pBuilder, mExtra); } if( rc==SQLITE_OK ){ - rc = whereLoopAddOr(pBuilder, mExtra); + rc = whereLoopAddOr(pBuilder, mExtra, mUnusable); } mPrior |= pNew->maskSelf; if( rc || db->mallocFailed ) break; } + whereLoopClear(db, pNew); return rc; } From 35175bf7ab1b4aa3e91119d7d8dde8292f891129 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Jun 2015 18:48:29 +0000 Subject: [PATCH 14/49] If a query contains "FROM t1 LEFT JOIN t2, t3, t4", ensure that tables t3 and t4 are not scanned before t2. The trunk already does this. FossilOrigin-Name: 0d9edfab9fb61322620f188b48ae2a1798a07581 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/where.c | 4 +++- test/join.test | 26 ++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index fb3c09a77c..6b7f8b83ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\spassing\sconstraints\sthat\sare\sunusable\sdue\sto\sLEFT\sor\sCROSS\sjoins\sto\svirtual\stable\sxBestIndex()\smethods. -D 2015-06-08T18:05:54.638 +C If\sa\squery\scontains\s"FROM\st1\sLEFT\sJOIN\st2,\st3,\st4",\sensure\sthat\stables\st3\sand\st4\sare\snot\sscanned\sbefore\st2.\sThe\strunk\salready\sdoes\sthis. +D 2015-06-08T18:48:29.533 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in a7b384855b72378fd860425b128ea5f75296e9d6 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -327,7 +327,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c 38b2c4bea9e7a76f882d49c2808e0907e29e2a6d +F src/where.c d98dd9461feb44daabfa0fe64831970bc0daacf2 F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047 F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40 F src/whereexpr.c 9ce1c9cfedbf80c93c7d899497025ec8256ce652 @@ -709,7 +709,7 @@ F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/join.test 52d4d49f86d0cf46926672878c4eaf0da399104a +F test/join.test f9d4a28dec81c6e9dc21b73518e024d73b5ebf57 F test/join2.test f2171c265e57ee298a27e57e7051d22962f9f324 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1285,10 +1285,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e49c291735e613e384f6da044ef865dd274cabc8 -R 861f3c87e22a2bd19cbd1623c84fcecb -T *branch * vtab-left-join -T *sym-vtab-left-join * -T -sym-trunk * +P 80ee56dda7db3860f8be5f6968c8745138f8453f +R dd22f5dd58533915c3eebee09006a2ae U dan -Z 3d7670af603531efb0f4fc0b8b662b61 +Z 7d33e5ba0e6b939fee95e64c7940bec7 diff --git a/manifest.uuid b/manifest.uuid index 2e337e3eb9..150167c0c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -80ee56dda7db3860f8be5f6968c8745138f8453f \ No newline at end of file +0d9edfab9fb61322620f188b48ae2a1798a07581 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 738c5dbdc4..41ff393cde 100644 --- a/src/where.c +++ b/src/where.c @@ -2997,6 +2997,7 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ sqlite3 *db = pWInfo->pParse->db; int rc = SQLITE_OK; WhereLoop *pNew; + u8 priorJointype = 0; pNew = pBuilder->pNew; whereLoopInit(pNew); @@ -3008,11 +3009,12 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ Bitmask mUnusable = 0; pNew->iTab = iTab; pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); - if( (pItem->jointype & (JT_LEFT|JT_CROSS))!=0 ){ + if( ((pItem->jointype|priorJointype) & (JT_LEFT|JT_CROSS))!=0 ){ /* This condition is true when pItem is the FROM clause term on the ** right-hand-side of a LEFT or CROSS JOIN. */ mExtra = mPrior; } + priorJointype = pItem->jointype; if( IsVirtual(pItem->pTab) ){ struct SrcList_item *p; for(p=&pItem[1]; p Date: Mon, 8 Jun 2015 19:15:50 +0000 Subject: [PATCH 15/49] Add the valgrindfuzz target to unix makefile. FossilOrigin-Name: e62aed01f1a6dbc12d6e21386c1671eb640b8d49 --- Makefile.in | 8 +++++--- main.mk | 6 ++++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Makefile.in b/Makefile.in index 1b7c7f9dc5..ded1687d34 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1004,9 +1004,12 @@ fulltestonly: $(TESTPROGS) ./testfixture$(TEXE) $(TOP)/test/full.test # Fuzz testing -fuzztest: fuzzcheck$(TEXE) +fuzztest: fuzzcheck$(TEXE) $(FUZZDATA) ./fuzzcheck$(TEXE) $(FUZZDATA) +valgrindfuzz: fuzzcheck$(TEXT) $(FUZZDATA) + valgrind ./fuzzcheck$(TEXE) --cell-size-check --quiet $(FUZZDATA) + # This is the common case. Run many tests but not those that take # a really long time. # @@ -1016,8 +1019,7 @@ test: $(TESTPROGS) fuzztest # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. # -valgrindtest: $(TESTPROGS) fuzzcheck$(TEXE) - valgrind -v ./fuzzcheck$(TEXE) --cell-size-check --quiet $(FUZZDATA) +valgrindtest: $(TESTPROGS) valgrindfuzz OMIT_MISUSE=1 valgrind -v ./testfixture$(TEXE) $(TOP)/test/permutations.test valgrind # A very fast test that checks basic sanity. The name comes from diff --git a/main.mk b/main.mk index 22fc700a75..b76972a9ed 100644 --- a/main.mk +++ b/main.mk @@ -682,14 +682,16 @@ queryplantest: testfixture$(EXE) sqlite3$(EXE) fuzztest: fuzzcheck$(EXE) $(FUZZDATA) ./fuzzcheck$(EXE) $(FUZZDATA) +valgrindfuzz: fuzzcheck$(EXE) $(FUZZDATA) + valgrind ./fuzzcheck$(EXE) --cell-size-check --quiet $(FUZZDATA) + test: $(TESTPROGS) fuzztest ./testfixture$(EXE) $(TOP)/test/veryquick.test # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. # -valgrindtest: $(TESTPROGS) fuzzcheck$(EXE) $(FUZZDATA) - valgrind -v ./fuzzcheck$(EXE) --cell-size-check --quiet $(FUZZDATA) +valgrindtest: $(TESTPROGS) valgrindfuzz OMIT_MISUSE=1 valgrind -v ./testfixture$(EXE) $(TOP)/test/permutations.test valgrind # A very fast test that checks basic sanity. The name comes from diff --git a/manifest b/manifest index 899c066981..379ae835a6 100644 --- a/manifest +++ b/manifest @@ -1,7 +1,7 @@ -C Fix\stypo\sin\scomment.\s\sNo\schanges\sto\scode. -D 2015-06-08T17:42:57.317 +C Add\sthe\svalgrindfuzz\starget\sto\sunix\smakefile. +D 2015-06-08T19:15:50.266 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in a7b384855b72378fd860425b128ea5f75296e9d6 +F Makefile.in 580e006530fab67ccd34926ce2eda66d326af60f F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.msc 5438dc167466f51349ab0c4497aef547d0c9352c F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 @@ -171,7 +171,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk dc931768b88e4417bc2f8b2d45dba385ad29f727 +F main.mk 033741a45df95c577814914b13d182a0b6c7dc89 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk d5e22023b5238985bb54a72d33e0ac71fe4f8a32 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -1285,7 +1285,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 50f336818c8509d8b8bde282e9399d2b2b5ea70a -R 960d1cfe6672a4659b85889f9d77d89d -U mistachkin -Z 915f959f38ed01d6c5f7a7f0fd181c25 +P e49c291735e613e384f6da044ef865dd274cabc8 +R 038506d4cfda1e2a7849e18cec45efaf +U drh +Z dac87b83585efac2cb7ce09058568bbf diff --git a/manifest.uuid b/manifest.uuid index 3649605487..45549e71bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e49c291735e613e384f6da044ef865dd274cabc8 \ No newline at end of file +e62aed01f1a6dbc12d6e21386c1671eb640b8d49 \ No newline at end of file From 4430b40934f9a5bb4a217123faddf0359e767b5e Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Jun 2015 10:58:51 +0000 Subject: [PATCH 16/49] Remove some repeated lines of source code. Probably introduced by careless cut'n'pasting. FossilOrigin-Name: a34cd71c8aafaece04a2332a127e9b8e99c1403c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 3 --- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6b7f8b83ec..a11cdef71e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sa\squery\scontains\s"FROM\st1\sLEFT\sJOIN\st2,\st3,\st4",\sensure\sthat\stables\st3\sand\st4\sare\snot\sscanned\sbefore\st2.\sThe\strunk\salready\sdoes\sthis. -D 2015-06-08T18:48:29.533 +C Remove\ssome\srepeated\slines\sof\ssource\scode.\sProbably\sintroduced\sby\scareless\scut'n'pasting. +D 2015-06-09T10:58:51.586 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in a7b384855b72378fd860425b128ea5f75296e9d6 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -327,7 +327,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c d98dd9461feb44daabfa0fe64831970bc0daacf2 +F src/where.c 95c0fbfff7aef890b5da7293f6d85cd9a5f99af8 F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047 F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40 F src/whereexpr.c 9ce1c9cfedbf80c93c7d899497025ec8256ce652 @@ -1285,7 +1285,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 80ee56dda7db3860f8be5f6968c8745138f8453f -R dd22f5dd58533915c3eebee09006a2ae +P 0d9edfab9fb61322620f188b48ae2a1798a07581 +R 95c7a86e3c55ce5e80eb0382016d2fb7 U dan -Z 7d33e5ba0e6b939fee95e64c7940bec7 +Z e08af2de2874802b3cdcc1dde01f104f diff --git a/manifest.uuid b/manifest.uuid index 150167c0c5..e98d7dc3b7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d9edfab9fb61322620f188b48ae2a1798a07581 \ No newline at end of file +a34cd71c8aafaece04a2332a127e9b8e99c1403c \ No newline at end of file diff --git a/src/where.c b/src/where.c index 41ff393cde..e32d176eac 100644 --- a/src/where.c +++ b/src/where.c @@ -2999,9 +2999,6 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ WhereLoop *pNew; u8 priorJointype = 0; - pNew = pBuilder->pNew; - whereLoopInit(pNew); - /* Loop over the tables in the join, from left to right */ pNew = pBuilder->pNew; whereLoopInit(pNew); From 17c0823bdaeadde5c68d4e1c9d9a0ddeb1f6a581 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Jun 2015 15:58:28 +0000 Subject: [PATCH 17/49] Add the --output=$file and --verbose=(0|1|file) options to tester.tcl. FossilOrigin-Name: f7b2c70362f10ee0347c1d2318918ffefa53243d --- manifest | 14 ++-- manifest.uuid | 2 +- test/tester.tcl | 200 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 158 insertions(+), 58 deletions(-) diff --git a/manifest b/manifest index 379ae835a6..5c3fac5012 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\svalgrindfuzz\starget\sto\sunix\smakefile. -D 2015-06-08T19:15:50.266 +C Add\sthe\s--output=$file\sand\s--verbose=(0|1|file)\soptions\sto\stester.tcl. +D 2015-06-09T15:58:28.618 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 580e006530fab67ccd34926ce2eda66d326af60f F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -949,7 +949,7 @@ F test/tclsqlite.test 7fb866443c7deceed22b63948ccd6f76b52ad054 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptrigger.test 8ec228b0db5d7ebc4ee9b458fc28cb9e7873f5e1 -F test/tester.tcl c18dbf42f4b0c1fb889b0efeb8a59d5143dd9828 +F test/tester.tcl ca396a3f867c1bd3603400ca8f17bbffd87985b7 F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1285,7 +1285,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e49c291735e613e384f6da044ef865dd274cabc8 -R 038506d4cfda1e2a7849e18cec45efaf -U drh -Z dac87b83585efac2cb7ce09058568bbf +P e62aed01f1a6dbc12d6e21386c1671eb640b8d49 +R f55cc3f41ca69cff9ff874d367e120de +U dan +Z 528ec808c863ae4b55820f5f3962de4a diff --git a/manifest.uuid b/manifest.uuid index 45549e71bb..0bf4f52403 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e62aed01f1a6dbc12d6e21386c1671eb640b8d49 \ No newline at end of file +f7b2c70362f10ee0347c1d2318918ffefa53243d \ No newline at end of file diff --git a/test/tester.tcl b/test/tester.tcl index 794ea4a406..a83054fbe7 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -81,6 +81,12 @@ # permutation # presql # +# Command to test whether or not --verbose=1 was specified on the command +# line (returns 0 for not-verbose, 1 for verbose and 2 for "verbose in the +# output file only"). +# +# verbose +# # Set the precision of FP arithmatic used by the interpreter. And # configure SQLite to take database file locks on the page that begins @@ -388,6 +394,9 @@ if {[info exists cmdlinearg]==0} { # --file-retry-delay=N # --start=[$permutation:]$testfile # --match=$pattern + # --verbose=$val + # --output=$filename + # --help # set cmdlinearg(soft-heap-limit) 0 set cmdlinearg(maxerror) 1000 @@ -399,6 +408,8 @@ if {[info exists cmdlinearg]==0} { set cmdlinearg(file-retry-delay) 0 set cmdlinearg(start) "" set cmdlinearg(match) "" + set cmdlinearg(verbose) "" + set cmdlinearg(output) "" set leftover [list] foreach a $argv { @@ -457,6 +468,22 @@ if {[info exists cmdlinearg]==0} { set ::G(match) $cmdlinearg(match) if {$::G(match) == ""} {unset ::G(match)} } + + {^-+output=.+$} { + foreach {dummy cmdlinearg(output)} [split $a =] break + if {$cmdlinearg(verbose)==""} { + set cmdlinearg(verbose) 2 + } + } + {^-+verbose=.+$} { + foreach {dummy cmdlinearg(verbose)} [split $a =] break + if {$cmdlinearg(verbose)=="file"} { + set cmdlinearg(verbose) 2 + } elseif {[string is boolean -strict $cmdlinearg(verbose)]==0} { + error "option --verbose= must be set to a boolean or to \"file\"" + } + } + default { lappend leftover $a } @@ -484,6 +511,16 @@ if {[info exists cmdlinearg]==0} { if {$cmdlinearg(malloctrace)} { sqlite3_memdebug_backtrace $cmdlinearg(backtrace) } + + if {$cmdlinearg(output)!=""} { + puts "Copying output to file $cmdlinearg(output)" + set ::G(output_fd) [open $cmdlinearg(output) w] + fconfigure $::G(output_fd) -buffering line + } + + if {$cmdlinearg(verbose)==""} { + set cmdlinearg(verbose) 1 + } } # Update the soft-heap-limit each time this script is run. In that @@ -554,7 +591,7 @@ proc fail_test {name} { set nFail [set_test_counter errors] if {$nFail>=$::cmdlinearg(maxerror)} { - puts "*** Giving up..." + output2 "*** Giving up..." finalize_testing } } @@ -562,7 +599,7 @@ proc fail_test {name} { # Remember a warning message to be displayed at the conclusion of all testing # proc warning {msg {append 1}} { - puts "Warning: $msg" + output2 "Warning: $msg" set warnList [set_test_counter warn_list] if {$append} { lappend warnList $msg @@ -577,6 +614,61 @@ proc incr_ntest {} { set_test_counter count [expr [set_test_counter count] + 1] } +# Return true if --verbose=1 was specified on the command line. Otherwise, +# return false. +# +proc verbose {} { + return $::cmdlinearg(verbose) +} + +# Use the following commands instead of [puts] for test output within +# this file. Test scripts can still use regular [puts], which is directed +# to stdout and, if one is open, the --output file. +# +# output1: output that should be printed if --verbose=1 was specified. +# output2: output that should be printed unconditionally. +# output2_if_no_verbose: output that should be printed only if --verbose=0. +# +proc output1 {args} { + set v [verbose] + if {$v==1} { + uplevel output2 $args + } elseif {$v==2} { + uplevel puts [lrange $args 0 end-1] $::G(output_fd) [lrange $args end end] + } +} +proc output2 {args} { + set nArg [llength $args] + uplevel puts $args +} +proc output2_if_no_verbose {args} { + set v [verbose] + if {$v==0} { + uplevel output2 $args + } elseif {$v==2} { + uplevel puts [lrange $args 0 end-1] stdout [lrange $args end end] + } +} + +# Override the [puts] command so that if no channel is explicitly +# specified the string is written to both stdout and to the file +# specified by "--output=", if any. +# +proc puts_override {args} { + set nArg [llength $args] + if {$nArg==1 || ($nArg==2 && [string first [lindex $args 0] -nonewline]==0)} { + uplevel puts_original $args + if {[info exists ::G(output_fd)]} { + uplevel puts [lrange $args 0 end-1] $::G(output_fd) [lrange $args end end] + } + } else { + # A channel was explicitly specified. + uplevel puts_original $args + } +} +rename puts puts_original +proc puts {args} { uplevel puts_override $args } + # Invoke the do_test procedure to run a single test # @@ -604,12 +696,13 @@ proc do_test {name cmd expected} { } incr_ntest - puts -nonewline $name... + output1 -nonewline $name... flush stdout if {![info exists ::G(match)] || [string match $::G(match) $name]} { if {[catch {uplevel #0 "$cmd;\n"} result]} { - puts "\nError: $result" + output2_if_no_verbose -nonewline $name... + output2 "\nError: $result" fail_test $name } else { if {[regexp {^~?/.*/$} $expected]} { @@ -653,14 +746,15 @@ proc do_test {name cmd expected} { # if {![info exists ::testprefix] || $::testprefix eq ""} { # error "no test prefix" # } - puts "\nExpected: \[$expected\]\n Got: \[$result\]" + output2_if_no_verbose -nonewline $name... + output2 "\nExpected: \[$expected\]\n Got: \[$result\]" fail_test $name } else { - puts " Ok" + output1 " Ok" } } } else { - puts " Omitted" + output1 " Omitted" omit_test $name "pattern mismatch" 0 } flush stdout @@ -837,7 +931,7 @@ proc delete_all_data {} { # Return the number of microseconds per statement. # proc speed_trial {name numstmt units sql} { - puts -nonewline [format {%-21.21s } $name...] + output2 -nonewline [format {%-21.21s } $name...] flush stdout set speed [time {sqlite3_exec_nr db $sql}] set tm [lindex $speed 0] @@ -847,13 +941,13 @@ proc speed_trial {name numstmt units sql} { set rate [format %20.5f [expr {1000000.0*$numstmt/$tm}]] } set u2 $units/s - puts [format {%12d uS %s %s} $tm $rate $u2] + output2 [format {%12d uS %s %s} $tm $rate $u2] global total_time set total_time [expr {$total_time+$tm}] lappend ::speed_trial_times $name $tm } proc speed_trial_tcl {name numstmt units script} { - puts -nonewline [format {%-21.21s } $name...] + output2 -nonewline [format {%-21.21s } $name...] flush stdout set speed [time {eval $script}] set tm [lindex $speed 0] @@ -863,7 +957,7 @@ proc speed_trial_tcl {name numstmt units script} { set rate [format %20.5f [expr {1000000.0*$numstmt/$tm}]] } set u2 $units/s - puts [format {%12d uS %s %s} $tm $rate $u2] + output2 [format {%12d uS %s %s} $tm $rate $u2] global total_time set total_time [expr {$total_time+$tm}] lappend ::speed_trial_times $name $tm @@ -875,19 +969,19 @@ proc speed_trial_init {name} { sqlite3 versdb :memory: set vers [versdb one {SELECT sqlite_source_id()}] versdb close - puts "SQLite $vers" + output2 "SQLite $vers" } proc speed_trial_summary {name} { global total_time - puts [format {%-21.21s %12d uS TOTAL} $name $total_time] + output2 [format {%-21.21s %12d uS TOTAL} $name $total_time] if { 0 } { sqlite3 versdb :memory: set vers [lindex [versdb one {SELECT sqlite_source_id()}] 0] versdb close - puts "CREATE TABLE IF NOT EXISTS time(version, script, test, us);" + output2 "CREATE TABLE IF NOT EXISTS time(version, script, test, us);" foreach {test us} $::speed_trial_times { - puts "INSERT INTO time VALUES('$vers', '$name', '$test', $us);" + output2 "INSERT INTO time VALUES('$vers', '$name', '$test', $us);" } } } @@ -931,75 +1025,75 @@ proc finalize_testing {} { } } if {$nKnown>0} { - puts "[expr {$nErr-$nKnown}] new errors and $nKnown known errors\ + output2 "[expr {$nErr-$nKnown}] new errors and $nKnown known errors\ out of $nTest tests" } else { - puts "$nErr errors out of $nTest tests" + output2 "$nErr errors out of $nTest tests" } if {$nErr>$nKnown} { - puts -nonewline "Failures on these tests:" + output2 -nonewline "Failures on these tests:" foreach x [set_test_counter fail_list] { - if {![info exists known_error($x)]} {puts -nonewline " $x"} + if {![info exists known_error($x)]} {output2 -nonewline " $x"} } - puts "" + output2 "" } foreach warning [set_test_counter warn_list] { - puts "Warning: $warning" + output2 "Warning: $warning" } run_thread_tests 1 if {[llength $omitList]>0} { - puts "Omitted test cases:" + output2 "Omitted test cases:" set prec {} foreach {rec} [lsort $omitList] { if {$rec==$prec} continue set prec $rec - puts [format { %-12s %s} [lindex $rec 0] [lindex $rec 1]] + output2 [format { %-12s %s} [lindex $rec 0] [lindex $rec 1]] } } if {$nErr>0 && ![working_64bit_int]} { - puts "******************************************************************" - puts "N.B.: The version of TCL that you used to build this test harness" - puts "is defective in that it does not support 64-bit integers. Some or" - puts "all of the test failures above might be a result from this defect" - puts "in your TCL build." - puts "******************************************************************" + output2 "******************************************************************" + output2 "N.B.: The version of TCL that you used to build this test harness" + output2 "is defective in that it does not support 64-bit integers. Some or" + output2 "all of the test failures above might be a result from this defect" + output2 "in your TCL build." + output2 "******************************************************************" } if {$::cmdlinearg(binarylog)} { vfslog finalize binarylog } if {$sqlite_open_file_count} { - puts "$sqlite_open_file_count files were left open" + output2 "$sqlite_open_file_count files were left open" incr nErr } if {[lindex [sqlite3_status SQLITE_STATUS_MALLOC_COUNT 0] 1]>0 || [sqlite3_memory_used]>0} { - puts "Unfreed memory: [sqlite3_memory_used] bytes in\ + output2 "Unfreed memory: [sqlite3_memory_used] bytes in\ [lindex [sqlite3_status SQLITE_STATUS_MALLOC_COUNT 0] 1] allocations" incr nErr ifcapable memdebug||mem5||(mem3&&debug) { - puts "Writing unfreed memory log to \"./memleak.txt\"" + output2 "Writing unfreed memory log to \"./memleak.txt\"" sqlite3_memdebug_dump ./memleak.txt } } else { - puts "All memory allocations freed - no leaks" + output2 "All memory allocations freed - no leaks" ifcapable memdebug||mem5 { sqlite3_memdebug_dump ./memusage.txt } } show_memstats - puts "Maximum memory usage: [sqlite3_memory_highwater 1] bytes" - puts "Current memory usage: [sqlite3_memory_highwater] bytes" + output2 "Maximum memory usage: [sqlite3_memory_highwater 1] bytes" + output2 "Current memory usage: [sqlite3_memory_highwater] bytes" if {[info commands sqlite3_memdebug_malloc_count] ne ""} { - puts "Number of malloc() : [sqlite3_memdebug_malloc_count] calls" + output2 "Number of malloc() : [sqlite3_memdebug_malloc_count] calls" } if {$::cmdlinearg(malloctrace)} { - puts "Writing mallocs.sql..." + output2 "Writing mallocs.sql..." memdebug_log_sql sqlite3_memdebug_log stop sqlite3_memdebug_log clear if {[sqlite3_memory_used]>0} { - puts "Writing leaks.sql..." + output2 "Writing leaks.sql..." sqlite3_memdebug_log sync memdebug_log_sql leaks.sql } @@ -1020,30 +1114,30 @@ proc show_memstats {} { set y [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] set val [format {now %10d max %10d max-size %10d} \ [lindex $x 1] [lindex $x 2] [lindex $y 2]] - puts "Memory used: $val" + output1 "Memory used: $val" set x [sqlite3_status SQLITE_STATUS_MALLOC_COUNT 0] set val [format {now %10d max %10d} [lindex $x 1] [lindex $x 2]] - puts "Allocation count: $val" + output1 "Allocation count: $val" set x [sqlite3_status SQLITE_STATUS_PAGECACHE_USED 0] set y [sqlite3_status SQLITE_STATUS_PAGECACHE_SIZE 0] set val [format {now %10d max %10d max-size %10d} \ [lindex $x 1] [lindex $x 2] [lindex $y 2]] - puts "Page-cache used: $val" + output1 "Page-cache used: $val" set x [sqlite3_status SQLITE_STATUS_PAGECACHE_OVERFLOW 0] set val [format {now %10d max %10d} [lindex $x 1] [lindex $x 2]] - puts "Page-cache overflow: $val" + output1 "Page-cache overflow: $val" set x [sqlite3_status SQLITE_STATUS_SCRATCH_USED 0] set val [format {now %10d max %10d} [lindex $x 1] [lindex $x 2]] - puts "Scratch memory used: $val" + output1 "Scratch memory used: $val" set x [sqlite3_status SQLITE_STATUS_SCRATCH_OVERFLOW 0] set y [sqlite3_status SQLITE_STATUS_SCRATCH_SIZE 0] set val [format {now %10d max %10d max-size %10d} \ [lindex $x 1] [lindex $x 2] [lindex $y 2]] - puts "Scratch overflow: $val" + output1 "Scratch overflow: $val" ifcapable yytrackmaxstackdepth { set x [sqlite3_status SQLITE_STATUS_PARSER_STACK 0] set val [format { max %10d} [lindex $x 2]] - puts "Parser stack depth: $val" + output2 "Parser stack depth: $val" } } @@ -1058,7 +1152,7 @@ proc execsql_timed {sql {db db}} { set x [uplevel [list $db eval $sql]] } 1] set tm [lindex $tm 0] - puts -nonewline " ([expr {$tm*0.001}]ms) " + output1 -nonewline " ([expr {$tm*0.001}]ms) " set x } @@ -1595,9 +1689,9 @@ proc do_ioerr_test {testname args} { set nowcksum [cksum] set res [expr {$nowcksum==$::checksum || $nowcksum==$::goodcksum}] if {$res==0} { - puts "now=$nowcksum" - puts "the=$::checksum" - puts "fwd=$::goodcksum" + output2 "now=$nowcksum" + output2 "the=$::checksum" + output2 "fwd=$::goodcksum" } set res } 1 @@ -1821,6 +1915,12 @@ proc slave_test_script {script} { interp eval tinterp [list set $var $value] } + # If output is being copied into a file, share the file-descriptor with + # the interpreter. + if {[info exists ::G(output_fd)]} { + interp share {} $::G(output_fd) tinterp + } + # The alias used to access the global test counters. tinterp alias set_test_counter set_test_counter @@ -1889,7 +1989,7 @@ proc slave_test_file {zFile} { # Add some info to the output. # - puts "Time: $tail $ms ms" + output2 "Time: $tail $ms ms" show_memstats } From 905da63a82e789d2f5decd74fff707488886287a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 10 Jun 2015 18:53:09 +0000 Subject: [PATCH 18/49] "test" targets on all makefiles use --verbose=file --output=test-out.txt. Add the new "quicktest" target to all makefiles - designed to run in under three minutes. The --quick option on releasetest.tcl now uses quicktest. FossilOrigin-Name: 6ddef2ad35ceb5822fc14c65bc7c6a2662edb63c --- Makefile.in | 23 ++++++++++++++++------- Makefile.msc | 23 +++++++++++++++++------ main.mk | 28 +++++++++++++++++++++------- manifest | 27 ++++++++++++++------------- manifest.uuid | 2 +- test/analyzer1.test | 5 +++++ test/extraquick.test | 16 ++++++++++++++++ test/permutations.test | 17 ++++++++++++++--- test/releasetest.tcl | 7 +++++-- test/sqldiff1.test | 5 +++++ 10 files changed, 114 insertions(+), 39 deletions(-) create mode 100644 test/extraquick.test diff --git a/Makefile.in b/Makefile.in index ded1687d34..8952866dc6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -535,6 +535,10 @@ FUZZDATA = \ $(TOP)/test/fuzzdata2.db \ $(TOP)/test/fuzzdata3.db +# Standard options to testfixture +# +TESTOPTS = --verbose=file --output=test-out.txt + # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. # @@ -993,11 +997,11 @@ testfixture$(TEXE): $(TESTFIXTURE_SRC) # A very detailed test running most or all test cases fulltest: $(TESTPROGS) fuzztest - ./testfixture$(TEXE) $(TOP)/test/all.test + ./testfixture$(TEXE) $(TOP)/test/all.test $(TESTOPTS) # Really really long testing soaktest: $(TESTPROGS) - ./testfixture$(TEXE) $(TOP)/test/all.test -soak=1 + ./testfixture$(TEXE) $(TOP)/test/all.test -soak=1 $(TESTOPTS) # Do extra testing but not everything. fulltestonly: $(TESTPROGS) @@ -1010,24 +1014,29 @@ fuzztest: fuzzcheck$(TEXE) $(FUZZDATA) valgrindfuzz: fuzzcheck$(TEXT) $(FUZZDATA) valgrind ./fuzzcheck$(TEXE) --cell-size-check --quiet $(FUZZDATA) -# This is the common case. Run many tests but not those that take -# a really long time. +# Minimal testing that runs in less than 3 minutes +# +quicktest: ./testfixture$(TEXE) + ./testfixture$(TEXE) $(TOP)/test/extraquick.test $(TESTOPTS) + +# This is the common case. Run many tests that do not take too long, +# including fuzzcheck, sqlite3_analyzer, and sqldiff tests. # test: $(TESTPROGS) fuzztest - ./testfixture$(TEXE) $(TOP)/test/veryquick.test + ./testfixture$(TEXE) $(TOP)/test/veryquick.test $(TESTOPTS) # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. # valgrindtest: $(TESTPROGS) valgrindfuzz - OMIT_MISUSE=1 valgrind -v ./testfixture$(TEXE) $(TOP)/test/permutations.test valgrind + OMIT_MISUSE=1 valgrind -v ./testfixture$(TEXE) $(TOP)/test/permutations.test valgrind $(TESTOPTS) # A very fast test that checks basic sanity. The name comes from # the 60s-era electronics testing: "Turn it on and see if smoke # comes out." # smoketest: $(TESTPROGS) fuzzcheck$(TEXE) - ./testfixture$(TEXE) $(TOP)/test/main.test + ./testfixture$(TEXE) $(TOP)/test/main.test $(TESTOPTS) sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl echo "#define TCLSH 2" > $@ diff --git a/Makefile.msc b/Makefile.msc index c3272de0de..f29f66cce3 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1203,6 +1203,9 @@ FUZZDATA = \ $(TOP)\test\fuzzdata2.db \ $(TOP)\test\fuzzdata3.db +# Standard options to testfixture +# +TESTOPTS = --verbose=file --output=test-out.txt # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. @@ -1677,28 +1680,36 @@ testfixture.exe: $(TESTFIXTURE_SRC) $(LIBRESOBJS) $(HDR) /link $(LTLINKOPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LTLIBS) $(TLIBS) extensiontest: testfixture.exe testloadext.dll - .\testfixture.exe $(TOP)\test\loadext.test + .\testfixture.exe $(TOP)\test\loadext.test $(TESTOPTS) fulltest: $(TESTPROGS) fuzztest - .\testfixture.exe $(TOP)\test\all.test + .\testfixture.exe $(TOP)\test\all.test $(TESTOPTS) soaktest: $(TESTPROGS) - .\testfixture.exe $(TOP)\test\all.test -soak=1 + .\testfixture.exe $(TOP)\test\all.test -soak=1 $(TESTOPTS) fulltestonly: $(TESTPROGS) fuzztest .\testfixture.exe $(TOP)\test\full.test queryplantest: testfixture.exe sqlite3.exe - .\testfixture.exe $(TOP)\test\permutations.test queryplanner + .\testfixture.exe $(TOP)\test\permutations.test queryplanner $(TESTOPTS) fuzztest: fuzzcheck.exe .\fuzzcheck.exe $(FUZZDATA) +# Minimal testing that runs in less than 3 minutes (on a fast machine) +# +quicktest: .\testfixture.exe + .\testfixture.exe $(TOP)\test\extraquick.test $(TESTOPTS) + +# This is the common case. Run many tests that do not take too long, +# including fuzzcheck, sqlite3_analyzer, and sqldiff tests. +# test: $(TESTPROGS) fuzztest - .\testfixture.exe $(TOP)\test\veryquick.test + .\testfixture.exe $(TOP)\test\veryquick.test $(TESTOPTS) smoketest: $(TESTPROGS) - .\testfixture.exe $(TOP)\test\main.test + .\testfixture.exe $(TOP)\test\main.test $(TESTOPTS) sqlite3_analyzer.c: $(SQLITE3C) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl echo #define TCLSH 2 > $@ diff --git a/main.mk b/main.mk index b76972a9ed..3131386f3a 100644 --- a/main.mk +++ b/main.mk @@ -416,6 +416,10 @@ FUZZDATA = \ $(TOP)/test/fuzzdata2.db \ $(TOP)/test/fuzzdata3.db +# Standard options to testfixture +# +TESTOPTS = --verbose=file --output=test-out.txt + # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. # @@ -668,16 +672,16 @@ fts3-testfixture$(EXE): sqlite3.c fts3amal.c $(TESTSRC) $(TOP)/src/tclsqlite.c -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) fulltest: $(TESTPROGS) fuzztest - ./testfixture$(EXE) $(TOP)/test/all.test + ./testfixture$(EXE) $(TOP)/test/all.test $(TESTOPTS) soaktest: $(TESTPROGS) - ./testfixture$(EXE) $(TOP)/test/all.test -soak=1 + ./testfixture$(EXE) $(TOP)/test/all.test -soak=1 $(TESTOPTS) fulltestonly: $(TESTPROGS) fuzztest - ./testfixture$(EXE) $(TOP)/test/full.test + ./testfixture$(EXE) $(TOP)/test/full.test $(TESTOPTS) queryplantest: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/permutations.test queryplanner + ./testfixture$(EXE) $(TOP)/test/permutations.test queryplanner $(TESTOPTS) fuzztest: fuzzcheck$(EXE) $(FUZZDATA) ./fuzzcheck$(EXE) $(FUZZDATA) @@ -685,21 +689,31 @@ fuzztest: fuzzcheck$(EXE) $(FUZZDATA) valgrindfuzz: fuzzcheck$(EXE) $(FUZZDATA) valgrind ./fuzzcheck$(EXE) --cell-size-check --quiet $(FUZZDATA) +# A very quick test using only testfixture and omitting all the slower +# tests. Designed to run in under 3 minutes on a workstation. +# +quicktest: ./testfixture$(EXE) + ./testfixture$(EXE) $(TOP)/test/extraquick.test $(TESTOPTS) + +# The default test case. Runs most of the faster standard TCL tests, +# and fuzz tests, and sqlite3_analyzer and sqldiff tests. +# test: $(TESTPROGS) fuzztest - ./testfixture$(EXE) $(TOP)/test/veryquick.test + ./testfixture$(EXE) $(TOP)/test/veryquick.test $(TESTOPTS) # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. # valgrindtest: $(TESTPROGS) valgrindfuzz - OMIT_MISUSE=1 valgrind -v ./testfixture$(EXE) $(TOP)/test/permutations.test valgrind + OMIT_MISUSE=1 valgrind -v \ + ./testfixture$(EXE) $(TOP)/test/permutations.test valgrind $(TESTOPTS) # A very fast test that checks basic sanity. The name comes from # the 60s-era electronics testing: "Turn it on and see if smoke # comes out." # smoketest: $(TESTPROGS) fuzzcheck$(EXE) - ./testfixture$(EXE) $(TOP)/test/main.test + ./testfixture$(EXE) $(TOP)/test/main.test $(TESTOPTS) # The next two rules are used to support the "threadtest" target. Building # threadtest runs a few thread-safety tests that are implemented in C. This diff --git a/manifest b/manifest index 5da0c00dd9..a38aca8867 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Avoid\spassing\sconstraints\sthat\sare\sunusable\sdue\sto\sLEFT\sor\sCROSS\sjoins\sto\svirtual\stable\sxBestIndex()\smethods. -D 2015-06-10T14:27:40.648 +C "test"\stargets\son\sall\smakefiles\suse\s--verbose=file\s--output=test-out.txt.\nAdd\sthe\snew\s"quicktest"\starget\sto\sall\smakefiles\s-\sdesigned\sto\srun\sin\sunder\nthree\sminutes.\s\sThe\s--quick\soption\son\sreleasetest.tcl\snow\suses\squicktest. +D 2015-06-10T18:53:09.696 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 580e006530fab67ccd34926ce2eda66d326af60f +F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 5438dc167466f51349ab0c4497aef547d0c9352c +F Makefile.msc 5a8418c81f736dfa953c809af1a48398017b3610 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ce0ae95abd7121c534f6917c1c8f2b70d9acd4db @@ -171,7 +171,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 033741a45df95c577814914b13d182a0b6c7dc89 +F main.mk 68f86c21505d6b66765a13c193f00a53dde6a212 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk d5e22023b5238985bb54a72d33e0ac71fe4f8a32 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -357,7 +357,7 @@ F test/analyzeC.test 555a6cc388b9818b6eda6df816f01ce0a75d3a93 F test/analyzeD.test 08f9d0bee4e118a66fff3a32d02dbe0ee0a2b594 F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d F test/analyzeF.test 7ccd7a04f7d3061bde1a8a4dacc4792edccf6bf2 -F test/analyzer1.test e3bccac3be49382050464952998a631bf51e3ce1 +F test/analyzer1.test 498e2ff4b62740c2751c3a2f8b744fe26689fae9 F test/async.test 1d0e056ba1bb9729283a0f22718d3a25e82c277b F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 @@ -526,6 +526,7 @@ F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 F test/exists.test 8f7b27b61c2fbe5822f0a1f899c715d14e416e30 F test/expr.test 79c3e7502d9e571553b85f0ecc8ff2ac7d0e4931 F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 +F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 3e979af17dfa7e5e9dda5eba1a696c04fa9d47f7 F test/filectrl.test 14fa712e42c4cb791e09dfd58a6a03efb47ef13a F test/filefmt.test cb34663f126cbc2d358af552dcaf5c72769b0146 @@ -824,7 +825,7 @@ F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305 F test/pcache.test b09104b03160aca0d968d99e8cd2c5b1921a993d F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test 32e2b82e0dfbe5c6b6b38a5c1f4cac194298ad4e +F test/permutations.test 6b0f339a4d5f00041555a986dde8fbe8f54c25bc F test/pragma.test be7195f0aa72bdb8a512133e9640ac40f15b57a2 F test/pragma2.test f624a496a95ee878e81e59961eade66d5c00c028 F test/pragma3.test 6f849ccffeee7e496d2f2b5e74152306c0b8757c @@ -843,7 +844,7 @@ F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl 3e906a8bbd047b8e1f035984fbdc96df4caaea47 +F test/releasetest.tcl 2aaffa548a8f8d10053b20bcf68a1b5a01081e51 F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 458fe73eb3ffdfdf9f6ba3e9b7350a6220414dea F test/rollback2.test fc14cf6d1a2b250d2735ef16124b971bce152f14 @@ -929,7 +930,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b F test/speedtest1.c 9f1b745c24886cced3f70ffc666300152a39013c F test/spellfix.test 24f676831acddd2f4056a598fd731a72c6311f49 -F test/sqldiff1.test e5ecfe95b3a2ff6380f0db6ea8bec246b675e122 +F test/sqldiff1.test 8f6bc7c6a5b3585d350d779c6078869ba402f8f5 F test/sqllimits1.test e05786eaed7950ff6a2d00031d001d8a26131e68 F test/stat.test 8de91498c99f5298b303f70f1d1f3b9557af91bf F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 @@ -1285,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f7b2c70362f10ee0347c1d2318918ffefa53243d a34cd71c8aafaece04a2332a127e9b8e99c1403c -R 83db81ff2fb6c9dcf1dbb41c52657424 -U dan -Z 293899bbe176179f6b2abcd42b5d0831 +P 7b446771cadedafbe8924ad0658adc2597816dc7 +R e13907780a1cb22e147b44d8ea4a5351 +U drh +Z 0da5f15a574d2a2ef40a9dda668b3442 diff --git a/manifest.uuid b/manifest.uuid index ca59bdd454..3037113ee1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b446771cadedafbe8924ad0658adc2597816dc7 \ No newline at end of file +6ddef2ad35ceb5822fc14c65bc7c6a2662edb63c \ No newline at end of file diff --git a/test/analyzer1.test b/test/analyzer1.test index 7da564ea2b..ac46704fba 100644 --- a/test/analyzer1.test +++ b/test/analyzer1.test @@ -24,6 +24,11 @@ if {$tcl_platform(platform)=="windows"} { } else { set PROG "./sqlite3_analyzer" } +if {![file exe $PROG]} { + puts "analyzer1 cannot run because $PROG is not available" + finish_test + return +} db close forcedelete test.db test.db-journal test.db-wal sqlite3 db test.db diff --git a/test/extraquick.test b/test/extraquick.test new file mode 100644 index 0000000000..f453564e7f --- /dev/null +++ b/test/extraquick.test @@ -0,0 +1,16 @@ +# +# 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 runs most of the tests run by veryquick.test except for those +# that take a long time. +# + +set testdir [file dirname $argv0] +source $testdir/permutations.test + +run_test_suite extraquick + +finish_test diff --git a/test/permutations.test b/test/permutations.test index 4b3ac6481b..01779ff50f 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -96,7 +96,7 @@ if {$::tcl_platform(platform)!="unix"} { set alltests [test_set $alltests -exclude { all.test async.test quick.test veryquick.test memleak.test permutations.test soak.test fts3.test - mallocAll.test rtree.test full.test + mallocAll.test rtree.test full.test extraquick.test }] set allquicktests [test_set $alltests -exclude { @@ -146,11 +146,22 @@ if {[info exists ::env(TEST_FAILURE)]} { lappend ::testsuitelist xxx test_suite "veryquick" -prefix "" -description { - "Very" quick test suite. Runs in less than 5 minutes on a workstation. + "Very" quick test suite. Runs in minutes on a workstation. This test suite is the same as the "quick" tests, except that some files that test malloc and IO errors are omitted. } -files [ - test_set $allquicktests -exclude *malloc* *ioerr* *fault* + test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* +] + +test_suite "extraquick" -prefix "" -description { + "Extra" quick test suite. Runs in a few minutes on a workstation. + This test suite is the same as the "veryquick" tests, except that + slower tests are omitted. +} -files [ + test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* \ + wal3.test fts4merge* sort2.test mmap1.test walcrash* \ + percentile.test where8m.test walcksum.test savepoint3.test \ + fuzzer1.test fuzzer3.test fts3expr3.test ] test_suite "mmap" -prefix "mm-" -description { diff --git a/test/releasetest.tcl b/test/releasetest.tcl index a120ddf336..6e475c9d29 100644 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -547,7 +547,10 @@ proc process_options {argv} { puts " --srcdir $::SRCDIR" puts " --platform [list $platform]" puts " --config [list $config]" - if {$::QUICK} {puts " --quick"} + if {$::QUICK} { + if {$::QUICK==1} {puts " --quick"} + if {$::QUICK==2} {puts " --veryquick"} + } if {$::MSVC} {puts " --msvc"} if {$::BUILDONLY} {puts " --buildonly"} if {$::DRYRUN} {puts " --dryrun"} @@ -645,7 +648,7 @@ proc main {argv} { } if {$target ne "checksymbols"} { switch -- $::QUICK { - 1 {set target test} + 1 {set target quicktest} 2 {set target smoketest} } if {$::BUILDONLY} { diff --git a/test/sqldiff1.test b/test/sqldiff1.test index 723b7a5e13..3201fb3654 100644 --- a/test/sqldiff1.test +++ b/test/sqldiff1.test @@ -19,6 +19,11 @@ if {$tcl_platform(platform)=="windows"} { } else { set PROG "./sqldiff" } +if {![file exe $PROG]} { + puts "sqldiff cannot run because $PROG is not available" + finish_test + return +} db close forcedelete test.db test2.db sqlite3 db test.db From 033eb6c8d3f4b9c3a0f9343bcb349fbad6ac0b66 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 10 Jun 2015 22:03:40 +0000 Subject: [PATCH 19/49] Fix minor typo in the quicktest MSVC makefile target. FossilOrigin-Name: 75b65f9d49daaf48e97042cb82ea554e2ec74eec --- Makefile.msc | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index f29f66cce3..70c16b11c3 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1699,7 +1699,7 @@ fuzztest: fuzzcheck.exe # Minimal testing that runs in less than 3 minutes (on a fast machine) # -quicktest: .\testfixture.exe +quicktest: testfixture.exe .\testfixture.exe $(TOP)\test\extraquick.test $(TESTOPTS) # This is the common case. Run many tests that do not take too long, diff --git a/manifest b/manifest index a38aca8867..7b46a7527c 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C "test"\stargets\son\sall\smakefiles\suse\s--verbose=file\s--output=test-out.txt.\nAdd\sthe\snew\s"quicktest"\starget\sto\sall\smakefiles\s-\sdesigned\sto\srun\sin\sunder\nthree\sminutes.\s\sThe\s--quick\soption\son\sreleasetest.tcl\snow\suses\squicktest. -D 2015-06-10T18:53:09.696 +C Fix\sminor\stypo\sin\sthe\squicktest\sMSVC\smakefile\starget. +D 2015-06-10T22:03:40.913 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 5a8418c81f736dfa953c809af1a48398017b3610 +F Makefile.msc b7db9ccbbad1c495b98e5326a06cac03aa206127 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ce0ae95abd7121c534f6917c1c8f2b70d9acd4db @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7b446771cadedafbe8924ad0658adc2597816dc7 -R e13907780a1cb22e147b44d8ea4a5351 -U drh -Z 0da5f15a574d2a2ef40a9dda668b3442 +P 6ddef2ad35ceb5822fc14c65bc7c6a2662edb63c +R c63a194dd469f312ca0f35c47faf1707 +U mistachkin +Z c108f8ac4d75e13d11936c87d29e2e70 diff --git a/manifest.uuid b/manifest.uuid index 3037113ee1..d1f247c6bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ddef2ad35ceb5822fc14c65bc7c6a2662edb63c \ No newline at end of file +75b65f9d49daaf48e97042cb82ea554e2ec74eec \ No newline at end of file From 7b96f2fa7ecfdf2dd3f361e11a19e866ed20dd9a Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 10 Jun 2015 22:51:02 +0000 Subject: [PATCH 20/49] Remove possibly stray output from various tests. FossilOrigin-Name: f38e0be56fc086a3ce08134ade83ab61c9fca106 --- manifest | 29 ++++++++++++++++------------- manifest.uuid | 2 +- test/e_walauto.test | 1 - test/filectrl.test | 1 - test/fts3d.test | 2 +- test/fts4incr.test | 4 +++- test/index5.test | 6 ++++-- test/select8.test | 1 - test/shared4.test | 1 - test/tester.tcl | 18 +++++++++--------- 10 files changed, 34 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 7b46a7527c..76f440746a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\stypo\sin\sthe\squicktest\sMSVC\smakefile\starget. -D 2015-06-10T22:03:40.913 +C Remove\spossibly\sstray\soutput\sfrom\svarious\stests. +D 2015-06-10T22:51:02.529 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -510,7 +510,7 @@ F test/e_update.test 312cb8f5ccfe41515a6bb092f8ea562a9bd54d52 F test/e_uri.test 5ae33760fb2039c61aa2d90886f1664664173585 F test/e_vacuum.test 5bfbdc21b65c0abf24398d0ba31dc88d93ca77a9 F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625 -F test/e_walauto.test 6544af03423abc61b53cfb976839385ddc2a0a70 +F test/e_walauto.test 280714ddf14e1a47dcbc59d515cd0b026dfd5567 F test/e_walckpt.test 65e29b6631e51f210f83e4ff11571e647ba93608 F test/e_walhook.test da3ea8b3483d1af72190337bda50155a91a4b664 F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea @@ -528,7 +528,7 @@ F test/expr.test 79c3e7502d9e571553b85f0ecc8ff2ac7d0e4931 F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 3e979af17dfa7e5e9dda5eba1a696c04fa9d47f7 -F test/filectrl.test 14fa712e42c4cb791e09dfd58a6a03efb47ef13a +F test/filectrl.test 7c13f96457435238da99aff7343ad6a3a4885787 F test/filefmt.test cb34663f126cbc2d358af552dcaf5c72769b0146 F test/fkey1.test de5b287f6a480b36bd51e8debcf48168e26e4ed2 F test/fkey2.test f3d27ecba480a348c328965d154214719bb158a9 @@ -603,7 +603,7 @@ F test/fts3conf.test ee8500c86dd58ec075e8831a1e216a79989436de F test/fts3corrupt.test 2710b77983cc7789295ddbffea52c1d3b7506dbb F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 -F test/fts3d.test 95c17d1b67b33a5eac0bf5a0d11116a0c0ac7a3a +F test/fts3d.test d3e9c8fb75135ada06bf3bab4f9666224965d708 F test/fts3defer.test 0be4440b73a2e651fc1e472066686d6ada4b9963 F test/fts3defer2.test c540f5f5c2840f70c68fd9b597df817ec7170468 F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd @@ -637,7 +637,7 @@ F test/fts4content.test abb0c77bc3da3df64fec72e00844d2257a90025d F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 F test/fts4growth.test df10fde9f47cf5c71861e63fd8efcd573c4f7e53 F test/fts4growth2.test 2f063be1902a73cd087355837c52fed42ac11a5d -F test/fts4incr.test 361960ed3550e781f3f313e17e2182ef9cefc0e9 +F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d F test/fts4langid.test 24a6e41063b416bbdf371ff6b4476fa41c194aa7 F test/fts4merge.test c424309743fdd203f8e56a1f1cd7872cd66cc0ee F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 @@ -688,7 +688,7 @@ F test/index.test 4d990005a67a36984e4f1a5f1bdccea8d08da4ee F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6 F test/index3.test b6ec456cf3b81d9a32123fe7e449bde434db338b F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 -F test/index5.test 25b0b451aceed4ac5f7d49f856f6de7257470b3e +F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test 3ae54e53c53f2adcacda269237d8e52bdb05a481 F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c F test/indexedby.test 5f527a78bae74c61b8046ae3037f9dfb0bf0c353 @@ -876,7 +876,7 @@ F test/select4.test 6d5bc6d178a367e8b48fa1c1d3ea12cae9c2d650 F test/select5.test e758b8ef94f69b111df4cb819008856655dcd535 F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0 F test/select7.test 7fd2ef598cfabb6b9ff6ac13973b91d0527df49d -F test/select8.test 391de11bdd52339c30580dabbbbe97e3e9a3c79d +F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 F test/selectA.test e452bdb975f488ea46d091382a9185b5853ed2c7 F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 @@ -889,7 +889,7 @@ F test/server1.test 46803bd3fe8b99b30dbc5ff38ffc756f5c13a118 F test/shared.test 1da9dbad400cee0d93f252ccf76e1ae007a63746 F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 F test/shared3.test fcd65cb11d189eff5f5c85cc4fad246fb0933108 -F test/shared4.test 72d90821e8d2fc918a08f16d32880868d8ee8e9d +F test/shared4.test c75f476804e76e26bf6fa0e7b421fb0ca7d07558 F test/shared6.test 866bb4982c45ce216c61ded5e8fde4e7e2f3ffa9 F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 F test/shared8.test 00a07bf5e1337ecf72e94542bdefdc330d7a2538 @@ -950,7 +950,7 @@ F test/tclsqlite.test 7fb866443c7deceed22b63948ccd6f76b52ad054 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptrigger.test 8ec228b0db5d7ebc4ee9b458fc28cb9e7873f5e1 -F test/tester.tcl ca396a3f867c1bd3603400ca8f17bbffd87985b7 +F test/tester.tcl d23d57063764471b6fb51276b851ac51d364db06 F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1286,7 +1286,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6ddef2ad35ceb5822fc14c65bc7c6a2662edb63c -R c63a194dd469f312ca0f35c47faf1707 +P 75b65f9d49daaf48e97042cb82ea554e2ec74eec +R 7ce3aec9083e0231108814bdab12a834 +T *branch * testerOutput +T *sym-testerOutput * +T -sym-trunk * U mistachkin -Z c108f8ac4d75e13d11936c87d29e2e70 +Z db6ff78743d076544ff22113ea65f70d diff --git a/manifest.uuid b/manifest.uuid index d1f247c6bc..24021b6cbc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -75b65f9d49daaf48e97042cb82ea554e2ec74eec \ No newline at end of file +f38e0be56fc086a3ce08134ade83ab61c9fca106 \ No newline at end of file diff --git a/test/e_walauto.test b/test/e_walauto.test index a1f4eb7079..093b13f940 100644 --- a/test/e_walauto.test +++ b/test/e_walauto.test @@ -171,7 +171,6 @@ foreach {tn code} { # set ::busy_callback_count 0 proc busy_callback {args} { - puts Hello incr ::busy_callback_count return 0 } diff --git a/test/filectrl.test b/test/filectrl.test index 1d878bf968..28fecee92f 100644 --- a/test/filectrl.test +++ b/test/filectrl.test @@ -39,7 +39,6 @@ do_test filectrl-1.5 { do_test filectrl-1.6 { sqlite3 db test.db set fn [file_control_tempfilename db] - puts -nonewline \[$fn\] set fn } {/etilqs_/} db close diff --git a/test/fts3d.test b/test/fts3d.test index 5c04ead0a0..83af4d2a37 100644 --- a/test/fts3d.test +++ b/test/fts3d.test @@ -213,7 +213,7 @@ do_test fts3d-4.matches { {0 1 0 4 0 2 5 3 0 3 9 1 0 5 11 4} \ {0 0 0 4 0 4 5 2 0 3 8 1 0 5 10 4}] -puts [db eval {SELECT c FROM t1 } ] +db eval {SELECT c FROM t1 } check_terms_all fts3d-4.1 {a four is test that this was} check_doclist_all fts3d-4.1.1 a {[1 0[2]] [2 0[2]] [3 0[2]]} check_doclist_all fts3d-4.1.2 four {} diff --git a/test/fts4incr.test b/test/fts4incr.test index 17212efce7..92104888b4 100644 --- a/test/fts4incr.test +++ b/test/fts4incr.test @@ -47,7 +47,9 @@ foreach {tn q res} { do_execsql_test 2.$tn.$s $q $res set t($s) [lindex [time [list execsql $q] 100] 0] } - puts "with optimization: $t(0) without: $t(1)" + if {0} { + puts "with optimization: $t(0) without: $t(1)" + } } do_test 2.1 { diff --git a/test/index5.test b/test/index5.test index e369d75717..4c0aa0431e 100644 --- a/test/index5.test +++ b/test/index5.test @@ -67,8 +67,10 @@ do_test 1.3 { } set iPrev $iNext } - puts -nonewline \ - " (forward=$nForward, back=$nBackward, noncontiguous=$nNoncont)" + if {0} { + puts -nonewline \ + " (forward=$nForward, back=$nBackward, noncontiguous=$nNoncont)" + } expr {$nForward > 2*($nBackward + $nNoncont)} } {1} diff --git a/test/select8.test b/test/select8.test index 98626641bf..39b2739499 100644 --- a/test/select8.test +++ b/test/select8.test @@ -32,7 +32,6 @@ set result [execsql { FROM songs GROUP BY LOWER(artist) }] -puts result=$result do_test select8-1.1 { execsql { SELECT DISTINCT artist,sum(timesplayed) AS total diff --git a/test/shared4.test b/test/shared4.test index 83925b06e4..88959db42d 100644 --- a/test/shared4.test +++ b/test/shared4.test @@ -16,7 +16,6 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl db close -puts hello # This script is only valid if we are running shared-cache mode in a # threadsafe-capable database engine. diff --git a/test/tester.tcl b/test/tester.tcl index a83054fbe7..8fd53c8e42 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -1168,20 +1168,20 @@ proc catchsql {sql {db db}} { # Do an VDBE code dump on the SQL given # proc explain {sql {db db}} { - puts "" - puts "addr opcode p1 p2 p3 p4 p5 #" - puts "---- ------------ ------ ------ ------ --------------- -- -" + output1 "" + output1 "addr opcode p1 p2 p3 p4 p5 #" + output1 "---- ------------ ------ ------ ------ --------------- -- -" $db eval "explain $sql" {} { - puts [format {%-4d %-12.12s %-6d %-6d %-6d % -17s %s %s} \ + output1 [format {%-4d %-12.12s %-6d %-6d %-6d % -17s %s %s} \ $addr $opcode $p1 $p2 $p3 $p4 $p5 $comment ] } } proc explain_i {sql {db db}} { - puts "" - puts "addr opcode p1 p2 p3 p4 p5 #" - puts "---- ------------ ------ ------ ------ ---------------- -- -" + output1 "" + output1 "addr opcode p1 p2 p3 p4 p5 #" + output1 "---- ------------ ------ ------ ------ ---------------- -- -" # Set up colors for the different opcodes. Scheme is as follows: @@ -1254,11 +1254,11 @@ proc explain_i {sql {db db}} { set col "" catch { set col $color($opcode) } - puts [format {%-4d %s%s%-12.12s%s %-6d %-6d %-6d % -17s %s %s} \ + output1 [format {%-4d %s%s%-12.12s%s %-6d %-6d %-6d % -17s %s %s} \ $addr $I $col $opcode $D $p1 $p2 $p3 $p4 $p5 $comment ] } - puts "---- ------------ ------ ------ ------ ---------------- -- -" + output1 "---- ------------ ------ ------ ------ ---------------- -- -" } # Show the VDBE program for an SQL statement but omit the Trace From eeb31ff59bf8a3164cfc2aa43cd2fd0ed8512400 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 10 Jun 2015 23:02:38 +0000 Subject: [PATCH 21/49] More test output refinements. FossilOrigin-Name: e64a5681793238fa04fe3636f48d34b2dd36cdfa --- manifest | 19 ++++++++----------- manifest.uuid | 2 +- test/progress.test | 1 - test/tester.tcl | 20 ++++++++++---------- test/vtab1.test | 3 --- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index 76f440746a..88335ba49a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\spossibly\sstray\soutput\sfrom\svarious\stests. -D 2015-06-10T22:51:02.529 +C More\stest\soutput\srefinements. +D 2015-06-10T23:02:38.561 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -831,7 +831,7 @@ F test/pragma2.test f624a496a95ee878e81e59961eade66d5c00c028 F test/pragma3.test 6f849ccffeee7e496d2f2b5e74152306c0b8757c F test/printf.test b3ff34e73d59124140eaf89f7672e21bc2ca5fcc F test/printf2.test 0b61566dd1c0f0b802f59dffa228c5dc5aa6b054 -F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d +F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 @@ -950,7 +950,7 @@ F test/tclsqlite.test 7fb866443c7deceed22b63948ccd6f76b52ad054 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptrigger.test 8ec228b0db5d7ebc4ee9b458fc28cb9e7873f5e1 -F test/tester.tcl d23d57063764471b6fb51276b851ac51d364db06 +F test/tester.tcl b3a41e20f98a029a76e930b33d0711c5854267bb F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1148,7 +1148,7 @@ F test/vacuum4.test d3f8ecff345f166911568f397d2432c16d2867d9 F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test f311691d696a5cc27e3c1b875cec1b0866b4ccd9 -F test/vtab1.test dbe0e9e121102d0ba365f20d126a72676aa2343f +F test/vtab1.test 6210e076997f176bedc300a87ad6404651b601dd F test/vtab2.test f8cd1bb9aba7143eba97812d9617880a36d247ad F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 942f8b8280b3ea8a41dae20e7822d065ca1cb275 @@ -1286,10 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 75b65f9d49daaf48e97042cb82ea554e2ec74eec -R 7ce3aec9083e0231108814bdab12a834 -T *branch * testerOutput -T *sym-testerOutput * -T -sym-trunk * +P f38e0be56fc086a3ce08134ade83ab61c9fca106 +R 27c776937a2faf6a3c6ca0150fe1d26e U mistachkin -Z db6ff78743d076544ff22113ea65f70d +Z 4bdc8fbc12892afab86b92929a73ad3a diff --git a/manifest.uuid b/manifest.uuid index 24021b6cbc..ec8126b5c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f38e0be56fc086a3ce08134ade83ab61c9fca106 \ No newline at end of file +e64a5681793238fa04fe3636f48d34b2dd36cdfa \ No newline at end of file diff --git a/test/progress.test b/test/progress.test index 993426aa2b..f6d7229243 100644 --- a/test/progress.test +++ b/test/progress.test @@ -164,7 +164,6 @@ do_test progress-1.7 { } set ::res [list] - explain {SELECT a, b, c FROM abc} db eval {SELECT a, b, c FROM abc} { lappend ::res $a $b $c db progress 5 "expr 1" diff --git a/test/tester.tcl b/test/tester.tcl index 8fd53c8e42..8022d6a538 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -1168,20 +1168,20 @@ proc catchsql {sql {db db}} { # Do an VDBE code dump on the SQL given # proc explain {sql {db db}} { - output1 "" - output1 "addr opcode p1 p2 p3 p4 p5 #" - output1 "---- ------------ ------ ------ ------ --------------- -- -" + output2 "" + output2 "addr opcode p1 p2 p3 p4 p5 #" + output2 "---- ------------ ------ ------ ------ --------------- -- -" $db eval "explain $sql" {} { - output1 [format {%-4d %-12.12s %-6d %-6d %-6d % -17s %s %s} \ + output2 [format {%-4d %-12.12s %-6d %-6d %-6d % -17s %s %s} \ $addr $opcode $p1 $p2 $p3 $p4 $p5 $comment ] } } proc explain_i {sql {db db}} { - output1 "" - output1 "addr opcode p1 p2 p3 p4 p5 #" - output1 "---- ------------ ------ ------ ------ ---------------- -- -" + output2 "" + output2 "addr opcode p1 p2 p3 p4 p5 #" + output2 "---- ------------ ------ ------ ------ ---------------- -- -" # Set up colors for the different opcodes. Scheme is as follows: @@ -1247,18 +1247,18 @@ proc explain_i {sql {db db}} { $db eval "explain $sql" {} { if {[info exists linebreak($addr)]} { - puts "" + output2 "" } set I [string repeat " " $x($addr)] set col "" catch { set col $color($opcode) } - output1 [format {%-4d %s%s%-12.12s%s %-6d %-6d %-6d % -17s %s %s} \ + output2 [format {%-4d %s%s%-12.12s%s %-6d %-6d %-6d % -17s %s %s} \ $addr $I $col $opcode $D $p1 $p2 $p3 $p4 $p5 $comment ] } - output1 "---- ------------ ------ ------ ------ ---------------- -- -" + output2 "---- ------------ ------ ------ ------ ---------------- -- -" } # Show the VDBE program for an SQL statement but omit the Trace diff --git a/test/vtab1.test b/test/vtab1.test index cd21153f06..84de4cffa5 100644 --- a/test/vtab1.test +++ b/test/vtab1.test @@ -56,9 +56,6 @@ ifcapable !vtab||!schema_pragmas { # We cannot create a virtual table if the module has not been registered. # do_test vtab1-1.1.1 { - explain { - CREATE VIRTUAL TABLE t1 USING echo; - } catchsql { CREATE VIRTUAL TABLE t1 USING echo; } From 72bc8208f01a8e476996db7c6de09ad61ed62d6f Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jun 2015 13:58:35 +0000 Subject: [PATCH 22/49] When generating code for partial indexes, be sure not to modify the index condition expression in the schema. FossilOrigin-Name: e63d01c69c3e50f49ee3022a519c4f3e91f00520 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/delete.c | 4 ++-- src/expr.c | 15 +++++++++++++++ src/insert.c | 4 ++-- src/sqliteInt.h | 1 + test/index6.test | 19 +++++++++++++++++++ 7 files changed, 51 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 7b46a7527c..913fd64a60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\stypo\sin\sthe\squicktest\sMSVC\smakefile\starget. -D 2015-06-10T22:03:40.913 +C When\sgenerating\scode\sfor\spartial\sindexes,\sbe\ssure\snot\sto\smodify\sthe\nindex\scondition\sexpression\sin\sthe\sschema. +D 2015-06-11T13:58:35.248 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -201,8 +201,8 @@ F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575 F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a -F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e -F src/expr.c 0550baeca8dd7472e298d9e881e5e3484f7666f8 +F src/delete.c 8857a6f27560718f65d43bdbec86c967ae1f8dfa +F src/expr.c 710c764c1974b15a0e56b004ff9f5e6ceab3a854 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c9b63a217d86582c22121699a47f22f524608869 F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6 @@ -210,7 +210,7 @@ F src/global.c 4f77cadbc5427d00139ba43d0f3979804cbb700e F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c d6e1623a97ce33e9af2f1a0c1f0085a2f63327ef +F src/insert.c b5f8b35a1b7924020e48cade5b2b5017bca7906b F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770 @@ -255,7 +255,7 @@ F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 2ebeb634e751a61a6f0eebfa0f4669f46a42f6cd -F src/sqliteInt.h 4c6731ce49b90582ea7d77c67b8792a4df8da237 +F src/sqliteInt.h 8f095bfe43ba68c32bac8d5349131ffacc660967 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -689,7 +689,7 @@ F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6 F test/index3.test b6ec456cf3b81d9a32123fe7e449bde434db338b F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 25b0b451aceed4ac5f7d49f856f6de7257470b3e -F test/index6.test 3ae54e53c53f2adcacda269237d8e52bdb05a481 +F test/index6.test fbf45ceb39eb8a01b837d22623b93b208e6509ef F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c F test/indexedby.test 5f527a78bae74c61b8046ae3037f9dfb0bf0c353 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6ddef2ad35ceb5822fc14c65bc7c6a2662edb63c -R c63a194dd469f312ca0f35c47faf1707 -U mistachkin -Z c108f8ac4d75e13d11936c87d29e2e70 +P 75b65f9d49daaf48e97042cb82ea554e2ec74eec +R d74aba000e40e2b28c1e25cf1d9fcc49 +U drh +Z 8cefff923a130826c381270a2faa270d diff --git a/manifest.uuid b/manifest.uuid index d1f247c6bc..4dd90d9982 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -75b65f9d49daaf48e97042cb82ea554e2ec74eec \ No newline at end of file +e63d01c69c3e50f49ee3022a519c4f3e91f00520 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index ef6aace1c8..369cdaf6fe 100644 --- a/src/delete.c +++ b/src/delete.c @@ -798,8 +798,8 @@ int sqlite3GenerateIndexKey( *piPartIdxLabel = sqlite3VdbeMakeLabel(v); pParse->iPartIdxTab = iDataCur; sqlite3ExprCachePush(pParse); - sqlite3ExprIfFalse(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, - SQLITE_JUMPIFNULL); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, + SQLITE_JUMPIFNULL); }else{ *piPartIdxLabel = 0; } diff --git a/src/expr.c b/src/expr.c index 89eee29ecd..06993e7371 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3702,6 +3702,21 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ sqlite3ReleaseTempReg(pParse, regFree2); } +/* +** Like sqlite3ExprIfFalse() except that a copy is made of pExpr before +** code generation, and that copy is deleted after code generation. This +** ensures that the original pExpr is unchanged. +*/ +void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ + sqlite3 *db = pParse->db; + Expr *pCopy = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed==0 ){ + sqlite3ExprIfFalse(pParse, pCopy, dest, jumpIfNull); + } + sqlite3ExprDelete(db, pCopy); +} + + /* ** Do a deep comparison of two expression trees. Return 0 if the two ** expressions are completely identical. Return 1 if they differ only diff --git a/src/insert.c b/src/insert.c index 7e8741a9a2..16bf07cdfd 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1381,8 +1381,8 @@ void sqlite3GenerateConstraintChecks( if( pIdx->pPartIdxWhere ){ sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]); pParse->ckBase = regNewData+1; - sqlite3ExprIfFalse(pParse, pIdx->pPartIdxWhere, addrUniqueOk, - SQLITE_JUMPIFNULL); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk, + SQLITE_JUMPIFNULL); pParse->ckBase = 0; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 43e4b0be9b..2378376c28 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3326,6 +3326,7 @@ int sqlite3ExprCodeExprList(Parse*, ExprList*, int, u8); #define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ void sqlite3ExprIfTrue(Parse*, Expr*, int, int); void sqlite3ExprIfFalse(Parse*, Expr*, int, int); +void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); Table *sqlite3FindTable(sqlite3*,const char*, const char*); Table *sqlite3LocateTable(Parse*,int isView,const char*, const char*); Table *sqlite3LocateTableItem(Parse*,int isView,struct SrcList_item *); diff --git a/test/index6.test b/test/index6.test index 69fae49feb..e15820290e 100644 --- a/test/index6.test +++ b/test/index6.test @@ -327,4 +327,23 @@ do_execsql_test index6-8.2 { 3 three value 3 } +# 2015-06-11. Assertion fault found by AFL +# +do_execsql_test index6-9.1 { + CREATE TABLE t9(a int, b int, c int); + CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20); + INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5),(NULL,7,3); + UPDATE t9 SET b=c WHERE a in (10,12,20); + SELECT a,b,c,'|' FROM t9 ORDER BY a; +} {{} 7 3 | 1 1 9 | 10 35 35 | 11 15 82 | 20 5 5 |} +do_execsql_test index6-9.2 { + DROP TABLE t9; + CREATE TABLE t9(a int, b int, c int, PRIMARY KEY(a)) WITHOUT ROWID; + CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20); + INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5); + UPDATE t9 SET b=c WHERE a in (10,12,20); + SELECT a,b,c,'|' FROM t9 ORDER BY a; +} {1 1 9 | 10 35 35 | 11 15 82 | 20 5 5 |} + + finish_test From b230a52892ec341582884b466b5a5f8d127d0926 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 12 Jun 2015 13:04:51 +0000 Subject: [PATCH 23/49] Minor performance optimization in pcache1.c. FossilOrigin-Name: 2e8ad2ead9d146e312c693d9b967bbd5b92429d9 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/pcache1.c | 12 +++++------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 2317d48d5e..f5a2a077ef 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sOP_ColumnsUsed\sopcode\s(when\scompiled\swith\nSQLITE_ENABLE_COLUMN_USED_MASK)\sas\sa\shint\sto\sthe\sb-tree\slayer\sas\sto\swhich\ncolumns\sof\sa\sbtree\scursor\swill\sbe\sused. -D 2015-06-12T12:54:15.456 +C Minor\sperformance\soptimization\sin\spcache1.c. +D 2015-06-12T13:04:51.385 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -242,7 +242,7 @@ F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77 F src/parse.y 6d60dda8f8d418b6dc034f1fbccd816c459983a8 F src/pcache.c 10539fb959849ad6efff80050541cab3d25089d4 F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8 -F src/pcache1.c 69d137620a305f814398bd29a0c998038c0695e9 +F src/pcache1.c 0f2c218d9fa84814403033319036d8e9ecb06dfd F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7 F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 @@ -1286,8 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P afc6db9b105f32110112b877f06091757888a5f2 f167bba446b78dd7538d0b2bae3e6678f3b1ba28 -R a835938c5e3feca63734c05b1d351c1c -T +closed f167bba446b78dd7538d0b2bae3e6678f3b1ba28 +P 711a176cbfad5dde6defa9648fba6d0d663af134 +R 9bc91229df1369aa902663b713f0e063 U drh -Z a8bcbc55ca8439f9fa1efdec8155d95f +Z c8fd78f00b5d9acfb5119a0b1df9ec4a diff --git a/manifest.uuid b/manifest.uuid index 94f3825f7f..6055917edd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -711a176cbfad5dde6defa9648fba6d0d663af134 \ No newline at end of file +2e8ad2ead9d146e312c693d9b967bbd5b92429d9 \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index a8755a3141..5b1f3ba0df 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -427,24 +427,22 @@ static void pcache1ResizeHash(PCache1 *p){ */ static void pcache1PinPage(PgHdr1 *pPage){ PCache1 *pCache; - PGroup *pGroup; assert( pPage!=0 ); assert( pPage->isPinned==0 ); pCache = pPage->pCache; - pGroup = pCache->pGroup; - assert( pPage->pLruNext || pPage==pGroup->pLruTail ); - assert( pPage->pLruPrev || pPage==pGroup->pLruHead ); - assert( sqlite3_mutex_held(pGroup->mutex) ); + assert( pPage->pLruNext || pPage==pCache->pGroup->pLruTail ); + assert( pPage->pLruPrev || pPage==pCache->pGroup->pLruHead ); + assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); if( pPage->pLruPrev ){ pPage->pLruPrev->pLruNext = pPage->pLruNext; }else{ - pGroup->pLruHead = pPage->pLruNext; + pCache->pGroup->pLruHead = pPage->pLruNext; } if( pPage->pLruNext ){ pPage->pLruNext->pLruPrev = pPage->pLruPrev; }else{ - pGroup->pLruTail = pPage->pLruPrev; + pCache->pGroup->pLruTail = pPage->pLruPrev; } pPage->pLruNext = 0; pPage->pLruPrev = 0; From 55a46c9b0e067f0776fe44f552479779249c4c55 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 12 Jun 2015 13:49:26 +0000 Subject: [PATCH 24/49] Add a fast-path implementation of pcache1Fetch() for the common case of separate caches that do not use a mutex. FossilOrigin-Name: 760700edb3ff1f5d6bf3058f874cc8e2808905c7 --- manifest | 15 +++++++------ manifest.uuid | 2 +- src/pcache1.c | 60 ++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index f5a2a077ef..df814d0093 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sperformance\soptimization\sin\spcache1.c. -D 2015-06-12T13:04:51.385 +C Add\sa\sfast-path\simplementation\sof\spcache1Fetch()\sfor\sthe\scommon\scase\sof\nseparate\scaches\sthat\sdo\snot\suse\sa\smutex. +D 2015-06-12T13:49:26.780 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -242,7 +242,7 @@ F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77 F src/parse.y 6d60dda8f8d418b6dc034f1fbccd816c459983a8 F src/pcache.c 10539fb959849ad6efff80050541cab3d25089d4 F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8 -F src/pcache1.c 0f2c218d9fa84814403033319036d8e9ecb06dfd +F src/pcache1.c 0324126d981c6db4ba39e0a6b2bf79b690d3107f F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7 F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 @@ -1286,7 +1286,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 711a176cbfad5dde6defa9648fba6d0d663af134 -R 9bc91229df1369aa902663b713f0e063 +P 2e8ad2ead9d146e312c693d9b967bbd5b92429d9 +R 911300e4b1697824e69cfe439e19a5f8 +T *branch * faster-pcache1-fetch +T *sym-faster-pcache1-fetch * +T -sym-trunk * U drh -Z c8fd78f00b5d9acfb5119a0b1df9ec4a +Z e8ae5ddb4580a5169c907c35e69dd177 diff --git a/manifest.uuid b/manifest.uuid index 6055917edd..859267d458 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2e8ad2ead9d146e312c693d9b967bbd5b92429d9 \ No newline at end of file +760700edb3ff1f5d6bf3058f874cc8e2808905c7 \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index 5b1f3ba0df..0a6d6d01d3 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -425,7 +425,7 @@ static void pcache1ResizeHash(PCache1 *p){ ** ** The PGroup mutex must be held when this function is called. */ -static void pcache1PinPage(PgHdr1 *pPage){ +static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ PCache1 *pCache; assert( pPage!=0 ); @@ -448,6 +448,7 @@ static void pcache1PinPage(PgHdr1 *pPage){ pPage->pLruPrev = 0; pPage->isPinned = 1; pCache->nRecyclable--; + return pPage; } @@ -803,8 +804,13 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** proceed to step 5. ** ** 5. Otherwise, allocate and return a new page buffer. +** +** There are two versions of this routine. pcache1FetchWithMutex() is +** the general case. pcache1FetchNoMutex() is a faster implementation for +** the common case where pGroup->mutex is NULL. The pcache1Fetch() wrapper +** invokes the appropriate routine. */ -static sqlite3_pcache_page *pcache1Fetch( +static PgHdr1 *pcache1FetchNoMutex( sqlite3_pcache *p, unsigned int iKey, int createFlag @@ -812,28 +818,56 @@ static sqlite3_pcache_page *pcache1Fetch( PCache1 *pCache = (PCache1 *)p; PgHdr1 *pPage = 0; - assert( offsetof(PgHdr1,page)==0 ); - assert( pCache->bPurgeable || createFlag!=1 ); - assert( pCache->bPurgeable || pCache->nMin==0 ); - assert( pCache->bPurgeable==0 || pCache->nMin==10 ); - assert( pCache->nMin==0 || pCache->bPurgeable ); - assert( pCache->nHash>0 ); - pcache1EnterMutex(pCache->pGroup); - /* Step 1: Search the hash table for an existing entry. */ pPage = pCache->apHash[iKey % pCache->nHash]; while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; } /* Step 2: Abort if no existing page is found and createFlag is 0 */ if( pPage ){ - if( !pPage->isPinned ) pcache1PinPage(pPage); + if( !pPage->isPinned ){ + return pcache1PinPage(pPage); + }else{ + return pPage; + } }else if( createFlag ){ /* Steps 3, 4, and 5 implemented by this subroutine */ - pPage = pcache1FetchStage2(pCache, iKey, createFlag); + return pcache1FetchStage2(pCache, iKey, createFlag); + }else{ + return 0; } +} +static PgHdr1 *pcache1FetchWithMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage; + + pcache1EnterMutex(pCache->pGroup); + pPage = pcache1FetchNoMutex(p, iKey, createFlag); assert( pPage==0 || pCache->iMaxKey>=iKey ); pcache1LeaveMutex(pCache->pGroup); - return (sqlite3_pcache_page*)pPage; + return pPage; +} +static sqlite3_pcache_page *pcache1Fetch( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + + assert( offsetof(PgHdr1,page)==0 ); + assert( pCache->bPurgeable || createFlag!=1 ); + assert( pCache->bPurgeable || pCache->nMin==0 ); + assert( pCache->bPurgeable==0 || pCache->nMin==10 ); + assert( pCache->nMin==0 || pCache->bPurgeable ); + assert( pCache->nHash>0 ); + if( pCache->pGroup->mutex ){ + return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag); + }else{ + return (sqlite3_pcache_page*)pcache1FetchNoMutex(p, iKey, createFlag); + } } From 982215a2c5b6bd5f121ef5d763decf42fdd45bd3 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 13 Jun 2015 11:10:55 +0000 Subject: [PATCH 25/49] Avoid unnecessary mutex usage in pcache1, for a significant speedup. FossilOrigin-Name: dcf4fb8d764611de60afea27cda0a8548ba7ca82 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/pcache1.c | 22 +++++++++++++++++++--- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index df814d0093..2f261b5b12 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sfast-path\simplementation\sof\spcache1Fetch()\sfor\sthe\scommon\scase\sof\nseparate\scaches\sthat\sdo\snot\suse\sa\smutex. -D 2015-06-12T13:49:26.780 +C Avoid\sunnecessary\smutex\susage\sin\spcache1,\sfor\sa\ssignificant\sspeedup. +D 2015-06-13T11:10:55.570 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -242,7 +242,7 @@ F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77 F src/parse.y 6d60dda8f8d418b6dc034f1fbccd816c459983a8 F src/pcache.c 10539fb959849ad6efff80050541cab3d25089d4 F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8 -F src/pcache1.c 0324126d981c6db4ba39e0a6b2bf79b690d3107f +F src/pcache1.c 7ca0caf7ec16c365aff3ddb4a7e00734a0e1fe97 F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7 F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 @@ -1286,10 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2e8ad2ead9d146e312c693d9b967bbd5b92429d9 -R 911300e4b1697824e69cfe439e19a5f8 -T *branch * faster-pcache1-fetch -T *sym-faster-pcache1-fetch * -T -sym-trunk * +P 760700edb3ff1f5d6bf3058f874cc8e2808905c7 +R caec30587447e9722ed3cdf5357476d2 U drh -Z e8ae5ddb4580a5169c907c35e69dd177 +Z 153683ea51b205873f976242b39879f7 diff --git a/manifest.uuid b/manifest.uuid index 859267d458..3e458c2d08 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -760700edb3ff1f5d6bf3058f874cc8e2808905c7 \ No newline at end of file +dcf4fb8d764611de60afea27cda0a8548ba7ca82 \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index 0a6d6d01d3..685ec23e05 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -148,8 +148,15 @@ static SQLITE_WSD struct PCacheGlobal { /* ** Macros to enter and leave the PCache LRU mutex. */ -#define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) -#define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) +#if !defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0 +# define pcache1EnterMutex(X) assert((X)->mutex==0) +# define pcache1LeaveMutex(X) assert((X)->mutex==0) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 0 +#else +# define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) +# define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 1 +#endif /******************************************************************************/ /******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/ @@ -529,10 +536,12 @@ static int pcache1Init(void *NotUsed){ UNUSED_PARAMETER(NotUsed); assert( pcache1.isInit==0 ); memset(&pcache1, 0, sizeof(pcache1)); +#if SQLITE_THREADSAFE if( sqlite3GlobalConfig.bCoreMutex ){ pcache1.grp.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU); pcache1.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PMEM); } +#endif pcache1.grp.mxPinned = 10; pcache1.isInit = 1; return SQLITE_OK; @@ -836,6 +845,7 @@ static PgHdr1 *pcache1FetchNoMutex( return 0; } } +#if PCACHE1_MIGHT_USE_GROUP_MUTEX static PgHdr1 *pcache1FetchWithMutex( sqlite3_pcache *p, unsigned int iKey, @@ -850,12 +860,15 @@ static PgHdr1 *pcache1FetchWithMutex( pcache1LeaveMutex(pCache->pGroup); return pPage; } +#endif static sqlite3_pcache_page *pcache1Fetch( sqlite3_pcache *p, unsigned int iKey, int createFlag ){ +#if PCACHE1_MIGHT_USE_GROUP_MUTEX || defined(SQLITE_DEBUG) PCache1 *pCache = (PCache1 *)p; +#endif assert( offsetof(PgHdr1,page)==0 ); assert( pCache->bPurgeable || createFlag!=1 ); @@ -863,9 +876,12 @@ static sqlite3_pcache_page *pcache1Fetch( assert( pCache->bPurgeable==0 || pCache->nMin==10 ); assert( pCache->nMin==0 || pCache->bPurgeable ); assert( pCache->nHash>0 ); +#if PCACHE1_MIGHT_USE_GROUP_MUTEX if( pCache->pGroup->mutex ){ return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag); - }else{ + }else +#endif + { return (sqlite3_pcache_page*)pcache1FetchNoMutex(p, iKey, createFlag); } } From c056e4b257015ee005da6748b1cfb80212a0c750 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2015 10:49:01 +0000 Subject: [PATCH 26/49] Comment typo fix. No code changes. FossilOrigin-Name: 17f185adb960b1fa4faa13cdf685b92a20a52072 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4988aa8489..ad2205da37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\smutex\scalls\sin\spcache1\swhen\sthe\smutex\sis\sNULL,\sfor\sa\ssignificant\nperformance\simprovement. -D 2015-06-13T11:19:47.811 +C Comment\stypo\sfix.\s\sNo\scode\schanges. +D 2015-06-15T10:49:01.943 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -252,7 +252,7 @@ F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee -F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0 +F src/sqlite.h.in 76d2f5637eb795b6300d9dd3c3ec3632ffafd721 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 2ebeb634e751a61a6f0eebfa0f4669f46a42f6cd F src/sqliteInt.h 8f095bfe43ba68c32bac8d5349131ffacc660967 @@ -1286,8 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2e8ad2ead9d146e312c693d9b967bbd5b92429d9 dcf4fb8d764611de60afea27cda0a8548ba7ca82 -R caec30587447e9722ed3cdf5357476d2 -T +closed dcf4fb8d764611de60afea27cda0a8548ba7ca82 +P caf8f574e5c64da461c6dfba8a06cf3fb18aaa42 +R aba3870768022563ba244dff8ac08eff U drh -Z d83dc113d9069d701eaef24905e6fe62 +Z abfc9d17f4897829cc21d3b706c43334 diff --git a/manifest.uuid b/manifest.uuid index aa300ff265..6e6cb8c58b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -caf8f574e5c64da461c6dfba8a06cf3fb18aaa42 \ No newline at end of file +17f185adb960b1fa4faa13cdf685b92a20a52072 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9e7efc9978..c6e77c38cc 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -23,7 +23,7 @@ ** ** The official C-language API documentation for SQLite is derived ** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. +** on how SQLite interfaces are supposed to operate. ** ** The name of this file under configuration management is "sqlite.h.in". ** The makefile makes some minor changes to this file (such as inserting From e4d38707eaf2b59d6075fa8d7802f7db4c986880 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2015 12:58:15 +0000 Subject: [PATCH 27/49] Improved detection of database corruption in freeSpace(). FossilOrigin-Name: 29bcb56887f862a1f06677a7b4bfae6475d29732 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 1 + test/fuzzdata3.db | Bin 10728448 -> 12024832 bytes 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ad2205da37..6366e547e0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Comment\stypo\sfix.\s\sNo\scode\schanges. -D 2015-06-15T10:49:01.943 +C Improved\sdetection\sof\sdatabase\scorruption\sin\sfreeSpace(). +D 2015-06-15T12:58:15.259 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,7 +192,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 5166c27883c24768c2f7f53479714f03ef34c612 +F src/btree.c e269b13c9ad70177cc24e9506c91705c53f1425b F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4 F src/build.c 6770b74ccb51cb485e81057c625f77455d5ddc06 @@ -660,7 +660,7 @@ F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 F test/fuzzcheck.c a60f926e3fa86c8d33908406d75eec868c22b9ca F test/fuzzdata1.db b60254eeb6bc11474071b883059662a73c48da7f F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 -F test/fuzzdata3.db a6e9bf75b8bfad0b7e60e57038908f4237b9c5d2 +F test/fuzzdata3.db f4ca6fa92973501cec63ac5d1992ef88f6a78e7f F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P caf8f574e5c64da461c6dfba8a06cf3fb18aaa42 -R aba3870768022563ba244dff8ac08eff +P 17f185adb960b1fa4faa13cdf685b92a20a52072 +R 9841ab7ddff94ef28e5c7f312f08cf08 U drh -Z abfc9d17f4897829cc21d3b706c43334 +Z 8fda4c4c0358babdd19a81217bb5c4c6 diff --git a/manifest.uuid b/manifest.uuid index 6e6cb8c58b..1f5f5b3ab9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17f185adb960b1fa4faa13cdf685b92a20a52072 \ No newline at end of file +29bcb56887f862a1f06677a7b4bfae6475d29732 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 53e0ebbfc1..4a32c07884 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1449,6 +1449,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ nFrag = iFreeBlk - iEnd; if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_BKPT; iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); + if( iEnd > pPage->pBt->usableSize ) return SQLITE_CORRUPT_BKPT; iSize = iEnd - iStart; iFreeBlk = get2byte(&data[iFreeBlk]); } diff --git a/test/fuzzdata3.db b/test/fuzzdata3.db index 29be55e7a6df4ee35ae2d5e27cc0e1a4ed75ea77..335879c148a18c3f37992eeeda74ed8ed2e018cc 100644 GIT binary patch delta 265918 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 delta 242338 zcmeFacYIXU7B)P4pL1r;45_4tNu!qlX(*k9CY?k;dI=q*g)V(&Kxqmgzy?JKiYQG2 zk!%YJSW)o`UR3mo1}UNlf`XzTyw5%}lgyBrN#^^0-|ze9&AnM{Cv*1m?6r0~yR5b3 z_E}}g2)3cu$#SedT$IlQczdk%sRXh zG<-2W6+hA*OLNGVEDu9&vpfX3+0qQMz>)#^v?U$#DN7op#gYm+-;x43%hD8bs-+3! z1WRMcQI=%Lp_WFF{Vfe4b1V%YyIbl*cCyriY-gzp*}_ssr&}zgTWaG!8e3{X*0a=v zOtK_F*03Z(MpzOcgDvrpMoS!|&SKW-=v_+;lOnfwV5X`9C4=d_+!HBvS zVME>Xi4Y7H)aAo~x>c~BZW+v{TU-O;iCCR(oNfjTshbQt>c&MuG zm)@{KpVI4=h6mMq27L+&s?+l%s{BA$>2n*Zu_f)f%2HbKFcvawO%hKTyT(G;h|t6y z1w}s?0irV$AG_F&^31IpjuQ6ak%_H&Vxg2n*jhrrko$HT(6=DrQU|{4_hthL)fxGX z2<0|mg?;$|@x52b#uEm)Wc5xeQ(ZM4IzH}(#1=*M2_gYJX~)RB?_G6!j(j%ATdZHb$HTy#zM;P|GQeD z_8j%dF}z@1?qhQF7FiLwwkodoWGzA-Wm&~>#Z(urWf#jVE5?o!MSY2E%-pNz*|Db0 zgk>IC*OwLL=E-ctDN6ub64j>>&t7D#PKvW97psav*6|@M@7$)w#m#1aLKIN};$4X) z2x9jLPk49YIl|Y*^^T(@rc6C8)~8$~1O~IyIYUU?!R2>|3`;E+nhP%uTX|V3xU(X< zIP96L(5FsUyDHZ15-Pqbe$euD6u)&`%ued^&_Zc7h!8r1l6szvJU}|H$km)CWH6zb zC)7>)0o9_`!L?9*qe__^{afx(aE(QfWLNaYZs<)|=so#(@rlCpYKmx%sa4N4%{A9_ zw_G!vxi&Wx%V+Y494zZjG7=hP76s`dwDVB$xnuEE5go+C#qxLeCDNQ(TJaoS7)wWx z;=4%(%C`Pi_y}nsa_*#QYZ@)MoAiiyx+Tw9+M>6_P*X;VHo>p8>V+!3b^x!z;#)V= zv+qZdnyl9|tC9)|uhrvg2I=dgg~qL`%YLh-gtD!x!iJO9l@`^t;kI!tZCiV33)a?| zL{eB#H=b1d`PnZCyZ+*aKtZpa51WQKZR*l2RXl^SMWaN;OmK{ zI4SXeTKn(o3%94h%?56NziKB<|u4IP0kr`2ejA(iXlNCyq6d$?z4=MSMoG1MJLZJqXqPkIjA&+)N z9^-~Q)+2IBA{Ex&AmA`u>n8XGH_;XDaW}Y09^noqx1}uWg|6n3e+mb=_9ly-4~}pY zeV^bm9$cpS#buf+mpnHv)4g&by5iD)$DB(4KpQs1EOb-BA}=gDQQqlUx>e%mZ;8TV{;ae3g=uxg zw7Fp}^@7<;LWh5B@XmHDWjHq$WdAn7VfjD`3QIuYsRt=*vCuK3T{@x^%fEuUCZ+Dyn6?=P_6_|&C`JP{x@4I4t;D-637tH09FaJUs49o}#nC}AfW4|yz zamD=94fBK-%%>$%o8=GI*L9hgy9}j`1(D+*^0{9`PP!1mJ7Bw~onzS-9B(?Qgg3h= zy{hu_okaHkLH1wzmHk&P*^{r`%6Z01IonW{IksnKEcQ7ew-#Q+s(D-gRGi zZwtI%f%k`BcsE_~ZaMJ?#yO1TBz>;LqH`lUeq9jJf%h5C;RDzkQ394Y2^bF?;r z*Yf*|@82&VNq59M>s?>yR|WcQeCxhH=$N58SG$f7LJC5=tQBVcSJWezmCy>1{O-&0 zPndxyGVtzU8By^IPw#?9iJ@G{0!^)eMgsYxR+_Yp3=yFBHgFHzu|GLayzGT*n=`u0YP>oqmnXmI=#=YLmAqNE{9T@dzgafU-#`qwBLhi&WYd&~j?h@g@#3_Fp*!d6SS$sfU}lsx3n zpIPZc*v6*HWb$yi4rdXjq$~GG^9QQTbTrSJip+l7vN}yPn{~Xu$h73=&dTxBh=qUr*XH^%%Nw{N zjU`yZLRjz3@zG=w%j;-L5g9jPnU~c1B9+X3NlA|tYKsiX?3C5FQ)1t&_B}c!&P=bL z%T85O;@Pz3JfdK2zfiGIR*gjzN{Q?@TQ7xOo0?ufKik0GEHnkO!q1Gd$S#!*lG(9m zvum*7i4D84sq3?A3MiALNLLwD+j(7+nk0~wt_W+su74D1S&-W_ydd+Mfz@16GnbOq zqBg~nz=G0?ZAl3B3cly92Pz*?(grpYZ&6vp*0e8Jk~oE58=^!=q^-y^jXyL(`Aj11 zL=AnPA0MsMFv_i6SB%b1ttDK3PLWmC2B$MOWo)|nVlQ5 zrXLo}&jlsE!>*l|BS;6}))CFE_}tlOLe3Rr#qAc$pus3a$otrKsKL)|-4KuENXG&t zDse}4;_0om%4)L9I;Em*i3mLnW0$Y)pDj{X>_%7E$7_|3I6lZA>zb@4%h;*u`b>6m zkUoF}Fmgn{2LI$=39Ie?V$ROjQDzlPTRDd94et}kf-Y^^Ro(>j1gn~)i>RZOZQyhb z!R8XWJm;Ge>FTJwm3)BG~G1O#QOVUGg%p`u}ODj(+5uts){|F8){^*3n@y5 z2%U68ZFaQYSkY0v#GAdV{D+XC>_+aITgBJw2T1wZvZz*K+u#rT5-K~tOc|1&t-35h zkbz(`!Y?+tZfr)DTSyGUqlEo!ggahkKOs-DK`$$3Hm^S-j=RZ@Dd2pouI#IBVO{RNiP;qOO%y1z>$bmfj zo8L$p{;t~(@}2eWyDa#9rGWHf+dC`0ic4#TKR8i1m@LZyimriQ(emmL^fTkx^&EYFk->bHwOhTxZ?)D3No0X|V4t>OENb~( zEyeDyP(xYpn`+CF<_7E`F7k)pV(F}MP0pf`Bdu8GQ>%`$;k|aIu#~0PfI>0e z;@6w^>Wvo!cHqzb^F_hZE8)G=AKuHn^QPpY7ysemKYQ2qkOz zv3}%7qSZ`}ni)zBN5~tfT={I+u$@;ps%^N$rA+-Yt?qHuy)a4&_}ic9u^bPYd&*2V zhT4}rmK3aN%Wn|a97x;{Hdlhsj{P}9zlrQ)Yi6Q_zFZ{tw71Lc zMRE^&>bboE-C5%3rjvN@b*uJiZPI|HP_hBPTl_KC^WM!x$<`{=r){pLDy-C0hY3IY zv>vv3!5@|{dS}V$a(yMO^(C#f@>{Qou4HE=6t%A86@SR>@otTYFtUnS9Ug;UD=-k=)PT z3co0l``S|{isU}_)Q3g#qxRI%B00yNdb3E*)>29_+UHwUDfdhN(+?wuy%(BdE>!s- z`i^V4wFUdi2GL_xA?FT=`=FP^ zK8Z54AfLF>)3yOBqxYFV^#0?EUWN~P+WhFG3pueh@M_smRbh5CniLRrruXx4yy#1P zA4>k~56jcOSoWxlOy%UDXa&VD6%>E~1kv!C% zl8WRZ_EF&9B6+Yq^;eNR$ey}UBoDNY48Ne3{q9fU|L|UTN^VwRaJc0t|0^gz`Lim< zx$O_XzrFM0w6rqg+;OQn?7&>*2QiWO+*{S&IGU{I>yH~INusgd^M~erA2dsIdV3$k zL>;2UK{G&AB$oHsPMfGhjl9+&@Z7*RTrfQQLI(2#ozzDu3Gs(ys4tS4m5~f{A<1%T z<}?(VT~A7#~y z($pV(VowOyF=c>2^(25-xwFmoE3)IgfCS6vsfu?Gkm!gKHmE{>sIJK!*F>J#M z|0rzBq)pP)vQ5E;VmZ-7%Jw{?*_PSnz9NHRTCc;f9J-dT+Ein{B!7o_sxamkMA~Z{ z%ciZ^IEi6-r~wN}P8iD{U%9b1(bEwXx?&fU=0U`cPQ-R15@@_2hC@3hx6j!pe? zcRO)CuRgnN3ZsLJuL@2Ai@BXF-m(K|M_GEbn)#Locck06u_O|win%eWurRv+*+hSSs z)G!`(LH$)C*$f%iW9F9gQu&a}>dOZ5X!(7fKuY_F3q9$yptN^Kmhx!AY_|47@AvqK z8@+qbl3qq}sv_KodrXgu>kShW+HZ?IvFs*ODElEcJ%o)YjXTRi#>HJ_NBd`l=xGj= z^cc^5GA^6&zW=KGDR!??Q_Op5aZ&cabZ0LkW&0YL`%#Jm`p$b-V1mu69V1gI>C8?I z&Dg+7o0w+t%4t4wPFrTciNbE|ku{qAtv)t0S?_9azEIrM2$;v=S;yp>W z@B>%#rc)0ZxFV4$T7m8NyV&&(#$aUxa>22B7xLJ6a#v%>N2ZRvS+MbQxmZs5iIAxk zG8v6bCb(rXQDkzL;G_;|X_WL1)#o`>KWU3RtwJW_k;!DIu49bQ^%T##p5}&>_aNPJ zt8eUOtifwEF`ksj^a^m|n&eEkoNz{76kKWpyB)id(w>L(%`*_5VvAoWmy9stdfbc( zxrn=$bKP=zLgex*;n!Oj?-J&SWn%;qDziBEV_RDc|Dr9U! z#@GXKDb)&}8OQLLKigh)WHzg9j(YwYNwj|mVFS^RT58VA5C{9t}(qA=B zlTBMGFKlT{Qlwa!vb>?BwcTD%xMlpXDcp@=zF_#b*kMW?W=`WNEsX&RYdzI?++NM+ zxjih}3N|X}de(HVxgN`$W=ayQioLLsDc!*GzI~xRPYmCDjIdqvji?G0Iwd`ouIsSF z6;#+xuU@+}m%%%XUW)(IU5A66$}2PP2P*{M%Vsk~YJ zgwG6=z9_!&usB7MAqLR2g6nCyoNhM~iR@tcX47Cke1~y|fk|sklZCREdodj<)OyqR zWaIZnY!DnY&Q-X+Fku#<79yy3W5?exCMvtO$QIp$6@=a2W>N%;UTkZ$sRdtk*f>`r zdsuEwQ(fNhsPQ`k*N;wLN+g2?FS&g)TCtBmHa1oFEtM@8{k6-bW?thH<7Gl#71`9{ z^-dVSlgNIS^u7tl;Z7QVG>`)ykg@HJd=#|aplj@;JSgpKE@&*oZi_x4a{ zhOf2cAKo^m5%moeQST^XERXre_zS_odik#LzEtfk95>Z|a3Cr#+SFJWFYHh+(;)+S zyC8K=IFD9Q0`d;anPI{tFu?S=L9e^7qea>@=%)HyoCPNUOWF!ru+fT0Q$6F+XIooT zS@+rkK_Zc#!Dl2GXXfd#uDXu8EJ>df5y1|8I-xrs7;V}uk$3a6%skO-x&#Z|4!lKV zlY?v=H`g^`%=@6=K-X5}Hpj&4HLczVjnxVXh?7WMT#9b4E>$;L7hq<`BKm}p8$7GC z@m)ebWLaj@UsM-TKx(uq$euibm{|UNwVqU44glMPI+!GVWLivg1$j~5md#Y}u=tf@ zGldogpa;$%zZIm0PbE!x&d3Cbkb5kDl-i9I4kdx&Qnz#g-N&hyGwX^PeTW#gs1{rg ze!albX|%YOoj^z?vpf|yhdjj26~{&C>HAQ^$Lv4-Gg8D8@7vqJ$*vjbu;?c)eahM& zw=d<_du33LThQ$kos_#_4hT-z`CwASg6Zbe&6y>D96ymiOs|m3sO)zI0kN)@kCfTw`=P>HKs@ zQ&Wk2S&%y&^|g!X6Ep`M{aTa)+x5;vNYQL~fGJd%xxm>1U*&rrGxaCrjEf!6mWS}K z2bmfuC8Z`zK|;z@JcTgY$MlTy6*B)HL*_5hOt~OuN*KL=StxawP)2q3+sZ|I1ZbQS zr7O`FkC?c~<*W_PJvl~|@7$5?Q)r>tx7oJKkK7P!yOzB|HHC_QCfKg)kg<}U8_)7T zFeONxxV%zlq2&KKl&9m+n&1V-@^V}* zrFU5V%SEl((VnIcdB|B~Bf^tf8n+W}891_u_MS#?VD-SIA$LUgh9zin-7$+PR-c<< ziGh+w2xYXZX76>!>H^{=+#!hIDfi--ruo0Y`ktsaX37)4GMz_;LiN=s5B}D4OEF34 ztkIYC*QE-MwVKqjm?d40KDykppFE^8?LCxESBm4E_wUQkF0^2Rb7+xf2{t3dl$f8b zu+kh;L-x~>g<5}IS9AfPsK|YTg|Zs!X6q*CX5e=!%b61w5z$zesOyV6^X+v#Vme`C zpFruc4=P>x7k{BFM>W+fD4e4&*xn_Uom^~EF&(QG6ov^^Si6&UYT+zzLV8p|QCAa@ zS?Wf+I{V6PFkh!arA)7@>A9nTt&0!2u&1A-7*s7E3HO)@Ipr zW<^ngdX~O;RDQOeg*H4;gC#aRpa>*&8S5)bu8&lS`(Ig$`}zLOGcu~ zl1dC%StCpI`Xzv3mWR!CjQ3Gv@gwyTvIQ$ta0P>&OKkl}Rl4WWk^Oex6h93 z0pb$Ev4G~h&A=7siC)4j7pZEuTpZU%CASMMlG_EBX2sc*mHt(&mbXhTcKC0~;c?YP zs`6DAap6RAyX68887{Y6w1RuS{1o5Z(u2Ap*sQ0XYTH`Erf zD~^99w~H@Q*~J%)L!!rnwk7t`8v|Q#bNgyPLixD#B313uOQ5o(9NO*Xi&S>=MT4&E z3p%MBx+b6-RP{u!Dz4{94PB1(Qb}8O7k+az*koU@Ey`i*BcG;Kf_1$aEv2|YYYXaS z&}qJ)a{`<58ttoznvNSVl6C{8vfBkc0vpJoWp;L6lhLjgNZN9G8T5m=)zDjKgY{}z3+)!Ivg-CNb(l50HldP&S5xu*U zNqZM27@|ZE&(W1Pbeg}TFE*RKvdILSN2pO4Rh&xHK zUNqDhoO)J?Q+S`89usDcNgRtMO{v%P$+hY=~YeU^67hoz)w(A&|3}n9k`GBcno!+BI zI(zriASl{X`6q$}mhP)olQb67-B`?UTKZ4`<~uWeF~|za)SOhhT;h>%6G@um7yMi| z_$Qq3#|}-R>Oz=)<_VAm0I~T6veX5HO3R#O(*T|n0K@pm%K;VutPlWJ0AP9Fk5a630U#33 z*%2r1;b{4<_NX*%swxKxzcbqf~942dSE~27xor6?C0&+;;!3gd}w6gPJ(*~ zUK=Vue?x#i3()O;fxh4d`l3_Mnr(M@#Iw(VpKITN@*j=Caa1V;=*xbAzTyVD%MEn5 zsIa5?_>{o;sIW=FW;oF)*&9@+IS-_5<;{WT#7B3tB*Ng4{zg}z?SK`ICcNi*c=jsrdc%9WX3x;Sa7VjDa zK-7mLVqHzVX6usRg;;z10`frF0RU3r`)B=vX>}4x)W&FWQB+r>*HjG=(;#wP`$!rqyWxg`-FE z54lOM;qK{=$Zsu^AWvIx z-&FpO1#=boxCP#m<##RPArCLMjKe=Ama&jUmNAgKEtpoxJ1nChw^~L*ZnES;uCt7Q zTy4RPUinE2CVlb}%TUO9mLZTcErTJaSO!6kw+w_FX~Aq%9%AVa`IzM~$ljKIkXvXP}1WF1RS$OH>!>2i#vJ7k!p8)TpbZk=U=r3)mn zJc3^Bjzzp)+_H3n{LRu4@@Gp2$n%!=kY_DfkY8IeA-}TVppbOZ(iZX)OB=`|mex2% zAaP4esSrjew4$_zXRRo$VZ9ZlH9TWQX${M*D6PS2MQIHStSGHvwiTr{OtYf2h8|Xw z)=iW;p< zw4(YdqpcF;Fe`-|U?q@`T6K^;ETF1%wk(3ow4g&*T3RqYQZg*_@#nt6leXb6D{6@0 z4=ZYj;WsO4h~b(QHN^0X6*a_g$%-0c_|A$NVmM<(tuUOnK8{Qc?^{tV4DVP`6AZ6g zQ4s&B+;3e`?(D=eH8vk{paoUZ>mmX=9lm@q@ zPOqYcSi$1w4~aR|sgm1)@QR&TesJNRKpb57#xFYGy3zTc8=ddG(aD6T^q`;@VT+5x z7H6P@AN)csbwfSphWev7RIJ!~^=@ic%fEun_h56;FE*D7j$ItUhol6(jMuxd$`j)C z4%>A0^~}p2=^RY%L|K=3OCTHa%&IWq%$mWO_3ON2yP$29osS5~WJ69_V)L_2uJ61T zK<$cO)P8kS)Kxb{UGvBcwM95!of0G*ur>~p=a>FVx#EsCY*umo`1Bty{KonBpIg$R%5XguCIP8t9(@{nszhd+wk( zULszM{|=c!Ia$;qofQ9e`BS=c^{NV9%paM(#IvVeQ5V_yS*QXcFo&!C?_&6u{9z}{ zF6^kRI1M4_5xqBcJVIHwXO@I{^lWHvC{Kr=pi^KM`EV%yIff751mjnmQf#qPoIE1)y2zBF7-6Mw*wfT3HfA>|80k58KheUI1 zyZu_W*(L{pLWExwBHbuNxlxGrOkr-v|55(GYe6cS$Csku;Xtk77pmC>75m29e^PTr zN0scTtt8$va!TE^l%LfH>w$b#AjbkZ$uH!Z?#Ow)d9*;DmTyTHN&W{Owu(dS@jdp&~$aJHToXt!3g(koeTFI7RDpUDUzbN!^qtMq*fvr6j{4F`i^Q#)x)i`V7>esLJ+#$k|C4ab6~P(9vGb@E{E(AZuQRbRZy zm8q+53F8Rbg}3#+AkJk zTv$+ftW*7j=8^j)W7ps^e$k5?dI}EXJaTYd=B-m5m2eckihCh`DB^J!3K(><){U(p zy8h|Tu79#e;F6OM^`^Y{Kf&uU=(MR06NsgoX?`K+xgqnM0gvIdG@yIgCud}aN92Ra zcHnA+JvOmk8f&*IY^FBffIIu@5B5c3&1tq@q~^Gj%AM=17Y@*-y|(B^@QeSrQGED;tO7Sgg@6L5JiIAHljw)(}v=Eeb+SnP)oG!DzW zaM&xc{h#kO@Zv@xDHOi-s^bD6jQFI>Ndz3@*U8KMVzR=G$x1gStGqIiGH13d$nKxx zn13Gf#N{b)dBzhLh2KdHQ7KvD2EEn^E!rd}eL^T9`5p;4_Ow3p1o|{U*Lwo>7OqU* z;KpL3lZ9pq<{AIwLtQEB@$9ZpAFl-$J+UhQyJ!7k_naHMEpF_d_sH&GvYnht>%Gr% zR))2x5E@GJKyRPU{OgJ3X0R;ui{*AVmM^%me9;TbZj^VM9uu|aTwb1O90*L7wA4W&{y3+_j>`=Q?7qATjQ zM9Oc2%lm$D`M`w>m9;BI;!K&=hkWFjM|3DWz)$eP;5{(F{S`kZ7oWN@IN@f4&pb0I z4Nj)4={rl{`T3bu2_A#UmGu<)cXlBap$aur-|R*6d>wjj&ilyA8ZqO#_X zsjO%D%QG3RHs(2Lh*O!-QlNB;<^G{>;Ie`${{cq-RE1GL@mh4pg^19M!}-#yj$ZCx zA6%wa&gE}W;;L}z5eP@@PVFefm6THEYRLq1Y2h~%$p@_&uC!vf`NPojM7a+ldjE+S z+=)27DGezj;w8?lW~-SG5cxh7ulI@qCIS91IVw)jD}gRds1oFCQFe6%`%uR$Ckyv& zIYsPCSFaL}Fjv!rk#EQ;U00s^%Jz$8kssh&7(S~U4w6QdDJQ}Qt=V2^g@RUem1w!u zm>3uJa5^IVnKBYJe2|#qBq3T8s!C9GVIi@7AMZbfgaX7d;BCUIe;{!>*M&in4+e9c z3?8sf95_@dV6W4gyi&(S16a+qR}lO8*MSYDP^x%|)~i+3C%n+81sV;jqzcE9oYKgJ z1}a79nY6Oi5PMy1%;k*gh$ubJ3uFU8ruYS!>JCYIn%rXbDCr*ce=xZ|<@K%A-;!iF zGw>9GRA~w-4>64La8A9vI-DUX54%7ydL}%Z?QcKteet?JkFWi?0bJ!PEjY&XT*Aj} zs6IoHbd4MH|2iY!zkn4!Hv5b;emT6XU6-gBjZILGtNTBUECPE#*<()(No6Vof&^1GG6R4 zV;uQWw3rcPjC;E=Ztf}L9B0O7t1nb>=GSA+IB=x&b))PW4}#HbPdWE@=6p-b8S9uH zw2YHM${>-m7Uv=gHN-Wj1E=F7a1aDzmX%jGgXo6>; zC2JMgsCz_5N_8c=M;KlOTCn`yk?mMfn}$tH%Cy}n0zuUmRhR`U!<)x zo9LBiie#(F^@HX3!07sc6(6XsA1v4#U^NJbc3K|E5BTpA{sffSCBH_zMEFZzh7CnA zua_0`cEtOH?f#>1fUp;{2T|bkZp4e#NDX%V33X738oAG*l8{KTir;_FqvE?o&hLgt z?g`UWwy}QXpJWNkdTP}XkFgoxc_%VjF7r{A

xE0rf7#k6u5ekS}{uG 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

-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
  • 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 Ie^qz>ACHeaX8-^I delta 337664 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

    qBuDqMor;SVOqfwxk*&FMmtOJ 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

    LDr6Uf2c}W% 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

    Swy+Myb?(v!qg8fMTEG0=tl(03hqj^}AQ*&*fBU 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 Z>SplOa2iY7p1Vz;8^4K(=7Q*p{{vSf0y+Qy From 923cadb1ae3c4f1fbbc9bc11a818ea62474631f4 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 23 Jun 2015 12:19:55 +0000 Subject: [PATCH 49/49] Test that the left and right sides of a compound SELECT operator have the same number of expressions in the expanded expression list before beginning to generate code. FossilOrigin-Name: 4df852ce26c95d5d23c83dbe9c59d2c3435acddf --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/resolve.c | 7 +++++++ src/select.c | 14 +++----------- src/sqliteInt.h | 1 + test/in.test | 20 +++++++++++++++++--- test/select7.test | 20 ++++++++++++++++++++ 7 files changed, 60 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index 9332d172a2..609f6bf027 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sfuzztest\sdata\susing\sthe\slatest\stest\svectors\sdiscovered\sby\sAFL. -D 2015-06-20T14:11:56.166 +C Test\sthat\sthe\sleft\sand\sright\ssides\sof\sa\scompound\sSELECT\soperator\shave\sthe\ssame\s\snumber\sof\sexpressions\sin\sthe\sexpanded\sexpression\slist\sbefore\sbeginning\sto\sgenerate\scode. +D 2015-06-23T12:19:55.597 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -248,14 +248,14 @@ F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 F src/printf.c db11b5960105ee661dcac690f2ae6276e49bf251 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 -F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 +F src/resolve.c 2d47554370de8de6dd5be060cef9559eec315005 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 15a17aff39e161d97deb880edc7e0527f01b2324 +F src/select.c 09865f89997db6ec617a78440cc18d84855e3053 F src/shell.c 8af3cced094aebb5f57a8ad739b9dafc7867eed7 F src/sqlite.h.in 76d2f5637eb795b6300d9dd3c3ec3632ffafd721 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h be1a718b7d2ce40ceba725ae92c8eb5f18003066 -F src/sqliteInt.h 95b99b2821811af1f2a1190fa829ffb8e6c04135 +F src/sqliteInt.h d5df694bc33870e77fb08f389d12309597fe3059 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -668,7 +668,7 @@ F test/hexlit.test 1d312fa816dfd3650a3bb488093bc09a0c927f67 F test/hook.test 162d7cef7a2d2b04839fe14402934e6a1b79442f F test/icu.test 70df4faca133254c042d02ae342c0a141f2663f4 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test b52fa96bcf6cebc5c8829c822315d0f87af9c6c2 +F test/in.test 61a24ae38d4b64ec69f06ccdf022992f68a98176 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 @@ -875,7 +875,7 @@ F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054 F test/select4.test 6d5bc6d178a367e8b48fa1c1d3ea12cae9c2d650 F test/select5.test e758b8ef94f69b111df4cb819008856655dcd535 F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0 -F test/select7.test 7fd2ef598cfabb6b9ff6ac13973b91d0527df49d +F test/select7.test 71f06cd37cb6f65bb08ba1ccf8e2f5818c09329f F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 F test/selectA.test e452bdb975f488ea46d091382a9185b5853ed2c7 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7cdbae625eb029538a693d2bebec465a6f65fb90 -R 5add07a39efb3611e2cfa0ac20a2c5f5 -U drh -Z 71db4d574368380e4b14cadc01f6d8d0 +P b97f9cf73e503c7285ba3a801e1f932f222d96b2 +R 5d4925e11483f968b1575f6656e62b8a +U dan +Z 6c0c66a18bcc0b19ae618b4e0a65b57c diff --git a/manifest.uuid b/manifest.uuid index ad06e9f3b1..3a395d46f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b97f9cf73e503c7285ba3a801e1f932f222d96b2 \ No newline at end of file +4df852ce26c95d5d23c83dbe9c59d2c3435acddf \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 27eba9fd07..fd57fd7028 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1331,6 +1331,13 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } + /* If this is part of a compound SELECT, check that it has the right + ** number of expressions in the select list. */ + if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ + sqlite3SelectWrongNumTermsError(pParse, p->pNext); + return WRC_Abort; + } + /* Advance to the next term of the compound */ p = p->pPrior; diff --git a/src/select.c b/src/select.c index e24b93b4b8..b98bae8123 100644 --- a/src/select.c +++ b/src/select.c @@ -2093,7 +2093,7 @@ static int multiSelectOrderBy( ** Error message for when two or more terms of a compound select have different ** size result sets. */ -static void selectWrongNumTermsError(Parse *pParse, Select *p){ +void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){ if( p->selFlags & SF_Values ){ sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms"); }else{ @@ -2119,7 +2119,6 @@ static int multiSelectValues( SelectDest *pDest /* What to do with query results */ ){ Select *pPrior; - int nExpr = p->pEList->nExpr; int nRow = 1; int rc = 0; assert( p->selFlags & SF_MultiValue ); @@ -2128,10 +2127,7 @@ static int multiSelectValues( assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) ); assert( p->pLimit==0 ); assert( p->pOffset==0 ); - if( p->pEList->nExpr!=nExpr ){ - selectWrongNumTermsError(pParse, p); - return 1; - } + assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr ); if( p->pPrior==0 ) break; assert( p->pPrior->pNext==p ); p = p->pPrior; @@ -2240,11 +2236,7 @@ static int multiSelect( ** in their result sets. */ assert( p->pEList && pPrior->pEList ); - if( p->pEList->nExpr!=pPrior->pEList->nExpr ){ - selectWrongNumTermsError(pParse, p); - rc = 1; - goto multi_select_end; - } + assert( p->pEList->nExpr==pPrior->pEList->nExpr ); #ifndef SQLITE_OMIT_CTE if( p->selFlags & SF_Recursive ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4812b89944..3ebd8deb80 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3570,6 +3570,7 @@ void sqlite3NestedParse(Parse*, const char*, ...); void sqlite3ExpirePreparedStatements(sqlite3*); int sqlite3CodeSubselect(Parse *, Expr *, int, int); void sqlite3SelectPrep(Parse*, Select*, NameContext*); +void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); int sqlite3ResolveExprNames(NameContext*, Expr*); void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); diff --git a/test/in.test b/test/in.test index de38c22456..3a42e84b9a 100644 --- a/test/in.test +++ b/test/in.test @@ -450,28 +450,42 @@ do_test in-12.10 { SELECT a FROM t3 UNION ALL SELECT a, b FROM t2 ); } -} {1 {only a single result allowed for a SELECT that is part of an expression}} +} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} do_test in-12.11 { catchsql { SELECT * FROM t2 WHERE a IN ( SELECT a FROM t3 UNION SELECT a, b FROM t2 ); } -} {1 {only a single result allowed for a SELECT that is part of an expression}} +} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} do_test in-12.12 { catchsql { SELECT * FROM t2 WHERE a IN ( SELECT a FROM t3 EXCEPT SELECT a, b FROM t2 ); } -} {1 {only a single result allowed for a SELECT that is part of an expression}} +} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}} do_test in-12.13 { catchsql { SELECT * FROM t2 WHERE a IN ( SELECT a FROM t3 INTERSECT SELECT a, b FROM t2 ); } +} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}} +do_test in-12.14 { + catchsql { + SELECT * FROM t2 WHERE a IN ( + SELECT a, b FROM t3 UNION ALL SELECT a, b FROM t2 + ); + } } {1 {only a single result allowed for a SELECT that is part of an expression}} +do_test in-12.15 { + catchsql { + SELECT * FROM t2 WHERE a IN ( + SELECT a, b FROM t3 UNION ALL SELECT a FROM t2 + ); + } +} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} }; #ifcapable compound diff --git a/test/select7.test b/test/select7.test index 6816b9fcb9..9ed5357748 100644 --- a/test/select7.test +++ b/test/select7.test @@ -15,6 +15,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix select7 ifcapable compound { @@ -201,4 +202,23 @@ do_test select7-7.7 { } } {text 123} +do_execsql_test 8.0 { + CREATE TABLE t01(x, y); + CREATE TABLE t02(x, y); +} + +do_catchsql_test 8.1 { + SELECT * FROM ( + SELECT * FROM t01 UNION SELECT x FROM t02 + ) WHERE y=1 +} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} + +do_catchsql_test 8.2 { + CREATE VIEW v0 as SELECT x, y FROM t01 UNION SELECT x FROM t02; + EXPLAIN QUERY PLAN SELECT * FROM v0 WHERE x='0' OR y; +} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} + + finish_test + +

    (AAy@-!wmUCPt!QgsS0HILIT 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⩔NLEN}v@G^ASGDer%~s7P%USlcO{=d_G{ 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 b7TE*kpQ?>XZQRrj{{7nbu*>xhd7J+Q>~7tD delta 239448 zcmeFacX(9A7eBmn%kJLIrfho1rV@Hf=$(X)w9q>wbdVN`fQqoYh%|u^%+Qpe2nYcZ zA{kK>@GB}R3W{O}3@QTB1VKvje&+5b>?XUL{C>~#KF|Bdo5wv4yZ6rL%$YOo%$YMw zE`KR6x&Mp2E?Q`CK0o%VNSbFErMPO>0q9~&eb5&y^*|R`>VnR;)B&AjsSTQLsR=s5QUi35B>}Xrr8;O2 zOFU>NOB`rBODt#$OAKg|B^tDzB}%hcBi68(@sAiwBxr=C8fcIu0@T+M4yv<+ff7ro zMk745gn-_)1cTnN1cCl#2?Q;&m_UEA1c08i_=BFY_VARpu27r~D1u?^pdd#%Gk_gLZ&>Wg(k zQnP~rl99z-7ta%V;l?T-x@6g2J^T0fCPqQf7})VHz8wUXe0$X~LjNeMD)!ys9(UaTSU4~XwJsHL)qy}?QW74&`~-o!Q2AW`+6mNJ~P?9K#B!r%+YiLTBSPlLx?TXTX@X{p~>}WQ|K*Bj2D@kx; zH-FT0L>$b^#vawNoFsJi`%kxLVuGayA^mB_xyWkNugjY;bm123Wcrn|HZc1`Ww(y& z#}G{qy3VjRizXH*@6(b-7MV$HmH9+mF6mIFsbaMade-RvlJ0~g)0AE2YV<;{jn(NA zYBth_$9r|8N1IqW2%4~iZAFQgspWCnBrfPTNkKrze+WIWy+Ed8wnw58@Aa+65}VRM zQjprEKribh4I4=<5hEKEH0$#jk)dXqSZ6`UIRwqwJvjKPj=t7wQaHWYDm|79QDX0$ z8sCOwjUDqUi8+||kVpnevz%9Ba6!=6%VO5UO%Vmb6R(kj){ty@PYn>EN45 zCSEtsJ4Bh{w)6)V6v?!x4w*|tW-`a@AiPDR`_**zhSbFwiFCCKnXYTMH-p`-aUhY< z)PJ(`=!JI60_n|rt9*HRyLp6XMJdEA$QThcPk96F=>poz4w?nMBmXh-@2W?H!}Rt7 zGmOJvMAD>sgX!lCL%)8be_e(;8b^S%ioC*-u8UuxT69tfha2D)u1uw-6ERN;p=6Ub zjNW{)RV&ouhExy1>tN{i^)ZPqyqx_67v zo2TSBl0!|KtOEKyA}B~7h60R+bw3%5-TBN+zN|pAS>F=>jtBpW~?`m zaV{Ve-?MDxg}w!h+vEVVbX^A3%e%L#H!to4FKCB3S~?z@>N z2HYN|&`q~n{>b$(jubW*i$qqG#E~#z)GYIc^pXqGa%ZF!6_9wVDg1(PE$+c{e-XK_ z_Llq0F1fF9&V8-h+z&2jEszr|WpFkcs>_HFQuq!jBCIH#1Fr(`dT+p4F2Ea{fnV_e z++Lt5W4oDI+TiTr9`Y*9^oG631$(nI_7;!WL{o5~-Erb5WF`lq0D8?E&^8yK z9A}{I9)LOvwA+u}LcJC8Esp&vuy=UFe$xdT&FjfbW|s%-E&}TkD!c~OJkBBB0K}eh z5L$L8O7IuRUYFc+opaykA$P8nKk$6tLcV$B^3^lU>q_TM`7W6sbk4lML+0xQGJ<6m zlm1}-76&;1kV0=D%mw5fXOP2gLDnyjnABM~k76hy5Do$1h&P1yT@XHSMmXvg;oyQ@ zA{jx``}z)bs978bdJjM!dIS2O3(!YpKx2i#;zx=g{)J^b=8Nh&>x2hnUOTNg+HpMl zsW-HfE@+?G(J<`&$fgb!HWBi<7leKs;S(Ty=?&p47lhMg6nTNk z=P>8-&>vo4$e+$-pdIJxXYvs&+A)p)%R~Od1vdNxVFjAvNsjV6P_B7H`P&(VNwuS1 zb^zS)05C#eBfb-s1K=VDxC(&V-T?k_2B2?@*f@q4qoD)kt_PIm0$YAv7$HiHyqO(t z0sOu<@c&%E2kBS0;@|@v;13y=sY!$^p%+v4Kj4d`FC3N+z8Eq|^9p8-T}S8^zb2tt z%{^chd&4Suf_0RzLAQskA#B|Q2@QvMC}e$sHoCo_8cp3}jiG7TxyNYgxYkqX%?A5w zx*y)_NOjaUH;Ja+kn8YgdO5gz42zfKnY&(i7FTGNbHa5p0bD{t=zzLLHuOS8t0<24A z=B=ZI5Sp34W;CzZMx_!D@&Lz+lfjDvixLTS%Gqu`D;ozPuP|o}0cIt25SN#hEG{Xb zX9gX}X35t@7}p$2Koa2vas`Kky_cB1LPj}5qFDXD$V=tLYRB~zT9nyU%pd}Z@q)CS zBf&^S;=LkOFNb7GtrNuc|5=X27agO;RzRxZ1?ezHf=v{rpz=mYXED}sMuKI?MJwu6 z$e;MKq-$nOZ&B=(j=B07=>tM%eUlqUXFb0+gswZDTLXPPsfABNuh=jlm0CfMLP-j9 z2XSelc=l$QQ~}*Slo5fE{o-%v;r`-fgv}V%B#&iOd)10%`72+!h`H zi)5*_mu`-5n|5o@96(vyxWcw|fo;c)XDPHp?E`(-y8EkUh&y*%E3q(@t|vld2!LDM zlj+4ad66vU5>`(FNufE1^VYESm&IB5S4Wofe%{}NCSTV_vb-+7clb(@bfOpQCkYoMHFaH9pS5@-ej$=> z6!q7DHBQJYC}&YK2&6kNqlMcQ{>Qp&rS}NwK}p@b{Ty)(OID;e^t7mpJdX_xly(uh z3ov?d8REekG$STvEe+`En;^>K-*o$(?7bv_CVtZ5Brh1Z=#bu}64grsh_F~g`*rf2 zDv&;Q$)c6aBh{{X{G)NlTU_MX^etEAv!U63l0?^B(KqJWwtm3_8qj-xJ+ALRsroLp z_ofOxk!OD<1xqEOZU97foNT6X?GLnNUBjjKMFR015!u6%vWlhjWk;j2_>f=6A}8GHUyaMCdQI*7g$#&99r)WHgb`Y_f z)QBdfEQ=S4Q@Bw=kMvr$jJ~ukcfGx1 z_=uRa4S~^63e`5i{~JglTFykh?B-$@p=1f|x5paI2l56a0aD9pO_vl)J<$>}8^$!x zy4k)l=}c4l<}~I5cXdc7v#)P$b+I8OSE!x4ymp$DALq#s@I1PFS3uF>j%EY9N(W$E zUfNzPHC4(|q!ee&wyeW&=@^kmA^-92@}I>f zj+R~}WCG7WpB+k*`iNvAFZ~I2a=g@9B$J#}ovX8rntz==nl*b`+OL&5I)jzlJtE@( zI+ZKkpX};tDO`j>4IuXID|LKN(WXc8;b}G>o~jYHCtDgu$aE(_{%h&B6}r<--r%MH zZdUm+K3M~!JI!##XZ;p@MCMy>wAp zggrODZ`Z{e+&sWN?-g#5E8GiZ{ofcu&#agqOHIdH{7C9h)BWsFUiQVFE2XP9PM*WN z*7BTi#V*G5{8p&+m|l2ehaX31X6y?!rAt-#~`@LSN&;TvqU^(Y=C)6-P9wv|#yP&KBlcMDkLROZ^XS6`CSC>P` zDi0hD6sfLLP;U0Mfm*)nG@a13X6d$>H8z( zPV~m0{iW8pB?qkS*9Xq2`uMSr7E|3tIF3sSLGXJJ3W`VRLuetmTNmzQlCw=sL!2MVQZH+wsw1F>#g!^ z31kniihb(hn|GD&l`OX^Ozrc=)PB!Q9dM}qNUfhp@~Xnl!K$!R;EkQPJ+pJDqKpbF zWokX4=e}7V&GJUc0|fGpH~!w-rX5WVdt>fh&&<77k+~z4Fqc{nlU`|~HWsr>weeie zlZMz+zvW4T?Wv#hq(S!7cX`r4d+KzaG(b&}&*-|1+UevYT8#fmALL1?>i053Gdk+6 ztd5OSa?D$CkGm~y2>G6psd`M6G~~nbrDlSptE@GRl+l__RE4{by>a)6TkhiMXGgWI z$fp$-XMx{lP7-Ci-p*T@UhOMQ+Defm`U? zFI8deS8t4+cgt81J&Si0$%C4t=XETP-wtBuXM zHY`e=4XEo|cLQ(sNO=R>utPUZZ`(^ z;+a1|FnE-k;8T&g+ErvOiZka|73TasGskVk>ucI~Wg^^3&s4@>Ki0Q_{%rwkDt+Zc zA^fa_;HvNz;*B>N*X0>A@1SbBYY;+M8E?bc&@TGDj$IC~^Ki~sHFxVQA=1M-OEB}U z@5wqV5Gos0exb#>{Skp(Gwn6`TSC&@td@ib?Ci$U#AUg`EPS#arvTz;{(zjutobzk zDUrleENC0iSuG7Ud3hU`t?K*<6Xxi#NmQMVthui~OPs4uRtU_{ysxT}tEAIeCst3R zSWMQT0kxwivZp^@oj|k#e7uF4RjGhlUMt{Yi{4#%%X;KaH|mthUv2d8C%e2xA4!;) zqkl>5muq=kb#KsPoUc#QqxZeaMzqZl1bTXDZXs>=&xT!?s|pQhez*O7S?XkccUWa# zwf1AD?`{Z%;NfGNsa;kk9Y4NK7aGw~HTS{o*wezhExo%}?;kH~s%ywkWV)tAlZj;c zzm57ysvox`ByZHyb$NNo^!*T}p1$3InG+<<`LXokCT%1w$kq3hTI5ON?KO~;YZymo zp4irbCU4T#rX~Gyj`~7l3ctvGEdNtIOuS9X37o?JF_zssr8f%Lr}1Rh z5Snpe-)8@w)%#*PdfL$jJM&7f?NQ9C!=uoWNf-1bB56f4Ue|xhzPO}sA(GbgKs!T6 z*7dR;cK0?kWvV`igk*vOmuT{?K|rWaygi!F*!mIhrbwE_-p2z^~%NwvSiuBR)Hb?oXeC0LOA;Hd#FPYra=c(!sCPfp=a_Q#V$T%H{2 z{A7D`qRbLsQr;8T)rI`|!FYaz%kywLEoIrCK0X9j`OgdT=g`FA(a+GF;NDkg&Y}Do zg*y}pjzX$XW;%p2daE>}v{*PmA&lX&-a^>Tyxg&Zs1efKo+WT{#Lr6Y@;TjpM#+FJ zw+yd6&6t%Q`{i04hK%~34wk@B04EP$(F?_eDK@GH#E4Z!J$KW2Z#OA=iW(D4cpgoT+Y zVNUhKE{uK}(~&2dkQT3Kv%h#Fo?Y-+`;#u5tf%VLm?3 z^B$uEKt_+xLO1X(TNi4WL&zeQG1>3}Vb%ykH@&<7Rg}u#n?h)d>V{9rbJ+=om*i(9 z&7rQ;5@l}9K29(+Cb}g{rG<_&6xCQnO~VyJEbyr@l!!i7xDBX(24C9mx$()YPkqB7 z9a)-{)E5I@uIOl}rGII2+vg zBK|fMV0jNsXHANzjSC5(`EN|_$%b_{>=DU|%oL3L-3>n}(jo^-QOw-m@FyXw*}hjh z{DJ)pKL~Urp#z5)4v?3f>c4QfL93ObG~_R8N_i$o+|p_>i%mnZrL|k77fRItZl=Pz zto(Yt>AKz@qxL zqVV8EO^o`jiDOUDL^~d#{k~H=@Ey@9hV{CdzT(}Il6y2`ZO<|GgGRHJ01}*K3av@T zXI*U3iEDFhB>T1OMnWkWVHlW|9A-3&m&a)uXvS*NH8V8n0r=ow&uFG-=4htep-JNw zb*H3ObR^Nx%v*!Di(RFLyap20T`S)I7`nb0fWh{SK>A~%!9)}D40Uy}_G41~!L``s zKYmNOL$b4O1vfzh!BHc8=&jpI4YGzN6)0vYM1v~II1$-{=0!;%iitnO|LFF$Jrik8 zPbFO)OQl{z=M#2ik>MpGhKP@8#v7AYYK82LI*W$)3{TO-ca=c@-_aoOZltEcACUO^ z?16?5daSk~LhU%IMT4D1R$OHGJp_J$K6U7;5iuQ{jy$qQ4-Nl_^hTIZ@FCIX zf{7K?@xks&Ns!M?e0z=rF(KUNfy^E?^U-1c73*_Bfg7FrNIjoBq97h)cN_WWwCwL1 z2bz^XB~{qcr$~W6oKH&@IoszFVI`e>?u&xFg#FjeXPu5Nu9G*vFcr_hl}*iZ1hS+z zZ>%yBb77iK5x7~Qem{r5rq{6l=KEa1m)q4ZSK&*sj$~pF*82QqqD6;&S~2tMKA(iK zqBH6P@A+H`f#;K&{sw7UM2xLTEIVUta)Geot3J0ecRCdtC@4bl?CI%qW1DCgshM}l z?xDl_HuiZNE0{Yz#6S-W+CSL6GktBJB0`HIoHG`UJmU$*AP7uvya3jcjNvrk0nThJ zVd>Xi|J?2r$ciJ?2mkiLELVs%3Vuu~_Bjs+!XCz^1&zj@DSfPo`k1Wd*HX=}$RVo@ONdNj$Xr^(UzQuZukKic=h7QeF_-F-h7s^Vs47euD9DgAVmtnM5ps5{Uu z%J!TQi#@S$iSdz6#VK5F#BR#Q+bw@$Xn%1e`%6+2R-B|g*7n@{#ETm#hhs%=8M(4% z8DCM@hC#-eD1MId0!n(^V@dZKHz@LRuNObGly`m1e#bbuAZ^A5$i(IJaN#r`?riyk z3iUr@e%*`srd7rQD|!XhA&DX^B!eQ`>=w(ALCaWcEG&lgLGv4EX|C8jT${#18|eY*iFv*z9sTM)oYs>6S#^{O@Azi$_8#S^EG8cD z<<9!^c1x_~Sl_+ySN%oR(@%WmK;HK@Wi6k@*HT?iTFUhW=lMjB=lQs%I-Tb`N(AwF z7csg&%vX5Fx4lq$X3O5?{0Gj+!omx_IA&hou^utA$lrV~qYXat9VQi|&CVg}(P)OF z(GOv@ll%k&mD>BYrJdGytLCkF*6~vZU%%c`LF(*0*Idkg`$T%|FR@>CtX~vOzMnmc z!Rs*g$$@Jyt2()>dDQb8B^?^+w~KFB`q@XY6xzN2LSNcDJNFx!)-foCb@un$CSZK_ zOQs|5F07WBYN*&_ck)Y>Sg&wDhKzdo<%;w`jNd>irutPQ+iA-E?2()aFr6Lm*IS2i zTm>KDCkHYV_&jQIh5F4Lzixr7>tMfE@y&Min^k_@1L;%i7X*2e$6-9`yMwzVKTBQ! z6?;%)OaK2rV#@y?F$Ftp|6hujveR0fE5#OvZ^xcC1oen+c? zZx5t(+xq{ySR>uQuRE<78jbcDYa`Gu*1Dj<)_5E%E3#GtJz)ha@&+rw<#ATzFE_R< z0u8nxV2*Ux0_RQXhGi<~uNF9&O5a;1f_`n80Q!YxJm|+3__|8REEq+kcP%jTNpD-y zK=&`UjKTkQTSkMvZh;rBwAF$UPRh36Fub(R0?Vbe(lQKmsbwhW3l?|+OA9O*gQeM) zL7>wt13@QR27snnU~rX&Tl#?xv|vgg^|AB??QVg|R_bW!4cgYy3$(cf9_3P^Wid=0 zQe8_A&;(0&&}d6H&~Qsv&_GKUP@|-1Le zu9K|bS9`|_ezn)F;8A(4E#MpgGpYpqs5ppc|}-(6oV8sDSPj>(ii_Rw#mQsTGQ#TVjO@ z=oVU`0=jutRK705iptkbx1#cOQ>y=x-2fi(N7vVi3K!q7 z0PO#bz*f4RR;ZF7?(;U6+V47-I^Z%1$n!9l>MGD4dlm$H8>!A^({umW%BZ@Z!& zazQV2i(c4y;x7V?n;DcuXEoTjv;1*7`=sPAj(!m6hrOY{>x%xK3;GfF=u-2a1o~5< z-`6y)L>f@Y;iTr?reW`Zi=*DSIOfX5aThK=bj!uT1wRY)=i76?rTZU>b!chyn28Bn3@4Z`V1h<^l^*JB>N9BfgOvAIgbcId}8~xYwq8;lt_R2GNBQ?>XS>PIjZ)sqUjv(JK+7|4ewW1yz?%27d+sd5b23O z{Q^m@{X~kralFX!egg{ow(xiNKot;g=$k_H^D~epAV1cHve37=ip& zc+F3gV2$v9sE{dGE+1%IZiVPW5?RS!|9v`oy4gOxyH;K9pp%Ooh545d8t{i0?4$-* zMfpFJ-J|(tf8;+}o|`^)+JyfL(*!H}9U^2UU->_BgL>Bgv0PZwD8l&ivp-JbN(X1} zC0VH*`Z=omvHI?xZr{D;U#z9E|72fy5?ZP7j=!X(($@h!S>OKt8=(Cm0g>1SF7el@ zYr&orUw=sZ+x%P8w0mL>447oZb*!MkKT*Ij zx`1T9Kkvpg)hM8Zu!o2JVdfN?26Xphse`iz5w`7f|IPv{8l~pkE#OhvGra;zw2b`Y z4?itoU_fVWRn9)!^>Ln>*O-9EihHZ+w1B6y?5U0cn_wGxIY6}>)~5SUY;(i(`~X8B zJ=!29nROi=z}Hr9s(G(P-lV1{!-Q1Ftv0_M`BxHa-yu;AWm zcr;*iARGQ}06(Muw+ehteeY|$$BJYVuZ$Z3!voo{D*-F3ybFto`2QE88F4OVBp>0MOui6>7T zF!7y&U+{%_zX>MRl21&E#7=baZKDQ?fM=6%+H}#E7Tx8Ke5^il9*+o`9xUlj_V2LY zAz&Qq+dP09&o7%U;8EW|S9A3}(?d~Ak|NlHho%rcL!7g}-5OnKQH{V>^wgx_dKK*w z{(<&9=!2lZPORM})5kDSga^WueysQYtEA8zSXavu2WPLW5aY+*2-^j6?W`3TU=->s zWhN=`Yglv#1sYW2<+5^zrFIo}z_BZ?RqS*`06KlKb6{VIo3Pr$gw-zqcFtFrBn6&F zZA}mK)Le!H;$)C>CL_x-fhBPsoGSBs?|(oF#|KV8H`{Oj=Y035G>$`Efz^!#; zGzRfas|G=4ftG{?U1L{I2ZndQCI*DsLiv8=r2943^1ad5$I zf%K-P0zUW(+CSY+c_w-*<~M*;|8(JxewEv_Gr-Ie-5@T;7{owwW2ynb~WD$=FhTFYc^IXA6{45E3RWratJ zjiv`11U1l~&y_5bJhAEzHh;k9f&tbQtVij^;tggx`oNBHY-M85LXljgmcx1D+2p1{ zTSW33HC+=MQ2$yZ188hXqz~)WGKh(!2!{Ef5*>Q^pxuP+?GiK;EoEKMZ9UHRgB654 zEcLDywgw4$cW$iGHTQ0;OvnwgJ3V)T@~H;~;m9goFYm}&?#yBba+2NqGopwHmZ{vU zRTWhIa(<5d0HbsTpIdG@y6uUhkKA!|rxK2m>AjgjwQ0Vho@ALpr>(Cd3R%wuZWn#ro?r8(24fw zO<(wPFyCOUoF$*&Aw=@bk|4``=O?8CPY{r-<^HEQ4#k-gWF2pIUL37ej+9C`;^9DL zgExKSkRo9W^AZqkk0Sdfr7; zm==7R(B-d0Jx4E$kYmewJ#6Xb+|&0))SRmD+|V=6g51b+Z6;RaH>py7KO*d-9>Hw| zKCDJ5@YNGD#ds`RyOSTtRLw)pYJ7#@h>~TIT~&u5`Mf>Z56S23$(~3)YggbdG_zjF z4AOx{jSrq7wVG_1PwPwyej3iK=tf)8C12J_qLU{C&m#2;KMg(rcZaL``ZQoo&l-hi zgF9p96s3${+rABs(z7G!!JUP|3yz0;$v5;^mz++8*Mb+2tXVC%KcZ#{wLBeNkKX)B z4k*(d%*BP9!FzmY?$caN9|h;?o`7UaA$Qr`xxrj%^&xNhz+F9OU}12`J{`hTi!}eL zzMjfVwmIZ(#o;kFq*%w>O|Pm{V{dQO*vD-(Vh#32@IaiTub_CTl~knKGxo0vTLZkY zHP91V?}4pB<=H|D!r_B7K8*CKWEdG*71oA%V{N!6*1iF2Bg$Co$~u1=d{iJKt0J(` zRpDxkXRhEbh+r~})OB7^xgi&I$vI0elmx46Z&=IoB&%dk zT9Fj($>))T9Un6kG^@-TA#LcFZRa)C%Cqpj#{S4uw8+KwP%!F0(Pke$cdiaCV0mA6B}O2gbD=0u9)!0(xm zKV|yHn2g>r^kkqP4 zvZgRKG~buyKSo6|F)ehnFMHKDbRyETLidQOHd1kJ=;3d1&F%(3Ju^ z-8nk~hNR4%V-R>GbcE`2)05sfCCh3iSf+)J5V*<@qBl48TtibDg?@gFJ4({j{I)&-N;TTXwLnmE6N z2=eEZv_w@Au^U-2*pU3Cr&U1HFsD@jzmma+p*r;fIbAlLb3{F2-S&hYCY=*cftL%xY`LhL_YK{D8$yo6+s{kdNX zSBJeSmv+D#!rl|rdc>S2ECW$dqm+7V+orI`{%WUDUilpTPj1)|`&(4Z3;TwBXAWz? zCpuy81v&EiG;A=Txl|cgaeeVc*b)0vRJ;)Oq{|=6()xwHfg#~i*kg5}P?jX4cWVH|xaE zPZx)^7PP8m2Pcb{gkd{ZTbX4?WvMEb9j!OZj@G?pr<5hts-rIGpJ8)1g{=_;ZDpn% zl`sD)v?pzVb9;I#Y$7r@xoz8}+yqu=PTHVKx>$R2igz@jR%j1#j&u{GV;$)RNXMvY zL0gMv7KG2>wkB(o<7XI~tY$|#1nEe}qke^{;oK*eFNg<*f2vdKkqRTj|0$c&%w@Ar zhONW;IxQUQYxT)#;dfyLx)8>#UJJti35G=|j1SrC!b=y|Tf=wi=+2<R!4*R41 z_ub)Y3(+>LM7A(_Ru3OS8kI@6LLZ7oU`ZQ~3xD{bk8;g~Te-AJT+pyF)(=O-nZ}if zSgr7;l{3`_Of~b&l%Q?yw(?bmS~xS*vMLOp0 zif4vUZO1qFZpN$4*KM_RaxgWQGu62grtB@Fu0xfl(#)d~Gh{4$t+gGRJ{sv-j`UEZ zYdX^Xk*?uL_d+_sk?x9gbu}$$I}`>-aI+^A5&Oas-0Zm;Okq;)2F4YwN`jBzTr)`&tg69lxi>Q+t>4r*gO-QCRWhotcWr zt9KWM@?TTk38!b_=?3SBU~S}3-4#&XhK{ri=?0GUBBbj((({q7=Sa^2_Y0~bvW4YD z=Cto5XrFZ}Bv`>FMGPd*ap9;VFH9j*B47$pPt16kIjTDRLRGk0?3pWgkfm?!@6kTT zIkS{;RywKGs&{93VQr*5hOjX!B6bL5X;m0R1OpFO(~S|d%e;y0C6zf=yfH!+5ntE4 zB}A3j%BnE5$}>agmDAe?HRioCVobQ&0~~eva+$=qS&P@DdP$cTfvKFWbGI_oW|p6v zGc_2lpk2>PTN)neWCV7HvdS$9+p~^eM|?mE)2hL5cP(@{+bsfhkAQ+AJbG(h(4NG; zcdepqDu>dE$6(q3*VBd7rn83HSKj6^GPJMYv(+u!tM1_h?Q0bZw5=jkF`(E_nbmM^ zeG4F7cMI``Cx{&tAl|G95n7Eyyu~5517f#Zh_^gJs3B=xs%39Qh=wY}aSpKy5O9;P zXcN#L@C1=pp%nQQAtvfK;mCe1xHz#Nf2dYNkoN%y9`SB~4tWAnL&v(5g_Q@g@8FH< zTI~hM>=rLj0dU~^?gr;QPdG;^6zF{qIHQ3>V|pb{e-iD9dqHRq;{#WBH=xHofqqy4 z^nV^ep8+Uo>BdB*g&|4{e|I;qpLl}(v;yo&53p-EEC$93mND%Kz{1Jh4eTjTuwPby z{mKLEP7Vu)rHZhh0~X%zZeYLh1bemu?6)3ZKj5%!+`*m!Ed1f!!2aL~_QwjaKY4)t zj>96LOU2Tj11#L)-N2rA4~q`7)Ic=dxx>8Z0s1A+en8?cnd)zKD+KjC4m59CS`0y9Fx#^LcTb{VN?T(v&D&Z!Yoof+Uo8aCB z)lW%_Afniyv#0Oo8m!5#T$YO@r@aAI|E2awa&03KNv?bxQAZ@Xlt`oCF^Z^GjUozb zPxnYT7d_y`coEK_-h#-flY&PM;DH>te3VcpU@t*JwQ7)1HH4i}tKe&3`GR6GiZsPXfaLwX>Qr6IMpz&_i*Ic@?d{ zdVV-!I}OB25)u=1K3V;O5$S7PYG1eA8(9oi|_qdQp*EB2<(^FB5TN0XlV{) z!FiF_MJlv44`IXJj$E(MtG?ziJJagj@bu;+vwAtaE||vNjBHMmml)#s;$a%!)9AvC z$0Pq0bh;2V?iM{hE;@?U{3vp=p7daAzliKd6kXU>gB8~;sPWf=>^b-TGBTg&bwN0J zhd@&_Bi%574LcqA7Fdj+ncMXP+0e6*Zz%FpIK^&65X0PYwD-G8I{WC?NVqi%lg*h(&`Cu&IL^kwA5IoZp^duBCT*u@;`F z&tJSH(iiUa^%Zou%e^dQ9HI!qOaD=rSr5NZqxnxlufA9gxgIh|bjcveH3OU^k&am( z5=7C10;0D>aFAY;+PHAh2$>+rqZ1d+%4b5){!dQePT;@r*l!a2(w0YV6eFzzsb7?N zs@x8`J3x&MsMWPby1ygc0@~ZJB485$w&YRD9m?#FheeZuy1$9OFf=I>S*j`vsTbO#owq+Sp8Avqk49gL?MhL4if8nSA4V&f7C+Q zi_^^$^<=0$V?o!eux->MY!V|oCL~9FP1xB*=0qHg+C6GM7X8ERk;7(f=@p~Z4Mc4X zv%g4-dq!dPTN>1{oj_vg#Rw%q)aV9#l%mXGg6XlZl;o^gPZ@P#_CJ=QU;84_LN?%> z<=;>OaNI#L!{vQnPh}8t97;_~45?hZ3P?df$H|1wTxH%shS3WM&XSebxifouwRx=~ zV^4w2;IXBOiB6-#0bAWjb}KJ;J`P%RH6UE@l9&Ud1>Gom>up?(lF{9e&R*GS9;e77 z@!srRcu&A<{0wj!O&M>fn-v?-o+du%nag{(OYG5GW}N_sn~R0H@c`|al@Z*B9nCd= zt|y~abvEe6ZF$Bz3YpEaGl99aZVW!-p9qRaztl~rqJ$103Z;37%%f0(or2hav*@NK zs|*w*b`Bw|%}MhIdU=d1B96c7o>oJ8(d5R>6ry3p)rIwHiwS`Ao+V@-&3HSP!m6Z0 zF!4TydRhIeU4d%9M{3jUQOZ&53Mr$qlDnKGK8wZ2+MiVgGv@Pd;tZC@#V=1Kj29HA- z!H4b61vl&Z5gvccpw;mc+cRBjn8!2I3%XgQ6&%Lee{Vjb$muQ>JOeMnc2?Rgm9`03 z%DNjmuuk{QyAgA^v;ob=!}Ck4^*S@lQGendCoanf7Nw6e=w%#_U>aU=CPLepqTW%S zMQx6AmF+XgN1o@C%XYk*k#RR%)cZQ}0-vjV z%MEdPY(;z&guj^HdU119L0oWsLS|5MLy2M2YeZ44NZ_?j%(~8MO}!v(t!|ybPBn;X zjK)wB^{=RR^cC=!7NfD{kvd2omHmC+t-2c4DUv3y4-XhOQC@}4b+V&#U5>OpI3&4MLA7hS=D?4 zvtPHhD7erfUJ`Vx%VqL%RWq?O$G}`q+&uYDWE2ftmNZ?RU-2f~R?w||qAnOq*E#pM z692XFm1dibY`5?c>w?cqk97z> zN-RBAmC#$gCmlo7*8aS2+3HqUj*;>;{%!)Fr!BK*lLF84!uD%$J z8^LiRh~E2O^ike{b>xG{laPr__%vG9GTpmTmqaqxE^1o*P4qi%pZz{MRLjDDjQU0- z^GcsB^6>2C=o`3&`1hy>h{&8D9Sp_#Cpu1Gv9CuJ5pv8`eDBEYorh6P5R3UZo}?vW z4EDcEyEf?RN97-@ zPd>d-XMN7;->2~JXPy528R~B#uY?vf;DeEgWs@1j2ZyPE_%S}8bG-^T`bx#1P<9KL*^?8~NF-Pxs*by4}S$Ni&s5L|)|wGJoDJSZCd{&#%z$9;`M zqd(Na$;RW!!fG_qYdXQEvFm`M`w?O|uem1D%-$QT zv%1Tpe-H^SG%suO2=6>p^#nPW`qC$RpV};;wz9eW@>q$Ap!%G25T+c z5d9nxYzWS6j(&=6?!F{~UWhX55>~AYSPrhtE;n*4@4&j zf=!L9%IC>{1MN0NtsSIT?+xS~31i0(MRyd)KhAl5sDw#E{o@5mPvQJ#y&KUAYkD-g z5IJe>6{^+ULQem>&*`3XPFJF@Ko3eItm^LKwFkTmI42PMZ*&onAM$A}Dhvmq{U1bs zqchkP5iyb=C%qlZPxqfJ<{(xQ53QtJX2vD4B3b;54HJ1~mJLyLl&Q9^pyO>_Ku6oK z7Ep%TI)V1Lbp-8YLqs5@t1THc+13HHwGGjBl%_UB+ff?Y5N$`PZEFJ>Z$q#h#cV^c z9VOI;U^_~Htp%vThG092WJ9nWeX$L}cJ%ib+pq}J-?lXdy=FtS9sM6RMBC9{uwgZ* z|IyYE^sKD`=$E$opr6{X)YN}ys|$L>h66PELR)RnJR8=q`aQOqpgU|eKwq;ZfNr#5 zQLJBYiw9k8ivwL|iv?X`!$MpCtZi{L{x{c#(;@m9Hh4kmC)*-H$J)^6=ttTjKnL5x zK~rsEpikLCK|9+*K-=4bL0j5jP0%;C1%lSMnLumW0zhMJ{-D)texSiNUr;|A1g{ru zKB%WhHU)H_b@pQXPYq0^+w^}OU&u{(A?0V=Fo^m)8^Q}Ir)^lHD4*E|gMMTi1p0vu zp_i0*Yy%LRNI7WhkALLa`ho7WrGnr>kYcb)(dpGttY6}_7v#zwjN;p zzD);u$EF3nX~P;*_m_=N_uZuXPRmM2KPIVYW zuh$kv$819woTDuQ>ANR#ThY|^%fhJPATsOQ{P)9(+1UJz7_O3KIplNWvSPD zk7b$2`hF*4eT=(~YnH_x8jYjkv3GHCFuPwpcD0@^*}0=P{p!OO6RIBd^;%33f>ahyeK;egl-J)1TyW8T%wIfzh6qR?l01yr-x*Tq~+S(F)vOtf!{bIzilK@GRmU zsM=7&y*9LsD?+&1i>{bEV{QA{|_CLS!etiHQ~vPdlz2c$X`{I3-YLa=$5DNLpt>c1zxC_t-Z$O9RTH$ullrD1J@*!8y zMPvYURr^r;0TWV1RO_<%TC*kb~NF1Zw#E_B|XSRi-AmE;R5&aV2FkM1WeFR zbSbIxJ?^~Ia;d|=;@pRp;pN0QtDjn#ke{Z2t|rDy1{N0{_nSzc-0kitsQYW(9Xdqf zOLYh%zkZez8oU0tk0M|ag@Y3gRn2fNCSPyIwWym38&*FJO0wuSZ## zo>QW|8_pG-NXzQ-qtGka0l@=c(I7Dgz{Blq5=ZG(+zUWi& z&!gqzz5@5dBtsJ4b=CfV9~OiCup=E=0ifBrYu)9$QYM z|Eun^whxrYzOH0 zbjj9&WNxi$#62fwvXXsql0e?zV<@gU%8UCPF@=7JM`Xcmczb6Bkbi$~VuaLpxt0c= zTf8&{>oURxy8C?Ya6$i;=OVG9TO8m`0OYy@_>Y8OIi~*cxnOB$vCkC~u3UBrzG&on zaKJMjEmEpCXAK{SUn2GaE|%aT+>6gaci_Bq1+GZ&<#Ln`hm_CwwX8?<%{A~;)#wj- z24zKY)ltZNJoQcm98B{|r#6ROvEa{TFV)4(yj1Ub2B1Z)s^hv=Mtqy(VG_as^np8| zV}us!;(Ox;ZYKrAq$lHc7A}oCBJ#bJi<{50nSSvb2s!QTZ%aNnzyns+*_}*E=b=#hPV82lRoVD(ZD+;`_?4_}5-8URz zIa@s|eh3gYafGjc@SS@E`(*Z>zVfN=9Ab_u?zi~Bxae8@ zzqn=($13OS&-3g@6MvfCJg817-zPcWKOy7ayk%VEoG}#W%=z{;xdKhXtl2J&-+AU~ zYZ%B8Ykp%s}WkupB#T?}x z7u147&sU#>I#OI(EbFPHaL5`shK^5O?^Xb?D$wdqo=05`rWPufsjJJp2y`#YT5sT3Lw0bKdC?XfYEH*d1`b=obFg5QI$VdN3e+#KPhDQ1acEH|5@3@GaSvj@WoBaa_YsnCJBNbBQVI7872yme zDAh`Pg?ZI6%qWrGa9&Vx4s)C^;6!`E;ng4G3_}zamm7!kD=1R5qeO9@khoptOu`de zj`KxM==T&DcX1h|hmM3p*Kmdwut(_V_f$dFau0jQmtQCIadmz*%U`^J)qzsi8w#Q> zJ<$wQnaLa-$=6`BORKDbCnU#(E9fnEp0C~x@nJ~~0M-FuqBp=KJ0MNFDQ;uGU8x?6 z*3+1mZ5d%J|E|6Owbz89F(I_uTeqsW*0Z9B8hr@ec2?$CqHLI&|>@GFSyk=O8Hn>Fy1rhbzcaE+y&d0i?db>d#2P#WO_< zIY>8vz~9PqN&32isNt8&O482*2p88fl!O*#)@aM}GMAqxTBSFj26}@Uh-1sIe|k|a zpytm4ZYB44M}ghY{lgP3_)R%?jeHvpBL!)=;nI5 zYR>+!tPAY}+}=hITN5X$GJw9o8~Q?LbU}I6rHs$HXW&u-Uuv}CrNb7M@`AVg7dz)q zx1WPIF~+pAR$=jk@UtM)YfLX*k-u|4sp`kk7Xf{#H}n^s(FJ9hOX*(nj7@)j;pGte z=!KVkJ&M;px0}M*uz`)0-q={>%mzA#(!+TpN^AOMx2*6>F4)h-sxDbL&So0NUye=v8MRL3z!kxZAvdbOi`4I$5)v zc}Up;#MiwczTt|fp4BTGQQq`|I9e^%MP97!0NL#cBrHxf*eh?j0_|}r+FrLn4m;?7 zHQUm>d0lIlGuLawR2K=2OdgVp2n%@zTKH1e@t5u zx0pU(*WkxB==;K*HHsi^Q>`j9whxTG?T)ekNY)Kokf0oLWlTK;SjHH0%a}tvbv$rE z|K7IMq*V%l{H{A>Zgo0GOfvSQmG@lHkGNFM``*w~yrUmR=Eppv+fB!?u_(t~IZ)3D zmX-g1-Z&WMor9yu{9|t%V6Dmb%9KxBIZ%%b{y((62YeL8`#+xDD@m^Ba-jwYJ%Ioz zKoTImP?C_)dq*kK5u`~dxuU2vWdTt@K}A{s%~+6TS1hO>8>kc&1*Iq|D3ITK_V(^} zFT0!jzh3_@uaD1XZZk9Q_tc%8ndf=@4Bl5`Fk79$+sOQ+5(C;PKawJU?5%xn&7Ib7 zFkf)9Z){jh-oM+r8w305viB0aJ7o{G#ZdeZSf8n3eJ;h~RRw7&@3f}hvmM(2<$r1@ z+bIeiYG13Nd?Q8qR??qN%jSP@K?zGrmbT$AS-wg^z5>Yi9NrC=$d$@AF&gFvU#1b- zQfySNYBQHt{i7qYAF1kVuaDc`W?@x-j(!KFGo;7bHqS@kYqIT^Tx^?S8~5=0(;CqP zYihj&z60EkYGwM#2mi+^7`Ko7SyHBpvSot1$^w?_`R~Sh^o*rHL;bWwaFc4ZCBjb1 zue6{SfP6^~`7c}#A#EC9+e`GJ$wusZqwp7ic{8 z0VDsz9VJ#7%)uHoVgxuVy?*cB6$Bm8h_N?49w<6_l!0yO(sW!r`UwM&2vv|sF$ilg z_=>>;807)9UFrAXjJEW1dLe}g2aH7(#wvzk41`(N23j&G%tWCqQOZ!#L@8rW#Hb;AT%D6D}r#CowU^<{LOBDDrmqAF4cF%oO& zC@D}USrkl{2`ovt+x9gSC^7*s?E#ab3X>{@=`4ZiA`5eHK?197rVS4xNvz%-bm`5z z#|<~+3C+3H2da9Ce3D`7(U6S)(&Y$6;M$r#UdJ#QQbOG%gu2tc?#<+BTRio8l#u|h zM~&idGP*Qmo28mXg%Y$D6Yp1D!_6BIV5-5ESL}(l0TzMH?0~-2CtD?Vz!T=Qt)72=HA?Lwz z6zFxp{qYWFh!l3H7ZxvgEqVOq_?av-Oa*#|8uTDQj|_(9k}7uV$bWCg!=mXZDfDPD z^hXqWj0*HjHRut59v=)%FE{y0JwXhO*T^`}gPr)-$Y^iLf1>dBsKC!sgC7U@$#U@i zem_Nw&l;vm8v8zZ+#6=fS&un8 z`{~7v{a5o0`MpJgozcxj{_vL&$bYdke_l^fhV_HK{Cg+N)se41up2bGmG>*cECkFl z3UiTMeneYe!y1-LaaQGNR6}|*Poqn8BSP^YqVWigGWm3AoVQu zE!VHVJC=Em+x}16@ytWA?A9$9!(8F|kpm6r5s`=4&{b2$UjgBekG!VqSY8okZR^q!>jU_x|F0yX`bD9ZGTh%yiQ|7c? z!f9D(oOaZ~iCX{Mg)oGha@+$Tp9Iy29UI5GSMH5IdPd?mdY3ZdO7CP+}a`S;mPUagcRLjjJ~CTzv-&+`$779ir!F#@Dd@s3$=eBlo~mx zRwIXGYsARCbULAoc}Y|mL~}Bm=uBhvENbD74;EqxH5jt#@kEaSd+$c)!69sZx7q^=T&j8BSG!3VeNqttER6(7j_$lgt%5?PHPOjZ( zs4J^*`bwG8*TI}v12%M3rzf7#X$3~d%C_mbt5YKIwxe&BGitQHQ>OJjrG>ZMEA22} zVl%iFAstuq&DL=8#?f~9+6}+ef0(T_dM7ZW4wImP53`0EZf$YmbiLsgo<#@~+@A=C z3*p}p)(hc_2Gv0S`GFEo^@sm*EPf=pnE^i;w`~8>D zc>Su(i#1$QZiUMNr(bwZFNDVFN@$#}Dsw_z`EF@yWb5iW&+FyC+S95!)*g1=ut-Z# zT%_?G_C{#5{!*sJ8vd58s>a+~_1kCTa%Z5+!e2~imGy6Eto~DGMJr3V4mu&oS}y-; zyCcv_;w$S~owT-ez>6cSZd&=BhH(A*ZupbSd2&T5br?DxfH;Z?AGd4ijEQIX{ zn}o0t(9xll%%N7Y7}=7+kn{TX16X4{p>QMhv?C0xvv7PzXc!u;M#{7pBVj&B!xSqu zFO8ekyW96;jj<9|(?Vm_OwN?4F;2mhDSBc%LqkG8F6rr>&u_7@g{&=8dT%?0Tm33+vj>y!Dgo9ShH=ntk;)yOzSG2I zH_^A#8@r>kL<^mz3&M6j%o;m!Ypoq-=n~N3|G5517J=-_EC)kM&YvfNVRKCRc?v@k^*<@w1tT9D) z4Dh2n)z8sq{N2c(Yt$lj`}Yx@xcC)M#a8pAy4FDo>n}~>5GGBHR=P5+41NS~aJ{&l zd6+x*?22aG5C1(54<|b!+M~blCmppY)+~&O;;b)5bn{Z|5gNrzHHulv6tjgvdIK*u z?-2<$+bZ}C8riKHzS{Ca0e$7$KaC zq0~FHV)yYEdnb9aN#bOdDON6PiKzaWQkf;Xc%O`~{Ibwkl>1rKT34{fezJtH1nZud z&GZ*j8W0MlL3L2#C!)d1gzzF6cV?3JC?nYYDx4R7k~o+dN=b?L7Fgr3P^gUvh1y7E zYOHaTY+ZrYOwbzbr{yFoXLqZ>s2&pvt#P5y8tO*ZJ)v-! z6bhHgelE|Gr=}#{%Q92cxJ<3h<-Sn3Ob><23_ll{u02zU7VSl|YSWrs2d!g?Sjo=~ zh1UJbw9vtGA3IQMrKF`dW4)g0jq`)4VVT`;*VF-YaWg`3K7Q_4qVVDF^>@S?pW@cO z+i`{t#{`wUf3Y;K@!d^{+^4-ehU?biq2OrDxC&vx(U{SRu-DO;-dKTfQ(@9uh_K*o z%s2-V;G$5fVX<;Gu*N0wt;4`$w@?oc2G;{?TpCIfEenO)ay4!%3EO&R5nri5za52vKGo{{TeqSL&wliy~T zWgIjAey5z5t5Vh&%Hfq!?eNMdcX+jM3jZy@A6-cq*KvRqm_)r^wOHfF+}c&0X7DFL zURQK_;|a`#3BtUHQ=m%0ADs~=K$U_&IwMYiDg}RZ#upJ5{LvYo#oW0&l(Dx*ZS3t; z8+-fwWA9nAy-SDj@Ll>+$GUbu`SoNd$5ckOV=ANkF_qAP_+u)*IpAfgv;(|Myph=44hEyCfnzsDPTQ9 z?z~*6prC`PHyLhMMTg!aIYDZH>`J*X;THtUBwe$q7C0zNhyOu&ZlQOEE zNg3tOqy$!hQz@|8OIbl3pl()5hf%(>7Ji}(97_3?x$-Ab0+qm76sWvSsX$wxZYoL# zQ4%VFvnY7JzTN?zujLP*1S)|es2${)TOG#1z-}E>dL=c}GB7mn-OZ$jI7!0%Mh|g1 z31NDOBRC;6o<>-3LTLN~bK03u=CtqB=CtqCM#c~RIc*2KY#H~_e~+hnw@%=pwo^!( z-F2Nf@olbl-egohZxZUAKXKycw=c+NQ5}<6hSzgYd2RDENnK}7JhQ-w6K0a;9Wj&0 zA2SJ5_=6_tn~&FgsEf-LBI7>FcvXJq6Q3o%W2GW~&sFgDp4l;iWv&PBfcm|?8~+TY zuiQ}XD}+5s+g!TU4DZ=PIu^p)xNmb{5m_*-<0_Vcj)dwkAa2-inA zO$bLJ+*Jr05$+;{>Dg#!KFk_%Hd>a{owM~xOx4lz(G+hS;~y9vbsbCbZLD@Eg{oFK zloATgA4~BqzL+eW-SJ@-{*}}VPW>gZrn*k1MrgvqO#Xu@-mg5q_)Ut(Q9PXj*2JGk ziF+W@`1Cds6+dFDy`<_onWEKY3Y<$}f;QK~tOzeff+>?)r%^sy{DG917HcwuR8Mss zO7WD`j-*WTM^Zjw{HfF_^1oL)cF-`UfLe%C@q5HuRrU}DlPOwxFrm_X=2992k0~4X z>gA5TSyPOEP>taBaFGLp_x+KFpirV;S69WZK_9pH@y!(*Fp0h42OMC@MH%UrK^Ce?(Qj3*qfB$)WK| zQRc;(V17p7Dy^xrKx$$qda8ReL{e#?kxEx1m7z?kn?Py_PwK}INo9scDoc%2wlb+4 zfz(Ex)a?*S<%dS9K#dgKi^((}f0reTH5CcGZeu(V){$J-n$_E_LO5ok-92#3RC^cP zB!A-MLfb>r|mU-;Vygav<~CO9lGjjW^3@(YqtYCU$eY>&lFlDT_LT;ww=3h9er z4DGn$1rru0ev{1=bu3QChr)4!GDnK#Q)~)84Fu2Zq=C#m!Tea$y&)~=CWpdpiZVCW zG*zkoD6jkcys#fIDycu~xBt9e`5o%*$usI;hMs(1(hz2*8n;=p-0*ccH)$|4+s{on zD?mN_O-9eGqfPIxgB{=R=BaU;AH?kn!#%euX%qujani2FnikaAlume8d?INn%fMJs zZO_N1#qyu7tZ50&*>`E@<)mnqc`*2kRqzx(ztMvlwz3!99cjtxpnqjrCJVJ(35wUq zl0dCgfI5-{2g|($Bq&^&T(U@RB_v+KN`mx|0@9ZhsgHmJT`1EdvPh3AA@N#J5~S4% zNLMIQv48}nBNOZp$u!h@C8Wn|HPjOdNcv=Kxs*wL_$KJKZPZux4SonUs>)JfV&!nL zszl(o7X0cu;=%BvFI}}m9+Uhb55K_l=^Zsl#;dKaa~P&#_?~I2makhmla>D$!wD5=^JFLNOqj=GJcXG@R$>5~2UjkIEU$!dGIO6w`1>&zR4#_h zs$2w_UWw_%oKjH<7eMC3O4v^`x2%K*AalJ+`2I25D`6emtgD;}$yDBlzImr|D&(!o zDUg3vPKLZ*33XZ1@0F-e)325HK>k!Y5%OH+1juhI$3wnbITn&s4ud>YNf!_MD+fTn zSlJ))*~*H3_`eO6P_;I#sVs(kxUvsqWo2*3rIo!PhgbH5OsJ%npKexWKz>_^1~Trd zL_-)CRJMZbSqYy}#`sDHWK<=p*V4_2=a$Y+e7adWI$J=-JDWqcaK=H#I$?9cQqS2G z6=ktGn?M?z$ikv^Hb#l>IvYXWbT)+i!wI)j=HHz4A%Awl?UebfGY0ZoC%_D6E74?z z{gr44!@l4IfrU-4kse% zigtc-0;`Fr9Om_zX*!N+b|{@@r|OPujHnzUJboRI2h+#c7){xqh=F8!WsA0w_tY$L zcx`$Ke|nY9W?zzTmn0`>a4;w1Pr3uyzC3xno;gfo{>Q*=`S{Yf$gjgb4SO%_7~Gpj zT~BVv{k!KtJ#J0v{*m0aJ7arMo#CBy%{5jNW_m*|)1=x?s!c~l0C`F|YPHl14tKm_ zTMn1BFS!8#j*)TuBDXT@k9HZwZT~B!5$V^!kj$(P&S>tM41i-93gf*QAxMbC{+|E_WqnS5l*^?cQCc`E7+kyDh zzpUvUg~*$dN9ySskJEm!{06tqnwrS5uO;U)UvY^iQ#x?75!QXNF}!j#_41g&ou$7| z;rA%|JD%(NdUBrbWBeZJ{q3k1Y2&WGmYkyd5N$oe+Xdc37Z@&dfw$1G?^A9~7}9)u z@_Cl|VEwp)3mp7s59faSZC-C~%^;nX`y_I;9S$4Uk<90k-_bEAiFQwNjRpsL+GEKz z;ZPv+{{B?>{h9FlbK&>@gx_BZzrPlKe?zoCCVSwNm^w|Y$36Rd^1z7GmD)7P|^znW?@cFyU^h5hY>FBP7?aObkfs=MV)-dvN>?r?M$x6z&-U`<|%I6u%_kQ zonNcWTxS3M3)sbr*DtTvjBFcj7{lOw9L8PWw0$a>HqsCeiwb)eFNcTW*O|4s^||9u zuBcxBlgB z6&NzS-&fn(($<=|u=Mr0#ap@eMhxx7n&Syfj|BT?6YOxB6C{>0%vY*KR$zlL13FbkW@w|8-P@>?DR{%px~^ht|vnY^oPFnHqR{ z@6gE?x`h*cRqA(eteD)z=bg`tFA8&KHIy!56xQtb&i7Ln7@tey^Cl;IrPhaCs@{QY zQ;}^qwQRdfv+d!pFRTI9j!B)(nt7jmd8BA;>Ql&jTp(|(z|A>wdGi)}I>#`%fxO|b z6V^1s@IU-BOT6^)1<03glgCqOn=Gu=CfUfOND2Cra);iGPld3F-WX(CuDLPhrC#2$ zku^MGZ+S#-FId}!cSi<8>*hj0mB>TY3r_(G=1TrQx{jjrCN{7GZUtC#UkPfN8tN{J zdOnq+;tR;!Umg{PZcw+_kQSp1^r4*Fe3#)K3-3IS8KewFE*$Ry>umVsG7nV)!M?H> zWOx7swvNmro=1mfh_-p>AKV=2zl}Q@W2F(py*NBKihH%l zb(5?5XH{>(H1?!jL{8!z82!SWWxi%kk>kg!a#^}i-_381R!=jY*OBv)T>*yASo2i1VnLfA0EQ_b z;Af8m;9ioswDUU*GhMz#yglR~-oU&g2EnprG{Ae!d#$17c9t%x{Q#s}fVsLbXEmqxs_l*t|q7{|BY{^B3&- zIlCbf-mM1z!optOt}XGo>M~cTK~ABNbbDik8sthTB!7FJx0Jd}6M<@rDspjp8Dys# z@^Xs29LOFu0_2&c9EKzaCj{R?GTHan`Jv z-|FOh7A-!X?Ni=txz4vb+q4yE0K)V(zsf%M!U~pKvt@THp* z8cE{2)noz-YNm8ol!TM>QE9;139LPeSeQ`vN{g`1 z_cGw$ru#*mh|ZycAJZG=Y?g75oQ_={XEt1U23AD=(L`}i*JypUmjD{N-GIjaQ0+yX zZy|9=3jLA<`ek`&uc_FqRvryGpGymP04T4hp}Za`E+p#avK!1_Q9>q9BlNeR|RvRDTfv|&k`$GRLwv9_mWkfeV# zC;grs&F=&8Q#C}qwF9q1*8G_S@pA=4T9HTiihMOtxK9A}r5e;%QmC)JP?(|GvK;xO zO9?JG%b6?|x7(=z-2VV~Mh)&eDctvxlKmhH#XGqnXRdUiu3mnn1M4(U&a0tZ5Tl?o z`pnr-KY;wW{z(amTD4}HwwIJE;x91) z)-3oE6e{{3C2(&==*ds#^X{JPmDzi>+>!sz{xuntfroP2t4^{ z(SyeE)p`pD5MfG4@1_TP3ABj31j4X!Iu?i;`I7zE>M~0%ckOx;CaD+lP*~_#y}67rZ3|AqEKSvLVLl}=Ju@&$FLEKsmr%ilptpqkcE&skiE;mZ6 z&#;y(x-a@J`7kyuO~YEU=@R%k@?uExpuWdrM*aNMMVVV2`lm$l$cr8f{xOaO{{_`YM4RO>?l8GAX*>dm-Pa`^lmo zT=2Gryq%ral-0(I!5fm;ccQR>wUh#Npb{!I@4oPu{}abDNK60&OYGB-C!yri&`%;E zh{Qgg!~l>Ou0(<_`Unm)*-GMmA#E`_(nv|YD|t8cgSL|e9R|>`s-WX2=ttz#v9x53 z-ZGwUpOWpH=i*x!6XK&-dQL;PpMX7{4NK?;-GoSO`yiyx(r6uz0n)unNc0^(NnEdl z-I(#1?-evfp;f74w4c+eG}=TlV(|2I4}ho10SmkJmg!R9ssQjzSzvxsPUq|(1~n0D zR^e3?lirn>qljkHMdI&srGW1R0OzRzb`%4~%6c>Ny6dvc2FLKjYlUjkKo#V0MJX-pev-%H~GTfc_f!1r!46y46~fhk2lF}Tl&Qa zZIT+)gMg}3gK|otY~3EC+IhSiB0V~-n?#R2T7p z9l5?hb8SqTok{;uqua%A3kn~0;aUT^elFe4GB5f{GG!o6LoB;RMWOTaQEn)V0n*Sq za^!M)5$?J~WVB>>ts*aq7xRE0pmn3g>X09^0J>vZEX=twK6GEo75|Eq{z!@8L%+(S}0szSL1S6nadlL z3p6msX5bR-5jhqjDa#1(imU<>Hm>^-9TP#0FVFaZ<))nKK2>kIhF&RXfmkjfEGXPrengm8 zxZ}I`0NwZa%`4q`e=}dh;9d8|)YSa|-Dmh4uXrcKJ&E7E@}2PeZFJs`6sk*Xm%#F| zzs6wRZf6F}+kK*3O`q1TChQ>A-KRefg~=CUCU1ZVi5f^P^GbEZ>HTZVmwq0Hm`>b* zp4CkrhCKdt#!L-!-jDhVmsGytJM!lD895AtO-VKA4I_2wB>l&X z4>inBb>QQg{N;=x%+LO+keO|8uT5qOgl^iO8QIJ)lp)6W4LZiLk*UV3njhnrL!zDvXH&)hb!`s?od!@2z} zyA9+tXS?qs2U>OO5A)zZcE1z8!PI>f9FFnMF09Qlee~hOI%{KuxwWx+-nVZ@y)_2E zdkOKZ2=fYXY22vdZYg?eBp&cuaQwUz$9>#m9-eCORM3aB+(DSvhnu3e;Etc=ZYb4R zqg%J}Q=RYF>KD`s(D_dvVyGJ@!1_!C)KE2s^6;JvF2 zftOXM%!{?^Yc(@9rU8AeikLyHHQdh)%482N?MJ!s8?ZR-d!P<(hETY{z@RW;)gGl* zlPWh{xDd3qJ|-ubo?Thi%5T}KtX23rvxUMdN|_g`VC{j&M$^{(QQVr|YMYseYK!($ z6HIa<4R7oK)dt-qB_Bk`5@8s_S}zoS^_BUt)&{Ee*3eH5ZMwZ%Khzt)H(Xb}#fHMG ziJup5F=!&~F#S$e$*R5kI$1M6A>M2d)~wdRrg64HZ8hdv>&?xo`4(*v3bU4eX0>`6 zI7XExMAHEW1F+Ipw~u6NKS}hqU%S!X#_uiHRcrB~a7$3;##-B{wq|=jug}RTraSI4 zqcE{e8`JM+6@|}b88BHqK$sx=W47xrOr#|UZ`h=ts<##)R4&BGLAXo^cSE?Z5blhy zpw4FPh;WJUylq&RwNof1Pf{y+vTVr(!zI=fTJq1xm$BUwHLNwYj&}^-QM!aesjC{L zG+9c#>hb{An(l85pDj#lMjgCH>geIy(!DJi*4n)edRW|GIOVBv%2(r5Kso(E{x0cm0;j@IIQ0yTQ!h16z12AN5$cIL zGhnU7p>Qe}v}Y_SIH7$~dg^ZjaAXxxS?b7QR|)aq-bz>6BbV6CI-s4uUvgipKQ!!W~yIqU(< zXG4YXY=nmh;rkFCEQIetc#setgYZBhJQVZa*w9KiPOXIF)k-))DB)W|&HD@%)KT;I zhQ@1>8n4M}yru}e5~*nq>(n}Gp6?CQLgO@DjnfP@PBR5gH@oATZdNFi=7dIRt}-RY zdSG^~tpH)v%oF(7dVtUTQ1~nejn6`5KCE?-S`{r8D8*AsOG2T9JG-?N>a7*>3iWhu z*wWu?V1F=<1>h)UdXH!p=MQ7r>`frp3iwLLy)i|T!>M{a9Nk!P_F%<* zT^Ts1JRECv(IWUP1@KUA1*rKHYJ?98X9?DaWuaEdLt&B}mld5tC&>YV3m6{m(O@{z z^RXU}YnYKfB%B>saXD9}P;2FpSnIl4g<2nsBGlh=v{0jbP&h2GZjgoI z;!XvqD->$14+@6_R@iZtf!d`6^&*E|lstO5TFa0=cY3_aGP~ul%w(WGvw?)t&k=Qs|-U=LMe8^^u=>D+w!?b(VepU`8!4jcZ~eN=@MwiryA zu*I<7XN$p}No_F<%i?V@e8uRk2UZq1Cy*YEGGT_{prXpP^^jN{%d2wTCbNcN6t%Po z`)QUH%EOJCj96Q4_3Ic5Dw;W&mqBBSmj-#oaxfW#;Ui_aCH#rj{XyvspN& zu_Z*lpe4rsnP)ZJ<%L1XFDoZ!t+T{=VV?+E}Mb~8M9T&W6Qq6kZb)SW3|MzBJ&3% z-xZX+v0C!DY=fSd)@8P2nHgTyX6yepMmVPn;m;7BCWJph_&yNkAaL2o+c^~ScJ z&7s;uYxPGNE$VzOt@AX_c4Qjd{jB)+-)~_*)zw?%vT&vnc_2{kN%W|QOq2uCyiH#r!KFYko@CvBpqX+h1X2?_1 zOYgzP#Mz*X&dFv(c6>)``hrl?%StycCviV#USOCX72^L&9V{#@Oo`Zs|W|X4ZOHltXnumz}E_6d6e( z^jQ}$T&5^x_balyBFXNme0HQJChIrkv`{H0T;#R>A<5}aaZW9=sPT%2veRpo=sFU@ zousHl|A-UbJGcwOzWM>jEZ_DXwX&dNiMCDFMGdon4o$wxNGj+rWcRNmyZ^-5rGN*s zP&O%ZtNL1Ynw~rRLuP@05}r;*Uw-TnJ?mT~n}*cXWdE(>a;6&cr0HgovH4l6^l$}V zi)D6>mDE^sS}Y=66wA+NcTATPN(LH_9K2>HFM1LW5( z*p9J%R^e)o|2yew2lqk5b~yT z0ptxQt`u3XIbp}f`kQkeA848SV9qpj?B}sABJiu&S)}?TA=}xwT)!S(A zZY+r!D~`INZzo>A_7tbe;3diA&X{`EaFtMs74m#Qj?q* zR!2u%OG!f94G+*f!PD$OW709(RuU5i1^h8LoXEOOZhw|_MNcke(&%jvy*-Wok%lX8 zGqMdov9Y#9nq~|`CY;N1N03XUG%B4vI*D@D+c4>bX%8KMioSmu7S_UF^i9=})PJ%F zOD>I~iRqjK^SgnUhpn@SRyCV_DV%kM`?>&ny$u`CqS)!)*yKu7_HD$B@Wn(Ywsn`p z#Jy>MajTyjLT#Y5$^J&exX9BblcLd%7=pHJNs=6Kk`$hb!3ThmY{Ry$h)RJt_K8Rr zLtOdU6ZNdi=u3lH!PZlf2G^bgq`aRRgR_6uur8A?O%c+-kgN!&M4V z*m!~H2y|X->5Fs&Bq+F@Oqr1@%lV46`eOD+%psDPLxVE@ zQxiTgtQV%HFcQ_7dmkfvOw+{b*c{j!vH5Ztj9jpJDJs>-KrTA+=h|#{xJKu)Q`13x zxLHq@G}GHgZ_&DLRSvyBNX+?o+s^e{1+nyYu|_vROz?T=yF^^QC&>1|^Ji#cxW zrO4NKn<{>5CVSx_dU_K?- zgxSW|VYUcD07JO(C#V z^E1{u7OZ)&CEj><_C?kPSA#Hq!!^q0W^-#A82*6OEgiROZ}t$T`+BBcS1xT|_A2gZ z5jRLut&bC?Dq91KW{LQ&WMXLBe#~&Mk?aD!4R2Q4bXlw!idc<8#;Pa5ng*=dvRHFu zun5ZK#ISDcwdZ1caAUZukq};la6=*d0KyG~@cn3<`XWq&Z5A-+8O+SGmm^aDMZL}! z*_5#@Almn`VSmQ9Q2cZ;(SE@{T_S$ElxWZLPb<7nf6Sg9sdL3rBU{XadwO!Stf>vj zm@C=OGOTTdWXP=y3^{wX&+JTF68~TJn=I3WvW0~w+j0B7lhx}3kmnWmiV zThxiP4@=Un3Z#`_cFzH3Gau$dNcWf|-Du znSwmV!tEclZ!m$&>ETSUu6{}G1=ynbDNk(phTI;K_lJhNvN$J(Xh!DU(2;+Z=a}He zYhoV!+WPV;WXRT4IRz|t;Z9KMnMe(nc30=-Md*D=mxz-p(TK^H(r^c8Jd*d9hRGqf zR_C2JaA#kPc#CX(mIv<;lxAxn&5pds!nw5{=FH(Vd-C#0(a9WY#HKJ`u)9OlR;KXHaIMWplC9b75W}#l^gT81i>yt{FA@Tiz`lxgC`o&T^U?d2ytrBllP&x$tN{ z6!dFqL=m<51N3BYyWG7D(U|fXSYGLnOD(VL74}|quGdfZ0Dl>rlKR!Xv{0|J|{W-bafHg2b8D_`!~gYR{FT#8%kNCm9?9KCN*E>>+D4PEt-H_c(9-`OYUCHA8sc@|Hxg1Cr|KC!V4no zMBgG0JF^C3-Zw0{u$M1Ovx0E``FDuPmaT>a+8BgyR32M;8^Qjti zOc8B6ci~kZ*dv9nMsPE4YFEqJ)tQw~Emn0XlGPn0cefTw+wmE`ZVKh2KYy1LYPfAD z_k6~EdS5{*(Ht&(GJ;#vuBsU~>!$WGS$u8RGf)nGEuX6Gj#A3@6KS?z)SazYBlj~t z+j;WYa(6ElK1h<{n$5*R*R?x>Tx(rLm7Xpa_8@Vss@{fKhu5pdlCl{EFJaoaR=9=M z_jR)7p#ppzX>Jro!9eBi{6l3kb|U7+-9trYM7-#ifUfN&QGXDr!;;%Ig}1|nUJy~l z8aVAAPku|jXA5*1ZEvMi-0k{BEy<@%nkBK-O`C1?c3ehcqX&23i&|*b$4x&|-Kr>> z?Sgt0+zSggHF(qB^^%`ysXjoSA!>jSG46r%PlqK6D2X_LuWO3 zO;zcI-_l+~8+=mBOFz(YM?J!FY|54CZqaCOQ{wBZ`t^Lr_ zORW76Hom6|-@*~X_>;HxQ%%9S!3)wr9( zWLdL?-Zi>*IOP^Kt~8c|P1puf6ID?cK}XT-5TzqAJ4D!5By zF&6W>Kauyp9JF2^Ad7z~^k|s>IP|?Xq}^|Y-)K0^FFm(#%eEZKp^LZ!Fh%el!wvnj za5r-YR)h$~@N$R(hXxW34HYawKMQB&Y?N#c$ z%ido3?kZtl=!M08KsQHFMvUsuaLgl&lj+W+FbNFY0QvM1?H%ZSR^EY}f?lG%BfY?* zqQJvDL9!=>LOofH`Y|bWUcn9!sS)JHB6x0rnWd+)ZaZXkx+eRQ}9N~*l-svZ7q zT~kF*PyShyqPN4-t!oN>n#PT}pFYS%8`kB+lOJ+w9z5+hcnwkk7U_oCc@Lia_<}~< zFscz}FRi1%-T_sY8&95?nh#IAybn)7RnN}*@bnSm6+`U9R##vagh z5$>}yy>Op>sND75dSq17o;$G?8{4~^o%BfQxm80>>-xarNzDVjbL}LjPtPauqzV6I zb?-bo$sONwGoEzepFH0?-%j!t_1uIfrTmkly$kFle_hXwcybT_7D>t;l}MA$71(5$OqhGA?Lbr$Hy_#jXOS$``ozWBfDM=n6Mp zxzP*VxWN@Y*WDO$x*Hc%q9?f118%vt#WH&B(MYnh3l2>$VH*VxaH*;6umREE`H*R@FN4v51iZ;7(xhFc@jpb@I z@-Md@@~WGz5r1{ldHI4{1Nohsh5X9RK%R2bRpf`R3dpxzOCgWC9)x_= zg190!lk?qDs3P*Q$Kgcw9Ib^CE7dIT8+_;M2XzwnCZ0jz8tnV&Ht=x4N zLH^{%wG(@+3w^>~&xJl=x4F;@P5gk9@GpNP8aLZ67b=|Z1~`oo1j5%rr3wEhV3+$rab5V9<+%)P5*8s@>gUgBbUCcIS1H)Ymf1(~~ zcC+V?8rTyW({%54hWpgLCkeMb_QsI2Yl|CTD&0+IET1|AKe6mlm{_LvT8c54i!sQ& zQ2kP$Y&*$5k~D`Q2UhlK2eXR9_`&&MA3Doy?nP&r+5D3WeMZ~KsDpgshxjM|_32>e z%17&x$*2$Tm|04-4(5_Fd+|rnYs-z?*%7)pLAm5elAGavUbW83&7AtMj@%^0;aXDD zzPKZpfq?x^ZQjho4j2z(FSE^`47o*ofz!wdqyGa5bxn_2fjU?wr@G1=(7- z&%x4B^0R!U687=pCD=1Dc(srCO8q6cQc2I@z1IUtD?%bQ&lYdOsrRN8<5=$M>f-R~ z7mA}IxM^+n#)|Zov~l-$ZcB2XE}q12NdvYOk((EbahV!-wRy^~6Guyk|<;vm?gcJ5m@iCUGdaSsD+tzyT(dx6s zn~*UKM9@`_-{ep^K?TBTtUFxDw`;#ckZ%^_LQ~a-;sjFFd)sjSSmZ?sgEBJmnchpmAVO4sT#cqgC--iR*2;sk z(TE=C{uG;y)(1D0&=+4rPh#DX{u1xUJ_6>)=tx;agA$^#Hlj%uQG<6Q8GEGBBA^;1 zsF=B#CDf?esCHRYGU^gvPNM{ozEEOh5$nk#GSOV~rStfP{WH+8Y;*$!P__@P zT$2QpzUdmvg2pO>Zoe8aj&|x+f-af2Nt?=|(pkX4wfWrDkZ#Czz`x=47WDy^{8GHwXA8h$Bw)CV8x1oBGGP6c!1&KJDcHauu?eKrHEz61=*#%LH6kSW<{C9pBI!NvxG@rute z+KFMlPp^87iUHj~0*z&D^aNSxiAvD-)P}xS4jSL6fAb?B_A5nw28-?JDYA%Dl@RZ% zjW{g`F`gt^iua*-jU-_Bn24S!3pPs$Y<6w1IYD3zNNk(pBLHhG0mHXU^gLOx`SM_R zdG^~ibpU;Pq)6T#3xWU>NQbQAy#S1r0OA8Hda*3v5_v#2`oY?zTUr}zFb~#50)|h% z=;g9tE0n-i)&{E#0?Q{oXB5-*aZ?G{GJv^d!8}S}xNZ}?!h1LvOjzN$is>SxnFP@V z#7DWPf(>iQ*0*%yG+eWXV+~mRN8{pbuMKAy`W@8*tH#xI4{MRXwQMZK;3KXfQRN%n z(QvWf&x!Nx9iG?e-Er90PU2?2(Qq=!dZzdorp-r??Rr|e#~HG5XYo{I`?ylEo~T`{ z4Mba2{ADETZZ0XoI^?=Zw$3(lom_iblD1zLpVqL^xL*^fsPBsDQh1BMqNeG{rk{#& zg|USwZ+rAcWxncdo zhK0q26^9ju_2$-gHnbq)bS2Nghw3dwnt)7ZI z0y&ZvkCvQcnGY4SXiwmH7-!{3+Dx~h)%1s1cUPgwen69T5yH?acXt-T-yobSgumRV zbEo)qiQ;sh<8R5r-#$e+NeF+0a3>-BKHB)>07dyW{zQ?nj_lfAGF%U%05DDQA8pGP zr1`EA_+bA`F^#B{w1U2%Nnx1&rIK(B^S@A1Vbg2C;gTv%M89~q~=(ORs)m7 zr`j1hbIVp3tZF@zjs8|(aFQ}O9crrY_#%^&W;!tlm*|t9@6OD zS#;u_qL03bK9MQ(iN6r;A%y=xxVsR(if}g}{2RgHfo}e3*pTrp%En>tGa^<(7`tvkr|+ z3avtl(ozS@q;OF~H{Pexk`BF0mf?z7Hf5P)?!c+YacWsc%4BI!%(4ZGxA(b22PSe! zAJ1*ZefnkNQzYqXYJ!+HuCmX?BJJ9Ul&V8cbn>25A-tHsKu z*sr!HHdM0yT6>G$(Hy<9kI+M#B8){Q-@6+l+)D^IK)9z6#-^yFp$ywbifofuO>$Us z?)sqv0~OjdR+8VKQrbdI6!IH}F^Ngf(Ttz}57i`TG^`^|HZq;^@qV6CIt*i_g;>wf z(Ner*(AU-hG-TmI3+G_I=j!9*x`#7-v1Hd{XRgI$&%zppWfH@g^l#4wT*r zXUgQ0B_UZCNwTg1M112kY62I@Vrwi#B<;=8m-I|I@oJYkIwOY+Ne*H>^v=Me_w(g_;YTp1aNdFs{5=L$%}uK=7z(=yud66 zsR{$B%&em*kOCU?Y~OFg$>ogl30^~5dPe~gz^JN^7ZUUdBuFHU?0rv#!#%x_eJ{i= zmBfY@G9MwtZb4%Y_Qj?L!MO7w%DaCcwtYih-wcwG()VCEGsKsI9w`r!q!=tpQJvQp zH8j*0c_1PWlSGDJFdrE^B3p1kdnNK3xjUfm?>c6fFCEU39it@aMvK#($ZE-umJ|BE zr-vOwq1@QNbBvQD881q*VNPTOiI~&(LO9G33Ms}S#XXV~@ah#Hw~m%%q%ZPBM4lpv zJXI7K*&B)RnZ9SkVHi-z9y@N1>5>#PYNa?xQ;hbdn1&RyMJe>(oNxDd!bkW9C9Z7w+?<*`b&WE-DNgfm> z(L0tZ^7IUWifH3D*`HvaX}m9kCCFg8CNfandv`S+EMF!s zA(K}nnY`xBgj_jZhF9QhU&L1s@eN5ts7uibC09ddD#=!RGj~J&bIR3+o-2qEoSG;t*~B)NRouv;TfO6E9vBHvIo! z;KcD3(f(3)7t5Ttz2+r;E1MV2I^Ko8Ls^Z+^d4F=42w9Erb!Lg{L9FAl6JG~tw`*+^x@K= zhb`#CilB#W%AeHeJYnLedQ#G^oG{G)B>mt^aj(0(u(59av94w=e#FpC5zE3NnFy`M zz|HmdZw7$*-1vP{4#=wTu304GwI?*jA0%&LPAIv98U55*ZgDB!JQbedY zt=0PxFUcaVTY$QnSpL0^JO960fIkE9_h3M;!gjrI9JGhw{vrR5UfIMA8pjnW0Vp+z z2wV#g2-#PNb6lQXKW}`a^jWR_BTEp_eaX_0T&=wVFV-U2xIfcf}*_bFL=ugTWY>Zuk z7cIeasNmsdzND!C#vNrk2HTm%1{Lg$G5;~=m~WU<;9{eL$9vzo-si-0IE7^@>Ki=^ z!ouo@dvNErzQ%()xAkf~xN}?YKM&Tm_5ShT&TYLvJy=H9yXwK6+j^HhSSr`M=)s-a zdKWx6r>^&d2X}7ko%T$F{K|75zKzXJaPCxkEa>r z3QtqWB_76N^;F=Fbxfp(_7sf=bDZOjht9wMcyPzs zaowYbyzD`BRhWZV1PJId*}@Kl?QjM9iMy9rjF0txH#=N<;GWp<5M^8Sl9c| zGa2$-&m_n1g^&Y11(4;Q ze8>_{9%L_1E@Xix2QtT#4X{t#OCUdXFNXZcjdOj+N%um?58dchjt|`ERgU-F=v9uR zZuBb0>u&TR2XUhhIS#pJ()-r?-RMM)-EMRu$MbG%iyA!b&M-acf5DL}cQEy^F|Ea@Yz*%)>JdhmXT=(NBD*JhTG}+kRx#{z zR%;bw!h5>CA3S@<&;iy?0v6Mcg0&ZeF)@BOP;-2M9pq;_5ui;LkdFE!5un7<3$5H_ zF)|yIBAH`T<+vaF_xa)cJK|mA@T&g9j{$J?RfRo7z_Y|;c5&< zh#9akBPGQjC67LB_z&!5{OB59!)hC< zfsX+=wmX$8f07g&hYj=-MVMfxD1l#Oxw&~y*I$1&%f`*>u=lxO>lE(|gLR5VYQ*rG zkC~=MY`T=#3<qW^X*CwL!3{{HAzVnAEqF}@C(sZm%73fLc3 z9u2Fcb>MePG{V;h9+hX{HMREfaM&}Ww;%l`YJw-?hd^MB8iBQ90&EQLt;k>e^=jZ> z_Sa)3YOaR98t5B16d(3T&h-C(w0(Dc6vg|0cCVxmI=NiGqxarLn)DKSs0k#H5Fi8+ zI!afRyIcfB859(-V4)=-85L2meJof|J|FB-#DYpu0Sm(KJ+phc-P_$WzdyeE$}ri? z^SqxaJ3I5t^E~q@Hjjj0E4hc3o*p&I#Ae<;J8ol}=sI-dx1-AN_lFgT><=qQ%f5>` zvfNc>@p)j$LXj@KIH~~1^;F0#P{k@1MY$gqQ8*Eodq*(Jw0sJoXVQo-fC5a-M2{tV$Tk!*(xA72oLXFO^I;uc_N*{gb=&wZj zm3OoS=nZ0_?*#fYvCyAYqd%vb0(Kjre=X9lJB>C29T!R)kG`jY4z0Rz-S?}}OI7G) zM(AwLZ4?W4FL0lag?mViTdu;T`nb1uJ|fa1(?>T%tsBQeKL~WF;*D#4SdIR&3jK%? zI*Wz1VsrzbH;IJ~Q_qy6vCxmH(O*-czix!iqLKBVglJ?Xq(NC(-{~HVaYmVL` z7WxUGe;Nz@Gd23>D)cXm&<~6B@U_v6(ef>0p`QXebos_Z{u?DaCjO%8?d@zfT^Rn( zoza)z_o~fB+PvBr3JF@plHe;y@NFy!&MPGlQ@&Hx|NB_z%{Y4NSm@_~ejyh6Pipj^ zRp`IyqD$ej?ilkms@_HkZYO(wtX2%dsT6qL$=Wl_bB#kYwT* z1nz396hyh$NCfUB{9FqM?#deTt;up-6Zt5247`#z-t&~K%Ap%(j=^cnp9);|{Z<9; znmY#Jm)fa-b;DAz7+uMKLGc%tauq)}RFeFoD~WJZs=h47typ4gXJWLkoETE5u#~@{ zuoDSh3l|Gy_MvIh#k=cRZ6=K z3Wy%Y5IuDu=#hWg)f3=Kb*5h8afxS770>SAd51C2KG8hCeySRM>7RDL3KFwkDrW55 zslPF^0nyCRQ^IYu?4Ndj%j|lq*svKS9RCzsu|-Oi?l|&{cMau*=rkR%zJbc@A6vd>@wJ;5#dIH!B}Gk zSRji@t zwM{l=J;i|a#|qXb$dD9?^#B#?Ot7A6%zB!Fb$P3FI4Ta6tm0hu7HYi1A}pV_jDM? z+h(ds6NMbIKRd~$_H{gjh&pHH@tC+ZC2uX;tccw`vrwC6X~_N~HBY(UAvMzWH76^t z54RG4gf`*|9m|7hE$Bxh5=#W)nVeIPS-&?Es?m|V+SY|}^(NP{vLcg+o0Ub|Y_&X5 zPM7rr6K)=3&b*J1qup_-;OiTEdt`|U)Dm?g|9j1KJMo`#pJnbB{7PAf^D1urE~=N< zL|lcnYnS~ALQVd4V~G{V;V^W#M6Q%2wi0fUk?%e+Na?weOKQDr@@=Zu)$8aEb2x!p zIl?-w-mP1!;-p{NlHTy=Db#iH%L^%BwtL{YhtKhoAvh1Wf z>h{k=UlyvX_qQ-#&$(@_APk_#ZrhK@N*g{&TtrS?O?0vq@*p&PgU)x0ws{QiI{mwE zdb~-r&5tmR8XyXvJJ}y|-57bq-iJXsTF&2t{3toU8u^iOeg*O)xkRK-J z7b2e~=Zi3k7xAW`w??GHvBS2wGNRSBB-xhAo{-a`Js~qVpF1nZN3<=I;b(BN<&`B{ zsqR2{Beu+5B9dMArDuq?Rh8wkM#JUU(39x(yCV$PYxW22xikHBytZo%%HOLgzn7O^ zXHY(%DgPobUu;l56jk05*Qs+CI79AC$kKPSw5-cu2C<#V&d<`@S#3MESk_IF9@N0a z(N^1|cra0Vu#!J`1P>-CY-nv{i*?<2$yL+#Aco91dB|);eyp6oANh1SAH+~vZy^4L zDDi2}H+gj*P`M#-2Rz%RNLj_ZL7zO4&fSn~52bT?go&r_&STMcWot z*&lh?ha+X_fS=P3qu5rRV%wC({@}$P(Uc+>i(3X80sN=wllXn zU01>n#1C&BJeJy%d+Lqmev|8R=30>#Kkoo3^x9&T*I(4P&+iKgb z!*q`!(`ffWGikAI|6#J>;zB#^bue+U!1fX$O!@m%Y`M>yZNCBA32C)WLQDFBf9zn) ziDf#J2Mj1ZW8o)id!D@rlSoguxeEE>k-IvP7QYWqvcAUuBXy^yU1K-fcf#krdr}75 zuKAeX+hBZAJ%~q9w%K!sDb98%g1`p#Qq!uqICAXxtld@mNB(19w&vu?lD28Wkb~KM z5AxeK6E_{}{L#kVwaLbev^?CKF!ZPU*9-TMnh&N;W*;SZZ)EMg>o&6gyLrb%8`Y`Y z3lV75JJ>s|x=6NXCwVuW===rUlaY2#WUS_kwwL&uFF6O=4(pQ3&VfzGvh|P3&foTm zVwuL=^=QXVW6R;6!j@g!W5>@fM>o?K-p^rc>6bC`jw$W4ZLcX9;Hvj70_`$j>_MwA z-GIYUaClS20jB{G-wnw>aopGvtB_~F;SF$jN5$b?H3#OsVnF*gXx~@SexRn!7HIb3 zu|caa(}2Tqa5$mj0F8dM{P!{WXH{_UQ2+g7zee+Y1Y(tay-j6bziTW+&u3)nJLL1n zSGT~T-lnpsx5*au^x~nh@a34TPxdLuR0j1nDB&f~jyD-ufj-%nAUmU~a+wCH?_{=+S!w%<|kPenni zjcK0abuW?bG7dg<3&NCtfbt&|C2YVADDTO2O=W9*eb73)m={K! zbX-)sNT!F$Wn8L7MGsS21A6J^>-=$W&|56glbfy#tBM*QyqMH?G3q5@bex8#R#ni8 zsnwJnA>AhZ$T;{5FAb9QI+H6REFAXl`k2KS%Ct)ttHW#3 zQhhZVlwWb0>IaL4Di)2@ELiXUg~mdRq0BC{%`W%*xSPFsW_3#gP&QRjHd9kd&Sg&v zLIOEvO6)_-$J;d%1Bi)nyxmM|YR4_{0h63>hdi!C=g(Vju>=q%mtSu^DZ_7RvCSNa z3pY;_V78P$c(HxKQd>nnV(jx9`*v&Q3ubBpZ?JG21>66JD_Ck9YOXOJu3)KcC0DT0 z%ti5*_PE11nI@d-iafj_)Wdf0dT;&^J#O2f@P7aq>6 zB9h^KlM=0|J<(8BxuI@H-XiC_pk2CCb1%-Khs1(Aq^0&!^-ynR4~-o!TE)~psseqL z1*VS2CG&ys)$ysYK~IIMPkZ>vuA@4fSw|SCI`T_}<)`Eow09;>c2Wl`jtsN{^RlcffMm1YFweGW1;7D&oufJ_ERZY+@LN)WVJ z-GND|tk)N@+E~byJCYi)h4bz7`mxMp5st!oZgPBZ&~q&rVh#}VV#W4|B>$v;D)HZGkZeZeN{TG2q~Sk-At9id}w1r=;Lh z2J1E4`PJ*!Vt5p$!hBMO$`h*Ma+sOab zy)wo?UX7o{~ZRo|dQ&L1>gPJqU z7-i0^Z646?@ICdLinQs92`}PG>ic|M3L;N>tl|7soT_WFicd`>MJjkVsev?7ewLjR%`U1>SS|c+uV_Z%r74ZtFTF`c>Km z@Vx}%V-dac+X?INQQt@Kmg2V`_;35!Rvyunf1dCb{#F_Rt3zQe`f)rtJ8}vi3YPM} zCfvklXAc-2j8&WG)wMaKs!e$WK;eg4{zl-8NYDIrhk!cF)YRbsAYY6H`H~tE284xZXc zIr^9Bcx1MF1(0vXf_zI22_r!TsrM_LG4Oq#p$)Aw3?Li1h6M&hhMT1h77^9}SE{`f^|_(iZ|aIAd` zj&yqfyVBH$12&|a0x3vK0&Ht`UjVi+sjCCEklqzQC#Eh8pc7N)23RK+2Ji)S%nB?- zniE)nbaG%m((!?LNJj;VkPZzLuEan619Oq~3c#Jxaa*7OX@|gUq^$z^NSg$(zHrnF z%tY!A%s^@j0sQ(LR&3q?%c7Y_q-sl%X{%gHl_wrmC!2Qw^+HC8vQ`Mp;myrX1!RU<}Px z8I0O&HC1J{nyPQMTFzWk$d|8-N)lRmi@g{mMz#Hyw%+jI} z%&S=`f=LO35U5HkQ%e^1U`iuX1=NOV+~Y6nmPpU-M2##0kP>1cB`T3bdxZrlM^PG( zDo~_5zFSRdfG&D53vU_bQ9Ja4`aQ(zQ(cK7*i|;797$;+szPcl($@Va9R$(|hJ;xi z_f*9|N>L+4S%DrEHkHooMlN43hM#+!U1#4lPAG>ArQ-bz>d$I9STU}db^a; zi1rEtP+n)H{ih0@)p-%>Yzf42AF$(tZ1?M-Gab^_y~&AIEUrWpsvD8wkdO@P6O3N-9qRey92+!D`34!44Itw*E{4GO4y`ZybR>AXF1p#VOFa zfhOA^55NYQOVBii1S(I03JI{fvA2kpKo0M-cT&74+FM2>P*=W{s`9P%q1{i;w}^o@ z%%)bpA+*Ne+u9}C+wL(3RNe&@60tQ|yGq!J+S|vl6Sa4s*a0DIf8;9Ou;r?~W3-*9 zXz#?T5^cFk51pEnW)|)6&)43eV()5jwSxUN#!GcOjJ;dM9R(*W^yV*<3QS_4oor@& zBCEBf`<~=LTXxw%V`}uozVzAD$@u(jT-^e9=~=L1EjWYL-dYr2v8sjYDe}i zE!8oYZAZV4&v2nd`WhO^+50JUw#-nr+?HX+1?XKeaU|28a6{R~&J3Ka+1c`apfRIC zQH+=kA`B#pg)Ks{u7PBeOoZ#|AVElWlJ)_B7-|dwoo>ZR95?EfAYhBDYc5;M#Oxl+ z)(`PZc8?seqY7{c07n=Dj?@8E8qaPM?xiOdXF5fplZx$dupMK}Ha&`M`L!%uX!yYw zJF~=q9Q@p#wIv}S2S2xGA}9%YxC7*a z?EM{Rt6!!e9{iNbl4o;rdc9Xh6`)S799cDcj%;_96Q{;6pbmz4!18tUXC4ZpO3s8JKSD~d{4>h#a@7X4>>;zc{zf;Jr8*~g1vnj zx?l#Y-QV<)5PU>B>@B**Vg@-wqfL`n`{ z<-l0Y(XisCZT7hlF6>+jrfmfoFm1CJ8I+%=DZiALUtmyvp{D#sUVgDb`6Zh2kMi<& z8kE0FQ~p_Aez`&U6*}b~G?TsG&3lV|hw}v3O$D&*fHAP!8!#D`y~xV}?Cp0WF9)!l9U~k7p+rHXB<~6!9ZybRe z!M~fwuW!f|MEgAk)N7-tEm(l`g$P<>K{ihAGvKl=iVN*|DB~Cl1a1!+P+*P^2ZfhM z)|(mkm?e?%dAbWCm#B=5va@j&!2J;_I^d7==_a8rIZ@>4O25y`hQY)JEyYGPMZSq1 z$jcsS7B*>%KBz7VV?X<5MJclD$MpZ1wr<_Jv3DxnJT<#O5QviE=X7{=J#=h$2MPlO#*F@@L9U31VP` zd>Gv=+i!UsBWQT!_k`_R%z)|a)0fav< zC1>^~;5+7V*J0LB7>^I3GagY?hwkDnx)qT{Gj5`)k81z+n6i4@tkJ$hRjPpX$xcNn zwH+ed1Z!O=4M)}=ND3EZzb~$YYr(@i@7#Pk(M*pl%*L`E} z+4XG>?_^K;y=k2VQk%G1l3oYPCX)>lytTP|$>wcIRRI={{-GK;QqV)>f+~7Q*qM0_| zyQ@BRy|w>)f!27p^9JsoIKBK@4nj6#X%Nk?4AkWjepMlN6fXi^H>j^q=5ec#u4Qlt z3|>+&h_@exM3&VD>-POypytQ2zmJ4nx4($OuS5zbB*#Hp8fSl1NiixD6ydPz_9OW7 zYY_^__qtL(9)EmlCZdV+*z2hRG396eZM7c**;^{I|7ghOF|u&zb^Dv3cvnGTwL^Jm z5QO}mOc+dsBe2`w0p$k@O40tI0;^oIrrDhNu}KQSo+u&+8)9Z!Sk2$Z&&Mj-Pqefj zXM;9FYI@87Z7425cofz&B)htBqI|@(izaf>G&O~q#!S0v5_;1=$4$G5+fNgxCX3XR zF-^edBYodknl*OwLbT6A%x|)0cAA?YmaLt+KFEaX@@C$&%VEZ|WyW(Aj2Bdb z@#HAR-*Lt(BaH81jEB)b?^7@iP5abJPCu9MnXar;!Yrk@xAX>?_G?(oZH(J(^v~@I zZcoPKmZj!KZtS0?t3qO%eACoA!X@Pn+uEB?AM_@jHh{loL%59s+sP43HtnS@fM(Fp zM!}q|#%D9bFZlUAdYjK8940Y8Q2W)01TP7~r}XBBVQ{*E8_d|R$H1Ga#rq9R|1!q= zJAwxz7CR{$YW{}RZeJMgA6>WuOTIE;;BCBRu2;_VsOD)}}S6Pc&jmdd=z}q%6**~{8(m* zl1H!4oLof|9f>hS$PJ575u(|Fm)?UsnwGFAulZ;oN=`fwcBMk;aSK$vpN zkJPV^66eLJ`lJEJF!<%uxhc5NM*)aI90`6YgO1Y&m7;HcJ;j8RrxUD)pb&FRRMbdy zl*W)?C8?}hhN=lO^-&~4l511UK>3lOOaMw&EEJeYDpBNMmU3MTf>|bKv3En54*pZX ze|jwbd20T0yh@qBLA*-ol&%p!rE@TpT%gR3g#xQcWi95Y+G?(TTP0_)c&I(HSdX-2 zDEUB{7YhZpkr5QZ!9q>S6)^}kDOF@FugD+izT^*4wQDS>~GRW6doOQz>1JcI)-TybJ7#d=7wxe`Y_ z4ie*t2U8iMNwUUC&^zLBJRE(*BRU>owTV9KA~#mg98&(}G|?V=!^|d;lz!}F%m1Nr? z*^|_KBMVLwj;9Wpv!U&BJk8XSztQUn**H&dJfo{_Qs{D|+me$V&sCf!tR@??lCIEO zb+U1q;MiR`22~t;!wgo@GgU#4&BAezyl@w`Pv$BSg+@Vq&eay+ugjSR=%pjpoEM{9D2ReqZ?zjT`) zJggGQxc*6_O>qu|D=Iq@!pTE5TGmd}n4*KKs{%I9=HN_7;ZG`ShI?n@%)udfjVg~j zcyWdQs9Zda7eB&GWEapS8OwhXNw2jTk5M6Oxyg*{H1gww7lc7^pU361B9qKpEWs+W znl(PhZ+R2HC$ZnTs&JIm@fxb1$g7{^c=f?9!31;MGYb$J#yy4lrZ30sAC8yNC`WZ` zLrpiP-!9Oe6Sz#Tt2CX5axz6?O33R=2jpZ!+w6Et^=IbgO~g8R$H?VJT-ykyfPVDJ zqHK5!J5;`;j&~LBR{4tT3-RQ_&OBW6(=}W2geCBVZBHlOoBbq2eH)@G-ANN1A22=I zngm+2%l>OZ`Td}$7s~QdM9Xm$Rr-y_J3eMbnUd~1fnItv`)?o}%Y*ImF843cEZv<~ z-SQD=6z-z3uFmnlFyVEfd>=hN+uA_Ag58#HkGXVl3=I8te@zg1vkhg)|l+im`CjBVy2`kC5M(vLv9<+xmaG7q=l^(KFQkvD;TD|_(0D?EkS z)#CIz+oe;}={y`c@EH3FrKLEFDJ_4>V@k``xzL7Q&STn8^5<`P6NtOfkQyZT&TJl? zr4H9{%m<@C@(fgsKY*DzHM|?mN?^fB zYWB6LV$nLA=|jH}I0sY6uczD+Ex}lU=bbQ?ceacr0nEkvReesN`<~4mBZ|(}(rYbu zY?~e2W@5)VuJ(B4cV-ft_5>$tuXK_)TH20<4htUwQ>vy(~ zB}NBjLx|3fDls}mi6Og%N_MV;r&-`t(r{*!GmaB32F|XrAYl;}>2%TAO$B+oKBTm1 zn>vkI@phjH!_6*0LGV4TnvVJDu^#TFM(M3WxkDdCs@R>V7(JWLPcPFv&7TAEibgtwJB8kG^3VBDDu&MTmEf04_r88RL#u<4#cFPBg+jFVgeRP4fv) zn_JWt#9$LYQ3?4mOTFNOWfGF$ZIXlXs4VkeQX(o;oKRZ%;+%6hkvi zXO?Db>V#TLZ)^I?q?YvT>(l&Z(K)R$66M5_DA!n`=@k+kq-Fn|Hd4eq8Fm#W8hgl! z4YPBm;l9>6OR?JI`&vY!w8irac7-2>)552)HDvaNt%Y}J_Kc)@LPc=SMDm|6cEXMR zXdWyln<{s#&Kc;M0%OcMI+#K{wOq@3TVUoD$DT-ND=kW!so26n$XP_Hb=Y4>T7(um z*p6Zs>2)!o3Cpcw@rRrUDzu6&+&trcL72CxwBz0MzAZBrSy(VsA)Wx>PP*)|8S8{( zOI*`9;k>X&h>zPsYV@@@NKy8zIhN(vDYcR|iq1QcZz<;&Bj1AM+mq5N<^=MB$K5K? zxnNs-5Z2=_kd0RpyRgugpE4r{XCZzTvdz>Pdj9k@k4bbcs?6RN=1I;aGTG0ZY-wf5 z?qXz62K+G%$^hrG%8?~ISA_TSaTUsd94G^vD=W)jHD_QFOcI0l=x6?%reF|d(Y1`e z-XN!YJWS7uh0bz|ZbplClJlF8@5u8>&JA0-1Q9p8lH z+g94|j>w+nx7>r@+eCh^z6$NXR+g-Hlw?t%>$qe+<3(pw=sIX6`sF~a;Z%gKW4Zu2 zMwwO@;Eal82L>ZK14S&m*bMHEY`* zw`?O9m+tVBqeJ%JPFi1fH731QCGmj52ibg(Wr}k?pyslYzEzlWJF5I(1dyyEZb-bA zOZz(-iGvk)|D*{(+7h8;bv0C+I3LllYMBlF%f3xH zV?^gx4Hp=G)@HA`FRI;r7E}=dSGr{9;B(Slq4ID(i!pJ#^1&`V=%#$|1V)r(Z@f8s zmPL@vjmcb=m&}bt=fj%|XPqa7H9g6sSNql7naMAlcf|#>xMf7s?8ZClb^Pt9Ojlh7<^OB^ zM10Vw>=vmkG%U{NR2r6JIfw`7RO;>qypi)FA0c}c<~3I5KJ3rUw5+4&4?(ggJDLZ3 zG9Fi1Yft9fgArCn&Xn%?h^*Rnuov5q3c|q}ca-rEZnulh1Jryv$CP9Z_B6-QQOw4x zIXQY_Rt-|4iMIi5)5^0E^QyBHYz`^J5S`_UiGTCF#CRJ2YtA|7H+cMHmBp9yc@V#- zB7R9hTrTD^y$BDKtfqSbbVnj|vi`>T3L1bbexSd3DGyPB?qKQ;gp6`R_2oPkA*dSf zd`(fd9>?h;6|Uwy%FLG}Z)W#Nn*2w;Nm$t~)Fv*@>j*VL8W-}%#d*FD*^zz_s)6)S z2%iMcwh-t%cNZ@~I;$8T2+zo3d?Y%S zyBJsf^f-o?G4UH`g9ONxON8TBHbE<7q07}U;)zgL40Ig#X%fex$X!f!7)f11aT7S@&-pCwFgHc ztrbN5T*<-VNUgzPNaKPy7j^y>9E$Y!;1Hx2gKWwBLvRq%vq7|k^UEO4Xr2EH_DA|r zupiQQgKSa$daw`DSA%z;DV&FcI52k7AR5hiFxV66{vg{ZYzuZrdUp`cD$e=A)=1|D zn<32)Hbpuq*aT^Mup!dn!3IbN1z~I8>=Ueq#(%uH4blgSQN|rA#&h?*#q9aw;<`wS zieUxe&M$Vuo7kOO?7}Zoim|754=8pZ?Oa?7Y1`teNShZYBW+k*1*xw%38|wv5ozt> z1b}r9f}OK-(2ulj(1)~n(2KNT5CBeJ(2dj)1b=7kAltK74T8TjK8O+K6oRk=S?TyY zXoC*vYA^-qr63dujvs@y0dTmu3-afJ5as{E1`qi&^Ts>0ec>j?je zY!g(fLg(9vsLaAawq+`+>NMLv^Klavn7S5YOj&5|8&*nH7!^6+L<=0(+oXii-&dih zajP}FK5@>mQs6HpF-kIHieNvk#TfxBPn&S^py5)q%tAHnc?2xP;NyDW(JBPmRu z&99n7&9i6XmXE<|M&t&~SL*dD^iZtPz+H5zU7DRx`?9bX6#QY0=G6CTKCpzEDBYgh z97?DmYC!gqLnrSv^lxUW5$@j{Ry_$$jeoN<+P_&+Ke?=yAZ+CoR;&auJ_d(XO;-VH z=r9|cq z7{Iz>dRe;+ysTM6kuQhcn_%wTv}qjKxY$yUWL-Czb?=JhLXV6kG`?vrr{08L(VJ># zY{b9kuddvb2F}=0Z`!7_@eG#*%P;OLU2qha4eBr8Yk@V{quahv{ZtN zF4^^Z(}tpj)G~JZKZ58o@V}NCz{VROJ(dj3Aw#>E-QQj<0~G0zfJLs3`frj1|M)Yk z{l~_FZwvS?G2y$a;h|Jlz;`o(XQvm7ruV@Hc2Y$BX>|>UK6Ik;!5}=CpnT8=55`9x zB)YmoV~U%Pj7Kn*!LG{qY`bFlY`bFnY`c0_=qMM_1%c`Jix`Q#qOwb zrD+8krZ3PhlWDA3yf1} zWv^wel+>|SK{yX}EW`Oih=*1+L!(u7v90CA%HvE@;C#N*K^)hzrW@&gnE_3#t^4;T=`nbG^ zw$0*#<9U#5C@r03b;0jEm@BDrUGO^(%6B-p3eoD*BCT#I!0))nfrmCmuT*Dhh&dYR z-H?We&lenHI_947RD8Lh5scD0=6w!L+|hyt0$J60{~EGmtJh0c4JI&HJ3TqSu7!$k z^K!j;x#Ka)oh%q{VmqY)Or1)EPYd>w(jDm=Y47yBV^9E|F8GHOPEC87!nu~2JAGTw zj}FMngRaiCJfc;S)le>IY{F`&U32oR(jmtTSrz4CDxB2>j-U^-3la`9)Ez)|(b}8y zE(!6jH4*CaN0<_8W|(pnDA&fIyjMXPWRyHmKEE$T_N!x_qgK~F;1f`ZeH4_gpo084 zMxGxAUWdPyXbJ9D5O8%H50%eVjUyyKJ_!$MG1tbJA61yPDvqXIo7fx?zK7fOp#Dcy zUZCgU8uo%%-@^?+Co$2tsL>x*p+6D}-8KX0b7G-y20F}D^$%J3n(8q%`gRri4t;cK zZ`5jr)nuL<3w;~VpD;r2JOjJ4CmH(hf{;Rcd&^#p7}bcbr&NOM(icRzt}Bcs$>WgZ z*_e_%CrLv8=sF__Q`>G8{GQnG{_tt@{K!(t>Uth)r+JYFiLQNEI~B!}@)=0EzcL@* z(pVqfGMx|a(wTfIa6tRvJ;*AmZwQ@XnIh0BOJ}gD{!nGaDvu==H5TgytynMWi^UJY zrS-sJ!?R!4%L*+%KX1mzS$nk1ufM%zxpm7zR!{KOlWs8NW{L}l!f4y|5_;v;$}b9z zh8G3P!mCqemH49d?H zl-C$#_>KtIr=a{Q2IbcZO6yEehVP4TeF@4ldJ_{<6|Nj#TXda`OwiD8x2n)EyUwvO z71l6!fL2pePjSWf`Lezo(l=_!#=14-?(y2tT%+=*EJ{+}d>Ij-N57-@=Z(ZfR0W9hTM@EaM|A*<{*GF#R5Pi@e&i ztT*j7V*lJ&GpRdKZxDrFV>h(E;WZ{+;}#XKvAc@qHFhWKkEv%C;E)Oj?-5lz%$;AF z`MqFuqwn0+W8&8^!mp{tuN4CyejO3~6l(u?=6Ara2KLXTu1Rn7;F3g0BtsCc&Zlz(f>cEA~qHcwWa}@l}O9^Ut19N8%pA-ep zEaRUvLY7*TBX3!iSzCn>5zyN5(2S6jh>l!{+ya3$tS-L?(^&NA! z<^zz9x}8Hu+d#|4#~d2bR&}6T09x1BxdK{Y?W~6GC_|6o(E4`I2bP%4#Jp!(J+Zi! zq)~A9#zb0E&i6pR2G5Ibgc)2pw;<8oWskYInvSfZyWQq53!$~indN~(;dJ41^t5$7 zE)P82wXKcfR`NSyOfW?Jq3|3%U&u*+F5G@F&!Wlzo;iMsfUhSFir%z8eah)q}xOL+}j6e${oiXDnt2+V$L zzDRK0gPA-vDL<2lU5a);Q2R~8FAf!Zak8)SPeResmlb}47R}7xh*ln2%v8M&lVeQ972YJw zi6)s;@6j(Y{5np=JCSXKe`*#c#HmL3(^U95G4Q#QN!atIVkXD}be<73pNnT0LC;h{ z&(ei{Ui;{GQZ=-Ggt9}{|k z5?VC}_rAYuIOf27HvKNrMV2O_f%zN7;=1y?vtmnpv7b5i4km@W3;n`fWaEIsISETJ z|8O@IjfC?c;ZpXZ!)$nHKFo&QmAzHk&2N>SKr_eZKLs*=t8`1+HY5K;yy(_m9nIb! z(XF^Onyt`I)5bINzrd@pCT1hut!yO4j>mnEs(;oRv{Gl0c3zXe8#7WptKUo7=yq%}G0|L2GcXbs~nwLLHbVph8HWO&k5eOo>AJtjrvoWcR z*N8ERxOO9Us|&Ty(7QB(vUko)MNAM?{d8WqHmVf~Wth!>07$RDXgWMlQBIhF(X zZgC5L#GAa9-_GjZj|be$zdk8xxvnN@ojJRs)eU$3Vs7w1)9Qx1esOd8t=@%vGdT|n z;^L-qemh3blTq?XO)a_=_gu3#Z8EvsqwHSVT$p_dO~L*6Rj%mL>#6YQuOK>3i>l6M z?T28G2)C>BB$tR3mcSK6FVQKE*-wCIuZC#kY}V*ep8Krj8gi5ej9no4Z-S$_OG~u+_!L_FK#dAUqxQ_LvX*0 zd|UbX3+VqNY6<`K9r=m9Bd=)1Z(I0)RnU6lkDPtKNM4>hyT9l@WF7RDj9VGj`Fw6f`K5+Zdhx%~67aG5 zjY0X-+VbyU6eYROO6T5jPmt_K(z4jDr=u!zd&M|Br{!>lkHhl@kl$$uECp=J{6RzT zRsIT5=tcJ4RXA4oQA<{nll`P2lbYh^2mzaE2h)x2fjrAKmtn;L==-b%M31gzI)($b8AQSqWj&@b;1 zBjv*Y3mJgNY(QX96JP-YH7XV`-3y)Z!U)!n^84;_pks$i9qX|nKTOWoMm|l>*Fb)# zoUe-f5ILWO{9rjBkNhAxZ-N&|f`Md-5y@E9rwjf~LhaXSQ6{fX6$7edHPug~-SV=5 z^v=wJb!dcY21L~(M6A`CV%Pm>0e0PMk(+0aazJysMw zbqx5WMDwFX&+=-fY6$q-?6F4^Se|8HFH)11wbB{I61r2v?5q4WA}Jj(dz9#LML4qN z{)RR>R`4a7z@s6OB=Bm=zhCgV6&{m8v3NY|Uf62!&@-&Q;55H1ZdEYeF5G>!0na$J0h@hEzhA2Vl|N%Zv9 z7Mn1K&D;GoeEEmLGay31Uf1b#Z_b=_d>959lpm}qU&zbjm5SP!N&M3y<)tB3B|O8$ zC7VdiJ#8HuM^rbQX@(nc9TCly7A>E%UY<2(u&xWg#yRNAyvPHKCmRo#Jsu)3u_df$ zGJcnh@;sA}myPl~Yk+3l~|J=+dHQx zyGO(`H5P|y(Hx*D;g!f$Q)wm$ES<-2EeXV!uE%7SiCn&zxQnhnHfJ>|FJ085)Er3P zAH|(L>;=I0>c4Zs-=9LcpAj6PcrMG=C;R&r)+9%_4DD$3AWTB>9JvI-Bor6O`31<& zmh(l(=gavy$j_4V`N+>?d1;(h^T55-GyC5+2g2N?B6<3oIg>IpGjrau zCVA%m3m4ev{5S_TI-WuU2J`-f0p>sE|4yE|J_i%?d;=~E|AmXDLnDf`r+#9L6`>{56^??nvGko* zgr8v1ARu6GK7150D8ikR%XZ)%9)dzOek1}#xCu2uRJ@4_gs6BE*Tl6@qjVD}WU0Xu>}7;Vsa@xmZDkuw&<6Ii?R@Dd(9Mc!iv2THxh! zo@s%X$$6#)#@P<1-GTg_a{f`|m&*BvF}5Dlj4i1e+oOjSEn3T8nVnGt1mP#3?k<@N zHL2(E2o=BwINRp3@>=z?R6a`mJe`0)4qK(&uU7pm5k;w= zbLj5p=Z*u2R`V>CS7@H)N=U0Ht>RfKuTVTo9oR0ihfVSv{FfI2GyZ?)vKe2Ym}YG7 z$@pyUFpPi%xwoJP4oSgetsdxsL%7d_Pb+8Hv;t*tNH*Z|Kp7m84Y)i|28Xx-S2t4n z;;L3w&x?2<2mJMvBQJ37)jS6<7U;i-8tbdTKQ~b!X63J*=y@q>%!J?K!;#@a<*D^5 zA7oKFYyPgR7RmnK=8hIUI=X3zN~@giJ@;ObJU@KyFwvu53u^_n%zJiH_!}+s<5Znt$&Psl9I=V zc)%n1b|&r4u;GYE1fGu!I{ieX)7d!JOst=1=&lwr1xB|*C@@Z{iKisog4sw)o4DM_ zD<^uQ71rV5rl*tU?X1;FOYN+uisl4bRWu(0$HPNFM>7FOlIBo^Y1)Hqk1u*A}v6 zs*VC%BG78E70VeNHMT^hRa>tuWQ+Cfg;-N-bl2E7bK$g_X^Cn-qta1NOH^9*v_irt z9W^wwM2~s zd8Klq5Gxh0HA2N^A*?+3O2w;HR9|HS!5gKh&ZT=!7mke=y;>EuR6a^YJzdOQMQWaM zzb31;y;?1`M5oYFbGdM{ZyC9=FY#EIP^+z$2o>6Dxk7v?<<)AVrSb}GG%Fuo6(Kr% zw5~`huTVzI{OeRq4wC7J)e9YOs4?p;`JMJc#~b1%BjE>7^oANLOF+#VYQP>~HL@AXkR_gq) z!fT*f_UfpXM;5X1sZ}j=O|e%;wY-)S7^s%LI;!PNPM}pSOBGS5mU-VF+C2{oVy{-Q zEEQKMmgS++X5NH&V%{?JUh+`RowF_d&_S(vXNg{@a&zyTV}bfM#O+tmuTbBHxYbGr zvTR;aN2?b)+)#5?K0GWs;Q_Z_;Sb`;e@@SBW%ahlQ`wTmizr#%4w`;UD`5NJ>$69Q z-j0#Zr1DylPiEfE8Y-^A_jb_|NX@LLQD(zMN0}@UXqCyoOk=b9)}l<&t57D(jkm3c zHFmTvnaxg@sdrb=w}RQ*JMNE7MRz+ee)bUaJWR(9B+c{}L!0lMjxlqxDgFL~3<)DTHcIZIQ1JfF{I8(oaG($GJdM|?cfPLI>aC>-HA(g75^md^ zVOdNUFPK-1h0a2%xQyAmNa3-%`L)D_e`V{s3)rF!4TtG7k}9^H>(na?QL1 zVe{cVE69dRJ?GI|o0k5JD4VjcymtY*W2uVuood$QBzvpNMGhpbFRB!4`cv6mbwtY& z@KwYbs49AKOIPFyk=GLA%}la$CNb12EXy*`tk$!3We$d|?@AHYM2ubGU+9J1Z^W<9 zdyj#M>jaTbcw}AxLFmui6%~Zu3;nA1zF3Is)QB+jRUig+5zE_D-*2M(>)+8{BxnE8 zK;8?;5(Zf=(3eik8;GHEKLZH}@Ic$x{oZV{<8W!#!QpcbqK2^UmGSBc^uXuyM&Q{7 ziW?B07U=G;=5KU}bSL*TzDR+S!9SLvY&2t<a|=J-J%Zw{$YaZ{Y7u~s%6H&#m!k^M>f`JTe)2_zmlHW zSlvlC9IM5Ux3Owv3p6*a)_jXOsb$L~`sJ)zR&-lGsfNGOU&hv|i5hMJ#C8sG=;nNe zutSZoGYWwKp$~=4OKZS99)_tpe>>D`1LgVbxl(gz0Lx?RF|uhZ(fcGhow>}#TDAiB zG2lK`nb~1i#q4mDeDm9bb*X<_!f`n5Y#cI0^ggXSPcUzL?=#v7;#t-^8gKiG38K8k ze1s|T?yihfdtyn2$h}*Sw!d^ zzQanl_uE&8-J9$^K&N>3?i9#J_w8XJviGJ?G>sihd2E4u*fldV=;fwMYKy}2WJ;sG zO=+7En@?HDkx7<5Rn~|q^rQOdnZfznQPVVXGc+Gx z);G5#hla}e*Y+fbhJ;(-Wym03hea=!?#UGBjR)pi@zyESnQSSLL`Ob2zYJeH*_&To zSfRp{3-92Cl^0}Lz08Z>e6Xw|+@;j90?Iq|JZz$e53=_yG%P&1zYWopS7eFa50oE- zSLP?>Pe?)Z`=7{_D~Tg%*75m|qsk{4!LRh%$@$5c zJN`?G1}1fI+_Kp|r|^ z_P`z!rbgTVFWmff>+r3T+O`0pszd2vy0f6ub?tA4kWcsd&x&5zwVz~NHYL;HK|lLC zsr>uB7j!=z2bOFU>Be>o;DvW~?{faBs!QGTs^Iz^?{`2obmZ^0ppNKOJMw!~j{IH& zNB%GGV)uBxxx5PtJ8GuBVGD4XocCv78F=m6;@e>;Bl0M?8JSW699TLoB0A5glr=<@~a)}nNV zQUfTdu~6(v6v4-hwO9=nAS5vFB&QM57b5-Q*9GxFDqu)ZsQEku%eA?5{vQk0n?#?N zV7XR8H{MuKgx`EB`Tgwj?LD;Ays%xOB{YS(tc3&Zx=HE6{!Pe74<9g7+$^;XR@)w* zmHe`OTTQDE2AjV6vFg)6Ss&4d+uGTPm+R6_VmYZLa8OTqg6 z$7u4)?L=W^U0X@7xVXACN_rwqD(QjLT!J9+{+lJYBmJYK8`57(ZbSN0Nmr!jOAs~F z|4m6Jq@R_*4$}WgNe86wm$XOvpAyVx{$nKw4(iV>L6mlXc8L>dW(lIj`X`jwk*1d* zO1pn}3Hsl^a!^SM{^?VKs0jYPUSh2;AUzlps{E zzjjG7(yAp@kj9tb#qbLym_&VlmtZyIyIO)k!@f%;R-`|cpwhl`CG2hesssk%zRyZ9 z-}yc)K`dn7J1avg@Xza^s_(wge59*G z^N`*ZDnhy>RETszXfD#i&>W<*Lj_1@gk~e19Lh&JJ~RXA&=9P-d>ul$NLz-Wi|{oL zt<1tdbwg8-xi3jP-5;wp;42?wkUI-?S-eaLO zq=!R;ksb;SLi$8#Aks%e{g9GSU!)sDeUKK1?m)UW)Ek!tcvprn0KIpGFaW)aLl}VG zoDds;hfCTZKP1!z>Hoo%623MpT0d=g(ey=Buzt4VXY+Sk^;_9a^;Whwek*C;+ZJM* z63UhKcfQ`(-{tVU#n%maBJ53=CHgv&)9pl3x9-Qe=Hj$kkS*g%p~jT zQXBj14>b}I%Bf5A((Hw`QTIEd{Jy0M{d=bkVOD%YqPKi>z#|JAn20%L zWlM7ObxRMcFAaOV>1@wApAPRdV83AX4M0N9Jx?CpdsijHY0Z~Nc3)Iy_-i*6KY z-=F#J!sXa4&5-xIKFqbgiMoK3^Z`X5;%J1sfub82Sf&Bk*@bM=ozM29P08t(+V-;g zrb4GJ8w&fTpjT#wCBc`$mqpD#EW~~2zHBmbgR3X)^Yg-2TxM5YC@H$Q2)Akzv zoP+!6+Ty-+-*f`4OCj0w`|zry+UNJ*z}Ud0I!)&T5tb)$-KZ$L~;Q>8|m@4w1|-F;x`~Dv8_7>W{`64RP3vaUWZ0WH`RerIue5Xb1((nJW zl5FvECs{StJCRQAwP<~!7%HNd1}&;CT766Lr{zWq)8UKih`trdZy?^7E4fLd*c;Og z3*MT6M88^|7Va-A2%-gv6@z%uc>3WlOeusCmXB zHn`WSzQOm#fS#|~AW)x#x(3VwMyTwYA5_*?^cAb{Li%{-P7_5sadO9XCQE365;p1r z5Z^kWuaAYkL5;pqh5kS+^f?XM3$$d~L+PR=gqWO>$WwNTR)+!@J0iZoxF0e+6ibH9 zY8i-1hAl=iu&v#$MY!oVv?x{!JP7oyvCy}v(H~WzKNbu9l|_i%xHuO0BLLs22hL(| z{bx~a(f7C-{RtKNlL~b9HJ?e3e7xv03*y-DV@cluEbZ=Oc~~#5?K;Zp+k*#7BM%aN zyY`qvOOz7E+_>(5xKCH+Gy6=%XZ9(&)zcymFXgjQAJ;1a`|LACzwfz<&nxulKQ6*T z)yLxp$58Z3>%qO1k!7D&mi-Y~=Fo%xEE*2PQYOUxhaOm5h?g3Q`i-&986^0Fm4Sc0 z0$zLi;ltH?I_C^nB-g(Ui{x@9(q39-Upx{rLHk+>nO-Di1NIH4BW5HF#2fbLnvv3B z16G^W*kOb3B|5Ux-rb0N_UM{XqAAXIm~jnOEH;vOp_j>oMtfUpju|p9-aba4wDaO- zqInsAqXW3~v9zycB)K(m2lSv99NUCiamjxRCxznzB3A|Sz85LSd2LvH}_Jq03Ljn=?A;aI;N1IdVCn|~+0wyrsftF4BxYaxBdqs3rHWwr1Z zbKK^4apV(TyFW$NZ(lQ?4EN*Y!iO-yFPkP3+xgOS8%HFNkJc{kiCqF(;g+ikS=KD6 z8f%XR^wRs5+8FE~aOnxok?K`VSN=!NT&VA3MOPB+7U~GUk(y5>oDn9_D<>>F1Y$A^ z)51H3VWKdI2zS)B(ahP_o+N9!yToSlqzs`(#UeNgP{G$`+2kkFbVZ$(rqML0CxY4zi45mne{;(K`mP zt?0Y>IU(Jy$&P3q6v*Q8HFF>k?ojo895H;LIMZp#*IjLxrLcwge{d(zvZBQ!t)lNF zIg_=&L&crM^~m>^7upV9ZdMKVli`L2`pVkHebGe!CB3cd*U)>{EnbG^J*8ULsLnrb zF2z=?#>O<MfcbP(1y0y~xKS=w9icWFfkw~u}TKrqQSYiqn{~X1?(fby#&HslZ zu<|*L5mU7`O?_kWPnZwRutCYg>`xQuZ|^RyE{MLfkq<%>+Ter5uf$tQ%&O^~`VNd> zi=D55cHRh$Ejzwbe|WyHKD7hB51YgiD^YF{F97U{ zF4(U|V83a>evbm{LkEaUHUTVN1$G%=*LA`E&<7KIRQUXUsBQ7;wU-WjrOnu1T0kcU zOi%${10ZgS)1EH-ZW;o%om#TCV&ccf&mX77YR9n>RaiHm3B$E;S}ea=A4~LGG%e}3 zYQY9`up}jzABs_bqApmH5m*&1Sh5yuDhI2g0>d2RudWML!w9UV7Oa*Q>`o4rtOBbB zuoPV|n?9J}XR&@CU_<0L#Srn^wRjJ3ys9cZrq0IYYdYQLHpD}4-)zc09IA2R)dD`p z0r8QEC}sRi$zE3%u%00x3+KxK3sis&w1BU1!0IYMrVqviYdSS-VhC8XuSEy2nHKPK z4p>74*a(2QR80r4l|G>8Z>=3KZKA;7z47ak-I!Bqs=%14yuB`12P3eKTCh%0V6p{C zX3|nh`2OdF=U`v_xB_~+(b!}rTHe&-zyr4 zErw>&(XE#57es$=w(6-D(a^G?)0XQ*9NAPSSUu$g~!S669VQq9DI^wpaL9|vKS@s@~#p=f~fxn+_YxR$= zgZwq~574&OzzR`i3m-aQ)Kd0=Nl`UaUw{qK1siGvmZk+877fPKiq&ZPtfgy#2z|Gr zYjA|(AE}Et$_R0^7IBOoVmuwTW@!kBsVc+~KpbayONoEHQn_^hQW$WQ*oore5kJnN z{F997GZgf&8U31m{n%0%-IO>~OmNWUpQ2pE`Lh&s<@-3Ulda*H70wsXv-u~3WSWA+ z>d(RYC|=h#=;W}bB5nHJuw$sbOI`{3r-DJ=|D)|Y;G-zszq5NK1p=YB0J)mG3nhe( z^p3Pp1q1{U=^c?yLJ6VV-6nxdLJc4w5FoUS3Mklq7ErNwnic7SD5AXI+1tC@z1ux` zKcDyY|7Te4H#6U7+A}lHJVjOkpETZwNw5F2bgmfbY6Emx%hU27&-(@i6a59BMZrmm zf|KRM?%i?9Ku=ws=i+&HZGV}GC^Jn_W_qxUf&PANUIlmzwzoOT(U(ZyG!(7lFFF-P zXDN!#4k`MYk#{H2qj%;t<9K&ne>uEVCOxkxH#bl+?;`H zK~Cq_vJ*$G_JuJSQL$W%UKdAZT#IR5YF+jl$C+7Of$^D-3YTadeVLrk9F+4VWw0|h zj+8H@V~CP6*^Kswwn|zWJZ;MrCcaI-WT2P6Tlx`4&fn7|km(EeRe{oFv5g%s7URzf zZScx`QkLT2owQN`nXL}ly7>v7o=BT-hg#9yr8SteCx&^o4iU8_EeHCVi0EsT=xznN zM-~0>+{Qd@{P_HXI)fW-aDz$^A?N+1)j*FBNvwj=fDE~rN4SYsAiIFtFYWum(xV)g z=Ocm$|JbIN4x7*8sHz@S?C{*TbmX076Dkq!C&iB3XY{-E`aPI=l1WxlVL^;rG|8F} zo0MOyciSUTD}a~~zXnxliwX1J1H8Quq)}L+VW!J+}#Ig(xn+PefAQFG}0ABJXQR=-EU5%I5I#DBfd zPGBu)>#IZG#{YIE2veCRv|8{naF_yKDCOi|gH_$g}qMp5IpiW(8DN>=0diW+YZeN$gH zqf6HggL(~gv`bA*C8I~yY{24am**-F)3i$c>GXR;XF@pAEClsypkAct>th^!`MCu> zFsPR(I@=fZ1J(jbmlcEhLlAceJHkH0k^6tus+5ynj?^CcjD?+NOZCm3=IPT}3o@YM zR$+M}Z%n!X6j8bLeU5(UUI2yJBvG4{ZSXk@9>+g_rD$Cfj<#68fH6C{CM%ovE6Ma0 zad!5#SUf$muV)!p?p!x@Z(8uYj_P|Yng+frnmbM4ldjSW&gFHvfXuBIlgr`_`P%kg zWMjF;RgFo|eNDRNlkAa%F}Y2y}iGaz|9 zH?+=EQm{5Xsh52)UjO04l@H~1Ku`)?i+;Sxmiq#pF4?tU8UA^TcIX~wB|2M2Lc;PfI2|BwHY{_qVG6;3X|dt}nRka3FP=kB59F@{oVzctJ(ZFPAb+;8n}v zPY%a}Amm?Au#3`!G;s<@6FKBc?@IyM7V^@+78+^(tp$^L-lU5Jx-AU!AwZ4VpwS_q zGnO1^&OirC%rbT%n58K;66VXHm?j)AOl7q(vVsht1RAvV&qkTtS=B*1fFfY1dr zRn!KoBnRY7q+i88F4o8~{+?|qf>wzH`fC_y1%Ou92CX3nSzN(XI3_4P1ICu@mr+PJpIrgEo?b@+L_gQ0mr0BA|v+ zppO@f4g-X;pQ)KPU~?s43q`lSD+0ER)WUgTfK36|S{ty960ofdFgmqSTH_{7yRfZz z7`<1R1rFRU5_nD+I24IZ9kszb1;N4JnR1bjznePC$e{Tb#dddz1idE=x&xrQYeV-4 zLSx@IiOOiI(nb-VtF21M8;_R(;VW zgTei{bc9JHo zD*!%S0Uiu5WSS8UJ~I;dgfMVOv`o)M1fL@ZFOwE*IqA1&qCXI#uiagI831s!V zlWVdtr1(d9I@;F>>SpMrZ1nX5!|BKX9jX@Sfzg+lpeyNE#X7+rprpEjjMduRK`-yj zO5_b$Ko$+rL(lpFWYI1?5P?zF173Oe{~}I$Arjt6hPM`Ynuh6&DJu=rP3sj*S;H{B za{miFy>NYnPDd_(mQ`J;$#2R9WTDz1`}ctj!3oB8os9~}P3leZS!_V|CLu1>|-uNT%CYCo2Z6G^`A5K<5D9YP;(UnQhclhM6jEeb*)FC8f=gHqXo^`)dqK^iM^H^O z9gd)yW;#N#oWdM63mUk>R zl$VqpB-){`HFb0)cHP7%mf#8nFEOp=h!hZ`Tn)ezT-?G^0|m0Jgdbf$MB_V0Vj z{(av!0e!gTg19pIo%}^Z#2pphUWoEcA4bIeNQrw+hD-15SzHEFM<(G5!yFxs31Oe< zvxu0VD>1+DVN#4OPIEHppB$|y3;WU2;b;&9n!bsM_N@}_yI>0;8mY2!3eU;JgK|i* zQ^$luLJDXSrGRQ1kvNHzLP3)x6l8-5$k-)JP@xbF21P)LFU&IVZqW)%;wC?Xn>?c= zA^`+kfUHEa%e1VL>@qEvJuvdKeCNT#s^tq0jQlL;JOh!w@4@-n@|FiiewLR#u)eb# z@$^Bu--8=~Ww)mn(ruoeNH==$jBHu&fhC^B>*Ctqq%}OyJFryo zG(uXzlZrIKgKMc}NqJ8L{8i3VA8DMY9#W$RmV*}FU=6Y_JGngH2oZrk=_bjAIZoF`s6WueAR(DTF zTG>4fX@Ywy(z0$CR+wYllacD(laNNaC!)(AxM84S`qRx0z<1o^klu9TLD%%7do0rP z?j>XJ*H>;l4x2u4!&K9B);$X8|J+X@J?+M;v+1~d1k!`<;YjzmhauhJX19sW?jcBt z8^dSHabx&QYup$<(+W2mzD1rcNT2s~MmodO3F#zHN2FstxTIR1^0Y@f)YA^Fw+!&K zMcUf~V@OLkPiv$dJh((#+IU(aZRu%=w5g{B(ng-;IDZp;r;dpEniwsLocU8bpt8VNE*MIjyF;}O zAMY=G7lrSK7yesOm{B=_fJ*VooK8pWO56<7fJrOM8<=4F-|+GeW#v60xfA_}|6n!o zVI|BuSqWdiOk#*r=#?oucXCEEhhoO?V$q6X?;5yrWWYldrP2bJ+bI>{-SKFX%L}kLs`+*V$nJNqS(F6X%UJxmKE(K7Jc4dv=NFn zi%=9CH$d?4jL+eeG_j6DU!r#}l&%lwMwKN;$7ZA%%{}p}XeESWK=9Wt_*JwQ5`S%L zG`GVKqP>v+hnAc4?zw(?z}3yI9^s;4ek=l8G`Ch^i}NP1i-x&P7+W-p5@0p9*ogl0 z+OzXG^3?i`Bj}0P;V?-yw|^AkI%pHenaSx5y_>Q(nRuluLy5pn0RngEjXItqAN;*8 zjV8SilLB;6N~}q0qMkQ*eH8k-Y0_sTd!}U!<;~r-d$31x;K7G=rdWMxk1SvuVC z6i1(0l(7TU_j(lCdIxBuV*BYK+v@&2*GHS6zTpIk;^zM*sQ;r7G=LE_fq(drR;a!I zeVz=YhpI4pm~B&H_VMO{+H?&Hr)w}hy={18x_;qwI?j;CwXK(Tvu!(4bT6hSlL_zE z7p>+D?j_1|bqr=SoWi=LXeH($SX_(3RwfQcX3=grJfn(Gn&`$A z3^q=_%RJLw^T&NRj{@|#h|uE|(6Yu&2taq_bkRB;+&7J)_cGh#=4qa&N{BBC{11oC zyvHC3?OFIW^K%6;9x0NDc_zN)kwnbX@PjXs2ydQDF0@>Q5Z00oUZ52?%$uh$x&DXz zUv){N-HEPXj4v_1HbI>9zIucbzQ)deg+7I3U##}uCROL2Ae^~&3tg0XYEY!lw9l6D z8Gn(BeGE17(mS=|qi*Nrbm|%BkC^cABI^KOXlG_I-^W!UXer+a@8MUq|07&avLP?M z%VG?DR0cUTE2c4bm0Uj^yMV0wvSn4~=dL26^Pc{^mWe|+o;YtVfw$F@r1;jP%rcdN z|1k<4kjZ~Fst9AjxD&j2y7ams1|c`k2sVe!Zx$p-jE-!cC1wkDk`zwdJUg_2EEdzl zsN)PyEy`2vY{asj6H+JZ_^Pz?yBV)yLOdU=n04$VdiYF6dNgmI7gC5exU~{au+8&> z`TdlCm4VPBAJsPy!=D*W-V;Yt|IDb!8_g>)LByya6O87i_?80Mn3v#N3S?tmh;K2F z4f4#zWLXpjdohE-E>?qu6LoV&SOGC|oH;YRz@XI#V7@FYf0axIusl5fR~ZZ-i{iBR zC)_BSGL86Ww*Q~b%rqm(o3y%(FF=YJp}#!xz$#{h{_=={RU}J4GeUoP#K0*{qe zo-+Q9T8W0Q38PC4xnNd_jMXxe(WMp{YcWrX`(_U2&1&JXrn6FN;jyx$5IJVG7+GSe zbsEI25AU=InPNOPbBG$LKiZX9rbg_ct~`~PBY6vP*U#=|K%^^=6hp*}NLL;yhKP9szU6Uo%=zf@jbW{7l>Hgc zZ3;Gutq4ShSe}WPROawVSz>lspe!*v*T5HwrfD{2TWGK>+F++R+hlRF{JkJLt2c)S z%JLPE1W7{66+V)D6t9qX$%_;C^VO5Zo*Y!J(zM3W8w`(RYZeXB$1zb7@1kKWw@N?gHNd zqN@DckEj%Xn(TN%ra-N<}V5i9#g;>Y}c4ii}jwQNS*TmNd1gW z4~1{o@k`+w*8F+6Z`k7O9ns~!^o2m&l{<1Xoz3lrO_X8PX-=E6-9-PsYzPR+FfnHp(rVeko0ED0A2*3Cd zDsZ&^v8A7(UeWt&c)hPI{fpzxR{|B+&;_($v)JlCJeT83Utf9=jTCJsGJlLsLci4b zgXwykf5M+@az{BHJ9CuNjpL>eQ_ne_$%3A9mKn`gk?p41`S?%H=Teo&0S-bgoUTQ0 zuI5|8<1!w4&A0teB;rc=UG-Qjp3lkUm)EqWb=&5^gxm~iqxlbYRNqpE1++}_&rEZc z@02wEq>=wi9f_>~xaC|L4V~q4Y@I=nXnw%X8h&#F^FKZXeP$5#Ae#3$eIf~i8L~wS zt?(wxxaeNra=e8LW~>S~#atYGyH#9vPKQSWzZe7ZM2lWty9EwgnV%z8d!W#U=UJf? zsgMOCMN5pLP^?O!jv`V$e<27IEoBvj;#CUu7Yj*t54@#J>4o_FSpN;^gQ3gdamdq< zJ{Tc>q|yhYml=89Qb|!~WnZ1-!&q;{(!D!gGjQeUscFk#_2p^gr=%h%sir6emC>MY zr@cFB>1nO0%RU5Ln!ij{l&M893QNdO9~2ieao@X`!WC%joMo8gmc(EU(e&=TWp^o(*|>(t#U ztrNhuRq6gbyC;(Lb$nzvN)J; z*rVLTBZsDT!g)Do*$ti~mDB5KgX}sLxYAwj%TQj3g?UU-%lHJ)ScM~-;%m1HD8{$R zJ3Xa(r7lSWJ9O;TC24je2kNxqPl{sD>IJ*JV(Io}kfnQ?5x*>5X)ToJE^oj)nWdqk z0w|XTNByu^LGuU|G(ZK76%{m*SMa)6K?_+0UB25Eu=`;Yu&2G|iV9lDD=0l&6`J-L zMerK9W7!%b?`bKkOK$tb>S9kzk16VcB5ANSmqcP(MW}$iS+!GC&|Y4_ZB#(6_ z%=C)EvzM?=>NA>LC+;d7~r7XY0*n1Rk+d;cb<_7f2^6pmA>TG zYeZFkPpNT>8u5e zQVTJ+yyYFFK&(EF@=}&j)9H5O8-nbf7H@WfZ9E03YY+@t>9_qbs{a zA_Za{i>B={n;980Qg}Sk5 zQWHss-?9nR?1)6o3rcEsDyZ4@Xw=Y#b5M6ua!Tuc%c}}|ieCr8Zq@RdtZ=uVak`(Gryca(UE-cI7_s;9K$zNZfAQ!jsel}@J@Z3r|Z zahA6Me>M{Q2TJ%RA@Com!XKW?!~(4rv-65*I-muA2JoLmg8x(wkHbcVfhmE*#^Wo=;U;bQnt*v1(#`F&#^PV!FoD|tNJ8%e zDQwRuzzs5$zS<=V&Ic{ul7q)f`sMYV`T@1{$a)QN?LPCip(VB>kh@sEM8)S76<<(P zEWY?@RD4NM@o9shsjXdeC+YXT(Z(#)cQKo6JGpUBSAlGKsIO8we${1;T)yUQ?FauJ z;6EzBe^P+|9HCXegn~D*wQKwz;QAq9eGIpc)02kbn;BQIf zgYj8uM#}^IIy~&xzwqmmA-~32{s8|Qrrn;KXwN+r*7c{HbxqG=tn0o?w!h`s7K+*a zQOWkNJXvK{XO;kYS!H9H)CH@@%2C-t2VoY2R_9ES8)tH>hQT>gBOsU83oYme zWgEkTg$3e0tE#2B53&+(jSj&I8k_sEGz`s)vY4lz{Q|C+kP=x{ZOa2F@p2U2Dw&u2 z5!5Zq56`vhsQr_y6X5c12~FvHWgGv@8LiMQw5r;b2f&o3Uu@pHE5)WTUep1h!H6giME&1ROOo`w z)%7S;rD#(H9MMW0IB@L4dMUima1ZH0EB zuMCu#`>$l8O}|#M6*`hu#Fz2E2T1DAR%o9GN{A}Ap79K%Ia%`cAV~@->YG}jC~0j? zP+nbe)e7}?ROC|{9kmkrrk)8D6+w@~`WT9~k5IIOtmt&H=tOlI+M%M(5i05usAzYC zjFsrHY2vZgXidivcdGQ=8{bo;@5k{yS^Dm_N$;8DC%F@lx`(|Ce>Vy5-PRsK_RJpa zN0OUu59#S1VdYRT>Ygfvn0~~@m3???FZGg}#FBkfO0M9^k=-l%^47kQO7>GJ$q4PQ zUg)R@H!!S_sP|$W6fDG!@X;LYb9!ZK%%ta~ewu(jnAA32Tw` zJ5$11D1Fbv_X6pA4!-A0-?Q*NPx_vY@43=9OnR&{!rCM1R9R<+H^n!Ivo#7l7hb?O zCeMcz@XhwQ$^t2zK4Z9v{yA1N36L8FHp6ptXJ)F0C!rHJt;0~w?~(^Zq=xSo;WJD4w~Pp zftIb?B?Xd#rAKtUb%$SrL`6r%3Q1;;FZZ-FSud!s^Q;(qpTEEGnfk<$w?-m+xT zKiS~Bhw)v8eYb=P1y9ax>{Z`rE!m{^#`(`H#i;&}IO&f)T*a}F7}g{HfBqfAd*kVY z*i}%3@Rp+w;>C~h^g)GHP=v6)6g(8h^VXN;uemi>;RxwXV23f$(oFt3?mHDy0G*&J zD)j8tPFyM{l~*_zkq2EYT3-u1e)cpFeX9vy(eK(WH{kiP_xc;syQlRyAYP9M@rDut z+Hx|8x71}*>>*6ord=a?v2-~Hz_IJ$=g)c?Snou{dRK`B^*9;U``TFa`#!7i3hAvB ziK+e%@E=5k|4<1JT{#*2xk&KOitv>q!Jh^ErxD>lQ^Lb)Tn7JzI=t__ckwFdqN7YDld<8l#M4*GS(o7!etp55gwFi!vm}EXyUD=MM(mvI1dR))I1Iyzz6ao55$u$J9g5*j9_(pQPfZJtq zw7?0K{gH0?LMi;({6g{ijvJMRLdL%d^~5RdTp#*jz}pGw4lh(bY|FjvkuLV)x@nv1g`$dWrWe;++hlJGq|bVBgSCzFLIcJ&)QgL< zZGg8i(%#-Qq+PtYZrj>=p{!%8=Y3Z)}q+ah7q^rC*VcTbTCn25WeHQ6h?^vXxz0Uw_um=Fvt{#-K zcJxd{+SW4xX)Dioq|H3zkfwQ1%4+tYlyym>=V|;^)q_c4P4J9D8s~WmsosMLV!7+V z{IJ~cusQLCcOJff^P&6WLRV^$z2X z{-+Y_U2W02^$(e7{no0BMxsBu$-;a#iw<+njcRMOMVIKkwdFr>_#sjHfyw^<#%U4p zL<4Tyn5;e4`e(7;TQiJo|LcSGHi-T!T;grLFFTBPtG=2^ydOM@r0ySWNgZ#68N8PK z@L{Nwj)HKF+17L_L~^L-63L-1MR0HyWiy15 z#@mdHHVpxyk2ZLw9l!c;WJe3OSZ&%Uyu;%)GhCi&D-%vm*$CwH6uYWi*!8R5YFvSB zSx-MMaMtT$RM(hY|190hh8@*l1QKIqqJ4Sw@Lc0jPE4ry8^!J zO5fnPwu)h7-CD_HbC)yv@U}|fw2AT`Ta~a@$3}3NY^81J_QTslEiR6zlloFFJGHU$l)Hs_7KU$SP^0vCWHmzoND4Ru#6I#|+!7)kp z9L3wj73Sx_HoF!hWXgfBthRH!%^~M*Hm97s+2Dgf>*3IrBI9oFuGZlOlOj!mW|$Bz z>ANw$ozizIzJ2iycw2pXp$2&&(Z~j2NDILF@?>7MjEBk zl%*hc`C&E0K(;0t`J0C2zbWQ#u96?-v?u;v-Ices2rKkJEYwOd#~#z3W4x_3Tjd(} zX*3>0q$FEL_ zwY9^NuE#cs;F4yOsby*68ifD0b%->nIw~hsCq`vpQgx0rsnXUsc;4G6j2@${TejYt z8uojvtt&ROhGCmoP;1oIzO=;}K8CkxDjTz9@Hm^elA#0yW!dBQXp!Ml?}S&X|Fv+2V{*HR5Ly2-g226#YNa zH({hpqfKtPuigKp=zoLPA9_H|Z?El1bj;I{Chiy+8LVTn7X_5FeN$nqZ1QT8@{>qP zbFEp)#t27q+jz!15eE0_8ic{MO`sLtZhniS?du#m#pRuPt~F_&bf^Mvo5;B6W|Fb# zNPC7@3<2hJKAQUzH$>YcQgXZ`{Yc-bI}ul=V4utj8;kelptc8VPGXLJ5Yosyv`yuL-lqCOwOLhi%%-DWhj6HI5>jy(EP;i&=XHBu`f?YQHF#UfF>7*3^jz7-7LIhNwf3aZhC7dKwiYy-56@A>wlqfp^t@~kWEX=w zxbBlqx!r0q*=-+=JDr!aq>)VJ=a>A;oW7NutPn#>8?I}%`H{$4pd@Rdf~-YaWEJaZ zal^IEc!T$`Na(nU*)k%bLup#3$ZuP!KwqYXUXLdTyH}H>?_FA#jLI)QMbgK#nm}&W z-(Q(*@3wY1?`_X+3=^Ozh1)|r={pDCZKdxu_--S9$J$na-L{U@3U>L=dX$syO6`*_ zZ-W7T*tOuSK~MH?#9{Hw6X;CaDt73-Mei0=ipNx3%{n9O`0bBu*9snB*sitqQ3!KK zBFv*o7%T=psXTzUc^OS_(RZh>Z3&u$N1`eBQE1AGMAN#6G_7Yey+=RDUfV!4r*Y8_Eo{7&{Y_Tt_>0C+Q{g7hn^`~+YEiR>5=+s%cIb=H4;rl5oy}S zXu3~|Z2SAu^q1Ej#sPBse-M_Q0^2wJn`ytgBr{?^*MywUaoR!j$J^=!t1*hx~e ziYwFV<6{t3$+nB_&1tmR7-!JEWOSYVo9UCSi+G-Vw7j^KwE2DAZgw`?7aAg+esp(TRkQ(KdUK3ffr`a| z>9+l3gnd6We$(@%fQ&3gVpYaFhjAq1;L_Ig?i+c(aCqpN_SV*Rq zTDxu)*3x76qxp)$_AKQiicRr|VtY*;>`r_Op0;S_-ixD4BzqPc9$0Le4=fB_`MzRP zysy|a-d9q~cj0N5KJLvxk7UeZI}LR4$)za=GosPI=Wk`^R{dyd*Q`vAjC#2Q3d2!0 z>Dh&hx~Y4Lt4t5Q)4U%-BPAUw$J-Q7FgE!U44Y0H$bxgwQ@~e_&vbkkPlpY*BII}! zRFWR*8&da}^@DkRBuf|D|3HD}yA10g<+F@U@hoH0c$SggMckqtTw&&*>BWm zk#Bj_-w@(4-1Y^)z7GW>u%Ek2e>>o=2G(+34hfmXjPi}Evm@1WEKr4xqj{xn#JjRx zRL7k>j9Koz>RyjKTW{vYVFGWvOfGcUP)q5c-S!;_`2k$gjn_@vk9nD$S5fz$Y0rV1 zY08J$h)LpMHlZlJ|GAqnLxqgk2G^rkbUQh^=Q}q7Ltc7rL+B7e6l@C<1(Vbz`waB& z4qc+b24tdOxDV^jwU>gS*c3uxn}$%Bb-i9;j8T@BZ`+0OC90o$ZgX6^6l3;TI0G<1hHLvv75lyx z_TORH4??kNw~8Kw?Dh7OL;VS;hiXvvD0L{#4qs&gTkUt*eUsiiU4Vx2pUFGdZoDjo4&!D1aZK!PhRKwpBj*~_THmDPfS zN^}TZISsg1Q|EE?^CvxeETMsN)HtA4P(`h%g$mv15Y)<=s84X5lQf#Rx`{M<2FbDU z7G|%eid|hDn}es);zl(n#&ohYd&N$!sewP!gP`2r!E#Kz(b;ROV%AZ|I)4+Q*HIpkl zu*;Bv9r_PV>e*#zJ$hvfxy5lqzt|Jyi?25j&H9L(i9ZEXbB7 zq7s}G?^5$I&r48M875Xt`Znt}jGVeSQRi76j>VEW;!lbI8G;X1>W-NDqpm!%a-4;Y>^{D!}wN+FKQu^*$-J{c{h3nA@9x zs>hf#wjUkzrDs1{)mkZjy-z!Q=Q(ZU?QMe_daUswPOkQL!A-ql>9d2|a@+yJ-H5GA zNB-tnYvjEn*bXlSJCZA7+uNXM$FR!aS;2oosF?qH+r4z}eNTIczeh@1LiP?Q)|GY0 zXWWs5j=ys`>1A0!BnM+d-Dri9*cy;~_dEDze#JgD>EE&5+eR|Wwh6u*dbC2z`{L#? zirqY*u=`xs21a|2O&0G{^lSxhBfh*HZ}RrXna^+hH#dU{y;4g!a`4Fmy=h6E{pmrc zLUR~c&j|M@doR^{6mxEC?;W^ANv>HbpIYb<@0_NPJ14aM8`EEs@fsOtPxsSB8yVN1 z;b`4A4GtEo!rm_u9sRZG7!XcJ_lR_~10B45aB#@tdHWNx;lkLD~3*w!4~(91g! z;Xs9gxg0k}Jo*^zL!s>Tv{DaCPhL9vOq$OfcanV&S~Dyz9%>=cT-4O4(d_?v%trcj z)a0nKQ8_cJl6rUgx=FdO;TX>^@S92&-|ah(B-D)kjDGS*T0@SvKPfvw*++yP@R)-H zF^;Dla#YzJ$o>?YRpK28QF%vr5opprO8sCb-M2P{#IUk6l@fUb_-Okxm`Q%$-k#A+ z6K$-x8aN~EaOIg3T;7G0Iz~Ix5$xmC=wy~Jl?p0zAYBF{k z7OuK?(^4PJ$0VAWo7L)YCEw`2?)|_W&dxL|rbMD+sums77)SKS|MJl>UA6CgURK#t z{Uo0Nz`htua-#G-7mrvI7^e~=N2eL>aK7pt@B5)R)0-A+p9ulmI3{3Ykx*DGs?nND zy+443F%^+;&!N4i;F-%F<~fwkxXWI+?4fQ!X#-yYnMY8cW^K^bXhw9DsF$GTYP9#{ z!9bh$A7YqjQoN(^32wgj!o`7sIip}4{8Gq^wkYHq#M>9LLV8ck2W=IR2fG~7=F9hY^) z+5v-O;t_jRaNl+teZHRj(5nHRqq_g+YVH4dtS=P@t960>UlLByZoI&* z9#iEf8Uav56{a^CD z!XG%pDS)c_Xz+u+qXdQ6Fbq_~PlE{hdcEkg6pbTjLF|?1E=(8R*56iiL zE%qm0r!e7S13F`5P7Z$iSI;LNaiX{m`KZ8XSK~K7py9uT z(&BSt#_TT?5AF7=x5FRW?bj4^T~|D`FA5TIs3hc}-F^kox3nIN?6)-@jO-9whCLYB z?*txjEzu<84-oQ?CL#Z764K~t_e$lvS#nee4b|znC)Z&= z6rwcIA3&L3r-h!ZS4ZcQA>#}ig=Aw0d=0KLIakYQrgv{_#cLg>MMN@Ad&#kyM8s(k z0m)}L5oJS&s6{`$oD+jS;5Fef9g@py!Y63KLj)QQUoiwek$(1f4rKX)P7}Ty;HzlD zS5=4Sl8I^YbGhu6B8jS{iI`kHgn~Nsi%Pi$P@vbO0EP$2wKOS!ZgIB*eQEmm7=+s{ z+Pt)%@9h>8_|-`5A@i_KI0-2t2?k9PYJvolCJAOu5@zJ>tIh;)(?UqFhLB*{{q2*v z=meuC1xcVFS(5^XCIuBb8&oN9g;3z6muBU{sjv{ONrD|D)Yl}TfjS9%aznL=m>L3K zpZ>Ha_Yc6wXu{V6d}B@cCR*@K)!>_jz^BpQcI3ipQHa%qPXl~QO?arDs?9<^`7t&4 z)*p~Ftk*UI|`bFjQ7{9wS3(1ahU1usfZ zLzHNeM}@#Qq`x%Iy94+HO?b#qlgDVnKcfXdR;~5VhQMP5il=}IN_3^pPV&>BV1gzE z6SXLqq(;Hy5DKj1n>C1#b6`n~e;!m+(h@u!CXWXl(=_Rru0_WTH9BU7(BUK(zL{G| z>W)g9BuoVf&uNk{N1X)37ulR0vK7t^!LLlu=H->=$&|OYb_nQB$=VM4z~lv*zzfxZ z`D9TH8afFVhhSHuAKlp6n^%LK57dP&+FIO0 zlUHipfd1ZC1rkpA4K;Zc8)Bvvma_@s&(*87j}~0P0j+GTmFob z>OKrd&N`)V{VRA&zrP|UfV2gRJ^wI~zrDEE&a8<*wzCipyPx@ebevE;Si6Rxg-&up! zos*x$<^LW#myD_%`xx0e$WX5IqaD9-2%&@KJVq1J4t{~=Kwg==QM>9*fvP(hQJIk& zNN!~{dc{{$Ek#WmP}5fJnu?S)#n5i|_8`onkf^9+3o6+mR>BU`c-=iQu_OCB?SJBo zH{y~M#c?-~CcnVy+(e7sJPZ}2^xCn*bOA@d7INm@!!4+OPX1%87h*`a_Ya?>`U^W_ zIZiYqYfg$|*QFVg5m8F0BR#B$KkVA17iuerf)F%0JhIZFtq2b#232Z8GM2`b_d6aD z-&2yq<12~pDam4dC1rsM>+k@RykBkFGno{Nc%FPfIk67<=Dl1vlw1;={WAUjqe-xW z6~xFm{)Zwc9yM48#iQh6wChMj*rQ6=V?kIwSvPd!7)ivNT&jspE}bpHn=?WI21H@W zhk^UDCUbd3i@6+ExqUehGuloko6)kt_fgoMB)*AkJ0 zS3$yCnk2lfMZ*8oNO&iN1RU~wcRXuE65a#}?`x89MvH{AY9xFRLIMt0JJzuSmQ6{5 zY;SuH@aHt)Kh}c(L=FDa5ct3y!>)u6nFk+%gfBEn_)?1mXkdm*8@>)F;gfajnv<*~ zLDmDG1O7Wr`0usg&#S>-2!RhAF&#?ykRJFJBwVJZ&iUtcq@>${+K|2`|3FRM^DpX1 z(p6n;KKVx`Zk-r7$0Udvc(4nPO8$wO((@Pdbm_nA+D01%C-&NOGUH^8@w9<){YT(1 zmyqdK&GubUZy#hCGd_)Nz_z-f0aQ`0mwYv(jne6f7hDnB_zTFmp~mQ#Ss6Q4+*I

  • #2C*l#xrHshUij29Tju*Cw4Ak3g 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 From f5ed7ad63e2bd678af7282460874e54272ba3490 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2015 14:43:25 +0000 Subject: [PATCH 28/49] Fix harmless compiler warnings. FossilOrigin-Name: b0badb99023e23bef0e2064cec58f2b279af0c0b --- ext/fts3/fts3_icu.c | 13 +++++++------ ext/icu/icu.c | 2 +- manifest | 32 ++++++++++++++++---------------- manifest.uuid | 2 +- src/loadext.c | 5 ++++- src/main.c | 6 +++++- src/mutex.c | 11 ++++++++--- src/pcache1.c | 4 ++-- src/shell.c | 19 ++++++++++++------- src/sqlite3ext.h | 3 ++- src/sqliteInt.h | 8 ++++++++ src/tokenize.c | 4 ++++ tool/warnings.sh | 22 ++++++++++++++++++++++ 13 files changed, 92 insertions(+), 39 deletions(-) diff --git a/ext/fts3/fts3_icu.c b/ext/fts3/fts3_icu.c index 52df8c7d81..6f90e1ebad 100644 --- a/ext/fts3/fts3_icu.c +++ b/ext/fts3/fts3_icu.c @@ -240,12 +240,13 @@ static int icuNext( ** The set of routines that implement the simple tokenizer */ static const sqlite3_tokenizer_module icuTokenizerModule = { - 0, /* iVersion */ - icuCreate, /* xCreate */ - icuDestroy, /* xCreate */ - icuOpen, /* xOpen */ - icuClose, /* xClose */ - icuNext, /* xNext */ + 0, /* iVersion */ + icuCreate, /* xCreate */ + icuDestroy, /* xCreate */ + icuOpen, /* xOpen */ + icuClose, /* xClose */ + icuNext, /* xNext */ + 0, /* xLanguageid */ }; /* diff --git a/ext/icu/icu.c b/ext/icu/icu.c index 1ce1e0c806..a2ff49274c 100644 --- a/ext/icu/icu.c +++ b/ext/icu/icu.c @@ -83,7 +83,6 @@ static int icuLikeCompare( /* Read (and consume) the next character from the input pattern. */ UChar32 uPattern; U8_NEXT_UNSAFE(zPattern, iPattern, uPattern); - assert(uPattern!=0); /* There are now 4 possibilities: ** @@ -422,6 +421,7 @@ static void icuLoadCollation( int rc; /* Return code from sqlite3_create_collation_x() */ assert(nArg==2); + (void)nArg; /* Unused parameter */ zLocale = (const char *)sqlite3_value_text(apArg[0]); zName = (const char *)sqlite3_value_text(apArg[1]); diff --git a/manifest b/manifest index 6366e547e0..a9426fec73 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\sdatabase\scorruption\sin\sfreeSpace(). -D 2015-06-15T12:58:15.259 +C Fix\sharmless\scompiler\swarnings. +D 2015-06-15T14:43:25.708 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -85,7 +85,7 @@ F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1 F ext/fts3/fts3_expr.c 71c063da9c2a4167fb54aec089dd5ef33a58c9cb F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5 +F ext/fts3/fts3_icu.c deb46f7020d87ea7a14a433fb7a7f4bef42a9652 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7 @@ -104,7 +104,7 @@ F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl a2567f9d6ad6779879a2e394c120ad8718557e65 F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43 -F ext/icu/icu.c d415ccf984defeb9df2c0e1afcfaa2f6dc05eacb +F ext/icu/icu.c b2732aef0b076e4276d9b39b5a33cec7a05e1413 F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 F ext/misc/amatch.c 27b9b601fb1453084e18a3432ea0240d7af8decb F ext/misc/closure.c 636024302cde41b2bf0c542f81c40c624cfb7012 @@ -214,8 +214,8 @@ F src/insert.c b5f8b35a1b7924020e48cade5b2b5017bca7906b F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770 -F src/loadext.c 29255bbe1cfb2ce9bbff2526a5ecfddcb49b9271 -F src/main.c 3a610587018485d9a12e38899dd8b8129b04d836 +F src/loadext.c e722f4b832f923744788365df5fb8515c0bc8a47 +F src/main.c c0061a4f8ba86f957534be93b7026dab324f12c2 F src/malloc.c 908c780fdddd472163c2d1b1820ae4081f01ad20 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 @@ -224,7 +224,7 @@ F src/mem3.c 61c9d47b792908c532ca3a62b999cf21795c6534 F src/mem5.c 61eeb90134f9a5be6c2e68d8daae7628b25953fb F src/memjournal.c 3eb2c0b51adbd869cb6a44780323f05fa904dc85 F src/msvc.h d9ba56c6851227ab44b3f228a35f3f5772296495 -F src/mutex.c 19bf9acba69ca2f367c3761080f8a9f0cf4670a8 +F src/mutex.c 529e95739f815300a33c73fd8a7d6bdf0c24bd18 F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 F src/mutex_noop.c 529bab0743c3321c940f32c3464de494fd38cfa9 F src/mutex_unix.c 5cf676464bd19e0a866297515d146e8bf1669dfb @@ -242,7 +242,7 @@ F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77 F src/parse.y 6d60dda8f8d418b6dc034f1fbccd816c459983a8 F src/pcache.c 10539fb959849ad6efff80050541cab3d25089d4 F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8 -F src/pcache1.c 7ca0caf7ec16c365aff3ddb4a7e00734a0e1fe97 +F src/pcache1.c 8e3799b33c41d517d86444d4abefc80d4f02adca F src/pragma.c c1f4d012ea9f6b1ce52d341b2cd0ad72d560afd7 F src/pragma.h b8632d7cdda7b25323fa580e3e558a4f0d4502cc F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 @@ -251,11 +251,11 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d -F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee +F src/shell.c ae5c3985a6d2173563f37a459f8e68fd6eaad4f4 F src/sqlite.h.in 76d2f5637eb795b6300d9dd3c3ec3632ffafd721 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad -F src/sqlite3ext.h 2ebeb634e751a61a6f0eebfa0f4669f46a42f6cd -F src/sqliteInt.h 8f095bfe43ba68c32bac8d5349131ffacc660967 +F src/sqlite3ext.h be1a718b7d2ce40ceba725ae92c8eb5f18003066 +F src/sqliteInt.h 95b99b2821811af1f2a1190fa829ffb8e6c04135 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -306,7 +306,7 @@ F src/test_vfs.c 3b65d42e18b262805716bd96178c81da8f2d9283 F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 6bbcc9fe50c917864d48287b4792d46d6e873481 -F src/tokenize.c baa0e550dfa76a8d781732a7bfb1f0aa094942f2 +F src/tokenize.c 57cb3720f53f84d811def2069c2b169b6be539a5 F src/treeview.c 84aa2d2ed26627ccc8dd3a2becfa18dc86ee4607 F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f @@ -1284,9 +1284,9 @@ F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 -F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 +F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 17f185adb960b1fa4faa13cdf685b92a20a52072 -R 9841ab7ddff94ef28e5c7f312f08cf08 +P 29bcb56887f862a1f06677a7b4bfae6475d29732 +R 5ad9a69ba3ab157466aa22136a13ce7e U drh -Z 8fda4c4c0358babdd19a81217bb5c4c6 +Z fdade3bbae6ad7299292ad94aabb282b diff --git a/manifest.uuid b/manifest.uuid index 1f5f5b3ab9..c2982bcdd1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -29bcb56887f862a1f06677a7b4bfae6475d29732 \ No newline at end of file +b0badb99023e23bef0e2064cec58f2b279af0c0b \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 5a2b9d297c..dcdbb28126 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -402,7 +402,10 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_reset_auto_extension, sqlite3_result_blob64, sqlite3_result_text64, - sqlite3_strglob + sqlite3_strglob, + /* Version 3.8.11 and later */ + (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup, + sqlite3_value_free }; /* diff --git a/src/main.c b/src/main.c index ef37b7e1a1..c047943c93 100644 --- a/src/main.c +++ b/src/main.c @@ -2082,9 +2082,11 @@ int sqlite3TempInMemory(const sqlite3 *db){ return ( db->temp_store!=1 ); #endif #if SQLITE_TEMP_STORE==3 + UNUSED_PARAMETER(db); return 1; #endif #if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3 + UNUSED_PARAMETER(db); return 0; #endif } @@ -3356,7 +3358,9 @@ int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ */ int sqlite3_test_control(int op, ...){ int rc = 0; -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifdef SQLITE_OMIT_BUILTIN_TEST + UNUSED_PARAMETER(op); +#else va_list ap; va_start(ap, op); switch( op ){ diff --git a/src/mutex.c b/src/mutex.c index 2b45036289..64efd3b05e 100644 --- a/src/mutex.c +++ b/src/mutex.c @@ -45,9 +45,14 @@ int sqlite3MutexInit(void){ }else{ pFrom = sqlite3NoopMutex(); } - memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc)); - memcpy(&pTo->xMutexFree, &pFrom->xMutexFree, - sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree)); + pTo->xMutexInit = pFrom->xMutexInit; + pTo->xMutexEnd = pFrom->xMutexEnd; + pTo->xMutexFree = pFrom->xMutexFree; + pTo->xMutexEnter = pFrom->xMutexEnter; + pTo->xMutexTry = pFrom->xMutexTry; + pTo->xMutexLeave = pFrom->xMutexLeave; + pTo->xMutexHeld = pFrom->xMutexHeld; + pTo->xMutexNotheld = pFrom->xMutexNotheld; pTo->xMutexAlloc = pFrom->xMutexAlloc; } rc = sqlite3GlobalConfig.mutex.xMutexInit(); diff --git a/src/pcache1.c b/src/pcache1.c index 685ec23e05..c394ff1787 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -737,9 +737,9 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** attempt to allocate a new one. */ if( !pPage ){ - if( createFlag==1 ) sqlite3BeginBenignMalloc(); + if( createFlag==1 ){ sqlite3BeginBenignMalloc(); } pPage = pcache1AllocPage(pCache); - if( createFlag==1 ) sqlite3EndBenignMalloc(); + if( createFlag==1 ){ sqlite3EndBenignMalloc(); } } if( pPage ){ diff --git a/src/shell.c b/src/shell.c index 7db8dbda0a..402e9389d3 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1331,7 +1331,10 @@ static void display_scanstats( sqlite3 *db, /* Database to query */ ShellState *pArg /* Pointer to ShellState */ ){ -#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +#ifndef SQLITE_ENABLE_STMT_SCANSTATUS + UNUSED_PARAMETER(db); + UNUSED_PARAMETER(pArg); +#else int i, k, n, mx; fprintf(pArg->out, "-------- scanstats --------\n"); mx = 0; @@ -1866,6 +1869,7 @@ static void readfileFunc( long nIn; void *pBuf; + UNUSED_PARAMETER(argc); zName = (const char*)sqlite3_value_text(argv[0]); if( zName==0 ) return; in = fopen(zName, "rb"); @@ -1898,6 +1902,7 @@ static void writefileFunc( sqlite3_int64 rc; const char *zFile; + UNUSED_PARAMETER(argc); zFile = (const char*)sqlite3_value_text(argv[0]); if( zFile==0 ) return; out = fopen(zFile, "wb"); @@ -2577,7 +2582,7 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]); fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]); fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); - for(i=0; iout, "%-20s %u", aField[i].zName, val); @@ -2597,7 +2602,7 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ }else{ zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb); } - for(i=0; idb, aLimit[i].limitCode, -1)); } @@ -3239,7 +3244,7 @@ static int do_meta_command(char *zLine, ShellState *p){ }else{ int iLimit = -1; n2 = strlen30(azArg[1]); - for(i=0; i=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) #endif + +/* Make the IdChar function accessible from ctime.c */ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS int sqlite3IsIdChar(u8 c){ return IdChar(c); } +#endif /* diff --git a/tool/warnings.sh b/tool/warnings.sh index 5d71361138..d69cbaf5db 100644 --- a/tool/warnings.sh +++ b/tool/warnings.sh @@ -9,6 +9,28 @@ echo '********** No optimizations. Includes FTS4 and RTREE *********' gcc -c -Wshadow -Wall -Wextra -pedantic-errors -Wno-long-long -std=c89 \ -ansi -DHAVE_STDINT_H -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE \ sqlite3.c +echo '********** Android configuration ******************************' +gcc -c \ + -DHAVE_USLEEP=1 \ + -DSQLITE_HAVE_ISNAN \ + -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \ + -DSQLITE_THREADSAFE=2 \ + -DSQLITE_TEMP_STORE=3 \ + -DSQLITE_POWERSAFE_OVERWRITE=1 \ + -DSQLITE_DEFAULT_FILE_FORMAT=4 \ + -DSQLITE_DEFAULT_AUTOVACUUM=1 \ + -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 \ + -DSQLITE_ENABLE_FTS3 \ + -DSQLITE_ENABLE_FTS3_BACKWARDS \ + -DSQLITE_ENABLE_FTS4 \ + -DSQLITE_OMIT_BUILTIN_TEST \ + -DSQLITE_OMIT_COMPILEOPTION_DIAGS \ + -DSQLITE_OMIT_LOAD_EXTENSION \ + -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 \ + -DSQLITE_ENABLE_ICU \ + -DUSE_PREAD64 \ + -Wshadow -Wall -Wextra \ + -Os sqlite3.c shell.c echo '********** No optimizations. ENABLE_STAT4. THREADSAFE=0 *******' gcc -c -Wshadow -Wall -Wextra -pedantic-errors -Wno-long-long -std=c89 \ -ansi -DSQLITE_ENABLE_STAT4 -DSQLITE_THREADSAFE=0 \ From 3e24a343241003e80731dcf095ea31ea1d599d76 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2015 16:09:35 +0000 Subject: [PATCH 29/49] Fix a harmless comment typo. No code changes. FossilOrigin-Name: ae6876521819e7a8ce473c8f96617cba35e2156d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a9426fec73..a8b3ea00d4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2015-06-15T14:43:25.708 +C Fix\sa\sharmless\scomment\stypo.\s\sNo\scode\schanges. +D 2015-06-15T16:09:35.833 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,7 +192,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c e269b13c9ad70177cc24e9506c91705c53f1425b +F src/btree.c e557af3120ac3e5cea9680ca12688cf26b0222bc F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4 F src/build.c 6770b74ccb51cb485e81057c625f77455d5ddc06 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 29bcb56887f862a1f06677a7b4bfae6475d29732 -R 5ad9a69ba3ab157466aa22136a13ce7e +P b0badb99023e23bef0e2064cec58f2b279af0c0b +R c7949b921102cce9b301519c2fb02c1a U drh -Z fdade3bbae6ad7299292ad94aabb282b +Z 103d93c1867cc9ff7fdf7b89d6bdddd9 diff --git a/manifest.uuid b/manifest.uuid index c2982bcdd1..0d16e36253 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b0badb99023e23bef0e2064cec58f2b279af0c0b \ No newline at end of file +ae6876521819e7a8ce473c8f96617cba35e2156d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 4a32c07884..edd0f611d2 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1441,7 +1441,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ /* At this point: ** iFreeBlk: First freeblock after iStart, or zero if none - ** iPtr: The address of a pointer iFreeBlk + ** iPtr: The address of a pointer to iFreeBlk ** ** Check to see if iFreeBlk should be coalesced onto the end of iStart. */ From 07d694c750d16e55d0c5866dbea3d8a1cf374f76 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2015 16:40:38 +0000 Subject: [PATCH 30/49] Adjust ICU tests to account for recent changes in the official Unicode definition of whitespace. FossilOrigin-Name: 0816525386ac51454b7b09a507e45b6a2cb8bf6e --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fts4unicode.test | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a8b3ea00d4..739702bb43 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scomment\stypo.\s\sNo\scode\schanges. -D 2015-06-15T16:09:35.833 +C Adjust\sICU\stests\sto\saccount\sfor\srecent\schanges\sin\sthe\sofficial\s\nUnicode\sdefinition\sof\swhitespace. +D 2015-06-15T16:40:38.658 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -644,7 +644,7 @@ F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7 F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b F test/fts4noti.test 524807f0c36d49deea7920cdd4cd687408b58849 -F test/fts4unicode.test 01ec3fe2a7c3cfff3b4c0581b83caa11b33efa36 +F test/fts4unicode.test 27378af76394542cf490cf001d8d1505fe55f6a9 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test ae97561957aba6ca9e3a7b8a13aac41830d701ef F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b0badb99023e23bef0e2064cec58f2b279af0c0b -R c7949b921102cce9b301519c2fb02c1a +P ae6876521819e7a8ce473c8f96617cba35e2156d +R a07fe181e35e9a94a47adc71c8d7ce80 U drh -Z 103d93c1867cc9ff7fdf7b89d6bdddd9 +Z bb1a4c355eadbeb14b6625f3b7a90f48 diff --git a/manifest.uuid b/manifest.uuid index 0d16e36253..20cb583453 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae6876521819e7a8ce473c8f96617cba35e2156d \ No newline at end of file +0816525386ac51454b7b09a507e45b6a2cb8bf6e \ No newline at end of file diff --git a/test/fts4unicode.test b/test/fts4unicode.test index f237119a18..500cfcdcaa 100644 --- a/test/fts4unicode.test +++ b/test/fts4unicode.test @@ -362,11 +362,17 @@ ifcapable icu { lappend tokenizers icu } # Some tests to check that the tokenizers can both identify white-space # codepoints. All codepoints tested below are of type "Zs" in the # UnicodeData.txt file. +# +# Note that codepoint 6158 has changed from Zs to Cf in recent versions +# of UnicodeData.txt. So take that into account for the "icu" tests. +# foreach T $tokenizers { do_isspace_test 6.$T.1 $T 32 do_isspace_test 6.$T.2 $T 160 do_isspace_test 6.$T.3 $T 5760 - do_isspace_test 6.$T.4 $T 6158 + if {$T!="icu"} { + do_isspace_test 6.$T.4 $T 6158 + } do_isspace_test 6.$T.5 $T 8192 do_isspace_test 6.$T.6 $T 8193 do_isspace_test 6.$T.7 $T 8194 @@ -382,7 +388,11 @@ foreach T $tokenizers { do_isspace_test 6.$T.17 $T 8287 do_isspace_test 6.$T.18 $T 12288 - do_isspace_test 6.$T.19 $T {32 160 5760 6158} + if {$T!="icu"} { + do_isspace_test 6.$T.19 $T {32 160 5760 6158} + } else { + do_isspace_test 6.$T.19 $T {32 160 5760 8192} + } do_isspace_test 6.$T.20 $T {8192 8193 8194 8195} do_isspace_test 6.$T.21 $T {8196 8197 8198 8199} do_isspace_test 6.$T.22 $T {8200 8201 8202 8239} From 0dd5cdaea5594977a58cd4de136c135465b78864 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 16 Jun 2015 16:39:01 +0000 Subject: [PATCH 31/49] Ensure that the CREATE TABLE AS statement correctly undoes partial changes to the sqlite_master table if the SELECT on the right-hand side aborts with an error. Fix for ticket [873cae2b6e25b] FossilOrigin-Name: 400e025e7c61efab71b891743c07a0862e5bb934 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 3 ++- src/vdbeaux.c | 8 +++++++- test/table.test | 16 ++++++++++++++++ 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 739702bb43..aa791daea3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\sICU\stests\sto\saccount\sfor\srecent\schanges\sin\sthe\sofficial\s\nUnicode\sdefinition\sof\swhitespace. -D 2015-06-15T16:40:38.658 +C Ensure\sthat\sthe\sCREATE\sTABLE\sAS\sstatement\scorrectly\sundoes\spartial\schanges\nto\sthe\ssqlite_master\stable\sif\sthe\sSELECT\son\sthe\sright-hand\sside\saborts\swith\nan\serror.\s\sFix\sfor\sticket\s[873cae2b6e25b] +D 2015-06-16T16:39:01.822 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c e557af3120ac3e5cea9680ca12688cf26b0222bc F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4 -F src/build.c 6770b74ccb51cb485e81057c625f77455d5ddc06 +F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575 F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b @@ -317,7 +317,7 @@ F src/vdbe.c c9b8985dfc5df9bd512342ea2e56af4be30cb31a F src/vdbe.h 90048aea1910f9df93e6044592bd4a466dc9c5e7 F src/vdbeInt.h 20295e482121d13437f69985f77db211cdc8bac1 F src/vdbeapi.c 6a0d7757987018ff6b1b81bc5293219cd26bb299 -F src/vdbeaux.c 89c85926ce346988d275132e05ddb0c9681807c2 +F src/vdbeaux.c b4a127630ef81d5ea85346262f38aaf482ece4d9 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c 67b302dc6df64b4d6785881c5d22bd4f9b17739d F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b @@ -943,7 +943,7 @@ F test/superlock.test 1cde669f68d2dd37d6c9bd35eee1d95491ae3fc2 F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85 F test/syscall.test d2fdaad713f103ac611fe7ef9b724c7b69f8149c F test/sysfault.test fa776e60bf46bdd3ae69f0b73e46ee3977a58ae6 -F test/table.test bd841e8df69b99172ce9c7d53587463913d711ca +F test/table.test 33bf0d1fd07f304582695184b8e6feb017303816 F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 F test/tclsqlite.test 7fb866443c7deceed22b63948ccd6f76b52ad054 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ae6876521819e7a8ce473c8f96617cba35e2156d -R a07fe181e35e9a94a47adc71c8d7ce80 +P 0816525386ac51454b7b09a507e45b6a2cb8bf6e +R aac2c97e6c3d9c60b2cdef77f1695ab5 U drh -Z bb1a4c355eadbeb14b6625f3b7a90f48 +Z 6de6d20f4ab095b721ee46bcbe62906a diff --git a/manifest.uuid b/manifest.uuid index 20cb583453..4307100089 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0816525386ac51454b7b09a507e45b6a2cb8bf6e \ No newline at end of file +400e025e7c61efab71b891743c07a0862e5bb934 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 8c62fd18d5..2936805365 100644 --- a/src/build.c +++ b/src/build.c @@ -976,7 +976,7 @@ void sqlite3StartTable( int j1; int fileFormat; int reg1, reg2, reg3; - sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3BeginWriteOperation(pParse, 1, iDb); #ifndef SQLITE_OMIT_VIRTUALTABLE if( isVirtual ){ @@ -1924,6 +1924,7 @@ void sqlite3EndTable( regRec = ++pParse->nMem; regRowid = ++pParse->nMem; assert(pParse->nTab==1); + sqlite3MayAbort(pParse); sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb); sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); pParse->nTab = 2; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index fc667ed47d..53c1d80119 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -414,6 +414,7 @@ static Op *opIterNext(VdbeOpIter *p){ ** * OP_VUpdate ** * OP_VRename ** * OP_FkCounter with P2==0 (immediate foreign key constraint) +** * OP_CreateTable and OP_InitCoroutine (for CREATE TABLE AS SELECT ...) ** ** Then check that the value of Parse.mayAbort is true if an ** ABORT may be thrown, or false otherwise. Return true if it does @@ -425,6 +426,8 @@ static Op *opIterNext(VdbeOpIter *p){ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ int hasAbort = 0; int hasFkCounter = 0; + int hasCreateTable = 0; + int hasInitCoroutine = 0; Op *pOp; VdbeOpIter sIter; memset(&sIter, 0, sizeof(sIter)); @@ -439,6 +442,8 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ hasAbort = 1; break; } + if( opcode==OP_CreateTable ) hasCreateTable = 1; + if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; #ifndef SQLITE_OMIT_FOREIGN_KEY if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ hasFkCounter = 1; @@ -452,7 +457,8 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ ** through all opcodes and hasAbort may be set incorrectly. Return ** true for this case to prevent the assert() in the callers frame ** from failing. */ - return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter ); + return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter + || (hasCreateTable && hasInitCoroutine) ); } #endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ diff --git a/test/table.test b/test/table.test index faa9712bf7..2aec6473e6 100644 --- a/test/table.test +++ b/test/table.test @@ -808,4 +808,20 @@ do_execsql_test table-17.1 { SELECT p, q, '|' FROM t3 ORDER BY p; } {1 1 | 2 2 |} +# 2015-06-16 +# Ticket [https://www.sqlite.org/src/tktview/873cae2b6e25b1991ce5e9b782f9cd0409b96063] +# Make sure a CREATE TABLE AS statement correctly rolls back partial changes to the +# sqlite_master table when the SELECT on the right-hand side aborts. +# +do_catchsql_test table-18.1 { + DROP TABLE IF EXISTS t1; + BEGIN; + CREATE TABLE t1 AS SELECT zeroblob(2e20); +} {1 {string or blob too big}} +do_execsql_test table-18.2 { + COMMIT; + PRAGMA integrity_check; +} {ok} + + finish_test From f1aabd6b78630b71a3d8ff89019e077711c2bd78 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jun 2015 01:31:28 +0000 Subject: [PATCH 32/49] Optimizations to two VDBE accessory routines for a 0.2% performance increase. FossilOrigin-Name: 66d033b9c9a8c16b9a342be0b325bd85b8487c03 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 7 +++++-- src/vdbemem.c | 43 +++++++++++++++++++++++++++---------------- 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index aa791daea3..573ebff619 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sCREATE\sTABLE\sAS\sstatement\scorrectly\sundoes\spartial\schanges\nto\sthe\ssqlite_master\stable\sif\sthe\sSELECT\son\sthe\sright-hand\sside\saborts\swith\nan\serror.\s\sFix\sfor\sticket\s[873cae2b6e25b] -D 2015-06-16T16:39:01.822 +C Optimizations\sto\stwo\sVDBE\saccessory\sroutines\sfor\sa\s0.2%\sperformance\sincrease. +D 2015-06-17T01:31:28.018 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -317,9 +317,9 @@ F src/vdbe.c c9b8985dfc5df9bd512342ea2e56af4be30cb31a F src/vdbe.h 90048aea1910f9df93e6044592bd4a466dc9c5e7 F src/vdbeInt.h 20295e482121d13437f69985f77db211cdc8bac1 F src/vdbeapi.c 6a0d7757987018ff6b1b81bc5293219cd26bb299 -F src/vdbeaux.c b4a127630ef81d5ea85346262f38aaf482ece4d9 +F src/vdbeaux.c 4c82d6f686f72ea7d266d26d528a171b728626f7 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 -F src/vdbemem.c 67b302dc6df64b4d6785881c5d22bd4f9b17739d +F src/vdbemem.c 15c5ca36201efc5a603e6eb3786e09bec08b9a64 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c c535e80259ebe616467181a83a4263555b97c694 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0816525386ac51454b7b09a507e45b6a2cb8bf6e -R aac2c97e6c3d9c60b2cdef77f1695ab5 +P 400e025e7c61efab71b891743c07a0862e5bb934 +R d6ec7bd1e825895971b1bb96fc6c1218 U drh -Z 6de6d20f4ab095b721ee46bcbe62906a +Z dd5ab0f28ac99d3509e4690cbccf7594 diff --git a/manifest.uuid b/manifest.uuid index 4307100089..8870f66ad6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -400e025e7c61efab71b891743c07a0862e5bb934 \ No newline at end of file +66d033b9c9a8c16b9a342be0b325bd85b8487c03 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 53c1d80119..e11981e16e 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1241,12 +1241,11 @@ void sqlite3VdbeEnter(Vdbe *p){ /* ** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter(). */ -void sqlite3VdbeLeave(Vdbe *p){ +static SQLITE_NOINLINE void vdbeLeave(Vdbe *p){ int i; sqlite3 *db; Db *aDb; int nDb; - if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ db = p->db; aDb = db->aDb; nDb = db->nDb; @@ -1256,6 +1255,10 @@ void sqlite3VdbeLeave(Vdbe *p){ } } } +void sqlite3VdbeLeave(Vdbe *p){ + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + vdbeLeave(p); +} #endif #if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) diff --git a/src/vdbemem.c b/src/vdbemem.c index 7f426cf196..16054ce7f9 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -946,6 +946,32 @@ int sqlite3VdbeMemSetStr( ** If this routine fails for any reason (malloc returns NULL or unable ** to read from the disk) then the pMem is left in an inconsistent state. */ +static SQLITE_NOINLINE int vdbeMemFromBtreeResize( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 offset, /* Offset from the start of data to return bytes from. */ + u32 amt, /* Number of bytes to return. */ + int key, /* If true, retrieve from the btree key, not data. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + int rc; + pMem->flags = MEM_Null; + if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){ + if( key ){ + rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); + }else{ + rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); + } + if( rc==SQLITE_OK ){ + pMem->z[amt] = 0; + pMem->z[amt+1] = 0; + pMem->flags = MEM_Blob|MEM_Term; + pMem->n = (int)amt; + }else{ + sqlite3VdbeMemRelease(pMem); + } + } + return rc; +} int sqlite3VdbeMemFromBtree( BtCursor *pCur, /* Cursor pointing at record to retrieve. */ u32 offset, /* Offset from the start of data to return bytes from. */ @@ -975,22 +1001,7 @@ int sqlite3VdbeMemFromBtree( pMem->flags = MEM_Blob|MEM_Ephem; pMem->n = (int)amt; }else{ - pMem->flags = MEM_Null; - if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){ - if( key ){ - rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); - }else{ - rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); - } - if( rc==SQLITE_OK ){ - pMem->z[amt] = 0; - pMem->z[amt+1] = 0; - pMem->flags = MEM_Blob|MEM_Term; - pMem->n = (int)amt; - }else{ - sqlite3VdbeMemRelease(pMem); - } - } + rc = vdbeMemFromBtreeResize(pCur, offset, amt, key, pMem); } return rc; From c5b41ac8ee9f322e19d6a781763da19530fbbe63 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jun 2015 02:11:46 +0000 Subject: [PATCH 33/49] Make getCellInfo() a real function instead of a macro, for a size reduction and a 0.2% performance gain. FossilOrigin-Name: 55c393ea14197ae5fa56ebca7a47e7d980511fa7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 36 ++++++++---------------------------- 3 files changed, 15 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 573ebff619..fc919c6ac0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Optimizations\sto\stwo\sVDBE\saccessory\sroutines\sfor\sa\s0.2%\sperformance\sincrease. -D 2015-06-17T01:31:28.018 +C Make\sgetCellInfo()\sa\sreal\sfunction\sinstead\sof\sa\smacro,\sfor\sa\ssize\sreduction\nand\sa\s0.2%\sperformance\sgain. +D 2015-06-17T02:11:46.631 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,7 +192,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c e557af3120ac3e5cea9680ca12688cf26b0222bc +F src/btree.c 02caf39192ed1f5c7157a1aac0b2ff23389233de F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4 F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 400e025e7c61efab71b891743c07a0862e5bb934 -R d6ec7bd1e825895971b1bb96fc6c1218 +P 66d033b9c9a8c16b9a342be0b325bd85b8487c03 +R b009f7bdded8eda946c7f086260f521c U drh -Z dd5ab0f28ac99d3509e4690cbccf7594 +Z e2dd593dbc0c1057f97a55b340af2663 diff --git a/manifest.uuid b/manifest.uuid index 8870f66ad6..ea7a1a60de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -66d033b9c9a8c16b9a342be0b325bd85b8487c03 \ No newline at end of file +55c393ea14197ae5fa56ebca7a47e7d980511fa7 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index edd0f611d2..eab5b98426 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3985,13 +3985,6 @@ int sqlite3BtreeCloseCursor(BtCursor *pCur){ ** ** BtCursor.info is a cache of the information in the current cell. ** Using this cache reduces the number of calls to btreeParseCell(). -** -** 2007-06-25: There is a bug in some versions of MSVC that cause the -** compiler to crash when getCellInfo() is implemented as a macro. -** But there is a measureable speed advantage to using the macro on gcc -** (when less compiler optimizations like -Os or -O0 are used and the -** compiler is not doing aggressive inlining.) So we use a real function -** for MSVC and a macro for everything else. Ticket #2457. */ #ifndef NDEBUG static void assertCellInfo(BtCursor *pCur){ @@ -4004,28 +3997,15 @@ int sqlite3BtreeCloseCursor(BtCursor *pCur){ #else #define assertCellInfo(x) #endif -#ifdef _MSC_VER - /* Use a real function in MSVC to work around bugs in that compiler. */ - static void getCellInfo(BtCursor *pCur){ - if( pCur->info.nSize==0 ){ - int iPage = pCur->iPage; - btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); - pCur->curFlags |= BTCF_ValidNKey; - }else{ - assertCellInfo(pCur); - } +static SQLITE_NOINLINE void getCellInfo(BtCursor *pCur){ + if( pCur->info.nSize==0 ){ + int iPage = pCur->iPage; + pCur->curFlags |= BTCF_ValidNKey; + btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); + }else{ + assertCellInfo(pCur); } -#else /* if not _MSC_VER */ - /* Use a macro in all other compilers so that the function is inlined */ -#define getCellInfo(pCur) \ - if( pCur->info.nSize==0 ){ \ - int iPage = pCur->iPage; \ - btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); \ - pCur->curFlags |= BTCF_ValidNKey; \ - }else{ \ - assertCellInfo(pCur); \ - } -#endif /* _MSC_VER */ +} #ifndef NDEBUG /* The next routine used only within assert() statements */ /* From b0870486aa7da180d8d2554b30d0e973dc99dd20 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jun 2015 13:20:54 +0000 Subject: [PATCH 34/49] Performance optimization and comment fixes for the LIKE and GLOB operators. FossilOrigin-Name: c89d772628564a808173f6f73bc1798ec714276b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/func.c | 23 ++++++++++------------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index fc919c6ac0..e12a41f4ba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sgetCellInfo()\sa\sreal\sfunction\sinstead\sof\sa\smacro,\sfor\sa\ssize\sreduction\nand\sa\s0.2%\sperformance\sgain. -D 2015-06-17T02:11:46.631 +C Performance\soptimization\sand\scomment\sfixes\sfor\sthe\sLIKE\sand\sGLOB\soperators. +D 2015-06-17T13:20:54.580 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -205,7 +205,7 @@ F src/delete.c 8857a6f27560718f65d43bdbec86c967ae1f8dfa F src/expr.c fbde754df3fa10bbd3a1dcea08e77b0f1684d188 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c9b63a217d86582c22121699a47f22f524608869 -F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6 +F src/func.c a98ea5880dc50e9ca6dd6f57079a37b9cfcdecf1 F src/global.c 4f77cadbc5427d00139ba43d0f3979804cbb700e F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 66d033b9c9a8c16b9a342be0b325bd85b8487c03 -R b009f7bdded8eda946c7f086260f521c +P 55c393ea14197ae5fa56ebca7a47e7d980511fa7 +R 1acc9fb214636b090a14b1a72649aa22 U drh -Z e2dd593dbc0c1057f97a55b340af2663 +Z f92b296584755a34dfd3307b30aabfde diff --git a/manifest.uuid b/manifest.uuid index ea7a1a60de..5a2f7d0fdb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55c393ea14197ae5fa56ebca7a47e7d980511fa7 \ No newline at end of file +c89d772628564a808173f6f73bc1798ec714276b \ No newline at end of file diff --git a/src/func.c b/src/func.c index 62abf13d4d..d0565357d5 100644 --- a/src/func.c +++ b/src/func.c @@ -575,17 +575,15 @@ struct compareInfo { /* ** For LIKE and GLOB matching on EBCDIC machines, assume that every -** character is exactly one byte in size. Also, all characters are -** able to participate in upper-case-to-lower-case mappings in EBCDIC -** whereas only characters less than 0x80 do in ASCII. +** character is exactly one byte in size. Also, provde the Utf8Read() +** macro for fast reading of the next character in the common case where +** the next character is ASCII. */ #if defined(SQLITE_EBCDIC) # define sqlite3Utf8Read(A) (*((*A)++)) -# define GlobUpperToLower(A) A = sqlite3UpperToLower[A] -# define GlobUpperToLowerAscii(A) A = sqlite3UpperToLower[A] +# define Utf8Read(A) (*(A++)) #else -# define GlobUpperToLower(A) if( A<=0x7f ){ A = sqlite3UpperToLower[A]; } -# define GlobUpperToLowerAscii(A) A = sqlite3UpperToLower[A] +# define Utf8Read(A) (A[0]<0x80?*(A++):sqlite3Utf8Read(&A)) #endif static const struct compareInfo globInfo = { '*', '?', '[', 0 }; @@ -627,7 +625,7 @@ static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; ** Ec Where E is the "esc" character and c is any other ** character, including '%', '_', and esc, match exactly c. ** -** The comments through this routine usually assume glob matching. +** The comments within this routine usually assume glob matching. ** ** This routine is usually quick, but can be N**2 in the worst case. */ @@ -651,13 +649,12 @@ static int patternCompare( */ matchOther = esc ? esc : pInfo->matchSet; - while( (c = sqlite3Utf8Read(&zPattern))!=0 ){ + while( (c = Utf8Read(zPattern))!=0 ){ if( c==matchAll ){ /* Match "*" */ /* Skip over multiple "*" characters in the pattern. If there ** are also "?" characters, skip those as well, but consume a ** single character of the input string for each "?" skipped */ - while( (c=sqlite3Utf8Read(&zPattern)) == matchAll - || c == matchOne ){ + while( (c=Utf8Read(zPattern)) == matchAll || c == matchOne ){ if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){ return 0; } @@ -702,7 +699,7 @@ static int patternCompare( if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; } }else{ - while( (c2 = sqlite3Utf8Read(&zString))!=0 ){ + while( (c2 = Utf8Read(zString))!=0 ){ if( c2!=c ) continue; if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; } @@ -748,7 +745,7 @@ static int patternCompare( continue; } } - c2 = sqlite3Utf8Read(&zString); + c2 = Utf8Read(zString); if( c==c2 ) continue; if( noCase && c<0x80 && c2<0x80 && sqlite3Tolower(c)==sqlite3Tolower(c2) ){ continue; From bbe031f9f1260fd97622cfd47dbdf5377daee6b2 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jun 2015 17:08:22 +0000 Subject: [PATCH 35/49] Fix a uninitialized variable use in the command-line shell when the ".open" command is invoked without any arguments. FossilOrigin-Name: fc4f4d1eccec2e09b5d2e6c4da082204f4d5a016 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index e12a41f4ba..92201cad16 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sand\scomment\sfixes\sfor\sthe\sLIKE\sand\sGLOB\soperators. -D 2015-06-17T13:20:54.580 +C Fix\sa\suninitialized\svariable\suse\sin\sthe\scommand-line\sshell\swhen\sthe\n".open"\scommand\sis\sinvoked\swithout\sany\sarguments. +D 2015-06-17T17:08:22.680 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -251,7 +251,7 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d -F src/shell.c ae5c3985a6d2173563f37a459f8e68fd6eaad4f4 +F src/shell.c 69c9ca4dba7a33dc70a1bc46ee3ddd70449e969a F src/sqlite.h.in 76d2f5637eb795b6300d9dd3c3ec3632ffafd721 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h be1a718b7d2ce40ceba725ae92c8eb5f18003066 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 55c393ea14197ae5fa56ebca7a47e7d980511fa7 -R 1acc9fb214636b090a14b1a72649aa22 +P c89d772628564a808173f6f73bc1798ec714276b +R 2be138dcb45d5c718e3a818150a1ac69 U drh -Z f92b296584755a34dfd3307b30aabfde +Z 1c763b619a4c5a5f5f6d672aa5693e42 diff --git a/manifest.uuid b/manifest.uuid index 5a2f7d0fdb..84708615a5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c89d772628564a808173f6f73bc1798ec714276b \ No newline at end of file +fc4f4d1eccec2e09b5d2e6c4da082204f4d5a016 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 402e9389d3..ef3f73d38a 100644 --- a/src/shell.c +++ b/src/shell.c @@ -3354,9 +3354,8 @@ static int do_meta_command(char *zLine, ShellState *p){ const char *zSavedFilename = p->zDbFilename; char *zNewFilename = 0; p->db = 0; - if( nArg>=2 ){ - p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]); - } + if( nArg>=2 ) zNewFilename = sqlite3_mprintf("%s", azArg[1]); + p->zDbFilename = zNewFilename; open_db(p, 1); if( p->db!=0 ){ sqlite3_close(savedDb); From 00452196d86f5a53063c9159b8825b7821ff6a4c Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jun 2015 18:24:40 +0000 Subject: [PATCH 36/49] Improved comments on the fuzzcheck.c test program. No changes to code. FossilOrigin-Name: a7e27d19280048bcfff6d2e796eed72287b9dabe --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 44 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 92201cad16..c4288ba45b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\suninitialized\svariable\suse\sin\sthe\scommand-line\sshell\swhen\sthe\n".open"\scommand\sis\sinvoked\swithout\sany\sarguments. -D 2015-06-17T17:08:22.680 +C Improved\scomments\son\sthe\sfuzzcheck.c\stest\sprogram.\s\sNo\schanges\sto\scode. +D 2015-06-17T18:24:40.654 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -657,7 +657,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test efd384b896c647b61a2c1848ba70d42aad60a7b3 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c a60f926e3fa86c8d33908406d75eec868c22b9ca +F test/fuzzcheck.c 5805b2236292f8643d56e727a3a6e4d88e0856a5 F test/fuzzdata1.db b60254eeb6bc11474071b883059662a73c48da7f F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db f4ca6fa92973501cec63ac5d1992ef88f6a78e7f @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c89d772628564a808173f6f73bc1798ec714276b -R 2be138dcb45d5c718e3a818150a1ac69 +P fc4f4d1eccec2e09b5d2e6c4da082204f4d5a016 +R c899e9b20cb2a89272908946dedc2b9a U drh -Z 1c763b619a4c5a5f5f6d672aa5693e42 +Z 2e60edd59a1d27a41fd4904a20b823dc diff --git a/manifest.uuid b/manifest.uuid index 84708615a5..d97621c54a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fc4f4d1eccec2e09b5d2e6c4da082204f4d5a016 \ No newline at end of file +a7e27d19280048bcfff6d2e796eed72287b9dabe \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 6dc2a6e7fb..f637e6463c 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -10,8 +10,8 @@ ** ************************************************************************* ** -** This is a utility program designed to aid running regressions tests -** on SQLite library using data from an external fuzzer, such as American +** This is a utility program designed to aid running regressions tests on +** the SQLite library using data from an external fuzzer, such as American ** Fuzzy Lop (AFL) (http://lcamtuf.coredump.cx/afl/). ** ** This program reads content from an SQLite database file with the following @@ -25,16 +25,44 @@ ** sqlid INTEGER PRIMARY KEY, -- SQL script id ** sqltext TEXT -- Text of SQL statements to run ** ); +** CREATE TABLE IF NOT EXISTS readme( +** msg TEXT -- Human-readable description of this test collection +** ); ** ** For each database file in the DB table, the SQL text in the XSQL table -** is run against that database. This program is looking for crashes, -** assertion faults, and/or memory leaks. No attempt is made to verify -** the output. The assumption is that either all of the database files -** or all of the SQL statements are malformed inputs, generated by a fuzzer, -** that need to be checked to make sure they do not present a security risk. +** is run against that database. All README.MSG values are printed prior +** to the start of the test (unless the --quiet option is used). If the +** DB table is empty, then all entries in XSQL are run against an empty +** in-memory database. +** +** This program is looking for crashes, assertion faults, and/or memory leaks. +** No attempt is made to verify the output. The assumption is that either all +** of the database files or all of the SQL statements are malformed inputs, +** generated by a fuzzer, that need to be checked to make sure they do not +** present a security risk. ** ** This program also includes some command-line options to help with -** creation and maintenance of the source content database. +** creation and maintenance of the source content database. The command +** +** ./fuzzcheck database.db --load-sql FILE... +** +** Loads all FILE... arguments into the XSQL table. The --load-db option +** works the same but loads the files into the DB table. The -m option can +** be used to initialize the README table. The "database.db" file is created +** if it does not previously exist. Example: +** +** ./fuzzcheck new.db --load-sql *.sql +** ./fuzzcheck new.db --load-db *.db +** ./fuzzcheck new.db -m 'New test cases' +** +** The three commands above will create the "new.db" file and initialize all +** tables. Then do "./fuzzcheck new.db" to run the tests. +** +** DEBUGGING HINTS: +** +** If fuzzcheck does crash, it can be run in the debugger and the content +** of the global variable g.zTextName[] will identify the specific XSQL and +** DB values that were running when the crash occurred. */ #include #include From 073664de88b6ab42a5f9d99b88a01fb9662ff321 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 17 Jun 2015 18:57:37 +0000 Subject: [PATCH 37/49] Improve spacing and comment style for the shell. No changes to code. FossilOrigin-Name: 5b547da00d131a494a6b348339af3d91dfa6e3b6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c | 38 ++++++++++++++++++-------------------- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index c4288ba45b..5bc880ee3d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomments\son\sthe\sfuzzcheck.c\stest\sprogram.\s\sNo\schanges\sto\scode. -D 2015-06-17T18:24:40.654 +C Improve\sspacing\sand\scomment\sstyle\sfor\sthe\sshell.\s\sNo\schanges\sto\scode. +D 2015-06-17T18:57:37.637 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -251,7 +251,7 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d -F src/shell.c 69c9ca4dba7a33dc70a1bc46ee3ddd70449e969a +F src/shell.c 8af3cced094aebb5f57a8ad739b9dafc7867eed7 F src/sqlite.h.in 76d2f5637eb795b6300d9dd3c3ec3632ffafd721 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h be1a718b7d2ce40ceba725ae92c8eb5f18003066 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fc4f4d1eccec2e09b5d2e6c4da082204f4d5a016 -R c899e9b20cb2a89272908946dedc2b9a -U drh -Z 2e60edd59a1d27a41fd4904a20b823dc +P a7e27d19280048bcfff6d2e796eed72287b9dabe +R 10ec64cfc3a208bfe24294966a7ab6ac +U mistachkin +Z 7cf2fc34937c3a0e66c014198502d58b diff --git a/manifest.uuid b/manifest.uuid index d97621c54a..27a46f6c68 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7e27d19280048bcfff6d2e796eed72287b9dabe \ No newline at end of file +5b547da00d131a494a6b348339af3d91dfa6e3b6 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index ef3f73d38a..d097e913a3 100644 --- a/src/shell.c +++ b/src/shell.c @@ -101,28 +101,26 @@ #if defined(_WIN32) || defined(WIN32) # include # include -#define isatty(h) _isatty(h) -#ifndef access -# define access(f,m) _access((f),(m)) -#endif -#undef popen -#define popen _popen -#undef pclose -#define pclose _pclose +# define isatty(h) _isatty(h) +# ifndef access +# define access(f,m) _access((f),(m)) +# endif +# undef popen +# define popen _popen +# undef pclose +# define pclose _pclose #else -/* Make sure isatty() has a prototype. -*/ -extern int isatty(int); - -#if !defined(__RTP__) && !defined(_WRS_KERNEL) - /* popen and pclose are not C89 functions and so are sometimes omitted from - ** the header */ - extern FILE *popen(const char*,const char*); - extern int pclose(FILE*); -#else -# define SQLITE_OMIT_POPEN 1 -#endif + /* Make sure isatty() has a prototype. */ + extern int isatty(int); +# if !defined(__RTP__) && !defined(_WRS_KERNEL) + /* popen and pclose are not C89 functions and so are + ** sometimes omitted from the header */ + extern FILE *popen(const char*,const char*); + extern int pclose(FILE*); +# else +# define SQLITE_OMIT_POPEN 1 +# endif #endif #if defined(_WIN32_WCE) From 14e067455e2b2dcd0a59c2370a2ea81a0c5f7750 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jun 2015 23:28:03 +0000 Subject: [PATCH 38/49] Performance improvement in sqlite3VdbeMemShallowCopy() for the common case where the receiver does not require prior resource deallocation. FossilOrigin-Name: d718ea36dce8cf1684c8bcda457fee87f8f8c4e2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbemem.c | 7 ++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5bc880ee3d..45aee8c584 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sspacing\sand\scomment\sstyle\sfor\sthe\sshell.\s\sNo\schanges\sto\scode. -D 2015-06-17T18:57:37.637 +C Performance\simprovement\sin\ssqlite3VdbeMemShallowCopy()\sfor\sthe\scommon\ncase\swhere\sthe\sreceiver\sdoes\snot\srequire\sprior\sresource\sdeallocation. +D 2015-06-17T23:28:03.205 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -319,7 +319,7 @@ F src/vdbeInt.h 20295e482121d13437f69985f77db211cdc8bac1 F src/vdbeapi.c 6a0d7757987018ff6b1b81bc5293219cd26bb299 F src/vdbeaux.c 4c82d6f686f72ea7d266d26d528a171b728626f7 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 -F src/vdbemem.c 15c5ca36201efc5a603e6eb3786e09bec08b9a64 +F src/vdbemem.c 4e947cd322bb531e3f7f6f58f0f536d182b38ef8 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c c535e80259ebe616467181a83a4263555b97c694 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a7e27d19280048bcfff6d2e796eed72287b9dabe -R 10ec64cfc3a208bfe24294966a7ab6ac -U mistachkin -Z 7cf2fc34937c3a0e66c014198502d58b +P 5b547da00d131a494a6b348339af3d91dfa6e3b6 +R 8b11dda5b48978322f8411a0ee077b21 +U drh +Z c4d66c4cd049a599b9f894238778087c diff --git a/manifest.uuid b/manifest.uuid index 27a46f6c68..010a1bbb97 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b547da00d131a494a6b348339af3d91dfa6e3b6 \ No newline at end of file +d718ea36dce8cf1684c8bcda457fee87f8f8c4e2 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 16054ce7f9..1076812609 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -777,10 +777,15 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ ** pFrom->z is used, then pTo->z points to the same thing as pFrom->z ** and flags gets srcType (either MEM_Ephem or MEM_Static). */ +static SQLITE_NOINLINE void vdbeClrCopy(Mem *pTo, const Mem *pFrom, int eType){ + vdbeMemClearExternAndSetNull(pTo); + assert( !VdbeMemDynamic(pTo) ); + sqlite3VdbeMemShallowCopy(pTo, pFrom, eType); +} void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ assert( (pFrom->flags & MEM_RowSet)==0 ); assert( pTo->db==pFrom->db ); - if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); + if( VdbeMemDynamic(pTo) ){ vdbeClrCopy(pTo,pFrom,srcType); return; } memcpy(pTo, pFrom, MEMCELLSIZE); if( (pFrom->flags&MEM_Static)==0 ){ pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem); From 5995e292e6ba7be06fd7810eb8f5e4d3928feb11 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 18 Jun 2015 12:37:32 +0000 Subject: [PATCH 39/49] Add #ifdefs to some features speedtest1.c so that it compiles with older versions of SQLite, going back to version 3.5.1. FossilOrigin-Name: f50dd154d33c58d7a9aa1852fdc362c2e81feef2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 13 +++++++++++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 45aee8c584..890f783f44 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovement\sin\ssqlite3VdbeMemShallowCopy()\sfor\sthe\scommon\ncase\swhere\sthe\sreceiver\sdoes\snot\srequire\sprior\sresource\sdeallocation. -D 2015-06-17T23:28:03.205 +C Add\s#ifdefs\sto\ssome\sfeatures\sspeedtest1.c\sso\sthat\sit\scompiles\swith\s\nolder\sversions\sof\sSQLite,\sgoing\sback\sto\sversion\s3.5.1. +D 2015-06-18T12:37:32.427 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -928,7 +928,7 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c 9f1b745c24886cced3f70ffc666300152a39013c +F test/speedtest1.c 613e7f6064123068049ffd9b74a60b3c8d51e8ab F test/spellfix.test 24f676831acddd2f4056a598fd731a72c6311f49 F test/sqldiff1.test 8f6bc7c6a5b3585d350d779c6078869ba402f8f5 F test/sqllimits1.test e05786eaed7950ff6a2d00031d001d8a26131e68 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5b547da00d131a494a6b348339af3d91dfa6e3b6 -R 8b11dda5b48978322f8411a0ee077b21 +P d718ea36dce8cf1684c8bcda457fee87f8f8c4e2 +R 2fec93a2150d7ae7b09d15812bf76e79 U drh -Z c4d66c4cd049a599b9f894238778087c +Z 189f0c4fbb00b22a5016916932c6c3ba diff --git a/manifest.uuid b/manifest.uuid index 010a1bbb97..7f96939a8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d718ea36dce8cf1684c8bcda457fee87f8f8c4e2 \ No newline at end of file +f50dd154d33c58d7a9aa1852fdc362c2e81feef2 \ No newline at end of file diff --git a/test/speedtest1.c b/test/speedtest1.c index 8f3f579557..9a90f5b6ff 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -306,7 +306,7 @@ static void printSql(const char *zSql){ if( g.bExplain ) printf("EXPLAIN "); printf("%.*s;\n", n, zSql); if( g.bExplain -#if SQLITE_VERSION_NUMBER>=3007010 +#if SQLITE_VERSION_NUMBER>=3007017 && ( sqlite3_strglob("CREATE *", zSql)==0 || sqlite3_strglob("DROP *", zSql)==0 || sqlite3_strglob("ALTER *", zSql)==0 @@ -374,12 +374,15 @@ void speedtest1_run(void){ } } } +#if SQLITE_VERSION_NUMBER>=3006001 if( g.bReprepare ){ sqlite3_stmt *pNew; sqlite3_prepare_v2(g.db, sqlite3_sql(g.pStmt), -1, &pNew, 0); sqlite3_finalize(g.pStmt); g.pStmt = pNew; - }else{ + }else +#endif + { sqlite3_reset(g.pStmt); } } @@ -1273,6 +1276,7 @@ int main(int argc, char **argv){ fatal_error(zHelp, argv[0]); } #endif +#if SQLITE_VERSION_NUMBER>=3006001 if( nHeap>0 ){ pHeap = malloc( nHeap ); if( pHeap==0 ) fatal_error("cannot allocate %d-byte heap\n", nHeap); @@ -1296,16 +1300,19 @@ int main(int argc, char **argv){ if( nLook>0 ){ sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 0, 0); } +#endif /* Open the database and the input file */ if( sqlite3_open(zDbName, &g.db) ){ fatal_error("Cannot open database file: %s\n", zDbName); } +#if SQLITE_VERSION_NUMBER>=3006001 if( nLook>0 && szLook>0 ){ pLook = malloc( nLook*szLook ); rc = sqlite3_db_config(g.db, SQLITE_DBCONFIG_LOOKASIDE, pLook, szLook,nLook); if( rc ) fatal_error("lookaside configuration failed: %d\n", rc); } +#endif /* Set database connection options */ sqlite3_create_function(g.db, "random", 0, SQLITE_UTF8, 0, randomFunc, 0, 0); @@ -1387,6 +1394,7 @@ int main(int argc, char **argv){ sqlite3_close(g.db); +#if SQLITE_VERSION_NUMBER>=3006001 /* Global memory usage statistics printed after the database connection ** has closed. Memory usage should be zero at this point. */ if( showStats ){ @@ -1407,6 +1415,7 @@ int main(int argc, char **argv){ sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHi, 0); printf("-- Largest Scratch Allocation: %d bytes\n", iHi); } +#endif /* Release memory */ free( pLook ); From b3d903ebe52b14a0b433ad6d0e615ada1cae9c19 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 18 Jun 2015 14:09:13 +0000 Subject: [PATCH 40/49] Show the values of Expr.flag in the AST of ".selecttrace" FossilOrigin-Name: a84d1004cbee67f2b8ba1fd201e43af49ea67c1b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 20 +++++++++++++------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 890f783f44..213216a122 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s#ifdefs\sto\ssome\sfeatures\sspeedtest1.c\sso\sthat\sit\scompiles\swith\s\nolder\sversions\sof\sSQLite,\sgoing\sback\sto\sversion\s3.5.1. -D 2015-06-18T12:37:32.427 +C Show\sthe\svalues\sof\sExpr.flag\sin\sthe\sAST\sof\s".selecttrace" +D 2015-06-18T14:09:13.947 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -307,7 +307,7 @@ F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 6bbcc9fe50c917864d48287b4792d46d6e873481 F src/tokenize.c 57cb3720f53f84d811def2069c2b169b6be539a5 -F src/treeview.c 84aa2d2ed26627ccc8dd3a2becfa18dc86ee4607 +F src/treeview.c c84b1a8ebc7f1d00cd76ce4958eeb3ae1021beed F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d718ea36dce8cf1684c8bcda457fee87f8f8c4e2 -R 2fec93a2150d7ae7b09d15812bf76e79 +P f50dd154d33c58d7a9aa1852fdc362c2e81feef2 +R 22636f96e0a5b958f11aa19ecbc51e6e U drh -Z 189f0c4fbb00b22a5016916932c6c3ba +Z bfca8d78599e0b1cd1fa7858d0e8d79f diff --git a/manifest.uuid b/manifest.uuid index 7f96939a8e..93fb06574d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f50dd154d33c58d7a9aa1852fdc362c2e81feef2 \ No newline at end of file +a84d1004cbee67f2b8ba1fd201e43af49ea67c1b \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 7b63c884e7..83bed664df 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -178,25 +178,31 @@ void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ const char *zBinOp = 0; /* Binary operator */ const char *zUniOp = 0; /* Unary operator */ + char zFlgs[30]; pView = sqlite3TreeViewPush(pView, moreToFollow); if( pExpr==0 ){ sqlite3TreeViewLine(pView, "nil"); sqlite3TreeViewPop(pView); return; } + if( pExpr->flags ){ + sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x",pExpr->flags); + }else{ + zFlgs[0] = 0; + } switch( pExpr->op ){ case TK_AGG_COLUMN: { - sqlite3TreeViewLine(pView, "AGG{%d:%d}", - pExpr->iTable, pExpr->iColumn); + sqlite3TreeViewLine(pView, "AGG{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); break; } case TK_COLUMN: { if( pExpr->iTable<0 ){ /* This only happens when coding check constraints */ - sqlite3TreeViewLine(pView, "COLUMN(%d)", pExpr->iColumn); + sqlite3TreeViewLine(pView, "COLUMN(%d)%s", pExpr->iColumn, zFlgs); }else{ - sqlite3TreeViewLine(pView, "{%d:%d}", - pExpr->iTable, pExpr->iColumn); + sqlite3TreeViewLine(pView, "{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); } break; } @@ -389,11 +395,11 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ } } if( zBinOp ){ - sqlite3TreeViewLine(pView, "%s", zBinOp); + sqlite3TreeViewLine(pView, "%s%s", zBinOp, zFlgs); sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); sqlite3TreeViewExpr(pView, pExpr->pRight, 0); }else if( zUniOp ){ - sqlite3TreeViewLine(pView, "%s", zUniOp); + sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); } sqlite3TreeViewPop(pView); From 606f2344e961b057fe291551a328666b9a35ea9d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 18 Jun 2015 14:32:51 +0000 Subject: [PATCH 41/49] Pervent the likelihood() function from moving ON clause terms of a LEFT JOIN into the WHERE clause. Fix for ticket [5f60b11fc8e23490e2] FossilOrigin-Name: ed96e14adce4a4f94cc6838c46bc97937c4cb72a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 6 ++++++ test/whereG.test | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 213216a122..4565c70b63 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Show\sthe\svalues\sof\sExpr.flag\sin\sthe\sAST\sof\s".selecttrace" -D 2015-06-18T14:09:13.947 +C Pervent\sthe\slikelihood()\sfunction\sfrom\smoving\sON\sclause\sterms\sof\sa\sLEFT\sJOIN\ninto\sthe\sWHERE\sclause.\nFix\sfor\sticket\s[5f60b11fc8e23490e2] +D 2015-06-18T14:32:51.732 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -250,7 +250,7 @@ F src/printf.c db11b5960105ee661dcac690f2ae6276e49bf251 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 84c571794e3ee5806274d95158a4c0177c6c4708 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 45a814a755f90c1a6345164d2da4a8ef293da53d +F src/select.c 15a17aff39e161d97deb880edc7e0527f01b2324 F src/shell.c 8af3cced094aebb5f57a8ad739b9dafc7867eed7 F src/sqlite.h.in 76d2f5637eb795b6300d9dd3c3ec3632ffafd721 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1209,7 +1209,7 @@ F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 F test/whereD.test 9eba1f9b18e5b19a0b0bcaae5e8c037260195f2b F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f F test/whereF.test 5b2ba0dbe8074aa13e416b37c753991f0a2492d7 -F test/whereG.test 69f5ec4b15760a8c860f80e2d55525669390aab3 +F test/whereG.test a9fa7c84d7050b5a86a9ef94d343986d0b52ada1 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 F test/whereI.test 1d89199697919d4930be05a71e7fe620f114e622 F test/whereJ.test 55a3221706a7ab706293f17cc8f96da563bf0767 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f50dd154d33c58d7a9aa1852fdc362c2e81feef2 -R 22636f96e0a5b958f11aa19ecbc51e6e +P a84d1004cbee67f2b8ba1fd201e43af49ea67c1b +R 530ba24618abbbf122ded3eb71849514 U drh -Z bfca8d78599e0b1cd1fa7858d0e8d79f +Z 790eb5c98101c017e4fe81f6e31f872f diff --git a/manifest.uuid b/manifest.uuid index 93fb06574d..4391ae8b19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a84d1004cbee67f2b8ba1fd201e43af49ea67c1b \ No newline at end of file +ed96e14adce4a4f94cc6838c46bc97937c4cb72a \ No newline at end of file diff --git a/src/select.c b/src/select.c index f030d2f4a4..e24b93b4b8 100644 --- a/src/select.c +++ b/src/select.c @@ -366,6 +366,12 @@ static void setJoinExpr(Expr *p, int iTable){ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); p->iRightJoinTable = (i16)iTable; + if( p->op==TK_FUNCTION && p->x.pList ){ + int i; + for(i=0; ix.pList->nExpr; i++){ + setJoinExpr(p->x.pList->a[i].pExpr, iTable); + } + } setJoinExpr(p->pLeft, iTable); p = p->pRight; } diff --git a/test/whereG.test b/test/whereG.test index c2c54db455..81416e1424 100644 --- a/test/whereG.test +++ b/test/whereG.test @@ -230,4 +230,19 @@ do_eqp_test 5.3.3 { SELECT * FROM t1 WHERE likely(a=?) } {0 0 0 {SCAN TABLE t1}} +# 2015-06-18 +# Ticket [https://www.sqlite.org/see/tktview/472f0742a1868fb58862bc588ed70] +# +do_execsql_test 6.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(i int, x, y, z); + INSERT INTO t1 VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3), (4,4,4,4); + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(i int, bool char); + INSERT INTO t2 VALUES(1,'T'), (2,'F'); + SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.i=t2.i AND bool='T'; + SELECT count(*) FROM t1 LEFT JOIN t2 ON likely(t1.i=t2.i) AND bool='T'; +} {4 4} + + finish_test From 4307690b5cdbe17e152e21a8f2ddf2c66eaf9c93 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 18 Jun 2015 15:26:09 +0000 Subject: [PATCH 42/49] Further #ifdef changes in speedtest1.c in order to support SQLite back to version 3.3.9 and perhaps even earlier. FossilOrigin-Name: 9246eca54adaee571dab0c066afaa604fcf9c44f --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 7 +++++++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4565c70b63..806cfda95a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Pervent\sthe\slikelihood()\sfunction\sfrom\smoving\sON\sclause\sterms\sof\sa\sLEFT\sJOIN\ninto\sthe\sWHERE\sclause.\nFix\sfor\sticket\s[5f60b11fc8e23490e2] -D 2015-06-18T14:32:51.732 +C Further\s#ifdef\schanges\sin\sspeedtest1.c\sin\sorder\sto\ssupport\sSQLite\sback\sto\nversion\s3.3.9\sand\sperhaps\seven\searlier. +D 2015-06-18T15:26:09.205 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -928,7 +928,7 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c 613e7f6064123068049ffd9b74a60b3c8d51e8ab +F test/speedtest1.c f42fd04a34a0c1dc289cbe536ef62d706227a736 F test/spellfix.test 24f676831acddd2f4056a598fd731a72c6311f49 F test/sqldiff1.test 8f6bc7c6a5b3585d350d779c6078869ba402f8f5 F test/sqllimits1.test e05786eaed7950ff6a2d00031d001d8a26131e68 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a84d1004cbee67f2b8ba1fd201e43af49ea67c1b -R 530ba24618abbbf122ded3eb71849514 +P ed96e14adce4a4f94cc6838c46bc97937c4cb72a +R 4e77e4d1b1f5f9af9315f930f1585b67 U drh -Z 790eb5c98101c017e4fe81f6e31f872f +Z 4a2d5290228b5807450e51ccee479c2e diff --git a/manifest.uuid b/manifest.uuid index 4391ae8b19..e752e4c060 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed96e14adce4a4f94cc6838c46bc97937c4cb72a \ No newline at end of file +9246eca54adaee571dab0c066afaa604fcf9c44f \ No newline at end of file diff --git a/test/speedtest1.c b/test/speedtest1.c index 9a90f5b6ff..db343d81ff 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -43,6 +43,9 @@ static const char zHelp[] = #include #include +#if SQLITE_VERSION_NUMBER<3005000 +# define sqlite3_int64 sqlite_int64 +#endif #ifdef SQLITE_ENABLE_OTA # include "sqlite3ota.h" #endif @@ -143,6 +146,9 @@ static int integerValue(const char *zArg){ /* Return the current wall-clock time, in milliseconds */ sqlite3_int64 speedtest1_timestamp(void){ +#if SQLITE_VERSION_NUMBER<3005000 + return 0; +#else static sqlite3_vfs *clockVfs = 0; sqlite3_int64 t; if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); @@ -157,6 +163,7 @@ sqlite3_int64 speedtest1_timestamp(void){ t = (sqlite3_int64)(r*86400000.0); } return t; +#endif } /* Return a pseudo-random unsigned integer */ From 25ada07ab405348bdb7398afcd71e72d59a1043c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jun 2015 15:07:14 +0000 Subject: [PATCH 43/49] Make cellSizePtr() a method on the MemPage object, with alternative implementations depending on the page type. This results is a small performance improvement and size reduction. FossilOrigin-Name: 02f7e9d7d7b93d0b6bbd6cc0d0359b3b741b9931 --- manifest | 14 +++++----- manifest.uuid | 2 +- src/btree.c | 73 ++++++++++++++++++++++++++++++++++---------------- src/btreeInt.h | 1 + 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 806cfda95a..64a9e9fb2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\s#ifdef\schanges\sin\sspeedtest1.c\sin\sorder\sto\ssupport\sSQLite\sback\sto\nversion\s3.3.9\sand\sperhaps\seven\searlier. -D 2015-06-18T15:26:09.205 +C Make\scellSizePtr()\sa\smethod\son\sthe\sMemPage\sobject,\swith\salternative\nimplementations\sdepending\son\sthe\spage\stype.\s\sThis\sresults\sis\sa\ssmall\sperformance\nimprovement\sand\ssize\sreduction. +D 2015-06-19T15:07:14.566 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,9 +192,9 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 02caf39192ed1f5c7157a1aac0b2ff23389233de +F src/btree.c 960e66f4a9fd494c5712f4342432a2fb1cbb72c1 F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 -F src/btreeInt.h 973a22a6fd61350b454ad614832b1f0a5e25a1e4 +F src/btreeInt.h 97901d5434a22344cd5ae47e80ed677bd21d572d F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ed96e14adce4a4f94cc6838c46bc97937c4cb72a -R 4e77e4d1b1f5f9af9315f930f1585b67 +P 9246eca54adaee571dab0c066afaa604fcf9c44f +R 65525ba5a493bb8d3d370265d6f2abe8 U drh -Z 4a2d5290228b5807450e51ccee479c2e +Z b80278f806bcab0592c2162609b43f46 diff --git a/manifest.uuid b/manifest.uuid index e752e4c060..69d741e4be 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9246eca54adaee571dab0c066afaa604fcf9c44f \ No newline at end of file +02f7e9d7d7b93d0b6bbd6cc0d0359b3b741b9931 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index eab5b98426..9260b3a910 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1065,6 +1065,11 @@ static void btreeParseCell( ** data area of the btree-page. The return number includes the cell ** data header and the local payload, but not any overflow page or ** the space used by the cell pointer. +** +** The first implementation, cellSizePtr(), handles pages that contain +** payload, which is to say all index pages and left table pages. The +** second cellSizePtrNoPayload() implemention is a high-speed version +** for pages that contain no payload - internal table pages. */ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ @@ -1080,12 +1085,7 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ btreeParseCellPtr(pPage, pCell, &debuginfo); #endif - if( pPage->noPayload ){ - pEnd = &pIter[9]; - while( (*pIter++)&0x80 && pIterchildPtrSize==4 ); - return (u16)(pIter - pCell); - } + assert( pPage->noPayload==0 ); nSize = *pIter; if( nSize>=0x80 ){ pEnd = &pIter[9]; @@ -1120,12 +1120,32 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ assert( nSize==debuginfo.nSize || CORRUPT_DB ); return (u16)nSize; } +static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + 4; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + btreeParseCellPtr(pPage, pCell, &debuginfo); +#endif + + assert( pPage->childPtrSize==4 ); + pEnd = pIter + 9; + while( (*pIter++)&0x80 && pIterxCellSize(pPage, findCell(pPage, iCell)); } #endif @@ -1203,7 +1223,7 @@ static int defragmentPage(MemPage *pPage){ return SQLITE_CORRUPT_BKPT; } assert( pc>=iCellFirst && pc<=iCellLast ); - size = cellSizePtr(pPage, &src[pc]); + size = pPage->xCellSize(pPage, &src[pc]); cbrk -= size; if( cbrkusableSize ){ return SQLITE_CORRUPT_BKPT; @@ -1507,6 +1527,7 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); flagByte &= ~PTF_LEAF; pPage->childPtrSize = 4-4*pPage->leaf; + pPage->xCellSize = cellSizePtr; pBt = pPage->pBt; if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ /* EVIDENCE-OF: R-03640-13415 A value of 5 means the page is an interior @@ -1516,8 +1537,14 @@ static int decodeFlags(MemPage *pPage, int flagByte){ ** table b-tree page. */ assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 ); pPage->intKey = 1; - pPage->intKeyLeaf = pPage->leaf; - pPage->noPayload = !pPage->leaf; + if( pPage->leaf ){ + pPage->intKeyLeaf = 1; + pPage->noPayload = 0; + }else{ + pPage->intKeyLeaf = 0; + pPage->noPayload = 1; + pPage->xCellSize = cellSizePtrNoPayload; + } pPage->maxLocal = pBt->maxLeaf; pPage->minLocal = pBt->minLeaf; }else if( flagByte==PTF_ZERODATA ){ @@ -1624,7 +1651,7 @@ static int btreeInitPage(MemPage *pPage){ if( pciCellLast ){ return SQLITE_CORRUPT_BKPT; } - sz = cellSizePtr(pPage, &data[pc]); + sz = pPage->xCellSize(pPage, &data[pc]); testcase( pc+sz==usableSize ); if( pc+sz>usableSize ){ return SQLITE_CORRUPT_BKPT; @@ -6096,7 +6123,7 @@ static void insertCell( ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size ** might be less than 8 (leaf-size + pointer) on the interior node. Hence ** the term after the || in the following assert(). */ - assert( sz==cellSizePtr(pPage, pCell) || (sz==8 && iChild>0) ); + assert( sz==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ memcpy(pTemp, pCell, sz); @@ -6187,8 +6214,8 @@ static void rebuildPage( memcpy(pData, pCell, szCell[i]); put2byte(pCellptr, (pData - aData)); pCellptr += 2; - assert( szCell[i]==cellSizePtr(pPg, pCell) || CORRUPT_DB ); - testcase( szCell[i]==cellSizePtr(pPg,pCell) ); + assert( szCell[i]==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( szCell[i]==pPg->xCellSize(pPg,pCell) ); } /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ @@ -6478,7 +6505,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ u8 *pOut = &pSpace[4]; u8 *pCell = pPage->apOvfl[0]; - u16 szCell = cellSizePtr(pPage, pCell); + u16 szCell = pPage->xCellSize(pPage, pCell); u8 *pStop; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); @@ -6784,12 +6811,12 @@ static int balance_nonroot( if( i+nxDiv==pParent->aiOvfl[0] && pParent->nOverflow ){ apDiv[i] = pParent->apOvfl[0]; pgno = get4byte(apDiv[i]); - szNew[i] = cellSizePtr(pParent, apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); pParent->nOverflow = 0; }else{ apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow); pgno = get4byte(apDiv[i]); - szNew[i] = cellSizePtr(pParent, apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); /* Drop the cell from the parent page. apDiv[i] still points to ** the cell within the parent, even though it has been dropped. @@ -6879,7 +6906,7 @@ static int balance_nonroot( for(j=0; jxCellSize(pOld, apCell[nCell]); nCell++; } }else{ @@ -6889,7 +6916,7 @@ static int balance_nonroot( for(j=0; jxCellSize(pOld, apCell[nCell]); nCell++; } } @@ -7207,7 +7234,7 @@ static int balance_nonroot( */ if( szCell[j]==4 ){ assert(leafCorrection==4); - sz = cellSizePtr(pParent, pCell); + sz = pParent->xCellSize(pParent, pCell); } } iOvflSpace += sz; @@ -7652,7 +7679,7 @@ int sqlite3BtreeInsert( assert( newCell!=0 ); rc = fillInCell(pPage, newCell, pKey, nKey, pData, nData, nZero, &szNew); if( rc ) goto end_insert; - assert( szNew==cellSizePtr(pPage, newCell) ); + assert( szNew==pPage->xCellSize(pPage, newCell) ); assert( szNew <= MX_CELL_SIZE(pBt) ); idx = pCur->aiIdx[pCur->iPage]; if( loc==0 ){ @@ -7794,7 +7821,7 @@ int sqlite3BtreeDelete(BtCursor *pCur){ pCell = findCell(pLeaf, pLeaf->nCell-1); if( pCell<&pLeaf->aData[4] ) return SQLITE_CORRUPT_BKPT; - nCell = cellSizePtr(pLeaf, pCell); + nCell = pLeaf->xCellSize(pLeaf, pCell); assert( MX_CELL_SIZE(pBt) >= nCell ); pTmp = pBt->pTmpSpace; assert( pTmp!=0 ); @@ -8806,7 +8833,7 @@ static int checkTreePage( int pc = get2byte(&data[cellStart+i*2]); u32 size = 65536; if( pc<=usableSize-4 ){ - size = cellSizePtr(pPage, &data[pc]); + size = pPage->xCellSize(pPage, &data[pc]); } if( (int)(pc+size-1)>=usableSize ){ pCheck->zPfx = 0; diff --git a/src/btreeInt.h b/src/btreeInt.h index 33ef641059..6c03a98644 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -295,6 +295,7 @@ struct MemPage { u8 *aDataEnd; /* One byte past the end of usable data */ u8 *aCellIdx; /* The cell index area */ DbPage *pDbPage; /* Pager page handle */ + u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ Pgno pgno; /* Page number for this page */ }; From 5fa605142fc687e2fb636981b475a33a29fd178a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jun 2015 17:19:34 +0000 Subject: [PATCH 44/49] Add the MemPage.xParseCell method and provide various implementations (variations on the former btreeParseCellPtr()) depending on the page type. FossilOrigin-Name: 41d03d883c4f7ca279eb9dd679f3ab81c8d957d9 --- manifest | 14 ++-- manifest.uuid | 2 +- src/btree.c | 190 +++++++++++++++++++++++++++++++++---------------- src/btreeInt.h | 5 +- 4 files changed, 141 insertions(+), 70 deletions(-) diff --git a/manifest b/manifest index 64a9e9fb2d..b0d501361f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\scellSizePtr()\sa\smethod\son\sthe\sMemPage\sobject,\swith\salternative\nimplementations\sdepending\son\sthe\spage\stype.\s\sThis\sresults\sis\sa\ssmall\sperformance\nimprovement\sand\ssize\sreduction. -D 2015-06-19T15:07:14.566 +C Add\sthe\sMemPage.xParseCell\smethod\sand\sprovide\svarious\simplementations\n(variations\son\sthe\sformer\sbtreeParseCellPtr())\sdepending\son\sthe\spage\stype. +D 2015-06-19T17:19:34.228 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,9 +192,9 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 960e66f4a9fd494c5712f4342432a2fb1cbb72c1 +F src/btree.c cf8310b4429e5f0400868b598d75d414b32da98e F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 -F src/btreeInt.h 97901d5434a22344cd5ae47e80ed677bd21d572d +F src/btreeInt.h 6ece2dd9c8e2eac05f0a8ded8772a44e96486c65 F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9246eca54adaee571dab0c066afaa604fcf9c44f -R 65525ba5a493bb8d3d370265d6f2abe8 +P 02f7e9d7d7b93d0b6bbd6cc0d0359b3b741b9931 +R 2f4b41ef502fc9cfa753afb16ada8794 U drh -Z b80278f806bcab0592c2162609b43f46 +Z a171034151748a0b17304cc3b38b62ab diff --git a/manifest.uuid b/manifest.uuid index 69d741e4be..3ec0fcffb0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -02f7e9d7d7b93d0b6bbd6cc0d0359b3b741b9931 \ No newline at end of file +41d03d883c4f7ca279eb9dd679f3ab81c8d957d9 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9260b3a910..bc3c134371 100644 --- a/src/btree.c +++ b/src/btree.c @@ -980,11 +980,73 @@ static u8 *findOverflowCell(MemPage *pPage, int iCell){ } /* -** Parse a cell content block and fill in the CellInfo structure. There -** are two versions of this function. btreeParseCell() takes a -** cell index as the second argument and btreeParseCellPtr() -** takes a pointer to the body of the cell as its second argument. +** This is common tail processing for btreeParseCellPtr() and +** btreeParseCellPtrIndex() for the case when the cell does not fit entirely +** on a single B-tree page. Make necessary adjustments to the CellInfo +** structure. */ +static SQLITE_NOINLINE void btreeParseCellAdjustSizeForOverflow( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + /* If the payload will not fit completely on the local page, we have + ** to decide how much to store locally and how much to spill onto + ** overflow pages. The strategy is to minimize the amount of unused + ** space on overflow pages while keeping the amount of local storage + ** in between minLocal and maxLocal. + ** + ** Warning: changing the way overflow payload is distributed in any + ** way will result in an incompatible file format. + */ + int minLocal; /* Minimum amount of payload held locally */ + int maxLocal; /* Maximum amount of payload held locally */ + int surplus; /* Overflow payload available for local storage */ + + minLocal = pPage->minLocal; + maxLocal = pPage->maxLocal; + surplus = minLocal + (pInfo->nPayload - minLocal)%(pPage->pBt->usableSize-4); + testcase( surplus==maxLocal ); + testcase( surplus==maxLocal+1 ); + if( surplus <= maxLocal ){ + pInfo->nLocal = (u16)surplus; + }else{ + pInfo->nLocal = (u16)minLocal; + } + pInfo->iOverflow = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell); + pInfo->nSize = pInfo->iOverflow + 4; +} + +/* +** The following routines are implementations of the MemPage.xParseCell() +** method. +** +** Parse a cell content block and fill in the CellInfo structure. +** +** btreeParseCellPtr() => table btree leaf nodes +** btreeParseCellNoPayload() => table btree internal nodes +** btreeParseCellPtrIndex() => index btree nodes +** +** There is also a wrapper function btreeParseCell() that works for +** all MemPage types and that references the cell by index rather than +** by pointer. +*/ +static void btreeParseCellPtrNoPayload( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 ); + assert( pPage->noPayload ); + assert( pPage->childPtrSize==4 ); + pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); + pInfo->nPayload = 0; + pInfo->nLocal = 0; + pInfo->iOverflow = 0; + pInfo->pPayload = 0; + return; +} static void btreeParseCellPtr( MemPage *pPage, /* Page containing the cell */ u8 *pCell, /* Pointer to the cell text. */ @@ -995,23 +1057,12 @@ static void btreeParseCellPtr( assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( pPage->leaf==0 || pPage->leaf==1 ); - if( pPage->intKeyLeaf ){ - assert( pPage->childPtrSize==0 ); - pIter = pCell + getVarint32(pCell, nPayload); - pIter += getVarint(pIter, (u64*)&pInfo->nKey); - }else if( pPage->noPayload ){ - assert( pPage->childPtrSize==4 ); - pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); - pInfo->nPayload = 0; - pInfo->nLocal = 0; - pInfo->iOverflow = 0; - pInfo->pPayload = 0; - return; - }else{ - pIter = pCell + pPage->childPtrSize; - pIter += getVarint32(pIter, nPayload); - pInfo->nKey = nPayload; - } + assert( pPage->intKeyLeaf || pPage->noPayload ); + assert( pPage->noPayload==0 ); + assert( pPage->intKeyLeaf ); + assert( pPage->childPtrSize==0 ); + pIter = pCell + getVarint32(pCell, nPayload); + pIter += getVarint(pIter, (u64*)&pInfo->nKey); pInfo->nPayload = nPayload; pInfo->pPayload = pIter; testcase( nPayload==pPage->maxLocal ); @@ -1025,31 +1076,46 @@ static void btreeParseCellPtr( pInfo->nLocal = (u16)nPayload; pInfo->iOverflow = 0; }else{ - /* If the payload will not fit completely on the local page, we have - ** to decide how much to store locally and how much to spill onto - ** overflow pages. The strategy is to minimize the amount of unused - ** space on overflow pages while keeping the amount of local storage - ** in between minLocal and maxLocal. - ** - ** Warning: changing the way overflow payload is distributed in any - ** way will result in an incompatible file format. - */ - int minLocal; /* Minimum amount of payload held locally */ - int maxLocal; /* Maximum amount of payload held locally */ - int surplus; /* Overflow payload available for local storage */ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCellPtrIndex( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ - minLocal = pPage->minLocal; - maxLocal = pPage->maxLocal; - surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize - 4); - testcase( surplus==maxLocal ); - testcase( surplus==maxLocal+1 ); - if( surplus <= maxLocal ){ - pInfo->nLocal = (u16)surplus; - }else{ - pInfo->nLocal = (u16)minLocal; - } - pInfo->iOverflow = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell); - pInfo->nSize = pInfo->iOverflow + 4; + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf==0 ); + assert( pPage->noPayload==0 ); + pIter = pCell + pPage->childPtrSize; + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[9]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pIternKey = nPayload; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + pInfo->iOverflow = 0; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); } } static void btreeParseCell( @@ -1057,19 +1123,20 @@ static void btreeParseCell( int iCell, /* The cell index. First cell is 0 */ CellInfo *pInfo /* Fill in this structure */ ){ - btreeParseCellPtr(pPage, findCell(pPage, iCell), pInfo); + pPage->xParseCell(pPage, findCell(pPage, iCell), pInfo); } /* +** The following routines are implementations of the MemPage.xCellSize +** method. +** ** Compute the total number of bytes that a Cell needs in the cell ** data area of the btree-page. The return number includes the cell ** data header and the local payload, but not any overflow page or ** the space used by the cell pointer. ** -** The first implementation, cellSizePtr(), handles pages that contain -** payload, which is to say all index pages and left table pages. The -** second cellSizePtrNoPayload() implemention is a high-speed version -** for pages that contain no payload - internal table pages. +** cellSizePtrNoPayload() => table internal nodes +** cellSizePtr() => all index nodes & table leaf nodes */ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ @@ -1082,7 +1149,7 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of ** this function verifies that this invariant is not violated. */ CellInfo debuginfo; - btreeParseCellPtr(pPage, pCell, &debuginfo); + pPage->xParseCell(pPage, pCell, &debuginfo); #endif assert( pPage->noPayload==0 ); @@ -1130,7 +1197,7 @@ static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of ** this function verifies that this invariant is not violated. */ CellInfo debuginfo; - btreeParseCellPtr(pPage, pCell, &debuginfo); + pPage->xParseCell(pPage, pCell, &debuginfo); #endif assert( pPage->childPtrSize==4 ); @@ -1159,7 +1226,7 @@ static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ CellInfo info; if( *pRC ) return; assert( pCell!=0 ); - btreeParseCellPtr(pPage, pCell, &info); + pPage->xParseCell(pPage, pCell, &info); if( info.iOverflow ){ Pgno ovfl = get4byte(&pCell[info.iOverflow]); ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); @@ -1540,10 +1607,12 @@ static int decodeFlags(MemPage *pPage, int flagByte){ if( pPage->leaf ){ pPage->intKeyLeaf = 1; pPage->noPayload = 0; + pPage->xParseCell = btreeParseCellPtr; }else{ pPage->intKeyLeaf = 0; pPage->noPayload = 1; pPage->xCellSize = cellSizePtrNoPayload; + pPage->xParseCell = btreeParseCellPtrNoPayload; } pPage->maxLocal = pBt->maxLeaf; pPage->minLocal = pBt->minLeaf; @@ -1557,6 +1626,7 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->intKey = 0; pPage->intKeyLeaf = 0; pPage->noPayload = 0; + pPage->xParseCell = btreeParseCellPtrIndex; pPage->maxLocal = pBt->maxLocal; pPage->minLocal = pBt->minLocal; }else{ @@ -3147,7 +3217,7 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ u8 *pCell = findCell(pPage, i); if( eType==PTRMAP_OVERFLOW1 ){ CellInfo info; - btreeParseCellPtr(pPage, pCell, &info); + pPage->xParseCell(pPage, pCell, &info); if( info.iOverflow && pCell+info.iOverflow+3<=pPage->aData+pPage->maskPage && iFrom==get4byte(&pCell[info.iOverflow]) @@ -4992,7 +5062,7 @@ int sqlite3BtreeMovetoUnpacked( ** case this happens. */ void *pCellKey; u8 * const pCellBody = pCell - pPage->childPtrSize; - btreeParseCellPtr(pPage, pCellBody, &pCur->info); + pPage->xParseCell(pPage, pCellBody, &pCur->info); nCell = (int)pCur->info.nKey; testcase( nCell<0 ); /* True if key size is 2^32 or more */ testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ @@ -5781,7 +5851,7 @@ static int clearCell( u32 ovflPageSize; assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - btreeParseCellPtr(pPage, pCell, &info); + pPage->xParseCell(pPage, pCell, &info); *pnSize = info.nSize; if( info.iOverflow==0 ){ return SQLITE_OK; /* No overflow pages. Return without doing anything */ @@ -5935,7 +6005,7 @@ static int fillInCell( #if SQLITE_DEBUG { CellInfo info; - btreeParseCellPtr(pPage, pCell, &info); + pPage->xParseCell(pPage, pCell, &info); assert( nHeader=(int)(info.pPayload - pCell) ); assert( info.nKey==nKey ); assert( *pnSize == info.nSize ); @@ -6584,7 +6654,7 @@ static int ptrmapCheckPages(MemPage **apPage, int nPage){ u8 *z; z = findCell(pPage, j); - btreeParseCellPtr(pPage, z, &info); + pPage->xParseCell(pPage, z, &info); if( info.iOverflow ){ Pgno ovfl = get4byte(&z[info.iOverflow]); ptrmapGet(pBt, ovfl, &e, &n); @@ -7215,7 +7285,7 @@ static int balance_nonroot( */ CellInfo info; j--; - btreeParseCellPtr(pNew, apCell[j], &info); + pNew->xParseCell(pNew, apCell[j], &info); pCell = pTemp; sz = 4 + putVarint(&pCell[4], info.nKey); pTemp = 0; @@ -8715,7 +8785,7 @@ static int checkTreePage( pCheck->v1 = iPage; pCheck->v2 = i; pCell = findCell(pPage,i); - btreeParseCellPtr(pPage, pCell, &info); + pPage->xParseCell(pPage, pCell, &info); sz = info.nPayload; /* For intKey pages, check that the keys are in order. */ diff --git a/src/btreeInt.h b/src/btreeInt.h index 6c03a98644..50c7db3a19 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -231,6 +231,7 @@ /* Forward declarations */ typedef struct MemPage MemPage; typedef struct BtLock BtLock; +typedef struct CellInfo CellInfo; /* ** This is a magic string that appears at the beginning of every @@ -295,7 +296,8 @@ struct MemPage { u8 *aDataEnd; /* One byte past the end of usable data */ u8 *aCellIdx; /* The cell index area */ DbPage *pDbPage; /* Pager page handle */ - u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ + u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ + void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ Pgno pgno; /* Page number for this page */ }; @@ -461,7 +463,6 @@ struct BtShared { ** about a cell. The parseCellPtr() function fills in this structure ** based on information extract from the raw disk page. */ -typedef struct CellInfo CellInfo; struct CellInfo { i64 nKey; /* The key for INTKEY tables, or nPayload otherwise */ u8 *pPayload; /* Pointer to the start of payload */ From 56cb04efc8027ac49af07c054bb40c8a3962425e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jun 2015 18:24:37 +0000 Subject: [PATCH 45/49] Performance improvements in btreeParseCell() by inlining the varint decoder. FossilOrigin-Name: faab0ed928074f3ec7c25e1a2058414fbd9b013c --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/btree.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b0d501361f..23527ca404 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sMemPage.xParseCell\smethod\sand\sprovide\svarious\simplementations\n(variations\son\sthe\sformer\sbtreeParseCellPtr())\sdepending\son\sthe\spage\stype. -D 2015-06-19T17:19:34.228 +C Performance\simprovements\sin\sbtreeParseCell()\sby\sinlining\sthe\svarint\sdecoder. +D 2015-06-19T18:24:37.928 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,7 +192,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c cf8310b4429e5f0400868b598d75d414b32da98e +F src/btree.c 32d2d8674e462ed7f9343a83a304c5651165f539 F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 6ece2dd9c8e2eac05f0a8ded8772a44e96486c65 F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70 @@ -1286,7 +1286,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 02f7e9d7d7b93d0b6bbd6cc0d0359b3b741b9931 -R 2f4b41ef502fc9cfa753afb16ada8794 +P 41d03d883c4f7ca279eb9dd679f3ab81c8d957d9 +R 7c0a97271e0bde50dd22074cdc063563 +T *branch * btree-opt +T *sym-btree-opt * +T -sym-trunk * U drh -Z a171034151748a0b17304cc3b38b62ab +Z 88046b08ce75f4bf4926f31a639805e5 diff --git a/manifest.uuid b/manifest.uuid index 3ec0fcffb0..b303d197bf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -41d03d883c4f7ca279eb9dd679f3ab81c8d957d9 \ No newline at end of file +faab0ed928074f3ec7c25e1a2058414fbd9b013c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index bc3c134371..f35b05b265 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1054,6 +1054,7 @@ static void btreeParseCellPtr( ){ u8 *pIter; /* For scanning through pCell */ u32 nPayload; /* Number of bytes of cell payload */ + u64 iKey; /* Extracted Key value */ assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( pPage->leaf==0 || pPage->leaf==1 ); @@ -1061,8 +1062,46 @@ static void btreeParseCellPtr( assert( pPage->noPayload==0 ); assert( pPage->intKeyLeaf ); assert( pPage->childPtrSize==0 ); - pIter = pCell + getVarint32(pCell, nPayload); - pIter += getVarint(pIter, (u64*)&pInfo->nKey); + pIter = pCell; + + /* The next block of code is equivalent to: + ** + ** pIter += getVarint32(pIter, nPayload); + ** + ** The code is inlined to avoid a function call. + */ + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[9]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( (*pIter)>=0x80 && pIternKey); + ** + ** The code is inlined to avoid a function call. + */ + iKey = *pIter; + if( iKey>=0x80 ){ + u8 *pEnd = &pIter[7]; + iKey &= 0x7f; + while(1){ + iKey = (iKey<<7) | (*++pIter & 0x7f); + if( (*pIter)<0x80 ) break; + if( pIter>=pEnd ){ + iKey = (iKey<<8) | *++pIter; + break; + } + } + } + pIter++; + + pInfo->nKey = *(i64*)&iKey; pInfo->nPayload = nPayload; pInfo->pPayload = pIter; testcase( nPayload==pPage->maxLocal ); From eeab2c63a95af9a15f007edd90b37dab286097e4 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jun 2015 20:08:39 +0000 Subject: [PATCH 46/49] Fix corner cases involving corrupt varint values in record headers. FossilOrigin-Name: 3189116b42c5ecef5e30c8b317f4458bbf8b9086 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/btree.c | 6 +++--- test/corruptI.test | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 23527ca404..ffb7cad2e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovements\sin\sbtreeParseCell()\sby\sinlining\sthe\svarint\sdecoder. -D 2015-06-19T18:24:37.928 +C Fix\scorner\scases\sinvolving\scorrupt\svarint\svalues\sin\srecord\sheaders. +D 2015-06-19T20:08:39.479 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -192,7 +192,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c ff743689c4d6c5cb55ad42ed9d174b2b3e71f1e3 F src/bitvec.c 5eb7958c3bf65210211cbcfc44eff86d0ded7c9d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 32d2d8674e462ed7f9343a83a304c5651165f539 +F src/btree.c 173c2ba1b8cf941971683f584965369791125f12 F src/btree.h 969adc948e89e449220ff0ff724c94bb2a52e9f1 F src/btreeInt.h 6ece2dd9c8e2eac05f0a8ded8772a44e96486c65 F src/build.c b3f15255d5b16e42dafeaa638fd4f8a47c94ed70 @@ -457,7 +457,7 @@ F test/corruptE.test 193b4ca4e927e77c1d5f4f56203ddc998432a7ee F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 F test/corruptG.test 1ab3bf97ee7bdba70e0ff3ba2320657df55d1804 F test/corruptH.test 5dd4fa98c6c1ed33b178f9e8a48c4fdd3cfc9067 -F test/corruptI.test ddf8c7146db0bc6080eedced67453b4cc69b5340 +F test/corruptI.test f2b10e4fec2a4315bca2b936ffa52ccbffac3422 F test/corruptJ.test 9e29e7a81ee3b6ac50f77ea7a9e2f3fa03f32d91 F test/cost.test 19d314526616ce4473eb4e4e450fcb94499ce318 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c @@ -1286,10 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 41d03d883c4f7ca279eb9dd679f3ab81c8d957d9 -R 7c0a97271e0bde50dd22074cdc063563 -T *branch * btree-opt -T *sym-btree-opt * -T -sym-trunk * +P faab0ed928074f3ec7c25e1a2058414fbd9b013c +R 17322242ece767a3323f72561a7eab73 U drh -Z 88046b08ce75f4bf4926f31a639805e5 +Z 6da824f4fe4f5bb0c3f4de7caaaa681b diff --git a/manifest.uuid b/manifest.uuid index b303d197bf..6a3e25b56a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -faab0ed928074f3ec7c25e1a2058414fbd9b013c \ No newline at end of file +3189116b42c5ecef5e30c8b317f4458bbf8b9086 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f35b05b265..e64139b800 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1072,7 +1072,7 @@ static void btreeParseCellPtr( */ nPayload = *pIter; if( nPayload>=0x80 ){ - u8 *pEnd = &pIter[9]; + u8 *pEnd = &pIter[8]; nPayload &= 0x7f; do{ nPayload = (nPayload<<7) | (*++pIter & 0x7f); @@ -1133,7 +1133,7 @@ static void btreeParseCellPtrIndex( pIter = pCell + pPage->childPtrSize; nPayload = *pIter; if( nPayload>=0x80 ){ - u8 *pEnd = &pIter[9]; + u8 *pEnd = &pIter[8]; nPayload &= 0x7f; do{ nPayload = (nPayload<<7) | (*++pIter & 0x7f); @@ -1194,7 +1194,7 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ assert( pPage->noPayload==0 ); nSize = *pIter; if( nSize>=0x80 ){ - pEnd = &pIter[9]; + pEnd = &pIter[8]; nSize &= 0x7f; do{ nSize = (nSize<<7) | (*++pIter & 0x7f); diff --git a/test/corruptI.test b/test/corruptI.test index 2d4a481c77..64323d9608 100644 --- a/test/corruptI.test +++ b/test/corruptI.test @@ -204,7 +204,7 @@ do_execsql_test 6.0 { } {} do_test 6.1 { db close - hexio_write test.db 616 EAFFFFFF0202 + hexio_write test.db 616 8FFFFFFF7F02 sqlite3 db test.db breakpoint execsql { DELETE FROM t1 WHERE rowid=2 } From 5f02ab0976f4f8884e7e78e952f99c2e43ab21cd Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 20 Jun 2015 13:18:34 +0000 Subject: [PATCH 47/49] Make sure that the likelihood() function does not mess up generation of result-set code when it is used (inappropropriately) in a result-set expression. FossilOrigin-Name: 7cdbae625eb029538a693d2bebec465a6f65fb90 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/expr.c | 2 +- test/whereG.test | 22 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6413283a34..3747dc3339 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovements\sin\sbtreeParseCell()\sby\sinlining\sthe\svarint\sdecoder. -D 2015-06-19T20:31:02.328 +C Make\ssure\sthat\sthe\slikelihood()\sfunction\sdoes\snot\smess\sup\sgeneration\sof\nresult-set\scode\swhen\sit\sis\sused\s(inappropropriately)\sin\sa\sresult-set\s\nexpression. +D 2015-06-20T13:18:34.320 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -202,7 +202,7 @@ F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a F src/delete.c 8857a6f27560718f65d43bdbec86c967ae1f8dfa -F src/expr.c fbde754df3fa10bbd3a1dcea08e77b0f1684d188 +F src/expr.c 32c836d9fa22c25371039febf074849dcefb3de9 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c c9b63a217d86582c22121699a47f22f524608869 F src/func.c a98ea5880dc50e9ca6dd6f57079a37b9cfcdecf1 @@ -1209,7 +1209,7 @@ F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 F test/whereD.test 9eba1f9b18e5b19a0b0bcaae5e8c037260195f2b F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f F test/whereF.test 5b2ba0dbe8074aa13e416b37c753991f0a2492d7 -F test/whereG.test a9fa7c84d7050b5a86a9ef94d343986d0b52ada1 +F test/whereG.test dde4c52a97385a55be6a7cd46be8373f0cf35501 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 F test/whereI.test 1d89199697919d4930be05a71e7fe620f114e622 F test/whereJ.test 55a3221706a7ab706293f17cc8f96da563bf0767 @@ -1286,8 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 41d03d883c4f7ca279eb9dd679f3ab81c8d957d9 3189116b42c5ecef5e30c8b317f4458bbf8b9086 -R 17322242ece767a3323f72561a7eab73 -T +closed 3189116b42c5ecef5e30c8b317f4458bbf8b9086 +P 172a864d14fd9f0e3e97d2a13b22222ae0fedd39 +R 15b26e1c929c22d8d2f79a37c9411873 U drh -Z 9792c9ad3223b34d6cd839672f530e9d +Z 3bcd77a420167e4346978f981f1d3443 diff --git a/manifest.uuid b/manifest.uuid index 37ea3acbb3..e395035003 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -172a864d14fd9f0e3e97d2a13b22222ae0fedd39 \ No newline at end of file +7cdbae625eb029538a693d2bebec465a6f65fb90 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ddf939d3fa..8f697e4d45 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2855,7 +2855,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ */ if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ assert( nFarg>=1 ); - sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); + inReg = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); break; } diff --git a/test/whereG.test b/test/whereG.test index 81416e1424..110ed5dbd4 100644 --- a/test/whereG.test +++ b/test/whereG.test @@ -244,5 +244,27 @@ do_execsql_test 6.0 { SELECT count(*) FROM t1 LEFT JOIN t2 ON likely(t1.i=t2.i) AND bool='T'; } {4 4} +# 2015-06-20 +# Crash discovered by AFL +# +do_execsql_test 7.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a, b, PRIMARY KEY(a,b)); + INSERT INTO t1 VALUES(9,1),(1,2); + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(x, y, PRIMARY KEY(x,y)); + INSERT INTO t2 VALUES(3,3),(4,4); + SELECT likely(a), x FROM t1, t2 ORDER BY 1, 2; +} {1 3 1 4 9 3 9 4} +do_execsql_test 7.1 { + SELECT unlikely(a), x FROM t1, t2 ORDER BY 1, 2; +} {1 3 1 4 9 3 9 4} +do_execsql_test 7.2 { + SELECT likelihood(a,0.5), x FROM t1, t2 ORDER BY 1, 2; +} {1 3 1 4 9 3 9 4} +do_execsql_test 7.3 { + SELECT coalesce(a,a), x FROM t1, t2 ORDER BY 1, 2; +} {1 3 1 4 9 3 9 4} + finish_test From 82c4f9b4076bca379194efd79ad6df47fff4fab9 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 20 Jun 2015 14:11:56 +0000 Subject: [PATCH 48/49] Update the fuzztest data using the latest test vectors discovered by AFL. FossilOrigin-Name: b97f9cf73e503c7285ba3a801e1f932f222d96b2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata1.db | Bin 4199424 -> 4398080 bytes test/fuzzdata3.db | Bin 12024832 -> 11777024 bytes 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3747dc3339..9332d172a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthat\sthe\slikelihood()\sfunction\sdoes\snot\smess\sup\sgeneration\sof\nresult-set\scode\swhen\sit\sis\sused\s(inappropropriately)\sin\sa\sresult-set\s\nexpression. -D 2015-06-20T13:18:34.320 +C Update\sthe\sfuzztest\sdata\susing\sthe\slatest\stest\svectors\sdiscovered\sby\sAFL. +D 2015-06-20T14:11:56.166 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -658,9 +658,9 @@ F test/fuzz3.test efd384b896c647b61a2c1848ba70d42aad60a7b3 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 F test/fuzzcheck.c 5805b2236292f8643d56e727a3a6e4d88e0856a5 -F test/fuzzdata1.db b60254eeb6bc11474071b883059662a73c48da7f +F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 -F test/fuzzdata3.db f4ca6fa92973501cec63ac5d1992ef88f6a78e7f +F test/fuzzdata3.db 77bed4fc8c4945124ed5616daf2dc4f4c3bf762a F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 172a864d14fd9f0e3e97d2a13b22222ae0fedd39 -R 15b26e1c929c22d8d2f79a37c9411873 +P 7cdbae625eb029538a693d2bebec465a6f65fb90 +R 5add07a39efb3611e2cfa0ac20a2c5f5 U drh -Z 3bcd77a420167e4346978f981f1d3443 +Z 71db4d574368380e4b14cadc01f6d8d0 diff --git a/manifest.uuid b/manifest.uuid index e395035003..ad06e9f3b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cdbae625eb029538a693d2bebec465a6f65fb90 \ No newline at end of file +b97f9cf73e503c7285ba3a801e1f932f222d96b2 \ No newline at end of file diff --git a/test/fuzzdata1.db b/test/fuzzdata1.db index 222e598a44975de8a0e74fd5fb4ad82bd36d6155..4b4a6b574b04ded0397562fbdea8aca49fa0e006 100644 GIT binary patch delta 483349 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⪚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