aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <dan@noemail.net>2018-06-15 19:01:35 +0000
committerdan <dan@noemail.net>2018-06-15 19:01:35 +0000
commit6fde1799f88a1dd0de54f57bf9ba67af400a6cfc (patch)
treeae6cdcde1c001a36a9df4e201fcac6f476a066ef /src
parente0a5e20fa8a08b32dee0539539a7c2164cda5944 (diff)
downloadsqlite-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.y6
-rw-r--r--src/window.c16
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);
}