diff options
author | dan <dan@noemail.net> | 2019-09-13 20:42:46 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2019-09-13 20:42:46 +0000 |
commit | 51a75aaa76c300b3826e434013ddaf73c49e57c1 (patch) | |
tree | 30a321b6cde64ac7df270cab710dbee6107d4b82 /src/window.c | |
parent | e087a7c35b1bedfb37c2b41baac77e794ed89f63 (diff) | |
download | sqlite-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.c | 14 |
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; |