mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Fix problem with window functions min() and max() when used with a PARTITION
clause and a frame starting point other than "UNBOUNDED PRECEDING". FossilOrigin-Name: 43eb1e75a4d7ac0973ed8589bbaf379c24cdc8eacc4e613610d2d4c24d385dc1
This commit is contained in:
18
src/window.c
18
src/window.c
@@ -859,6 +859,13 @@ void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){
|
||||
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
|
||||
FuncDef *p = pWin->pFunc;
|
||||
if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){
|
||||
/* The inline versions of min() and max() require a single ephemeral
|
||||
** table and 3 registers. The registers are used as follows:
|
||||
**
|
||||
** regApp+0: slot to copy min()/max() argument to for MakeRecord
|
||||
** regApp+1: integer value used to ensure keys are unique
|
||||
** regApp+2: output of MakeRecord
|
||||
*/
|
||||
ExprList *pList = pWin->pOwner->x.pList;
|
||||
KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0);
|
||||
pWin->csrApp = pParse->nTab++;
|
||||
@@ -1248,14 +1255,21 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){
|
||||
int nArg = 0;
|
||||
Window *pWin;
|
||||
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
|
||||
FuncDef *pFunc = pWin->pFunc;
|
||||
sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum);
|
||||
nArg = MAX(nArg, windowArgCount(pWin));
|
||||
if( pWin->pFunc->xSFunc==nth_valueStepFunc
|
||||
|| pWin->pFunc->xSFunc==first_valueStepFunc
|
||||
if( pFunc->xSFunc==nth_valueStepFunc
|
||||
|| pFunc->xSFunc==first_valueStepFunc
|
||||
){
|
||||
sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp);
|
||||
sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1);
|
||||
}
|
||||
|
||||
if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){
|
||||
assert( pWin->eStart!=TK_UNBOUNDED );
|
||||
sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp);
|
||||
sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1);
|
||||
}
|
||||
}
|
||||
regArg = pParse->nMem+1;
|
||||
pParse->nMem += nArg;
|
||||
|
Reference in New Issue
Block a user