]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Honor the MATERIALIZED keyword on a common table expression by not flattening
authordrh <>
Fri, 22 Apr 2022 16:15:48 +0000 (16:15 +0000)
committerdrh <>
Fri, 22 Apr 2022 16:15:48 +0000 (16:15 +0000)
the CTE into an outer query.

FossilOrigin-Name: 8d631a6b9eb06b54b10eda595a4c588ca38f909b4afa653b24d1f720b55d72f7

manifest
manifest.uuid
src/expr.c
src/select.c
src/treeview.c
test/with1.test
test/with6.test

index 94e3d8eb509cdf65628a2f89b48c440fcbee6e1a..e9a1cdbd7f493c165c384a784c57e1e6698a3416 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stest\scases\sto\scheck\sthe\shandling\sof\sSQLITE_BUSY\sin\srbu.
-D 2022-04-22T15:18:41.615
+C Honor\sthe\sMATERIALIZED\skeyword\son\sa\scommon\stable\sexpression\sby\snot\sflattening\nthe\sCTE\sinto\san\souter\squery.
+D 2022-04-22T16:15:48.995
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f
 F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68
 F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
 F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce
-F src/expr.c 899c77da1cd4d836d93f94cf435fc761695938dda8932becfccfdb2eb7d6a7d9
+F src/expr.c 06dfbfb7f469c00eba3c8a7e282765969fe7c772f235a365f51bfffcaa69fe7f
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e
 F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761
@@ -553,7 +553,7 @@ F src/printf.c 05d8dfd2018bc4fc3ddb8b37eb97ccef7abf985643fa1caebdcf2916ca90fa32
 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c
 F src/resolve.c f72bb13359dd5a74d440df25f320dc2c1baff5cde4fc9f0d1bc3feba90b8932a
 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
-F src/select.c cbfe750ec71cc103a0efbf7448323f5abca8e6208fb90a387a06aa79721e594c
+F src/select.c 0d0a82875c9b8617b9b8189eddc7cde3aac89fcafb866608fdc819c6b7cba06c
 F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc35
 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -618,7 +618,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394
 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
 F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98
-F src/treeview.c c834e0c9030b1f9971152e049f44e2f973625c680f10aed2fbcc956da2301d0b
+F src/treeview.c 396c21e21c853ebc1830c194fa13f1161dbc76adad0b0a605172ddb78b3b4cdb
 F src/trigger.c 372ada38f667c6823a3db15749eb668338e65c793394e55a37e56a489f2d1b55
 F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92
 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
@@ -1826,12 +1826,12 @@ F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387
 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b
 F test/windowfault.test 15094c1529424e62f798bc679e3fe9dfab6e8ba2f7dfe8c923b6248c31660a7c
 F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df
-F test/with1.test 7bc5abfe4c80c0cef8a90f5a66d60b9982e8ccd7350c8eb70611323a3b8e07ba
+F test/with1.test 9ad67fdeb2bbd808a5763c9060e214ea232f9b18d846ea3a59756dc38bdc3880
 F test/with2.test a1df41b987198383b9b70bf5e5fda390582e46398653858dbc6ceb24253b28df
 F test/with3.test ad32d13ad50661e6fa305f62a0717649c348792e7b658bf2644976227a9e0373
 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8
-F test/with6.test 661d7e416bef6c0a2556b2c9f0c8178a5b15932bed65246abed99723a8d4e7c0
+F test/with6.test c18592592b5a1c5802fd4e933d506f7b34ebbe8fdd585229793e960ae58d433f
 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64
 F test/without_rowid1.test a5210b8770dc4736bca4e74bc96588f43025ad03ad6a80f885afd36d9890e217
 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99
@@ -1951,8 +1951,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 f7c18262347ff430879d5afc7a118d2b9b0050c845c6b1fe6c047062ea2ba8fe
-R a6d9f2b1d5400cca176b02195a3ac6f5
-U dan
-Z ae29b1d7301d35ff4fb51acebf10a86c
+P 6fccc733c6041a2946fb3d37e4737ae37defae5c110225dd746cdc038cc64957
+R 36a9cb28aa336cfdc994567486f634f5
+U drh
+Z fdbd2379fdafb7d5c12821e010585320
 # Remove this line to create a well-formed Fossil manifest.
index cff6a3e51332bf8bc2e2bbbf6bc22e099e1437af..628c9a3fd451f45586e1e83ccbb18663fa90d2b4 100644 (file)
@@ -1 +1 @@
-6fccc733c6041a2946fb3d37e4737ae37defae5c110225dd746cdc038cc64957
\ No newline at end of file
+8d631a6b9eb06b54b10eda595a4c588ca38f909b4afa653b24d1f720b55d72f7
\ No newline at end of file
index a300971345f8f288db43694ff71b25700d636e5e..17098762199c20442a773a66bcda1f05a978712e 100644 (file)
@@ -1527,6 +1527,7 @@ With *sqlite3WithDup(sqlite3 *db, With *p){
         pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0);
         pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0);
         pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName);
+        pRet->a[i].eM10d = p->a[i].eM10d;
       }
     }
   }
