aboutsummaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2019-09-13 20:42:46 +0000
committerdan <dan@noemail.net>2019-09-13 20:42:46 +0000
commit51a75aaa76c300b3826e434013ddaf73c49e57c1 (patch)
tree30a321b6cde64ac7df270cab710dbee6107d4b82 /src/window.c
parente087a7c35b1bedfb37c2b41baac77e794ed89f63 (diff)
downloadsqlite-51a75aaa76c300b3826e434013ddaf73c49e57c1.tar.gz
sqlite-51a75aaa76c300b3826e434013ddaf73c49e57c1.zip
Fix a problem with using json1 window functions with an EXCLUDE clause.
FossilOrigin-Name: 4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/window.c b/src/window.c
index 43946dd55..15f38ee00 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1481,8 +1481,8 @@ static void windowAggStep(
int addrIf = 0;
if( pWin->pFilter ){
int regTmp;
- assert( nArg==0 || nArg==pWin->pOwner->x.pList->nExpr );
- assert( nArg || pWin->pOwner->x.pList==0 );
+ assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr );
+ assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 );
regTmp = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp);
addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1);
@@ -1490,9 +1490,19 @@ static void windowAggStep(
sqlite3ReleaseTempReg(pParse, regTmp);
}
if( pWin->bExprArgs ){
+ int iStart = sqlite3VdbeCurrentAddr(v);
+ VdbeOp *pOp, *pEnd;
+
nArg = pWin->pOwner->x.pList->nExpr;
regArg = sqlite3GetTempRange(pParse, nArg);
sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0);
+
+ pEnd = sqlite3VdbeGetOp(v, -1);
+ for(pOp=sqlite3VdbeGetOp(v, iStart); pOp<=pEnd; pOp++){
+ if( pOp->opcode==OP_Column && pOp->p1==pWin->iEphCsr ){
+ pOp->p1 = csr;
+ }
+ }
}
if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){
CollSeq *pColl;