3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library. The
12 # focus of this file is testing the CREATE TABLE statement.
14 # $Id: table.test,v 1.53 2009/06/05 17:09:12 drh Exp $
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
19 # Create a basic table and verify it is added to sqlite_master
29 SELECT sql FROM sqlite_master WHERE type!='meta'
31 } {{CREATE TABLE test1 (
37 # Verify the other fields of the sqlite_master file.
40 execsql {SELECT name, tbl_name, type FROM sqlite_master WHERE type!='meta'}
43 # Close and reopen the database. Verify that everything is
49 execsql {SELECT name, tbl_name, type from sqlite_master WHERE type!='meta'}
52 # Drop the database and make sure it disappears.
55 execsql {DROP TABLE test1}
56 execsql {SELECT * FROM sqlite_master WHERE type!='meta'}
59 # Close and reopen the database. Verify that the table is
65 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
68 # Repeat the above steps, but this time quote the table name.
71 execsql {CREATE TABLE "create" (f1 int)}
72 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
75 execsql {DROP TABLE "create"}
76 execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
79 execsql {CREATE TABLE test1("f1 ho" int)}
80 execsql {SELECT name as "X" FROM sqlite_master WHERE type!='meta'}
83 execsql {DROP TABLE "TEST1"}
84 execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
89 # Verify that we cannot make two tables with the same name
92 execsql {CREATE TABLE TEST2(one text)}
93 catchsql {CREATE TABLE test2(two text default 'hi')}
94 } {1 {table test2 already exists}}
96 catchsql {CREATE TABLE "test2" (two)}
97 } {1 {table "test2" already exists}}
99 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
101 } {1 {object name reserved for internal use: sqlite_master}}
105 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
107 } {1 {object name reserved for internal use: sqlite_master}}
109 catchsql {CREATE TABLE IF NOT EXISTS test2(x,y)}
112 catchsql {CREATE TABLE IF NOT EXISTS test2(x UNIQUE, y TEXT PRIMARY KEY)}
115 execsql {DROP TABLE test2; SELECT name FROM sqlite_master WHERE type!='meta'}
118 # Verify that we cannot make a table with the same name as an index
121 execsql {CREATE TABLE test2(one text)}
122 execsql {CREATE INDEX test3 ON test2(one)}
123 catchsql {CREATE TABLE test3(two text)}
124 } {1 {there is already an index named test3}}
128 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
130 } {1 {there is already an index named test3}}
132 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
135 execsql {DROP INDEX test3}
136 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
140 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
143 execsql {DROP TABLE test2; DROP TABLE test3}
144 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
147 # Create a table with many field names
153 f3 varchar(30) primary key,
174 execsql {SELECT sql FROM sqlite_master WHERE type=='table'}
177 set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg]
179 } {1 {table BIG already exists}}
181 set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg]
183 } {1 {table biG already exists}}
185 set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
187 } {1 {table bIg already exists}}
191 set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
193 } {1 {table Big already exists}}
195 execsql {DROP TABLE big}
196 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
199 # Try creating large numbers of tables
202 for {set i 1} {$i<=100} {incr i} {
203 lappend r [format test%03d $i]
206 for {set i 1} {$i<=100} {incr i} {
207 set sql "CREATE TABLE [format test%03d $i] ("
208 for {set k 1} {$k<$i} {incr k} {
209 append sql "field$k text,"
211 append sql "last_field text)"
214 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
219 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
222 # Drop the even numbered tables
225 for {set i 1} {$i<=100} {incr i 2} {
226 lappend r [format test%03d $i]
229 for {set i 2} {$i<=100} {incr i 2} {
230 # if {$i==38} {execsql {pragma vdbe_trace=on}}
231 set sql "DROP TABLE [format TEST%03d $i]"
234 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
238 # Drop the odd number tables
241 for {set i 1} {$i<=100} {incr i 2} {
242 set sql "DROP TABLE [format test%03d $i]"
245 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
248 # Try to drop a table that does not exist
250 do_test table-5.1.1 {
251 catchsql {DROP TABLE test009}
252 } {1 {no such table: test009}}
253 do_test table-5.1.2 {
254 catchsql {DROP TABLE IF EXISTS test009}
257 # Try to drop sqlite_master
260 catchsql {DROP TABLE IF EXISTS sqlite_master}
261 } {1 {table sqlite_master may not be dropped}}
263 # Make sure an EXPLAIN does not really create a new table
266 ifcapable {explain} {
267 execsql {EXPLAIN CREATE TABLE test1(f1 int)}
269 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
272 # Make sure an EXPLAIN does not really drop an existing table
275 execsql {CREATE TABLE test1(f1 int)}
276 ifcapable {explain} {
277 execsql {EXPLAIN DROP TABLE test1}
279 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
282 # Create a table with a goofy name
285 # execsql {CREATE TABLE 'Spaces In This Name!'(x int)}
286 # execsql {INSERT INTO 'spaces in this name!' VALUES(1)}
287 # set list [glob -nocomplain testdb/spaces*.tbl]
288 #} {testdb/spaces+in+this+name+.tbl}
290 # Try using keywords as table names or column names.
293 set v [catch {execsql {
299 fuzzy_dog_12 varchar(10),
308 INSERT INTO weird VALUES('a','b',9,0,'xyz','hi','y''all');
311 } {a b 9 0 xyz hi y'all}
316 } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
319 CREATE TABLE savepoint(release);
320 INSERT INTO savepoint(release) VALUES(10);
321 UPDATE savepoint SET release = 5;
322 SELECT release FROM savepoint;
326 # Try out the CREATE TABLE AS syntax
330 CREATE TABLE t2 AS SELECT * FROM weird;
333 } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
334 do_test table-8.1.1 {
336 SELECT sql FROM sqlite_master WHERE name='t2';
349 CREATE TABLE "t3""xyz"(a,b,c);
350 INSERT INTO [t3"xyz] VALUES(1,2,3);
351 SELECT * FROM [t3"xyz];
356 CREATE TABLE [t4"abc] AS SELECT count(*) as cnt, max(b+c) FROM [t3"xyz];
357 SELECT * FROM [t4"abc];
361 # Update for v3: The declaration type of anything except a column is now a
362 # NULL pointer, so the created table has no column types. (Changed result
363 # from {{CREATE TABLE 't4"abc'(cnt NUMERIC,"max(b+c)" NUMERIC)}}).
364 do_test table-8.3.1 {
366 SELECT sql FROM sqlite_master WHERE name='t4"abc'
368 } {{CREATE TABLE "t4""abc"(cnt,"max(b+c)")}}
373 CREATE TEMPORARY TABLE t5 AS SELECT count(*) AS [y'all] FROM [t3"xyz];
383 SELECT * FROM [t4"abc];
390 } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
395 } {1 {no such table: t5}}
398 CREATE TABLE t5 AS SELECT * FROM no_such_table;
400 } {1 {no such table: no_such_table}}
404 CREATE TABLE t10("col.1" [char.3]);
405 CREATE TABLE t11 AS SELECT * FROM t10;
406 SELECT sql FROM sqlite_master WHERE name = 't11';
408 } {{CREATE TABLE t11("col.1" TEXT)}}
417 f "VARCHAR (+1,-10, 5)",
420 CREATE TABLE t13 AS SELECT * FROM t12;
421 SELECT sql FROM sqlite_master WHERE name = 't13';
423 } {{CREATE TABLE t13(
433 # Make sure we cannot have duplicate column names within a table.
437 CREATE TABLE t6(a,b,a);
439 } {1 {duplicate column name: a}}
442 CREATE TABLE t6(a varchar(100), b blob, a integer);
444 } {1 {duplicate column name: a}}
446 # Check the foreign key syntax.
448 ifcapable {foreignkey} {
451 CREATE TABLE t6(a REFERENCES t4(a) NOT NULL);
452 INSERT INTO t6 VALUES(NULL);
454 } {1 {t6.a may not be NULL}}
458 CREATE TABLE t6(a REFERENCES t4(a) MATCH PARTIAL);
464 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON DELETE SET NULL NOT NULL);
470 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON UPDATE SET DEFAULT DEFAULT 1);
476 CREATE TABLE t6(a NOT NULL NOT DEFERRABLE INITIALLY IMMEDIATE);
482 CREATE TABLE t6(a NOT NULL DEFERRABLE INITIALLY DEFERRED);
489 FOREIGN KEY (a) REFERENCES t4(b) DEFERRABLE INITIALLY DEFERRED
496 CREATE TABLE t6(a,b,c,
497 FOREIGN KEY (b,c) REFERENCES t4(x,y) MATCH PARTIAL
498 ON UPDATE SET NULL ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
505 CREATE TABLE t6(a,b,c,
506 FOREIGN KEY (b,c) REFERENCES t4(x)
509 } {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
510 do_test table-10.10 {
511 catchsql {DROP TABLE t6}
513 CREATE TABLE t6(a,b,c,
514 FOREIGN KEY (b,c) REFERENCES t4(x,y,z)
517 } {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
518 do_test table-10.11 {
519 catchsql {DROP TABLE t6}
521 CREATE TABLE t6(a,b, c REFERENCES t4(x,y));
523 } {1 {foreign key on c should reference only one column of table t4}}
524 do_test table-10.12 {
525 catchsql {DROP TABLE t6}
527 CREATE TABLE t6(a,b,c,
528 FOREIGN KEY (b,x) REFERENCES t4(x,y)
531 } {1 {unknown column "x" in foreign key definition}}
532 do_test table-10.13 {
533 catchsql {DROP TABLE t6}
535 CREATE TABLE t6(a,b,c,
536 FOREIGN KEY (x,b) REFERENCES t4(x,y)
539 } {1 {unknown column "x" in foreign key definition}}
540 } ;# endif foreignkey
542 # Test for the "typeof" function. More tests for the
543 # typeof() function are found in bind.test and types.test.
548 a integer primary key,
550 c character varying (8),
557 INSERT INTO t7(a) VALUES(1);
558 SELECT typeof(a), typeof(b), typeof(c), typeof(d),
559 typeof(e), typeof(f), typeof(g), typeof(h)
562 } {integer null null null null null null null}
565 SELECT typeof(a+b), typeof(a||b), typeof(c+d), typeof(c||d)
568 } {null null null null}
570 # Test that when creating a table using CREATE TABLE AS, column types are
571 # assigned correctly for (SELECT ...) and 'x AS y' expressions.
575 CREATE TABLE t8 AS SELECT b, h, a as i, (SELECT f FROM t7) as j FROM t7;
579 CREATE TABLE t8 AS SELECT b, h, a as i, f as j FROM t7;
585 SELECT sql FROM sqlite_master WHERE tbl_name = 't8'
587 } {{CREATE TABLE t8(b NUM,h,i INT,j)}}
589 #--------------------------------------------------------------------
590 # Test cases table-13.*
592 # Test the ability to have default values of CURRENT_TIME, CURRENT_DATE
593 # and CURRENT_TIMESTAMP.
597 CREATE TABLE tablet8(
598 a integer primary key,
599 tm text DEFAULT CURRENT_TIME,
600 dt text DEFAULT CURRENT_DATE,
601 dttm text DEFAULT CURRENT_TIMESTAMP
603 SELECT * FROM tablet8;
607 unset -nocomplain date time seconds
608 foreach {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
615 set sqlite_current_time $seconds
616 do_test table-13.2.$i {
618 INSERT INTO tablet8(a) VALUES($i);
619 SELECT tm, dt, dttm FROM tablet8 WHERE a=$i;
621 } [list $time $date [list $date $time]]
623 set sqlite_current_time 0
625 #--------------------------------------------------------------------
626 # Test cases table-14.*
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.
633 # 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.
639 # pragma vdbe_trace = 0;
641 # Try to create a table from within a callback:
642 unset -nocomplain result
646 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
647 db eval {CREATE TABLE t9(a, b, c)}
651 set result [list $rc $msg]
654 # Try to drop a table from within a callback:
658 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
659 db eval {DROP TABLE t9;}
663 set result [list $rc $msg]
664 } {1 {database table is locked}}
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.
670 file delete -force test2.db
671 file delete -force test2.db-journal
673 ATTACH 'test2.db' as aux;
675 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
676 db eval {CREATE TABLE aux.t1(a, b, c)}
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).
687 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
688 db eval {DROP TABLE aux.t1;}
692 set result [list $rc $msg]
693 } {1 {database table is locked}}
696 # 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.
703 for {set i 0} {$i<2000} {incr i} {
704 execsql "CREATE TABLE tbl$i (a, b, c)"
710 for {set i 0} {$i<2000} {incr i} {
711 execsql "DROP TABLE tbl$i"