xref: /sqlite-3.40.0/test/schema2.test (revision b309becd)
1b900aaf3Sdrh# 2006 November 08
2b900aaf3Sdrh#
3b900aaf3Sdrh# The author disclaims copyright to this source code.  In place of
4b900aaf3Sdrh# a legal notice, here is a blessing:
5b900aaf3Sdrh#
6b900aaf3Sdrh#    May you do good and not evil.
7b900aaf3Sdrh#    May you find forgiveness for yourself and forgive others.
8b900aaf3Sdrh#    May you share freely, never taking more than you give.
9b900aaf3Sdrh#
10b900aaf3Sdrh#***********************************************************************
11b900aaf3Sdrh# This file implements regression tests for SQLite library.
12b900aaf3Sdrh#
13b900aaf3Sdrh# This file tests the various conditions under which an SQLITE_SCHEMA
14b900aaf3Sdrh# error should be returned.  This is a copy of schema.test that
15b900aaf3Sdrh# has been altered to use sqlite3_prepare_v2 instead of sqlite3_prepare
16b900aaf3Sdrh#
17*b309becdSdrh# $Id: schema2.test,v 1.4 2009/02/04 17:40:58 drh Exp $
18b900aaf3Sdrh
19b900aaf3Sdrh#---------------------------------------------------------------------
20b900aaf3Sdrh# When any of the following types of SQL statements or actions are
21b900aaf3Sdrh# executed, all pre-compiled statements are invalidated. An attempt
22b900aaf3Sdrh# to execute an invalidated statement always returns SQLITE_SCHEMA.
23b900aaf3Sdrh#
24b900aaf3Sdrh# CREATE/DROP TABLE...................................schema2-1.*
25b900aaf3Sdrh# CREATE/DROP VIEW....................................schema2-2.*
26b900aaf3Sdrh# CREATE/DROP TRIGGER.................................schema2-3.*
27b900aaf3Sdrh# CREATE/DROP INDEX...................................schema2-4.*
28b900aaf3Sdrh# DETACH..............................................schema2-5.*
29b900aaf3Sdrh# Deleting a user-function............................schema2-6.*
30b900aaf3Sdrh# Deleting a collation sequence.......................schema2-7.*
31b900aaf3Sdrh# Setting or changing the authorization function......schema2-8.*
32b900aaf3Sdrh#
33b900aaf3Sdrh# Test cases schema2-9.* and schema2-10.* test some specific bugs
34b900aaf3Sdrh# that came up during development.
35b900aaf3Sdrh#
36b900aaf3Sdrh# Test cases schema2-11.* test that it is impossible to delete or
37b900aaf3Sdrh# change a collation sequence or user-function while SQL statements
38b900aaf3Sdrh# are executing. Adding new collations or functions is allowed.
39b900aaf3Sdrh#
40b900aaf3Sdrh
41b900aaf3Sdrhset testdir [file dirname $argv0]
42b900aaf3Sdrhsource $testdir/tester.tcl
43b900aaf3Sdrh
44b900aaf3Sdrhdo_test schema2-1.1 {
45b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
46b900aaf3Sdrh  execsql {
47b900aaf3Sdrh    CREATE TABLE abc(a, b, c);
48b900aaf3Sdrh  }
49b900aaf3Sdrh  sqlite3_step $::STMT
50b900aaf3Sdrh} {SQLITE_ROW}
51b900aaf3Sdrhdo_test schema2-1.2 {
52b900aaf3Sdrh  sqlite3_finalize $::STMT
53b900aaf3Sdrh} {SQLITE_OK}
54b900aaf3Sdrhdo_test schema2-1.3 {
55b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
56b900aaf3Sdrh  execsql {
57b900aaf3Sdrh    DROP TABLE abc;
58b900aaf3Sdrh  }
59b900aaf3Sdrh  sqlite3_step $::STMT
60b900aaf3Sdrh} {SQLITE_DONE}
61b900aaf3Sdrhdo_test schema2-1.4 {
62b900aaf3Sdrh  sqlite3_finalize $::STMT
63b900aaf3Sdrh} {SQLITE_OK}
64b900aaf3Sdrh
65b900aaf3Sdrh
66b900aaf3Sdrhifcapable view {
67b900aaf3Sdrh  do_test schema2-2.1 {
68b900aaf3Sdrh    set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
69b900aaf3Sdrh    execsql {
70b900aaf3Sdrh      CREATE VIEW v1 AS SELECT * FROM sqlite_master;
71b900aaf3Sdrh    }
72b900aaf3Sdrh    sqlite3_step $::STMT
73b900aaf3Sdrh  } {SQLITE_ROW}
74b900aaf3Sdrh  do_test schema2-2.2 {
75b900aaf3Sdrh    sqlite3_finalize $::STMT
76b900aaf3Sdrh  } {SQLITE_OK}
77b900aaf3Sdrh  do_test schema2-2.3 {
78b900aaf3Sdrh    set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
79b900aaf3Sdrh    execsql {
80b900aaf3Sdrh      DROP VIEW v1;
81b900aaf3Sdrh    }
82b900aaf3Sdrh    sqlite3_step $::STMT
83b900aaf3Sdrh  } {SQLITE_DONE}
84b900aaf3Sdrh  do_test schema2-2.4 {
85b900aaf3Sdrh    sqlite3_finalize $::STMT
86b900aaf3Sdrh  } {SQLITE_OK}
87b900aaf3Sdrh}
88b900aaf3Sdrh
89b900aaf3Sdrhifcapable trigger {
90b900aaf3Sdrh  do_test schema2-3.1 {
91b900aaf3Sdrh    execsql {
92b900aaf3Sdrh      CREATE TABLE abc(a, b, c);
93b900aaf3Sdrh    }
94b900aaf3Sdrh    set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
95b900aaf3Sdrh    execsql {
96b900aaf3Sdrh      CREATE TRIGGER abc_trig AFTER INSERT ON abc BEGIN
97b900aaf3Sdrh        SELECT 1, 2, 3;
98b900aaf3Sdrh      END;
99b900aaf3Sdrh    }
100b900aaf3Sdrh    sqlite3_step $::STMT
101b900aaf3Sdrh  } {SQLITE_ROW}
102b900aaf3Sdrh  do_test schema2-3.2 {
103b900aaf3Sdrh    sqlite3_finalize $::STMT
104b900aaf3Sdrh  } {SQLITE_OK}
105b900aaf3Sdrh  do_test schema2-3.3 {
106b900aaf3Sdrh    set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
107b900aaf3Sdrh    execsql {
108b900aaf3Sdrh      DROP TRIGGER abc_trig;
109b900aaf3Sdrh    }
110b900aaf3Sdrh    sqlite3_step $::STMT
111b900aaf3Sdrh  } {SQLITE_ROW}
112b900aaf3Sdrh  do_test schema2-3.4 {
113b900aaf3Sdrh    sqlite3_finalize $::STMT
114b900aaf3Sdrh  } {SQLITE_OK}
115b900aaf3Sdrh}
116b900aaf3Sdrh
117b900aaf3Sdrhdo_test schema2-4.1 {
118b900aaf3Sdrh  catchsql {
119b900aaf3Sdrh    CREATE TABLE abc(a, b, c);
120b900aaf3Sdrh  }
121b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
122b900aaf3Sdrh  execsql {
123b900aaf3Sdrh    CREATE INDEX abc_index ON abc(a);
124b900aaf3Sdrh  }
125b900aaf3Sdrh  sqlite3_step $::STMT
126b900aaf3Sdrh} {SQLITE_ROW}
127b900aaf3Sdrhdo_test schema2-4.2 {
128b900aaf3Sdrh  sqlite3_finalize $::STMT
129b900aaf3Sdrh} {SQLITE_OK}
130b900aaf3Sdrhdo_test schema2-4.3 {
131b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
132b900aaf3Sdrh  execsql {
133b900aaf3Sdrh    DROP INDEX abc_index;
134b900aaf3Sdrh  }
135b900aaf3Sdrh  sqlite3_step $::STMT
136b900aaf3Sdrh} {SQLITE_ROW}
137b900aaf3Sdrhdo_test schema2-4.4 {
138b900aaf3Sdrh  sqlite3_finalize $::STMT
139b900aaf3Sdrh} {SQLITE_OK}
140b900aaf3Sdrh
141b900aaf3Sdrh#---------------------------------------------------------------------
142b900aaf3Sdrh# Tests 5.1 to 5.4 check that prepared statements are invalidated when
143b900aaf3Sdrh# a database is DETACHed (but not when one is ATTACHed).
144b900aaf3Sdrh#
1455a8f9374Sdanielk1977ifcapable attach {
146b900aaf3Sdrh  do_test schema2-5.1 {
147b900aaf3Sdrh    set sql {SELECT * FROM abc;}
148b900aaf3Sdrh    set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
149b900aaf3Sdrh    execsql {
150b900aaf3Sdrh      ATTACH 'test2.db' AS aux;
151b900aaf3Sdrh    }
152b900aaf3Sdrh    sqlite3_step $::STMT
153b900aaf3Sdrh  } {SQLITE_DONE}
154b900aaf3Sdrh  do_test schema2-5.2 {
155b900aaf3Sdrh    sqlite3_reset $::STMT
156b900aaf3Sdrh  } {SQLITE_OK}
157b900aaf3Sdrh  do_test schema2-5.3 {
158b900aaf3Sdrh    execsql {
159b900aaf3Sdrh      DETACH aux;
160b900aaf3Sdrh    }
161b900aaf3Sdrh    sqlite3_step $::STMT
162b900aaf3Sdrh  } {SQLITE_DONE}
163b900aaf3Sdrh  do_test schema2-5.4 {
164b900aaf3Sdrh    sqlite3_finalize $::STMT
165b900aaf3Sdrh  } {SQLITE_OK}
1665a8f9374Sdanielk1977}
167b900aaf3Sdrh
168b900aaf3Sdrh#---------------------------------------------------------------------
169b900aaf3Sdrh# Tests 6.* check that prepared statements are invalidated when
170b900aaf3Sdrh# a user-function is deleted (but not when one is added).
171b900aaf3Sdrhdo_test schema2-6.1 {
172b900aaf3Sdrh  set sql {SELECT * FROM abc;}
173b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
174b900aaf3Sdrh  db function hello_function {}
175b900aaf3Sdrh  sqlite3_step $::STMT
176b900aaf3Sdrh} {SQLITE_DONE}
177b900aaf3Sdrhdo_test schema2-6.2 {
178b900aaf3Sdrh  sqlite3_reset $::STMT
179b900aaf3Sdrh} {SQLITE_OK}
180b900aaf3Sdrhdo_test schema2-6.3 {
181b900aaf3Sdrh  sqlite_delete_function $::DB hello_function
182b900aaf3Sdrh  sqlite3_step $::STMT
183b900aaf3Sdrh} {SQLITE_DONE}
184b900aaf3Sdrhdo_test schema2-6.4 {
185b900aaf3Sdrh  sqlite3_finalize $::STMT
186b900aaf3Sdrh} {SQLITE_OK}
187b900aaf3Sdrh
188b900aaf3Sdrh#---------------------------------------------------------------------
189b900aaf3Sdrh# Tests 7.* check that prepared statements are invalidated when
190b900aaf3Sdrh# a collation sequence is deleted (but not when one is added).
191b900aaf3Sdrh#
192b900aaf3Sdrhifcapable utf16 {
193b900aaf3Sdrh  do_test schema2-7.1 {
194b900aaf3Sdrh    set sql {SELECT * FROM abc;}
195b900aaf3Sdrh    set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
196b900aaf3Sdrh    add_test_collate $::DB 1 1 1
197b900aaf3Sdrh    sqlite3_step $::STMT
198b900aaf3Sdrh  } {SQLITE_DONE}
199b900aaf3Sdrh  do_test schema2-7.2 {
200b900aaf3Sdrh    sqlite3_reset $::STMT
201b900aaf3Sdrh  } {SQLITE_OK}
202b900aaf3Sdrh  do_test schema2-7.3 {
203b900aaf3Sdrh    add_test_collate $::DB 0 0 0
204b900aaf3Sdrh    sqlite3_step $::STMT
205b900aaf3Sdrh  } {SQLITE_DONE}
206b900aaf3Sdrh  do_test schema2-7.4 {
207b900aaf3Sdrh    sqlite3_finalize $::STMT
208b900aaf3Sdrh  } {SQLITE_OK}
209b900aaf3Sdrh}
210b900aaf3Sdrh
211b900aaf3Sdrh#---------------------------------------------------------------------
212b900aaf3Sdrh# Tests 8.1 and 8.2 check that prepared statements are invalidated when
213b900aaf3Sdrh# the authorization function is set.
214b900aaf3Sdrh#
215b900aaf3Sdrhifcapable auth {
216b900aaf3Sdrh  do_test schema2-8.1 {
217b900aaf3Sdrh    set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL]
218b900aaf3Sdrh    db auth {}
219b900aaf3Sdrh    sqlite3_step $::STMT
220b900aaf3Sdrh  } {SQLITE_ROW}
221b900aaf3Sdrh  do_test schema2-8.3 {
222b900aaf3Sdrh    sqlite3_finalize $::STMT
223b900aaf3Sdrh  } {SQLITE_OK}
224b900aaf3Sdrh}
225b900aaf3Sdrh
226b900aaf3Sdrh#---------------------------------------------------------------------
227b900aaf3Sdrh# schema2-9.1: Test that if a table is dropped by one database connection,
228b900aaf3Sdrh#             other database connections are aware of the schema change.
229b900aaf3Sdrh# schema2-9.2: Test that if a view is dropped by one database connection,
230b900aaf3Sdrh#             other database connections are aware of the schema change.
231b900aaf3Sdrh#
232b900aaf3Sdrhdo_test schema2-9.1 {
233b900aaf3Sdrh  sqlite3 db2 test.db
234b900aaf3Sdrh  execsql {
235b900aaf3Sdrh    DROP TABLE abc;
236b900aaf3Sdrh  } db2
237b900aaf3Sdrh  db2 close
238b900aaf3Sdrh  catchsql {
239b900aaf3Sdrh    SELECT * FROM abc;
240b900aaf3Sdrh  }
241b900aaf3Sdrh} {1 {no such table: abc}}
242b900aaf3Sdrhexecsql {
243b900aaf3Sdrh  CREATE TABLE abc(a, b, c);
244b900aaf3Sdrh}
245b900aaf3Sdrhifcapable view {
246b900aaf3Sdrh  do_test schema2-9.2 {
247b900aaf3Sdrh    execsql {
248b900aaf3Sdrh      CREATE VIEW abcview AS SELECT * FROM abc;
249b900aaf3Sdrh    }
250b900aaf3Sdrh    sqlite3 db2 test.db
251b900aaf3Sdrh    execsql {
252b900aaf3Sdrh      DROP VIEW abcview;
253b900aaf3Sdrh    } db2
254b900aaf3Sdrh    db2 close
255b900aaf3Sdrh    catchsql {
256b900aaf3Sdrh      SELECT * FROM abcview;
257b900aaf3Sdrh    }
258b900aaf3Sdrh  } {1 {no such table: abcview}}
259b900aaf3Sdrh}
260b900aaf3Sdrh
261b900aaf3Sdrh#---------------------------------------------------------------------
262b900aaf3Sdrh# Test that if a CREATE TABLE statement fails because there are other
263b900aaf3Sdrh# btree cursors open on the same database file it does not corrupt
264b900aaf3Sdrh# the sqlite_master table.
265b900aaf3Sdrh#
266b7af4452Sdrh# 2007-05-02: These tests have been overcome by events.  Open btree
267b7af4452Sdrh# cursors no longer block CREATE TABLE.  But there is no reason not
268b7af4452Sdrh# to keep the tests in the test suite.
269b7af4452Sdrh#
270b900aaf3Sdrhdo_test schema2-10.1 {
271b900aaf3Sdrh  execsql {
272b900aaf3Sdrh    INSERT INTO abc VALUES(1, 2, 3);
273b900aaf3Sdrh  }
274b900aaf3Sdrh  set sql {SELECT * FROM abc}
275b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
276b900aaf3Sdrh  sqlite3_step $::STMT
277b900aaf3Sdrh} {SQLITE_ROW}
278b900aaf3Sdrhdo_test schema2-10.2 {
279b900aaf3Sdrh  catchsql {
280b900aaf3Sdrh    CREATE TABLE t2(a, b, c);
281b900aaf3Sdrh  }
282b7af4452Sdrh} {0 {}}
283b900aaf3Sdrhdo_test schema2-10.3 {
284b900aaf3Sdrh  sqlite3_finalize $::STMT
285b900aaf3Sdrh} {SQLITE_OK}
286b900aaf3Sdrhdo_test schema2-10.4 {
287b900aaf3Sdrh  sqlite3 db2 test.db
288b900aaf3Sdrh  execsql {
289b900aaf3Sdrh    SELECT * FROM abc
290b900aaf3Sdrh  } db2
291b900aaf3Sdrh} {1 2 3}
292b900aaf3Sdrhdo_test schema2-10.5 {
293b900aaf3Sdrh  db2 close
294b900aaf3Sdrh} {}
295b900aaf3Sdrh
296b900aaf3Sdrh#---------------------------------------------------------------------
297b900aaf3Sdrh# Attempting to delete or replace a user-function or collation sequence
298b900aaf3Sdrh# while there are active statements returns an SQLITE_BUSY error.
299b900aaf3Sdrh#
300b900aaf3Sdrh# schema2-11.1 - 11.4: User function.
301b900aaf3Sdrh# schema2-11.5 - 11.8: Collation sequence.
302b900aaf3Sdrh#
303b900aaf3Sdrhdo_test schema2-11.1 {
304b900aaf3Sdrh  db function tstfunc {}
305b900aaf3Sdrh  set sql {SELECT * FROM abc}
306b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
307b900aaf3Sdrh  sqlite3_step $::STMT
308b900aaf3Sdrh} {SQLITE_ROW}
309b900aaf3Sdrhdo_test schema2-11.2 {
310b900aaf3Sdrh  sqlite_delete_function $::DB tstfunc
311b900aaf3Sdrh} {SQLITE_BUSY}
312b900aaf3Sdrhdo_test schema2-11.3 {
313b900aaf3Sdrh  set rc [catch {
314b900aaf3Sdrh    db function tstfunc {}
315b900aaf3Sdrh  } msg]
316b900aaf3Sdrh  list $rc $msg
317*b309becdSdrh} {1 {unable to delete/modify user-function due to active statements}}
318b900aaf3Sdrhdo_test schema2-11.4 {
319b900aaf3Sdrh  sqlite3_finalize $::STMT
320b900aaf3Sdrh} {SQLITE_OK}
321b900aaf3Sdrhdo_test schema2-11.5 {
322b900aaf3Sdrh  db collate tstcollate {}
323b900aaf3Sdrh  set sql {SELECT * FROM abc}
324b900aaf3Sdrh  set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL]
325b900aaf3Sdrh  sqlite3_step $::STMT
326b900aaf3Sdrh} {SQLITE_ROW}
327b900aaf3Sdrhdo_test schema2-11.6 {
328b900aaf3Sdrh  sqlite_delete_collation $::DB tstcollate
329b900aaf3Sdrh} {SQLITE_BUSY}
330b900aaf3Sdrhdo_test schema2-11.7 {
331b900aaf3Sdrh  set rc [catch {
332b900aaf3Sdrh    db collate tstcollate {}
333b900aaf3Sdrh  } msg]
334b900aaf3Sdrh  list $rc $msg
335*b309becdSdrh} {1 {unable to delete/modify collation sequence due to active statements}}
336b900aaf3Sdrhdo_test schema2-11.8 {
337b900aaf3Sdrh  sqlite3_finalize $::STMT
338b900aaf3Sdrh} {SQLITE_OK}
339b900aaf3Sdrh
340b900aaf3Sdrhfinish_test
341