When a stale schema-cookie is seen, expire only the one statement that
encountered the bad cookie, not every statement on the database connection. Ticket [b72787b1a7cea1f] FossilOrigin-Name: 1bca0a7e198391202fd2bc1650c0a62028a9aaa5
This commit is contained in:
Regular → Executable
@@ -1,5 +1,8 @@
|
||||
C Fix\sa\sproblem\swith\s"EXPLAIN\sQUERY\sPLAN\sSELECT\scount(*)\sFROM\stbl".
|
||||
D 2011-02-21T17:49:49
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA1
|
||||
|
||||
C When\sa\sstale\sschema-cookie\sis\sseen,\sexpire\sonly\sthe\sone\sstatement\sthat\nencountered\sthe\sbad\scookie,\snot\severy\sstatement\son\sthe\sdatabase\s\nconnection.\s\sTicket\s[b72787b1a7cea1f]
|
||||
D 2011-02-22T03:34:56.684
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@@ -98,7 +101,7 @@ F ext/rtree/rtree_util.tcl 06aab2ed5b826545bf215fff90ecb9255a8647ea
|
||||
F ext/rtree/sqlite3rtree.h 1af0899c63a688e272d69d8e746f24e76f10a3f0
|
||||
F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
|
||||
F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
|
||||
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
|
||||
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
|
||||
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
|
||||
F main.mk 54190fab7cdba523e311c274c95ea480f32abfb5
|
||||
F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a
|
||||
@@ -229,7 +232,7 @@ F src/update.c 227e6cd512108b84f69421fc6c7aa1b83d60d6e0
|
||||
F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685
|
||||
F src/util.c ab1c92426494f499f42b9e307537b03e923d75c1
|
||||
F src/vacuum.c 924bd1bcee2dfb05376f79845bd3b4cec7b54b2f
|
||||
F src/vdbe.c 167432ac0db5820b886685a7a6ad8f39520db4fb
|
||||
F src/vdbe.c 34305497d81daafdb1e500bfaa21d044c64503de
|
||||
F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2
|
||||
F src/vdbeInt.h 6e6f28e9bccc6c703dca1372fd661c57b5c15fb0
|
||||
F src/vdbeapi.c 8e9324fd35eb70d0b5904bd1af40f2598744dc4d
|
||||
@@ -597,7 +600,7 @@ F test/permutations.test 5b2a4cb756ffb2407cb4743163668d1d769febb6
|
||||
F test/pragma.test fdfc09067ea104a0c247a1a79d8093b56656f850
|
||||
F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
|
||||
F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
|
||||
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301 x
|
||||
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
|
||||
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
|
||||
F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
|
||||
F test/quota.test ddafe133653093eb9a99ccd6264884ae43f9c9b8
|
||||
@@ -703,6 +706,7 @@ F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c
|
||||
F test/tkt-94c04eaadb.test be5ea61cb04dfdc047d19b5c5a9e75fa3da67a7f
|
||||
F test/tkt-9d68c883.test 458f7d82a523d7644b54b497c986378a7d8c8b67
|
||||
F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0
|
||||
F test/tkt-b72787b1.test e6b62b2b2785c04d0d698d6a603507e384165049
|
||||
F test/tkt-cbd054fa6b.test f14f97ea43662e6f70c9e63287081e8be5d9d589
|
||||
F test/tkt-d11f09d36e.test fb44f7961aa6d4b632fb7b9768239832210b5fc7
|
||||
F test/tkt-d82e3f3721.test 731359dfdcdb36fea0559cd33fec39dd0ceae8e6
|
||||
@@ -883,7 +887,7 @@ F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5
|
||||
F tool/lemon.c dfd81a51b6e27e469ba21d01a75ddf092d429027
|
||||
F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc
|
||||
F tool/mkkeywordhash.c d2e6b4a5965e23afb80fbe74bb54648cd371f309
|
||||
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x
|
||||
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
|
||||
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
|
||||
F tool/mksqlite3c.tcl cf44512a48112b1ba09590548660a5a6877afdb3
|
||||
F tool/mksqlite3h.tcl d76c226a5e8e1f3b5f6593bcabe5e98b3b1ec9ff
|
||||
@@ -908,7 +912,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||
P 01076528a43b61ae20ef6969b7d326de9b5313e4
|
||||
R ea0b61d4a154cb9b4ce10e2d0f175950
|
||||
U dan
|
||||
Z bee26eb130eb27a9686da9ca1f7baaf2
|
||||
P 9f9f32882501ac9b6e60f81195a64bdbf6e4497b
|
||||
R 5f31f20137e37610967a0c8c09aa1cdf
|
||||
U drh
|
||||
Z efa7e00c780185dfb46b103f7c160f16
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||
|
||||
iD8DBQFNYy7koxKgR168RlERAptAAJ0SwgTWX7lSr3APOJLkJfc852ZtVgCfcyeE
|
||||
jtbsyJxLadCeUXNXPwdyqQ0=
|
||||
=vXCW
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
9f9f32882501ac9b6e60f81195a64bdbf6e4497b
|
||||
1bca0a7e198391202fd2bc1650c0a62028a9aaa5
|
||||
+1
-1
@@ -2920,7 +2920,7 @@ case OP_VerifyCookie: {
|
||||
sqlite3ResetInternalSchema(db, pOp->p1);
|
||||
}
|
||||
|
||||
sqlite3ExpirePreparedStatements(db);
|
||||
p->expired = 1;
|
||||
rc = SQLITE_SCHEMA;
|
||||
}
|
||||
break;
|
||||
|
||||
Executable → Regular
@@ -0,0 +1,77 @@
|
||||
# 2011 February 21
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# This file implements tests to verify that ticket [b72787b1a7] has been
|
||||
# fixed. From the ticket:
|
||||
#
|
||||
# The sqlite3ExpirePreparedStatements routine marks all statements
|
||||
# as expired. This includes statements that are not expired.
|
||||
#
|
||||
# Steps to reproduce:
|
||||
#
|
||||
# * Prepare a statement (A)
|
||||
# * Alter the schema to invalidate cookie in A
|
||||
# * Prepare a statement (B)
|
||||
# * Run B and have A run as part of B
|
||||
# * A will find a bad cookie and cause *all* statements
|
||||
# to be expired including the currently running B by calling
|
||||
# sqlite3ExpirePreparedStatements
|
||||
# * When control returns to B it will then abort
|
||||
#
|
||||
# The bug is that sqlite3ExpirePreparedStatements expires all statements.
|
||||
# Note that B was prepared after the schema change and hence is perfectly
|
||||
# valid and then is marked as expired while running.
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
unset -nocomplain ::STMT
|
||||
proc runsql {} {
|
||||
db eval {CREATE TABLE IF NOT EXISTS t4(q)}
|
||||
sqlite3_step $::STMT
|
||||
set rc [sqlite3_column_int $::STMT 0]
|
||||
sqlite3_reset $::STMT
|
||||
return $rc
|
||||
}
|
||||
|
||||
do_test tkt-b72787b1.1 {
|
||||
db eval {
|
||||
CREATE TABLE t1(x);
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES(2);
|
||||
CREATE TABLE t2(y);
|
||||
INSERT INTO t2 SELECT x+2 FROM t1;
|
||||
INSERT INTO t2 SELECT x+4 FROM t1;
|
||||
}
|
||||
db func runsql ::runsql
|
||||
set DB [sqlite3_connection_pointer db]
|
||||
set sql {SELECT max(x) FROM t1}
|
||||
set ::STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL]
|
||||
|
||||
# The runsql() call on the second row of the first query will
|
||||
# cause all $::STMT to hit an expired cookie. Prior to the fix
|
||||
# for [b72787b1a7, the bad cookie would expire all statements, including
|
||||
# the following compound SELECT, which would cause a fault when the
|
||||
# second SELECT was reached. After the fix, the current statement
|
||||
# continues to completion.
|
||||
db eval {
|
||||
SELECT CASE WHEN y=3 THEN y+100 WHEN y==4 THEN runsql()+200
|
||||
ELSE 300+y END FROM t2
|
||||
UNION ALL
|
||||
SELECT * FROM t1;
|
||||
}
|
||||
} {103 202 305 306 1 2}
|
||||
|
||||
sqlite3_finalize $::STMT
|
||||
|
||||
finish_test
|
||||
Executable → Regular
Reference in New Issue
Block a user