]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem when flattening joins between a UNION ALL sub-query and another sub...
authordan <Dan Kennedy>
Mon, 21 Dec 2020 18:39:58 +0000 (18:39 +0000)
committerdan <Dan Kennedy>
Mon, 21 Dec 2020 18:39:58 +0000 (18:39 +0000)
FossilOrigin-Name: ef9733fe1c6b31849a5da1037d21915f82e0e4ab42d1a23ead8a121012f1bace

manifest
manifest.uuid
src/walker.c
test/unionall.test

index af20ffa076269b08c850ec62cc08c3510b495167..3d9ea67193ec609a6d11342dd31d20c6c26d370a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sdocumentation\sto\sshow\sthat\s"ro"\sis\sthe\scorrect\sway\sto\ssay\s"readonly"\nin\sthe\smode=\squery\sparameter.
-D 2020-12-21T14:51:33.242
+C Fix\sa\sproblem\swhen\sflattening\sjoins\sbetween\sa\sUNION\sALL\ssub-query\sand\sanother\ssub-query\sthat\suses\smore\sthan\sone\swindow\sfunction.
+D 2020-12-21T18:39:58.008
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -626,7 +626,7 @@ F src/vtab.c 5f5fc793092f53bbdfde296c50f563fb7bda58cf48e9cf6a8bdfbc5abd409845
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c 69e770e96fd56cc21608992bf2c6f1f3dc5cf2572d0495c6a643b06c3a679f14
 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
-F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049
+F src/walker.c d9c4e454ebb9499e908aa62d55b8994c375cf5355ac78f60d45af17f7890701c
 F src/where.c 2d593bfc6fa24e53dfe7c99bd327af687f8502e5f0e0299dd2c0f503b133f0bb
 F src/whereInt.h 9a3f577619f07700d16d89eeb2f3d94d6b7ed7f109c2dacf0ce8844921549506
 F src/wherecode.c a3a1aff30fe99a818d8e7c607980f033f40c68d890e03ed25838b9dbb7908bee
@@ -1627,7 +1627,7 @@ F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776
 F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff
 F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac
 F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a
-F test/unionall.test 9dcc5faefe8caa4e2e4084fd4f45ad783abb7cfb86fcb87a3b74204e03f86014
+F test/unionall.test 70d6ec7bce279cf63edc11589b0541ddf289ef6efe51c24cbf4efaceeb4ce5b8
 F test/unionallfault.test 652bfbb630e6c43135965dc1e8f0a9a791da83aec885d626a632fe1909c56f73
 F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4
 F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06
@@ -1893,7 +1893,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 3b0c9b41a877c7344ef3b7c5b6981436005716e25b41b1a1ffc145520243abd3
-R b74c560d3085cb3bea733f18ec03ab77
-U drh
-Z 76c875139f02e2b74c2635d603850742
+P 788b96851d9ced84757c48dc3e0414cab27ee7e50e9730dab30b2e42a7762397
+R 8f0537d0e7a9b2ba57d49d118851dfa2
+U dan
+Z 750efdd05db1f99dfea3008ae72af1b9
index 52e405b2a6d187a8fe0b2a1d577d61b33a4a4058..f60e210e25eaee7c7b465597753045d6b9a43f14 100644 (file)
@@ -1 +1 @@
-788b96851d9ced84757c48dc3e0414cab27ee7e50e9730dab30b2e42a7762397
\ No newline at end of file
+ef9733fe1c6b31849a5da1037d21915f82e0e4ab42d1a23ead8a121012f1bace
\ No newline at end of file
index 7649036f5622586fe3767ada827e2598fd266f3b..d047ccc039405aaace3c59d4aa19b49bdee87dba 100644 (file)
@@ -22,7 +22,7 @@
 ** Walk all expressions linked into the list of Window objects passed
 ** as the second argument.
 */
-static int walkWindowList(Walker *pWalker, Window *pList){
+static int walkWindowList(Walker *pWalker, Window *pList, int bOneOnly){
   Window *pWin;
   for(pWin=pList; pWin; pWin=pWin->pNextWin){
     int rc;
@@ -41,6 +41,7 @@ static int walkWindowList(Walker *pWalker, Window *pList){
     if( NEVER(rc) ) return WRC_Abort;
     rc = sqlite3WalkExpr(pWalker, pWin->pEnd);
     if( NEVER(rc) ) return WRC_Abort;
+    if( bOneOnly ) break;
   }
   return WRC_Continue;
 }
@@ -88,7 +89,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){
         }
 #ifndef SQLITE_OMIT_WINDOWFUNC
         if( ExprHasProperty(pExpr, EP_WinFunc) ){
-          if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort;
+          if( walkWindowList(pWalker, pExpr->y.pWin, 1) ) return WRC_Abort;
         }
 #endif
       }
@@ -135,7 +136,7 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){
     if( pParse && IN_RENAME_OBJECT ){
       /* The following may return WRC_Abort if there are unresolvable
       ** symbols (e.g. a table that does not exist) in a window definition. */
-      int rc = walkWindowList(pWalker, p->pWinDefn);
+      int rc = walkWindowList(pWalker, p->pWinDefn, 0);
       return rc;
     }
   }
index 430cd62e0904fbd3a2b04076e1b8ea71bb27b2f5..7688ce8b36fcdca1c3a5676b145b3db35486f6fa 100644 (file)
@@ -245,4 +245,34 @@ do_execsql_test 4.2 {
   SELECT * FROM (SELECT * FROM t1, t3) ORDER BY k;
 } {123 t1_a 456 t3_a}
 
+do_execsql_test 4.3 {
+  SELECT * FROM (SELECT * FROM t1, t3), (
+    SELECT max(a) OVER () FROM t1
+      UNION ALL
+    SELECT min(a) OVER () FROM t1
+  )
+  ORDER BY k;
+} {
+  123 t1_a 456 t3_a 123
+  123 t1_a 456 t3_a 123
+}
+
+do_execsql_test 4.3 {
+  SELECT * FROM (SELECT * FROM t1, t3), (
+    SELECT group_concat(a) OVER (ORDER BY a), 
+           group_concat(a) OVER (ORDER BY a),
+           group_concat(a) OVER (ORDER BY a),
+           group_concat(a) OVER (ORDER BY a),
+           group_concat(a) OVER (ORDER BY a),
+           group_concat(a) OVER (ORDER BY a),
+           group_concat(a) OVER (ORDER BY a),
+           group_concat(a) OVER (ORDER BY a),
+           group_concat(a) OVER (ORDER BY a)
+    FROM t1
+  )
+  ORDER BY k;
+} {
+  123 t1_a 456 t3_a 123 123 123 123 123 123 123 123 123
+}
+
 finish_test