diff options
author | dan <dan@noemail.net> | 2018-06-15 19:01:35 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2018-06-15 19:01:35 +0000 |
commit | 6fde1799f88a1dd0de54f57bf9ba67af400a6cfc (patch) | |
tree | ae6cdcde1c001a36a9df4e201fcac6f476a066ef /src | |
parent | e0a5e20fa8a08b32dee0539539a7c2164cda5944 (diff) | |
download | sqlite-6fde1799f88a1dd0de54f57bf9ba67af400a6cfc.tar.gz sqlite-6fde1799f88a1dd0de54f57bf9ba67af400a6cfc.zip |
Fix another problem in lead()/lag(). And some errors that could occur
following OOM faults.
FossilOrigin-Name: fadd4dc119d8df0d871f4d839b7a11070e2ffb8927e84b3e7a94f34196db3de3
Diffstat (limited to 'src')
-rw-r--r-- | src/parse.y | 6 | ||||
-rw-r--r-- | src/window.c | 16 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/parse.y b/src/parse.y index fa6064a14..6120533bd 100644 --- a/src/parse.y +++ b/src/parse.y @@ -535,7 +535,11 @@ oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y) Token s = S; /*A-overwrites-S*/ #endif A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L); - if( A ) A->pWinDefn = R; + if( A ){ + A->pWinDefn = R; + }else{ + sqlite3WindowListDelete(pParse->db, R); + } #if SELECTTRACE_ENABLED /* Populate the Select.zSelName[] string that is used to help with ** query planner debugging, to differentiate between multiple Select diff --git a/src/window.c b/src/window.c index 943177146..845d67907 100644 --- a/src/window.c +++ b/src/window.c @@ -392,7 +392,11 @@ static void last_valueStepFunc( if( p ){ sqlite3_value_free(p->pVal); p->pVal = sqlite3_value_dup(apArg[0]); - p->nVal++; + if( p->pVal==0 ){ + sqlite3_result_error_nomem(pCtx); + }else{ + p->nVal++; + } } } static void last_valueInvFunc( @@ -741,6 +745,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 ); p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + assert( p->pSrc || db->mallocFailed ); if( p->pSrc ){ int iTab; ExprList *pList = 0; @@ -753,9 +758,12 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->selFlags &= ~SF_Aggregate; sqlite3SelectPrep(pParse, pSub, 0); } - } - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); + }else{ + sqlite3SelectDelete(db, pSub); + } + if( db->mallocFailed ) rc = SQLITE_NOMEM; } return rc; @@ -1162,7 +1170,7 @@ static void windowReturnOneRow( sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); if( pFunc->xSFunc==nth_valueStepFunc ){ - sqlite3VdbeAddOp3(v, OP_Column, pWin->iEphCsr, pWin->iArgCol+1, tmpReg); + sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+1,tmpReg); }else{ sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); } |