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>