mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Have fts5 close any open blob-handle when a new savepoint is opened. This
ensures that fts5 does not prevent DROP TABLE statements (which always open a savepoint) from succeeding. FossilOrigin-Name: a921ada89050ce1d162fd1b0056939573635e2cec7ac0c2a99ae924b3ae593f7
This commit is contained in:
@ -446,9 +446,9 @@ int sqlite3Fts5IndexBeginWrite(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** Flush any data stored in the in-memory hash tables to the database.
|
** Flush any data stored in the in-memory hash tables to the database.
|
||||||
** If the bCommit flag is true, also close any open blob handles.
|
** Also close any open blob handles.
|
||||||
*/
|
*/
|
||||||
int sqlite3Fts5IndexSync(Fts5Index *p, int bCommit);
|
int sqlite3Fts5IndexSync(Fts5Index *p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Discard any data stored in the in-memory hash tables. Do not write it
|
** Discard any data stored in the in-memory hash tables. Do not write it
|
||||||
@ -618,7 +618,7 @@ int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol);
|
|||||||
int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnAvg);
|
int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnAvg);
|
||||||
int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow);
|
int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow);
|
||||||
|
|
||||||
int sqlite3Fts5StorageSync(Fts5Storage *p, int bCommit);
|
int sqlite3Fts5StorageSync(Fts5Storage *p);
|
||||||
int sqlite3Fts5StorageRollback(Fts5Storage *p);
|
int sqlite3Fts5StorageRollback(Fts5Storage *p);
|
||||||
|
|
||||||
int sqlite3Fts5StorageConfigValue(
|
int sqlite3Fts5StorageConfigValue(
|
||||||
|
@ -628,7 +628,6 @@ static void fts5CloseReader(Fts5Index *p){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Retrieve a record from the %_data table.
|
** Retrieve a record from the %_data table.
|
||||||
**
|
**
|
||||||
@ -5131,10 +5130,10 @@ int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){
|
|||||||
/*
|
/*
|
||||||
** Commit data to disk.
|
** Commit data to disk.
|
||||||
*/
|
*/
|
||||||
int sqlite3Fts5IndexSync(Fts5Index *p, int bCommit){
|
int sqlite3Fts5IndexSync(Fts5Index *p){
|
||||||
assert( p->rc==SQLITE_OK );
|
assert( p->rc==SQLITE_OK );
|
||||||
fts5IndexFlush(p);
|
fts5IndexFlush(p);
|
||||||
if( bCommit ) fts5CloseReader(p);
|
fts5CloseReader(p);
|
||||||
return fts5IndexReturn(p);
|
return fts5IndexReturn(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1579,7 +1579,7 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){
|
|||||||
fts5CheckTransactionState(pTab, FTS5_SYNC, 0);
|
fts5CheckTransactionState(pTab, FTS5_SYNC, 0);
|
||||||
pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg;
|
pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg;
|
||||||
fts5TripCursors(pTab);
|
fts5TripCursors(pTab);
|
||||||
rc = sqlite3Fts5StorageSync(pTab->pStorage, 1);
|
rc = sqlite3Fts5StorageSync(pTab->pStorage);
|
||||||
pTab->pConfig->pzErrmsg = 0;
|
pTab->pConfig->pzErrmsg = 0;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -2390,7 +2390,7 @@ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){
|
|||||||
UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */
|
UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */
|
||||||
fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint);
|
fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint);
|
||||||
fts5TripCursors(pTab);
|
fts5TripCursors(pTab);
|
||||||
return sqlite3Fts5StorageSync(pTab->pStorage, 0);
|
return sqlite3Fts5StorageSync(pTab->pStorage);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2403,7 +2403,7 @@ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){
|
|||||||
UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */
|
UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */
|
||||||
fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint);
|
fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint);
|
||||||
fts5TripCursors(pTab);
|
fts5TripCursors(pTab);
|
||||||
return sqlite3Fts5StorageSync(pTab->pStorage, 0);
|
return sqlite3Fts5StorageSync(pTab->pStorage);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -218,7 +218,7 @@ static void fts5StorageRenameOne(
|
|||||||
|
|
||||||
int sqlite3Fts5StorageRename(Fts5Storage *pStorage, const char *zName){
|
int sqlite3Fts5StorageRename(Fts5Storage *pStorage, const char *zName){
|
||||||
Fts5Config *pConfig = pStorage->pConfig;
|
Fts5Config *pConfig = pStorage->pConfig;
|
||||||
int rc = sqlite3Fts5StorageSync(pStorage, 1);
|
int rc = sqlite3Fts5StorageSync(pStorage);
|
||||||
|
|
||||||
fts5StorageRenameOne(pConfig, &rc, "data", zName);
|
fts5StorageRenameOne(pConfig, &rc, "data", zName);
|
||||||
fts5StorageRenameOne(pConfig, &rc, "idx", zName);
|
fts5StorageRenameOne(pConfig, &rc, "idx", zName);
|
||||||
@ -1081,15 +1081,15 @@ int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){
|
|||||||
/*
|
/*
|
||||||
** Flush any data currently held in-memory to disk.
|
** Flush any data currently held in-memory to disk.
|
||||||
*/
|
*/
|
||||||
int sqlite3Fts5StorageSync(Fts5Storage *p, int bCommit){
|
int sqlite3Fts5StorageSync(Fts5Storage *p){
|
||||||
int rc = SQLITE_OK;
|
int rc = SQLITE_OK;
|
||||||
i64 iLastRowid = sqlite3_last_insert_rowid(p->pConfig->db);
|
i64 iLastRowid = sqlite3_last_insert_rowid(p->pConfig->db);
|
||||||
if( p->bTotalsValid ){
|
if( p->bTotalsValid ){
|
||||||
rc = fts5StorageSaveTotals(p);
|
rc = fts5StorageSaveTotals(p);
|
||||||
if( bCommit ) p->bTotalsValid = 0;
|
p->bTotalsValid = 0;
|
||||||
}
|
}
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
rc = sqlite3Fts5IndexSync(p->pIndex, bCommit);
|
rc = sqlite3Fts5IndexSync(p->pIndex);
|
||||||
}
|
}
|
||||||
sqlite3_set_last_insert_rowid(p->pConfig->db, iLastRowid);
|
sqlite3_set_last_insert_rowid(p->pConfig->db, iLastRowid);
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -561,6 +561,22 @@ do_test 20.1 {
|
|||||||
execsql { SELECT rowid FROM tmp WHERE tmp MATCH 'y' }
|
execsql { SELECT rowid FROM tmp WHERE tmp MATCH 'y' }
|
||||||
} $::ids
|
} $::ids
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Test that a DROP TABLE may be executed within a transaction that
|
||||||
|
# writes to an FTS5 table.
|
||||||
|
#
|
||||||
|
do_execsql_test 21.0 {
|
||||||
|
CREATE TEMP TABLE t8(a, b);
|
||||||
|
CREATE VIRTUAL TABLE ft USING fts5(x, detail=%DETAIL%);
|
||||||
|
}
|
||||||
|
|
||||||
|
do_execsql_test 21.1 {
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO ft VALUES('a b c');
|
||||||
|
DROP TABLE t8;
|
||||||
|
COMMIT;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
22
manifest
22
manifest
@ -1,5 +1,5 @@
|
|||||||
C Make\ssure\sthe\sRTree\ssqlite3_blob\shandle\sis\sreset\sprior\sto\srenaming\sthe\stable.
|
C Have\sfts5\sclose\sany\sopen\sblob-handle\swhen\sa\snew\ssavepoint\sis\sopened.\sThis\nensures\sthat\sfts5\sdoes\snot\sprevent\sDROP\sTABLE\sstatements\s(which\salways\sopen\sa\nsavepoint)\sfrom\ssucceeding.
|
||||||
D 2017-04-08T01:09:14.963
|
D 2017-04-08T09:12:20.282
|
||||||
F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
|
F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc a4c0613a18663bda56d8cf76079ab6590a7c3602e54befb4bbdef76bcaa38b6a
|
F Makefile.msc a4c0613a18663bda56d8cf76079ab6590a7c3602e54befb4bbdef76bcaa38b6a
|
||||||
@ -99,15 +99,15 @@ F ext/fts3/unicode/mkunicode.tcl ab0543a3b2399092ea2dd75df1bef333405b0d7f6b8c495
|
|||||||
F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
|
F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
|
||||||
F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0
|
F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0
|
||||||
F ext/fts5/fts5.h 62f3e33ceeb9a428db139f9c012186b371da1cc7
|
F ext/fts5/fts5.h 62f3e33ceeb9a428db139f9c012186b371da1cc7
|
||||||
F ext/fts5/fts5Int.h c629b24d2b92b99596f3b8e82289fddca06df6e1
|
F ext/fts5/fts5Int.h 88c1a9a01cd5cd7b9a3c95699d1f61cdb277b2fa087a07d3fc989b49970437d9
|
||||||
F ext/fts5/fts5_aux.c 67acf8d51723cf28ffc3828210ba662df4b8d267
|
F ext/fts5/fts5_aux.c 67acf8d51723cf28ffc3828210ba662df4b8d267
|
||||||
F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd
|
F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd
|
||||||
F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857
|
F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857
|
||||||
F ext/fts5/fts5_expr.c c6ecc2280162a3714d15dce2a8f2299f748b627c
|
F ext/fts5/fts5_expr.c c6ecc2280162a3714d15dce2a8f2299f748b627c
|
||||||
F ext/fts5/fts5_hash.c 880998e596b60f078348d48732ca4ad9a90caad2
|
F ext/fts5/fts5_hash.c 880998e596b60f078348d48732ca4ad9a90caad2
|
||||||
F ext/fts5/fts5_index.c f67032a9a529ba52a545e6e3ab970764199c05d4
|
F ext/fts5/fts5_index.c a3a9ae1c6f8a3652eb45dd732a71cdc92b48df047af134da38cd0c425649e042
|
||||||
F ext/fts5/fts5_main.c f85281445dcf8be32d18841c93a6f90fe27dbfe2
|
F ext/fts5/fts5_main.c 24cafdc44c06b9665d73c34b75966f6223e9299cc9fd10184c6bf888e3ff563f
|
||||||
F ext/fts5/fts5_storage.c 8f0e65cb33bde8f449e1c9b4be4600d18b4da6e9
|
F ext/fts5/fts5_storage.c 7750986004f3f0c94619a85ecb5dd6cbef53e5e3853488e8a906c269d4d11db6
|
||||||
F ext/fts5/fts5_tcl.c 4a901f00c8553740dba63511603f5527d741c26a
|
F ext/fts5/fts5_tcl.c 4a901f00c8553740dba63511603f5527d741c26a
|
||||||
F ext/fts5/fts5_test_mi.c 783b86697ebf773c18fc109992426c0173a055bc
|
F ext/fts5/fts5_test_mi.c 783b86697ebf773c18fc109992426c0173a055bc
|
||||||
F ext/fts5/fts5_test_tok.c db08af63673c3a7d39f053b36fd6e065017706be
|
F ext/fts5/fts5_test_tok.c db08af63673c3a7d39f053b36fd6e065017706be
|
||||||
@ -118,7 +118,7 @@ F ext/fts5/fts5_vocab.c e44fefa7f0c1db252998af071daf06a7147e17e7
|
|||||||
F ext/fts5/fts5parse.y e51b375403421b8b37428a89b095d00597129aae
|
F ext/fts5/fts5parse.y e51b375403421b8b37428a89b095d00597129aae
|
||||||
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
|
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
|
||||||
F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841
|
F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841
|
||||||
F ext/fts5/test/fts5aa.test bd2d88182b9f7f30d300044048ad14683306b745
|
F ext/fts5/test/fts5aa.test b3cb080db4851580705c5e261c9d4308edf030d5cbbc24b5d6668403b73f023b
|
||||||
F ext/fts5/test/fts5ab.test 30325a89453280160106be411bba3acf138e6d1b
|
F ext/fts5/test/fts5ab.test 30325a89453280160106be411bba3acf138e6d1b
|
||||||
F ext/fts5/test/fts5ac.test 55cad4275a1f5acabfe14d8442a8046b47e49e5f
|
F ext/fts5/test/fts5ac.test 55cad4275a1f5acabfe14d8442a8046b47e49e5f
|
||||||
F ext/fts5/test/fts5ad.test 36995f0586f30f5602074e012b9224c71ec5171c
|
F ext/fts5/test/fts5ad.test 36995f0586f30f5602074e012b9224c71ec5171c
|
||||||
@ -1570,7 +1570,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P a6ce57ee3c7f3527554a75cc1dd5ebcd33c944d4dca07b134d103596a2ae5b32
|
P 1cdae2db3c54970a1811e597065724578408c84d49d75b8fe25d56281ddc2e94
|
||||||
R 3c395c133d10b004a02ebb26bdf0b765
|
R 70601a411a243bcad4990e39c82ee1af
|
||||||
U drh
|
U dan
|
||||||
Z 01dd2f30379ae3acc62144bb2fdec0d4
|
Z dfa6c73936264c9fbb94dc8123013fe7
|
||||||
|
@ -1 +1 @@
|
|||||||
1cdae2db3c54970a1811e597065724578408c84d49d75b8fe25d56281ddc2e94
|
a921ada89050ce1d162fd1b0056939573635e2cec7ac0c2a99ae924b3ae593f7
|
Reference in New Issue
Block a user