Expire all prepared statements whenever there is a change to the schema

of the TEMP database.  Ticket #1644. (CVS 3036)

FossilOrigin-Name: 4cd4efaf5ef40a07e76fba3073bbd2600ca7e327
This commit is contained in:
drh 2006-01-30 15:34:22 +00:00
parent afa5f68091
commit fd426c6611
4 changed files with 82 additions and 8 deletions

View File

@ -1,5 +1,5 @@
C Fix\sbug\swith\sCHECK\sconstraints\scontain\san\sIN\soperator.\s\sTicket\s#1645.\s(CVS\s3035)
D 2006-01-30T14:36:59
C Expire\sall\sprepared\sstatements\swhenever\sthere\sis\sa\schange\sto\sthe\sschema\nof\sthe\sTEMP\sdatabase.\s\sTicket\s#1644.\s(CVS\s3036)
D 2006-01-30T15:34:23
F Makefile.in e936c6fc3134838318aa0335a85041e6da31f6ee
F Makefile.linux-gcc 74ba0eadf88748a9ce3fd03d2a3ede2e6715baec
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@ -89,7 +89,7 @@ F src/update.c 14be4ba2f438919b4217085c02feff569e6cf1f2
F src/utf.c 1199766bbb0157931a83aa6eede6b6381177be64
F src/util.c 82ee598519b8193184bdeab06b51a4ffa05ad60b
F src/vacuum.c 3865673cc66acd0717ecd517f6b8fdb2a5e7924b
F src/vdbe.c 799e6280aef25bae55d2da21b5a6dbdda5e76e36
F src/vdbe.c fee677e05236e483d6c75d1d4229955fc1b89193
F src/vdbe.h 8729a4ee16ff9aeab2af9667df3cf300ff978e13
F src/vdbeInt.h eb3f86ab08ef11635bc78eb88c3ff13f923c233b
F src/vdbeapi.c dcb2636f49b4807e34960d52a2fc257b3a751140
@ -255,6 +255,7 @@ F test/tkt1514.test baa587a69fa2e8d575ebdaf1460f711281dcba49
F test/tkt1536.test 83ff7a7b6e248016f8d682d4f7a4ae114070d466
F test/tkt1537.test e3a14332de9770be8ff14bd15c19a49cbec10808
F test/tkt1567.test 18023cc3626a365f0118e17b66decedec93b1a6f
F test/tkt1644.test c44a4957874583de0854159d3481bed8facc9c2d
F test/trace.test 75ffc1b992c780d054748a656e3e7fd674f18567
F test/trans.test b25eae982d156867eac338409905fd4ca589b7f8
F test/trigger1.test 0c1d44882dba5c92e4efee4dd133cc979f0b1860
@ -347,7 +348,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
P 2e23231f0c10b2bba9e08ea47859e2c0ffa84c76
R 3b0f9d35458ab8f6669640d2d99a201a
P 944df310ce8d32798135c70becee7845676520ae
R 29e2b008efd55eab83787ea3973e471c
U drh
Z da68d113e790373b1b3d356e0a8d22c5
Z 695d02c988e27778f6752e27ab962e1f

View File

@ -1 +1 @@
944df310ce8d32798135c70becee7845676520ae
4cd4efaf5ef40a07e76fba3073bbd2600ca7e327

View File

@ -43,7 +43,7 @@
** in this file for details. If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
** $Id: vdbe.c,v 1.539 2006/01/24 13:09:33 danielk1977 Exp $
** $Id: vdbe.c,v 1.540 2006/01/30 15:34:23 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@ -2463,6 +2463,11 @@ case OP_SetCookie: { /* no-push */
}
assert( (pTos->flags & MEM_Dyn)==0 );
pTos--;
if( pOp->p1==1 ){
/* Invalidate all prepared statements whenever the TEMP database
** schema is changed. Ticket #1644 */
sqlite3ExpirePreparedStatements(db);
}
break;
}

68
test/tkt1644.test Normal file
View File

@ -0,0 +1,68 @@
# 2006 January 30
#
# 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 #1644 is
# fixed. Ticket #1644 complains that precompiled statements
# are not expired correctly as a result of changes to TEMP
# views and triggers.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
# Create two tables T1 and T2 and make V1 point to T1.
do_test tkt1644-1.1 {
execsql {
CREATE TABLE t1(a);
INSERT INTO t1 VALUES(1);
CREATE TABLE t2(b);
INSERT INTO t2 VALUES(99);
CREATE TEMP VIEW v1 AS SELECT * FROM t1;
SELECT * FROM v1;
}
} {1}
# The "SELECT * FROM v1" should be in the TCL interface cache below.
# It will continue to point to T1 unless the cache is invalidated when
# the view changes.
#
do_test tkt1644-1.2 {
execsql {
DROP VIEW v1;
CREATE TEMP VIEW v1 AS SELECT * FROM t2;
SELECT * FROM v1;
}
} {99}
# Cache an access to the T1 table.
#
do_test tkt1644-1.3 {
execsql {
SELECT * FROM t1;
}
} {1}
# Create a temp table T1. Make sure the cache is invalidated so that
# the statement is recompiled and refers to the empty temp table.
#
do_test tkt1644-1.4 {
execsql {
CREATE TEMP TABLE t1(x);
}
execsql {
SELECT * FROM t1;
}
} {}
finish_test