aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/expr.c23
-rw-r--r--src/resolve.c9
-rw-r--r--src/sqliteInt.h2
-rw-r--r--src/wherecode.c12
-rw-r--r--src/whereexpr.c6
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, &regFree1);
@@ -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, &regFree1));
}
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, &regFree1);
r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
@@ -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, &regFree1);
r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
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
)){