aboutsummaryrefslogtreecommitdiff
path: root/src/resolve.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/resolve.c')
-rw-r--r--src/resolve.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/resolve.c b/src/resolve.c
index f735fffa0..fb00788dd 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -431,10 +431,22 @@ static int lookupName(
** Because no reference was made to outer contexts, the pNC->nRef
** fields are not changed in any context.
*/
- if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){
- pExpr->op = TK_STRING;
- pExpr->pTab = 0;
- return WRC_Prune;
+ if( cnt==0 && zTab==0 ){
+ if( ExprHasProperty(pExpr,EP_DblQuoted) ){
+ pExpr->op = TK_STRING;
+ pExpr->pTab = 0;
+ return WRC_Prune;
+ }
+ if( sqlite3StrICmp(zCol, "true")==0 ){
+ pExpr->op = TK_TRUE;
+ pExpr->pTab = 0;
+ return WRC_Prune;
+ }
+ if( sqlite3StrICmp(zCol, "false")==0 ){
+ pExpr->op = TK_FALSE;
+ pExpr->pTab = 0;
+ return WRC_Prune;
+ }
}
/*
@@ -783,6 +795,21 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr);
break;
}
+ case TK_IS:
+ /* Handle special cases of "x IS TRUE" and "x IS FALSE". The first
+ ** is transformed into "+x" and the second into "NOT x". */
+ if( pExpr->pRight->op==TK_ID ){
+ int rc = resolveExprStep(pWalker, pExpr->pRight);
+ if( rc==WRC_Abort ) return WRC_Abort;
+ if( pExpr->pRight->op==TK_TRUE ){
+ pExpr->op = TK_ISTRUE;
+ return WRC_Continue;
+ }else if( pExpr->pRight->op==TK_FALSE ){
+ pExpr->op = TK_NOT;
+ return WRC_Continue;
+ }
+ }
+ /* Fall thru */
case TK_BETWEEN:
case TK_EQ:
case TK_NE:
@@ -790,7 +817,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
case TK_LE:
case TK_GT:
case TK_GE:
- case TK_IS:
case TK_ISNOT: {
int nLeft, nRight;
if( pParse->db->mallocFailed ) break;