]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix corner cases in the WITHOUT ROWID virtual table logic.
authordrh <drh@noemail.net>
Thu, 2 Jun 2016 16:22:53 +0000 (16:22 +0000)
committerdrh <drh@noemail.net>
Thu, 2 Jun 2016 16:22:53 +0000 (16:22 +0000)
FossilOrigin-Name: a393bbb972660c1ffcdda923d0f3564ecfcd2f0a

manifest
manifest.uuid
src/build.c
src/vtab.c

index d3f3735698c9f4e07f79648f50f3cbccc1cadd72..3c0483e6d0372736f41c2ec5d5e40d4fd00310be 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C An\sexperimental\sbranch\swith\scode\sthat\sallows\svirtual\stables\sto\sbe\sdeclared\nas\sWITHOUT\sROWID\stables.\sThis\smight\sbe\suseful\sfor\svirtual\stables\sthat\smodel\nexternal\sdata\ssources\sthat\sdo\snot\shave\sa\sconvenient\sway\sof\scomputing\sa\sunique\nrowid.\s\sThe\scurrent\scheck-in\salmost\sworks,\sbut\sthere\sare\sstill\sserious\sissues.
-D 2016-05-31T21:18:15.834
+C Fix\scorner\scases\sin\sthe\sWITHOUT\sROWID\svirtual\stable\slogic.
+D 2016-06-02T16:22:53.508
 F Makefile.in f59e0763ff448719fc1bd25513882b0567286317
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 306d73e854b1a92ea06e5d1e637faa5c44de53c7
@@ -328,7 +328,7 @@ F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73
 F src/btree.c 2128172fc1c420a6fa6878827fa595407795069a
 F src/btree.h 1342a9b2cc2089e3534d3ef00204786783f6aea6
 F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5
-F src/build.c 7acc29d0944bd9995864148286e9daeb0cbce742
+F src/build.c 555b459d1f25fba6c56266e60bbbdc93bdf5f66a
 F src/callback.c 2e76147783386374bf01b227f752c81ec872d730
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 999a828425b35b8092a8cde25690e71c20906344
@@ -456,7 +456,7 @@ F src/vdbeblob.c c9f2f494b911c6fa34efd9803f0a10807da80f77
 F src/vdbemem.c 5cfef60e60e19cab6275d1b975bf4c791d575beb
 F src/vdbesort.c 91fda3909326860382b0ca8aa251e609c6a9d62c
 F src/vdbetrace.c f75c5455d8cf389ef86a8bfdfd3177e0e3692484
-F src/vtab.c 694e444986746b7e3bb9bd3d74e3284dd7209990
+F src/vtab.c a80b4e40ed8687daa3303e970d938b1f613a3eeb
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c 02eeecc265f6ffd0597378f5d8ae9070b62a406a
 F src/wal.h 2f7c831cf3b071fa548bf2d5cac640846a7ff19c
@@ -1497,10 +1497,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 28ebeadd6a4c9ff2ce9fc86a0f0fe2f6cf94d3ac
-R f4a0fccb57a153a0ab74e7b69ae020b2
-T *branch * without-rowid-vtab
-T *sym-without-rowid-vtab *
-T -sym-trunk *
+P 49638f180e26477974cacc69b79e0be0a5e18b29
+R cf24c2970498f36ff11e1ac85a33493a
 U drh
-Z 938f365203a268d591e6d60732902516
+Z 5a84619c2e2d24987b3ea5aba48efb6c
index 06965e9c5661b2eab311ec4c01f3411d6d6a161a..154b8a60677340f72b3600e69666abbce7ccb49b 100644 (file)
@@ -1 +1 @@
-49638f180e26477974cacc69b79e0be0a5e18b29
\ No newline at end of file
+a393bbb972660c1ffcdda923d0f3564ecfcd2f0a
\ No newline at end of file
index 5afc32bd5e2496de2345976e854ebf130bc621d9..092a9973b3190fd2707c37c782fb0d1c13ded7e5 100644 (file)
@@ -607,9 +607,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
     pNext = pIndex->pNext;
     assert( pIndex->pSchema==pTable->pSchema
          || (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) );
-    if( pIndex->idxType==SQLITE_IDXTYPE_APPDEF
-     && (!db || db->pnBytesFreed==0)
-    ){
+    if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){
       char *zName = pIndex->zName; 
       TESTONLY ( Index *pOld = ) sqlite3HashInsert(
          &pIndex->pSchema->idxHash, zName, 0
@@ -1718,6 +1716,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
     assert( pParse->pNewTable==pTab );
     sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0,
                        SQLITE_IDXTYPE_PRIMARYKEY);
+    if( db->mallocFailed ) return;
     pPk = sqlite3PrimaryKeyIndex(pTab);
     pTab->iPKey = -1;
   }else{
@@ -3278,6 +3277,7 @@ void sqlite3CreateIndex(
             pIdx->onError = pIndex->onError;
           }
         }
+        if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType;
         goto exit_create_index;
       }
     }
@@ -3287,7 +3287,7 @@ void sqlite3CreateIndex(
   ** in-memory database structures. 
   */
   assert( pParse->nErr==0 );
-  if( db->init.busy ){
+  if( db->init.busy && !IN_DECLARE_VTAB ){
     Index *p;
     assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
     p = sqlite3HashInsert(&pIndex->pSchema->idxHash, 
index 01ea9750f5520e403dbe5c8294194db0ea04d337..b4268536a0a9b0c67023236e91a5455f070ec24f 100644 (file)
@@ -755,13 +755,20 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
     ){
       if( !pTab->aCol ){
         Table *pNew = pParse->pNewTable;
+        Index *pIdx;
         pTab->aCol = pNew->aCol;
         pTab->nCol = pNew->nCol;
         pTab->tabFlags |= pNew->tabFlags & TF_WithoutRowid;
-        pTab->pIndex = pNew->pIndex;
         pNew->nCol = 0;
         pNew->aCol = 0;
-        pNew->pIndex = 0;
+        assert( pTab->pIndex==0 );
+        pIdx = pNew->pIndex;
+        if( pIdx ){
+          assert( pIdx->pNext==0 );
+          pTab->pIndex = pIdx;
+          pNew->pIndex = 0;
+          pIdx->pTable = pTab;
+        }
       }
       pCtx->bDeclared = 1;
     }else{