Do not abort running queries due to a CREATE INDEX statement. Allow them
to run to completion before being reprepared. Fix for ticket [c694113e50321afdf9]. FossilOrigin-Name: 2bd593332da0aade467e7a4ee89e966aa6302f37540a2c5e23671f98a6cb599c
This commit is contained in:
parent
5a193dd8e6
commit
ba968dbfe7
29
manifest
29
manifest
@ -1,5 +1,5 @@
|
||||
C Add\smissing\sSQLITE_OMIT_WINDOWFUNC\scheck\sto\sthe\sjson1\sextension.
|
||||
D 2018-07-24T13:57:44.003
|
||||
C Do\snot\sabort\srunning\squeries\sdue\sto\sa\sCREATE\sINDEX\sstatement.\s\sAllow\sthem\nto\srun\sto\scompletion\sbefore\sbeing\sreprepared.\s\sFix\sfor\sticket\n[c694113e50321afdf9].
|
||||
D 2018-07-24T22:02:12.832
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
|
||||
@ -434,14 +434,14 @@ F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
||||
F src/alter.c 6beb476095a4cfeb95ebedb2e5e17894d1687b24fddd5b8761a4de120e0392c6
|
||||
F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
|
||||
F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
|
||||
F src/auth.c a38f3c63c974787ecf75e3213f8cac6568b9a7af7591fb0372ec0517dd16dca8
|
||||
F src/auth.c 8272da9ff761bf84f0357298ccc6e5924e3f7fac143c6587f06aa72b202445a2
|
||||
F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab
|
||||
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
|
||||
F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
||||
F src/btree.c 3f5e1a03db871e627bf5da21092bf7434ecfc5c5980bbd7d45eba13341340173
|
||||
F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2
|
||||
F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
|
||||
F src/build.c d8f6ac1e9e484eb3f3921a8336d3dc6c87273d9db8729702162ef045997a1463
|
||||
F src/build.c ae6edcd6e14a3dcaf9e1f63910cd4d99555338508d7a60e4660147f8a77c023b
|
||||
F src/callback.c 36caff1e7eb7deb58572d59c41cee8f064a11d00297616995c5050ea0cfc1288
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/ctime.c b157b01081f92442f8b0218ddb93ddce8ebddad36dbddeecfdd771561dd4f387
|
||||
@ -461,7 +461,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
||||
F src/insert.c 8613af9c5ba1503bc68f4e9432c6c024e0fdafdc791575c50f380f73ec91189f
|
||||
F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e
|
||||
F src/loadext.c 6aae5739198d96c51ae6eb97c4a5b1744c22ed7a5a565a5399a717780d48a36b
|
||||
F src/main.c 9c8ef68bd3779d493d632946b3a65156b2e636ad2c7a1b7cd1450e87dc0c6a7d
|
||||
F src/main.c 73a3db1c9788de97a826ac794bf98a8a811c7594e93bef4f0c085b3f9ddeb76d
|
||||
F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18
|
||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
|
||||
@ -502,7 +502,7 @@ F src/shell.c.in f6ebd05c461805a7c708333cd645e74e0a93560d2118f5adb73a75d8c9cf6b0
|
||||
F src/sqlite.h.in 37615597574060538595ea0b8ceee2bdcdc5a8757455a703733847654d5957d0
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h 9887b27e69c01e79c2cbe74ef73bf01af5b5703d6a7f0a4371e386d7249cb1c7
|
||||
F src/sqliteInt.h c2ceebe60d1d2e11674b90c8b55fdffd91386ce8d7ae38613fbcc61659b8fcac
|
||||
F src/sqliteInt.h 427471586351daefbc81155384a702b2173801051fe345bc25a09558b919db77
|
||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||
@ -568,16 +568,16 @@ F src/upsert.c 47edd408cc73f8d3c00a140550d1ad180b407c146285947969dd09874802bf88
|
||||
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
|
||||
F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
|
||||
F src/vacuum.c 36e7d21a20c0bf6ef4ef7c399d192b5239410b7c4d3c1070fba4e30810d0b855
|
||||
F src/vdbe.c 9933ec035072c72fc26c5439f6c8a1eef902ce9132916d5a05e8733b0266eb67
|
||||
F src/vdbe.c f5e6c0eab497c34f695a9b40800bbc09cd9488cabbd434048f3cbb3e85aaec38
|
||||
F src/vdbe.h d93abdc8bc9295e0a256e582c19f548c545dc498319d108bbc9dd29de31c48a2
|
||||
F src/vdbeInt.h 6b5cbd338dc9aaad343fb11b455e47463b0474d9f79710f50e647158941146e0
|
||||
F src/vdbeInt.h 2a45270d7f44870ca5452f48cdf3c56387019ae03331c008d670a7d0a3e1ba3f
|
||||
F src/vdbeapi.c af4a3de00d1851bcbc55b85dfbe52849aa2b1e17b4a5a1f3d9c257df7af361ff
|
||||
F src/vdbeaux.c c2d65c763b0811afe409e02e9d0d1f300c6e97892474fc94eec3da71955cd418
|
||||
F src/vdbeaux.c 1265a36260c36eb55afb40d744ffc1a3f11252d5712274c6218efb087204a7e5
|
||||
F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
|
||||
F src/vdbemem.c a699a1d7ccc3f94cdff69ddf35d5f7540dbf52ca44cf040eda3c87520e67858c
|
||||
F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f
|
||||
F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
|
||||
F src/vtab.c 10ea07dec111de6fb0a4fc87a7ffa4c65fdc088a19dbfaf7d6f2b128f2e8eb7b
|
||||
F src/vtab.c 678992ac8ec677a3f9b08126aaf891441083805e3b42574e3654d44538381c14
|
||||
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
||||
F src/wal.c d44a0811afd2155b1157c38b33141d4ac028fda6232485bed664015bb05819ca
|
||||
F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a
|
||||
@ -1387,6 +1387,7 @@ F test/tkt-ba7cbfaedc.test b4c0deccc12aeb55cfdb57935b16b5d67c5a9877
|
||||
F test/tkt-bd484a090c.test 60460bf946f79a79712b71f202eda501ca99b898
|
||||
F test/tkt-bdc6bbbb38.test fc38bb09bdd440e3513a1f5f98fc60a075182d7d
|
||||
F test/tkt-c48d99d690.test ba61977d62ab612fc515b3c488a6fbd6464a2447
|
||||
F test/tkt-c694113d5.test 82c461924ada5c14866c47e85535b0b0923ba16a2e907e370061a5ca77f65d77
|
||||
F test/tkt-cbd054fa6b.test 06ccd57af3c0c7895d0f7dc844f13c51f8258885
|
||||
F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d
|
||||
F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09
|
||||
@ -1750,7 +1751,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 8607b84a5c53d8c9218c90802160a3000f1138b1f188e411a3af46253e0a69cc
|
||||
R 04e27003b3e25ff2b1b306cb41502a3f
|
||||
U mistachkin
|
||||
Z fd864996daa329dbed22fdd8a051a565
|
||||
P fe19f8239dc474db0854a0a8ce5189ac4195c736b496f475a59a185e0879b40c
|
||||
R 83c4c1a5e9b7c188b0be756d9d206b1e
|
||||
U drh
|
||||
Z 595aea1a22de944630d679d3a06354dc
|
||||
|
@ -1 +1 @@
|
||||
fe19f8239dc474db0854a0a8ce5189ac4195c736b496f475a59a185e0879b40c
|
||||
2bd593332da0aade467e7a4ee89e966aa6302f37540a2c5e23671f98a6cb599c
|
@ -78,7 +78,7 @@ int sqlite3_set_authorizer(
|
||||
sqlite3_mutex_enter(db->mutex);
|
||||
db->xAuth = (sqlite3_xauth)xAuth;
|
||||
db->pAuthArg = pArg;
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
sqlite3_mutex_leave(db->mutex);
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
@ -3468,7 +3468,7 @@ void sqlite3CreateIndex(
|
||||
sqlite3ChangeCookie(pParse, iDb);
|
||||
sqlite3VdbeAddParseSchemaOp(v, iDb,
|
||||
sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName));
|
||||
sqlite3VdbeAddOp0(v, OP_Expire);
|
||||
sqlite3VdbeAddOp2(v, OP_Expire, 0, 1);
|
||||
}
|
||||
|
||||
sqlite3VdbeJumpHere(v, pIndex->tnum);
|
||||
|
@ -849,7 +849,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){
|
||||
db->flags &= ~aFlagOp[i].mask;
|
||||
}
|
||||
if( oldFlags!=db->flags ){
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
}
|
||||
if( pRes ){
|
||||
*pRes = (db->flags & aFlagOp[i].mask)!=0;
|
||||
@ -1292,7 +1292,7 @@ void sqlite3RollbackAll(sqlite3 *db, int tripCode){
|
||||
sqlite3EndBenignMalloc();
|
||||
|
||||
if( schemaChange ){
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
sqlite3ResetAllSchemasOfConnection(db);
|
||||
}
|
||||
sqlite3BtreeLeaveAll(db);
|
||||
@ -1747,7 +1747,7 @@ int sqlite3CreateFunc(
|
||||
assert( !db->mallocFailed );
|
||||
return SQLITE_BUSY;
|
||||
}else{
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2522,7 +2522,7 @@ static int createCollation(
|
||||
"unable to delete/modify collation sequence due to active statements");
|
||||
return SQLITE_BUSY;
|
||||
}
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
|
||||
/* If collation sequence pColl was created directly by a call to
|
||||
** sqlite3_create_collation, and not generated by synthCollSeq(),
|
||||
|
@ -4223,7 +4223,7 @@ void sqlite3AlterFunctions(void);
|
||||
void sqlite3AlterRenameTable(Parse*, SrcList*, Token*);
|
||||
int sqlite3GetToken(const unsigned char *, int *);
|
||||
void sqlite3NestedParse(Parse*, const char*, ...);
|
||||
void sqlite3ExpirePreparedStatements(sqlite3*);
|
||||
void sqlite3ExpirePreparedStatements(sqlite3*, int);
|
||||
int sqlite3CodeSubselect(Parse*, Expr *, int, int);
|
||||
void sqlite3SelectPrep(Parse*, Select*, NameContext*);
|
||||
void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p);
|
||||
|
19
src/vdbe.c
19
src/vdbe.c
@ -3102,7 +3102,7 @@ case OP_Savepoint: {
|
||||
}
|
||||
}
|
||||
if( isSchemaChange ){
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
sqlite3ResetAllSchemasOfConnection(db);
|
||||
db->mDbFlags |= DBFLAG_SchemaChange;
|
||||
}
|
||||
@ -3391,7 +3391,7 @@ case OP_SetCookie: {
|
||||
if( pOp->p1==1 ){
|
||||
/* Invalidate all prepared statements whenever the TEMP database
|
||||
** schema is changed. Ticket #1644 */
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
p->expired = 0;
|
||||
}
|
||||
if( rc ) goto abort_due_to_error;
|
||||
@ -3509,7 +3509,7 @@ case OP_OpenWrite:
|
||||
assert( pOp->opcode==OP_OpenRead || pOp->opcode==OP_ReopenIdx
|
||||
|| p->readOnly==0 );
|
||||
|
||||
if( p->expired ){
|
||||
if( p->expired==1 ){
|
||||
rc = SQLITE_ABORT_ROLLBACK;
|
||||
goto abort_due_to_error;
|
||||
}
|
||||
@ -6690,7 +6690,7 @@ case OP_IncrVacuum: { /* jump */
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Opcode: Expire P1 * * * *
|
||||
/* Opcode: Expire P1 P2 * * *
|
||||
**
|
||||
** Cause precompiled statements to expire. When an expired statement
|
||||
** is executed using sqlite3_step() it will either automatically
|
||||
@ -6699,12 +6699,19 @@ case OP_IncrVacuum: { /* jump */
|
||||
**
|
||||
** If P1 is 0, then all SQL statements become expired. If P1 is non-zero,
|
||||
** then only the currently executing statement is expired.
|
||||
**
|
||||
** If P2 is 0, then SQL statements are expired immediately. If P2 is 1,
|
||||
** then running SQL statements are allowed to continue to run to completion.
|
||||
** The P2==1 case occurs when a CREATE INDEX or similar schema change happens
|
||||
** that might help the statement run faster but which does not affect the
|
||||
** correctness of operation.
|
||||
*/
|
||||
case OP_Expire: {
|
||||
assert( pOp->p2==0 || pOp->p2==1 );
|
||||
if( !pOp->p1 ){
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, pOp->p2);
|
||||
}else{
|
||||
p->expired = 1;
|
||||
p->expired = pOp->p2+1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -390,9 +390,9 @@ struct Vdbe {
|
||||
u8 errorAction; /* Recovery action to do in case of an error */
|
||||
u8 minWriteFileFormat; /* Minimum file format for writable database files */
|
||||
u8 prepFlags; /* SQLITE_PREPARE_* flags */
|
||||
bft expired:1; /* True if the VM needs to be recompiled */
|
||||
bft doingRerun:1; /* True if rerunning after an auto-reprepare */
|
||||
bft expired:2; /* 1: recompile VM immediately 2: when convenient */
|
||||
bft explain:2; /* True if EXPLAIN present on SQL command */
|
||||
bft doingRerun:1; /* True if rerunning after an auto-reprepare */
|
||||
bft changeCntOn:1; /* True to update the change-counter */
|
||||
bft runOnlyOnce:1; /* Automatically expire on reset */
|
||||
bft usesStmtJournal:1; /* True if uses a statement journal */
|
||||
|
@ -4659,11 +4659,19 @@ void sqlite3VdbeCountChanges(Vdbe *v){
|
||||
** programs obsolete. Removing user-defined functions or collating
|
||||
** sequences, or changing an authorization function are the types of
|
||||
** things that make prepared statements obsolete.
|
||||
**
|
||||
** If iCode is 1, then expiration is advisory. The statement should
|
||||
** be reprepared before being restarted, but if it is already running
|
||||
** it is allowed to run to completion.
|
||||
**
|
||||
** Internally, this function just sets the Vdbe.expired flag on all
|
||||
** prepared statements. The flag is set to 1 for an immediate expiration
|
||||
** and set to 2 for an advisory expiration.
|
||||
*/
|
||||
void sqlite3ExpirePreparedStatements(sqlite3 *db){
|
||||
void sqlite3ExpirePreparedStatements(sqlite3 *db, int iCode){
|
||||
Vdbe *p;
|
||||
for(p = db->pVdbe; p; p=p->pNext){
|
||||
p->expired = 1;
|
||||
p->expired = iCode+1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -262,7 +262,7 @@ void sqlite3VtabUnlockList(sqlite3 *db){
|
||||
assert( sqlite3_mutex_held(db->mutex) );
|
||||
|
||||
if( p ){
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
sqlite3ExpirePreparedStatements(db, 0);
|
||||
do {
|
||||
VTable *pNext = p->pNext;
|
||||
sqlite3VtabUnlock(p);
|
||||
|
36
test/tkt-c694113d5.test
Normal file
36
test/tkt-c694113d5.test
Normal file
@ -0,0 +1,36 @@
|
||||
# 2018-07-24
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#***********************************************************************
|
||||
# This file implements regression tests for SQLite library. Specifically,
|
||||
# it tests that ticket [c694113e50321afdf952e2d1235b08ba663f8399]:
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
do_test tkt-c694113d5.100 {
|
||||
sqlite3 db :memory:
|
||||
db eval {
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY);
|
||||
CREATE TABLE t2(d INTEGER PRIMARY KEY,e,f);
|
||||
INSERT INTO t1(a) VALUES(1),(2),(3),(4);
|
||||
}
|
||||
set answer {}
|
||||
db eval {SELECT a FROM t1 WHERE NOT EXISTS(SELECT 1 FROM t2 WHERE d=a)} {
|
||||
if {$a==3} {
|
||||
lappend answer "CREATE INDEX"
|
||||
db eval {CREATE INDEX t2e ON t2(e);}
|
||||
}
|
||||
lappend answer "a=$a"
|
||||
}
|
||||
set answer
|
||||
} {a=1 a=2 {CREATE INDEX} a=3 a=4}
|
||||
|
||||
finish_test
|
Loading…
x
Reference in New Issue
Block a user