Home | History | Annotate | Download | only in test
      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 
     19 set testdir [file dirname $argv0]
     20 source $testdir/tester.tcl
     21 
     22 ifcapable !tempdb||!view {
     23   finish_test
     24   return
     25 }  
     26 
     27 # Create two tables T1 and T2 and make V1 point to T1.
     28 do_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 #
     43 do_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 #
     53 do_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 #
     62 do_test tkt1644-1.4 {
     63   execsql {
     64     CREATE TEMP TABLE t1(x);
     65   }
     66   execsql {
     67     SELECT * FROM t1;
     68   }
     69 } {}
     70 
     71 ifcapable 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 
    111 finish_test
    112