blob: a4e9858fe27538ff7b6fd439f88a08f7cd13cf49 [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drh348784e2000-05-29 20:41:49 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drh348784e2000-05-29 20:41:49 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# 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.
drh348784e2000-05-29 20:41:49 +00009#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The
12# focus of this file is testing the CREATE TABLE statement.
13#
drha6370df2006-01-04 21:40:06 +000014# $Id: table.test,v 1.44 2006/01/04 21:40:07 drh Exp $
drh348784e2000-05-29 20:41:49 +000015
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# Create a basic table and verify it is added to sqlite_master
20#
drh1b6a71f2000-05-29 23:58:11 +000021do_test table-1.1 {
drh348784e2000-05-29 20:41:49 +000022 execsql {
23 CREATE TABLE test1 (
24 one varchar(10),
25 two text
26 )
27 }
28 execsql {
drh28037572000-08-02 13:47:41 +000029 SELECT sql FROM sqlite_master WHERE type!='meta'
drh348784e2000-05-29 20:41:49 +000030 }
31} {{CREATE TABLE test1 (
32 one varchar(10),
33 two text
34 )}}
35
drh348784e2000-05-29 20:41:49 +000036
37# Verify the other fields of the sqlite_master file.
38#
drh1b6a71f2000-05-29 23:58:11 +000039do_test table-1.3 {
drh28037572000-08-02 13:47:41 +000040 execsql {SELECT name, tbl_name, type FROM sqlite_master WHERE type!='meta'}
drh348784e2000-05-29 20:41:49 +000041} {test1 test1 table}
42
43# Close and reopen the database. Verify that everything is
44# still the same.
45#
drh1b6a71f2000-05-29 23:58:11 +000046do_test table-1.4 {
drh348784e2000-05-29 20:41:49 +000047 db close
drhef4ac8f2004-06-19 00:16:31 +000048 sqlite3 db test.db
drh28037572000-08-02 13:47:41 +000049 execsql {SELECT name, tbl_name, type from sqlite_master WHERE type!='meta'}
drh348784e2000-05-29 20:41:49 +000050} {test1 test1 table}
51
52# Drop the database and make sure it disappears.
53#
drh1b6a71f2000-05-29 23:58:11 +000054do_test table-1.5 {
drh348784e2000-05-29 20:41:49 +000055 execsql {DROP TABLE test1}
drh28037572000-08-02 13:47:41 +000056 execsql {SELECT * FROM sqlite_master WHERE type!='meta'}
drh348784e2000-05-29 20:41:49 +000057} {}
58
drh348784e2000-05-29 20:41:49 +000059# Close and reopen the database. Verify that the table is
60# still gone.
61#
drh1b6a71f2000-05-29 23:58:11 +000062do_test table-1.6 {
drh348784e2000-05-29 20:41:49 +000063 db close
drhef4ac8f2004-06-19 00:16:31 +000064 sqlite3 db test.db
drh28037572000-08-02 13:47:41 +000065 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh348784e2000-05-29 20:41:49 +000066} {}
67
drh982cef72000-05-30 16:27:03 +000068# Repeat the above steps, but this time quote the table name.
69#
70do_test table-1.10 {
71 execsql {CREATE TABLE "create" (f1 int)}
drh28037572000-08-02 13:47:41 +000072 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh982cef72000-05-30 16:27:03 +000073} {create}
74do_test table-1.11 {
75 execsql {DROP TABLE "create"}
drh28037572000-08-02 13:47:41 +000076 execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
drh982cef72000-05-30 16:27:03 +000077} {}
78do_test table-1.12 {
79 execsql {CREATE TABLE test1("f1 ho" int)}
drh28037572000-08-02 13:47:41 +000080 execsql {SELECT name as "X" FROM sqlite_master WHERE type!='meta'}
drh982cef72000-05-30 16:27:03 +000081} {test1}
82do_test table-1.13 {
83 execsql {DROP TABLE "TEST1"}
drh28037572000-08-02 13:47:41 +000084 execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
drh982cef72000-05-30 16:27:03 +000085} {}
86
87
drhb24fcbe2000-05-29 23:30:50 +000088
89# Verify that we cannot make two tables with the same name
90#
drh1b6a71f2000-05-29 23:58:11 +000091do_test table-2.1 {
drh4cfa7932000-06-08 15:10:46 +000092 execsql {CREATE TABLE TEST2(one text)}
drh42b9d7c2005-08-13 00:56:27 +000093 catchsql {CREATE TABLE test2(two text default 'hi')}
drh1d37e282000-05-30 03:12:21 +000094} {1 {table test2 already exists}}
drh1b6a71f2000-05-29 23:58:11 +000095do_test table-2.1b {
drhb24fcbe2000-05-29 23:30:50 +000096 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
97 lappend v $msg
danielk1977d8123362004-06-12 09:25:12 +000098} {1 {object name reserved for internal use: sqlite_master}}
drh1b6a71f2000-05-29 23:58:11 +000099do_test table-2.1c {
drhb24fcbe2000-05-29 23:30:50 +0000100 db close
drhef4ac8f2004-06-19 00:16:31 +0000101 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000102 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
103 lappend v $msg
danielk1977d8123362004-06-12 09:25:12 +0000104} {1 {object name reserved for internal use: sqlite_master}}
drh1b6a71f2000-05-29 23:58:11 +0000105do_test table-2.1d {
drhfaa59552005-12-29 23:33:54 +0000106 catchsql {CREATE TABLE IF NOT EXISTS test2(x,y)}
107} {0 {}}
108do_test table-2.1e {
drha6370df2006-01-04 21:40:06 +0000109 catchsql {CREATE TABLE IF NOT EXISTS test2(x UNIQUE, y TEXT PRIMARY KEY)}
110} {0 {}}
111do_test table-2.1f {
drh28037572000-08-02 13:47:41 +0000112 execsql {DROP TABLE test2; SELECT name FROM sqlite_master WHERE type!='meta'}
drhb24fcbe2000-05-29 23:30:50 +0000113} {}
114
115# Verify that we cannot make a table with the same name as an index
116#
drhdcc581c2000-05-30 13:44:19 +0000117do_test table-2.2a {
drhb24fcbe2000-05-29 23:30:50 +0000118 execsql {CREATE TABLE test2(one text); CREATE INDEX test3 ON test2(one)}
119 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
120 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000121} {1 {there is already an index named test3}}
drh1b6a71f2000-05-29 23:58:11 +0000122do_test table-2.2b {
drhb24fcbe2000-05-29 23:30:50 +0000123 db close
drhef4ac8f2004-06-19 00:16:31 +0000124 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000125 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
126 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000127} {1 {there is already an index named test3}}
drh1b6a71f2000-05-29 23:58:11 +0000128do_test table-2.2c {
drh3fc190c2001-09-14 03:24:23 +0000129 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
130} {test2 test3}
131do_test table-2.2d {
drhb24fcbe2000-05-29 23:30:50 +0000132 execsql {DROP INDEX test3}
133 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
134 lappend v $msg
135} {0 {}}
drh3fc190c2001-09-14 03:24:23 +0000136do_test table-2.2e {
drh28037572000-08-02 13:47:41 +0000137 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000138} {test2 test3}
drh3fc190c2001-09-14 03:24:23 +0000139do_test table-2.2f {
drhb24fcbe2000-05-29 23:30:50 +0000140 execsql {DROP TABLE test2; DROP TABLE test3}
drh28037572000-08-02 13:47:41 +0000141 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000142} {}
143
144# Create a table with many field names
145#
146set big_table \
147{CREATE TABLE big(
148 f1 varchar(20),
149 f2 char(10),
drhdcc581c2000-05-30 13:44:19 +0000150 f3 varchar(30) primary key,
drhb24fcbe2000-05-29 23:30:50 +0000151 f4 text,
152 f5 text,
153 f6 text,
154 f7 text,
155 f8 text,
156 f9 text,
157 f10 text,
158 f11 text,
159 f12 text,
160 f13 text,
161 f14 text,
162 f15 text,
163 f16 text,
164 f17 text,
165 f18 text,
166 f19 text,
167 f20 text
168)}
drh1b6a71f2000-05-29 23:58:11 +0000169do_test table-3.1 {
drhb24fcbe2000-05-29 23:30:50 +0000170 execsql $big_table
drhadbca9c2001-09-27 15:11:53 +0000171 execsql {SELECT sql FROM sqlite_master WHERE type=='table'}
drhb24fcbe2000-05-29 23:30:50 +0000172} \{$big_table\}
drh1b6a71f2000-05-29 23:58:11 +0000173do_test table-3.2 {
drhb24fcbe2000-05-29 23:30:50 +0000174 set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg]
175 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000176} {1 {table BIG already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000177do_test table-3.3 {
drhb24fcbe2000-05-29 23:30:50 +0000178 set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg]
179 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000180} {1 {table biG already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000181do_test table-3.4 {
drhb24fcbe2000-05-29 23:30:50 +0000182 set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
183 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000184} {1 {table bIg already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000185do_test table-3.5 {
drhb24fcbe2000-05-29 23:30:50 +0000186 db close
drhef4ac8f2004-06-19 00:16:31 +0000187 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000188 set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
189 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000190} {1 {table Big already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000191do_test table-3.6 {
drhb24fcbe2000-05-29 23:30:50 +0000192 execsql {DROP TABLE big}
drh28037572000-08-02 13:47:41 +0000193 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drhb24fcbe2000-05-29 23:30:50 +0000194} {}
195
196# Try creating large numbers of tables
197#
198set r {}
199for {set i 1} {$i<=100} {incr i} {
drha9e99ae2002-08-13 23:02:57 +0000200 lappend r [format test%03d $i]
drhb24fcbe2000-05-29 23:30:50 +0000201}
drh1b6a71f2000-05-29 23:58:11 +0000202do_test table-4.1 {
drhb24fcbe2000-05-29 23:30:50 +0000203 for {set i 1} {$i<=100} {incr i} {
drha9e99ae2002-08-13 23:02:57 +0000204 set sql "CREATE TABLE [format test%03d $i] ("
drhb24fcbe2000-05-29 23:30:50 +0000205 for {set k 1} {$k<$i} {incr k} {
206 append sql "field$k text,"
207 }
208 append sql "last_field text)"
209 execsql $sql
210 }
drh28037572000-08-02 13:47:41 +0000211 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000212} $r
drh1b6a71f2000-05-29 23:58:11 +0000213do_test table-4.1b {
drhb24fcbe2000-05-29 23:30:50 +0000214 db close
drhef4ac8f2004-06-19 00:16:31 +0000215 sqlite3 db test.db
drh28037572000-08-02 13:47:41 +0000216 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000217} $r
218
drhc4a3c772001-04-04 11:48:57 +0000219# Drop the even numbered tables
drhb24fcbe2000-05-29 23:30:50 +0000220#
221set r {}
222for {set i 1} {$i<=100} {incr i 2} {
drha9e99ae2002-08-13 23:02:57 +0000223 lappend r [format test%03d $i]
drhb24fcbe2000-05-29 23:30:50 +0000224}
drh1b6a71f2000-05-29 23:58:11 +0000225do_test table-4.2 {
drhb24fcbe2000-05-29 23:30:50 +0000226 for {set i 2} {$i<=100} {incr i 2} {
drh428ae8c2003-01-04 16:48:09 +0000227 # if {$i==38} {execsql {pragma vdbe_trace=on}}
drha9e99ae2002-08-13 23:02:57 +0000228 set sql "DROP TABLE [format TEST%03d $i]"
drhb24fcbe2000-05-29 23:30:50 +0000229 execsql $sql
230 }
drh28037572000-08-02 13:47:41 +0000231 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000232} $r
drh3fc190c2001-09-14 03:24:23 +0000233#exit
drhb24fcbe2000-05-29 23:30:50 +0000234
235# Drop the odd number tables
236#
drh1b6a71f2000-05-29 23:58:11 +0000237do_test table-4.3 {
drhb24fcbe2000-05-29 23:30:50 +0000238 for {set i 1} {$i<=100} {incr i 2} {
drha9e99ae2002-08-13 23:02:57 +0000239 set sql "DROP TABLE [format test%03d $i]"
drhb24fcbe2000-05-29 23:30:50 +0000240 execsql $sql
241 }
drh28037572000-08-02 13:47:41 +0000242 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000243} {}
244
drh1b6a71f2000-05-29 23:58:11 +0000245# Try to drop a table that does not exist
246#
drha0733842005-12-29 01:11:36 +0000247do_test table-5.1.1 {
248 catchsql {DROP TABLE test009}
drha9e99ae2002-08-13 23:02:57 +0000249} {1 {no such table: test009}}
drha0733842005-12-29 01:11:36 +0000250do_test table-5.1.2 {
251 catchsql {DROP TABLE IF EXISTS test009}
252} {0 {}}
drh1b6a71f2000-05-29 23:58:11 +0000253
254# Try to drop sqlite_master
255#
256do_test table-5.2 {
drha0733842005-12-29 01:11:36 +0000257 catchsql {DROP TABLE IF EXISTS sqlite_master}
drh1d37e282000-05-30 03:12:21 +0000258} {1 {table sqlite_master may not be dropped}}
drh1b6a71f2000-05-29 23:58:11 +0000259
260# Make sure an EXPLAIN does not really create a new table
261#
262do_test table-5.3 {
drh6bf89572004-11-03 16:27:01 +0000263 ifcapable {explain} {
264 execsql {EXPLAIN CREATE TABLE test1(f1 int)}
265 }
drh28037572000-08-02 13:47:41 +0000266 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh1b6a71f2000-05-29 23:58:11 +0000267} {}
268
269# Make sure an EXPLAIN does not really drop an existing table
270#
271do_test table-5.4 {
272 execsql {CREATE TABLE test1(f1 int)}
drh6bf89572004-11-03 16:27:01 +0000273 ifcapable {explain} {
274 execsql {EXPLAIN DROP TABLE test1}
275 }
drh28037572000-08-02 13:47:41 +0000276 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh1b6a71f2000-05-29 23:58:11 +0000277} {test1}
278
drh4cfa7932000-06-08 15:10:46 +0000279# Create a table with a goofy name
280#
drh3fc190c2001-09-14 03:24:23 +0000281#do_test table-6.1 {
282# execsql {CREATE TABLE 'Spaces In This Name!'(x int)}
283# execsql {INSERT INTO 'spaces in this name!' VALUES(1)}
284# set list [glob -nocomplain testdb/spaces*.tbl]
285#} {testdb/spaces+in+this+name+.tbl}
drh4cfa7932000-06-08 15:10:46 +0000286
drhc4a3c772001-04-04 11:48:57 +0000287# Try using keywords as table names or column names.
288#
289do_test table-7.1 {
290 set v [catch {execsql {
291 CREATE TABLE weird(
292 desc text,
293 asc text,
drh6bf89572004-11-03 16:27:01 +0000294 key int,
drh17f71932002-02-21 12:01:27 +0000295 [14_vac] boolean,
296 fuzzy_dog_12 varchar(10),
drhd4007282001-04-12 23:21:58 +0000297 begin blob,
298 end clob
drhc4a3c772001-04-04 11:48:57 +0000299 )
300 }} msg]
301 lappend v $msg
302} {0 {}}
303do_test table-7.2 {
304 execsql {
drhd4007282001-04-12 23:21:58 +0000305 INSERT INTO weird VALUES('a','b',9,0,'xyz','hi','y''all');
drhc4a3c772001-04-04 11:48:57 +0000306 SELECT * FROM weird;
307 }
drhd4007282001-04-12 23:21:58 +0000308} {a b 9 0 xyz hi y'all}
drhc4a3c772001-04-04 11:48:57 +0000309do_test table-7.3 {
310 execsql2 {
311 SELECT * FROM weird;
312 }
drh6bf89572004-11-03 16:27:01 +0000313} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
drhc4a3c772001-04-04 11:48:57 +0000314
drh969fa7c2002-02-18 18:30:32 +0000315# Try out the CREATE TABLE AS syntax
316#
317do_test table-8.1 {
318 execsql2 {
319 CREATE TABLE t2 AS SELECT * FROM weird;
320 SELECT * FROM t2;
321 }
drh6bf89572004-11-03 16:27:01 +0000322} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
drh17f71932002-02-21 12:01:27 +0000323do_test table-8.1.1 {
324 execsql {
325 SELECT sql FROM sqlite_master WHERE name='t2';
326 }
327} {{CREATE TABLE t2(
drh234c39d2004-07-24 03:30:47 +0000328 "desc" text,
329 "asc" text,
drh6bf89572004-11-03 16:27:01 +0000330 "key" int,
drh234c39d2004-07-24 03:30:47 +0000331 "14_vac" boolean,
danielk1977517eb642004-06-07 10:00:31 +0000332 fuzzy_dog_12 varchar(10),
drh234c39d2004-07-24 03:30:47 +0000333 "begin" blob,
334 "end" clob
drh17f71932002-02-21 12:01:27 +0000335)}}
drh969fa7c2002-02-18 18:30:32 +0000336do_test table-8.2 {
337 execsql {
drh234c39d2004-07-24 03:30:47 +0000338 CREATE TABLE "t3""xyz"(a,b,c);
339 INSERT INTO [t3"xyz] VALUES(1,2,3);
340 SELECT * FROM [t3"xyz];
drh969fa7c2002-02-18 18:30:32 +0000341 }
342} {1 2 3}
343do_test table-8.3 {
344 execsql2 {
drh234c39d2004-07-24 03:30:47 +0000345 CREATE TABLE [t4"abc] AS SELECT count(*) as cnt, max(b+c) FROM [t3"xyz];
346 SELECT * FROM [t4"abc];
drh969fa7c2002-02-18 18:30:32 +0000347 }
drh17f71932002-02-21 12:01:27 +0000348} {cnt 1 max(b+c) 5}
danielk197700e279d2004-06-21 07:36:32 +0000349
350# Update for v3: The declaration type of anything except a column is now a
351# NULL pointer, so the created table has no column types. (Changed result
drh234c39d2004-07-24 03:30:47 +0000352# from {{CREATE TABLE 't4"abc'(cnt NUMERIC,"max(b+c)" NUMERIC)}}).
drh17f71932002-02-21 12:01:27 +0000353do_test table-8.3.1 {
354 execsql {
drh234c39d2004-07-24 03:30:47 +0000355 SELECT sql FROM sqlite_master WHERE name='t4"abc'
drh17f71932002-02-21 12:01:27 +0000356 }
drh234c39d2004-07-24 03:30:47 +0000357} {{CREATE TABLE "t4""abc"(cnt,"max(b+c)")}}
danielk197753c0f742005-03-29 03:10:59 +0000358
359ifcapable tempdb {
360 do_test table-8.4 {
361 execsql2 {
362 CREATE TEMPORARY TABLE t5 AS SELECT count(*) AS [y'all] FROM [t3"xyz];
363 SELECT * FROM t5;
364 }
365 } {y'all 1}
366}
367
drh969fa7c2002-02-18 18:30:32 +0000368do_test table-8.5 {
369 db close
drhef4ac8f2004-06-19 00:16:31 +0000370 sqlite3 db test.db
drh969fa7c2002-02-18 18:30:32 +0000371 execsql2 {
drh234c39d2004-07-24 03:30:47 +0000372 SELECT * FROM [t4"abc];
drh969fa7c2002-02-18 18:30:32 +0000373 }
drh17f71932002-02-21 12:01:27 +0000374} {cnt 1 max(b+c) 5}
drh969fa7c2002-02-18 18:30:32 +0000375do_test table-8.6 {
376 execsql2 {
377 SELECT * FROM t2;
378 }
drh6bf89572004-11-03 16:27:01 +0000379} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
drh969fa7c2002-02-18 18:30:32 +0000380do_test table-8.7 {
381 catchsql {
382 SELECT * FROM t5;
383 }
384} {1 {no such table: t5}}
drh17f71932002-02-21 12:01:27 +0000385do_test table-8.8 {
386 catchsql {
387 CREATE TABLE t5 AS SELECT * FROM no_such_table;
388 }
389} {1 {no such table: no_such_table}}
drh969fa7c2002-02-18 18:30:32 +0000390
drh97fc3d02002-05-22 21:27:03 +0000391# Make sure we cannot have duplicate column names within a table.
392#
393do_test table-9.1 {
394 catchsql {
395 CREATE TABLE t6(a,b,a);
396 }
397} {1 {duplicate column name: a}}
drhd8919672005-09-10 15:35:06 +0000398do_test table-9.2 {
399 catchsql {
400 CREATE TABLE t6(a varchar(100), b blob, a integer);
401 }
402} {1 {duplicate column name: a}}
drh97fc3d02002-05-22 21:27:03 +0000403
drh04738cb2002-06-02 18:19:00 +0000404# Check the foreign key syntax.
405#
drh6bf89572004-11-03 16:27:01 +0000406ifcapable {foreignkey} {
drh04738cb2002-06-02 18:19:00 +0000407do_test table-10.1 {
408 catchsql {
409 CREATE TABLE t6(a REFERENCES t4(a) NOT NULL);
410 INSERT INTO t6 VALUES(NULL);
411 }
drh483750b2003-01-29 18:46:51 +0000412} {1 {t6.a may not be NULL}}
drh04738cb2002-06-02 18:19:00 +0000413do_test table-10.2 {
414 catchsql {
415 DROP TABLE t6;
416 CREATE TABLE t6(a REFERENCES t4(a) MATCH PARTIAL);
417 }
418} {0 {}}
419do_test table-10.3 {
420 catchsql {
421 DROP TABLE t6;
422 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON DELETE SET NULL NOT NULL);
423 }
424} {0 {}}
425do_test table-10.4 {
426 catchsql {
427 DROP TABLE t6;
428 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON UPDATE SET DEFAULT DEFAULT 1);
429 }
430} {0 {}}
431do_test table-10.5 {
432 catchsql {
433 DROP TABLE t6;
434 CREATE TABLE t6(a NOT NULL NOT DEFERRABLE INITIALLY IMMEDIATE);
435 }
436} {0 {}}
437do_test table-10.6 {
438 catchsql {
439 DROP TABLE t6;
440 CREATE TABLE t6(a NOT NULL DEFERRABLE INITIALLY DEFERRED);
441 }
442} {0 {}}
443do_test table-10.7 {
444 catchsql {
445 DROP TABLE t6;
446 CREATE TABLE t6(a,
447 FOREIGN KEY (a) REFERENCES t4(b) DEFERRABLE INITIALLY DEFERRED
448 );
449 }
450} {0 {}}
451do_test table-10.8 {
452 catchsql {
453 DROP TABLE t6;
454 CREATE TABLE t6(a,b,c,
455 FOREIGN KEY (b,c) REFERENCES t4(x,y) MATCH PARTIAL
456 ON UPDATE SET NULL ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
457 );
458 }
459} {0 {}}
drhc2eef3b2002-08-31 18:53:06 +0000460do_test table-10.9 {
461 catchsql {
462 DROP TABLE t6;
463 CREATE TABLE t6(a,b,c,
464 FOREIGN KEY (b,c) REFERENCES t4(x)
465 );
466 }
467} {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
468do_test table-10.10 {
469 catchsql {DROP TABLE t6}
470 catchsql {
471 CREATE TABLE t6(a,b,c,
472 FOREIGN KEY (b,c) REFERENCES t4(x,y,z)
473 );
474 }
475} {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
476do_test table-10.11 {
477 catchsql {DROP TABLE t6}
478 catchsql {
479 CREATE TABLE t6(a,b, c REFERENCES t4(x,y));
480 }
481} {1 {foreign key on c should reference only one column of table t4}}
482do_test table-10.12 {
483 catchsql {DROP TABLE t6}
484 catchsql {
485 CREATE TABLE t6(a,b,c,
486 FOREIGN KEY (b,x) REFERENCES t4(x,y)
487 );
488 }
489} {1 {unknown column "x" in foreign key definition}}
490do_test table-10.13 {
491 catchsql {DROP TABLE t6}
492 catchsql {
493 CREATE TABLE t6(a,b,c,
494 FOREIGN KEY (x,b) REFERENCES t4(x,y)
495 );
496 }
497} {1 {unknown column "x" in foreign key definition}}
drh6bf89572004-11-03 16:27:01 +0000498} ;# endif foreignkey
drh04738cb2002-06-02 18:19:00 +0000499
danielk197735bb9d02004-05-24 12:55:54 +0000500# Test for the "typeof" function. More tests for the
501# typeof() function are found in bind.test and types.test.
drh38640e12002-07-05 21:42:36 +0000502#
503do_test table-11.1 {
504 execsql {
505 CREATE TABLE t7(
506 a integer primary key,
507 b number(5,10),
508 c character varying (8),
509 d VARCHAR(9),
510 e clob,
511 f BLOB,
512 g Text,
513 h
514 );
515 INSERT INTO t7(a) VALUES(1);
516 SELECT typeof(a), typeof(b), typeof(c), typeof(d),
517 typeof(e), typeof(f), typeof(g), typeof(h)
518 FROM t7 LIMIT 1;
519 }
danielk197735bb9d02004-05-24 12:55:54 +0000520} {integer null null null null null null null}
drh38640e12002-07-05 21:42:36 +0000521do_test table-11.2 {
522 execsql {
523 SELECT typeof(a+b), typeof(a||b), typeof(c+d), typeof(c||d)
524 FROM t7 LIMIT 1;
525 }
danielk197735bb9d02004-05-24 12:55:54 +0000526} {null null null null}
drh97fc3d02002-05-22 21:27:03 +0000527
danielk197700e279d2004-06-21 07:36:32 +0000528# Test that when creating a table using CREATE TABLE AS, column types are
529# assigned correctly for (SELECT ...) and 'x AS y' expressions.
530do_test table-12.1 {
danielk19773e8c37e2005-01-21 03:12:14 +0000531 ifcapable subquery {
532 execsql {
533 CREATE TABLE t8 AS SELECT b, h, a as i, (SELECT f FROM t7) as j FROM t7;
534 }
535 } else {
536 execsql {
537 CREATE TABLE t8 AS SELECT b, h, a as i, f as j FROM t7;
538 }
danielk197700e279d2004-06-21 07:36:32 +0000539 }
540} {}
541do_test table-12.2 {
542 execsql {
543 SELECT sql FROM sqlite_master WHERE tbl_name = 't8'
544 }
545} {{CREATE TABLE t8(b number(5,10),h,i integer,j BLOB)}}
546
danielk1977e6efa742004-11-10 11:55:10 +0000547#--------------------------------------------------------------------
548# Test cases table-13.*
549#
danielk19777977a172004-11-09 12:44:37 +0000550# Test the ability to have default values of CURRENT_TIME, CURRENT_DATE
551# and CURRENT_TIMESTAMP.
552#
553do_test table-13.1 {
554 execsql {
555 CREATE TABLE tablet8(
556 a integer primary key,
557 tm text DEFAULT CURRENT_TIME,
558 dt text DEFAULT CURRENT_DATE,
559 dttm text DEFAULT CURRENT_TIMESTAMP
560 );
561 SELECT * FROM tablet8;
562 }
563} {}
564set i 0
565foreach {date time} {
566 1976-07-04 12:00:00
567 1994-04-16 14:00:00
568 2000-01-01 00:00:00
569 2003-12-31 12:34:56
570} {
571 incr i
danielk1977e6efa742004-11-10 11:55:10 +0000572 set sqlite_current_time [clock scan "$date $time" -gmt 1]
573 # set sqlite_current_time [execsql "SELECT strftime('%s','$date $time')"]
danielk19777977a172004-11-09 12:44:37 +0000574 do_test table-13.2.$i {
575 execsql "
576 INSERT INTO tablet8(a) VALUES($i);
577 SELECT tm, dt, dttm FROM tablet8 WHERE a=$i;
578 "
579 } [list $time $date [list $date $time]]
580}
581set sqlite_current_time 0
582
danielk1977e6efa742004-11-10 11:55:10 +0000583#--------------------------------------------------------------------
584# Test cases table-14.*
585#
586# Test that a table cannot be created or dropped while other virtual
587# machines are active. This is required because otherwise when in
588# auto-vacuum mode the btree-layer may need to move the root-pages of
589# a table for which there is an open cursor.
590#
591
danielk1977a21c6b62005-01-24 10:25:59 +0000592# db eval {
593# pragma vdbe_trace = 0;
594# }
danielk1977e6efa742004-11-10 11:55:10 +0000595# Try to create a table from within a callback:
drh251b0672004-11-23 22:16:39 +0000596unset -nocomplain result
danielk1977e6efa742004-11-10 11:55:10 +0000597do_test table-14.1 {
598 set rc [
599 catch {
600 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
601 db eval {CREATE TABLE t9(a, b, c)}
602 }
603 } msg
604 ]
605 set result [list $rc $msg]
606} {1 {database table is locked}}
607
608do_test table-14.2 {
609 execsql {
610 CREATE TABLE t9(a, b, c)
611 }
612} {}
613
614# Try to drop a table from within a callback:
615do_test table-14.3 {
616 set rc [
617 catch {
618 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
619 db eval {DROP TABLE t9;}
620 }
621 } msg
622 ]
623 set result [list $rc $msg]
624} {1 {database table is locked}}
625
626# Now attach a database and ensure that a table can be created in the
627# attached database whilst in a callback from a query on the main database.
628do_test table-14.4 {
629 file delete -force test2.db
630 file delete -force test2.db-journal
631 execsql {
632 attach 'test2.db' as aux;
633 }
634 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
635 db eval {CREATE TABLE aux.t1(a, b, c)}
636 }
637} {}
638
639# On the other hand, it should be impossible to drop a table when any VMs
640# are active. This is because VerifyCookie instructions may have already
641# been executed, and btree root-pages may not move after this (which a
642# delete table might do).
643do_test table-14.4 {
644 set rc [
645 catch {
646 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
647 db eval {DROP TABLE aux.t1;}
648 }
649 } msg
650 ]
651 set result [list $rc $msg]
652} {1 {database table is locked}}
653
danielk1977ae825582004-11-23 09:06:55 +0000654# Create and drop 2000 tables. This is to check that the balance_shallow()
655# routine works correctly on the sqlite_master table. At one point it
656# contained a bug that would prevent the right-child pointer of the
657# child page from being copied to the root page.
658#
659do_test table-15.1 {
660 execsql {BEGIN}
661 for {set i 0} {$i<2000} {incr i} {
662 execsql "CREATE TABLE tbl$i (a, b, c)"
663 }
664 execsql {COMMIT}
665} {}
666do_test table-15.2 {
667 execsql {BEGIN}
668 for {set i 0} {$i<2000} {incr i} {
669 execsql "DROP TABLE tbl$i"
670 }
671 execsql {COMMIT}
672} {}
673
drh348784e2000-05-29 20:41:49 +0000674finish_test