diff options
author | drh <drh@noemail.net> | 2009-11-12 03:46:34 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2009-11-12 03:46:34 +0000 |
commit | 6a51741d4657e1621db3cc8352b3c706be00a1d4 (patch) | |
tree | 3cb69fbb86fac9c0e417bf48fe361cd0557a81db /src | |
parent | 9b918ed1d825f912ac91913299c766df59c889b5 (diff) | |
download | sqlite-6a51741d4657e1621db3cc8352b3c706be00a1d4.tar.gz sqlite-6a51741d4657e1621db3cc8352b3c706be00a1d4.zip |
Suppress excess OP_Null opcodes caused by binary IS or IS NOT operators
that are converted into unary ISNULL or NOTNULL operators.
FossilOrigin-Name: cff1b36ab2c417611f59e96694005c03762788d2
Diffstat (limited to 'src')
-rw-r--r-- | src/parse.y | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/parse.y b/src/parse.y index a47caa685..89a0af081 100644 --- a/src/parse.y +++ b/src/parse.y @@ -884,6 +884,19 @@ expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} +%include { + /* A routine to convert a binary TK_IS or TK_ISNOT expression into a + ** unary TK_ISNULL or TK_NOTNULL expression. */ + static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ + sqlite3 *db = pParse->db; + if( db->mallocFailed==0 && pY->op==TK_NULL ){ + pA->op = op; + sqlite3ExprDelete(db, pA->pRight); + pA->pRight = 0; + } + } +} + // expr1 IS expr2 // expr1 IS NOT expr2 // @@ -892,15 +905,11 @@ expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} // expr(A) ::= expr(X) IS expr(Y). { spanBinaryExpr(&A,pParse,TK_IS,&X,&Y); - if( pParse->db->mallocFailed==0 && Y.pExpr->op==TK_NULL ){ - A.pExpr->op = TK_ISNULL; - } + binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL); } expr(A) ::= expr(X) IS NOT expr(Y). { spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y); - if( pParse->db->mallocFailed==0 && Y.pExpr->op==TK_NULL ){ - A.pExpr->op = TK_NOTNULL; - } + binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL); } %include { |