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