Annotation of embedaddon/sqlite3/test/schema2.test, revision 1.1
1.1 ! misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>