aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <Dan Kennedy>2020-12-21 18:39:58 +0000
committerdan <Dan Kennedy>2020-12-21 18:39:58 +0000
commita3d33ebe4ab767f976ea24ef1488fe1d0be82deb (patch)
treeed49e007925ced67466ed3384dd3b46b46e497b2 /src
parent6d5f928d22e61bb9e12d7ba5ea01da42bacd63dd (diff)
downloadsqlite-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.c7
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;
}
}