diff options
author | drh <> | 2021-04-20 12:14:12 +0000 |
---|---|---|
committer | drh <> | 2021-04-20 12:14:12 +0000 |
commit | 9da977f1a5563d983087a1d0bd85eba65f35cca2 (patch) | |
tree | 4af710ca2f1e300abd3e4bba4dd337c14ba4c210 /src | |
parent | 8c6cb1bc6f2bb3bd814b6d4c7cd11aad4186c41d (diff) | |
download | sqlite-9da977f1a5563d983087a1d0bd85eba65f35cca2.tar.gz sqlite-9da977f1a5563d983087a1d0bd85eba65f35cca2.zip |
In the sqlite3SelectDup() routine, do not do an incomplete duplication due
to OOM. This in turn requires several new NEVER() and ALWAYS() macros for
unreachable branches.
FossilOrigin-Name: a61c0e6b78bd39f55464fafd257e68effded64995a66e8fa2d686e8c507ebe43
Diffstat (limited to 'src')
-rw-r--r-- | src/alter.c | 2 | ||||
-rw-r--r-- | src/build.c | 4 | ||||
-rw-r--r-- | src/expr.c | 8 | ||||
-rw-r--r-- | src/select.c | 2 | ||||
-rw-r--r-- | src/walker.c | 2 |
5 files changed, 13 insertions, 5 deletions
diff --git a/src/alter.c b/src/alter.c index e9640d238..b68e18914 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1575,7 +1575,7 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ RenameCtx *p = pWalker->u.pRename; SrcList *pSrc = pSelect->pSrc; if( pSelect->selFlags & SF_View ) return WRC_Prune; - if( pSrc==0 ){ + if( NEVER(pSrc==0) ){ assert( pWalker->pParse->db->mallocFailed ); return WRC_Abort; } diff --git a/src/build.c b/src/build.c index ecc08f60f..5506d36de 100644 --- a/src/build.c +++ b/src/build.c @@ -4595,8 +4595,8 @@ SrcList *sqlite3SrcListAppend( void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ int i; SrcItem *pItem; - assert(pList || pParse->db->mallocFailed ); - if( pList ){ + assert( pList || pParse->db->mallocFailed ); + if( ALWAYS(pList) ){ for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){ if( pItem->iCursor>=0 ) continue; pItem->iCursor = pParse->nTab++; diff --git a/src/expr.c b/src/expr.c index d9c8af65c..bd45fbcd1 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1648,6 +1648,14 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ if( p->pWin && db->mallocFailed==0 ) gatherSelectWindows(pNew); #endif pNew->selId = p->selId; + if( db->mallocFailed ){ + /* Any prior OOM might have left the Select object incomplete. + ** Delete the whole thing rather than allow an incomplete Select + ** to be used by the code generator. */ + pNew->pNext = 0; + sqlite3SelectDelete(db, pNew); + break; + } *pp = pNew; pp = &pNew->pPrior; pNext = pNew; diff --git a/src/select.c b/src/select.c index 92c2ecf8f..6a773202e 100644 --- a/src/select.c +++ b/src/select.c @@ -4207,7 +4207,7 @@ static int flattenSubquery( p->pPrior = pPrior; }else{ pNew->selId = ++pParse->nSelect; - if( aCsrMap && db->mallocFailed==0 ){ + if( aCsrMap && ALWAYS(db->mallocFailed==0) ){ renumberCursors(pParse, pNew, iFrom, aCsrMap); } pNew->pPrior = pPrior; diff --git a/src/walker.c b/src/walker.c index 28c80fa79..e0acd5de2 100644 --- a/src/walker.c +++ b/src/walker.c @@ -164,7 +164,7 @@ int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ SrcItem *pItem; pSrc = p->pSrc; - if( pSrc ){ + if( ALWAYS(pSrc) ){ for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){ return WRC_Abort; |