index 2b27eea6309fa90530d60081170f001952b60c94..26a3172aeb3776026a042e9ce06257b7677a8e88 100644 (file)
@@ -4153,6 +4153,8 @@ static void renumberCursors(
 **  (27)  The subquery may not contain a FULL or RIGHT JOIN unless it
 **        is the first element of the parent query.
 **
+**  (28)  The subquery is not a MATERIALIZED CTE.
+**
 **
 ** In this routine, the "p" parameter is a pointer to the outer query.
 ** The subquery is p->pSrc->a[iFrom].  isAgg is true if the outer query
@@ -4276,6 +4278,9 @@ static int flattenSubquery(
   if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){
     return 0;   /* Restriction (27) */
   }
+  if( pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d==M10d_Yes ){
+    return 0;       /* (28) */
+  }
 
   /* Restriction (17): If the sub-query is a compound SELECT, then it must
   ** use only the UNION ALL operator. And none of the simple select queries
index 3ba8a63cd7763a93b982d2f331f6e8e85d7423ce..db73943f0215ecb1dfb9f50a5d8d8df2fb565387 100644 (file)
@@ -115,6 +115,10 @@ void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){
         }
         sqlite3_str_appendf(&x, ")");
       }
+      if( pCte->eM10d!=M10d_Any ){
+        sqlite3_str_appendf(&x, " %sMATERIALIZED", 
+           pCte->eM10d==M10d_No ? "NOT " : "");
+      }
       if( pCte->pUse ){
         sqlite3_str_appendf(&x, " (pUse=0x%p, nUse=%d)", pCte->pUse,
                  pCte->pUse->nUse);
index 5765399d102163741f0c746c4e9a3da569b281ea..91cbc795243ac5b0e8c63c0a718a3161baa2efd0 100644 (file)
@@ -1075,10 +1075,10 @@ do_execsql_test 21.2 {
 # Make sure crazy nexted CTE joins terminate with an error quickly.
 #
 do_catchsql_test 22.1 {
-  WITH RECURSIVE c AS (
-     WITH RECURSIVE c AS (
-        WITH RECURSIVE c AS (
-           WITH RECURSIVE c AS (
+  WITH RECURSIVE c AS NOT MATERIALIZED (
+     WITH RECURSIVE c AS NOT MATERIALIZED (
+        WITH RECURSIVE c AS NOT MATERIALIZED (
+           WITH RECURSIVE c AS NOT MATERIALIZED (
                WITH  c AS (VALUES(0))
                SELECT 1 FROM c LEFT JOIN c ON ltrim(1)
            )
index 333147d8be699629513d1c79426287292ad5cd03..20e518b01a6f50fa7f5ebb0b5e25162109b75f9d 100644 (file)
@@ -229,10 +229,12 @@ do_eqp_test 211 {
 } {
   QUERY PLAN
   |--MATERIALIZE c1
-  |  |--MATERIALIZE c
+  |  |--CO-ROUTINE c
   |  |  `--SCAN 3 CONSTANT ROWS
   |  `--SCAN c
   |--MATERIALIZE c2
+  |  |--CO-ROUTINE c
+  |  |  `--SCAN 3 CONSTANT ROWS
   |  `--SCAN c
   |--SCAN c1
   |--SCAN c2
@@ -250,6 +252,71 @@ do_execsql_test 220 {
   SELECT y FROM t2 ORDER BY y;
 } {40404 40405 40406 40504 40505 40506 40604 40605 40606}
 
+# 2022-04-22: Do not allow flattening of a MATERIALIZED CTE into
+# an outer query.
+#
+reset_db
+db null -
+do_execsql_test 300 {
+  CREATE TABLE t2(a INT,b INT,d INT); INSERT INTO t2 VALUES(4,5,6),(7,8,9);
+  CREATE TABLE t3(a INT,b INT,e INT); INSERT INTO t3 VALUES(3,3,3),(8,8,8);
+} {}
+do_execsql_test 310 {
+  WITH t23 AS MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
+  SELECT * FROM t23;
+} {
+  4 5 6 - -
+  7 8 9 8 8
+  - 3 - 3 3
+}
+do_eqp_test 311 {
+  WITH t23 AS MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
+  SELECT * FROM t23;
+} {
+  QUERY PLAN
+  |--MATERIALIZE t23
+  |  |--SCAN t2
+  |  |--SCAN t3 LEFT-JOIN
+  |  `--RIGHT-JOIN t3
+  |     `--SCAN t3
+  `--SCAN t23
+}
+do_execsql_test 320 {
+  WITH t23 AS NOT MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
+  SELECT * FROM t23;
+} {
+  4 5 6 - -
+  7 8 9 8 8
+  - 3 - 3 3
+}
+do_eqp_test 321 {
+  WITH t23 AS NOT MATERIALIZED (SELECT * FROM t2 FULL JOIN t3 USING(b))
+  SELECT * FROM t23;
+} {
+  QUERY PLAN
+  |--SCAN t2
+  |--SCAN t3 LEFT-JOIN
+  `--RIGHT-JOIN t3
+     `--SCAN t3
+}
+do_execsql_test 330 {
+  WITH t23 AS (SELECT * FROM t2 FULL JOIN t3 USING(b))
+  SELECT * FROM t23;
+} {
+  4 5 6 - -
+  7 8 9 8 8
+  - 3 - 3 3
+}
+do_eqp_test 331 {
+  WITH t23 AS (SELECT * FROM t2 FULL JOIN t3 USING(b))
+  SELECT * FROM t23;
+} {
+  QUERY PLAN
+  |--SCAN t2
+  |--SCAN t3 LEFT-JOIN
+  `--RIGHT-JOIN t3
+     `--SCAN t3
+}
 
 
 finish_test