1# 2006 January 30 2# 3# The author disclaims copyright to this source code. In place of 4# 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 #1644 is 14# fixed. Ticket #1644 complains that precompiled statements 15# are not expired correctly as a result of changes to TEMP 16# views and triggers. 17# 18 19set testdir [file dirname $argv0] 20source $testdir/tester.tcl 21 22ifcapable !tempdb||!view { 23 finish_test 24 return 25} 26 27# Create two tables T1 and T2 and make V1 point to T1. 28do_test tkt1644-1.1 { 29 execsql { 30 CREATE TABLE t1(a); 31 INSERT INTO t1 VALUES(1); 32 CREATE TABLE t2(b); 33 INSERT INTO t2 VALUES(99); 34 CREATE TEMP VIEW v1 AS SELECT * FROM t1; 35 SELECT * FROM v1; 36 } 37} {1} 38 39# The "SELECT * FROM v1" should be in the TCL interface cache below. 40# It will continue to point to T1 unless the cache is invalidated when 41# the view changes. 42# 43do_test tkt1644-1.2 { 44 execsql { 45 DROP VIEW v1; 46 CREATE TEMP VIEW v1 AS SELECT * FROM t2; 47 SELECT * FROM v1; 48 } 49} {99} 50 51# Cache an access to the T1 table. 52# 53do_test tkt1644-1.3 { 54 execsql { 55 SELECT * FROM t1; 56 } 57} {1} 58 59# Create a temp table T1. Make sure the cache is invalidated so that 60# the statement is recompiled and refers to the empty temp table. 61# 62do_test tkt1644-1.4 { 63 execsql { 64 CREATE TEMP TABLE t1(x); 65 } 66 execsql { 67 SELECT * FROM t1; 68 } 69} {} 70 71ifcapable view { 72 do_test tkt1644-2.1 { 73 execsql { 74 CREATE TEMP TABLE temp_t1(a, b); 75 } 76 set ::DB [sqlite3_connection_pointer db] 77 set ::STMT [sqlite3_prepare $::DB "SELECT * FROM temp_t1" -1 DUMMY] 78 execsql { 79 DROP TABLE temp_t1; 80 } 81 list [sqlite3_step $::STMT] [sqlite3_finalize $::STMT] 82 } {SQLITE_ERROR SQLITE_SCHEMA} 83 84 do_test tkt1644-2.2 { 85 execsql { 86 CREATE TABLE real_t1(a, b); 87 CREATE TEMP VIEW temp_v1 AS SELECT * FROM real_t1; 88 } 89 set ::DB [sqlite3_connection_pointer db] 90 set ::STMT [sqlite3_prepare $::DB "SELECT * FROM temp_v1" -1 DUMMY] 91 execsql { 92 DROP VIEW temp_v1; 93 } 94 list [sqlite3_step $::STMT] [sqlite3_finalize $::STMT] 95 } {SQLITE_ERROR SQLITE_SCHEMA} 96 97 do_test tkt1644-2.3 { 98 execsql { 99 CREATE TEMP VIEW temp_v1 AS SELECT * FROM real_t1 LIMIT 10 OFFSET 10; 100 } 101 set ::DB [sqlite3_connection_pointer db] 102 set ::STMT [sqlite3_prepare $::DB "SELECT * FROM temp_v1" -1 DUMMY] 103 execsql { 104 DROP VIEW temp_v1; 105 } 106 list [sqlite3_step $::STMT] [sqlite3_finalize $::STMT] 107 } {SQLITE_ERROR SQLITE_SCHEMA} 108} 109 110 111finish_test 112