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