From 9b3bfa00cd232c102e826dd9b177ad66b962f359 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 01:30:16 +0000 Subject: [PATCH 01/13] Performance improvement in query planning. FossilOrigin-Name: ca59533bbb7f21d7b39dee7999d3f36ac516f8c75b2203039beeb2852ada42d4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 17 +++++++++-------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 879da8796e..aebe38655c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Check\sfor\sforeign\skey\sconstraint\serrors\sprior\sto\sreturning\sthe\sresults\sfrom\na\sRETURNING\sclause.\s\sSee\s[forum:/forumpost/793beaf322|forum\spost\s793beaf322]. -D 2021-12-01T19:17:14.951 +C Performance\simprovement\sin\squery\splanning. +D 2021-12-02T01:30:16.970 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -637,7 +637,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c ed0398a7adf02c31e34aada42cc86c58f413a7afe5f741a5d373ad087abde028 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 4b276017881185d0e1dc984df66c835cde6faf03834ef9ff34f48653f9144dec +F src/where.c db68967fe15efdddbc067835401a0c02e2d8460daee2fdda85ca491451865170 F src/whereInt.h 83877a75a1bce056ea44aff02f1dfa958ad1d6038c213ddadb8652003b45151d F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 F src/whereexpr.c 17bdbf4f5b490e70a18635498f0b910a558f953a9bf80af7f19cbde6e60e6825 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8c986782547211098eb0e4e722eda0097421223af279381373d0055211b5e9d2 -R 21e311cc3a849b363a459e68e73e4039 +P a818ba2ed635b91e279dde44236fc7446a33db2b46c9409b67021248c01bf4e5 +R b96a809fd19be7cd4fca1d2cbe967f1c U drh -Z aa1759274fb4dd09e62bccb20e559386 +Z 9b172105eb69d7dd67f53ef8928dc7e1 diff --git a/manifest.uuid b/manifest.uuid index 22dfac2e19..b993f82b37 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a818ba2ed635b91e279dde44236fc7446a33db2b46c9409b67021248c01bf4e5 \ No newline at end of file +ca59533bbb7f21d7b39dee7999d3f36ac516f8c75b2203039beeb2852ada42d4 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 54e4ea8196..fd67ac5f17 100644 --- a/src/where.c +++ b/src/where.c @@ -4868,12 +4868,6 @@ WhereInfo *sqlite3WhereBegin( if( pOrderBy && pOrderBy->nExpr>=BMS ) pOrderBy = 0; sWLB.pOrderBy = pOrderBy; - /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via - ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */ - if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){ - wctrlFlags &= ~WHERE_WANT_DISTINCT; - } - /* The number of tables in the FROM clause is limited by the number of ** bits in a Bitmask */ @@ -4940,7 +4934,9 @@ WhereInfo *sqlite3WhereBegin( */ if( nTabList==0 ){ if( pOrderBy ) pWInfo->nOBSat = pOrderBy->nExpr; - if( wctrlFlags & WHERE_WANT_DISTINCT ){ + if( (wctrlFlags & WHERE_WANT_DISTINCT)!=0 + && OptimizationEnabled(db, SQLITE_DistinctOpt) + ){ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; } ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); @@ -5001,7 +4997,12 @@ WhereInfo *sqlite3WhereBegin( } if( wctrlFlags & WHERE_WANT_DISTINCT ){ - if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ + if( OptimizationDisabled(db, SQLITE_DistinctOpt) ){ + /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via + ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */ + wctrlFlags &= ~WHERE_WANT_DISTINCT; + pWInfo->wctrlFlags &= ~WHERE_WANT_DISTINCT; + }else if( isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet) ){ /* The DISTINCT marking is pointless. Ignore it. */ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; }else if( pOrderBy==0 ){ From 79ab38412186a2e19d0350d836ee95a84826cc94 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 02:22:35 +0000 Subject: [PATCH 02/13] Small performance enhancement for whereScanInit(). FossilOrigin-Name: ed84e124c6097b756ca687ac64df7ee801d14b16c835f1a9e8b336f785157d85 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index aebe38655c..f2027f792a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovement\sin\squery\splanning. -D 2021-12-02T01:30:16.970 +C Small\sperformance\senhancement\sfor\swhereScanInit(). +D 2021-12-02T02:22:35.475 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -637,7 +637,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c ed0398a7adf02c31e34aada42cc86c58f413a7afe5f741a5d373ad087abde028 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c db68967fe15efdddbc067835401a0c02e2d8460daee2fdda85ca491451865170 +F src/where.c 36e6ce4c1dd564885f2596e2c2aab61c7a56c7f9aeae63d6bb258d1464883ad6 F src/whereInt.h 83877a75a1bce056ea44aff02f1dfa958ad1d6038c213ddadb8652003b45151d F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 F src/whereexpr.c 17bdbf4f5b490e70a18635498f0b910a558f953a9bf80af7f19cbde6e60e6825 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a818ba2ed635b91e279dde44236fc7446a33db2b46c9409b67021248c01bf4e5 -R b96a809fd19be7cd4fca1d2cbe967f1c +P ca59533bbb7f21d7b39dee7999d3f36ac516f8c75b2203039beeb2852ada42d4 +R af3fe3cb608001edf986e30906f5d5ad U drh -Z 9b172105eb69d7dd67f53ef8928dc7e1 +Z e7cfc5073afcf7170a57b786bbc9a825 diff --git a/manifest.uuid b/manifest.uuid index b993f82b37..7e8fe9d6a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca59533bbb7f21d7b39dee7999d3f36ac516f8c75b2203039beeb2852ada42d4 \ No newline at end of file +ed84e124c6097b756ca687ac64df7ee801d14b16c835f1a9e8b336f785157d85 \ No newline at end of file diff --git a/src/where.c b/src/where.c index fd67ac5f17..53fa001dee 100644 --- a/src/where.c +++ b/src/where.c @@ -419,16 +419,16 @@ static WhereTerm *whereScanInit( if( pIdx ){ int j = iColumn; iColumn = pIdx->aiColumn[j]; - if( iColumn==XN_EXPR ){ - pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; - pScan->zCollName = pIdx->azColl[j]; - pScan->aiColumn[0] = XN_EXPR; - return whereScanInitIndexExpr(pScan); - }else if( iColumn==pIdx->pTable->iPKey ){ + if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; pScan->zCollName = pIdx->azColl[j]; + }else if( iColumn==XN_EXPR ){ + pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); } }else if( iColumn==XN_EXPR ){ return 0; From dae2a109341fc22c2ebb1f03a8d8df61c3c1b03a Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 04:00:45 +0000 Subject: [PATCH 03/13] Small performance optimization in sqlite3WhereGetMask(). FossilOrigin-Name: 7edec54ab045c0493fc5d27d47d7bf0e08d3b0b298f428646fd3f0ee24dfcade --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 11 +++++++---- src/whereInt.h | 13 ++++--------- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index f2027f792a..650ae769af 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\senhancement\sfor\swhereScanInit(). -D 2021-12-02T02:22:35.475 +C Small\sperformance\soptimization\sin\ssqlite3WhereGetMask(). +D 2021-12-02T04:00:45.798 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -637,8 +637,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c ed0398a7adf02c31e34aada42cc86c58f413a7afe5f741a5d373ad087abde028 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 36e6ce4c1dd564885f2596e2c2aab61c7a56c7f9aeae63d6bb258d1464883ad6 -F src/whereInt.h 83877a75a1bce056ea44aff02f1dfa958ad1d6038c213ddadb8652003b45151d +F src/where.c 90903cab02f03aded5019e45cd1dec6adf307291a6af0e55fce5111e84cc9115 +F src/whereInt.h 1630d9418512b080598e9a72b8af6b8bd1b9ab13fee1458f151762b6df206791 F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 F src/whereexpr.c 17bdbf4f5b490e70a18635498f0b910a558f953a9bf80af7f19cbde6e60e6825 F src/window.c 5d3b397b0c026d0ff5890244ac41359e524c01ae31e78782e1ff418c3e271a9e @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ca59533bbb7f21d7b39dee7999d3f36ac516f8c75b2203039beeb2852ada42d4 -R af3fe3cb608001edf986e30906f5d5ad +P ed84e124c6097b756ca687ac64df7ee801d14b16c835f1a9e8b336f785157d85 +R 4968f927e754c905a194070e8df46560 U drh -Z e7cfc5073afcf7170a57b786bbc9a825 +Z 0a6600fef45926158d5c9c07197fe75a diff --git a/manifest.uuid b/manifest.uuid index 7e8fe9d6a3..3e8bb6ca63 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed84e124c6097b756ca687ac64df7ee801d14b16c835f1a9e8b336f785157d85 \ No newline at end of file +7edec54ab045c0493fc5d27d47d7bf0e08d3b0b298f428646fd3f0ee24dfcade \ No newline at end of file diff --git a/src/where.c b/src/where.c index 53fa001dee..a661940b39 100644 --- a/src/where.c +++ b/src/where.c @@ -232,13 +232,15 @@ whereOrInsert_done: ** iCursor is not in the set. */ Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ - int i; + int i = 0; assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); - for(i=0; in; i++){ + assert( pMaskSet->n>0 || pMaskSet->ix[0]<0 ); + assert( iCursor>=-1 ); + do{ if( pMaskSet->ix[i]==iCursor ){ return MASKBIT(i); } - } + }while( (++i)n ); return 0; } @@ -4926,7 +4928,8 @@ WhereInfo *sqlite3WhereBegin( /* Split the WHERE clause into separate subexpressions where each ** subexpression is separated by an AND operator. */ - initMaskSet(pMaskSet); + pMaskSet->n = 0; + pMaskSet->ix[0] = -99; sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); diff --git a/src/whereInt.h b/src/whereInt.h index f651e790cc..217dd0ba2a 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -292,11 +292,11 @@ struct WhereScan { WhereClause *pWC; /* WhereClause currently being scanned */ const char *zCollName; /* Required collating sequence, if not NULL */ Expr *pIdxExpr; /* Search for this index expression */ - char idxaff; /* Must match this affinity, if zCollName!=NULL */ - unsigned char nEquiv; /* Number of entries in aiCur[] and aiColumn[] */ - unsigned char iEquiv; /* Next unused slot in aiCur[] and aiColumn[] */ - u32 opMask; /* Acceptable operators */ int k; /* Resume scanning at this->pWC->a[this->k] */ + u32 opMask; /* Acceptable operators */ + char idxaff; /* Must match this affinity, if zCollName!=NULL */ + unsigned char iEquiv; /* Current slot in aiCur[] and aiColumn[] */ + unsigned char nEquiv; /* Number of entries in aiCur[] and aiColumn[] */ int aiCur[11]; /* Cursors in the equivalence class */ i16 aiColumn[11]; /* Corresponding column number in the eq-class */ }; @@ -377,11 +377,6 @@ 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. From 844a89b518c47864e2c0e6d41ea85947c48519ed Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 12:34:05 +0000 Subject: [PATCH 04/13] More small performance optimizations for sqlite3WhereGetMask(). FossilOrigin-Name: 3de2c557d915d1b4a9b0e540d5e80ffb243e7123d0ec65c5052f4d6f1cce56b2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 15 ++++++++++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 650ae769af..1d0d293e6a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\soptimization\sin\ssqlite3WhereGetMask(). -D 2021-12-02T04:00:45.798 +C More\ssmall\sperformance\soptimizations\sfor\ssqlite3WhereGetMask(). +D 2021-12-02T12:34:05.331 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -637,7 +637,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c ed0398a7adf02c31e34aada42cc86c58f413a7afe5f741a5d373ad087abde028 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 90903cab02f03aded5019e45cd1dec6adf307291a6af0e55fce5111e84cc9115 +F src/where.c b50391df607937593596fbb8ea39f673d9a3715a65750567b442d22dd20720ca F src/whereInt.h 1630d9418512b080598e9a72b8af6b8bd1b9ab13fee1458f151762b6df206791 F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 F src/whereexpr.c 17bdbf4f5b490e70a18635498f0b910a558f953a9bf80af7f19cbde6e60e6825 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ed84e124c6097b756ca687ac64df7ee801d14b16c835f1a9e8b336f785157d85 -R 4968f927e754c905a194070e8df46560 +P 7edec54ab045c0493fc5d27d47d7bf0e08d3b0b298f428646fd3f0ee24dfcade +R 1c3ef5334121101d82935d790fc38231 U drh -Z 0a6600fef45926158d5c9c07197fe75a +Z 3bbf6be35a1404f46b703105b00b0544 diff --git a/manifest.uuid b/manifest.uuid index 3e8bb6ca63..d5b9582fdc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7edec54ab045c0493fc5d27d47d7bf0e08d3b0b298f428646fd3f0ee24dfcade \ No newline at end of file +3de2c557d915d1b4a9b0e540d5e80ffb243e7123d0ec65c5052f4d6f1cce56b2 \ No newline at end of file diff --git a/src/where.c b/src/where.c index a661940b39..925f98af16 100644 --- a/src/where.c +++ b/src/where.c @@ -232,15 +232,18 @@ whereOrInsert_done: ** iCursor is not in the set. */ Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ - int i = 0; + int i; assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); assert( pMaskSet->n>0 || pMaskSet->ix[0]<0 ); assert( iCursor>=-1 ); - do{ + if( pMaskSet->ix[0]==iCursor ){ + return 1; + } + for(i=1; in; i++){ if( pMaskSet->ix[i]==iCursor ){ return MASKBIT(i); } - }while( (++i)n ); + } return 0; } @@ -4916,6 +4919,10 @@ WhereInfo *sqlite3WhereBegin( memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel)); assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */ pMaskSet = &pWInfo->sMaskSet; + pMaskSet->n = 0; + pMaskSet->ix[0] = -99; /* Initialize ix[0] to a value that can never be + ** a valid cursor number, to avoid an initial + ** test for pMaskSet->n==0 in sqlite3WhereGetMask() */ sWLB.pWInfo = pWInfo; sWLB.pWC = &pWInfo->sWC; sWLB.pNew = (WhereLoop*)(((char*)pWInfo)+nByteWInfo); @@ -4928,8 +4935,6 @@ WhereInfo *sqlite3WhereBegin( /* Split the WHERE clause into separate subexpressions where each ** subexpression is separated by an AND operator. */ - pMaskSet->n = 0; - pMaskSet->ix[0] = -99; sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); From cdd905039666ba8c16f635621540cbd9b859bf93 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 12:55:05 +0000 Subject: [PATCH 05/13] Small performance optimization in sqlite3WhereClauseClear(). FossilOrigin-Name: 080b35e62e5c6bb4ea162bc75232b81e54da5e3e01e762127e228400e8afef1d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/whereexpr.c | 28 ++++++++++++++++++---------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 1d0d293e6a..46ffc13fd4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\ssmall\sperformance\soptimizations\sfor\ssqlite3WhereGetMask(). -D 2021-12-02T12:34:05.331 +C Small\sperformance\soptimization\sin\ssqlite3WhereClauseClear(). +D 2021-12-02T12:55:05.367 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -640,7 +640,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c b50391df607937593596fbb8ea39f673d9a3715a65750567b442d22dd20720ca F src/whereInt.h 1630d9418512b080598e9a72b8af6b8bd1b9ab13fee1458f151762b6df206791 F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 -F src/whereexpr.c 17bdbf4f5b490e70a18635498f0b910a558f953a9bf80af7f19cbde6e60e6825 +F src/whereexpr.c 5780201555e62250ae176d40a1b840f63a3ab4fc015f286ac7e3dbea53c0b486 F src/window.c 5d3b397b0c026d0ff5890244ac41359e524c01ae31e78782e1ff418c3e271a9e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7edec54ab045c0493fc5d27d47d7bf0e08d3b0b298f428646fd3f0ee24dfcade -R 1c3ef5334121101d82935d790fc38231 +P 3de2c557d915d1b4a9b0e540d5e80ffb243e7123d0ec65c5052f4d6f1cce56b2 +R 8a54b72f0460bed9e312d2981e2b1a82 U drh -Z 3bbf6be35a1404f46b703105b00b0544 +Z f5838c1c1adaaaafa1d74530a9dc2af4 diff --git a/manifest.uuid b/manifest.uuid index d5b9582fdc..b709254f66 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3de2c557d915d1b4a9b0e540d5e80ffb243e7123d0ec65c5052f4d6f1cce56b2 \ No newline at end of file +080b35e62e5c6bb4ea162bc75232b81e54da5e3e01e762127e228400e8afef1d \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index 53dd14031c..93992f4107 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1525,17 +1525,25 @@ void sqlite3WhereClauseInit( ** 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->nTerm>0 ){ + WhereTerm *a = pWC->a; + WhereTerm *aLast = &pWC->a[pWC->nTerm-1]; + while(1){ + if( a->wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, a->pExpr); + } + if( a->wtFlags & (TERM_ORINFO|TERM_ANDINFO) ){ + if( a->wtFlags & TERM_ORINFO ){ + assert( (a->wtFlags & TERM_ANDINFO)==0 ); + whereOrInfoDelete(db, a->u.pOrInfo); + }else{ + assert( (a->wtFlags & TERM_ANDINFO)!=0 ); + whereAndInfoDelete(db, a->u.pAndInfo); + } + } + if( a==aLast ) break; + a++; } } if( pWC->a!=pWC->aStatic ){ From cbb7746caab4a6d258d55e7a76b7f81bea33993b Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 13:45:10 +0000 Subject: [PATCH 06/13] Remove an unnecessary branch from exprAnalyze(), resulting in a small performance gain. FossilOrigin-Name: 3312be1db3519074393573265459f6a1eeabce541a9ef4d93689529ea2b8f739 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/whereexpr.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 46ffc13fd4..c51c6ca79e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\soptimization\sin\ssqlite3WhereClauseClear(). -D 2021-12-02T12:55:05.367 +C Remove\san\sunnecessary\sbranch\sfrom\sexprAnalyze(),\sresulting\sin\sa\ssmall\nperformance\sgain. +D 2021-12-02T13:45:10.819 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -640,7 +640,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c b50391df607937593596fbb8ea39f673d9a3715a65750567b442d22dd20720ca F src/whereInt.h 1630d9418512b080598e9a72b8af6b8bd1b9ab13fee1458f151762b6df206791 F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 -F src/whereexpr.c 5780201555e62250ae176d40a1b840f63a3ab4fc015f286ac7e3dbea53c0b486 +F src/whereexpr.c da93d2227cc5246fe4a79d130f2a1a215017e12d76a035434145c443abd6f64b F src/window.c 5d3b397b0c026d0ff5890244ac41359e524c01ae31e78782e1ff418c3e271a9e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3de2c557d915d1b4a9b0e540d5e80ffb243e7123d0ec65c5052f4d6f1cce56b2 -R 8a54b72f0460bed9e312d2981e2b1a82 +P 080b35e62e5c6bb4ea162bc75232b81e54da5e3e01e762127e228400e8afef1d +R a7ab895f8cfffd485e37af57ff425c88 U drh -Z f5838c1c1adaaaafa1d74530a9dc2af4 +Z 5fe3f769c9fffb4907c1638f83e89ed7 diff --git a/manifest.uuid b/manifest.uuid index b709254f66..7d6260d69b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -080b35e62e5c6bb4ea162bc75232b81e54da5e3e01e762127e228400e8afef1d \ No newline at end of file +3312be1db3519074393573265459f6a1eeabce541a9ef4d93689529ea2b8f739 \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index 93992f4107..bb013f1c6f 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1070,9 +1070,11 @@ static void exprAnalyze( if( db->mallocFailed ){ return; } + assert( pWC->nTerm > idxTerm ); pTerm = &pWC->a[idxTerm]; pMaskSet = &pWInfo->sMaskSet; pExpr = pTerm->pExpr; + assert( pExpr!=0 ); /* Because malloc() has not failed */ assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); op = pExpr->op; @@ -1084,8 +1086,6 @@ static void exprAnalyze( }else{ pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); } - }else if( op==TK_ISNULL ){ - pTerm->prereqRight = 0; }else{ pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); } From 1872c5bd43f52a1aa4d14883ad9ece5ff7a7f0ec Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 2 Dec 2021 14:16:30 +0000 Subject: [PATCH 07/13] In the shell tool, avoid modifying internal data structures until after the arguments to ".open" have been parsed. FossilOrigin-Name: fcc509d325dabe06275e7804183bb8b4ba6470a45b443bc8292eecd0974e6367 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 34 +++++++++++++++++++--------------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index c51c6ca79e..2a28256dc6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunnecessary\sbranch\sfrom\sexprAnalyze(),\sresulting\sin\sa\ssmall\nperformance\sgain. -D 2021-12-02T13:45:10.819 +C In\sthe\sshell\stool,\savoid\smodifying\sinternal\sdata\sstructures\suntil\safter\sthe\sarguments\sto\s".open"\shave\sbeen\sparsed. +D 2021-12-02T14:16:30.751 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -551,7 +551,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 4a1db4aadd802683db40ca2dbbb268187bd195f10cbdb7206dbd8ac988795571 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c a7a3d9f54eb24821ec5f67f2e5589b68a5d42d46fc5849d7376886777d93a85a -F src/shell.c.in 975f268ef261773fcbed1e519dfa10c4f33e8b1cffc12120563e61857fff07c6 +F src/shell.c.in e7ee6517544d075d9f06ee2571567026b89cf9fbeef16a74918019b1cb425764 F src/sqlite.h.in 5cd209ac7dc4180f0e19292846f40440b8488015849ca0110c70b906b57d68f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8ff2fd2c166150b2e48639f5e506fb44e29f1a3f65031710b9e89d1c126ac839 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 080b35e62e5c6bb4ea162bc75232b81e54da5e3e01e762127e228400e8afef1d -R a7ab895f8cfffd485e37af57ff425c88 -U drh -Z 5fe3f769c9fffb4907c1638f83e89ed7 +P 3312be1db3519074393573265459f6a1eeabce541a9ef4d93689529ea2b8f739 +R 7b39f65268d7d5d5ddeb7e728b46cc8a +U dan +Z 6583dbaeea3c12c619555be53ea08d30 diff --git a/manifest.uuid b/manifest.uuid index 7d6260d69b..c442c9baae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3312be1db3519074393573265459f6a1eeabce541a9ef4d93689529ea2b8f739 \ No newline at end of file +fcc509d325dabe06275e7804183bb8b4ba6470a45b443bc8292eecd0974e6367 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index b4b4e2fcce..72fe26339e 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8941,16 +8941,8 @@ static int do_meta_command(char *zLine, ShellState *p){ char *zNewFilename = 0; /* Name of the database file to open */ int iName = 1; /* Index in azArg[] of the filename */ int newFlag = 0; /* True to delete file before opening */ - /* Close the existing database */ - session_close_all(p, -1); - close_db(p->db); - p->db = 0; - p->pAuxDb->zDbFilename = 0; - sqlite3_free(p->pAuxDb->zFreeOnClose); - p->pAuxDb->zFreeOnClose = 0; - p->openMode = SHELL_OPEN_UNSPEC; - p->openFlags = 0; - p->szMax = 0; + int openMode = SHELL_OPEN_UNSPEC; + /* Check for command-line arguments */ for(iName=1; iNameopenMode = SHELL_OPEN_ZIPFILE; + openMode = SHELL_OPEN_ZIPFILE; #endif }else if( optionMatch(z, "append") ){ - p->openMode = SHELL_OPEN_APPENDVFS; + openMode = SHELL_OPEN_APPENDVFS; }else if( optionMatch(z, "readonly") ){ - p->openMode = SHELL_OPEN_READONLY; + openMode = SHELL_OPEN_READONLY; }else if( optionMatch(z, "nofollow") ){ p->openFlags |= SQLITE_OPEN_NOFOLLOW; #ifndef SQLITE_OMIT_DESERIALIZE }else if( optionMatch(z, "deserialize") ){ - p->openMode = SHELL_OPEN_DESERIALIZE; + openMode = SHELL_OPEN_DESERIALIZE; }else if( optionMatch(z, "hexdb") ){ - p->openMode = SHELL_OPEN_HEXDB; + openMode = SHELL_OPEN_HEXDB; }else if( optionMatch(z, "maxsize") && iName+1szMax = integerValue(azArg[++iName]); #endif /* SQLITE_OMIT_DESERIALIZE */ @@ -8986,6 +8978,18 @@ static int do_meta_command(char *zLine, ShellState *p){ zNewFilename = sqlite3_mprintf("%s", z); } } + + /* Close the existing database */ + session_close_all(p, -1); + close_db(p->db); + p->db = 0; + p->pAuxDb->zDbFilename = 0; + sqlite3_free(p->pAuxDb->zFreeOnClose); + p->pAuxDb->zFreeOnClose = 0; + p->openMode = openMode; + p->openFlags = 0; + p->szMax = 0; + /* If a filename is specified, try to open it first */ if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ if( newFlag && !p->bSafeMode ) shellDeleteFile(zNewFilename); From daebb0f9a0a8a72646a055347c97baf71311cd05 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 14:28:36 +0000 Subject: [PATCH 08/13] Move the TK_IS token so that it is adjacent to the TK_IN token, as this allows the C compiler to optimize better, resulting in a slightly smaller and faster executable. FossilOrigin-Name: 8832fa9088414a8d285a457a4effad0b7d610a87ca73cfb5c5812e784649761e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/parse.y | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2a28256dc6..fd242e54e1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sshell\stool,\savoid\smodifying\sinternal\sdata\sstructures\suntil\safter\sthe\sarguments\sto\s".open"\shave\sbeen\sparsed. -D 2021-12-02T14:16:30.751 +C Move\sthe\sTK_IS\stoken\sso\sthat\sit\sis\sadjacent\sto\sthe\sTK_IN\stoken,\sas\sthis\nallows\sthe\sC\scompiler\sto\soptimize\sbetter,\sresulting\sin\sa\sslightly\ssmaller\nand\sfaster\sexecutable. +D 2021-12-02T14:28:36.785 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -539,7 +539,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c bc10c191d18bffd3d76eda5f162799e43a9f875ecfe7c4869f752e2ddef87ea2 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e +F src/parse.y 761b5d30a7ea9bd2db3b3571438cfcceb5f7dbf4fcad6881c8de65bdda07135a F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3312be1db3519074393573265459f6a1eeabce541a9ef4d93689529ea2b8f739 -R 7b39f65268d7d5d5ddeb7e728b46cc8a -U dan -Z 6583dbaeea3c12c619555be53ea08d30 +P fcc509d325dabe06275e7804183bb8b4ba6470a45b443bc8292eecd0974e6367 +R 888c8c19b41c8406ec3840142d61350f +U drh +Z 0b6dacbe87596435aee017d0aa63fe31 diff --git a/manifest.uuid b/manifest.uuid index c442c9baae..1a7fe9bc70 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fcc509d325dabe06275e7804183bb8b4ba6470a45b443bc8292eecd0974e6367 \ No newline at end of file +8832fa9088414a8d285a457a4effad0b7d610a87ca73cfb5c5812e784649761e \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 97a26c28e8..559057f9ae 100644 --- a/src/parse.y +++ b/src/parse.y @@ -236,7 +236,7 @@ columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,A,Y);} // %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST. %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL. -%token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. +%token OR AND NOT MATCH LIKE_KW BETWEEN IS IN ISNULL NOTNULL NE EQ. %token GT LE LT GE ESCAPE. // The following directive causes tokens ABORT, AFTER, ASC, etc. to From 65a3c8508d3ebd32a1df2d1d72cdf23bf5f7892f Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Dec 2021 18:15:16 +0000 Subject: [PATCH 09/13] Optimizations to exprAnalyze() and sqlite3WhereExprUsage() save about 1.5 million CPU cycles for speedtest1, and result in a smaller binary. FossilOrigin-Name: 1f2252e65dc5847c82246fab87dcad035bf594ba7c45362de87a009b7ebcf2d6 --- manifest | 12 +++++----- manifest.uuid | 2 +- src/whereexpr.c | 64 ++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index fd242e54e1..65ea3a6c49 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\sthe\sTK_IS\stoken\sso\sthat\sit\sis\sadjacent\sto\sthe\sTK_IN\stoken,\sas\sthis\nallows\sthe\sC\scompiler\sto\soptimize\sbetter,\sresulting\sin\sa\sslightly\ssmaller\nand\sfaster\sexecutable. -D 2021-12-02T14:28:36.785 +C Optimizations\sto\sexprAnalyze()\sand\ssqlite3WhereExprUsage()\ssave\sabout\s1.5\nmillion\sCPU\scycles\sfor\sspeedtest1,\sand\sresult\sin\sa\ssmaller\sbinary. +D 2021-12-02T18:15:16.866 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -640,7 +640,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c b50391df607937593596fbb8ea39f673d9a3715a65750567b442d22dd20720ca F src/whereInt.h 1630d9418512b080598e9a72b8af6b8bd1b9ab13fee1458f151762b6df206791 F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 -F src/whereexpr.c da93d2227cc5246fe4a79d130f2a1a215017e12d76a035434145c443abd6f64b +F src/whereexpr.c ac082ec617802e7fc9c190aa0819696a7144a8aa0cad91948323b83720e5105c F src/window.c 5d3b397b0c026d0ff5890244ac41359e524c01ae31e78782e1ff418c3e271a9e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fcc509d325dabe06275e7804183bb8b4ba6470a45b443bc8292eecd0974e6367 -R 888c8c19b41c8406ec3840142d61350f +P 8832fa9088414a8d285a457a4effad0b7d610a87ca73cfb5c5812e784649761e +R 7228b3364cf2efa906def2eee014e4fe U drh -Z 0b6dacbe87596435aee017d0aa63fe31 +Z 0ddb7e6cff00de145e1d39d556b5aab6 diff --git a/manifest.uuid b/manifest.uuid index 1a7fe9bc70..a9c01fe47e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8832fa9088414a8d285a457a4effad0b7d610a87ca73cfb5c5812e784649761e \ No newline at end of file +1f2252e65dc5847c82246fab87dcad035bf594ba7c45362de87a009b7ebcf2d6 \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index bb013f1c6f..542114e91d 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1076,6 +1076,7 @@ static void exprAnalyze( pExpr = pTerm->pExpr; assert( pExpr!=0 ); /* Because malloc() has not failed */ assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); + pMaskSet->bVarSelect = 0; prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); op = pExpr->op; if( op==TK_IN ){ @@ -1086,12 +1087,25 @@ static void exprAnalyze( }else{ pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); } + prereqAll = prereqLeft | pTerm->prereqRight; }else{ pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); + if( pExpr->pLeft==0 || ExprUseXSelect(pExpr) || pExpr->x.pList!=0 ){ + prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); + }else{ + prereqAll = prereqLeft | pTerm->prereqRight; + } } - pMaskSet->bVarSelect = 0; - prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT; + +#ifdef SQLITE_DEBUG + if( prereqAll!=sqlite3WhereExprUsageNN(pMaskSet, pExpr) ){ + printf("\n*** Incorrect prereqAll computed for:\n"); + sqlite3TreeViewExpr(0,pExpr,0); + abort(); + } +#endif + if( ExprHasProperty(pExpr, EP_FromJoin) ){ Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); prereqAll |= x; @@ -1556,15 +1570,38 @@ void sqlite3WhereClauseClear(WhereClause *pWC){ ** These routines walk (recursively) an expression tree and generate ** a bitmask indicating which tables are used in that expression ** tree. +** +** sqlite3WhereExprUsage(MaskSet, Expr) -> +** +** Return a Bitmask of all tables referenced by Expr. Expr can be +** be NULL, in which case 0 is returned. +** +** sqlite3WhereExprUsageNN(MaskSet, Expr) -> +** +** Same as sqlite3WhereExprUsage() except that Expr must not be +** NULL. The "NN" suffix on the name stands for "Not Null". +** +** sqlite3WhereExprListUsage(MaskSet, ExprList) -> +** +** Return a Bitmask of all tables referenced by every expression +** in the expression list ExprList. ExprList can be NULL, in which +** case 0 is returned. +** +** sqlite3WhereExprUsageFull(MaskSet, ExprList) -> +** +** Internal use only. Called only by sqlite3WhereExprUsageNN() for +** complex expressions that require pushing register values onto +** the stack. Many calls to sqlite3WhereExprUsageNN() do not need +** the more complex analysis done by this routine. Hence, the +** computations done by this routine are broken out into a separate +** "no-inline" function to avoid the stack push overhead in the +** common case where it is not needed. */ -Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ +static SQLITE_NOINLINE Bitmask sqlite3WhereExprUsageFull( + WhereMaskSet *pMaskSet, + Expr *p +){ Bitmask mask; - if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ - return sqlite3WhereGetMask(pMaskSet, p->iTable); - }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ - assert( p->op!=TK_IF_NULL_ROW ); - return 0; - } mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0; if( p->pLeft ) mask |= sqlite3WhereExprUsageNN(pMaskSet, p->pLeft); if( p->pRight ){ @@ -1586,6 +1623,15 @@ Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ #endif return mask; } +Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ + if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ + return sqlite3WhereGetMask(pMaskSet, p->iTable); + }else if( ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + assert( p->op!=TK_IF_NULL_ROW ); + return 0; + } + return sqlite3WhereExprUsageFull(pMaskSet, p); +} Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ return p ? sqlite3WhereExprUsageNN(pMaskSet,p) : 0; } From 2f0bc1d41b0956c75822332dc1af1c680291071a Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 3 Dec 2021 13:42:41 +0000 Subject: [PATCH 10/13] Performance optimization in the B-Tree cursor allocator btreeCursor(), making it about 800K CPU cycles faster in speedtest1, and reducing the executable size by about 100 bytes. FossilOrigin-Name: 9df939716ace8cfe60340bbe83fc52d452ea40c29c856c588f9a1b8973282391 --- manifest | 12 ++++----- manifest.uuid | 2 +- src/btree.c | 74 ++++++++++++++++++++++++++++++--------------------- 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index 65ea3a6c49..18e751c5d3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Optimizations\sto\sexprAnalyze()\sand\ssqlite3WhereExprUsage()\ssave\sabout\s1.5\nmillion\sCPU\scycles\sfor\sspeedtest1,\sand\sresult\sin\sa\ssmaller\sbinary. -D 2021-12-02T18:15:16.866 +C Performance\soptimization\sin\sthe\sB-Tree\scursor\sallocator\sbtreeCursor(),\smaking\nit\sabout\s800K\sCPU\scycles\sfaster\sin\sspeedtest1,\sand\sreducing\sthe\sexecutable\nsize\sby\sabout\s100\sbytes. +D 2021-12-03T13:42:41.900 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,7 +491,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 13b965a0f3cd57221e3b4e61e24452ec264a5b163de347b03b5039ddcd95cd54 +F src/btree.c be33f2b299c2d1dcdd6c033368731b81c13c2dbc72fe15af64a43871f6cdb437 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c 179b11b07484497052096d88b953b9a6c22cbb0c23ba75c4347e9a99dae4a6c0 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8832fa9088414a8d285a457a4effad0b7d610a87ca73cfb5c5812e784649761e -R 7228b3364cf2efa906def2eee014e4fe +P 1f2252e65dc5847c82246fab87dcad035bf594ba7c45362de87a009b7ebcf2d6 +R 8e0c1c78e15dfcc0933f0a89f97b367f U drh -Z 0ddb7e6cff00de145e1d39d556b5aab6 +Z 5947065c8f3472b5a2f6d47907db0ceb diff --git a/manifest.uuid b/manifest.uuid index a9c01fe47e..380663b6d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f2252e65dc5847c82246fab87dcad035bf594ba7c45362de87a009b7ebcf2d6 \ No newline at end of file +9df939716ace8cfe60340bbe83fc52d452ea40c29c856c588f9a1b8973282391 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index ba35af03f0..7dfce901ab 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2693,30 +2693,40 @@ static int removeFromSharingList(BtShared *pBt){ ** MX_CELL_SIZE(pBt) bytes with a 4-byte prefix for a left-child ** pointer. */ -static void allocateTempSpace(BtShared *pBt){ - if( !pBt->pTmpSpace ){ - pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize ); - - /* One of the uses of pBt->pTmpSpace is to format cells before - ** inserting them into a leaf page (function fillInCell()). If - ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes - ** by the various routines that manipulate binary cells. Which - ** can mean that fillInCell() only initializes the first 2 or 3 - ** bytes of pTmpSpace, but that the first 4 bytes are copied from - ** it into a database page. This is not actually a problem, but it - ** does cause a valgrind error when the 1 or 2 bytes of unitialized - ** data is passed to system call write(). So to avoid this error, - ** zero the first 4 bytes of temp space here. - ** - ** Also: Provide four bytes of initialized space before the - ** beginning of pTmpSpace as an area available to prepend the - ** left-child pointer to the beginning of a cell. - */ - if( pBt->pTmpSpace ){ - memset(pBt->pTmpSpace, 0, 8); - pBt->pTmpSpace += 4; - } +static SQLITE_NOINLINE int allocateTempSpace(BtShared *pBt){ + assert( pBt!=0 ); + assert( pBt->pTmpSpace==0 ); + /* This routine is called only by btreeCursor() when allocating the + ** first write cursor for the BtShared object */ + assert( pBt->pCursor!=0 && (pBt->pCursor->curFlags & BTCF_WriteFlag)!=0 ); + pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize ); + if( pBt->pTmpSpace==0 ){ + BtCursor *pCur = pBt->pCursor; + pBt->pCursor = pCur->pNext; /* Unlink the cursor */ + memset(pCur, 0, sizeof(*pCur)); + return SQLITE_NOMEM_BKPT; } + + /* One of the uses of pBt->pTmpSpace is to format cells before + ** inserting them into a leaf page (function fillInCell()). If + ** a cell is less than 4 bytes in size, it is rounded up to 4 bytes + ** by the various routines that manipulate binary cells. Which + ** can mean that fillInCell() only initializes the first 2 or 3 + ** bytes of pTmpSpace, but that the first 4 bytes are copied from + ** it into a database page. This is not actually a problem, but it + ** does cause a valgrind error when the 1 or 2 bytes of unitialized + ** data is passed to system call write(). So to avoid this error, + ** zero the first 4 bytes of temp space here. + ** + ** Also: Provide four bytes of initialized space before the + ** beginning of pTmpSpace as an area available to prepend the + ** left-child pointer to the beginning of a cell. + */ + if( pBt->pTmpSpace ){ + memset(pBt->pTmpSpace, 0, 8); + pBt->pTmpSpace += 4; + } + return SQLITE_OK; } /* @@ -4457,10 +4467,6 @@ static int btreeCursor( assert( pBt->pPage1 && pBt->pPage1->aData ); assert( wrFlag==0 || (pBt->btsFlags & BTS_READ_ONLY)==0 ); - if( wrFlag ){ - allocateTempSpace(pBt); - if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT; - } if( iTable<=1 ){ if( iTable<1 ){ return SQLITE_CORRUPT_BKPT; @@ -4477,19 +4483,25 @@ static int btreeCursor( pCur->pKeyInfo = pKeyInfo; pCur->pBtree = p; pCur->pBt = pBt; - pCur->curFlags = wrFlag ? BTCF_WriteFlag : 0; - pCur->curPagerFlags = wrFlag ? 0 : PAGER_GET_READONLY; + pCur->curFlags = 0; /* If there are two or more cursors on the same btree, then all such ** cursors *must* have the BTCF_Multiple flag set. */ for(pX=pBt->pCursor; pX; pX=pX->pNext){ if( pX->pgnoRoot==iTable ){ pX->curFlags |= BTCF_Multiple; - pCur->curFlags |= BTCF_Multiple; + pCur->curFlags = BTCF_Multiple; } } + pCur->eState = CURSOR_INVALID; pCur->pNext = pBt->pCursor; pBt->pCursor = pCur; - pCur->eState = CURSOR_INVALID; + if( wrFlag ){ + pCur->curFlags |= BTCF_WriteFlag; + pCur->curPagerFlags = 0; + if( pBt->pTmpSpace==0 ) return allocateTempSpace(pBt); + }else{ + pCur->curPagerFlags = PAGER_GET_READONLY; + } return SQLITE_OK; } static int btreeCursorWithLock( From fd4bf7746b2ce6a5b44ba3b237a5671327abcb4c Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 3 Dec 2021 14:43:49 +0000 Subject: [PATCH 11/13] Fix an over-length source code line in build.c. No logic changes. FossilOrigin-Name: b9db5c5fc618a36d70ea2aced9c96094d665935b5c15a987013334f1bd79eb00 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 14 +++++++------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 18e751c5d3..1a4e57e525 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sin\sthe\sB-Tree\scursor\sallocator\sbtreeCursor(),\smaking\nit\sabout\s800K\sCPU\scycles\sfaster\sin\sspeedtest1,\sand\sreducing\sthe\sexecutable\nsize\sby\sabout\s100\sbytes. -D 2021-12-03T13:42:41.900 +C Fix\san\sover-length\ssource\scode\sline\sin\sbuild.c.\s\sNo\slogic\schanges. +D 2021-12-03T14:43:49.562 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -494,7 +494,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c be33f2b299c2d1dcdd6c033368731b81c13c2dbc72fe15af64a43871f6cdb437 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 -F src/build.c 179b11b07484497052096d88b953b9a6c22cbb0c23ba75c4347e9a99dae4a6c0 +F src/build.c 70759481a346322934332485381805c9ba9442bbe7959bf40bdc14140c832517 F src/callback.c 106b585da1edd57d75fa579d823a5218e0bf37f191dbf7417eeb4a8a9a267dbc F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1f2252e65dc5847c82246fab87dcad035bf594ba7c45362de87a009b7ebcf2d6 -R 8e0c1c78e15dfcc0933f0a89f97b367f +P 9df939716ace8cfe60340bbe83fc52d452ea40c29c856c588f9a1b8973282391 +R 9393106c7ba9e646319a5d3ddfef6c69 U drh -Z 5947065c8f3472b5a2f6d47907db0ceb +Z 97067e9e4125723429bb82f48b4944e2 diff --git a/manifest.uuid b/manifest.uuid index 380663b6d6..e4938138ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9df939716ace8cfe60340bbe83fc52d452ea40c29c856c588f9a1b8973282391 \ No newline at end of file +b9db5c5fc618a36d70ea2aced9c96094d665935b5c15a987013334f1bd79eb00 \ No newline at end of file diff --git a/src/build.c b/src/build.c index d225227de8..538a1e4d7f 100644 --- a/src/build.c +++ b/src/build.c @@ -4406,13 +4406,13 @@ void sqlite3CreateIndex( /* Add an entry in sqlite_schema for this index */ sqlite3NestedParse(pParse, - "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", - db->aDb[iDb].zDbSName, - pIndex->zName, - pTab->zName, - iMem, - zStmt - ); + "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", + db->aDb[iDb].zDbSName, + pIndex->zName, + pTab->zName, + iMem, + zStmt + ); sqlite3DbFree(db, zStmt); /* Fill the index with data and reparse the schema. Code an OP_Expire From 11e4fdb94861a92e9e14476a8a7cea58d559bb1b Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 3 Dec 2021 14:57:05 +0000 Subject: [PATCH 12/13] Fix unreachable branches resulting from prior optimizations. FossilOrigin-Name: f3d6853ee80be2dc6d7236d98b850beb0e1931a624d4f5b194c8db742cde7ec5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 6 ++---- src/whereexpr.c | 2 +- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 1a4e57e525..dc6fa42308 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sover-length\ssource\scode\sline\sin\sbuild.c.\s\sNo\slogic\schanges. -D 2021-12-03T14:43:49.562 +C Fix\sunreachable\sbranches\sresulting\sfrom\sprior\soptimizations. +D 2021-12-03T14:57:05.912 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,7 +491,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c be33f2b299c2d1dcdd6c033368731b81c13c2dbc72fe15af64a43871f6cdb437 +F src/btree.c 81feddbcc60d524518a7afc713b6dab0ad7caadb7370433f117c8c557dcdc889 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c 70759481a346322934332485381805c9ba9442bbe7959bf40bdc14140c832517 @@ -640,7 +640,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c b50391df607937593596fbb8ea39f673d9a3715a65750567b442d22dd20720ca F src/whereInt.h 1630d9418512b080598e9a72b8af6b8bd1b9ab13fee1458f151762b6df206791 F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 -F src/whereexpr.c ac082ec617802e7fc9c190aa0819696a7144a8aa0cad91948323b83720e5105c +F src/whereexpr.c 779b3230a76510de63f5d45e47df931be05320a8f290c287130a30344c73ea1f F src/window.c 5d3b397b0c026d0ff5890244ac41359e524c01ae31e78782e1ff418c3e271a9e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9df939716ace8cfe60340bbe83fc52d452ea40c29c856c588f9a1b8973282391 -R 9393106c7ba9e646319a5d3ddfef6c69 +P b9db5c5fc618a36d70ea2aced9c96094d665935b5c15a987013334f1bd79eb00 +R 62fc2562c9bdca584bc5f7af404e360c U drh -Z 97067e9e4125723429bb82f48b4944e2 +Z a47d8ad1f6786c210062821f95b3efde diff --git a/manifest.uuid b/manifest.uuid index e4938138ce..a6d9596b1b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9db5c5fc618a36d70ea2aced9c96094d665935b5c15a987013334f1bd79eb00 \ No newline at end of file +f3d6853ee80be2dc6d7236d98b850beb0e1931a624d4f5b194c8db742cde7ec5 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 7dfce901ab..5060140731 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2722,10 +2722,8 @@ static SQLITE_NOINLINE int allocateTempSpace(BtShared *pBt){ ** beginning of pTmpSpace as an area available to prepend the ** left-child pointer to the beginning of a cell. */ - if( pBt->pTmpSpace ){ - memset(pBt->pTmpSpace, 0, 8); - pBt->pTmpSpace += 4; - } + memset(pBt->pTmpSpace, 0, 8); + pBt->pTmpSpace += 4; return SQLITE_OK; } diff --git a/src/whereexpr.c b/src/whereexpr.c index 542114e91d..852c56f385 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1090,7 +1090,7 @@ static void exprAnalyze( prereqAll = prereqLeft | pTerm->prereqRight; }else{ pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); - if( pExpr->pLeft==0 || ExprUseXSelect(pExpr) || pExpr->x.pList!=0 ){ + if( pExpr->pLeft==0 || NEVER(ExprUseXSelect(pExpr)) || pExpr->x.pList!=0 ){ prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); }else{ prereqAll = prereqLeft | pTerm->prereqRight; From 60a8e1b43c982e9317e255cafa40702b27ab98f0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 3 Dec 2021 15:48:42 +0000 Subject: [PATCH 13/13] Fix exprAnalyze() after recent performance enhancements so that it is able to handle IF_NULL_ROW opcode correctly, again. FossilOrigin-Name: 8029e6bab508bf0b8ec1df00a829c5d4de2a84d66dc56b9ff03da879ceef7788 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/whereexpr.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index dc6fa42308..e2d4a70289 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sunreachable\sbranches\sresulting\sfrom\sprior\soptimizations. -D 2021-12-03T14:57:05.912 +C Fix\sexprAnalyze()\safter\srecent\sperformance\senhancements\sso\sthat\sit\sis\sable\nto\shandle\sIF_NULL_ROW\sopcode\scorrectly,\sagain. +D 2021-12-03T15:48:42.503 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -640,7 +640,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c b50391df607937593596fbb8ea39f673d9a3715a65750567b442d22dd20720ca F src/whereInt.h 1630d9418512b080598e9a72b8af6b8bd1b9ab13fee1458f151762b6df206791 F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 -F src/whereexpr.c 779b3230a76510de63f5d45e47df931be05320a8f290c287130a30344c73ea1f +F src/whereexpr.c 19394cb463003e9cc9305730b1508b8817a22bb7247170d81234b691a7f05b89 F src/window.c 5d3b397b0c026d0ff5890244ac41359e524c01ae31e78782e1ff418c3e271a9e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1933,7 +1933,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b9db5c5fc618a36d70ea2aced9c96094d665935b5c15a987013334f1bd79eb00 -R 62fc2562c9bdca584bc5f7af404e360c +P f3d6853ee80be2dc6d7236d98b850beb0e1931a624d4f5b194c8db742cde7ec5 +R f7c21b32b86d486ed00c79fd5643ce8f U drh -Z a47d8ad1f6786c210062821f95b3efde +Z 7b145c2e945c01598a45c251b2a2a878 diff --git a/manifest.uuid b/manifest.uuid index a6d9596b1b..2be18ad032 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f3d6853ee80be2dc6d7236d98b850beb0e1931a624d4f5b194c8db742cde7ec5 \ No newline at end of file +8029e6bab508bf0b8ec1df00a829c5d4de2a84d66dc56b9ff03da879ceef7788 \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index 852c56f385..eff7f4ab22 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1090,7 +1090,10 @@ static void exprAnalyze( prereqAll = prereqLeft | pTerm->prereqRight; }else{ pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); - if( pExpr->pLeft==0 || NEVER(ExprUseXSelect(pExpr)) || pExpr->x.pList!=0 ){ + if( pExpr->pLeft==0 + || ExprHasProperty(pExpr, EP_xIsSelect|EP_IfNullRow) + || pExpr->x.pList!=0 + ){ prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); }else{ prereqAll = prereqLeft | pTerm->prereqRight;