From: drh Date: Thu, 2 Jun 2016 16:22:53 +0000 (+0000) Subject: Fix corner cases in the WITHOUT ROWID virtual table logic. X-Git-Tag: version-3.14.0~115^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=273bfe9f204415a222ece75889dca8c1c17fb8af;p=thirdparty%2Fsqlite.git Fix corner cases in the WITHOUT ROWID virtual table logic. FossilOrigin-Name: a393bbb972660c1ffcdda923d0f3564ecfcd2f0a --- diff --git a/manifest b/manifest index d3f3735698..3c0483e6d0 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 06965e9c56..154b8a6067 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49638f180e26477974cacc69b79e0be0a5e18b29 \ No newline at end of file +a393bbb972660c1ffcdda923d0f3564ecfcd2f0a \ No newline at end of file diff --git a/src/build.c b/src/build.c index 5afc32bd5e..092a9973b3 100644 --- a/src/build.c +++ b/src/build.c @@ -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, diff --git a/src/vtab.c b/src/vtab.c index 01ea9750f5..b4268536a0 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -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{