mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Fix a problem when flattening joins between a UNION ALL sub-query and another sub-query that uses more than one window function.
FossilOrigin-Name: ef9733fe1c6b31849a5da1037d21915f82e0e4ab42d1a23ead8a121012f1bace
This commit is contained in:
16
manifest
16
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
|
||||
|
@ -1 +1 @@
|
||||
788b96851d9ced84757c48dc3e0414cab27ee7e50e9730dab30b2e42a7762397
|
||||
ef9733fe1c6b31849a5da1037d21915f82e0e4ab42d1a23ead8a121012f1bace
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user