aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2017-05-25 00:08:48 +0000
committerdrh <drh@noemail.net>2017-05-25 00:08:48 +0000
commitf43ce0b4450965b62e24479db4f21b1917e6bc6d (patch)
tree7969c44db10ad8b4f2de0df156b54a5400ff9110 /src
parent831265f96291a195281c088947d550a5a9a54c79 (diff)
downloadsqlite-f43ce0b4450965b62e24479db4f21b1917e6bc6d.tar.gz
sqlite-f43ce0b4450965b62e24479db4f21b1917e6bc6d.zip
The TK_IF_NULL_ROW expression node must be treated as a variable that
references the table Expr.iTable. Proposed fix for ticket [7fde638e94287d2c]. FossilOrigin-Name: 77fc23013cebc7797985864b91d78db5d0e2469511732044ebfaf02b891c979a
Diffstat (limited to 'src')
-rw-r--r--src/expr.c8
-rw-r--r--src/whereexpr.c6
2 files changed, 8 insertions, 6 deletions
diff --git a/src/expr.c b/src/expr.c
index 8fc727fcd..201dedcc8 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1740,10 +1740,12 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
testcase( pExpr->op==TK_AGG_COLUMN );
if( pWalker->eCode==3 && pExpr->iTable==pWalker->u.iCur ){
return WRC_Continue;
- }else{
- pWalker->eCode = 0;
- return WRC_Abort;
}
+ /* Fall through */
+ case TK_IF_NULL_ROW:
+ testcase( pExpr->op==TK_IF_NULL_ROW );
+ pWalker->eCode = 0;
+ return WRC_Abort;
case TK_VARIABLE:
if( pWalker->eCode==5 ){
/* Silently convert bound parameters that appear inside of CREATE
diff --git a/src/whereexpr.c b/src/whereexpr.c
index 22dfa6d9b..3625efa1e 100644
--- a/src/whereexpr.c
+++ b/src/whereexpr.c
@@ -1375,11 +1375,11 @@ Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){
Bitmask mask;
if( p==0 ) return 0;
if( p->op==TK_COLUMN ){
- mask = sqlite3WhereGetMask(pMaskSet, p->iTable);
- return mask;
+ return sqlite3WhereGetMask(pMaskSet, p->iTable);
}
+ mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0;
assert( !ExprHasProperty(p, EP_TokenOnly) );
- mask = p->pRight ? sqlite3WhereExprUsage(pMaskSet, p->pRight) : 0;
+ if( p->pRight ) mask |= sqlite3WhereExprUsage(pMaskSet, p->pRight);
if( p->pLeft ) mask |= sqlite3WhereExprUsage(pMaskSet, p->pLeft);
if( ExprHasProperty(p, EP_xIsSelect) ){
mask |= exprSelectUsage(pMaskSet, p->x.pSelect);