mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-18 10:21:03 +03:00
Small performance improvement and size reduction by reducing the size of
the WhereTerm object. FossilOrigin-Name: 43f7ddad800acf40917c5cc3d926640dbec17c34d5f1cbbb74bd80f44eeed0a5
This commit is contained in:
18
manifest
18
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Avoid\sthe\spossibility\sof\sinteger\soverflow\son\sthe\s--pagecache\soption\sto\nthe\sCLI.\sSee\s[forum:10a2892377|forum\spost\s10a2892377]
|
C Small\sperformance\simprovement\sand\ssize\sreduction\sby\sreducing\sthe\ssize\sof\nthe\sWhereTerm\sobject.
|
||||||
D 2020-09-28T13:34:05.229
|
D 2020-09-28T15:49:43.021
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -622,10 +622,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
|||||||
F src/wal.c 69e770e96fd56cc21608992bf2c6f1f3dc5cf2572d0495c6a643b06c3a679f14
|
F src/wal.c 69e770e96fd56cc21608992bf2c6f1f3dc5cf2572d0495c6a643b06c3a679f14
|
||||||
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
|
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
|
||||||
F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049
|
F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049
|
||||||
F src/where.c 23f47e845e304a41d0b221bf67bd170014ae08b673076813fcd945dda1a3d4af
|
F src/where.c 7ed6512e73e679231ebdeba470055e8d8e871a020b7f3f8dc75e993aaebdcbcd
|
||||||
F src/whereInt.h eb8c2847fb464728533777efec1682b3c074224293b2da73513c61a609efbeab
|
F src/whereInt.h db7472b6eb617b5853ae74bbd755383e2275be72ae03ff07cc8ea141bb146dc8
|
||||||
F src/wherecode.c 9afd600ca9fe831f342121cca48ad8839c8a18ca4e0372518a0a3c8123a8f022
|
F src/wherecode.c 895ff782a62370a823c99dc7e1bca09ffd90392c9fafc007b6d3df4811e88b4f
|
||||||
F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7
|
F src/whereexpr.c 2a05552e808047a93845278c98c6ca64a265fa8e9ffd087c161bb11bfe339866
|
||||||
F src/window.c edd6f5e25a1e8f2b6f5305b7f5f7da7bb35f07f0d432b255b1d4c2fcab4205aa
|
F src/window.c edd6f5e25a1e8f2b6f5305b7f5f7da7bb35f07f0d432b255b1d4c2fcab4205aa
|
||||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||||
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
|
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
|
||||||
@@ -1880,7 +1880,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 4591ee03d7a1ef3f0f6ad0629493fdb7a1c0ddb3277a9e87aa244cb0ca770593
|
P d3d13df31a97648f952beb2e1a783f947a80ec843227985ad9ebd14452d2f654
|
||||||
R 096d8fd2cb406180b5d1086b876d6b9e
|
R 7b8c3cb46dfe068597bdde1b75906671
|
||||||
U drh
|
U drh
|
||||||
Z 99fd9cfbb690a189978738ae4f65f4ca
|
Z d72bcf93f915317cb95885e250422e3c
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
d3d13df31a97648f952beb2e1a783f947a80ec843227985ad9ebd14452d2f654
|
43f7ddad800acf40917c5cc3d926640dbec17c34d5f1cbbb74bd80f44eeed0a5
|
||||||
24
src/where.c
24
src/where.c
@@ -257,7 +257,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
|
|||||||
do{
|
do{
|
||||||
for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){
|
for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){
|
||||||
if( pTerm->leftCursor==iCur
|
if( pTerm->leftCursor==iCur
|
||||||
&& pTerm->u.leftColumn==iColumn
|
&& pTerm->u.x.leftColumn==iColumn
|
||||||
&& (iColumn!=XN_EXPR
|
&& (iColumn!=XN_EXPR
|
||||||
|| sqlite3ExprCompareSkip(pTerm->pExpr->pLeft,
|
|| sqlite3ExprCompareSkip(pTerm->pExpr->pLeft,
|
||||||
pScan->pIdxExpr,iCur)==0)
|
pScan->pIdxExpr,iCur)==0)
|
||||||
@@ -679,8 +679,8 @@ static int termCanDriveIndex(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if( (pTerm->prereqRight & notReady)!=0 ) return 0;
|
if( (pTerm->prereqRight & notReady)!=0 ) return 0;
|
||||||
if( pTerm->u.leftColumn<0 ) return 0;
|
if( pTerm->u.x.leftColumn<0 ) return 0;
|
||||||
aff = pSrc->pTab->aCol[pTerm->u.leftColumn].affinity;
|
aff = pSrc->pTab->aCol[pTerm->u.x.leftColumn].affinity;
|
||||||
if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0;
|
if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0;
|
||||||
testcase( pTerm->pExpr->op==TK_IS );
|
testcase( pTerm->pExpr->op==TK_IS );
|
||||||
return 1;
|
return 1;
|
||||||
@@ -751,7 +751,7 @@ static void constructAutomaticIndex(
|
|||||||
sqlite3ExprDup(pParse->db, pExpr, 0));
|
sqlite3ExprDup(pParse->db, pExpr, 0));
|
||||||
}
|
}
|
||||||
if( termCanDriveIndex(pTerm, pSrc, notReady) ){
|
if( termCanDriveIndex(pTerm, pSrc, notReady) ){
|
||||||
int iCol = pTerm->u.leftColumn;
|
int iCol = pTerm->u.x.leftColumn;
|
||||||
Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
|
Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
|
||||||
testcase( iCol==BMS );
|
testcase( iCol==BMS );
|
||||||
testcase( iCol==BMS-1 );
|
testcase( iCol==BMS-1 );
|
||||||
@@ -804,14 +804,14 @@ static void constructAutomaticIndex(
|
|||||||
idxCols = 0;
|
idxCols = 0;
|
||||||
for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
|
for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
|
||||||
if( termCanDriveIndex(pTerm, pSrc, notReady) ){
|
if( termCanDriveIndex(pTerm, pSrc, notReady) ){
|
||||||
int iCol = pTerm->u.leftColumn;
|
int iCol = pTerm->u.x.leftColumn;
|
||||||
Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
|
Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
|
||||||
testcase( iCol==BMS-1 );
|
testcase( iCol==BMS-1 );
|
||||||
testcase( iCol==BMS );
|
testcase( iCol==BMS );
|
||||||
if( (idxCols & cMask)==0 ){
|
if( (idxCols & cMask)==0 ){
|
||||||
Expr *pX = pTerm->pExpr;
|
Expr *pX = pTerm->pExpr;
|
||||||
idxCols |= cMask;
|
idxCols |= cMask;
|
||||||
pIdx->aiColumn[n] = pTerm->u.leftColumn;
|
pIdx->aiColumn[n] = pTerm->u.x.leftColumn;
|
||||||
pColl = sqlite3ExprCompareCollSeq(pParse, pX);
|
pColl = sqlite3ExprCompareCollSeq(pParse, pX);
|
||||||
assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */
|
assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */
|
||||||
pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY;
|
pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY;
|
||||||
@@ -932,7 +932,7 @@ static sqlite3_index_info *allocateIndexInfo(
|
|||||||
testcase( pTerm->eOperator & WO_ALL );
|
testcase( pTerm->eOperator & WO_ALL );
|
||||||
if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue;
|
if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue;
|
||||||
if( pTerm->wtFlags & TERM_VNULL ) continue;
|
if( pTerm->wtFlags & TERM_VNULL ) continue;
|
||||||
assert( pTerm->u.leftColumn>=(-1) );
|
assert( pTerm->u.x.leftColumn>=(-1) );
|
||||||
nTerm++;
|
nTerm++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -992,8 +992,8 @@ static sqlite3_index_info *allocateIndexInfo(
|
|||||||
){
|
){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
assert( pTerm->u.leftColumn>=(-1) );
|
assert( pTerm->u.x.leftColumn>=(-1) );
|
||||||
pIdxCons[j].iColumn = pTerm->u.leftColumn;
|
pIdxCons[j].iColumn = pTerm->u.x.leftColumn;
|
||||||
pIdxCons[j].iTermOffset = i;
|
pIdxCons[j].iTermOffset = i;
|
||||||
op = pTerm->eOperator & WO_ALL;
|
op = pTerm->eOperator & WO_ALL;
|
||||||
if( op==WO_IN ) op = WO_EQ;
|
if( op==WO_IN ) op = WO_EQ;
|
||||||
@@ -1756,7 +1756,7 @@ void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){
|
|||||||
if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C';
|
if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C';
|
||||||
if( pTerm->eOperator & WO_SINGLE ){
|
if( pTerm->eOperator & WO_SINGLE ){
|
||||||
sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}",
|
sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}",
|
||||||
pTerm->leftCursor, pTerm->u.leftColumn);
|
pTerm->leftCursor, pTerm->u.x.leftColumn);
|
||||||
}else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){
|
}else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){
|
||||||
sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld",
|
sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld",
|
||||||
pTerm->u.pOrInfo->indexable);
|
pTerm->u.pOrInfo->indexable);
|
||||||
@@ -1772,8 +1772,8 @@ void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){
|
|||||||
sqlite3DebugPrintf(" prob=%-3d prereq=%llx,%llx",
|
sqlite3DebugPrintf(" prob=%-3d prereq=%llx,%llx",
|
||||||
pTerm->truthProb, (u64)pTerm->prereqAll, (u64)pTerm->prereqRight);
|
pTerm->truthProb, (u64)pTerm->prereqAll, (u64)pTerm->prereqRight);
|
||||||
}
|
}
|
||||||
if( pTerm->iField ){
|
if( pTerm->u.x.iField ){
|
||||||
sqlite3DebugPrintf(" iField=%d", pTerm->iField);
|
sqlite3DebugPrintf(" iField=%d", pTerm->u.x.iField);
|
||||||
}
|
}
|
||||||
if( pTerm->iParent>=0 ){
|
if( pTerm->iParent>=0 ){
|
||||||
sqlite3DebugPrintf(" iParent=%d", pTerm->iParent);
|
sqlite3DebugPrintf(" iParent=%d", pTerm->iParent);
|
||||||
|
|||||||
@@ -261,9 +261,11 @@ struct WhereTerm {
|
|||||||
u8 eMatchOp; /* Op for vtab MATCH/LIKE/GLOB/REGEXP terms */
|
u8 eMatchOp; /* Op for vtab MATCH/LIKE/GLOB/REGEXP terms */
|
||||||
int iParent; /* Disable pWC->a[iParent] when this term disabled */
|
int iParent; /* Disable pWC->a[iParent] when this term disabled */
|
||||||
int leftCursor; /* Cursor number of X in "X <op> <expr>" */
|
int leftCursor; /* Cursor number of X in "X <op> <expr>" */
|
||||||
int iField; /* Field in (?,?,?) IN (SELECT...) vector */
|
|
||||||
union {
|
union {
|
||||||
|
struct {
|
||||||
int leftColumn; /* Column number of X in "X <op> <expr>" */
|
int leftColumn; /* Column number of X in "X <op> <expr>" */
|
||||||
|
int iField; /* Field in (?,?,?) IN (SELECT...) vector */
|
||||||
|
} x; /* Opcode other than OP_OR or OP_AND */
|
||||||
WhereOrInfo *pOrInfo; /* Extra information if (eOperator & WO_OR)!=0 */
|
WhereOrInfo *pOrInfo; /* Extra information if (eOperator & WO_OR)!=0 */
|
||||||
WhereAndInfo *pAndInfo; /* Extra information if (eOperator& WO_AND)!=0 */
|
WhereAndInfo *pAndInfo; /* Extra information if (eOperator& WO_AND)!=0 */
|
||||||
} u;
|
} u;
|
||||||
|
|||||||
@@ -427,7 +427,7 @@ static Expr *removeUnindexableInClauseTerms(
|
|||||||
|
|
||||||
for(i=iEq; i<pLoop->nLTerm; i++){
|
for(i=iEq; i<pLoop->nLTerm; i++){
|
||||||
if( pLoop->aLTerm[i]->pExpr==pX ){
|
if( pLoop->aLTerm[i]->pExpr==pX ){
|
||||||
int iField = pLoop->aLTerm[i]->iField - 1;
|
int iField = pLoop->aLTerm[i]->u.x.iField - 1;
|
||||||
if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */
|
if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */
|
||||||
pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr);
|
pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr);
|
||||||
pOrigRhs->a[iField].pExpr = 0;
|
pOrigRhs->a[iField].pExpr = 0;
|
||||||
@@ -2414,7 +2414,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
|
|||||||
#endif
|
#endif
|
||||||
assert( !ExprHasProperty(pE, EP_FromJoin) );
|
assert( !ExprHasProperty(pE, EP_FromJoin) );
|
||||||
assert( (pTerm->prereqRight & pLevel->notReady)!=0 );
|
assert( (pTerm->prereqRight & pLevel->notReady)!=0 );
|
||||||
pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady,
|
pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.x.leftColumn, notReady,
|
||||||
WO_EQ|WO_IN|WO_IS, 0);
|
WO_EQ|WO_IN|WO_IS, 0);
|
||||||
if( pAlt==0 ) continue;
|
if( pAlt==0 ) continue;
|
||||||
if( pAlt->wtFlags & (TERM_CODED) ) continue;
|
if( pAlt->wtFlags & (TERM_CODED) ) continue;
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ static void exprAnalyzeOrTerm(
|
|||||||
assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) );
|
assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
iColumn = pOrTerm->u.leftColumn;
|
iColumn = pOrTerm->u.x.leftColumn;
|
||||||
iCursor = pOrTerm->leftCursor;
|
iCursor = pOrTerm->leftCursor;
|
||||||
pLeft = pOrTerm->pExpr->pLeft;
|
pLeft = pOrTerm->pExpr->pLeft;
|
||||||
break;
|
break;
|
||||||
@@ -820,7 +820,7 @@ static void exprAnalyzeOrTerm(
|
|||||||
assert( pOrTerm->eOperator & WO_EQ );
|
assert( pOrTerm->eOperator & WO_EQ );
|
||||||
if( pOrTerm->leftCursor!=iCursor ){
|
if( pOrTerm->leftCursor!=iCursor ){
|
||||||
pOrTerm->wtFlags &= ~TERM_OR_OK;
|
pOrTerm->wtFlags &= ~TERM_OR_OK;
|
||||||
}else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR
|
}else if( pOrTerm->u.x.leftColumn!=iColumn || (iColumn==XN_EXPR
|
||||||
&& sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1)
|
&& sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1)
|
||||||
)){
|
)){
|
||||||
okToChngToIN = 0;
|
okToChngToIN = 0;
|
||||||
@@ -855,7 +855,7 @@ static void exprAnalyzeOrTerm(
|
|||||||
if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue;
|
if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue;
|
||||||
assert( pOrTerm->eOperator & WO_EQ );
|
assert( pOrTerm->eOperator & WO_EQ );
|
||||||
assert( pOrTerm->leftCursor==iCursor );
|
assert( pOrTerm->leftCursor==iCursor );
|
||||||
assert( pOrTerm->u.leftColumn==iColumn );
|
assert( pOrTerm->u.x.leftColumn==iColumn );
|
||||||
pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0);
|
pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0);
|
||||||
pList = sqlite3ExprListAppend(pWInfo->pParse, pList, pDup);
|
pList = sqlite3ExprListAppend(pWInfo->pParse, pList, pDup);
|
||||||
pLeft = pOrTerm->pExpr->pLeft;
|
pLeft = pOrTerm->pExpr->pLeft;
|
||||||
@@ -1091,15 +1091,15 @@ static void exprAnalyze(
|
|||||||
Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight);
|
Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight);
|
||||||
u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV;
|
u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV;
|
||||||
|
|
||||||
if( pTerm->iField>0 ){
|
if( pTerm->u.x.iField>0 ){
|
||||||
assert( op==TK_IN );
|
assert( op==TK_IN );
|
||||||
assert( pLeft->op==TK_VECTOR );
|
assert( pLeft->op==TK_VECTOR );
|
||||||
pLeft = pLeft->x.pList->a[pTerm->iField-1].pExpr;
|
pLeft = pLeft->x.pList->a[pTerm->u.x.iField-1].pExpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( exprMightBeIndexed(pSrc, prereqLeft, aiCurCol, pLeft, op) ){
|
if( exprMightBeIndexed(pSrc, prereqLeft, aiCurCol, pLeft, op) ){
|
||||||
pTerm->leftCursor = aiCurCol[0];
|
pTerm->leftCursor = aiCurCol[0];
|
||||||
pTerm->u.leftColumn = aiCurCol[1];
|
pTerm->u.x.leftColumn = aiCurCol[1];
|
||||||
pTerm->eOperator = operatorMask(op) & opMask;
|
pTerm->eOperator = operatorMask(op) & opMask;
|
||||||
}
|
}
|
||||||
if( op==TK_IS ) pTerm->wtFlags |= TERM_IS;
|
if( op==TK_IS ) pTerm->wtFlags |= TERM_IS;
|
||||||
@@ -1109,7 +1109,7 @@ static void exprAnalyze(
|
|||||||
WhereTerm *pNew;
|
WhereTerm *pNew;
|
||||||
Expr *pDup;
|
Expr *pDup;
|
||||||
u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */
|
u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */
|
||||||
assert( pTerm->iField==0 );
|
assert( pTerm->u.x.iField==0 );
|
||||||
if( pTerm->leftCursor>=0 ){
|
if( pTerm->leftCursor>=0 ){
|
||||||
int idxNew;
|
int idxNew;
|
||||||
pDup = sqlite3ExprDup(db, pExpr, 0);
|
pDup = sqlite3ExprDup(db, pExpr, 0);
|
||||||
@@ -1135,7 +1135,7 @@ static void exprAnalyze(
|
|||||||
}
|
}
|
||||||
pNew->wtFlags |= exprCommute(pParse, pDup);
|
pNew->wtFlags |= exprCommute(pParse, pDup);
|
||||||
pNew->leftCursor = aiCurCol[0];
|
pNew->leftCursor = aiCurCol[0];
|
||||||
pNew->u.leftColumn = aiCurCol[1];
|
pNew->u.x.leftColumn = aiCurCol[1];
|
||||||
testcase( (prereqLeft | extraRight) != prereqLeft );
|
testcase( (prereqLeft | extraRight) != prereqLeft );
|
||||||
pNew->prereqRight = prereqLeft | extraRight;
|
pNew->prereqRight = prereqLeft | extraRight;
|
||||||
pNew->prereqAll = prereqAll;
|
pNew->prereqAll = prereqAll;
|
||||||
@@ -1309,7 +1309,7 @@ static void exprAnalyze(
|
|||||||
pNewTerm = &pWC->a[idxNew];
|
pNewTerm = &pWC->a[idxNew];
|
||||||
pNewTerm->prereqRight = prereqExpr;
|
pNewTerm->prereqRight = prereqExpr;
|
||||||
pNewTerm->leftCursor = pLeft->iTable;
|
pNewTerm->leftCursor = pLeft->iTable;
|
||||||
pNewTerm->u.leftColumn = pLeft->iColumn;
|
pNewTerm->u.x.leftColumn = pLeft->iColumn;
|
||||||
pNewTerm->eOperator = WO_AUX;
|
pNewTerm->eOperator = WO_AUX;
|
||||||
pNewTerm->eMatchOp = eOp2;
|
pNewTerm->eMatchOp = eOp2;
|
||||||
markTermAsChild(pWC, idxNew, idxTerm);
|
markTermAsChild(pWC, idxNew, idxTerm);
|
||||||
@@ -1356,13 +1356,13 @@ static void exprAnalyze(
|
|||||||
/* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create
|
/* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create
|
||||||
** a virtual term for each vector component. The expression object
|
** a virtual term for each vector component. The expression object
|
||||||
** used by each such virtual term is pExpr (the full vector IN(...)
|
** used by each such virtual term is pExpr (the full vector IN(...)
|
||||||
** expression). The WhereTerm.iField variable identifies the index within
|
** expression). The WhereTerm.u.x.iField variable identifies the index within
|
||||||
** the vector on the LHS that the virtual term represents.
|
** the vector on the LHS that the virtual term represents.
|
||||||
**
|
**
|
||||||
** This only works if the RHS is a simple SELECT (not a compound) that does
|
** This only works if the RHS is a simple SELECT (not a compound) that does
|
||||||
** not use window functions.
|
** not use window functions.
|
||||||
*/
|
*/
|
||||||
if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->iField==0
|
if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->u.x.iField==0
|
||||||
&& pExpr->pLeft->op==TK_VECTOR
|
&& pExpr->pLeft->op==TK_VECTOR
|
||||||
&& pExpr->x.pSelect->pPrior==0
|
&& pExpr->x.pSelect->pPrior==0
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
@@ -1373,7 +1373,7 @@ static void exprAnalyze(
|
|||||||
for(i=0; i<sqlite3ExprVectorSize(pExpr->pLeft); i++){
|
for(i=0; i<sqlite3ExprVectorSize(pExpr->pLeft); i++){
|
||||||
int idxNew;
|
int idxNew;
|
||||||
idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL);
|
idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL);
|
||||||
pWC->a[idxNew].iField = i+1;
|
pWC->a[idxNew].u.x.iField = i+1;
|
||||||
exprAnalyze(pSrc, pWC, idxNew);
|
exprAnalyze(pSrc, pWC, idxNew);
|
||||||
markTermAsChild(pWC, idxNew, idxTerm);
|
markTermAsChild(pWC, idxNew, idxTerm);
|
||||||
}
|
}
|
||||||
@@ -1408,7 +1408,7 @@ static void exprAnalyze(
|
|||||||
pNewTerm = &pWC->a[idxNew];
|
pNewTerm = &pWC->a[idxNew];
|
||||||
pNewTerm->prereqRight = 0;
|
pNewTerm->prereqRight = 0;
|
||||||
pNewTerm->leftCursor = pLeft->iTable;
|
pNewTerm->leftCursor = pLeft->iTable;
|
||||||
pNewTerm->u.leftColumn = pLeft->iColumn;
|
pNewTerm->u.x.leftColumn = pLeft->iColumn;
|
||||||
pNewTerm->eOperator = WO_GT;
|
pNewTerm->eOperator = WO_GT;
|
||||||
markTermAsChild(pWC, idxNew, idxTerm);
|
markTermAsChild(pWC, idxNew, idxTerm);
|
||||||
pTerm = &pWC->a[idxTerm];
|
pTerm = &pWC->a[idxTerm];
|
||||||
|
|||||||
Reference in New Issue
Block a user