aboutsummaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2018-06-08 16:11:55 +0000
committerdan <dan@noemail.net>2018-06-08 16:11:55 +0000
commitdacf1de95c75ffdaf01537a21666a270e29a670c (patch)
treed306c967bbb97d13af0f864519866055d875e66b /src/window.c
parent03854d2eccd79a5538da1ead29ed52dca85d5332 (diff)
downloadsqlite-dacf1de95c75ffdaf01537a21666a270e29a670c.tar.gz
sqlite-dacf1de95c75ffdaf01537a21666a270e29a670c.zip
Do not flatten sub-queries that contain window functions.
FossilOrigin-Name: 236cb75bd1f0d5eb86aa5f52d8d548e7263c34633833dcea9dfc934f142113b8
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/window.c b/src/window.c
index 269074717..d2b6e23a6 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1560,7 +1560,10 @@ static void windowCodeDefaultStep(
if( addrGoto ) sqlite3VdbeJumpHere(v, addrGoto);
}
+ sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3);
sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub);
+ sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1);
+
sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr);
sqlite3VdbeAddOp3(
v, OP_Copy, reg+pMWin->nBufferCol, pMWin->regPart, nPart+nPeer-1
@@ -1586,9 +1589,28 @@ static void windowCodeDefaultStep(
sqlite3WhereEnd(pWInfo);
windowAggFinal(pParse, pMWin, 1);
+ sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3);
sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub);
+ sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1);
}
+Window *sqlite3WindowDup(sqlite3 *db, Window *p){
+ Window *pNew = 0;
+ if( p ){
+ pNew = sqlite3DbMallocZero(db, sizeof(Window));
+ if( pNew ){
+ pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0);
+ pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0);
+ pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0);
+ pNew->eType = p->eType;
+ pNew->eEnd = p->eEnd;
+ pNew->eStart = p->eStart;
+ pNew->pStart = sqlite3ExprDup(db, pNew->pStart, 0);
+ pNew->pEnd = sqlite3ExprDup(db, pNew->pEnd, 0);
+ }
+ }
+ return pNew;
+}
/*
** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
@@ -1649,13 +1671,11 @@ void sqlite3WindowCodeStep(
Select *p,
WhereInfo *pWInfo,
int regGosub,
- int addrGosub,
- int *pbLoop
+ int addrGosub
){
Window *pMWin = p->pWin;
Window *pWin;
- *pbLoop = 0;
if( (pMWin->eType==TK_ROWS
&& (pMWin->eStart!=TK_UNBOUNDED||pMWin->eEnd!=TK_CURRENT||!pMWin->pOrderBy))
|| (pMWin->eStart==TK_CURRENT&&pMWin->eEnd==TK_UNBOUNDED&&pMWin->pOrderBy)
@@ -1677,7 +1697,6 @@ void sqlite3WindowCodeStep(
}
}
- *pbLoop = 1;
windowCodeDefaultStep(pParse, p, pWInfo, regGosub, addrGosub);
}