From 11df7d2839a44e4814ebb110718e658c5ad9014a Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 6 Dec 2018 19:15:36 +0000 Subject: [PATCH 1/4] Simplify the query flattener so that it does not duplicate the WHERE clause of subquery that is being incorporated into the outer query - copies it directly. This is more efficient. And it also fixes the specific test case show for ticket [f09fcd17810f65f71789525] but it does not resolve the more general problem that sqlite3ExprDup() does not correctly duplicate expressions that contain subqueries with window functions. FossilOrigin-Name: f1b18d44ff855573542c1947a42d4025dff54cacc13dac14d044521762ea9736 --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/select.c | 4 +++- test/window1.test | 13 +++++++++++++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 035bff0044..8674aa7a68 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\smasking\sbits\soff\sof\ssqlite3.flags,\smake\ssure\sthe\smask\sis\s64\sbits\nin\ssize\sso\sas\snot\sto\saccidentally\smask\sof\shigh-order\sbits. -D 2018-12-06T17:06:02.839 +C Simplify\sthe\squery\sflattener\sso\sthat\sit\sdoes\snot\sduplicate\sthe\sWHERE\sclause\nof\ssubquery\sthat\sis\sbeing\sincorporated\sinto\sthe\souter\squery\s-\scopies\sit\ndirectly.\s\sThis\sis\smore\sefficient.\s\sAnd\sit\salso\sfixes\sthe\sspecific\stest\scase\nshow\sfor\sticket\s[f09fcd17810f65f71789525]\sbut\sit\sdoes\snot\sresolve\sthe\smore\ngeneral\sproblem\sthat\ssqlite3ExprDup()\sdoes\snot\scorrectly\sduplicate\sexpressions\nthat\scontain\ssubqueries\swith\swindow\sfunctions. +D 2018-12-06T19:15:36.453 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c @@ -507,7 +507,7 @@ F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e0408228bad5d13937a626521cba42c6f768643a6353712218d7e01fb201b202 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 06a122decd9268c747e9110448b0c84249a4623ca9d78a73618ce648f7af8869 +F src/select.c 8c7317d5ee920516a56b8b4ca79fbfca70a1f8b52d67e884c808ea3a016c04e3 F src/shell.c.in 1f0819e69fb1ebd2eb44695530dc43936608bf9b752981a0ffd4e2e4a9e3883d F src/sqlite.h.in 908ec406feefc4c7e1486a2e3dc30a8bfb51c5a345a8e8130ac201962db171c4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1655,7 +1655,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 02e481ac48c445b43bab7b3cf1e4115165b5127a1aa29e14f5372922c836f1a4 +F test/window1.test d55c41a0b7a3246ed3882e87c540ac2e4bf7a8f7774e0c2e81690b4f4bedc088 F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1782,7 +1782,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9c6dbcfab5952cf4e54de30cf9cee48f988b91a35dc3f04d64d6d994dd84a076 -R b1b5c125b5cc5dd847ef51923c461312 +P 53d3b169d8e1892163526caff2c843302c92e280fdeff6831e23a9bb15b82be3 +R a2d2ec8d34c71e6abf08e50ec579efcc +T *branch * ticket-f09fcd17810f +T *sym-ticket-f09fcd17810f * +T -sym-trunk * U drh -Z 9423d60b113ec33e61947be8b42c640e +Z 5018814e4a4daf9bdeea4c03d1c78115 diff --git a/manifest.uuid b/manifest.uuid index 8f6dcb9997..9922fca4fa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -53d3b169d8e1892163526caff2c843302c92e280fdeff6831e23a9bb15b82be3 \ No newline at end of file +f1b18d44ff855573542c1947a42d4025dff54cacc13dac14d044521762ea9736 \ No newline at end of file diff --git a/src/select.c b/src/select.c index a275cb4b4d..5e30504d4c 100644 --- a/src/select.c +++ b/src/select.c @@ -3461,6 +3461,7 @@ static Expr *substExpr( ifNullRow.iTable = pSubst->iNewTable; pCopy = &ifNullRow; } + testcase( ExprHasProperty(pCopy, EP_Subquery) ); pNew = sqlite3ExprDup(db, pCopy, 0); if( pNew && pSubst->isLeftJoin ){ ExprSetProperty(pNew, EP_CanBeNull); @@ -4025,7 +4026,8 @@ static int flattenSubquery( pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; } - pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); + pWhere = pSub->pWhere; + pSub->pWhere = 0; if( isLeftJoin>0 ){ setJoinExpr(pWhere, iNewParent); } diff --git a/test/window1.test b/test/window1.test index a8399a8606..c24bbaa20f 100644 --- a/test/window1.test +++ b/test/window1.test @@ -594,4 +594,17 @@ do_execsql_test 13.5 { } { } +# 2018-12-06 +# https://www.sqlite.org/src/info/f09fcd17810f65f7 +# Assertion fault when window functions are used +# +sqlite3 db :memory: +do_execsql_test 14.0 { + SELECT * FROM( + SELECT * FROM (SELECT 1 AS c) WHERE c IN ( + SELECT (row_number() OVER()) FROM (VALUES (0)) + ) + ); +} {1} + finish_test From bb383df7c625daa4c7a0db4c7eed2296dc171bde Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 6 Dec 2018 19:56:20 +0000 Subject: [PATCH 2/4] New test case that still hits an assertion fault, just to prove that the previous checkin merely made the problem more obscure and did not completely fix it. FossilOrigin-Name: a9a3b532643b5f106509bb29c3e6bc9d41ec5b2da5a0cd4067898f376eb626a2 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- test/window1.test | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 8674aa7a68..066d87f7c1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\squery\sflattener\sso\sthat\sit\sdoes\snot\sduplicate\sthe\sWHERE\sclause\nof\ssubquery\sthat\sis\sbeing\sincorporated\sinto\sthe\souter\squery\s-\scopies\sit\ndirectly.\s\sThis\sis\smore\sefficient.\s\sAnd\sit\salso\sfixes\sthe\sspecific\stest\scase\nshow\sfor\sticket\s[f09fcd17810f65f71789525]\sbut\sit\sdoes\snot\sresolve\sthe\smore\ngeneral\sproblem\sthat\ssqlite3ExprDup()\sdoes\snot\scorrectly\sduplicate\sexpressions\nthat\scontain\ssubqueries\swith\swindow\sfunctions. -D 2018-12-06T19:15:36.453 +C New\stest\scase\sthat\sstill\shits\san\sassertion\sfault,\sjust\sto\sprove\sthat\sthe\nprevious\scheckin\smerely\smade\sthe\sproblem\smore\sobscure\sand\sdid\snot\scompletely\nfix\sit. +D 2018-12-06T19:56:20.155 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c @@ -1655,7 +1655,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test d55c41a0b7a3246ed3882e87c540ac2e4bf7a8f7774e0c2e81690b4f4bedc088 +F test/window1.test 1003e19bebe06be286a38139ea5fc010b30c055cc1527824b09d609f89bbd93b F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1782,10 +1782,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 53d3b169d8e1892163526caff2c843302c92e280fdeff6831e23a9bb15b82be3 -R a2d2ec8d34c71e6abf08e50ec579efcc -T *branch * ticket-f09fcd17810f -T *sym-ticket-f09fcd17810f * -T -sym-trunk * +P f1b18d44ff855573542c1947a42d4025dff54cacc13dac14d044521762ea9736 +R 999c00703256c76e5513029bb0036a91 U drh -Z 5018814e4a4daf9bdeea4c03d1c78115 +Z 08d2025b0cdb73a3ed0863948c64547c diff --git a/manifest.uuid b/manifest.uuid index 9922fca4fa..3ba1ff645b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f1b18d44ff855573542c1947a42d4025dff54cacc13dac14d044521762ea9736 \ No newline at end of file +a9a3b532643b5f106509bb29c3e6bc9d41ec5b2da5a0cd4067898f376eb626a2 \ No newline at end of file diff --git a/test/window1.test b/test/window1.test index c24bbaa20f..5f9b5dbb75 100644 --- a/test/window1.test +++ b/test/window1.test @@ -596,7 +596,12 @@ do_execsql_test 13.5 { # 2018-12-06 # https://www.sqlite.org/src/info/f09fcd17810f65f7 -# Assertion fault when window functions are used +# Assertion fault when window functions are used. +# +# Root cause is the query flattener invoking sqlite3ExprDup() on +# expressions that contain subqueries with window functions. The +# sqlite3ExprDup() routine is not making correctly initializing +# Select.pWin field of the subqueries. # sqlite3 db :memory: do_execsql_test 14.0 { @@ -606,5 +611,14 @@ do_execsql_test 14.0 { ) ); } {1} +do_execsql_test 14.1 { + CREATE TABLE t1(x); INSERT INTO t1(x) VALUES(12345); + CREATE TABLE t2(c); INSERT INTO t2(c) VALUES(1); + SELECT y, y+1, y+2 FROM ( + SELECT c IN ( + SELECT (row_number() OVER()) FROM t1 + ) AS y FROM t2 + ); +} {1 2 3} finish_test From a83899754423bea16d4efeb4f39482b57d79c083 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 6 Dec 2018 22:04:19 +0000 Subject: [PATCH 3/4] Fix the sqlite3ExprDup() routine so that it makes complete duplications of subqueries containing window functions. FossilOrigin-Name: 940174543e87184a0278fcd02e8a096a11510174d9c1d65d21878819790ddaff --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 27 +++++++++++++++++++++++++++ src/window.c | 1 + 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 066d87f7c1..73d0947676 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sthat\sstill\shits\san\sassertion\sfault,\sjust\sto\sprove\sthat\sthe\nprevious\scheckin\smerely\smade\sthe\sproblem\smore\sobscure\sand\sdid\snot\scompletely\nfix\sit. -D 2018-12-06T19:56:20.155 +C Fix\sthe\ssqlite3ExprDup()\sroutine\sso\sthat\sit\smakes\scomplete\sduplications\sof\nsubqueries\scontaining\swindow\sfunctions. +D 2018-12-06T22:04:19.327 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c @@ -459,7 +459,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9 F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb -F src/expr.c a3e90131d7f92b77a6a6ae2e71f0d2882237041ed11dbe3c914e5e278ddc2d24 +F src/expr.c 348e3877784d3e3a8b053a6b2e32d00b986fc4420ab484a41bf38e6d31e3b84b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812 F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f @@ -596,7 +596,7 @@ F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e F src/whereInt.h f125f29fca80890768e0b2caa14f95db74b2dacd3a122a168f97aa7b64d6968f F src/wherecode.c c45f03aefc2266b990df0fc4d7acc4e27f56f881f4fc0fc355b7cbc4d7189da5 F src/whereexpr.c 491f0894ad9903750cdecb7894437a0cabdffdd88f574d2b1c9ac85d14fe4b9c -F src/window.c 6550e2850ebced51100ef83d49b00a1cf03f81a482dafedafb0320df647ed8fc +F src/window.c ea81ecd031ed2cbc14b7db6fd7f4bee2471b894feae5fea0547b15b1e2dd8fb2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1782,7 +1782,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 f1b18d44ff855573542c1947a42d4025dff54cacc13dac14d044521762ea9736 -R 999c00703256c76e5513029bb0036a91 +P a9a3b532643b5f106509bb29c3e6bc9d41ec5b2da5a0cd4067898f376eb626a2 +R 24973ceb08f0bf40a95db4b2c4fd154c U drh -Z 08d2025b0cdb73a3ed0863948c64547c +Z f52863a824efeb9518162f1a9aff57dd diff --git a/manifest.uuid b/manifest.uuid index 3ba1ff645b..282cc9c5e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9a3b532643b5f106509bb29c3e6bc9d41ec5b2da5a0cd4067898f376eb626a2 \ No newline at end of file +940174543e87184a0278fcd02e8a096a11510174d9c1d65d21878819790ddaff \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index fb44a7ef75..a6bb441d56 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1330,6 +1330,32 @@ static With *withDup(sqlite3 *db, With *p){ # define withDup(x,y) 0 #endif +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** The gatherSelectWindows() procedure and its helper routine +** gatherSelectWindowsCallback() are used to scan all the expressions +** an a newly duplicated SELECT statement and gather all of the Window +** objects found there, assembling them onto the linked list at Select->pWin. +*/ +static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && pExpr->y.pWin!=0 ){ + assert( ExprHasProperty(pExpr, EP_WinFunc) ); + pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; + pWalker->u.pSelect->pWin = pExpr->y.pWin; + } + return WRC_Continue; +} +static void gatherSelectWindows(Select *p){ + Walker w; + w.xExprCallback = gatherSelectWindowsCallback; + w.xSelectCallback = 0; + w.u.pSelect = p; + sqlite3WalkSelectExpr(&w, p); + sqlite3WalkSelectFrom(&w, p); +} +#endif + + /* ** The following group of routines make deep copies of expressions, ** expression lists, ID lists, and select statements. The copies can @@ -1497,6 +1523,7 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); + if( p->pWin ) gatherSelectWindows(pNew); #endif pNew->selId = p->selId; *pp = pNew; diff --git a/src/window.c b/src/window.c index f5deae9a6e..f3e274d6e3 100644 --- a/src/window.c +++ b/src/window.c @@ -2133,6 +2133,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); + pNew->pFunc = p->pFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); pNew->eType = p->eType; From a37b6a5e31f341412dc0c454569fea5cd0f88cef Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 6 Dec 2018 22:12:18 +0000 Subject: [PATCH 4/4] Performance improvement: Avoid using sqlite3WalkerSelectExpr() and sqlite3WalkerSelectFrom() twice, so that the compiler will in-line their implementation. FossilOrigin-Name: 2b9258b8b0342330ebe8c22b59ec276fd042a05547d15b24fdf29e16280868de --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 9 ++++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 73d0947676..4b2190f9c8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\ssqlite3ExprDup()\sroutine\sso\sthat\sit\smakes\scomplete\sduplications\sof\nsubqueries\scontaining\swindow\sfunctions. -D 2018-12-06T22:04:19.327 +C Performance\simprovement:\s\sAvoid\susing\ssqlite3WalkerSelectExpr()\nand\ssqlite3WalkerSelectFrom()\stwice,\sso\sthat\sthe\scompiler\swill\sin-line\stheir\nimplementation. +D 2018-12-06T22:12:18.890 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c @@ -459,7 +459,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9 F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb -F src/expr.c 348e3877784d3e3a8b053a6b2e32d00b986fc4420ab484a41bf38e6d31e3b84b +F src/expr.c b83e2056086e364293ce741509d885d1646a32d62727fe3169b23231c7e4f62f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812 F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f @@ -1782,7 +1782,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 a9a3b532643b5f106509bb29c3e6bc9d41ec5b2da5a0cd4067898f376eb626a2 -R 24973ceb08f0bf40a95db4b2c4fd154c +P 940174543e87184a0278fcd02e8a096a11510174d9c1d65d21878819790ddaff +R 49ae07edd1762ce880f34b83601e0b9e U drh -Z f52863a824efeb9518162f1a9aff57dd +Z bcb12cb10c9264efa5baeffb2512d3d5 diff --git a/manifest.uuid b/manifest.uuid index 282cc9c5e5..40b4d9a6d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -940174543e87184a0278fcd02e8a096a11510174d9c1d65d21878819790ddaff \ No newline at end of file +2b9258b8b0342330ebe8c22b59ec276fd042a05547d15b24fdf29e16280868de \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index a6bb441d56..6886d30b2d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1345,13 +1345,16 @@ static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ } return WRC_Continue; } +static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ + return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; +} static void gatherSelectWindows(Select *p){ Walker w; w.xExprCallback = gatherSelectWindowsCallback; - w.xSelectCallback = 0; + w.xSelectCallback = gatherSelectWindowsSelectCallback; + w.xSelectCallback2 = 0; w.u.pSelect = p; - sqlite3WalkSelectExpr(&w, p); - sqlite3WalkSelectFrom(&w, p); + sqlite3WalkSelect(&w, p); } #endif