aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-08-30 15:11:08 +0000
committerdrh <drh@noemail.net>2019-08-30 15:11:08 +0000
commit7a231b49738d82582d9f4c31da18da90928d6f10 (patch)
tree184872011e80e2b7c840d01fd225249e9186d12a /src
parent38cefc83c81842f4d4c1c92958e688c3bac14b79 (diff)
downloadsqlite-7a231b49738d82582d9f4c31da18da90928d6f10.tar.gz
sqlite-7a231b49738d82582d9f4c31da18da90928d6f10.zip
The expression "(X IS FALSE) BETWEEN FALSE AND TRUE" does not implie that
X is not NULL. Ticket [fba33c8b1df6a915] FossilOrigin-Name: 057fb8b1809b8b9c8fff0fd0804153b9644f0545c23c6ddc4758bda3381094b9
Diffstat (limited to 'src')
-rw-r--r--src/expr.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/expr.c b/src/expr.c
index 46aea5f3d..27929767c 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -4974,13 +4974,16 @@ int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){
/*
** Return non-zero if Expr p can only be true if pNN is not NULL.
+**
+** Or if seenNot is true, return non-zero if Expr p can only be
+** non-NULL if pNN is not NULL
*/
static int exprImpliesNotNull(
Parse *pParse, /* Parsing context */
Expr *p, /* The expression to be checked */
Expr *pNN, /* The expression that is NOT NULL */
int iTab, /* Table being evaluated */
- int seenNot /* True if p is an operand of NOT */
+ int seenNot /* Return true only if p can be any non-NULL value */
){
assert( p );
assert( pNN );
@@ -4999,12 +5002,12 @@ static int exprImpliesNotNull(
assert( pList!=0 );
assert( pList->nExpr==2 );
if( seenNot ) return 0;
- if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, seenNot)
- || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, seenNot)
+ if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, 1)
+ || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, 1)
){
return 1;
}
- return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot);
+ return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1);
}
case TK_EQ:
case TK_NE: