diff options
author | dan <Dan Kennedy> | 2020-12-21 18:39:58 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2020-12-21 18:39:58 +0000 |
commit | a3d33ebe4ab767f976ea24ef1488fe1d0be82deb (patch) | |
tree | ed49e007925ced67466ed3384dd3b46b46e497b2 /src | |
parent | 6d5f928d22e61bb9e12d7ba5ea01da42bacd63dd (diff) | |
download | sqlite-a3d33ebe4ab767f976ea24ef1488fe1d0be82deb.tar.gz sqlite-a3d33ebe4ab767f976ea24ef1488fe1d0be82deb.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/walker.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/walker.c b/src/walker.c index 7649036f5..d047ccc03 100644 --- a/src/walker.c +++ b/src/walker.c @@ -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; } } |