Get the likelihood() functions working on operators like BETWEEN that

create virtual terms in the WHERE-clause analysis.

FossilOrigin-Name: 03d0498d0f24bec2383d5d79edf25069effecd59
This commit is contained in:
drh 2014-10-24 14:32:21 +00:00
parent 4f81bbb528
commit 9769efcc4c
3 changed files with 23 additions and 20 deletions

View File

@ -1,5 +1,5 @@
C Implement\ssqlite3_create_collation()\sby\sinvoking\s\nsqlite3_create_collation_v2()\swith\sa\sNULL\sdestructor\sargument.\s\sThis\ssaves\na\slittle\sspace. C Get\sthe\slikelihood()\sfunctions\sworking\son\soperators\slike\sBETWEEN\sthat\ncreate\svirtual\sterms\sin\sthe\sWHERE-clause\sanalysis.
D 2014-10-23T01:01:26.636 D 2014-10-24T14:32:21.050
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -302,7 +302,7 @@ F src/vtab.c cb0c194303fea276b48d7d4b6d970b5a96bde8de
F src/wal.c 10e7de7ce90865a68153f001a61f1d985cd17983 F src/wal.c 10e7de7ce90865a68153f001a61f1d985cd17983
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
F src/where.c 2cd9e0af718d736459ae9d3b0f4532b4a80640d0 F src/where.c 746d4f22d75c1f000d6dae251dc65bf755c395a8
F src/whereInt.h 4b459cdbfc9b01f5f27673a35f9967e4dea917e8 F src/whereInt.h 4b459cdbfc9b01f5f27673a35f9967e4dea917e8
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@ -1205,7 +1205,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P e580470db77d6da970c755102790e603fb26b3c6 P 9762ad0639cca2fc1ef0573113fb613ce9e7e83e
R f159389d59e4350424d5f438676d787b R f460b87a81ee1fb775b7700e4252ece6
U drh U drh
Z 177632e852e703fce9e831bfbe27f418 Z 1428b6fe81396b49c1c6b7022fde286d

View File

@ -1 +1 @@
9762ad0639cca2fc1ef0573113fb613ce9e7e83e 03d0498d0f24bec2383d5d79edf25069effecd59

View File

@ -756,6 +756,15 @@ static void transferJoinMarkings(Expr *pDerived, Expr *pBase){
} }
} }
/*
** 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++;
}
#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) #if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
/* /*
** Analyze a term that consists of two or more OR-connected ** Analyze a term that consists of two or more OR-connected
@ -1053,8 +1062,7 @@ static void exprAnalyzeOrTerm(
testcase( idxNew==0 ); testcase( idxNew==0 );
exprAnalyze(pSrc, pWC, idxNew); exprAnalyze(pSrc, pWC, idxNew);
pTerm = &pWC->a[idxTerm]; pTerm = &pWC->a[idxTerm];
pWC->a[idxNew].iParent = idxTerm; markTermAsChild(pWC, idxNew, idxTerm);
pTerm->nChild = 1;
}else{ }else{
sqlite3ExprListDelete(db, pList); sqlite3ExprListDelete(db, pList);
} }
@ -1156,9 +1164,8 @@ static void exprAnalyze(
idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC); idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC);
if( idxNew==0 ) return; if( idxNew==0 ) return;
pNew = &pWC->a[idxNew]; pNew = &pWC->a[idxNew];
pNew->iParent = idxTerm; markTermAsChild(pWC, idxNew, idxTerm);
pTerm = &pWC->a[idxTerm]; pTerm = &pWC->a[idxTerm];
pTerm->nChild = 1;
pTerm->wtFlags |= TERM_COPIED; pTerm->wtFlags |= TERM_COPIED;
if( pExpr->op==TK_EQ if( pExpr->op==TK_EQ
&& !ExprHasProperty(pExpr, EP_FromJoin) && !ExprHasProperty(pExpr, EP_FromJoin)
@ -1215,9 +1222,8 @@ static void exprAnalyze(
testcase( idxNew==0 ); testcase( idxNew==0 );
exprAnalyze(pSrc, pWC, idxNew); exprAnalyze(pSrc, pWC, idxNew);
pTerm = &pWC->a[idxTerm]; pTerm = &pWC->a[idxTerm];
pWC->a[idxNew].iParent = idxTerm; markTermAsChild(pWC, idxNew, idxTerm);
} }
pTerm->nChild = 2;
} }
#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */ #endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */
@ -1292,9 +1298,8 @@ static void exprAnalyze(
exprAnalyze(pSrc, pWC, idxNew2); exprAnalyze(pSrc, pWC, idxNew2);
pTerm = &pWC->a[idxTerm]; pTerm = &pWC->a[idxTerm];
if( isComplete ){ if( isComplete ){
pWC->a[idxNew1].iParent = idxTerm; markTermAsChild(pWC, idxNew1, idxTerm);
pWC->a[idxNew2].iParent = idxTerm; markTermAsChild(pWC, idxNew2, idxTerm);
pTerm->nChild = 2;
} }
} }
#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ #endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */
@ -1327,9 +1332,8 @@ static void exprAnalyze(
pNewTerm->leftCursor = pLeft->iTable; pNewTerm->leftCursor = pLeft->iTable;
pNewTerm->u.leftColumn = pLeft->iColumn; pNewTerm->u.leftColumn = pLeft->iColumn;
pNewTerm->eOperator = WO_MATCH; pNewTerm->eOperator = WO_MATCH;
pNewTerm->iParent = idxTerm; markTermAsChild(pWC, idxNew, idxTerm);
pTerm = &pWC->a[idxTerm]; pTerm = &pWC->a[idxTerm];
pTerm->nChild = 1;
pTerm->wtFlags |= TERM_COPIED; pTerm->wtFlags |= TERM_COPIED;
pNewTerm->prereqAll = pTerm->prereqAll; pNewTerm->prereqAll = pTerm->prereqAll;
} }
@ -1369,9 +1373,8 @@ static void exprAnalyze(
pNewTerm->leftCursor = pLeft->iTable; pNewTerm->leftCursor = pLeft->iTable;
pNewTerm->u.leftColumn = pLeft->iColumn; pNewTerm->u.leftColumn = pLeft->iColumn;
pNewTerm->eOperator = WO_GT; pNewTerm->eOperator = WO_GT;
pNewTerm->iParent = idxTerm; markTermAsChild(pWC, idxNew, idxTerm);
pTerm = &pWC->a[idxTerm]; pTerm = &pWC->a[idxTerm];
pTerm->nChild = 1;
pTerm->wtFlags |= TERM_COPIED; pTerm->wtFlags |= TERM_COPIED;
pNewTerm->prereqAll = pTerm->prereqAll; pNewTerm->prereqAll = pTerm->prereqAll;
} }