]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improved comments on the new co-routine logic. Fix a C++-ism in the code.
authordrh <>
Thu, 8 Dec 2022 16:47:16 +0000 (16:47 +0000)
committerdrh <>
Thu, 8 Dec 2022 16:47:16 +0000 (16:47 +0000)
Update test cases to accommodate the more aggressive use of co-routines.

FossilOrigin-Name: 9243e850ae656d16adc8f0e5c4dcf3dcf476312cee192c39c38685fc437ccbbd

manifest
manifest.uuid
src/select.c
test/cast.test
test/eqp.test
test/with3.test
test/with6.test

index 5ec42e918f23d6c338220519c2115342b49228ba..aa4c045b1d5c4b680d2d69d7483e6caa22fbe0b0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\suse\sa\sco-routine\son\sa\ssubquery\sthat\sis\sparticipating\sin\sa\sself-join.
-D 2022-12-08T13:56:06.070
+C Improved\scomments\son\sthe\snew\sco-routine\slogic.\s\sFix\sa\sC++-ism\sin\sthe\scode.\nUpdate\stest\scases\sto\saccommodate\sthe\smore\saggressive\suse\sof\sco-routines.
+D 2022-12-08T16:47:16.777
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -645,7 +645,7 @@ F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633
 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
-F src/select.c 02982768da5a6115a95e2a23778260bb70de326648f4ac72df4b25808b6a9840
+F src/select.c 6ec3f7a1760b302193e9155453d42598192f6ad07e875038bf1177e4ce7af728
 F src/shell.c.in bcf8552c82f2c84650e39a6d638373569c2035942c0497b83eef197169e0305a
 F src/sqlite.h.in 1fe1836879ecbb2e28f00f44eb6092db09a2a06bf072af351c6c2466bd515496
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -863,7 +863,7 @@ F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e
 F test/capi3d.test 8b778794af891b0dca3d900bd345fbc8ebd2aa2aae425a9dccdd10d5233dfbde
 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe
 F test/carray01.test d55d57bf66b1af1c7ac55fae66ff4910884a8f5d21a90a18797ce386212a2634
-F test/cast.test 6064022ba9af31a8a2ff7bb345e5bd0e74172ffad85bdab5898a42d8227c7585
+F test/cast.test 336fa21989b5170ebcaf90c24266be22dd97b3e23d1fad5ecf6ad4efb04c4423
 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef
 F test/changes.test 9dd8e597d84072122fc8a4fcdea837f4a54a461e6e536053ea984303e8ca937b
 F test/changes2.test d222c0cbf5ab0ac4d7c180594e486c1bf20b2098d33e56ce33b8e12eba6823b9
@@ -991,7 +991,7 @@ F test/enc.test 9a7be5479da985381d740b15f432800f65e2c87029ee57a318f42cb2eb43763a
 F test/enc2.test 848bf05f15b011719f478dddb7b5e9aea35e39e457493cba4c4eef75d849a5ec
 F test/enc3.test 55ef64416d72975c66167310a51dc9fc544ba3ae4858b8d5ab22f4cb6500b087
 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020
-F test/eqp.test 473aea9599b4b7af46614b55198cd78167e4eccd48e60812a40db47c5c41dea9
+F test/eqp.test f3f7548d2f3df03e2f23ecaf35c7c2cc7b89848bd7c3606d94a010521b7ea4f6
 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9
 F test/eval.test 73969a2d43a511bf44080c44485a8c4d796b6a4f038d19e491867081155692c0
 F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650bf0747
@@ -1942,10 +1942,10 @@ F test/windowfault.test 15094c1529424e62f798bc679e3fe9dfab6e8ba2f7dfe8c923b6248c
 F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df
 F test/with1.test 9ad67fdeb2bbd808a5763c9060e214ea232f9b18d846ea3a59756dc38bdc3880
 F test/with2.test a1df41b987198383b9b70bf5e5fda390582e46398653858dbc6ceb24253b28df
-F test/with3.test 1e2e8d5e7b1d955342d0d18c250aaaa6e6bcf36ef2a818477bd01cb74f9a5d66
+F test/with3.test e7bf809bf75c1f44f98bca78bc331dbf542002c5227bf53c1261144db4e824c8
 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8
-F test/with6.test c18592592b5a1c5802fd4e933d506f7b34ebbe8fdd585229793e960ae58d433f
+F test/with6.test ae570b31bf1f6fab6210fb1caf6dfa9a6d69c0e6633beb905583bb158a5e309e
 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64
 F test/without_rowid1.test a5210b8770dc4736bca4e74bc96588f43025ad03ad6a80f885afd36d9890e217
 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99
