diff options
author | drh <drh@noemail.net> | 2019-04-19 13:38:34 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-04-19 13:38:34 +0000 |
commit | d5c851c1cbcb96d541fa7e6e20342c2a437434e9 (patch) | |
tree | 3a593300ea11ed6f96bb714f268fc50ff75e4a3a /src/expr.c | |
parent | 680f0fe32aaf79d3e7ea5dba7a0c84c4693812ed (diff) | |
download | sqlite-d5c851c1cbcb96d541fa7e6e20342c2a437434e9.tar.gz sqlite-d5c851c1cbcb96d541fa7e6e20342c2a437434e9.zip |
Streamline the processing of the AND operator. Slightly smaller and faster.
FossilOrigin-Name: 7713996aa99ce6dd35b5a2db74dd26658fb8d9817169b2a7531cdef6edb41403
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/src/expr.c b/src/expr.c index 9a5e0345a..c9f917ce5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -850,20 +850,16 @@ Expr *sqlite3PExpr( Expr *pRight /* Right operand */ ){ Expr *p; - if( op==TK_AND && pParse->nErr==0 && !IN_RENAME_OBJECT ){ - /* Take advantage of short-circuit false optimization for AND */ - p = sqlite3ExprAnd(pParse->db, pLeft, pRight); - }else{ - p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); - if( p ){ - memset(p, 0, sizeof(Expr)); - p->op = op & 0xff; - p->iAgg = -1; - } + p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = op & 0xff; + p->iAgg = -1; sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); - } - if( p ) { sqlite3ExprCheckHeight(pParse, p->nHeight); + }else{ + sqlite3ExprDelete(pParse->db, pLeft); + sqlite3ExprDelete(pParse->db, pRight); } return p; } @@ -919,19 +915,20 @@ static int exprAlwaysFalse(Expr *p){ ** of returning an AND expression, just return a constant expression with ** a value of false. */ -Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){ - if( pLeft==0 ){ +Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ + sqlite3 *db = pParse->db; + if( pLeft==0 ){ return pRight; }else if( pRight==0 ){ return pLeft; + }else if( pParse->nErr || IN_RENAME_OBJECT ){ + return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); }else if( exprAlwaysFalse(pLeft) || exprAlwaysFalse(pRight) ){ sqlite3ExprDelete(db, pLeft); sqlite3ExprDelete(db, pRight); return sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0); }else{ - Expr *pNew = sqlite3ExprAlloc(db, TK_AND, 0, 0); - sqlite3ExprAttachSubtrees(db, pNew, pLeft, pRight); - return pNew; + return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); } } |