]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Disable optimization of nested EXIST loops. Possible fix for [forum:/forumpost/077c02... disable-nested-exist-opt
authordan <Dan Kennedy>
Tue, 21 Apr 2026 16:40:08 +0000 (16:40 +0000)
committerdan <Dan Kennedy>
Tue, 21 Apr 2026 16:40:08 +0000 (16:40 +0000)
FossilOrigin-Name: 64f0d9eb63a351de12bb9643f1f6390a89f6d95dc81c07f1dc409ee31bae6f83

manifest
manifest.tags
manifest.uuid
src/select.c
src/where.c
test/existsexpr.test

index cbb79d3e57e99d313b53e04485ae965b37f84563..9a3659215f9aff2fdf0d79f95778512c64c3b030 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\soff-by-one\sbuffer\ssize\scalculation\sin\sthe\sdecimal.c\sextension.
-D 2026-04-21T16:07:15.552
+C Disable\soptimization\sof\snested\sEXIST\sloops.\sPossible\sfix\sfor\s[forum:/forumpost/077c02e8ed\s|\sforum\spost\s77c02e8ed].
+D 2026-04-21T16:40:08.614
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -735,7 +735,7 @@ F src/printf.c 50be92de0725e88c8b38978775ab46f9b42d74e21f65045c3423503173eb0566
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 928ff887f2a7c64275182060d94d06fdddbe32226c569781cf7e7edc6f58d7fd
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 2ef8d7c8d1bf8dfba18bd0264b2777c160e94941638de67a0f2ea9e422bfb390
+F src/select.c 4c05cde130f26991b7411d8c6809e0630625e18078742c963a047b4b9cc01d49
 F src/shell.c.in 4e68371fec5a8ab31038d51e7179d9ef3539d693e05a5fdabcd59483e445b27d
 F src/sqlite.h.in 39d2e09114d2bdb7afd998f4a469c8f8cd065f8093835a7d0422f260fc78fb4f
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
@@ -817,7 +817,7 @@ F src/vxworks.h 9d18819c5235b49c2340a8a4d48195ec5d5afb637b152406de95a9436beeaeab
 F src/wal.c 7340d4f9bb827bd349127cac6b2cf0cb7f76b9fda645f7b9b0bf7a6e0b1e2e7c
 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
-F src/where.c a00d35adeb2550249ba02f24e50eecfb99cba34c8d7d5299b295a591219a2e73
+F src/where.c 7241a71725d8c193ddd9e69a299820fcd755943f3b5ac376a84b2716e2848401
 F src/whereInt.h 8d94cb116c9e06205c3d5ac87af065fc044f8cf08bfdccd94b6ea1c1308e65da
 F src/wherecode.c 676cb6cb02878643e817d9917a2d3522b83a3736b2cedd3dc8a01d7bb92af6c2
 F src/whereexpr.c e9f7185fba366d9365aa7a97329609e4cf00b3dd0400d069fbaa5187350c17c6
@@ -1100,7 +1100,7 @@ F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650
 F test/exclusive2.test cd70b1d9c6fffd336f9795b711dcc5d9ceba133ad3f7001da3fda63615bdc91e
 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac
-F test/existsexpr.test 630b64d75002d7dc1aab46899073ef7cec57fb0893ec8ab14ff50e882c03b56e
+F test/existsexpr.test b39974adaa7fa1deccc065a57f10db96f9005d2ba9e6f933a5f35c9128bcc1ad
 F test/existsexpr2.test dc23e76389eff3d29f6488ff733012a3560cd67ec8cfaecbecd52cced5d5af11
 F test/existsfault.test ff41c11f3052c1bbd4f8dd557802310026253d67d7c4e3a180c16d2f0862973e
 F test/expr.test db981f8a85520e99ae20aab7ad2e9b5b0437ed09159b57ced434c672075d2e61
@@ -2202,8 +2202,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P ab6ee76c1266b753d0749c63890f40db875536ceb4dd3252cc7a3386e386a0c1
-R 0b1ffe31496f163d6247486632ed006d
-U drh
-Z b35142d5d17c95ba9c2a885c3ed8f26c
+P 24df42104d5fd1cf974f2bf539fa7515808e21e68d64899c39f5fcf3bee49a48
+R 9a3da3dbb0fb1d6e93abd196b6a44c9b
+T *branch * disable-nested-exist-opt
+T *sym-disable-nested-exist-opt *
+T -sym-trunk *
+U dan
+Z 5d80e9245f4b6dbd6635f95d676dfd7d
 # Remove this line to create a well-formed Fossil manifest.
index bec971799ff1b8ee641c166c7aeb22d12c785393..5a9cd5cc7662b85cd939937ceaa507ce29c765a9 100644 (file)
@@ -1,2 +1,2 @@
-branch trunk
-tag trunk
+branch disable-nested-exist-opt
+tag disable-nested-exist-opt
index 4c166ea0146e17ec99f67b54cd90b5b6af613650..1f0603d9700f21e9070619ac15b9782e0202b1ed 100644 (file)
@@ -1 +1 @@
-24df42104d5fd1cf974f2bf539fa7515808e21e68d64899c39f5fcf3bee49a48
+64f0d9eb63a351de12bb9643f1f6390a89f6d95dc81c07f1dc409ee31bae6f83
index 840d800c980a7ee7c4966145a8066de4561bbeb0..41c14e91cdce2b3dc5c3e9554e88f19e10d9ff4e 100644 (file)
@@ -7372,7 +7372,6 @@ static SQLITE_NOINLINE void existsToJoin(
           sqlite3TreeViewSelect(0, p, 0);
         }
 #endif
-        existsToJoin(pParse, p, pSubWhere);
       }
     }
   }
