blob: ed9efc02cdf3a45ff0521a7539934b22a0323825 [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#
drhdda70fe2009-06-05 17:09:11 +000014# $Id: table.test,v 1.53 2009/06/05 17:09:12 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 {
drh28037572000-08-02 13:47:41 +0000115 execsql {DROP TABLE test2; SELECT name FROM sqlite_master WHERE type!='meta'}
drhb24fcbe2000-05-29 23:30:50 +0000116} {}
117
118# Verify that we cannot make a table with the same name as an index
119#
drhdcc581c2000-05-30 13:44:19 +0000120do_test table-2.2a {
drh8a1e5942009-04-28 15:43:45 +0000121 execsql {CREATE TABLE test2(one text)}
122 execsql {CREATE INDEX test3 ON test2(one)}
123 catchsql {CREATE TABLE test3(two text)}
drh1d37e282000-05-30 03:12:21 +0000124} {1 {there is already an index named test3}}
drh1b6a71f2000-05-29 23:58:11 +0000125do_test table-2.2b {
drhb24fcbe2000-05-29 23:30:50 +0000126 db close
drhef4ac8f2004-06-19 00:16:31 +0000127 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000128 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
129 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000130} {1 {there is already an index named test3}}
drh1b6a71f2000-05-29 23:58:11 +0000131do_test table-2.2c {
drh3fc190c2001-09-14 03:24:23 +0000132 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
133} {test2 test3}
134do_test table-2.2d {
drhb24fcbe2000-05-29 23:30:50 +0000135 execsql {DROP INDEX test3}
136 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
137 lappend v $msg
138} {0 {}}
drh3fc190c2001-09-14 03:24:23 +0000139do_test table-2.2e {
drh28037572000-08-02 13:47:41 +0000140 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000141} {test2 test3}
drh3fc190c2001-09-14 03:24:23 +0000142do_test table-2.2f {
drhb24fcbe2000-05-29 23:30:50 +0000143 execsql {DROP TABLE test2; DROP TABLE test3}
drh28037572000-08-02 13:47:41 +0000144 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000145} {}
146
147# Create a table with many field names
148#
149set big_table \
150{CREATE TABLE big(
151 f1 varchar(20),
152 f2 char(10),
drhdcc581c2000-05-30 13:44:19 +0000153 f3 varchar(30) primary key,
drhb24fcbe2000-05-29 23:30:50 +0000154 f4 text,
155 f5 text,
156 f6 text,
157 f7 text,
158 f8 text,
159 f9 text,
160 f10 text,
161 f11 text,
162 f12 text,
163 f13 text,
164 f14 text,
165 f15 text,
166 f16 text,
167 f17 text,
168 f18 text,
169 f19 text,
170 f20 text
171)}
drh1b6a71f2000-05-29 23:58:11 +0000172do_test table-3.1 {
drhb24fcbe2000-05-29 23:30:50 +0000173 execsql $big_table
drhadbca9c2001-09-27 15:11:53 +0000174 execsql {SELECT sql FROM sqlite_master WHERE type=='table'}
drhb24fcbe2000-05-29 23:30:50 +0000175} \{$big_table\}
drh1b6a71f2000-05-29 23:58:11 +0000176do_test table-3.2 {
drhb24fcbe2000-05-29 23:30:50 +0000177 set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg]
178 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000179} {1 {table BIG already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000180do_test table-3.3 {
drhb24fcbe2000-05-29 23:30:50 +0000181 set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg]
182 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000183} {1 {table biG already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000184do_test table-3.4 {
drhb24fcbe2000-05-29 23:30:50 +0000185 set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
186 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000187} {1 {table bIg already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000188do_test table-3.5 {
drhb24fcbe2000-05-29 23:30:50 +0000189 db close
drhef4ac8f2004-06-19 00:16:31 +0000190 sqlite3 db test.db
drhb24fcbe2000-05-29 23:30:50 +0000191 set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
192 lappend v $msg
drh1d37e282000-05-30 03:12:21 +0000193} {1 {table Big already exists}}
drh1b6a71f2000-05-29 23:58:11 +0000194do_test table-3.6 {
drhb24fcbe2000-05-29 23:30:50 +0000195 execsql {DROP TABLE big}
drh28037572000-08-02 13:47:41 +0000196 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drhb24fcbe2000-05-29 23:30:50 +0000197} {}
198
199# Try creating large numbers of tables
200#
201set r {}
202for {set i 1} {$i<=100} {incr i} {
drha9e99ae2002-08-13 23:02:57 +0000203 lappend r [format test%03d $i]
drhb24fcbe2000-05-29 23:30:50 +0000204}
drh1b6a71f2000-05-29 23:58:11 +0000205do_test table-4.1 {
drhb24fcbe2000-05-29 23:30:50 +0000206 for {set i 1} {$i<=100} {incr i} {
drha9e99ae2002-08-13 23:02:57 +0000207 set sql "CREATE TABLE [format test%03d $i] ("
drhb24fcbe2000-05-29 23:30:50 +0000208 for {set k 1} {$k<$i} {incr k} {
209 append sql "field$k text,"
210 }
211 append sql "last_field text)"
212 execsql $sql
213 }
drh28037572000-08-02 13:47:41 +0000214 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000215} $r
drh1b6a71f2000-05-29 23:58:11 +0000216do_test table-4.1b {
drhb24fcbe2000-05-29 23:30:50 +0000217 db close
drhef4ac8f2004-06-19 00:16:31 +0000218 sqlite3 db test.db
drh28037572000-08-02 13:47:41 +0000219 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000220} $r
221
drhc4a3c772001-04-04 11:48:57 +0000222# Drop the even numbered tables
drhb24fcbe2000-05-29 23:30:50 +0000223#
224set r {}
225for {set i 1} {$i<=100} {incr i 2} {
drha9e99ae2002-08-13 23:02:57 +0000226 lappend r [format test%03d $i]
drhb24fcbe2000-05-29 23:30:50 +0000227}
drh1b6a71f2000-05-29 23:58:11 +0000228do_test table-4.2 {
drhb24fcbe2000-05-29 23:30:50 +0000229 for {set i 2} {$i<=100} {incr i 2} {
drh428ae8c2003-01-04 16:48:09 +0000230 # if {$i==38} {execsql {pragma vdbe_trace=on}}
drha9e99ae2002-08-13 23:02:57 +0000231 set sql "DROP TABLE [format TEST%03d $i]"
drhb24fcbe2000-05-29 23:30:50 +0000232 execsql $sql
233 }
drh28037572000-08-02 13:47:41 +0000234 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000235} $r
drh3fc190c2001-09-14 03:24:23 +0000236#exit
drhb24fcbe2000-05-29 23:30:50 +0000237
238# Drop the odd number tables
239#
drh1b6a71f2000-05-29 23:58:11 +0000240do_test table-4.3 {
drhb24fcbe2000-05-29 23:30:50 +0000241 for {set i 1} {$i<=100} {incr i 2} {
drha9e99ae2002-08-13 23:02:57 +0000242 set sql "DROP TABLE [format test%03d $i]"
drhb24fcbe2000-05-29 23:30:50 +0000243 execsql $sql
244 }
drh28037572000-08-02 13:47:41 +0000245 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
drhb24fcbe2000-05-29 23:30:50 +0000246} {}
247
drh1b6a71f2000-05-29 23:58:11 +0000248# Try to drop a table that does not exist
249#
drha0733842005-12-29 01:11:36 +0000250do_test table-5.1.1 {
251 catchsql {DROP TABLE test009}
drha9e99ae2002-08-13 23:02:57 +0000252} {1 {no such table: test009}}
drha0733842005-12-29 01:11:36 +0000253do_test table-5.1.2 {
254 catchsql {DROP TABLE IF EXISTS test009}
255} {0 {}}
drh1b6a71f2000-05-29 23:58:11 +0000256
257# Try to drop sqlite_master
258#
259do_test table-5.2 {
drha0733842005-12-29 01:11:36 +0000260 catchsql {DROP TABLE IF EXISTS sqlite_master}
drh1d37e282000-05-30 03:12:21 +0000261} {1 {table sqlite_master may not be dropped}}
drh1b6a71f2000-05-29 23:58:11 +0000262
drh08ccfaa2011-10-07 23:52:25 +0000263# Dropping sqlite_statN tables is OK.
264#
265do_test table-5.2.1 {
266 db eval {
267 ANALYZE;
268 DROP TABLE IF EXISTS sqlite_stat1;
269 DROP TABLE IF EXISTS sqlite_stat2;
dan8ad169a2013-08-12 20:14:04 +0000270 DROP TABLE IF EXISTS sqlite_stat3;
danc55521a2013-08-05 05:34:30 +0000271 DROP TABLE IF EXISTS sqlite_stat4;
drh08ccfaa2011-10-07 23:52:25 +0000272 SELECT name FROM sqlite_master WHERE name GLOB 'sqlite_stat*';
273 }
274} {}
275
drh1b6a71f2000-05-29 23:58:11 +0000276# Make sure an EXPLAIN does not really create a new table
277#
278do_test table-5.3 {
drh6bf89572004-11-03 16:27:01 +0000279 ifcapable {explain} {
280 execsql {EXPLAIN CREATE TABLE test1(f1 int)}
281 }
drh28037572000-08-02 13:47:41 +0000282 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh1b6a71f2000-05-29 23:58:11 +0000283} {}
284
285# Make sure an EXPLAIN does not really drop an existing table
286#
287do_test table-5.4 {
288 execsql {CREATE TABLE test1(f1 int)}
drh6bf89572004-11-03 16:27:01 +0000289 ifcapable {explain} {
290 execsql {EXPLAIN DROP TABLE test1}
291 }
drh28037572000-08-02 13:47:41 +0000292 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
drh1b6a71f2000-05-29 23:58:11 +0000293} {test1}
294
drh4cfa7932000-06-08 15:10:46 +0000295# Create a table with a goofy name
296#
drh3fc190c2001-09-14 03:24:23 +0000297#do_test table-6.1 {
298# execsql {CREATE TABLE 'Spaces In This Name!'(x int)}
299# execsql {INSERT INTO 'spaces in this name!' VALUES(1)}
300# set list [glob -nocomplain testdb/spaces*.tbl]
301#} {testdb/spaces+in+this+name+.tbl}
drh4cfa7932000-06-08 15:10:46 +0000302
drhc4a3c772001-04-04 11:48:57 +0000303# Try using keywords as table names or column names.
304#
305do_test table-7.1 {
306 set v [catch {execsql {
307 CREATE TABLE weird(
308 desc text,
309 asc text,
drh6bf89572004-11-03 16:27:01 +0000310 key int,
drh17f71932002-02-21 12:01:27 +0000311 [14_vac] boolean,
312 fuzzy_dog_12 varchar(10),
drhd4007282001-04-12 23:21:58 +0000313 begin blob,
314 end clob
drhc4a3c772001-04-04 11:48:57 +0000315 )
316 }} msg]
317 lappend v $msg
318} {0 {}}
319do_test table-7.2 {
320 execsql {
drhd4007282001-04-12 23:21:58 +0000321 INSERT INTO weird VALUES('a','b',9,0,'xyz','hi','y''all');
drhc4a3c772001-04-04 11:48:57 +0000322 SELECT * FROM weird;
323 }
drhd4007282001-04-12 23:21:58 +0000324} {a b 9 0 xyz hi y'all}
drhc4a3c772001-04-04 11:48:57 +0000325do_test table-7.3 {
326 execsql2 {
327 SELECT * FROM weird;
328 }
drh6bf89572004-11-03 16:27:01 +0000329} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
danielk197778c2e6d2009-01-16 11:04:58 +0000330do_test table-7.3 {
331 execsql {
332 CREATE TABLE savepoint(release);
333 INSERT INTO savepoint(release) VALUES(10);
334 UPDATE savepoint SET release = 5;
335 SELECT release FROM savepoint;
336 }
337} {5}
drhc4a3c772001-04-04 11:48:57 +0000338
drh969fa7c2002-02-18 18:30:32 +0000339# Try out the CREATE TABLE AS syntax
340#
341do_test table-8.1 {
342 execsql2 {
343 CREATE TABLE t2 AS SELECT * FROM weird;
344 SELECT * FROM t2;
345 }
drh6bf89572004-11-03 16:27:01 +0000346} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
drh17f71932002-02-21 12:01:27 +0000347do_test table-8.1.1 {
348 execsql {
349 SELECT sql FROM sqlite_master WHERE name='t2';
350 }
351} {{CREATE TABLE t2(
drhc4a64fa2009-05-11 20:53:28 +0000352 "desc" TEXT,
353 "asc" TEXT,
354 "key" INT,
355 "14_vac" NUM,
356 fuzzy_dog_12 TEXT,
357 "begin",
358 "end" TEXT
drh17f71932002-02-21 12:01:27 +0000359)}}
drh969fa7c2002-02-18 18:30:32 +0000360do_test table-8.2 {
361 execsql {
drh234c39d2004-07-24 03:30:47 +0000362 CREATE TABLE "t3""xyz"(a,b,c);
363 INSERT INTO [t3"xyz] VALUES(1,2,3);
364 SELECT * FROM [t3"xyz];
drh969fa7c2002-02-18 18:30:32 +0000365 }
366} {1 2 3}
367do_test table-8.3 {
368 execsql2 {
drh234c39d2004-07-24 03:30:47 +0000369 CREATE TABLE [t4"abc] AS SELECT count(*) as cnt, max(b+c) FROM [t3"xyz];
370 SELECT * FROM [t4"abc];
drh969fa7c2002-02-18 18:30:32 +0000371 }
drh17f71932002-02-21 12:01:27 +0000372} {cnt 1 max(b+c) 5}
danielk197700e279d2004-06-21 07:36:32 +0000373
374# Update for v3: The declaration type of anything except a column is now a
375# NULL pointer, so the created table has no column types. (Changed result
drh234c39d2004-07-24 03:30:47 +0000376# from {{CREATE TABLE 't4"abc'(cnt NUMERIC,"max(b+c)" NUMERIC)}}).
drh17f71932002-02-21 12:01:27 +0000377do_test table-8.3.1 {
378 execsql {
drh234c39d2004-07-24 03:30:47 +0000379 SELECT sql FROM sqlite_master WHERE name='t4"abc'
drh17f71932002-02-21 12:01:27 +0000380 }
drh234c39d2004-07-24 03:30:47 +0000381} {{CREATE TABLE "t4""abc"(cnt,"max(b+c)")}}
danielk197753c0f742005-03-29 03:10:59 +0000382
383ifcapable tempdb {
384 do_test table-8.4 {
385 execsql2 {
386 CREATE TEMPORARY TABLE t5 AS SELECT count(*) AS [y'all] FROM [t3"xyz];
387 SELECT * FROM t5;
388 }
389 } {y'all 1}
390}
391
drh969fa7c2002-02-18 18:30:32 +0000392do_test table-8.5 {
393 db close
drhef4ac8f2004-06-19 00:16:31 +0000394 sqlite3 db test.db
drh969fa7c2002-02-18 18:30:32 +0000395 execsql2 {
drh234c39d2004-07-24 03:30:47 +0000396 SELECT * FROM [t4"abc];
drh969fa7c2002-02-18 18:30:32 +0000397 }
drh17f71932002-02-21 12:01:27 +0000398} {cnt 1 max(b+c) 5}
drh969fa7c2002-02-18 18:30:32 +0000399do_test table-8.6 {
400 execsql2 {
401 SELECT * FROM t2;
402 }
drh6bf89572004-11-03 16:27:01 +0000403} {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
drh969fa7c2002-02-18 18:30:32 +0000404do_test table-8.7 {
405 catchsql {
406 SELECT * FROM t5;
407 }
408} {1 {no such table: t5}}
drh17f71932002-02-21 12:01:27 +0000409do_test table-8.8 {
410 catchsql {
411 CREATE TABLE t5 AS SELECT * FROM no_such_table;
412 }
413} {1 {no such table: no_such_table}}
drh969fa7c2002-02-18 18:30:32 +0000414
danielk19771b870de2009-03-14 08:37:23 +0000415do_test table-8.9 {
416 execsql {
417 CREATE TABLE t10("col.1" [char.3]);
418 CREATE TABLE t11 AS SELECT * FROM t10;
419 SELECT sql FROM sqlite_master WHERE name = 't11';
420 }
drhc4a64fa2009-05-11 20:53:28 +0000421} {{CREATE TABLE t11("col.1" TEXT)}}
danielk19771b870de2009-03-14 08:37:23 +0000422do_test table-8.10 {
423 execsql {
424 CREATE TABLE t12(
425 a INTEGER,
426 b VARCHAR(10),
427 c VARCHAR(1,10),
428 d VARCHAR(+1,-10),
429 e VARCHAR (+1,-10),
430 f "VARCHAR (+1,-10, 5)",
431 g BIG INTEGER
432 );
433 CREATE TABLE t13 AS SELECT * FROM t12;
434 SELECT sql FROM sqlite_master WHERE name = 't13';
435 }
436} {{CREATE TABLE t13(
drhc4a64fa2009-05-11 20:53:28 +0000437 a INT,
438 b TEXT,
439 c TEXT,
440 d TEXT,
441 e TEXT,
442 f TEXT,
443 g INT
danielk19771b870de2009-03-14 08:37:23 +0000444)}}
445
drh97fc3d02002-05-22 21:27:03 +0000446# Make sure we cannot have duplicate column names within a table.
447#
448do_test table-9.1 {
449 catchsql {
450 CREATE TABLE t6(a,b,a);
451 }
452} {1 {duplicate column name: a}}
drhd8919672005-09-10 15:35:06 +0000453do_test table-9.2 {
454 catchsql {
455 CREATE TABLE t6(a varchar(100), b blob, a integer);
456 }
457} {1 {duplicate column name: a}}
drh97fc3d02002-05-22 21:27:03 +0000458
drh04738cb2002-06-02 18:19:00 +0000459# Check the foreign key syntax.
460#
drh6bf89572004-11-03 16:27:01 +0000461ifcapable {foreignkey} {
drh04738cb2002-06-02 18:19:00 +0000462do_test table-10.1 {
463 catchsql {
464 CREATE TABLE t6(a REFERENCES t4(a) NOT NULL);
465 INSERT INTO t6 VALUES(NULL);
466 }
drhf9c8ce32013-11-05 13:33:55 +0000467} {1 {NOT NULL constraint failed: t6.a}}
drh04738cb2002-06-02 18:19:00 +0000468do_test table-10.2 {
469 catchsql {
470 DROP TABLE t6;
471 CREATE TABLE t6(a REFERENCES t4(a) MATCH PARTIAL);
472 }
473} {0 {}}
474do_test table-10.3 {
475 catchsql {
476 DROP TABLE t6;
477 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON DELETE SET NULL NOT NULL);
478 }
479} {0 {}}
480do_test table-10.4 {
481 catchsql {
482 DROP TABLE t6;
483 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON UPDATE SET DEFAULT DEFAULT 1);
484 }
485} {0 {}}
486do_test table-10.5 {
487 catchsql {
488 DROP TABLE t6;
489 CREATE TABLE t6(a NOT NULL NOT DEFERRABLE INITIALLY IMMEDIATE);
490 }
491} {0 {}}
492do_test table-10.6 {
493 catchsql {
494 DROP TABLE t6;
495 CREATE TABLE t6(a NOT NULL DEFERRABLE INITIALLY DEFERRED);
496 }
497} {0 {}}
498do_test table-10.7 {
499 catchsql {
500 DROP TABLE t6;
501 CREATE TABLE t6(a,
502 FOREIGN KEY (a) REFERENCES t4(b) DEFERRABLE INITIALLY DEFERRED
503 );
504 }
505} {0 {}}
506do_test table-10.8 {
507 catchsql {
508 DROP TABLE t6;
509 CREATE TABLE t6(a,b,c,
510 FOREIGN KEY (b,c) REFERENCES t4(x,y) MATCH PARTIAL
511 ON UPDATE SET NULL ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
512 );
513 }
514} {0 {}}
drhc2eef3b2002-08-31 18:53:06 +0000515do_test table-10.9 {
516 catchsql {
517 DROP TABLE t6;
518 CREATE TABLE t6(a,b,c,
519 FOREIGN KEY (b,c) REFERENCES t4(x)
520 );
521 }
522} {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
523do_test table-10.10 {
524 catchsql {DROP TABLE t6}
525 catchsql {
526 CREATE TABLE t6(a,b,c,
527 FOREIGN KEY (b,c) REFERENCES t4(x,y,z)
528 );
529 }
530} {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
531do_test table-10.11 {
532 catchsql {DROP TABLE t6}
533 catchsql {
534 CREATE TABLE t6(a,b, c REFERENCES t4(x,y));
535 }
536} {1 {foreign key on c should reference only one column of table t4}}
537do_test table-10.12 {
538 catchsql {DROP TABLE t6}
539 catchsql {
540 CREATE TABLE t6(a,b,c,
541 FOREIGN KEY (b,x) REFERENCES t4(x,y)
542 );
543 }
544} {1 {unknown column "x" in foreign key definition}}
545do_test table-10.13 {
546 catchsql {DROP TABLE t6}
547 catchsql {
548 CREATE TABLE t6(a,b,c,
549 FOREIGN KEY (x,b) REFERENCES t4(x,y)
550 );
551 }
552} {1 {unknown column "x" in foreign key definition}}
drh6bf89572004-11-03 16:27:01 +0000553} ;# endif foreignkey
drh04738cb2002-06-02 18:19:00 +0000554
danielk197735bb9d02004-05-24 12:55:54 +0000555# Test for the "typeof" function. More tests for the
556# typeof() function are found in bind.test and types.test.
drh38640e12002-07-05 21:42:36 +0000557#
558do_test table-11.1 {
559 execsql {
560 CREATE TABLE t7(
561 a integer primary key,
562 b number(5,10),
563 c character varying (8),
564 d VARCHAR(9),
565 e clob,
566 f BLOB,
567 g Text,
568 h
569 );
570 INSERT INTO t7(a) VALUES(1);
571 SELECT typeof(a), typeof(b), typeof(c), typeof(d),
572 typeof(e), typeof(f), typeof(g), typeof(h)
573 FROM t7 LIMIT 1;
574 }
danielk197735bb9d02004-05-24 12:55:54 +0000575} {integer null null null null null null null}
drh38640e12002-07-05 21:42:36 +0000576do_test table-11.2 {
577 execsql {
578 SELECT typeof(a+b), typeof(a||b), typeof(c+d), typeof(c||d)
579 FROM t7 LIMIT 1;
580 }
danielk197735bb9d02004-05-24 12:55:54 +0000581} {null null null null}
drh97fc3d02002-05-22 21:27:03 +0000582
danielk197700e279d2004-06-21 07:36:32 +0000583# Test that when creating a table using CREATE TABLE AS, column types are
584# assigned correctly for (SELECT ...) and 'x AS y' expressions.
585do_test table-12.1 {
danielk19773e8c37e2005-01-21 03:12:14 +0000586 ifcapable subquery {
587 execsql {
588 CREATE TABLE t8 AS SELECT b, h, a as i, (SELECT f FROM t7) as j FROM t7;
589 }
590 } else {
591 execsql {
592 CREATE TABLE t8 AS SELECT b, h, a as i, f as j FROM t7;
593 }
danielk197700e279d2004-06-21 07:36:32 +0000594 }
595} {}
596do_test table-12.2 {
597 execsql {
598 SELECT sql FROM sqlite_master WHERE tbl_name = 't8'
599 }
drhc4a64fa2009-05-11 20:53:28 +0000600} {{CREATE TABLE t8(b NUM,h,i INT,j)}}
danielk197700e279d2004-06-21 07:36:32 +0000601
danielk1977e6efa742004-11-10 11:55:10 +0000602#--------------------------------------------------------------------
603# Test cases table-13.*
604#
danielk19777977a172004-11-09 12:44:37 +0000605# Test the ability to have default values of CURRENT_TIME, CURRENT_DATE
606# and CURRENT_TIMESTAMP.
607#
608do_test table-13.1 {
609 execsql {
610 CREATE TABLE tablet8(
611 a integer primary key,
612 tm text DEFAULT CURRENT_TIME,
613 dt text DEFAULT CURRENT_DATE,
614 dttm text DEFAULT CURRENT_TIMESTAMP
615 );
616 SELECT * FROM tablet8;
617 }
618} {}
619set i 0
drhd0b26772010-05-03 19:20:46 +0000620unset -nocomplain date time seconds
drh9645d8d2006-09-01 15:49:05 +0000621foreach {date time seconds} {
622 1976-07-04 12:00:00 205329600
623 1994-04-16 14:00:00 766504800
624 2000-01-01 00:00:00 946684800
625 2003-12-31 12:34:56 1072874096
danielk19777977a172004-11-09 12:44:37 +0000626} {
627 incr i
drh9645d8d2006-09-01 15:49:05 +0000628 set sqlite_current_time $seconds
danielk19777977a172004-11-09 12:44:37 +0000629 do_test table-13.2.$i {
630 execsql "
631 INSERT INTO tablet8(a) VALUES($i);
632 SELECT tm, dt, dttm FROM tablet8 WHERE a=$i;
633 "
634 } [list $time $date [list $date $time]]
635}
636set sqlite_current_time 0
637
danielk1977e6efa742004-11-10 11:55:10 +0000638#--------------------------------------------------------------------
639# Test cases table-14.*
640#
641# Test that a table cannot be created or dropped while other virtual
642# machines are active. This is required because otherwise when in
643# auto-vacuum mode the btree-layer may need to move the root-pages of
644# a table for which there is an open cursor.
645#
drhb7af4452007-05-02 17:54:55 +0000646# 2007-05-02: A open btree cursor no longer blocks CREATE TABLE.
647# But DROP TABLE is still prohibited because we do not want to
648# delete a table out from under a running query.
649#
danielk1977e6efa742004-11-10 11:55:10 +0000650
danielk1977a21c6b62005-01-24 10:25:59 +0000651# db eval {
652# pragma vdbe_trace = 0;
653# }
danielk1977e6efa742004-11-10 11:55:10 +0000654# Try to create a table from within a callback:
drh251b0672004-11-23 22:16:39 +0000655unset -nocomplain result
danielk1977e6efa742004-11-10 11:55:10 +0000656do_test table-14.1 {
657 set rc [
658 catch {
659 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
660 db eval {CREATE TABLE t9(a, b, c)}
661 }
662 } msg
663 ]
664 set result [list $rc $msg]
drhb7af4452007-05-02 17:54:55 +0000665} {0 {}}
danielk1977e6efa742004-11-10 11:55:10 +0000666
667# Try to drop a table from within a callback:
danielk19775a8f9372007-10-09 08:29:32 +0000668do_test table-14.2 {
danielk1977e6efa742004-11-10 11:55:10 +0000669 set rc [
670 catch {
671 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
672 db eval {DROP TABLE t9;}
673 }
674 } msg
675 ]
676 set result [list $rc $msg]
677} {1 {database table is locked}}
678
danielk19775a8f9372007-10-09 08:29:32 +0000679ifcapable attach {
680 # Now attach a database and ensure that a table can be created in the
681 # attached database whilst in a callback from a query on the main database.
682 do_test table-14.3 {
mistachkinfda06be2011-08-02 00:57:34 +0000683 forcedelete test2.db
684 forcedelete test2.db-journal
danielk19775a8f9372007-10-09 08:29:32 +0000685 execsql {
686 ATTACH 'test2.db' as aux;
687 }
688 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
689 db eval {CREATE TABLE aux.t1(a, b, c)}
690 }
691 } {}
692
693 # On the other hand, it should be impossible to drop a table when any VMs
694 # are active. This is because VerifyCookie instructions may have already
695 # been executed, and btree root-pages may not move after this (which a
696 # delete table might do).
697 do_test table-14.4 {
698 set rc [
699 catch {
700 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
701 db eval {DROP TABLE aux.t1;}
702 }
703 } msg
704 ]
705 set result [list $rc $msg]
706 } {1 {database table is locked}}
707}
danielk1977e6efa742004-11-10 11:55:10 +0000708
danielk1977ae825582004-11-23 09:06:55 +0000709# Create and drop 2000 tables. This is to check that the balance_shallow()
710# routine works correctly on the sqlite_master table. At one point it
711# contained a bug that would prevent the right-child pointer of the
712# child page from being copied to the root page.
713#
714do_test table-15.1 {
715 execsql {BEGIN}
716 for {set i 0} {$i<2000} {incr i} {
717 execsql "CREATE TABLE tbl$i (a, b, c)"
718 }
719 execsql {COMMIT}
720} {}
721do_test table-15.2 {
722 execsql {BEGIN}
723 for {set i 0} {$i<2000} {incr i} {
724 execsql "DROP TABLE tbl$i"
725 }
726 execsql {COMMIT}
727} {}
728
drh348784e2000-05-29 20:41:49 +0000729finish_test