diff options
author | drh <drh@noemail.net> | 2014-08-04 16:39:39 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2014-08-04 16:39:39 +0000 |
commit | a976979b6e1c01dbdfaeaddee5b3c80fc924ef94 (patch) | |
tree | a3e8dfe985684f455e4a4307f594ca2add175e5b /src/expr.c | |
parent | bb53ecb1dbd36de81519086bab2c6589640daf49 (diff) | |
download | sqlite-a976979b6e1c01dbdfaeaddee5b3c80fc924ef94.tar.gz sqlite-a976979b6e1c01dbdfaeaddee5b3c80fc924ef94.zip |
Refinements to the enhanced IN-operator logic.
FossilOrigin-Name: 92ba2821468ecbfac2469161d81c873de67b2243
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/expr.c b/src/expr.c index 7565d41b9..86787a9c3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2006,14 +2006,13 @@ static void sqlite3ExprCodeIN( int regCkNull = 0; int ii; assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); VdbeCoverage(v); if( destIfNull!=destIfFalse ){ regCkNull = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp2(v, OP_Integer, 0, regCkNull); + sqlite3VdbeAddOp3(v, OP_BitAnd, r1, r1, regCkNull); } for(ii=0; ii<pList->nExpr; ii++){ r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); - if( regCkNull ){ + if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); } if( ii<pList->nExpr-1 || destIfNull!=destIfFalse ){ @@ -2722,7 +2721,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ addr = sqlite3VdbeAddOp1(v, op, r1); VdbeCoverageIf(v, op==TK_ISNULL); VdbeCoverageIf(v, op==TK_NOTNULL); - sqlite3VdbeAddOp2(v, OP_AddImm, target, -1); + sqlite3VdbeAddOp2(v, OP_Integer, 0, target); sqlite3VdbeJumpHere(v, addr); break; } |