Annotation of embedaddon/sqlite3/test/schema.test, revision 1.1

1.1     ! misho       1: # 2005 Jan 24
        !             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.
        !            15: #
        !            16: # $Id: schema.test,v 1.9 2009/02/04 17:40:58 drh Exp $
        !            17: 
        !            18: #---------------------------------------------------------------------
        !            19: # When any of the following types of SQL statements or actions are 
        !            20: # executed, all pre-compiled statements are invalidated. An attempt
        !            21: # to execute an invalidated statement always returns SQLITE_SCHEMA.
        !            22: #
        !            23: # CREATE/DROP TABLE...................................schema-1.*
        !            24: # CREATE/DROP VIEW....................................schema-2.*
        !            25: # CREATE/DROP TRIGGER.................................schema-3.*
        !            26: # CREATE/DROP INDEX...................................schema-4.*
        !            27: # DETACH..............................................schema-5.*
        !            28: # Deleting a user-function............................schema-6.*
        !            29: # Deleting a collation sequence.......................schema-7.*
        !            30: # Setting or changing the authorization function......schema-8.*
        !            31: # Rollback of a DDL statement.........................schema-12.*
        !            32: #
        !            33: # Test cases schema-9.* and schema-10.* test some specific bugs
        !            34: # that came up during development.
        !            35: #
        !            36: # Test cases schema-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 schema-1.1 {
        !            45:   set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !            46:   execsql {
        !            47:     CREATE TABLE abc(a, b, c);
        !            48:   }
        !            49:   sqlite3_step $::STMT
        !            50: } {SQLITE_ERROR}
        !            51: do_test schema-1.2 {
        !            52:   sqlite3_finalize $::STMT
        !            53: } {SQLITE_SCHEMA}
        !            54: do_test schema-1.3 {
        !            55:   set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !            56:   execsql {
        !            57:     DROP TABLE abc;
        !            58:   }
        !            59:   sqlite3_step $::STMT
        !            60: } {SQLITE_ERROR}
        !            61: do_test schema-1.4 {
        !            62:   sqlite3_finalize $::STMT
        !            63: } {SQLITE_SCHEMA}
        !            64: 
        !            65: ifcapable view {
        !            66:   do_test schema-2.1 {
        !            67:     set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !            68:     execsql {
        !            69:       CREATE VIEW v1 AS SELECT * FROM sqlite_master;
        !            70:     }
        !            71:     sqlite3_step $::STMT
        !            72:   } {SQLITE_ERROR}
        !            73:   do_test schema-2.2 {
        !            74:     sqlite3_finalize $::STMT
        !            75:   } {SQLITE_SCHEMA}
        !            76:   do_test schema-2.3 {
        !            77:     set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !            78:     execsql {
        !            79:       DROP VIEW v1;
        !            80:     }
        !            81:     sqlite3_step $::STMT
        !            82:   } {SQLITE_ERROR}
        !            83:   do_test schema-2.4 {
        !            84:     sqlite3_finalize $::STMT
        !            85:   } {SQLITE_SCHEMA}
        !            86: }
        !            87: 
        !            88: ifcapable trigger {
        !            89:   do_test schema-3.1 {
        !            90:     execsql {
        !            91:       CREATE TABLE abc(a, b, c);
        !            92:     }
        !            93:     set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !            94:     execsql {
        !            95:       CREATE TRIGGER abc_trig AFTER INSERT ON abc BEGIN
        !            96:         SELECT 1, 2, 3;
        !            97:       END;
        !            98:     }
        !            99:     sqlite3_step $::STMT
        !           100:   } {SQLITE_ERROR}
        !           101:   do_test schema-3.2 {
        !           102:     sqlite3_finalize $::STMT
        !           103:   } {SQLITE_SCHEMA}
        !           104:   do_test schema-3.3 {
        !           105:     set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !           106:     execsql {
        !           107:       DROP TRIGGER abc_trig;
        !           108:     }
        !           109:     sqlite3_step $::STMT
        !           110:   } {SQLITE_ERROR}
        !           111:   do_test schema-3.4 {
        !           112:     sqlite3_finalize $::STMT
        !           113:   } {SQLITE_SCHEMA}
        !           114: }
        !           115: 
        !           116: do_test schema-4.1 {
        !           117:   catchsql {
        !           118:     CREATE TABLE abc(a, b, c);
        !           119:   }
        !           120:   set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !           121:   execsql {
        !           122:     CREATE INDEX abc_index ON abc(a);
        !           123:   }
        !           124:   sqlite3_step $::STMT
        !           125: } {SQLITE_ERROR}
        !           126: do_test schema-4.2 {
        !           127:   sqlite3_finalize $::STMT
        !           128: } {SQLITE_SCHEMA}
        !           129: do_test schema-4.3 {
        !           130:   set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !           131:   execsql {
        !           132:     DROP INDEX abc_index;
        !           133:   }
        !           134:   sqlite3_step $::STMT
        !           135: } {SQLITE_ERROR}
        !           136: do_test schema-4.4 {
        !           137:   sqlite3_finalize $::STMT
        !           138: } {SQLITE_SCHEMA}
        !           139: 
        !           140: #---------------------------------------------------------------------
        !           141: # Tests 5.1 to 5.4 check that prepared statements are invalidated when
        !           142: # a database is DETACHed (but not when one is ATTACHed).
        !           143: #
        !           144: ifcapable attach {
        !           145:   do_test schema-5.1 {
        !           146:     set sql {SELECT * FROM abc;}
        !           147:     set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
        !           148:     execsql {
        !           149:       ATTACH 'test2.db' AS aux;
        !           150:     }
        !           151:     sqlite3_step $::STMT
        !           152:   } {SQLITE_DONE}
        !           153:   do_test schema-5.2 {
        !           154:     sqlite3_reset $::STMT
        !           155:   } {SQLITE_OK}
        !           156:   do_test schema-5.3 {
        !           157:     execsql {
        !           158:       DETACH aux;
        !           159:     }
        !           160:     sqlite3_step $::STMT
        !           161:   } {SQLITE_ERROR}
        !           162:   do_test schema-5.4 {
        !           163:     sqlite3_finalize $::STMT
        !           164:   } {SQLITE_SCHEMA}
        !           165: }
        !           166: 
        !           167: #---------------------------------------------------------------------
        !           168: # Tests 6.* check that prepared statements are invalidated when
        !           169: # a user-function is deleted (but not when one is added).
        !           170: do_test schema-6.1 {
        !           171:   set sql {SELECT * FROM abc;}
        !           172:   set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
        !           173:   db function hello_function {}
        !           174:   sqlite3_step $::STMT
        !           175: } {SQLITE_DONE}
        !           176: do_test schema-6.2 {
        !           177:   sqlite3_reset $::STMT
        !           178: } {SQLITE_OK}
        !           179: do_test schema-6.3 {
        !           180:   sqlite_delete_function $::DB hello_function
        !           181:   sqlite3_step $::STMT
        !           182: } {SQLITE_ERROR}
        !           183: do_test schema-6.4 {
        !           184:   sqlite3_finalize $::STMT
        !           185: } {SQLITE_SCHEMA}
        !           186: 
        !           187: #---------------------------------------------------------------------
        !           188: # Tests 7.* check that prepared statements are invalidated when
        !           189: # a collation sequence is deleted (but not when one is added).
        !           190: #
        !           191: ifcapable utf16 {
        !           192:   do_test schema-7.1 {
        !           193:     set sql {SELECT * FROM abc;}
        !           194:     set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
        !           195:     add_test_collate $::DB 1 1 1
        !           196:     sqlite3_step $::STMT
        !           197:   } {SQLITE_DONE}
        !           198:   do_test schema-7.2 {
        !           199:     sqlite3_reset $::STMT
        !           200:   } {SQLITE_OK}
        !           201:   do_test schema-7.3 {
        !           202:     add_test_collate $::DB 0 0 0 
        !           203:     sqlite3_step $::STMT
        !           204:   } {SQLITE_ERROR}
        !           205:   do_test schema-7.4 {
        !           206:     sqlite3_finalize $::STMT
        !           207:   } {SQLITE_SCHEMA}
        !           208: }
        !           209: 
        !           210: #---------------------------------------------------------------------
        !           211: # Tests 8.1 and 8.2 check that prepared statements are invalidated when
        !           212: # the authorization function is set.
        !           213: #
        !           214: ifcapable auth {
        !           215:   do_test schema-8.1 {
        !           216:     set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL]
        !           217:     db auth {}
        !           218:     sqlite3_step $::STMT
        !           219:   } {SQLITE_ERROR}
        !           220:   do_test schema-8.3 {
        !           221:     sqlite3_finalize $::STMT
        !           222:   } {SQLITE_SCHEMA}
        !           223: }
        !           224: 
        !           225: #---------------------------------------------------------------------
        !           226: # schema-9.1: Test that if a table is dropped by one database connection, 
        !           227: #             other database connections are aware of the schema change.
        !           228: # schema-9.2: Test that if a view is dropped by one database connection,
        !           229: #             other database connections are aware of the schema change.
        !           230: #
        !           231: do_test schema-9.1 {
        !           232:   sqlite3 db2 test.db
        !           233:   execsql {
        !           234:     DROP TABLE abc;
        !           235:   } db2
        !           236:   db2 close
        !           237:   catchsql {
        !           238:     SELECT * FROM abc;
        !           239:   }
        !           240: } {1 {no such table: abc}}
        !           241: execsql {
        !           242:   CREATE TABLE abc(a, b, c);
        !           243: }
        !           244: ifcapable view {
        !           245:   do_test schema-9.2 {
        !           246:     execsql {
        !           247:       CREATE VIEW abcview AS SELECT * FROM abc;
        !           248:     }
        !           249:     sqlite3 db2 test.db
        !           250:     execsql {
        !           251:       DROP VIEW abcview;
        !           252:     } db2
        !           253:     db2 close
        !           254:     catchsql {
        !           255:       SELECT * FROM abcview;
        !           256:     }
        !           257:   } {1 {no such table: abcview}}
        !           258: }
        !           259: 
        !           260: #---------------------------------------------------------------------
        !           261: # Test that if a CREATE TABLE statement fails because there are other
        !           262: # btree cursors open on the same database file it does not corrupt
        !           263: # the sqlite_master table.
        !           264: #
        !           265: # 2007-05-02: These tests have been overcome by events.  Open btree
        !           266: # cursors no longer block CREATE TABLE.  But there is no reason not
        !           267: # to keep the tests in the test suite.
        !           268: #
        !           269: do_test schema-10.1 {
        !           270:   execsql {
        !           271:     INSERT INTO abc VALUES(1, 2, 3);
        !           272:   }
        !           273:   set sql {SELECT * FROM abc}
        !           274:   set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
        !           275:   sqlite3_step $::STMT
        !           276: } {SQLITE_ROW}
        !           277: do_test schema-10.2 {
        !           278:   catchsql {
        !           279:     CREATE TABLE t2(a, b, c);
        !           280:   }
        !           281: } {0 {}}
        !           282: do_test schema-10.3 {
        !           283:   sqlite3_finalize $::STMT
        !           284: } {SQLITE_OK}
        !           285: do_test schema-10.4 {
        !           286:   sqlite3 db2 test.db
        !           287:   execsql {
        !           288:     SELECT * FROM abc
        !           289:   } db2
        !           290: } {1 2 3}
        !           291: do_test schema-10.5 {
        !           292:   db2 close
        !           293: } {}
        !           294: 
        !           295: #---------------------------------------------------------------------
        !           296: # Attempting to delete or replace a user-function or collation sequence 
        !           297: # while there are active statements returns an SQLITE_BUSY error.
        !           298: #
        !           299: # schema-11.1 - 11.4: User function.
        !           300: # schema-11.5 - 11.8: Collation sequence.
        !           301: #
        !           302: do_test schema-11.1 {
        !           303:   db function tstfunc {}
        !           304:   set sql {SELECT * FROM abc}
        !           305:   set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
        !           306:   sqlite3_step $::STMT
        !           307: } {SQLITE_ROW}
        !           308: do_test schema-11.2 {
        !           309:   sqlite_delete_function $::DB tstfunc
        !           310: } {SQLITE_BUSY}
        !           311: do_test schema-11.3 {
        !           312:   set rc [catch {
        !           313:     db function tstfunc {}
        !           314:   } msg]
        !           315:   list $rc $msg
        !           316: } {1 {unable to delete/modify user-function due to active statements}}
        !           317: do_test schema-11.4 {
        !           318:   sqlite3_finalize $::STMT
        !           319: } {SQLITE_OK}
        !           320: do_test schema-11.5 {
        !           321:   db collate tstcollate {}
        !           322:   set sql {SELECT * FROM abc}
        !           323:   set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
        !           324:   sqlite3_step $::STMT
        !           325: } {SQLITE_ROW}
        !           326: do_test schema-11.6 {
        !           327:   sqlite_delete_collation $::DB tstcollate
        !           328: } {SQLITE_BUSY}
        !           329: do_test schema-11.7 {
        !           330:   set rc [catch {
        !           331:     db collate tstcollate {}
        !           332:   } msg]
        !           333:   list $rc $msg
        !           334: } {1 {unable to delete/modify collation sequence due to active statements}}
        !           335: do_test schema-11.8 {
        !           336:   sqlite3_finalize $::STMT
        !           337: } {SQLITE_OK}
        !           338: 
        !           339: # The following demonstrates why statements need to be expired whenever
        !           340: # there is a rollback (explicit or otherwise).
        !           341: #
        !           342: do_test schema-12.1 {
        !           343:   # Begin a transaction and create a table. This increments 
        !           344:   # the schema cookie. Then compile an SQL statement, using
        !           345:   # the current (incremented) value of the cookie.
        !           346:   execsql {
        !           347:     BEGIN;
        !           348:     CREATE TABLE t3(a, b, c);
        !           349:   }
        !           350:   set ::STMT [sqlite3_prepare $::DB "CREATE TABLE t4(a,b,c)" -1 TAIL]
        !           351: 
        !           352:   # Rollback the transaction, resetting the schema cookie to the value
        !           353:   # it had at the start of this test case. Then create a table, 
        !           354:   # incrementing the schema cookie.
        !           355:   execsql {
        !           356:     ROLLBACK;
        !           357:     CREATE TABLE t4(a, b, c);
        !           358:   }
        !           359: 
        !           360:   # The schema cookie now has the same value as it did when SQL statement
        !           361:   # $::STMT was prepared. So unless it has been expired, it would be
        !           362:   # possible to run the "CREATE TABLE t4" statement and create a
        !           363:   # duplicate table.
        !           364:   list [sqlite3_step $::STMT] [sqlite3_finalize $::STMT]
        !           365: } {SQLITE_ERROR SQLITE_SCHEMA}
        !           366: 
        !           367: ifcapable {auth} {
        !           368: 
        !           369: do_test schema-13.1 {
        !           370:   set S [sqlite3_prepare_v2 db "SELECT * FROM sqlite_master" -1 dummy]
        !           371:   db function hello hello
        !           372:   db function hello {}
        !           373:   db auth auth
        !           374:   proc auth {args} {
        !           375:     if {[lindex $args 0] == "SQLITE_READ"} {return SQLITE_DENY}
        !           376:     return SQLITE_OK
        !           377:   }
        !           378:   sqlite3_step $S
        !           379: } {SQLITE_AUTH}
        !           380: 
        !           381: do_test schema-13.2 {
        !           382:   sqlite3_step $S
        !           383: } {SQLITE_AUTH}
        !           384: 
        !           385: do_test schema-13.3 {
        !           386:   sqlite3_finalize $S
        !           387: } {SQLITE_AUTH}
        !           388: 
        !           389: }
        !           390: 
        !           391: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>