]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix to the case of a LATERAL subquery that references a prior table that
authordrh <>
Sun, 21 Jul 2024 21:37:33 +0000 (21:37 +0000)
committerdrh <>
Sun, 21 Jul 2024 21:37:33 +0000 (21:37 +0000)
uses a covering index. [forum:/forumpost/fc29fa4f14|Forum post fc29fa4f14].

FossilOrigin-Name: 6d863172dc736169bd5c303fab5d2fc47324261f29cdabb692781cd0fd609c87

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

index f94ccddc163e1f71c612105c0c773367311b15e4..44797d8782effc61bfe1e136b445cd567a7e81a0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Assert\sadded\sto\sensure\sthat\sLATERAL\ssubqueries\sare\smaterialized\sinstead\sof\nimplemented\sas\sa\sco-routine.
-D 2024-07-21T18:03:07.880
+C Fix\sto\sthe\scase\sof\sa\sLATERAL\ssubquery\sthat\sreferences\sa\sprior\stable\sthat\nuses\sa\scovering\sindex.\s[forum:/forumpost/fc29fa4f14|Forum\spost\sfc29fa4f14].
+D 2024-07-21T21:37:33.789
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -840,7 +840,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c 887fc4ca3f020ebb2e376f222069570834ac63bf50111ef0cbf3ae417048ed89
 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
 F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2
-F src/where.c 4517b21f174680036d8f7b7f09a59976d94bed4ea2321acbb52830df8b54d415
+F src/where.c 44ae623e37aabed819bc7ecafe72b3c5a10216ad753c24614a0abd481007c40b
 F src/whereInt.h 002adc3aa2cc10733b9b27958fdbe893987cd989fab25a9853941c1f9b9b0a65
 F src/wherecode.c 84f3b1d4c97d8b0c2e30d5b0f6d6a9dfd391fac79ff05df0e0d8cfc1d3728827
 F src/whereexpr.c 7d0d34b42b9edfd8e8ca66beb3a6ef63fe211c001af54caf2ccbcd989b783290
@@ -1347,7 +1347,7 @@ F test/joinD.test 2ce62e7353a0702ca5e70008faf319c1d4686aa19fba34275c6d1da0e960be
 F test/joinE.test d5d182f3812771e2c0d97c9dcf5dbe4c41c8e21c82560e59358731c4a3981d6b
 F test/joinF.test 53dd66158806823ea680dd7543b5406af151b5aafa5cd06a7f3231cd94938127
 F test/joinH.test 55f69e64da74d4eca2235237f3acb657aef181e22e45daa228e35bba865e0255
-F test/joinL.test 1a84f6bc149ec20a59ca7aba343eff290ac6b81bd7a6021b6b87e2766b27988d
+F test/joinL.test 87217fd82a283ba08597cfb3ba5a9a3eaea8a0971d357d463d3ada5105d1c3ae
 F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497
 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4
 F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e
@@ -2196,8 +2196,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 31e175fcd0ff823941d4f0f53f7bc6a65fb5b00de78cdb6a9d622cc96b6a6f15
-R 4ac90a965fbd40e87d5aff046cec3c32
+P 6c14b94fb678c70e32519f3e0141f80e6efb3015340a84eb355ab371c5e9facd
+R 813f23929aea30330fd76584e25b814c
 U drh
-Z 32b67a880021c4d7740dbaa13542f644
+Z a22f7e9649de00a5eb8222bd7d670c43
 # Remove this line to create a well-formed Fossil manifest.
index 49bc53f13b2195c204f0138af2fed3316e662856..e9e5af20293d3dce0a68aca2b9490b78e476ffe6 100644 (file)
@@ -1 +1 @@
-6c14b94fb678c70e32519f3e0141f80e6efb3015340a84eb355ab371c5e9facd
+6d863172dc736169bd5c303fab5d2fc47324261f29cdabb692781cd0fd609c87
index 26b7d2897cf2e591f3d7e8d6c1026f8ca87368be..1f5dd5db7387688a65d63f4a0c79f34bcd4f3a84 100644 (file)
@@ -6312,6 +6312,30 @@ static SQLITE_NOINLINE void whereReverseScanOrder(WhereInfo *pWInfo){
   }
 }
 
+/*
+** Adjust the addrBody of all WHERE_IDX_ONLY WhereLoops prior to ii 
+** so that the addrBody covers the subroutine that computes a LATERAL
+** subquery.
+**
+** This routine is broken out into a separate no-inline subroutine because
+** it runs rarely, and by breaking it out it reduces register contention
+** in the main sqlite3WhereBegin() routine, helping sqlite3WhereBegin()
+** to run faster.
+*/
+static SQLITE_NOINLINE void whereAdjustAddrBodyForLateral(
+  WhereInfo *pWInfo,  /* There WHERE loop info */
+  SrcItem *pSrc,      /* The LATERAL subquery */
+  int ii              /* Index of pSrc in the FROM clause */
+){
+  while( --ii >= 0 ){
+    if( pWInfo->a[ii].pWLoop->wsFlags & WHERE_IDX_ONLY
+     && pWInfo->a[ii].addrBody > pSrc->addrFillSub
+    ){
+       pWInfo->a[ii].addrBody = pSrc->addrFillSub;
+    }
+  }
+}
+
 /*
 ** Generate the beginning of the loop used for WHERE clause processing.
 ** The return value is a pointer to an opaque structure that contains
@@ -7000,6 +7024,9 @@ WhereInfo *sqlite3WhereBegin(
     if( pSrc->fg.isMaterialized ){
       if( pSrc->fg.isCorrelated ){
         sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub);
+        if( pSrc->fg.isLateral ){
+          whereAdjustAddrBodyForLateral(pWInfo, pSrc, ii);
+        }
       }else{
         int iOnce = sqlite3VdbeAddOp0(v, OP_Once);  VdbeCoverage(v);
         sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub);
index d314054b8f590c51e4d3b15b36f9e3616eddc140..0e0b2080fb718adf1b4139c5980b2f0067931f35 100644 (file)
@@ -171,4 +171,36 @@ do_execsql_test 4.0 {
   SELECT * FROM (VALUES (1), (2)) JOIN LATERAL (select COUNT(*), column1);
 } {1 1 1 2 1 2}
 
+# https://sqlite.org/forum/forumpost/fc29fa4f14
+#
+do_execsql_test 5.0 {
+  CREATE TABLE t1(a,b);      INSERT INTO t1 VALUES(1,2);
+  CREATE TABLE t2(c,d,e,f);  INSERT INTO t2 VALUES(3,4,5,6);
+  CREATE INDEX t2cd ON t2(c,d);
+  CREATE TABLE dual(dummy TEXT);  INSERT INTO dual VALUES('X');
+  SELECT c, a, sb
+    FROM t2, LATERAL(
+           SELECT a, sum(b) AS sb FROM t1 GROUP BY a HAVING sum(b)<d
+         ) AS lx
+   ORDER BY a, c;
+} {3 1 2}
+do_execsql_test 5.1 {
+  SELECT c, a, sb
+    FROM dual, t2, LATERAL(
+           SELECT a, sum(b) AS sb FROM t1 GROUP BY a HAVING sum(b)<d
+         ) AS lx
+   ORDER BY a, c;
+} {3 1 2}
+do_execsql_test 5.2 {
+  SELECT c, a, sb
+    FROM t2, dual, LATERAL(
+           SELECT a, sum(b) AS sb FROM t1 GROUP BY a HAVING sum(b)<d
+         ) AS lx
+   ORDER BY a, c;
+} {3 1 2}
+
+
+
+
+
 finish_test