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.
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
18 # Create a basic table and verify it is added to sqlite_master
28 SELECT sql FROM sqlite_master WHERE type!='meta'
30 } {{CREATE TABLE test1 (
36 # Verify the other fields of the sqlite_master file.
39 execsql {SELECT name, tbl_name, type FROM sqlite_master WHERE type!='meta'}
42 # Close and reopen the database. Verify that everything is
48 execsql {SELECT name, tbl_name, type from sqlite_master WHERE type!='meta'}
51 # Drop the database and make sure it disappears.
54 execsql {DROP TABLE test1}
55 execsql {SELECT * FROM sqlite_master WHERE type!='meta'}
58 # Close and reopen the database. Verify that the table is
64 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
67 # Repeat the above steps, but this time quote the table name.
70 execsql {CREATE TABLE "create" (f1 int)}
71 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
74 execsql {DROP TABLE "create"}
75 execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
78 execsql {CREATE TABLE test1("f1 ho" int)}
79 execsql {SELECT name as "X" FROM sqlite_master WHERE type!='meta'}
82 execsql {DROP TABLE "TEST1"}
83 execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
88 # Verify that we cannot make two tables with the same name
91 execsql {CREATE TABLE TEST2(one text)}
92 catchsql {CREATE TABLE test2(two text default 'hi')}
93 } {1 {table test2 already exists}}
95 catchsql {CREATE TABLE "test2" (two)}
96 } {1 {table "test2" already exists}}
98 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
100 } {1 {object name reserved for internal use: sqlite_master}}
104 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
106 } {1 {object name reserved for internal use: sqlite_master}}
108 catchsql {CREATE TABLE IF NOT EXISTS test2(x,y)}
111 catchsql {CREATE TABLE IF NOT EXISTS test2(x UNIQUE, y TEXT PRIMARY KEY)}
114 execsql {DROP TABLE test2; SELECT name FROM sqlite_master WHERE type!='meta'}
117 # Verify that we cannot make a table with the same name as an index
120 execsql {CREATE TABLE test2(one text)}
121 execsql {CREATE INDEX test3 ON test2(one)}
122 catchsql {CREATE TABLE test3(two text)}
123 } {1 {there is already an index named test3}}
127 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
129 } {1 {there is already an index named test3}}
131 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
134 execsql {DROP INDEX test3}
135 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
139 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
142 execsql {DROP TABLE test2; DROP TABLE test3}
143 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
146 # Create a table with many field names
152 f3 varchar(30) primary key,
173 execsql {SELECT sql FROM sqlite_master WHERE type=='table'}
176 set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg]
178 } {1 {table BIG already exists}}
180 set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg]
182 } {1 {table biG already exists}}
184 set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
186 } {1 {table bIg already exists}}
190 set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
192 } {1 {table Big already exists}}
194 execsql {DROP TABLE big}
195 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
198 # Try creating large numbers of tables
201 for {set i 1} {$i<=100} {incr i} {
202 lappend r [format test%03d $i]
205 for {set i 1} {$i<=100} {incr i} {
206 set sql "CREATE TABLE [format test%03d $i] ("
207 for {set k 1} {$k<$i} {incr k} {
208 append sql "field$k text,"
210 append sql "last_field text)"
213 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
218 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
221 # Drop the even numbered tables
224 for {set i 1} {$i<=100} {incr i 2} {
225 lappend r [format test%03d $i]
228 for {set i 2} {$i<=100} {incr i 2} {
229 # if {$i==38} {execsql {pragma vdbe_trace=on}}
230 set sql "DROP TABLE [format TEST%03d $i]"
233 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
237 # Drop the odd number tables
240 for {set i 1} {$i<=100} {incr i 2} {
241 set sql "DROP TABLE [format test%03d $i]"
244 execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
247 # Try to drop a table that does not exist
249 do_test table-5.1.1 {
250 catchsql {DROP TABLE test009}
251 } {1 {no such table: test009}}
252 do_test table-5.1.2 {
253 catchsql {DROP TABLE IF EXISTS test009}
256 # Try to drop sqlite_master
259 catchsql {DROP TABLE IF EXISTS sqlite_master}
260 } {1 {table sqlite_master may not be dropped}}
262 # Dropping sqlite_statN tables is OK.
264 do_test table-5.2.1 {
267 DROP TABLE IF EXISTS sqlite_stat1;
268 DROP TABLE IF EXISTS sqlite_stat2;
269 DROP TABLE IF EXISTS sqlite_stat3;
270 DROP TABLE IF EXISTS sqlite_stat4;
271 SELECT name FROM sqlite_master WHERE name GLOB 'sqlite_stat*';
275 do_test table-5.2.2 {
280 CREATE TABLE t0(a,b);
281 CREATE INDEX t ON t0(a);
282 PRAGMA writable_schema=ON;
283 UPDATE sqlite_master SET sql='CREATE TABLE a.b(a UNIQUE';
287 DROP TABLE IF EXISTS t99;
294 # Make sure an EXPLAIN does not really create a new table
297 ifcapable {explain} {
298 execsql {EXPLAIN CREATE TABLE test1(f1 int)}
300 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
303 # Make sure an EXPLAIN does not really drop an existing table
306 execsql {CREATE TABLE test1(f1 int)}
307 ifcapable {explain} {
308 execsql {EXPLAIN DROP TABLE test1}
310 execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
313 # Create a table with a goofy name
316 # execsql {CREATE TABLE 'Spaces In This Name!'(x int)}
317 # execsql {INSERT INTO 'spaces in this name!' VALUES(1)}
318 # set list [glob -nocomplain testdb/spaces*.tbl]
319 #} {testdb/spaces+in+this+name+.tbl}
321 # Try using keywords as table names or column names.
324 set v [catch {execsql {
330 fuzzy_dog_12 varchar(10),
339 INSERT INTO weird VALUES('a','b',9,0,'xyz','hi','y''all');
342 } {a b 9 0 xyz hi y'all}
347 } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
350 CREATE TABLE savepoint(release);
351 INSERT INTO savepoint(release) VALUES(10);
352 UPDATE savepoint SET release = 5;
353 SELECT release FROM savepoint;
357 # Try out the CREATE TABLE AS syntax
361 CREATE TABLE t2 AS SELECT * FROM weird;
364 } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
365 do_test table-8.1.1 {
367 SELECT sql FROM sqlite_master WHERE name='t2';
380 CREATE TABLE "t3""xyz"(a,b,c);
381 INSERT INTO [t3"xyz] VALUES(1,2,3);
382 SELECT * FROM [t3"xyz];
387 CREATE TABLE [t4"abc] AS SELECT count(*) as cnt, max(b+c) FROM [t3"xyz];
388 SELECT * FROM [t4"abc];
392 # Update for v3: The declaration type of anything except a column is now a
393 # NULL pointer, so the created table has no column types. (Changed result
394 # from {{CREATE TABLE 't4"abc'(cnt NUMERIC,"max(b+c)" NUMERIC)}}).
395 do_test table-8.3.1 {
397 SELECT sql FROM sqlite_master WHERE name='t4"abc'
399 } {{CREATE TABLE "t4""abc"(cnt,"max(b+c)")}}
404 CREATE TEMPORARY TABLE t5 AS SELECT count(*) AS [y'all] FROM [t3"xyz];
414 SELECT * FROM [t4"abc];
421 } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
426 } {1 {no such table: t5}}
429 CREATE TABLE t5 AS SELECT * FROM no_such_table;
431 } {1 {no such table: no_such_table}}
435 CREATE TABLE t10("col.1" [char.3]);
436 CREATE TABLE t11 AS SELECT * FROM t10;
437 SELECT sql FROM sqlite_master WHERE name = 't11';
439 } {{CREATE TABLE t11("col.1" TEXT)}}
448 f "VARCHAR (+1,-10, 5)",
451 CREATE TABLE t13 AS SELECT * FROM t12;
452 SELECT sql FROM sqlite_master WHERE name = 't13';
454 } {{CREATE TABLE t13(
464 # Make sure we cannot have duplicate column names within a table.
468 CREATE TABLE t6(a,b,a);
470 } {1 {duplicate column name: a}}
473 CREATE TABLE t6(a varchar(100), b blob, a integer);
475 } {1 {duplicate column name: a}}
477 # Check the foreign key syntax.
479 ifcapable {foreignkey} {
482 CREATE TABLE t6(a REFERENCES t4(a) NOT NULL);
483 INSERT INTO t6 VALUES(NULL);
485 } {1 {NOT NULL constraint failed: t6.a}}
489 CREATE TABLE t6(a REFERENCES t4(a) MATCH PARTIAL);
495 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON DELETE SET NULL NOT NULL);
501 CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON UPDATE SET DEFAULT DEFAULT 1);
507 CREATE TABLE t6(a NOT NULL NOT DEFERRABLE INITIALLY IMMEDIATE);
513 CREATE TABLE t6(a NOT NULL DEFERRABLE INITIALLY DEFERRED);
520 FOREIGN KEY (a) REFERENCES t4(b) DEFERRABLE INITIALLY DEFERRED
527 CREATE TABLE t6(a,b,c,
528 FOREIGN KEY (b,c) REFERENCES t4(x,y) MATCH PARTIAL
529 ON UPDATE SET NULL ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
536 CREATE TABLE t6(a,b,c,
537 FOREIGN KEY (b,c) REFERENCES t4(x)
540 } {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
541 do_test table-10.10 {
542 catchsql {DROP TABLE t6}
544 CREATE TABLE t6(a,b,c,
545 FOREIGN KEY (b,c) REFERENCES t4(x,y,z)
548 } {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
549 do_test table-10.11 {
550 catchsql {DROP TABLE t6}
552 CREATE TABLE t6(a,b, c REFERENCES t4(x,y));
554 } {1 {foreign key on c should reference only one column of table t4}}
555 do_test table-10.12 {
556 catchsql {DROP TABLE t6}
558 CREATE TABLE t6(a,b,c,
559 FOREIGN KEY (b,x) REFERENCES t4(x,y)
562 } {1 {unknown column "x" in foreign key definition}}
563 do_test table-10.13 {
564 catchsql {DROP TABLE t6}
566 CREATE TABLE t6(a,b,c,
567 FOREIGN KEY (x,b) REFERENCES t4(x,y)
570 } {1 {unknown column "x" in foreign key definition}}
571 } ;# endif foreignkey
573 # Test for the "typeof" function. More tests for the
574 # typeof() function are found in bind.test and types.test.
579 a integer primary key,
581 c character varying (8),
588 INSERT INTO t7(a) VALUES(1);
589 SELECT typeof(a), typeof(b), typeof(c), typeof(d),
590 typeof(e), typeof(f), typeof(g), typeof(h)
593 } {integer null null null null null null null}
596 SELECT typeof(a+b), typeof(a||b), typeof(c+d), typeof(c||d)
599 } {null null null null}
601 # Test that when creating a table using CREATE TABLE AS, column types are
602 # assigned correctly for (SELECT ...) and 'x AS y' expressions.
606 CREATE TABLE t8 AS SELECT b, h, a as i, (SELECT f FROM t7) as j FROM t7;
610 CREATE TABLE t8 AS SELECT b, h, a as i, f as j FROM t7;
616 SELECT sql FROM sqlite_master WHERE tbl_name = 't8'
618 } {{CREATE TABLE t8(b NUM,h,i INT,j)}}
620 #--------------------------------------------------------------------
621 # Test cases table-13.*
623 # Test the ability to have default values of CURRENT_TIME, CURRENT_DATE
624 # and CURRENT_TIMESTAMP.
628 CREATE TABLE tablet8(
629 a integer primary key,
630 tm text DEFAULT CURRENT_TIME,
631 dt text DEFAULT CURRENT_DATE,
632 dttm text DEFAULT CURRENT_TIMESTAMP
634 SELECT * FROM tablet8;
638 unset -nocomplain date time seconds
639 foreach {date time seconds} {
640 1976-07-04 12:00:00 205329600
641 1994-04-16 14:00:00 766504800
642 2000-01-01 00:00:00 946684800
643 2003-12-31 12:34:56 1072874096
646 set sqlite_current_time $seconds
647 do_test table-13.2.$i {
649 INSERT INTO tablet8(a) VALUES($i);
650 SELECT tm, dt, dttm FROM tablet8 WHERE a=$i;
652 } [list $time $date [list $date $time]]
654 set sqlite_current_time 0
656 #--------------------------------------------------------------------
657 # Test cases table-14.*
659 # Test that a table cannot be created or dropped while other virtual
660 # machines are active. This is required because otherwise when in
661 # auto-vacuum mode the btree-layer may need to move the root-pages of
662 # a table for which there is an open cursor.
664 # 2007-05-02: A open btree cursor no longer blocks CREATE TABLE.
665 # But DROP TABLE is still prohibited because we do not want to
666 # delete a table out from under a running query.
670 # pragma vdbe_trace = 0;
672 # Try to create a table from within a callback:
673 unset -nocomplain result
677 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
678 db eval {CREATE TABLE t9(a, b, c)}
682 set result [list $rc $msg]
685 # Try to drop a table from within a callback:
689 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
690 db eval {DROP TABLE t9;}
694 set result [list $rc $msg]
695 } {1 {database table is locked}}
698 # Now attach a database and ensure that a table can be created in the
699 # attached database whilst in a callback from a query on the main database.
702 forcedelete test2.db-journal
704 ATTACH 'test2.db' as aux;
706 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
707 db eval {CREATE TABLE aux.t1(a, b, c)}
711 # On the other hand, it should be impossible to drop a table when any VMs
712 # are active. This is because VerifyCookie instructions may have already
713 # been executed, and btree root-pages may not move after this (which a
714 # delete table might do).
718 db eval {SELECT * FROM tablet8 LIMIT 1} {} {
719 db eval {DROP TABLE aux.t1;}
723 set result [list $rc $msg]
724 } {1 {database table is locked}}
727 # Create and drop 2000 tables. This is to check that the balance_shallow()
728 # routine works correctly on the sqlite_master table. At one point it
729 # contained a bug that would prevent the right-child pointer of the
730 # child page from being copied to the root page.
734 for {set i 0} {$i<2000} {incr i} {
735 execsql "CREATE TABLE tbl$i (a, b, c)"
741 for {set i 0} {$i<2000} {incr i} {
742 execsql "DROP TABLE tbl$i"
747 # Ticket 3a88d85f36704eebe134f7f48aebf00cd6438c1a (2014-08-05)
748 # The following SQL script segfaults while running the INSERT statement:
750 # CREATE TABLE t1(x DEFAULT(max(1)));
751 # INSERT INTO t1(rowid) VALUES(1);
753 # The problem appears to be the use of an aggregate function as part of
754 # the default value for a column. This problem has been in the code since
755 # at least 2006-01-01 and probably before that. This problem was detected
756 # and reported on the sqlite-users@sqlite.org mailing list by Zsbán Ambrus.
758 do_execsql_test table-16.1 {
759 CREATE TABLE t16(x DEFAULT(max(1)));
760 INSERT INTO t16(x) VALUES(123);
761 SELECT rowid, x FROM t16;
763 do_catchsql_test table-16.2 {
764 INSERT INTO t16(rowid) VALUES(4);
765 } {1 {unknown function: max()}}
766 do_execsql_test table-16.3 {
768 CREATE TABLE t16(x DEFAULT(abs(1)));
769 INSERT INTO t16(rowid) VALUES(4);
770 SELECT rowid, x FROM t16;
772 do_catchsql_test table-16.4 {
774 CREATE TABLE t16(x DEFAULT(avg(1)));
775 INSERT INTO t16(rowid) VALUES(123);
776 SELECT rowid, x FROM t16;
777 } {1 {unknown function: avg()}}
778 do_catchsql_test table-16.5 {
780 CREATE TABLE t16(x DEFAULT(count()));
781 INSERT INTO t16(rowid) VALUES(123);
782 SELECT rowid, x FROM t16;
783 } {1 {unknown function: count()}}
784 do_catchsql_test table-16.6 {
786 CREATE TABLE t16(x DEFAULT(group_concat('x',',')));
787 INSERT INTO t16(rowid) VALUES(123);
788 SELECT rowid, x FROM t16;
789 } {1 {unknown function: group_concat()}}
790 do_catchsql_test table-16.7 {
791 INSERT INTO t16 DEFAULT VALUES;
792 } {1 {unknown function: group_concat()}}
794 # Ticket [https://www.sqlite.org/src/info/094d39a4c95ee4abbc417f04214617675ba15c63]
795 # describes a assertion fault that occurs on a CREATE TABLE .. AS SELECT statement.
796 # the following test verifies that the problem has been fixed.
798 do_execsql_test table-17.1 {
799 DROP TABLE IF EXISTS t1;
800 CREATE TABLE t1(a TEXT);
801 INSERT INTO t1(a) VALUES(1),(2);
802 DROP TABLE IF EXISTS t2;
803 CREATE TABLE t2(x TEXT, y TEXT);
804 INSERT INTO t2(x,y) VALUES(3,4);
805 DROP TABLE IF EXISTS t3;
807 SELECT a AS p, coalesce(y,a) AS q FROM t1 LEFT JOIN t2 ON a=x;
808 SELECT p, q, '|' FROM t3 ORDER BY p;
812 # Ticket [https://www.sqlite.org/src/tktview/873cae2b6e25b1991ce5e9b782f9cd0409b96063]
813 # Make sure a CREATE TABLE AS statement correctly rolls back partial changes to the
814 # sqlite_master table when the SELECT on the right-hand side aborts.
816 do_catchsql_test table-18.1 {
817 DROP TABLE IF EXISTS t1;
819 CREATE TABLE t1 AS SELECT zeroblob(2e20);
820 } {1 {string or blob too big}}
821 do_execsql_test table-18.2 {
823 PRAGMA integrity_check;
827 # Ticket [https://www.sqlite.org/src/info/acd12990885d9276]
828 # "CREATE TABLE ... AS SELECT ... FROM sqlite_master" fails because the row
829 # in the sqlite_master table for the next table is initially populated
830 # with a NULL instead of a record created by OP_Record.
832 do_execsql_test table-19.1 {
833 CREATE TABLE t19 AS SELECT * FROM sqlite_master;
834 SELECT name FROM t19 ORDER BY name;
835 } {{} savepoint t10 t11 t12 t13 t16 t2 t3 t3\"xyz t4\"abc t7 t8 t9 tablet8 test1 weird}