index eccecf18e79073e901756768f905e4d0a2975966..df835bf9fc57cf71710cc538597a02a4c91e9dbf 100644 (file)
@@ -7583,27 +7583,11 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
       }
 #endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */
     }
-    if( pTabList->a[pLevel->iFrom].fg.fromExists
-     && (i==pWInfo->nLevel-1
-           || pTabList->a[pWInfo->a[i+1].iFrom].fg.fromExists==0)
-    ){
-      /* This is an EXISTS-to-JOIN optimization which is either the
-      ** inner-most loop, or the inner-most of a group of nested
-      ** EXISTS-to-JOIN optimization loops.  If this loop sees a successful
-      ** row, it should break out of itself as well as other EXISTS-to-JOIN
-      ** loops in which is is directly nested. */
-      int nOuter = 0; /* Nr of outer EXISTS that this one is nested within */
-      while( nOuter<i ){
-        if( !pTabList->a[pLevel[-nOuter-1].iFrom].fg.fromExists ) break;
-        nOuter++;
-      }
-      testcase( nOuter>0 );
-      sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel[-nOuter].addrBrk);
-      if( nOuter ){
-        VdbeComment((v, "EXISTS break %d..%d", i-nOuter, i));
-      }else{
-        VdbeComment((v, "EXISTS break %d", i));
-      }
+    if( pTabList->a[pLevel->iFrom].fg.fromExists ){
+      /* This is an EXISTS-to-JOIN optimization loop. If this loop sees a 
+      ** successful row, it should break out of itself. */
+      sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk);
+      VdbeComment((v, "EXISTS break %d", i));
     }
     sqlite3VdbeResolveLabel(v, pLevel->addrCont);
     if( pLevel->op!=OP_Noop ){
index 724fa2574912f145c5a1a97f946f03a528eb7bfc..e2867bbdb08af9aa6ece9f16e6d3eefc18a14ed7 100644 (file)
@@ -537,4 +537,53 @@ do_execsql_test 11.1 {
    GROUP BY id;
 } {1 p1}
 
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 12.0 {
+  CREATE TABLE t2(id INT, data INT);
+  CREATE TABLE t3(amount INT);
+
+  INSERT INTO t2 VALUES (1,0),(2,0);
+  INSERT INTO t3 VALUES (1),(1);
+}
+
+do_execsql_test 12.1 {
+  SELECT * FROM t2
+    WHERE EXISTS (SELECT 1 FROM t3 WHERE t3.amount > t2.data)
+} {
+  1 0
+  2 0
+}
+
+do_execsql_test 12.2 {
+  SELECT * FROM t2
+    WHERE EXISTS (SELECT 1 FROM t3 WHERE t3.amount > t2.data)
+  LIMIT 2 OFFSET 3
+} {}
+
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 13.0 {
+  CREATE TABLE t1(b,c);
+  CREATE TABLE t2(x,y);
+  CREATE TABLE t3(p,q);
+
+  INSERT INTO t1 VALUES(7,10);
+  INSERT INTO t2 VALUES(1,1), (4,7);
+  INSERT INTO t3 VALUES(4,7);
+
+  PRAGMA automatic_index = 0;
+}
+
+do_execsql_test 13.1 {
+  SELECT * FROM t1 WHERE EXISTS (
+      SELECT 1 FROM t2
+      WHERE EXISTS (
+        SELECT 1 FROM t3 WHERE t3.p=t2.x AND t3.q=t1.b
+      )
+  )
+} {7 10}
+
+
 finish_test