Make sure the sqlite3_trace() callback is invoked, even if the prepared

statement was marked "expired" before it ever entered sqlite3_step().
Ticket [11d5aa455e0d98f3c1e6a08].

FossilOrigin-Name: 0d4d3df4bc5e75ce1543b5539a1e9e279d2a062f
This commit is contained in:
drh 2014-08-19 20:27:40 +00:00
parent 4b2590e44b
commit 2c7946a485
4 changed files with 29 additions and 11 deletions

View File

@ -1,5 +1,5 @@
C Improvements\sto\soutput\sformatting\swith\sthe\s".trace"\scommand\sin\sthe\ncommand-line\sshell.
D 2014-08-19T19:28:00.623
C Make\ssure\sthe\ssqlite3_trace()\scallback\sis\sinvoked,\seven\sif\sthe\sprepared\nstatement\swas\smarked\s"expired"\sbefore\sit\sever\sentered\ssqlite3_step().\nTicket\s[11d5aa455e0d98f3c1e6a08].
D 2014-08-19T20:27:40.455
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -286,7 +286,7 @@ F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
F src/vdbe.c f7f4066e4d6e3858878d76ce9288ea603e12ddf6
F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8
F src/vdbeInt.h f5513f2b5ac1e2c5128996c7ea23add256a301df
F src/vdbeapi.c 24e40422382beb774daab11fe9fe9d37e8a04949
F src/vdbeapi.c ce75e452dfd9c6ba4f8c6c76be6399c88bce3142
F src/vdbeaux.c 25d62ef82cf1be2a1255eacac636fa0d943d8b3d
F src/vdbeblob.c 9205ce9d3b064d9600f8418a897fc88b5687d9ac
F src/vdbemem.c d90a1e8acf8b63dc9d14cbbea12bfec6cec31394
@ -1017,7 +1017,7 @@ F test/tkt3997.test a335fa41ca3985660a139df7b734a26ef53284bd
F test/tkt4018.test 7c2c9ba4df489c676a0a7a0e809a1fb9b2185bd1
F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7
F test/tpch01.test 04adbf8d8300fa60a222f28d901abd76e7be6dd4
F test/trace.test 4b36a41a3e9c7842151af6da5998f5080cdad9e5
F test/trace.test 73a5508100f7fccfbc3f8018d5f6963ed478eea0
F test/trace2.test 93b47ca6996c66b47f57224cfb146f34e07df382
F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6
F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76
@ -1186,7 +1186,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P f10a6111262ce6ee6984c64fa0e0023642eca27d
R 257d241ab9ebe5fc3f4654d7f2e169ae
P d09d63c07748839e9b778a769b183bdd614c6c13
R dc4a84c1e3dbc4c500aead2f870904cc
U drh
Z 211a00cac8127ca939f7e6f32071c25c
Z 8ee9013dcfb943fe42c807d90f81accd

View File

@ -1 +1 @@
d09d63c07748839e9b778a769b183bdd614c6c13
0d4d3df4bc5e75ce1543b5539a1e9e279d2a062f

View File

@ -513,10 +513,12 @@ int sqlite3_step(sqlite3_stmt *pStmt){
sqlite3_mutex_enter(db->mutex);
v->doingRerun = 0;
while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
&& cnt++ < SQLITE_MAX_SCHEMA_RETRY
&& (rc2 = rc = sqlite3Reprepare(v))==SQLITE_OK ){
&& cnt++ < SQLITE_MAX_SCHEMA_RETRY ){
int savedPc = v->pc;
rc2 = rc = sqlite3Reprepare(v);
if( rc!=SQLITE_OK) break;
sqlite3_reset(pStmt);
v->doingRerun = 1;
v->doingRerun = savedPc>=0;
assert( v->expired==0 );
}
if( rc2!=SQLITE_OK ){

View File

@ -48,6 +48,22 @@ do_test trace-1.5 {
db trace {}
db trace
} {}
do_test trace-1.6 {
db eval {
CREATE TABLE t1b(x TEXT PRIMARY KEY, y);
INSERT INTO t1b VALUES('abc','def'),('ghi','jkl'),('mno','pqr');
}
set ::stmtlist {}
set xyzzy a*
db trace trace_proc
db eval {
SELECT y FROM t1b WHERE x GLOB $xyzzy
}
} {def}
do_test trace-1.7 {
set ::stmtlist
} {{SELECT y FROM t1b WHERE x GLOB 'a*'}}
db trace {}
# If we prepare a statement and execute it multiple times, the trace
# happens on each execution.