mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-19 21:43:15 +03:00
Updates to requirements marks. No code changes.
FossilOrigin-Name: 213020769f310aec1591d97756b53891d0b64005
This commit is contained in:
40
src/where.c
40
src/where.c
@@ -658,7 +658,7 @@ static void whereClauseClear(WhereClause *pWC){
|
||||
static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){
|
||||
WhereTerm *pTerm;
|
||||
int idx;
|
||||
testcase( wtFlags & TERM_VIRTUAL ); /* EV: R-00211-15100 */
|
||||
testcase( wtFlags & TERM_VIRTUAL );
|
||||
if( pWC->nTerm>=pWC->nSlot ){
|
||||
WhereTerm *pOld = pWC->a;
|
||||
sqlite3 *db = pWC->pWInfo->pParse->db;
|
||||
@@ -803,13 +803,6 @@ static Bitmask exprSelectTableUsage(WhereMaskSet *pMaskSet, Select *pS){
|
||||
** 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"
|
||||
**
|
||||
** IMPLEMENTATION-OF: R-59926-26393 To be usable by an index a term must be
|
||||
** of one of the following forms: column = expression column > expression
|
||||
** column >= expression column < expression column <= expression
|
||||
** expression = column expression > column expression >= column
|
||||
** expression < column expression <= column column IN
|
||||
** (expression-list) column IN (subquery) column IS NULL
|
||||
*/
|
||||
static int allowedOp(int op){
|
||||
assert( TK_GT>TK_EQ && TK_GT<TK_GE );
|
||||
@@ -1483,8 +1476,6 @@ static void exprAnalyzeOrTerm(
|
||||
/* 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.
|
||||
**
|
||||
** EV: R-00211-15100
|
||||
*/
|
||||
if( okToChngToIN ){
|
||||
Expr *pDup; /* A transient duplicate expression */
|
||||
@@ -1726,9 +1717,7 @@ static void exprAnalyze(
|
||||
** 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; /* EV: R-64339-08207 */
|
||||
|
||||
|
||||
if( c=='A'-1 ) isComplete = 0;
|
||||
c = sqlite3UpperToLower[c];
|
||||
}
|
||||
*pC = c + 1;
|
||||
@@ -2818,9 +2807,6 @@ static int whereInScanEst(
|
||||
** 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.
|
||||
**
|
||||
** IMPLEMENTATION-OF: R-24597-58655 No tests are done for terms that are
|
||||
** completely satisfied by indices.
|
||||
**
|
||||
** 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
|
||||
@@ -3050,7 +3036,7 @@ static int codeAllEqualityTerms(
|
||||
/* The following 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 ); /* EV: R-30575-11662 */
|
||||
testcase( pTerm->wtFlags & TERM_VIRTUAL );
|
||||
r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j);
|
||||
if( r1!=regBase+j ){
|
||||
if( nReg==1 ){
|
||||
@@ -3361,7 +3347,7 @@ static Bitmask codeOneLoopStart(
|
||||
assert( pTerm!=0 );
|
||||
assert( pTerm->pExpr!=0 );
|
||||
assert( omitTable==0 );
|
||||
testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
|
||||
testcase( pTerm->wtFlags & TERM_VIRTUAL );
|
||||
iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg);
|
||||
addrNxt = pLevel->addrNxt;
|
||||
sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt);
|
||||
@@ -3409,7 +3395,7 @@ static Bitmask codeOneLoopStart(
|
||||
assert( TK_GE==TK_GT+3 ); /* ... is correcct. */
|
||||
|
||||
assert( (pStart->wtFlags & TERM_VNULL)==0 );
|
||||
testcase( pStart->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
|
||||
testcase( pStart->wtFlags & TERM_VIRTUAL );
|
||||
pX = pStart->pExpr;
|
||||
assert( pX!=0 );
|
||||
testcase( pStart->leftCursor!=iCur ); /* transitive constraints */
|
||||
@@ -3428,7 +3414,7 @@ static Bitmask codeOneLoopStart(
|
||||
assert( pX!=0 );
|
||||
assert( (pEnd->wtFlags & TERM_VNULL)==0 );
|
||||
testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */
|
||||
testcase( pEnd->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
|
||||
testcase( pEnd->wtFlags & TERM_VIRTUAL );
|
||||
memEndValue = ++pParse->nMem;
|
||||
sqlite3ExprCode(pParse, pX->pRight, memEndValue);
|
||||
if( pX->op==TK_LT || pX->op==TK_GT ){
|
||||
@@ -3594,7 +3580,7 @@ static Bitmask codeOneLoopStart(
|
||||
}
|
||||
}
|
||||
nConstraint++;
|
||||
testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
|
||||
testcase( pRangeStart->wtFlags & TERM_VIRTUAL );
|
||||
}else if( isMinQuery ){
|
||||
sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
|
||||
nConstraint++;
|
||||
@@ -3636,7 +3622,7 @@ static Bitmask codeOneLoopStart(
|
||||
}
|
||||
codeApplyAffinity(pParse, regBase, nEq+1, zEndAff);
|
||||
nConstraint++;
|
||||
testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
|
||||
testcase( pRangeEnd->wtFlags & TERM_VIRTUAL );
|
||||
}
|
||||
sqlite3DbFree(db, zStartAff);
|
||||
sqlite3DbFree(db, zEndAff);
|
||||
@@ -3923,14 +3909,10 @@ static Bitmask codeOneLoopStart(
|
||||
|
||||
/* Insert code to test every subexpression that can be completely
|
||||
** computed using the current set of tables.
|
||||
**
|
||||
** IMPLEMENTATION-OF: R-49525-50935 Terms that cannot be satisfied through
|
||||
** the use of indices become tests that are evaluated against each row of
|
||||
** the relevant input tables.
|
||||
*/
|
||||
for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){
|
||||
Expr *pE;
|
||||
testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* IMP: R-30575-11662 */
|
||||
testcase( pTerm->wtFlags & TERM_VIRTUAL );
|
||||
testcase( pTerm->wtFlags & TERM_CODED );
|
||||
if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
|
||||
if( (pTerm->prereqAll & newNotReady)!=0 ){
|
||||
@@ -3990,7 +3972,7 @@ static Bitmask codeOneLoopStart(
|
||||
VdbeComment((v, "record LEFT JOIN hit"));
|
||||
sqlite3ExprCacheClear(pParse);
|
||||
for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){
|
||||
testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* IMP: R-30575-11662 */
|
||||
testcase( pTerm->wtFlags & TERM_VIRTUAL );
|
||||
testcase( pTerm->wtFlags & TERM_CODED );
|
||||
if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
|
||||
if( (pTerm->prereqAll & newNotReady)!=0 ){
|
||||
@@ -5763,7 +5745,7 @@ WhereInfo *sqlite3WhereBegin(
|
||||
initMaskSet(pMaskSet);
|
||||
whereClauseInit(&pWInfo->sWC, pWInfo);
|
||||
sqlite3ExprCodeConstants(pParse, pWhere);
|
||||
whereSplit(&pWInfo->sWC, pWhere, TK_AND); /* IMP: R-15842-53296 */
|
||||
whereSplit(&pWInfo->sWC, pWhere, TK_AND);
|
||||
sqlite3CodeVerifySchema(pParse, -1); /* Insert the cookie verifier Goto */
|
||||
|
||||
/* Special case: a WHERE clause that is constant. Evaluate the
|
||||
|
||||
Reference in New Issue
Block a user