modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/schema.test (about)

     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