blob: c4570088799bdd54ba03ddc170cbcb39ca6e21cd [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#
drhc4a64fa2009-05-11 20:53:28 +000014# $Id: table.test,v 1.52 2009/05/11 20:53:29 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}}
drhe4df0e72006-03-29 00:24:06 +000095do_test table-2.1.1 {
96 catchsql {CREATE TABLE "test2" (two)}
97} {1 {table "test2" already exists}}
drh1b6a71f2000-05-29 23:58:11 +000098do_test table-2.1b {
drhb24fcbe2000-05-29 23:30:50 +000099 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
100 lappend v $msg
danielk1977d8123362004-06-12 09:25:12 +0000101} {1 {object name reserved for internal use: sqlite_master}}
drh1b6a71f2000-05-29 23:58:11 +0000102do_test table-2.1c {
drhb24fcbe2000-05-29 23:30:50 +0000103 db close
drhef4ac8f2004-06-19 00:16:31 +0000104 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000105 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
106 lappend v $msg
danielk1977d8123362004-06-12 09:25:12 +0000107} {1 {object name reserved for internal use: sqlite_master}}
drh1b6a71f2000-05-29 23:58:11 +0000108do_test table-2.1d {
drhfaa59552005-12-29 23:33:54 +0000109 catchsql {CREATE TABLE IF NOT EXISTS test2(x,y)}
110} {0 {}}
111do_test table-2.1e {
drha6370df2006-01-04 21:40:06 +0000112 catchsql {CREATE TABLE IF NOT EXISTS test2(x UNIQUE, y TEXT PRIMARY KEY)}
113} {0 {}}
114do_test table-2.1f {
drh8a1e5942009-04-28 15:43:45 +0000115breakpoint
drh28037572000-08-02 13:47:41 +0000116 execsql {DROP TABLE test2; SELECT name FROM sqlite_master WHERE type!='meta'}
drhb24fcbe2000-05-29 23:30:50 +0000117} {}
118
119# Verify that we cannot make a table with the same name as an index
120#
drhdcc581c2000-05-30 13:44:19 +0000121do_test table-2.2a {
drh8a1e5942009-04-28 15:43:45 +0000122 execsql {CREATE TABLE test2(one text)}
123 execsql {CREATE INDEX test3 ON test2(one)}
124 catchsql {CREATE TABLE test3(two text)}
drh1d37e282000-05-30 03:12:21 +0000125} {1 {there is already an index named test3}}
drh1b6a71f2000-05-29 23:58:11 +0000126do_test table-2.2b {
drhb24fcbe2000-05-29 23:30:50 +0000127 db close
drhef4ac8f2004-06-19 00:16:31 +0000128 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000129 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
130 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000131} {1 {there is already an index named test3}}
drh1b6a71f2000-05-29 23:58:11 +0000132do_test table-2.2c {
drh3fc190c2001-09-14 03:24:23 +0000133 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
134} {test2 test3}
135do_test table-2.2d {
drhb24fcbe2000-05-29 23:30:50 +0000136 execsql {DROP INDEX test3}
137 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
138 lappend v $msg
139} {0 {}}
drh3fc190c2001-09-14 03:24:23 +0000140do_test table-2.2e {
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} {test2 test3}
drh3fc190c2001-09-14 03:24:23 +0000143do_test table-2.2f {
drhb24fcbe2000-05-29 23:30:50 +0000144 execsql {DROP TABLE test2; DROP TABLE test3}
drh28037572000-08-02 13:47:41 +0000145 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000146} {}
147
148# Create a table with many field names
149#
150set big_table \
151{CREATE TABLE big(
152 f1 varchar(20),
153 f2 char(10),
drhdcc581c2000-05-30 13:44:19 +0000154 f3 varchar(30) primary key,
drhb24fcbe2000-05-29 23:30:50 +0000155 f4 text,
156 f5 text,
157 f6 text,
158 f7 text,
159 f8 text,
160 f9 text,
161 f10 text,
162 f11 text,
163 f12 text,
164 f13 text,
165 f14 text,
166 f15 text,
167 f16 text,
168 f17 text,
169 f18 text,
170 f19 text,
171 f20 text
172)}
drh1b6a71f2000-05-29 23:58:11 +0000173do_test table-3.1 {
drhb24fcbe2000-05-29 23:30:50 +0000174 execsql $big_table
drhadbca9c2001-09-27 15:11:53 +0000175 execsql {SELECT sql FROM sqlite_master WHERE type=='table'}
drhb24fcbe2000-05-29 23:30:50 +0000176} \{$big_table\}
drh1b6a71f2000-05-29 23:58:11 +0000177do_test table-3.2 {
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.3 {
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.4 {
drhb24fcbe2000-05-29 23:30:50 +0000186 set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
187 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000188} {1 {table bIg already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000189do_test table-3.5 {
drhb24fcbe2000-05-29 23:30:50 +0000190 db close
drhef4ac8f2004-06-19 00:16:31 +0000191 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000192 set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
193 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000194} {1 {table Big already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000195do_test table-3.6 {
drhb24fcbe2000-05-29 23:30:50 +0000196 execsql {DROP TABLE big}
drh28037572000-08-02 13:47:41 +0000197 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drhb24fcbe2000-05-29 23:30:50 +0000198} {}
199
200# Try creating large numbers of tables
201#
202set r {}
203for {set i 1} {$i<=100} {incr i} {
drha9e99ae2002-08-13 23:02:57 +0000204 lappend r [format test%03d $i]
drhb24fcbe2000-05-29 23:30:50 +0000205}
drh1b6a71f2000-05-29 23:58:11 +0000206do_test table-4.1 {
drhb24fcbe2000-05-29 23:30:50 +0000207 for {set i 1} {$i<=100} {incr i} {
drha9e99ae2002-08-13 23:02:57 +0000208 set sql "CREATE TABLE [format test%03d $i] ("
drhb24fcbe2000-05-29 23:30:50 +0000209 for {set k 1} {$k<$i} {incr k} {
210 append sql "field$k text,"
211 }
212 append sql "last_field text)"
213 execsql $sql
214 }
drh28037572000-08-02 13:47:41 +0000215 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000216} $r
drh1b6a71f2000-05-29 23:58:11 +0000217do_test table-4.1b {
drhb24fcbe2000-05-29 23:30:50 +0000218 db close
drhef4ac8f2004-06-19 00:16:31 +0000219 sqlite3 db test.db
drh28037572000-08-02 13:47:41 +0000220 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000221} $r
222
drhc4a3c772001-04-04 11:48:57 +0000223# Drop the even numbered tables
drhb24fcbe2000-05-29 23:30:50 +0000224#
225set r {}
226for {set i 1} {$i<=100} {incr i 2} {
drha9e99ae2002-08-13 23:02:57 +0000227 lappend r [format test%03d $i]
drhb24fcbe2000-05-29 23:30:50 +0000228}
drh1b6a71f2000-05-29 23:58:11 +0000229do_test table-4.2 {
drhb24fcbe2000-05-29 23:30:50 +0000230 for {set i 2} {$i<=100} {incr i 2} {
drh428ae8c2003-01-04 16:48:09 +0000231 # if {$i==38} {execsql {pragma vdbe_trace=on}}
drha9e99ae2002-08-13 23:02:57 +0000232 set sql "DROP TABLE [format TEST%03d $i]"
drhb24fcbe2000-05-29 23:30:50 +0000233 execsql $sql
234 }
drh28037572000-08-02 13:47:41 +0000235 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000236} $r
drh3fc190c2001-09-14 03:24:23 +0000237#exit
drhb24fcbe2000-05-29 23:30:50 +0000238
239# Drop the odd number tables
240#
drh1b6a71f2000-05-29 23:58:11 +0000241do_test table-4.3 {
drhb24fcbe2000-05-29 23:30:50 +0000242 for {set i 1} {$i<=100} {incr i 2} {
drha9e99ae2002-08-13 23:02:57 +0000243 set sql "DROP TABLE [format test%03d $i]"
drhb24fcbe2000-05-29 23:30:50 +0000244 execsql $sql
245 }
drh28037572000-08-02 13:47:41 +0000246 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000247} {}
248
drh1b6a71f2000-05-29 23:58:11 +0000249# Try to drop a table that does not exist
250#
drha0733842005-12-29 01:11:36 +0000251do_test table-5.1.1 {
252 catchsql {DROP TABLE test009}
drha9e99ae2002-08-13 23:02:57 +0000253} {1 {no such table: test009}}
drha0733842005-12-29 01:11:36 +0000254do_test table-5.1.2 {
255 catchsql {DROP TABLE IF EXISTS test009}
256} {0 {}}
drh1b6a71f2000-05-29 23:58:11 +0000257
258# Try to drop sqlite_master
259#
260do_test table-5.2 {
drha0733842005-12-29 01:11:36 +0000261 catchsql {DROP TABLE IF EXISTS sqlite_master}
drh1d37e282000-05-30 03:12:21 +0000262} {1 {table sqlite_master may not be dropped}}
drh1b6a71f2000-05-29 23:58:11 +0000263
264# Make sure an EXPLAIN does not really create a new table
265#
266do_test table-5.3 {
drh6bf89572004-11-03 16:27:01 +0000267 ifcapable {explain} {
268 execsql {EXPLAIN CREATE TABLE test1(f1 int)}
269 }
drh28037572000-08-02 13:47:41 +0000270 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh1b6a71f2000-05-29 23:58:11 +0000271} {}
272
273# Make sure an EXPLAIN does not really drop an existing table
274#
275do_test table-5.4 {
276 execsql {CREATE TABLE test1(f1 int)}
drh6bf89572004-11-03 16:27:01 +0000277 ifcapable {explain} {
278 execsql {EXPLAIN DROP TABLE test1}
279 }
drh28037572000-08-02 13:47:41 +0000280 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh1b6a71f2000-05-29 23:58:11 +0000281} {test1}
282
drh4cfa7932000-06-08 15:10:46 +0000283# Create a table with a goofy name
284#
drh3fc190c2001-09-14 03:24:23 +0000285#do_test table-6.1 {
286# execsql {CREATE TABLE 'Spaces In This Name!'(x int)}
287# execsql {INSERT INTO 'spaces in this name!' VALUES(1)}
288# set list [glob -nocomplain testdb/spaces*.tbl]
289#} {testdb/spaces+in+this+name+.tbl}
drh4cfa7932000-06-08 15:10:46 +0000290
drhc4a3c772001-04-04 11:48:57 +0000291# Try using keywords as table names or column names.
292#
293do_test table-7.1 {
294 set v [catch {execsql {
295 CREATE TABLE weird(
296 desc text,
297 asc text,
drh6bf89572004-11-03 16:27:01 +0000298 key int,
drh17f71932002-02-21 12:01:27 +0000299 [14_vac] boolean,
300 fuzzy_dog_12 varchar(10),
drhd4007282001-04-12 23:21:58 +0000301 begin blob,
302 end clob
drhc4a3c772001-04-04 11:48:57 +0000303 )
304 }} msg]
305 lappend v $msg
306} {0 {}}
307do_test table-7.2 {
308 execsql {
drhd4007282001-04-12 23:21:58 +0000309 INSERT INTO weird VALUES('a','b',9,0,'xyz','hi','y''all');
drhc4a3c772001-04-04 11:48:57 +0000310 SELECT * FROM weird;
311 }
drhd4007282001-04-12 23:21:58 +0000312} {a b 9 0 xyz hi y'all}
drhc4a3c772001-04-04 11:48:57 +0000313do_test table-7.3 {
314 execsql2 {
315 SELECT * FROM weird;
316 }
drh6bf89572004-11-03 16:27:01 +0000317} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
danielk197778c2e6d2009-01-16 11:04:58 +0000318do_test table-7.3 {
319 execsql {
320 CREATE TABLE savepoint(release);
321 INSERT INTO savepoint(release) VALUES(10);
322 UPDATE savepoint SET release = 5;
323 SELECT release FROM savepoint;
324 }
325} {5}
drhc4a3c772001-04-04 11:48:57 +0000326
drh969fa7c2002-02-18 18:30:32 +0000327# Try out the CREATE TABLE AS syntax
328#
329do_test table-8.1 {
330 execsql2 {
331 CREATE TABLE t2 AS SELECT * FROM weird;
332 SELECT * FROM t2;
333 }
drh6bf89572004-11-03 16:27:01 +0000334} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
drh17f71932002-02-21 12:01:27 +0000335do_test table-8.1.1 {
336 execsql {
337 SELECT sql FROM sqlite_master WHERE name='t2';
338 }
339} {{CREATE TABLE t2(
drhc4a64fa2009-05-11 20:53:28 +0000340 "desc" TEXT,
341 "asc" TEXT,
342 "key" INT,
343 "14_vac" NUM,
344 fuzzy_dog_12 TEXT,
345 "begin",
346 "end" TEXT
drh17f71932002-02-21 12:01:27 +0000347)}}
drh969fa7c2002-02-18 18:30:32 +0000348do_test table-8.2 {
349 execsql {
drh234c39d2004-07-24 03:30:47 +0000350 CREATE TABLE "t3""xyz"(a,b,c);
351 INSERT INTO [t3"xyz] VALUES(1,2,3);
352 SELECT * FROM [t3"xyz];
drh969fa7c2002-02-18 18:30:32 +0000353 }
354} {1 2 3}
355do_test table-8.3 {
356 execsql2 {
drh234c39d2004-07-24 03:30:47 +0000357 CREATE TABLE [t4"abc] AS SELECT count(*) as cnt, max(b+c) FROM [t3"xyz];
358 SELECT * FROM [t4"abc];
drh969fa7c2002-02-18 18:30:32 +0000359 }
drh17f71932002-02-21 12:01:27 +0000360} {cnt 1 max(b+c) 5}
danielk197700e279d2004-06-21 07:36:32 +0000361
362# Update for v3: The declaration type of anything except a column is now a
363# NULL pointer, so the created table has no column types. (Changed result
drh234c39d2004-07-24 03:30:47 +0000364# from {{CREATE TABLE 't4"abc'(cnt NUMERIC,"max(b+c)" NUMERIC)}}).
drh17f71932002-02-21 12:01:27 +0000365do_test table-8.3.1 {
366 execsql {
drh234c39d2004-07-24 03:30:47 +0000367 SELECT sql FROM sqlite_master WHERE name='t4"abc'
drh17f71932002-02-21 12:01:27 +0000368 }
drh234c39d2004-07-24 03:30:47 +0000369} {{CREATE TABLE "t4""abc"(cnt,"max(b+c)")}}
danielk197753c0f742005-03-29 03:10:59 +0000370
371ifcapable tempdb {
372 do_test table-8.4 {
373 execsql2 {
374 CREATE TEMPORARY TABLE t5 AS SELECT count(*) AS [y'all] FROM [t3"xyz];
375 SELECT * FROM t5;
376 }
377 } {y'all 1}
378}
379
drh969fa7c2002-02-18 18:30:32 +0000380do_test table-8.5 {
381 db close
drhef4ac8f2004-06-19 00:16:31 +0000382 sqlite3 db test.db
drh969fa7c2002-02-18 18:30:32 +0000383 execsql2 {
drh234c39d2004-07-24 03:30:47 +0000384 SELECT * FROM [t4"abc];
drh969fa7c2002-02-18 18:30:32 +0000385 }
drh17f71932002-02-21 12:01:27 +0000386} {cnt 1 max(b+c) 5}
drh969fa7c2002-02-18 18:30:32 +0000387do_test table-8.6 {
388 execsql2 {
389 SELECT * FROM t2;
390 }
drh6bf89572004-11-03 16:27:01 +0000391} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
drh969fa7c2002-02-18 18:30:32 +0000392do_test table-8.7 {
393 catchsql {
394 SELECT * FROM t5;
395 }
396} {1 {no such table: t5}}
drh17f71932002-02-21 12:01:27 +0000397do_test table-8.8 {
398 catchsql {
399 CREATE TABLE t5 AS SELECT * FROM no_such_table;
400 }
401} {1 {no such table: no_such_table}}
drh969fa7c2002-02-18 18:30:32 +0000402
danielk19771b870de2009-03-14 08:37:23 +0000403do_test table-8.9 {
404 execsql {
405 CREATE TABLE t10("col.1" [char.3]);
406 CREATE TABLE t11 AS SELECT * FROM t10;
407 SELECT sql FROM sqlite_master WHERE name = 't11';
408 }
drhc4a64fa2009-05-11 20:53:28 +0000409} {{CREATE TABLE t11("col.1" TEXT)}}
danielk19771b870de2009-03-14 08:37:23 +0000410do_test table-8.10 {
411 execsql {
412 CREATE TABLE t12(
413 a INTEGER,
414 b VARCHAR(10),
415 c VARCHAR(1,10),
416 d VARCHAR(+1,-10),
417 e VARCHAR (+1,-10),
418 f "VARCHAR (+1,-10, 5)",
419 g BIG INTEGER
420 );
421 CREATE TABLE t13 AS SELECT * FROM t12;
422 SELECT sql FROM sqlite_master WHERE name = 't13';
423 }
424} {{CREATE TABLE t13(
drhc4a64fa2009-05-11 20:53:28 +0000425 a INT,
426 b TEXT,
427 c TEXT,
428 d TEXT,
429 e TEXT,
430 f TEXT,
431 g INT
danielk19771b870de2009-03-14 08:37:23 +0000432)}}
433
drh97fc3d02002-05-22 21:27:03 +0000434# Make sure we cannot have duplicate column names within a table.
435#
436do_test table-9.1 {
437 catchsql {
438 CREATE TABLE t6(a,b,a);
439 }
440} {1 {duplicate column name: a}}
drhd8919672005-09-10 15:35:06 +0000441do_test table-9.2 {
442 catchsql {
443 CREATE TABLE t6(a varchar(100), b blob, a integer);
444 }
445} {1 {duplicate column name: a}}
drh97fc3d02002-05-22 21:27:03 +0000446
drh04738cb2002-06-02 18:19:00 +0000447# Check the foreign key syntax.
448#
drh6bf89572004-11-03 16:27:01 +0000449ifcapable {foreignkey} {
drh04738cb2002-06-02 18:19:00 +0000450do_test table-10.1 {
451 catchsql {
452 CREATE TABLE t6(a REFERENCES t4(a) NOT NULL);
453 INSERT INTO t6 VALUES(NULL);
454 }
drh483750b2003-01-29 18:46:51 +0000455} {1 {t6.a may not be NULL}}
drh04738cb2002-06-02 18:19:00 +0000456do_test table-10.2 {
457 catchsql {
458 DROP TABLE t6;
459 CREATE TABLE t6(a REFERENCES t4(a) MATCH PARTIAL);
460 }
461} {0 {}}
462do_test table-10.3 {
463 catchsql {
464 DROP TABLE t6;
465 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON DELETE SET NULL NOT NULL);
466 }
467} {0 {}}
468do_test table-10.4 {
469 catchsql {
470 DROP TABLE t6;
471 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON UPDATE SET DEFAULT DEFAULT 1);
472 }
473} {0 {}}
474do_test table-10.5 {
475 catchsql {
476 DROP TABLE t6;
477 CREATE TABLE t6(a NOT NULL NOT DEFERRABLE INITIALLY IMMEDIATE);
478 }
479} {0 {}}
480do_test table-10.6 {
481 catchsql {
482 DROP TABLE t6;
483 CREATE TABLE t6(a NOT NULL DEFERRABLE INITIALLY DEFERRED);
484 }
485} {0 {}}
486do_test table-10.7 {
487 catchsql {
488 DROP TABLE t6;
489 CREATE TABLE t6(a,
490 FOREIGN KEY (a) REFERENCES t4(b) DEFERRABLE INITIALLY DEFERRED
491 );
492 }
493} {0 {}}
494do_test table-10.8 {
495 catchsql {
496 DROP TABLE t6;
497 CREATE TABLE t6(a,b,c,
498 FOREIGN KEY (b,c) REFERENCES t4(x,y) MATCH PARTIAL
499 ON UPDATE SET NULL ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
500 );
501 }
502} {0 {}}
drhc2eef3b2002-08-31 18:53:06 +0000503do_test table-10.9 {
504 catchsql {
505 DROP TABLE t6;
506 CREATE TABLE t6(a,b,c,
507 FOREIGN KEY (b,c) REFERENCES t4(x)
508 );
509 }
510} {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
511do_test table-10.10 {
512 catchsql {DROP TABLE t6}
513 catchsql {
514 CREATE TABLE t6(a,b,c,
515 FOREIGN KEY (b,c) REFERENCES t4(x,y,z)
516 );
517 }
518} {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
519do_test table-10.11 {
520 catchsql {DROP TABLE t6}
521 catchsql {
522 CREATE TABLE t6(a,b, c REFERENCES t4(x,y));
523 }
524} {1 {foreign key on c should reference only one column of table t4}}
525do_test table-10.12 {
526 catchsql {DROP TABLE t6}
527 catchsql {
528 CREATE TABLE t6(a,b,c,
529 FOREIGN KEY (b,x) REFERENCES t4(x,y)
530 );
531 }
532} {1 {unknown column "x" in foreign key definition}}
533do_test table-10.13 {
534 catchsql {DROP TABLE t6}
535 catchsql {
536 CREATE TABLE t6(a,b,c,
537 FOREIGN KEY (x,b) REFERENCES t4(x,y)
538 );
539 }
540} {1 {unknown column "x" in foreign key definition}}
drh6bf89572004-11-03 16:27:01 +0000541} ;# endif foreignkey
drh04738cb2002-06-02 18:19:00 +0000542
danielk197735bb9d02004-05-24 12:55:54 +0000543# Test for the "typeof" function. More tests for the
544# typeof() function are found in bind.test and types.test.
drh38640e12002-07-05 21:42:36 +0000545#
546do_test table-11.1 {
547 execsql {
548 CREATE TABLE t7(
549 a integer primary key,
550 b number(5,10),
551 c character varying (8),
552 d VARCHAR(9),
553 e clob,
554 f BLOB,
555 g Text,
556 h
557 );
558 INSERT INTO t7(a) VALUES(1);
559 SELECT typeof(a), typeof(b), typeof(c), typeof(d),
560 typeof(e), typeof(f), typeof(g), typeof(h)
561 FROM t7 LIMIT 1;
562 }
danielk197735bb9d02004-05-24 12:55:54 +0000563} {integer null null null null null null null}
drh38640e12002-07-05 21:42:36 +0000564do_test table-11.2 {
565 execsql {
566 SELECT typeof(a+b), typeof(a||b), typeof(c+d), typeof(c||d)
567 FROM t7 LIMIT 1;
568 }
danielk197735bb9d02004-05-24 12:55:54 +0000569} {null null null null}
drh97fc3d02002-05-22 21:27:03 +0000570
danielk197700e279d2004-06-21 07:36:32 +0000571# Test that when creating a table using CREATE TABLE AS, column types are
572# assigned correctly for (SELECT ...) and 'x AS y' expressions.
573do_test table-12.1 {
danielk19773e8c37e2005-01-21 03:12:14 +0000574 ifcapable subquery {
575 execsql {
576 CREATE TABLE t8 AS SELECT b, h, a as i, (SELECT f FROM t7) as j FROM t7;
577 }
578 } else {
579 execsql {
580 CREATE TABLE t8 AS SELECT b, h, a as i, f as j FROM t7;
581 }
danielk197700e279d2004-06-21 07:36:32 +0000582 }
583} {}
584do_test table-12.2 {
585 execsql {
586 SELECT sql FROM sqlite_master WHERE tbl_name = 't8'
587 }
drhc4a64fa2009-05-11 20:53:28 +0000588} {{CREATE TABLE t8(b NUM,h,i INT,j)}}
danielk197700e279d2004-06-21 07:36:32 +0000589
danielk1977e6efa742004-11-10 11:55:10 +0000590#--------------------------------------------------------------------
591# Test cases table-13.*
592#
danielk19777977a172004-11-09 12:44:37 +0000593# Test the ability to have default values of CURRENT_TIME, CURRENT_DATE
594# and CURRENT_TIMESTAMP.
595#
596do_test table-13.1 {
597 execsql {
598 CREATE TABLE tablet8(
599 a integer primary key,
600 tm text DEFAULT CURRENT_TIME,
601 dt text DEFAULT CURRENT_DATE,
602 dttm text DEFAULT CURRENT_TIMESTAMP
603 );
604 SELECT * FROM tablet8;
605 }
606} {}
607set i 0
drh9645d8d2006-09-01 15:49:05 +0000608foreach {date time seconds} {
609 1976-07-04 12:00:00 205329600
610 1994-04-16 14:00:00 766504800
611 2000-01-01 00:00:00 946684800
612 2003-12-31 12:34:56 1072874096
danielk19777977a172004-11-09 12:44:37 +0000613} {
614 incr i
drh9645d8d2006-09-01 15:49:05 +0000615 set sqlite_current_time $seconds
danielk19777977a172004-11-09 12:44:37 +0000616 do_test table-13.2.$i {
617 execsql "
618 INSERT INTO tablet8(a) VALUES($i);
619 SELECT tm, dt, dttm FROM tablet8 WHERE a=$i;
620 "
621 } [list $time $date [list $date $time]]
622}
623set sqlite_current_time 0
624
danielk1977e6efa742004-11-10 11:55:10 +0000625#--------------------------------------------------------------------
626# Test cases table-14.*
627#
628# Test that a table cannot be created or dropped while other virtual
629# machines are active. This is required because otherwise when in
630# auto-vacuum mode the btree-layer may need to move the root-pages of
631# a table for which there is an open cursor.
632#
drhb7af4452007-05-02 17:54:55 +0000633# 2007-05-02: A open btree cursor no longer blocks CREATE TABLE.
634# But DROP TABLE is still prohibited because we do not want to
635# delete a table out from under a running query.
636#
danielk1977e6efa742004-11-10 11:55:10 +0000637
danielk1977a21c6b62005-01-24 10:25:59 +0000638# db eval {
639# pragma vdbe_trace = 0;
640# }
danielk1977e6efa742004-11-10 11:55:10 +0000641# Try to create a table from within a callback:
drh251b0672004-11-23 22:16:39 +0000642unset -nocomplain result
danielk1977e6efa742004-11-10 11:55:10 +0000643do_test table-14.1 {
644 set rc [
645 catch {
646 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
647 db eval {CREATE TABLE t9(a, b, c)}
648 }
649 } msg
650 ]
651 set result [list $rc $msg]
drhb7af4452007-05-02 17:54:55 +0000652} {0 {}}
danielk1977e6efa742004-11-10 11:55:10 +0000653
654# Try to drop a table from within a callback:
danielk19775a8f9372007-10-09 08:29:32 +0000655do_test table-14.2 {
danielk1977e6efa742004-11-10 11:55:10 +0000656 set rc [
657 catch {
658 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
659 db eval {DROP TABLE t9;}
660 }
661 } msg
662 ]
663 set result [list $rc $msg]
664} {1 {database table is locked}}
665
danielk19775a8f9372007-10-09 08:29:32 +0000666ifcapable attach {
667 # Now attach a database and ensure that a table can be created in the
668 # attached database whilst in a callback from a query on the main database.
669 do_test table-14.3 {
670 file delete -force test2.db
671 file delete -force test2.db-journal
672 execsql {
673 ATTACH 'test2.db' as aux;
674 }
675 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
676 db eval {CREATE TABLE aux.t1(a, b, c)}
677 }
678 } {}
679
680 # On the other hand, it should be impossible to drop a table when any VMs
681 # are active. This is because VerifyCookie instructions may have already
682 # been executed, and btree root-pages may not move after this (which a
683 # delete table might do).
684 do_test table-14.4 {
685 set rc [
686 catch {
687 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
688 db eval {DROP TABLE aux.t1;}
689 }
690 } msg
691 ]
692 set result [list $rc $msg]
693 } {1 {database table is locked}}
694}
danielk1977e6efa742004-11-10 11:55:10 +0000695
danielk1977ae825582004-11-23 09:06:55 +0000696# Create and drop 2000 tables. This is to check that the balance_shallow()
697# routine works correctly on the sqlite_master table. At one point it
698# contained a bug that would prevent the right-child pointer of the
699# child page from being copied to the root page.
700#
701do_test table-15.1 {
702 execsql {BEGIN}
703 for {set i 0} {$i<2000} {incr i} {
704 execsql "CREATE TABLE tbl$i (a, b, c)"
705 }
706 execsql {COMMIT}
707} {}
708do_test table-15.2 {
709 execsql {BEGIN}
710 for {set i 0} {$i<2000} {incr i} {
711 execsql "DROP TABLE tbl$i"
712 }
713 execsql {COMMIT}
714} {}
715
drh348784e2000-05-29 20:41:49 +0000716finish_test