SHA256
1
0
forked from pool/sqlite3
sqlite3/7833feecfe-Prevent-SQLite-from-bad-NULL-assumption.patch

92 lines
2.2 KiB
Diff

Index: src/expr.c
==================================================================
--- src/expr.c
+++ src/expr.c
@@ -5166,14 +5166,15 @@
return WRC_Abort;
}
return WRC_Prune;
case TK_AND:
- if( sqlite3ExprImpliesNonNullRow(pExpr->pLeft, pWalker->u.iCur)
- && sqlite3ExprImpliesNonNullRow(pExpr->pRight, pWalker->u.iCur)
- ){
- pWalker->eCode = 1;
+ assert( pWalker->eCode==0 );
+ sqlite3WalkExpr(pWalker, pExpr->pLeft);
+ if( pWalker->eCode ){
+ pWalker->eCode = 0;
+ sqlite3WalkExpr(pWalker, pExpr->pRight);
}
return WRC_Prune;
case TK_BETWEEN:
sqlite3WalkExpr(pWalker, pExpr->pLeft);
@@ -5228,19 +5229,12 @@
** ordinary join.
*/
int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){
Walker w;
p = sqlite3ExprSkipCollateAndLikely(p);
- while( p ){
- if( p->op==TK_NOTNULL ){
- p = p->pLeft;
- }else if( p->op==TK_AND ){
- if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1;
- p = p->pRight;
- }else{
- break;
- }
+ if( p && p->op==TK_NOTNULL ){
+ p = p->pLeft;
}
w.xExprCallback = impliesNotNullRow;
w.xSelectCallback = 0;
w.xSelectCallback2 = 0;
w.eCode = 0;
Index: test/join.test
==================================================================
--- test/join.test
+++ test/join.test
@@ -902,8 +902,38 @@
} {1 {}}
do_execsql_test join-18.4 {
SELECT NOT(v0.a IS FALSE) FROM v0
} {1}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test join-19.0 {
+ CREATE TABLE t1(a);
+ CREATE TABLE t2(b);
+ INSERT INTO t1(a) VALUES(0);
+ CREATE VIEW v0(c) AS SELECT t2.b FROM t1 LEFT JOIN t2;
+}
+
+do_execsql_test join-19.1 {
+ SELECT * FROM v0 WHERE v0.c NOTNULL NOTNULL;
+} {{}}
+
+do_execsql_test join-19.2 {
+ SELECT * FROM t1 LEFT JOIN t2
+} {0 {}}
+
+do_execsql_test join-19.3 {
+ SELECT * FROM t1 LEFT JOIN t2 WHERE (b IS NOT NULL) IS NOT NULL;
+} {0 {}}
+
+do_execsql_test join-19.4 {
+ SELECT (b IS NOT NULL) IS NOT NULL FROM t1 LEFT JOIN t2
+} {1}
+
+do_execsql_test join-19.5 {
+ SELECT * FROM t1 LEFT JOIN t2 WHERE
+ (b IS NOT NULL AND b IS NOT NULL) IS NOT NULL;
+} {0 {}}
finish_test