From: drh <> Date: Mon, 19 Apr 2021 18:03:52 +0000 (+0000) Subject: Ensure that a WITHOUT ROWID table does not have the .iPKey field set, even if X-Git-Tag: version-3.36.0~179 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1bb89e9cc88bd9cb18b9d970f41ec28f47913a53;p=thirdparty%2Fsqlite.git Ensure that a WITHOUT ROWID table does not have the .iPKey field set, even if an OOM error occurs while parsing a schema in PRAGMA writable_schema=ON mode. Add extra assert() statements to triple-check that this never happens. dbsqlfuzz 803bb1f63d6f3bd6c14db568494d6e96be8f1ec9. FossilOrigin-Name: 41228350a620a7de1ee748a4e19a96749c4d39418853fe8b68c43cf401dbd7cd --- diff --git a/manifest b/manifest index bdf1af9998..a8e05ccf8d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sfts5\stest\sfunctions\sfts5_expr(),\sfts5_expr_tcl(),\sfts5_isalnum()\sand\sfts5_fold()\sfrom\srelease\sbuilds. -D 2021-04-19T16:45:09.148 +C Ensure\sthat\sa\sWITHOUT\sROWID\stable\sdoes\snot\shave\sthe\s.iPKey\sfield\sset,\seven\sif\nan\sOOM\serror\soccurs\swhile\sparsing\sa\sschema\sin\sPRAGMA\swritable_schema=ON\smode.\nAdd\sextra\sassert()\sstatements\sto\striple-check\sthat\sthis\snever\shappens.\ndbsqlfuzz\s803bb1f63d6f3bd6c14db568494d6e96be8f1ec9. +D 2021-04-19T18:03:52.285 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -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 9f15ff3e074d3989cc1396f575118eb4c28fb677d33f54393ec263799c94b5bd +F src/build.c 1cf8ab071ebab0ee8e26eae02b47b4316f69d8b33cc85031fbb356e4b2dbb624 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 2a322b9a3d75771fb4d99e0702851f4f68dda982507a0f798eefb0712969a410 @@ -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 d564d8882ef18b55ebf93e838426b485281c7ebe3a9b321a2f984ed0f229cc25 -R 864bb68049ae279060a9cc19673f4524 -U dan -Z 3936923389936689750015fb37ea53e3 +P c68a6c6c898d2acd1f7032ff98f8f3f99eb0b37ffbc6ee88d0dd7badf55a0e0a +R dc70ab0f44ebdf675caf06b341f7b818 +U drh +Z 1cbf32554360abc3c11df2874bfd353f diff --git a/manifest.uuid b/manifest.uuid index 20ba36c564..830ff59177 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c68a6c6c898d2acd1f7032ff98f8f3f99eb0b37ffbc6ee88d0dd7badf55a0e0a \ No newline at end of file +41228350a620a7de1ee748a4e19a96749c4d39418853fe8b68c43cf401dbd7cd \ No newline at end of file diff --git a/src/build.c b/src/build.c index a6a6edb9b8..ecc08f60f7 100644 --- a/src/build.c +++ b/src/build.c @@ -461,6 +461,8 @@ Table *sqlite3LocateTable( }else{ sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); } + }else{ + assert( HasRowid(p) || p->iPKey<0 ); } return p; @@ -2179,7 +2181,10 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zName); pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); - if( pList==0 ) return; + if( pList==0 ){ + pTab->tabFlags &= ~TF_WithoutRowid; + return; + } if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); } @@ -2642,6 +2647,7 @@ void sqlite3EndTable( Table *pOld; Schema *pSchema = p->pSchema; assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( HasRowid(p) || p->iPKey<0 ); pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, p); if( pOld ){ assert( p==pOld ); /* Malloc must have failed inside HashInsert() */