forked from pool/sqlite3
Fix failing Django/Django1 testsuites Fix some more errors OBS-URL: https://build.opensuse.org/request/show/765315 OBS-URL: https://build.opensuse.org/package/show/server:database/sqlite3?expand=0&rev=236
92 lines
2.2 KiB
Diff
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
|
|
|
|
|