aboutsummaryrefslogtreecommitdiff
path: root/src/resolve.c
diff options
context:
space:
mode:
authordan <Dan Kennedy>2023-03-03 16:25:18 +0000
committerdan <Dan Kennedy>2023-03-03 16:25:18 +0000
commit04337898635b3048691b795f2f1922b3fda2ddc9 (patch)
tree7062a8beff465bcb49f9ea82e9aae1d8ecd28382 /src/resolve.c
parentdc81902445ae7f2446fc9f3575cb2c2b78b18341 (diff)
downloadsqlite-04337898635b3048691b795f2f1922b3fda2ddc9.tar.gz
sqlite-04337898635b3048691b795f2f1922b3fda2ddc9.zip
When it is known when preparing a statement that X cannot be NULL, transform the expression (X IS NULL) to integer value 1 instead of 'true'. This is because under some circumstances, "Y IS TRUE" may not be equivalent to "Y IS 1".
FossilOrigin-Name: cc4bb05b3653e9502b95ea6fe0bfb77feebc11285b66e1dde4c7b945928efbf1
Diffstat (limited to 'src/resolve.c')
-rw-r--r--src/resolve.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/src/resolve.c b/src/resolve.c
index 9677f9de9..dfb343439 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -947,14 +947,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){
testcase( ExprHasProperty(pExpr, EP_OuterON) );
assert( !ExprHasProperty(pExpr, EP_IntValue) );
- if( pExpr->op==TK_NOTNULL ){
- pExpr->u.zToken = "true";
- ExprSetProperty(pExpr, EP_IsTrue);
- }else{
- pExpr->u.zToken = "false";
- ExprSetProperty(pExpr, EP_IsFalse);
- }
- pExpr->op = TK_TRUEFALSE;
+ pExpr->u.iValue = (pExpr->op==TK_NOTNULL);
+ pExpr->flags |= EP_IntValue;
+ pExpr->op = TK_INTEGER;
+
for(i=0, p=pNC; p && i<ArraySize(anRef); p=p->pNext, i++){
p->nRef = anRef[i];
}