diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/expr.c | 23 | ||||
-rw-r--r-- | src/resolve.c | 9 | ||||
-rw-r--r-- | src/sqliteInt.h | 2 | ||||
-rw-r--r-- | src/wherecode.c | 12 | ||||
-rw-r--r-- | src/whereexpr.c | 6 |
5 files changed, 26 insertions, 26 deletions
diff --git a/src/expr.c b/src/expr.c index 264f27dbf..5f5e1d058 100644 --- a/src/expr.c +++ b/src/expr.c @@ -316,7 +316,7 @@ static int codeCompare( ** any other type of expression, return 1. */ int sqlite3ExprVectorSize(Expr *pExpr){ - if( (pExpr->flags & EP_Vector)==0 ) return 1; + if( sqlite3ExprIsVector(pExpr)==0 ) return 1; if( pExpr->flags & EP_xIsSelect ){ return pExpr->x.pSelect->pEList->nExpr; } @@ -324,13 +324,23 @@ int sqlite3ExprVectorSize(Expr *pExpr){ } /* +** Return true if expression pExpr is a vector, or false otherwise. +*/ +int sqlite3ExprIsVector(Expr *pExpr){ + return ( + pExpr->op==TK_VECTOR + || (pExpr->op==TK_SELECT && pExpr->x.pSelect->pEList->nExpr>1) + ); +} + +/* ** If the expression passed as the first argument is a TK_VECTOR, return ** a pointer to the i'th field of the vector. Or, if the first argument ** points to a sub-select, return a pointer to the i'th returned column ** value. Otherwise, return a copy of the first argument. */ static Expr *exprVectorField(Expr *pVector, int i){ - if( (pVector->flags & EP_Vector)==0 ){ + if( sqlite3ExprIsVector(pVector)==0 ){ assert( i==0 ); return pVector; }else if( pVector->flags & EP_xIsSelect ){ @@ -3171,7 +3181,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ case TK_NE: case TK_EQ: { Expr *pLeft = pExpr->pLeft; - if( (pLeft->flags & EP_Vector) ){ + if( sqlite3ExprIsVector(pLeft) ){ codeVectorCompare(pParse, pExpr, target); }else{ r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); @@ -3865,7 +3875,7 @@ static void exprCodeBetween( compRight.op = TK_LE; compRight.pLeft = &exprX; compRight.pRight = pExpr->x.pList->a[1].pExpr; - if( (exprX.flags & EP_Vector)==0 ){ + if( sqlite3ExprIsVector(&exprX)==0 ){ exprToRegister(&exprX, sqlite3ExprCodeTemp(pParse, &exprX, ®Free1)); } if( xJumpIf ){ @@ -3949,7 +3959,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ case TK_GE: case TK_NE: case TK_EQ: { - if( pExpr->pLeft->flags & EP_Vector ) goto default_expr; + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; testcase( jumpIfNull==0 ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); @@ -4103,8 +4113,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ case TK_GE: case TK_NE: case TK_EQ: { - if( pExpr->pLeft->flags & EP_Vector ) goto default_expr; - + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; testcase( jumpIfNull==0 ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); diff --git a/src/resolve.c b/src/resolve.c index 4d8873963..77ce37f6d 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -765,10 +765,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ExprSetProperty(pExpr, EP_VarSelect); pNC->ncFlags |= NC_VarSelect; } - - if( pExpr->op==TK_SELECT && pExpr->x.pSelect->pEList->nExpr>1 ){ - ExprSetProperty(pExpr, EP_Vector); - } } break; } @@ -776,11 +772,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); break; } - - case TK_VECTOR: { - ExprSetProperty(pExpr, EP_Vector); - break; - } } return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 9dfc0bcaa..5b3826586 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2327,7 +2327,6 @@ struct Expr { #define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ #define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ #define EP_Alias 0x400000 /* Is an alias for a result set column */ -#define EP_Vector 0x800000 /* This expression is a row value */ /* ** Combinations of two or more EP_* flags @@ -4256,5 +4255,6 @@ int sqlite3DbstatRegister(sqlite3*); #endif int sqlite3ExprVectorSize(Expr *pExpr); +int sqlite3ExprIsVector(Expr *pExpr); #endif /* SQLITEINT_H */ diff --git a/src/wherecode.c b/src/wherecode.c index 5eb520eb3..4f4f14112 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -952,7 +952,7 @@ static void codeDeferredSeek( static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ assert( nReg>0 ); - if( p->flags & EP_Vector ){ + if( sqlite3ExprIsVector(p) ){ int i; if( (p->flags & EP_xIsSelect)==0 ){ ExprList *pList = p->x.pList; @@ -1200,7 +1200,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( pX = pStart->pExpr; assert( pX!=0 ); testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ - if( pX->pRight->flags & EP_Vector ){ + if( sqlite3ExprIsVector(pX->pRight) ){ r1 = rTemp = sqlite3GetTempReg(pParse); codeExprOrVector(pParse, pX->pRight, r1, 1); op = aMoveOp[(pX->op - TK_GT) | 0x0001]; @@ -1231,7 +1231,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( testcase( pEnd->wtFlags & TERM_VIRTUAL ); memEndValue = ++pParse->nMem; codeExprOrVector(pParse, pX->pRight, memEndValue, 1); - if( !(pX->pRight->flags&EP_Vector) && (pX->op==TK_LT || pX->op==TK_GT) ){ + if( 0==sqlite3ExprIsVector(pX->pRight) + && (pX->op==TK_LT || pX->op==TK_GT) + ){ testOp = bRev ? OP_Le : OP_Ge; }else{ testOp = bRev ? OP_Lt : OP_Gt; @@ -1440,7 +1442,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( } nConstraint += nBtm; testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); - if( (pRight->flags & EP_Vector)==0 ){ + if( sqlite3ExprIsVector(pRight)==0 ){ disableTerm(pLevel, pRangeStart); }else{ startEq = 1; @@ -1493,7 +1495,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( nConstraint += nTop; testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); - if( (pRight->flags & EP_Vector)==0 ){ + if( sqlite3ExprIsVector(pRight)==0 ){ disableTerm(pLevel, pRangeEnd); }else{ endEq = 1; diff --git a/src/whereexpr.c b/src/whereexpr.c index 93908e6d3..5997da1e3 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -845,9 +845,7 @@ static int exprMightBeIndexed( ** inequality constraint (>, <, >= or <=), perform the processing ** on the first element of the vector. */ assert( TK_GT+1==TK_LE && TK_GT+2==TK_LT && TK_GT+3==TK_GE ); - if( (pExpr->flags & (EP_Vector|EP_xIsSelect))==EP_Vector - && (op>=TK_GT && op<=TK_GE) - ){ + if( pExpr->op==TK_VECTOR && (op>=TK_GT && op<=TK_GE) ){ pExpr = pExpr->x.pList->a[0].pExpr; } @@ -1186,7 +1184,7 @@ static void exprAnalyze( if( pWC->op==TK_AND && (pExpr->op==TK_EQ || pExpr->op==TK_IS) - && (pExpr->pLeft->flags & EP_Vector) + && sqlite3ExprIsVector(pExpr->pLeft) && ( (pExpr->pLeft->flags & EP_xIsSelect)==0 || (pExpr->pRight->flags & EP_xIsSelect)==0 )){ |