aboutsummaryrefslogtreecommitdiff
path: root/src/select.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2018-05-17 14:26:27 +0000
committerdan <dan@noemail.net>2018-05-17 14:26:27 +0000
commit2e362f9775ba05e353276039acc788e592fea0e4 (patch)
treeb423e27a44841c7797e68a95d1bd2c14cffa8f16 /src/select.c
parent86fb6e173885b9ac170b14ce9a9d0ccf7cd34e50 (diff)
downloadsqlite-2e362f9775ba05e353276039acc788e592fea0e4.tar.gz
sqlite-2e362f9775ba05e353276039acc788e592fea0e4.zip
Handle multiple window-functions in a single query.
FossilOrigin-Name: 35af0b750e70dcf0f343b115f4bbd0860a7e8064be204d4dfba1a43c22ff07b1
Diffstat (limited to 'src/select.c')
-rw-r--r--src/select.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/select.c b/src/select.c
index 2b5a3dc54..93e55b680 100644
--- a/src/select.c
+++ b/src/select.c
@@ -5418,6 +5418,17 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){
int rc = WRC_Continue;
switch( pExpr->op ){
+
+ case TK_FUNCTION:
+ if( pExpr->pWin==0 ){
+ break;
+ }else if( pExpr->pWin==p->pWin ){
+ rc = WRC_Prune;
+ pExpr->pWin->pOwner = pExpr;
+ break;
+ }
+ /* Fall through. */
+
case TK_COLUMN: {
Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0);
p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup);
@@ -5436,13 +5447,6 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){
break;
}
- case TK_FUNCTION:
- if( pExpr->pWin ){
- rc = WRC_Prune;
- pExpr->pWin->pOwner = pExpr;
- }
- break;
-
default: /* no-op */
break;
}
@@ -5530,9 +5534,6 @@ static int selectWindowRewrite(Parse *pParse, Select *p){
ExprList *pSublist = 0; /* Expression list for sub-query */
Window *pWin = p->pWin;
- /* TODO: This is of course temporary requirements */
- assert( pWin->pNextWin==0 );
-
p->pSrc = 0;
p->pWhere = 0;
p->pGroupBy = 0;
@@ -5581,6 +5582,7 @@ static int selectWindowRewrite(Parse *pParse, Select *p){
}else{
pSub->selFlags |= SF_Expanded;
}
+ pWin->pNextWin = 0;
}
#if SELECTTRACE_ENABLED