]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the query optimizer, when converting BETWEEN and LIKE/GLOB expressions
authordrh <drh@noemail.net>
Thu, 29 Aug 2013 13:21:52 +0000 (13:21 +0000)
committerdrh <drh@noemail.net>
Thu, 29 Aug 2013 13:21:52 +0000 (13:21 +0000)
into simpler forms for processing, be sure to transfer the LEFT JOIN markings.
Fix for ticket [bc878246eafe0f52c].  Cherrypick of [caab361ebe].

FossilOrigin-Name: cb667449d0ff64cba4c951325d38186366779610

manifest
manifest.uuid
src/where.c
test/where9.test

index fbab06a59ca6dbfe74e0933f02d4c329a3d0c406..894409f189067517f825eb724c00668205bd887b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Cherrypick\sof\s[c1152bdcbb]\sand\sfix\sfor\s[9f2eb3abac]:\nHave\sthe\swhereShortCut()\splanner\signore\sindexes\swith\smore\sthan\sfour\scolumns.
-D 2013-08-29T13:15:09.214
+C In\sthe\squery\soptimizer,\swhen\sconverting\sBETWEEN\sand\sLIKE/GLOB\sexpressions\ninto\ssimpler\sforms\sfor\sprocessing,\sbe\ssure\sto\stransfer\sthe\sLEFT\sJOIN\smarkings.\nFix\sfor\sticket\s[bc878246eafe0f52c].\s\sCherrypick\sof\s[caab361ebe].
+D 2013-08-29T13:21:52.036
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -290,7 +290,7 @@ F src/vtab.c 165ce0e797c2cd23badb104c9f2ae9042d6d942c
 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
-F src/where.c 53ac2441269b3adca28e2b8a8339f2dcaa50a9a2
+F src/where.c a9ec7caba7697f152bd34853b98500dd54c4b240
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
@@ -1048,7 +1048,7 @@ F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
 F test/where7.test 5a4b0abc207d71da4deecd734ad8579e8dd40aa8
 F test/where8.test 6f95896633cf2d307b5263145b942b7d33e837c6
 F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739
-F test/where9.test 9a7fda4a4512abc26a855e8b2b6572b200f6019b
+F test/where9.test 167a89495715db4d6a7d1e6a1aadf934ddc06516
 F test/whereA.test 4d253178d135ec46d1671e440cd8f2b916aa6e6b
 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
 F test/whereC.test d6f4ecd4fa2d9429681a5b22a25d2bda8e86ab8a
@@ -1106,11 +1106,8 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P f64cd21e2e23ed7cff48f7dafa5e76adde9321c2
-Q +c1152bdcbb5ac185f743015fff63769effa81b4b
-R f37afa23588c87c948f6db62509a5540
-T *branch * branch-3.8.0
-T *sym-branch-3.8.0 *
-T -sym-trunk *
+P c3f75941e5dbd927142efb68e7c31904bafbfd70
+Q +caab361ebee5f5c3fdafd9b1abe3d1ab7c5b4db9
+R 34b40805306963e21bc653f4aa3fad1f
 U drh
-Z f756b9e9da7f4f16b2922ea29f813ff5
+Z b9428187eb16b771f70f47a3d05ac52d
index 6fe4dd5e79ac9eeb1d7a27ac62afd3783b16361b..6153bb79e0b14c3b6d93f469b8ef81d650bba6ad 100644 (file)
@@ -1 +1 @@
-c3f75941e5dbd927142efb68e7c31904bafbfd70
\ No newline at end of file
+cb667449d0ff64cba4c951325d38186366779610
\ No newline at end of file
index 941b4d5e815267dba72c5e070b7bd2276c945a1f..02fde2b4fa791ca191f3646a19e625b300c29268 100644 (file)
@@ -1205,8 +1205,10 @@ static int isMatchOfColumn(
 ** a join, then transfer the appropriate markings over to derived.
 */
 static void transferJoinMarkings(Expr *pDerived, Expr *pBase){
-  pDerived->flags |= pBase->flags & EP_FromJoin;
-  pDerived->iRightJoinTable = pBase->iRightJoinTable;
+  if( pDerived ){
+    pDerived->flags |= pBase->flags & EP_FromJoin;
+    pDerived->iRightJoinTable = pBase->iRightJoinTable;
+  }
 }
 
 #if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
@@ -1663,6 +1665,7 @@ static void exprAnalyze(
       pNewExpr = sqlite3PExpr(pParse, ops[i], 
                              sqlite3ExprDup(db, pExpr->pLeft, 0),
                              sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0);
+      transferJoinMarkings(pNewExpr, pExpr);
       idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
       testcase( idxNew==0 );
       exprAnalyze(pSrc, pWC, idxNew);
@@ -1730,6 +1733,7 @@ static void exprAnalyze(
     pNewExpr1 = sqlite3PExpr(pParse, TK_GE, 
            sqlite3ExprAddCollateToken(pParse,pNewExpr1,&sCollSeqName),
            pStr1, 0);
+    transferJoinMarkings(pNewExpr1, pExpr);
     idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC);
     testcase( idxNew1==0 );
     exprAnalyze(pSrc, pWC, idxNew1);
@@ -1737,6 +1741,7 @@ static void exprAnalyze(
     pNewExpr2 = sqlite3PExpr(pParse, TK_LT,
            sqlite3ExprAddCollateToken(pParse,pNewExpr2,&sCollSeqName),
            pStr2, 0);
+    transferJoinMarkings(pNewExpr2, pExpr);
     idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC);
     testcase( idxNew2==0 );
     exprAnalyze(pSrc, pWC, idxNew2);
index 5b000d967e1e5a865056481b5c87e6f0529eb36a..22376e08b9ccae711773c7ed002b8f8d846088c3 100644 (file)
@@ -951,4 +951,28 @@ do_test where9-9.1 {
   }
 } {1 2 3 4 8 9}
 
+# Fix for ticket [bc878246eafe0f52c519e29049b2fe4a99491b27]
+# Incorrect result when OR is used in a join to the right of a LEFT JOIN
+#
+do_test where9-10.1 {
+  db eval {
+    CREATE TABLE t101 (id INTEGER PRIMARY KEY);
+    INSERT INTO t101 VALUES (1);
+    SELECT * FROM t101 AS t0
+         LEFT JOIN t101 AS t1 ON t1.id BETWEEN 10 AND 20
+         JOIN t101 AS t2 ON (t2.id = t0.id OR (t2.id<>555 AND t2.id=t1.id));
+  }
+} {1 {} 1}
+do_test where9-10.2 {
+  db eval {
+    CREATE TABLE t102 (id TEXT UNIQUE NOT NULL);
+    INSERT INTO t102 VALUES ('1');
+    SELECT * FROM t102 AS t0
+         LEFT JOIN t102 AS t1 ON t1.id GLOB 'abc%'
+         JOIN t102 AS t2 ON (t2.id = t0.id OR (t2.id<>555 AND t2.id=t1.id));
+  }
+} {1 {} 1}
+
+
+
 finish_test