Home | History | Annotate | Download | only in test
      1 # 2006 November 08
      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 tests the various conditions under which an SQLITE_SCHEMA
     14 # error should be returned.  This is a copy of schema.test that
     15 # has been altered to use sqlite3_prepare_v2 instead of sqlite3_prepare
     16 #
     17 # $Id: schema2.test,v 1.4 2009/02/04 17:40:58 drh Exp $
     18 
     19 #---------------------------------------------------------------------
     20 # When any of the following types of SQL statements or actions are 
     21 # executed, all pre-compiled statements are invalidated. An attempt
     22 # to execute an invalidated statement always returns SQLITE_SCHEMA.
     23 #
     24 # CREATE/DROP TABLE...................................schema2-1.*
     25 # CREATE/DROP VIEW....................................schema2-2.*
     26 # CREATE/DROP TRIGGER.................................schema2-3.*
     27 # CREATE/DROP INDEX...................................schema2-4.*
     28 # DETACH..............................................schema2-5.*
     29 # Deleting a user-function............................schema2-6.*
     30 # Deleting a collation sequence.......................schema2-7.*
     31 # Setting or changing the authorization function......schema2-8.*
     32 #
     33 # Test cases schema2-9.* and schema2-10.* test some specific bugs
     34 # that came up during development.
     35 #
     36 # Test cases schema2-11.* test that it is impossible to delete or
     37 # change a collation sequence or user-function while SQL statements
     38 # are executing. Adding new collations or functions is allowed.
     39 #
     40 
     41 set testdir [file dirname $argv0]
     42 source $testdir/tester.tcl
     43 
     44 do_test schema2-1.1 {
     45   set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
     46   execsql {
     47     CREATE TABLE abc(a, b, c);
     48   }
     49   sqlite3_step $::STMT
     50 } {SQLITE_ROW}
     51 do_test schema2-1.2 {
     52   sqlite3_finalize $::STMT
     53 } {SQLITE_OK}
     54 do_test schema2-1.3 {
     55   set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
     56   execsql {
     57     DROP TABLE abc;
     58   }
     59   sqlite3_step $::STMT
     60 } {SQLITE_DONE}
     61 do_test schema2-1.4 {
     62   sqlite3_finalize $::STMT
     63 } {SQLITE_OK}
     64 
     65 
     66 ifcapable view {
     67   do_test schema2-2.1 {
     68     set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
     69     execsql {
     70       CREATE VIEW v1 AS SELECT * FROM sqlite_master;
     71     }
     72     sqlite3_step $::STMT
     73   } {SQLITE_ROW}
     74   do_test schema2-2.2 {
     75     sqlite3_finalize $::STMT
     76   } {SQLITE_OK}
     77   do_test schema2-2.3 {
     78     set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
     79     execsql {
     80       DROP VIEW v1;
     81     }
     82     sqlite3_step $::STMT
     83   } {SQLITE_DONE}
     84   do_test schema2-2.4 {
     85     sqlite3_finalize $::STMT
     86   } {SQLITE_OK}
     87 }
     88 
     89 ifcapable trigger {
     90   do_test schema2-3.1 {
     91     execsql {
     92       CREATE TABLE abc(a, b, c);
     93     }
     94     set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
     95     execsql {
     96       CREATE TRIGGER abc_trig AFTER INSERT ON abc BEGIN
     97         SELECT 1, 2, 3;
     98       END;
     99     }
    100     sqlite3_step $::STMT
    101   } {SQLITE_ROW}
    102   do_test schema2-3.2 {
    103     sqlite3_finalize $::STMT
    104   } {SQLITE_OK}
    105   do_test schema2-3.3 {
    106     set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
    107     execsql {
    108       DROP TRIGGER abc_trig;
    109     }
    110     sqlite3_step $::STMT
    111   } {SQLITE_ROW}
    112   do_test schema2-3.4 {
    113     sqlite3_finalize $::STMT
    114   } {SQLITE_OK}
    115 }
    116 
    117 do_test schema2-4.1 {
    118   catchsql {
    119     CREATE TABLE abc(a, b, c);
    120   }
    121   set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
    122   execsql {
    123     CREATE INDEX abc_index ON abc(a);
    124   }
    125   sqlite3_step $::STMT
    126 } {SQLITE_ROW}
    127 do_test schema2-4.2 {
    128   sqlite3_finalize $::STMT
    129 } {SQLITE_OK}
    130 do_test schema2-4.3 {
    131   set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
    132   execsql {
    133     DROP INDEX abc_index;
    134   }
    135   sqlite3_step $::STMT
    136 } {SQLITE_ROW}
    137 do_test schema2-4.4 {
    138   sqlite3_finalize $::STMT
    139 } {SQLITE_OK}
    140 
    141 #---------------------------------------------------------------------
    142 # Tests 5.1 to 5.4 check that prepared statements are invalidated when
    143 # a database is DETACHed (but not when one is ATTACHed).
    144 #
    145 ifcapable attach {
    146   do_test schema2-5.1 {
    147     set sql {SELECT * FROM abc;}
    148     set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
    149     execsql {
    150       ATTACH 'test2.db' AS aux;
    151     }
    152     sqlite3_step $::STMT
    153   } {SQLITE_DONE}
    154   do_test schema2-5.2 {
    155     sqlite3_reset $::STMT
    156   } {SQLITE_OK}
    157   do_test schema2-5.3 {
    158     execsql {
    159       DETACH aux;
    160     }
    161     sqlite3_step $::STMT
    162   } {SQLITE_DONE}
    163   do_test schema2-5.4 {
    164     sqlite3_finalize $::STMT
    165   } {SQLITE_OK}
    166 }
    167 
    168 #---------------------------------------------------------------------
    169 # Tests 6.* check that prepared statements are invalidated when
    170 # a user-function is deleted (but not when one is added).
    171 do_test schema2-6.1 {
    172   set sql {SELECT * FROM abc;}
    173   set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
    174   db function hello_function {}
    175   sqlite3_step $::STMT
    176 } {SQLITE_DONE}
    177 do_test schema2-6.2 {
    178   sqlite3_reset $::STMT
    179 } {SQLITE_OK}
    180 do_test schema2-6.3 {
    181   sqlite_delete_function $::DB hello_function
    182   sqlite3_step $::STMT
    183 } {SQLITE_DONE}
    184 do_test schema2-6.4 {
    185   sqlite3_finalize $::STMT
    186 } {SQLITE_OK}
    187 
    188 #---------------------------------------------------------------------
    189 # Tests 7.* check that prepared statements are invalidated when
    190 # a collation sequence is deleted (but not when one is added).
    191 #
    192 ifcapable utf16 {
    193   do_test schema2-7.1 {
    194     set sql {SELECT * FROM abc;}
    195     set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
    196     add_test_collate $::DB 1 1 1
    197     sqlite3_step $::STMT
    198   } {SQLITE_DONE}
    199   do_test schema2-7.2 {
    200     sqlite3_reset $::STMT
    201   } {SQLITE_OK}
    202   do_test schema2-7.3 {
    203     add_test_collate $::DB 0 0 0 
    204     sqlite3_step $::STMT
    205   } {SQLITE_DONE}
    206   do_test schema2-7.4 {
    207     sqlite3_finalize $::STMT
    208   } {SQLITE_OK}
    209 }
    210 
    211 #---------------------------------------------------------------------
    212 # Tests 8.1 and 8.2 check that prepared statements are invalidated when
    213 # the authorization function is set.
    214 #
    215 ifcapable auth {
    216   do_test schema2-8.1 {
    217     set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
    218     db auth {}
    219     sqlite3_step $::STMT
    220   } {SQLITE_ROW}
    221   do_test schema2-8.3 {
    222     sqlite3_finalize $::STMT
    223   } {SQLITE_OK}
    224 }
    225 
    226 #---------------------------------------------------------------------
    227 # schema2-9.1: Test that if a table is dropped by one database connection, 
    228 #             other database connections are aware of the schema change.
    229 # schema2-9.2: Test that if a view is dropped by one database connection,
    230 #             other database connections are aware of the schema change.
    231 #
    232 do_test schema2-9.1 {
    233   sqlite3 db2 test.db
    234   execsql {
    235     DROP TABLE abc;
    236   } db2
    237   db2 close
    238   catchsql {
    239     SELECT * FROM abc;
    240   }
    241 } {1 {no such table: abc}}
    242 execsql {
    243   CREATE TABLE abc(a, b, c);
    244 }
    245 ifcapable view {
    246   do_test schema2-9.2 {
    247     execsql {
    248       CREATE VIEW abcview AS SELECT * FROM abc;
    249     }
    250     sqlite3 db2 test.db
    251     execsql {
    252       DROP VIEW abcview;
    253     } db2
    254     db2 close
    255     catchsql {
    256       SELECT * FROM abcview;
    257     }
    258   } {1 {no such table: abcview}}
    259 }
    260 
    261 #---------------------------------------------------------------------
    262 # Test that if a CREATE TABLE statement fails because there are other
    263 # btree cursors open on the same database file it does not corrupt
    264 # the sqlite_master table.
    265 #
    266 # 2007-05-02: These tests have been overcome by events.  Open btree
    267 # cursors no longer block CREATE TABLE.  But there is no reason not
    268 # to keep the tests in the test suite.
    269 #
    270 do_test schema2-10.1 {
    271   execsql {
    272     INSERT INTO abc VALUES(1, 2, 3);
    273   }
    274   set sql {SELECT * FROM abc}
    275   set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
    276   sqlite3_step $::STMT
    277 } {SQLITE_ROW}
    278 do_test schema2-10.2 {
    279   catchsql {
    280     CREATE TABLE t2(a, b, c);
    281   }
    282 } {0 {}}
    283 do_test schema2-10.3 {
    284   sqlite3_finalize $::STMT
    285 } {SQLITE_OK}
    286 do_test schema2-10.4 {
    287   sqlite3 db2 test.db
    288   execsql {
    289     SELECT * FROM abc
    290   } db2
    291 } {1 2 3}
    292 do_test schema2-10.5 {
    293   db2 close
    294 } {}
    295 
    296 #---------------------------------------------------------------------
    297 # Attempting to delete or replace a user-function or collation sequence 
    298 # while there are active statements returns an SQLITE_BUSY error.
    299 #
    300 # schema2-11.1 - 11.4: User function.
    301 # schema2-11.5 - 11.8: Collation sequence.
    302 #
    303 do_test schema2-11.1 {
    304   db function tstfunc {}
    305   set sql {SELECT * FROM abc}
    306   set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
    307   sqlite3_step $::STMT
    308 } {SQLITE_ROW}
    309 do_test schema2-11.2 {
    310   sqlite_delete_function $::DB tstfunc
    311 } {SQLITE_BUSY}
    312 do_test schema2-11.3 {
    313   set rc [catch {
    314     db function tstfunc {}
    315   } msg]
    316   list $rc $msg
    317 } {1 {unable to delete/modify user-function due to active statements}}
    318 do_test schema2-11.4 {
    319   sqlite3_finalize $::STMT
    320 } {SQLITE_OK}
    321 do_test schema2-11.5 {
    322   db collate tstcollate {}
    323   set sql {SELECT * FROM abc}
    324   set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
    325   sqlite3_step $::STMT
    326 } {SQLITE_ROW}
    327 do_test schema2-11.6 {
    328   sqlite_delete_collation $::DB tstcollate
    329 } {SQLITE_BUSY}
    330 do_test schema2-11.7 {
    331   set rc [catch {
    332     db collate tstcollate {}
    333   } msg]
    334   list $rc $msg
    335 } {1 {unable to delete/modify collation sequence due to active statements}}
    336 do_test schema2-11.8 {
    337   sqlite3_finalize $::STMT
    338 } {SQLITE_OK}
    339 
    340 finish_test
    341