aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2018-02-26 21:26:27 +0000
committerdrh <drh@noemail.net>2018-02-26 21:26:27 +0000
commit43c4ac8bfecba96e4db6d075c5fa743a4fe25ea5 (patch)
treedac39511b539230b7c1a7a7e125b8ad7177dc424 /src/expr.c
parent171d16bb2187b41636980b809d04d923e2811523 (diff)
downloadsqlite-43c4ac8bfecba96e4db6d075c5fa743a4fe25ea5.tar.gz
sqlite-43c4ac8bfecba96e4db6d075c5fa743a4fe25ea5.zip
Code simplifications. New test cases.
FossilOrigin-Name: 57508518ef9d003d259ba98dcc32e5104aca26731a7161808741fe10bc0830d0
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/expr.c b/src/expr.c
index 75d8db7e4..fae2c11d9 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1123,7 +1123,7 @@ static int dupedExprStructSize(Expr *p, int flags){
assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
assert( EXPR_FULLSIZE<=0xfff );
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
- if( 0==flags || p->op==TK_SELECT_COLUMN || p->op==TK_TRUEFALSE ){
+ if( 0==flags || p->op==TK_SELECT_COLUMN ){
nSize = EXPR_FULLSIZE;
}else{
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
@@ -1743,14 +1743,22 @@ int sqlite3ExprIdToTrueFalse(Expr *pExpr){
|| sqlite3StrICmp(pExpr->u.zToken, "false")==0
){
pExpr->op = TK_TRUEFALSE;
- pExpr->iTable = pExpr->u.zToken[4]==0;
- pExpr->pTab = 0;
- ExprSetProperty(pExpr, EP_NoReduce);
return 1;
}
return 0;
}
+/*
+** The argument is one of a TK_TRUEFALSE term. Return 1 if it is TRUE
+** and 0 if it is FALSE.
+*/
+int sqlite3ExprTruthOperand(const Expr *pExpr){
+ assert( pExpr->op==TK_TRUEFALSE );
+ assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0
+ || sqlite3StrICmp(pExpr->u.zToken,"false")==0 );
+ return pExpr->u.zToken[4]==0;
+}
+
/*
** These routines are Walker callbacks used to check expressions to
@@ -3570,7 +3578,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
return target;
}
case TK_TRUEFALSE: {
- sqlite3VdbeAddOp2(v, OP_Integer, pExpr->iTable, target);
+ sqlite3VdbeAddOp2(v, OP_Integer, sqlite3ExprTruthOperand(pExpr), target);
return target;
}
#ifndef SQLITE_OMIT_FLOATING_POINT
@@ -3729,13 +3737,12 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
break;
}
case TK_TRUTH: {
- assert( pExpr->pRight->op==TK_TRUEFALSE );
- assert( pExpr->pRight->iTable==0 || pExpr->pRight->iTable==1 );
- assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT );
+ int isTrue;
r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
testcase( regFree1==0 );
- sqlite3VdbeAddOp4Int(v, OP_IsTrue, r1, inReg, !pExpr->pRight->iTable,
- pExpr->pRight->iTable ^ (pExpr->op2==TK_IS));
+ isTrue = sqlite3ExprTruthOperand(pExpr->pRight);
+ sqlite3VdbeAddOp4Int(v, OP_IsTrue, r1, inReg, !isTrue,
+ isTrue ^ (pExpr->op2==TK_IS));
break;
}
case TK_ISNULL:
@@ -4515,13 +4522,13 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
}
case TK_TRUTH: {
int isNot;
+ int isTrue;
testcase( jumpIfNull==0 );
- assert( pExpr->pRight->op==TK_TRUEFALSE );
- assert( pExpr->pRight->iTable==0 || pExpr->pRight->iTable==1 );
- testcase( pExpr->pRight->iTable==0 );
- assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT );
isNot = pExpr->op2==TK_ISNOT;
- if( pExpr->pRight->iTable ^ isNot ){
+ isTrue = sqlite3ExprTruthOperand(pExpr->pRight);
+ testcase( isTrue && isNot );
+ testcase( isTrue && !isNot );
+ if( isTrue ^ isNot ){
sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest,
isNot ? SQLITE_JUMPIFNULL : 0);
}else{
@@ -4685,15 +4692,15 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
break;
}
case TK_TRUTH: {
- testcase( jumpIfNull==0 );
int isNot;
+ int isTrue;
testcase( jumpIfNull==0 );
- assert( pExpr->pRight->op==TK_TRUEFALSE );
- assert( pExpr->pRight->iTable==0 || pExpr->pRight->iTable==1 );
- testcase( pExpr->pRight->iTable==0 );
assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT );
isNot = pExpr->op2==TK_ISNOT;
- if( pExpr->pRight->iTable ^ isNot ){
+ isTrue = sqlite3ExprTruthOperand(pExpr->pRight);
+ testcase( isTrue && isNot );
+ testcase( isTrue && !isNot );
+ if( isTrue ^ isNot ){
/* IS TRUE and IS NOT FALSE */
sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest,
isNot ? 0 : SQLITE_JUMPIFNULL);