]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure that a WITHOUT ROWID table does not have the .iPKey field set, even if
authordrh <>
Mon, 19 Apr 2021 18:03:52 +0000 (18:03 +0000)
committerdrh <>
Mon, 19 Apr 2021 18:03:52 +0000 (18:03 +0000)
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

manifest
manifest.uuid
src/build.c

index bdf1af99982e537581aedaf14c1d28b2e0527336..a8e05ccf8da28c2426a4fe190c3fd04ccb8bf521 100644 (file)
--- 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
index 20ba36c56493f36abe476c56834c253f37385936..830ff5917719f3c918f594768e216342cbc46fac 100644 (file)
@@ -1 +1 @@
-c68a6c6c898d2acd1f7032ff98f8f3f99eb0b37ffbc6ee88d0dd7badf55a0e0a
\ No newline at end of file
+41228350a620a7de1ee748a4e19a96749c4d39418853fe8b68c43cf401dbd7cd
\ No newline at end of file
index a6a6edb9b8fbc556f50edbadd4bb6e39a3efac04..ecc08f60f7d80268034280c6867a7e169f1e62f4 100644 (file)
@@ -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() */