AryaWu/sqlite
0
1# 2011 February 212#3# The author disclaims copyright to this source code. In place of4# a legal notice, here is a blessing:5#6# May you do good and not evil.7# May you find forgiveness for yourself and forgive others.8# May you share freely, never taking more than you give.9#10#***********************************************************************11# This file implements regression tests for SQLite library.12#13# This file implements tests to verify that ticket [b72787b1a7] has been14# fixed. From the ticket:15#16# The sqlite3ExpirePreparedStatements routine marks all statements17# as expired. This includes statements that are not expired.18#19# Steps to reproduce:20#21# * Prepare a statement (A)22# * Alter the schema to invalidate cookie in A23# * Prepare a statement (B)24# * Run B and have A run as part of B25# * A will find a bad cookie and cause *all* statements26# to be expired including the currently running B by calling27# sqlite3ExpirePreparedStatements28# * When control returns to B it will then abort 29#30# The bug is that sqlite3ExpirePreparedStatements expires all statements.31# Note that B was prepared after the schema change and hence is perfectly32# valid and then is marked as expired while running.33#34 35set testdir [file dirname $argv0]36source $testdir/tester.tcl37 38ifcapable !compound {39 finish_test40 return41}42 43unset -nocomplain ::STMT44proc runsql {} {45 db eval {CREATE TABLE IF NOT EXISTS t4(q)}46 sqlite3_step $::STMT47 set rc [sqlite3_column_int $::STMT 0]48 sqlite3_reset $::STMT49 return $rc50}51 52do_test tkt-b72787b1.1 {53 db eval {54 CREATE TABLE t1(x);55 INSERT INTO t1 VALUES(1);56 INSERT INTO t1 VALUES(2);57 CREATE TABLE t2(y);58 INSERT INTO t2 SELECT x+2 FROM t1;59 INSERT INTO t2 SELECT x+4 FROM t1;60 }61 db func runsql ::runsql62 set DB [sqlite3_connection_pointer db]63 set sql {SELECT max(x) FROM t1}64 set ::STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL]65 66 # The runsql() call on the second row of the first query will67 # cause all $::STMT to hit an expired cookie. Prior to the fix68 # for [b72787b1a7, the bad cookie would expire all statements, including69 # the following compound SELECT, which would cause a fault when the70 # second SELECT was reached. After the fix, the current statement71 # continues to completion.72 db eval {73 SELECT CASE WHEN y=3 THEN y+100 WHEN y==4 THEN runsql()+20074 ELSE 300+y END FROM t275 UNION ALL76 SELECT * FROM t1;77 }78} {103 202 305 306 1 2}79 80sqlite3_finalize $::STMT81 82finish_test83 