persistentstorage/sqlite3api/TEST/TclScript/schema2.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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.3 2007/10/09 08:29:33 danielk1977 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