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 | |
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
-rw-r--r-- | manifest | 20 | ||||
-rw-r--r-- | manifest.uuid | 2 | ||||
-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 |
7 files changed, 24 insertions, 16 deletions
@@ -1,5 +1,5 @@ -C Improvement\sto\scheck-in\s[d564d8882ef18b55]\sto\sdetect\sthe\sOOM\sfault\seven\nif\sit\soccurs\sdeep\sdown\sinside\sthe\sduplicated\sexpression. -D 2021-04-19T20:36:13.043 +C In\sthe\ssqlite3SelectDup()\sroutine,\sdo\snot\sdo\san\sincomplete\sduplication\sdue\nto\sOOM.\s\sThis\sin\sturn\srequires\sseveral\snew\sNEVER()\sand\sALWAYS()\smacros\sfor\nunreachable\sbranches. +D 2021-04-20T12:14:12.835 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -476,7 +476,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 9dde656dfd53325dae24973fa7d6597ef64dcfd1bc3c3baefcf7b88c5af0d0a8 +F src/alter.c e7caf3eefce268250dc1d10322eec637319de486aa1bae7f48c606259455537e F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c 8783d67d2c61371dfae46e4043158d44b73c14154d62560cd4cb1e0dfc6337a1 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -486,7 +486,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 15cfe91aa3b3b91d3dc20faaa7c64b627ca9794b22be8b184054cb6b947505fc F src/btree.h 096cc53baa58be22b02c896d1cf933c38cfc6d65f9253c1367ece8cc88a24de5 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 1cf8ab071ebab0ee8e26eae02b47b4316f69d8b33cc85031fbb356e4b2dbb624 +F src/build.c 45889a1ac425eb7d60113ce65a519c55c5d5d01f2a9e978ab1467f8653bb57eb F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 2a322b9a3d75771fb4d99e0702851f4f68dda982507a0f798eefb0712969a410 @@ -494,7 +494,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 73f57a9a183532c344a3135cf8f2a5589376e39183e0b5f562d6b61b2af0f4d8 -F src/expr.c f1e3474d693e7dbc75726d7c23a6bb55e7205af8059956c5b3005745eb62990a +F src/expr.c 2b79c16f167b7ec74dfbd325b6f9cd9ff026908017f6804a5af6ba451c13b5b1 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c 88fd711754a7241cb9f8eb1391370fd0c0cea756b3358efa274c5d1efd59af93 @@ -542,7 +542,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e299d53c4077fc32bc63741b5b27fdf8a1328cb8e812b9fafb55441c4c73a80a F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 2c4f89257327581f918863d49aded6087552926de799c0d0ebea70200c478cb2 +F src/select.c bc08a79364ad2056b1b3b83142b1cc4eacabf850603166f3a72581d56c320d9c F src/shell.c.in 9320b476fde0f7c46700e5695b69b435f1e46843a1513cdd187ac426cdbee016 F src/sqlite.h.in 18ec33e32001721fd4e9c4705a24a85dff04956ac2c0a21775058884ba845b09 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -628,7 +628,7 @@ F src/vtab.c 032a0165c147fda16927e6a3230e90c068d4af93f887ce94e26f678fe48e5e4c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 69e770e96fd56cc21608992bf2c6f1f3dc5cf2572d0495c6a643b06c3a679f14 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a -F src/walker.c 52fb58ff39452ef37e58bfa429a9ecb17e8ed3e9dda05912c0d869f80d3f4600 +F src/walker.c 6e540867a30d81e00205995fa2dc0e3d25365a7402251c9fd5d19aa4ff5e60b6 F src/where.c 1c305bab0996a63219a6cb3d4718587f3a5dc5608120c4448985aa2bef88b7f5 F src/whereInt.h 446e5e8018f83358ef917cf32d8e6a86dc8430113d0b17e720f1839d3faa44c4 F src/wherecode.c 0e42f4ad53962e90349462520891734ed3217c7852f41c69ffac7a9eeaf31451 @@ -1913,7 +1913,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bef2238de9550de84d4cd1c970a542b43db288d73d09a3c3ced7f98bb3188fd3 -R 9cdbf20427098ae8915fe3c4c7011236 +P 3e863cd09355abd80c1053d6d4dabb55841f806e3c418f923d67d36bf8313cb0 +R a2f252b041b1ce9ea09cc93be49d1068 U drh -Z 0ff14260d9ccebe4f6d06776ae79e9ce +Z e9f9190f218ee2534b1576005539f8b4 diff --git a/manifest.uuid b/manifest.uuid index f214941ac..df4ac25b6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e863cd09355abd80c1053d6d4dabb55841f806e3c418f923d67d36bf8313cb0
\ No newline at end of file +a61c0e6b78bd39f55464fafd257e68effded64995a66e8fa2d686e8c507ebe43
\ No newline at end of file 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; |