@@ -2067,8 +2067,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 1c5f41986f5af181bf389675361c9f176e9195e847319f07ebd5c87992ded38b
-R 849bd6889c31d0dff4fc6b0e1b1e8fd9
+P ea4306a03cd8dd706100dac3f11653068a25c50c5d06c34ad08534aec0a580bc
+R c0ee619126b867e19f0a23327a8098db
 U drh
-Z 23e16e45b1613dcb72a8da9bb4a744cf
+Z d537a6db68af607fd73e77d57f16a3f5
 # Remove this line to create a well-formed Fossil manifest.
index 2aa30fb03b8a85191b44b34f87f97bebe04d22de..118bbb8ad411cc12bfdbc371d7bf20e838f35597 100644 (file)
@@ -1 +1 @@
-ea4306a03cd8dd706100dac3f11653068a25c50c5d06c34ad08534aec0a580bc
\ No newline at end of file
+9243e850ae656d16adc8f0e5c4dcf3dcf476312cee192c39c38685fc437ccbbd
\ No newline at end of file
index 827bfb7cf6078b4ea9bae4327739e678db29230d..c097d23e4766b58d182ee251bfe01fb12806d8d3 100644 (file)
@@ -6713,8 +6713,8 @@ static SrcItem *isSelfJoinView(
   assert( pThis->pSelect!=0 );
   if( pThis->pSelect->selFlags & SF_PushDown ) return 0;
   while( iFirst<iEnd ){
-    pItem = &pTabList->a[iFirst++];
     Select *pS1;
+    pItem = &pTabList->a[iFirst++];
     if( pItem->pSelect==0 ) continue;
     if( pItem->fg.viaCoroutine ) continue;
     if( pItem->zName==0 ) continue;
@@ -6867,44 +6867,49 @@ static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){
 ** The subquery is implemented as a co-routine if all of the following are
 ** true:
 **
-**    (1)  Either of the following are true:
-**         (1a)  The subquery must be the outer loop because it is either
-**               (i) the only term in the FROM clause, or because (ii) it
-**               is the left-most term and a CROSS JOIN or similar requires
-**               it to be the outer loop. subquery and there is nothing
-**         (1b)  There is nothing that would prevent the subquery from
-**               being an outer loop and the SQLITE_PREPARE_SAFESQL flag
-**               is not set.
-**    (2)  The subquery is not a CTE that should be materialized
+**    (1)  The subquery will likely be implemented in the outer loop of
+**         the query.  This will be the case if any one of the following
+**         conditions hold:
+**         (a)  The subquery is the only term in the FROM clause
+**         (b)  The subquery is the left-most term and a CROSS JOIN or similar
+**              requires it to be the outer loop
+**         (c)  All of the following are true:
+**                (i) The subquery is the left-most subquery in the FROM clause
+**               (ii) There is nothing that would prevent the subquery from
+**                    being used as the outer loop if the sqlite3WhereBegin()
+**                    routine nominates it to that position.
+**              (iii) The SQLITE_PREPARE_SAFEOPT flag is not set
+**    (2)  The subquery is not a CTE that should be materialized because of
+**         the AS MATERIALIZED keywords
 **    (3)  The subquery is not part of a left operand for a RIGHT JOIN
 **    (4)  The SQLITE_Coroutine optimization disable flag is not set
 **    (5)  The subquery is not self-joined
 */
 static int fromClauseTermCanBeCoroutine(
-  Parse *pParse,            /* Parsing context */
-  SrcList *pTabList,        /* FROM clause */
-  int i                     /* Which term of the FROM clause */
+  Parse *pParse,          /* Parsing context */
+  SrcList *pTabList,      /* FROM clause */
+  int i                   /* Which term of the FROM clause holds the subquery */
 ){
   SrcItem *pItem = &pTabList->a[i];
   if( pItem->fg.isCte && pItem->u2.pCteUse->eM10d==M10d_Yes ) return 0;/* (2) */
   if( pTabList->a[0].fg.jointype & JT_LTORJ ) return 0;                /* (3) */
   if( OptimizationDisabled(pParse->db, SQLITE_Coroutines) ) return 0;  /* (4) */
   if( isSelfJoinView(pTabList, pItem, i+1, pTabList->nSrc)!=0 ){
-    return 0;  /* (5) */
+    return 0;                                                          /* (5) */
   }
   if( i==0 ){
-    if( pTabList->nSrc==1 ) return 1;                              /* (1a-i) */
-    if( pTabList->a[1].fg.jointype & JT_CROSS ) return 1;          /* (1a-ii) */
-    if( pParse->prepFlags & SQLITE_PREPARE_SAFEOPT ) return 0;     
+    if( pTabList->nSrc==1 ) return 1;                             /* (1a) */
+    if( pTabList->a[1].fg.jointype & JT_CROSS ) return 1;         /* (1b) */
+    if( pParse->prepFlags & SQLITE_PREPARE_SAFEOPT ) return 0;    /* (1c-iii) */
     return 1;
   }
-  if( pParse->prepFlags & SQLITE_PREPARE_SAFEOPT ) return 0;
+  if( pParse->prepFlags & SQLITE_PREPARE_SAFEOPT ) return 0;      /* (1c-iii) */
   while( 1 /*exit-by-break*/ ){
-    if( pItem->fg.jointype & (JT_OUTER|JT_CROSS)  ) return 0;
+    if( pItem->fg.jointype & (JT_OUTER|JT_CROSS)  ) return 0;     /* (1c-ii) */
     if( i==0 ) break;
     i--;
     pItem--;
-    if( pItem->pSelect!=0 ) return 0;
+    if( pItem->pSelect!=0 ) return 0;                             /* (1c-i) */
   }
   return 1;
 }
index cbeec47c9d3b60d1343a4d1a0a0e1cb92fe99d6a..6ac9bc7efad7c6bc5d83c28293e5c894757eea00 100644 (file)
@@ -481,7 +481,7 @@ do_execsql_test cast-9.0 {
   CREATE VIEW v1(c0, c1) AS 
     SELECT CAST(0.0 AS NUMERIC), COUNT(*) OVER () FROM t0;
   SELECT v1.c0 FROM v1, t0 WHERE v1.c0=0; 
-} {0}
+} {0.0}
 
 
 finish_test
index eda95776f26fa28592e87e59913623f89ee28317..61fd617d89a14d94e3b7e8a3afe200f41ba45ce5 100644 (file)
@@ -94,7 +94,7 @@ do_eqp_test 1.7.1 {
   SELECT * FROM t3 JOIN (SELECT 1)
 } {
   QUERY PLAN
-  |--MATERIALIZE (subquery-xxxxxx)
+  |--CO-ROUTINE (subquery-xxxxxx)
   |  `--SCAN CONSTANT ROW
   |--SCAN (subquery-xxxxxx)
   `--SCAN t3
@@ -103,7 +103,7 @@ do_eqp_test 1.7.2 {
   SELECT * FROM t3 JOIN (SELECT 1) AS v1
 } {
   QUERY PLAN
-  |--MATERIALIZE v1
+  |--CO-ROUTINE v1
   |  `--SCAN CONSTANT ROW
   |--SCAN v1
   `--SCAN t3
@@ -112,7 +112,7 @@ do_eqp_test 1.7.3 {
   SELECT * FROM t3 AS xx JOIN (SELECT 1) AS yy
 } {
   QUERY PLAN
-  |--MATERIALIZE yy
+  |--CO-ROUTINE yy
   |  `--SCAN CONSTANT ROW
   |--SCAN yy
   `--SCAN xx
@@ -123,7 +123,7 @@ do_eqp_test 1.8 {
   SELECT * FROM t3 JOIN (SELECT 1 UNION SELECT 2)
 } {
   QUERY PLAN
-  |--MATERIALIZE (subquery-xxxxxx)
+  |--CO-ROUTINE (subquery-xxxxxx)
   |  `--COMPOUND QUERY
   |     |--LEFT-MOST SUBQUERY
   |     |  `--SCAN CONSTANT ROW
@@ -136,7 +136,7 @@ do_eqp_test 1.9 {
   SELECT * FROM t3 JOIN (SELECT 1 EXCEPT SELECT a FROM t3 LIMIT 17) AS abc
 } {
   QUERY PLAN
-  |--MATERIALIZE abc
+  |--CO-ROUTINE abc
   |  `--COMPOUND QUERY
   |     |--LEFT-MOST SUBQUERY
   |     |  `--SCAN CONSTANT ROW
@@ -149,7 +149,7 @@ do_eqp_test 1.10 {
   SELECT * FROM t3 JOIN (SELECT 1 INTERSECT SELECT a FROM t3 LIMIT 17) AS abc
 } {
   QUERY PLAN
-  |--MATERIALIZE abc
+  |--CO-ROUTINE abc
   |  `--COMPOUND QUERY
   |     |--LEFT-MOST SUBQUERY
   |     |  `--SCAN CONSTANT ROW
@@ -163,7 +163,7 @@ do_eqp_test 1.11 {
   SELECT * FROM t3 JOIN (SELECT 1 UNION ALL SELECT a FROM t3 LIMIT 17) abc
 } {
   QUERY PLAN
-  |--MATERIALIZE abc
+  |--CO-ROUTINE abc
   |  `--COMPOUND QUERY
   |     |--LEFT-MOST SUBQUERY
   |     |  `--SCAN CONSTANT ROW
@@ -295,7 +295,7 @@ det 3.2.2 {
   ORDER BY x2.y LIMIT 5
 } {
   QUERY PLAN
-  |--MATERIALIZE x1
+  |--CO-ROUTINE x1
   |  |--SCAN t1
   |  `--USE TEMP B-TREE FOR ORDER BY
   |--MATERIALIZE x2
@@ -834,7 +834,7 @@ do_eqp_test 9.1 {
   ORDER BY 1;
 } {
   QUERY PLAN
-  |--MATERIALIZE thread
+  |--CO-ROUTINE thread
   |  |--SCAN x USING INDEX forumthread
   |  |--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR
   |  |--CORRELATED SCALAR SUBQUERY xxxxxx
index 1aed92a99acce709a0623ad5929c87c9eef8ba8e..85889453a0b730335e239153d3a8a2928c5d1939 100644 (file)
@@ -89,7 +89,7 @@ ifcapable analyze {
     SELECT * FROM cnt, y1 WHERE i=a
   } [string map {"\n  " \n} {
     QUERY PLAN
-    |--MATERIALIZE cnt
+    |--CO-ROUTINE cnt
     |  |--SETUP
     |  |  `--SCAN CONSTANT ROW
     |  `--RECURSIVE STEP
@@ -103,7 +103,7 @@ ifcapable analyze {
     SELECT * FROM cnt, y1 WHERE i=a
   } [string map {"\n  " \n} {
     QUERY PLAN
-    |--MATERIALIZE cnt
+    |--CO-ROUTINE cnt
     |  |--SETUP
     |  |  `--SCAN CONSTANT ROW
     |  `--RECURSIVE STEP
@@ -125,7 +125,7 @@ do_eqp_test 3.2.2 {
      WHERE c.id=w2.pk AND c.id=w1.pk;
 } {
   QUERY PLAN
-  |--MATERIALIZE c
+  |--CO-ROUTINE c
   |  |--SETUP
   |  |  |--SCAN CONSTANT ROW
   |  |  `--SCALAR SUBQUERY xxxxxx
index 20e518b01a6f50fa7f5ebb0b5e25162109b75f9d..7fce34687ecccaaf2c0ecd422229cec91e8a8e7f 100644 (file)
@@ -87,7 +87,7 @@ do_eqp_test 131 {
          (SELECT x FROM c LIMIT 5) AS c3;
 } {
   QUERY PLAN
-  |--MATERIALIZE c1
+  |--CO-ROUTINE c1
   |  |--CO-ROUTINE c
   |  |  `--SCAN 2 CONSTANT ROWS
   |  `--SCAN c
@@ -123,7 +123,7 @@ do_eqp_test 141 {
          (SELECT x FROM c LIMIT 7) AS c3;
 } {
   QUERY PLAN
-  |--MATERIALIZE c1
+  |--CO-ROUTINE c1
   |  |--MATERIALIZE c
   |  |  `--SCAN 2 CONSTANT ROWS
   |  `--SCAN c
@@ -151,7 +151,7 @@ do_eqp_test 151 {
          (SELECT x FROM c LIMIT 7) AS c3;
 } {
   QUERY PLAN
-  |--MATERIALIZE c1
+  |--CO-ROUTINE c1
   |  |--MATERIALIZE c
   |  |  `--SCAN 2 CONSTANT ROWS
   |  `--SCAN c
@@ -228,7 +228,7 @@ do_eqp_test 211 {
   SELECT y FROM t2 ORDER BY y;
 } {
   QUERY PLAN
-  |--MATERIALIZE c1
+  |--CO-ROUTINE c1
   |  |--CO-ROUTINE c
   |  |  `--SCAN 3 CONSTANT ROWS
   |  `--SCAN c