aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2014-08-04 16:39:39 +0000
committerdrh <drh@noemail.net>2014-08-04 16:39:39 +0000
commita976979b6e1c01dbdfaeaddee5b3c80fc924ef94 (patch)
treea3e8dfe985684f455e4a4307f594ca2add175e5b /src/expr.c
parentbb53ecb1dbd36de81519086bab2c6589640daf49 (diff)
downloadsqlite-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.c7
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, &regToFree);
- 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;
}