Annotation of embedaddon/sqlite3/test/table.test, revision 1.1

1.1     ! misho       1: # 2001 September 15
        !             2: #
        !             3: # The author disclaims copyright to this source code.  In place of
        !             4: # a legal notice, here is a blessing:
        !             5: #
        !             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.
        !             9: #
        !            10: #***********************************************************************
        !            11: # This file implements regression tests for SQLite library.  The
        !            12: # focus of this file is testing the CREATE TABLE statement.
        !            13: #
        !            14: # $Id: table.test,v 1.53 2009/06/05 17:09:12 drh Exp $
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: 
        !            19: # Create a basic table and verify it is added to sqlite_master
        !            20: #
        !            21: do_test table-1.1 {
        !            22:   execsql {
        !            23:     CREATE TABLE test1 (
        !            24:       one varchar(10),
        !            25:       two text
        !            26:     )
        !            27:   }
        !            28:   execsql {
        !            29:     SELECT sql FROM sqlite_master WHERE type!='meta'
        !            30:   }
        !            31: } {{CREATE TABLE test1 (
        !            32:       one varchar(10),
        !            33:       two text
        !            34:     )}}
        !            35: 
        !            36: 
        !            37: # Verify the other fields of the sqlite_master file.
        !            38: #
        !            39: do_test table-1.3 {
        !            40:   execsql {SELECT name, tbl_name, type FROM sqlite_master WHERE type!='meta'}
        !            41: } {test1 test1 table}
        !            42: 
        !            43: # Close and reopen the database.  Verify that everything is
        !            44: # still the same.
        !            45: #
        !            46: do_test table-1.4 {
        !            47:   db close
        !            48:   sqlite3 db test.db
        !            49:   execsql {SELECT name, tbl_name, type from sqlite_master WHERE type!='meta'}
        !            50: } {test1 test1 table}
        !            51: 
        !            52: # Drop the database and make sure it disappears.
        !            53: #
        !            54: do_test table-1.5 {
        !            55:   execsql {DROP TABLE test1}
        !            56:   execsql {SELECT * FROM sqlite_master WHERE type!='meta'}
        !            57: } {}
        !            58: 
        !            59: # Close and reopen the database.  Verify that the table is
        !            60: # still gone.
        !            61: #
        !            62: do_test table-1.6 {
        !            63:   db close
        !            64:   sqlite3 db test.db
        !            65:   execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
        !            66: } {}
        !            67: 
        !            68: # Repeat the above steps, but this time quote the table name.
        !            69: #
        !            70: do_test table-1.10 {
        !            71:   execsql {CREATE TABLE "create" (f1 int)}
        !            72:   execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
        !            73: } {create}
        !            74: do_test table-1.11 {
        !            75:   execsql {DROP TABLE "create"}
        !            76:   execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
        !            77: } {}
        !            78: do_test table-1.12 {
        !            79:   execsql {CREATE TABLE test1("f1 ho" int)}
        !            80:   execsql {SELECT name as "X" FROM sqlite_master WHERE type!='meta'}
        !            81: } {test1}
        !            82: do_test table-1.13 {
        !            83:   execsql {DROP TABLE "TEST1"}
        !            84:   execsql {SELECT name FROM "sqlite_master" WHERE type!='meta'}
        !            85: } {}
        !            86: 
        !            87: 
        !            88: 
        !            89: # Verify that we cannot make two tables with the same name
        !            90: #
        !            91: do_test table-2.1 {
        !            92:   execsql {CREATE TABLE TEST2(one text)}
        !            93:   catchsql {CREATE TABLE test2(two text default 'hi')}
        !            94: } {1 {table test2 already exists}}
        !            95: do_test table-2.1.1 {
        !            96:   catchsql {CREATE TABLE "test2" (two)}
        !            97: } {1 {table "test2" already exists}}
        !            98: do_test table-2.1b {
        !            99:   set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
        !           100:   lappend v $msg
        !           101: } {1 {object name reserved for internal use: sqlite_master}}
        !           102: do_test table-2.1c {
        !           103:   db close
        !           104:   sqlite3 db test.db
        !           105:   set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
        !           106:   lappend v $msg
        !           107: } {1 {object name reserved for internal use: sqlite_master}}
        !           108: do_test table-2.1d {
        !           109:   catchsql {CREATE TABLE IF NOT EXISTS test2(x,y)}
        !           110: } {0 {}}
        !           111: do_test table-2.1e {
        !           112:   catchsql {CREATE TABLE IF NOT EXISTS test2(x UNIQUE, y TEXT PRIMARY KEY)}
        !           113: } {0 {}}
        !           114: do_test table-2.1f {
        !           115:   execsql {DROP TABLE test2; SELECT name FROM sqlite_master WHERE type!='meta'}
        !           116: } {}
        !           117: 
        !           118: # Verify that we cannot make a table with the same name as an index
        !           119: #
        !           120: do_test table-2.2a {
        !           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}}
        !           125: do_test table-2.2b {
        !           126:   db close
        !           127:   sqlite3 db test.db
        !           128:   set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
        !           129:   lappend v $msg
        !           130: } {1 {there is already an index named test3}}
        !           131: do_test table-2.2c {
        !           132:   execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
        !           133: } {test2 test3}
        !           134: do_test table-2.2d {
        !           135:   execsql {DROP INDEX test3}
        !           136:   set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
        !           137:   lappend v $msg
        !           138: } {0 {}}
        !           139: do_test table-2.2e {
        !           140:   execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
        !           141: } {test2 test3}
        !           142: do_test table-2.2f {
        !           143:   execsql {DROP TABLE test2; DROP TABLE test3}
        !           144:   execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
        !           145: } {}
        !           146: 
        !           147: # Create a table with many field names
        !           148: #
        !           149: set big_table \
        !           150: {CREATE TABLE big(
        !           151:   f1 varchar(20),
        !           152:   f2 char(10),
        !           153:   f3 varchar(30) primary key,
        !           154:   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: )}
        !           172: do_test table-3.1 {
        !           173:   execsql $big_table
        !           174:   execsql {SELECT sql FROM sqlite_master WHERE type=='table'}
        !           175: } \{$big_table\}
        !           176: do_test table-3.2 {
        !           177:   set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg]
        !           178:   lappend v $msg
        !           179: } {1 {table BIG already exists}}
        !           180: do_test table-3.3 {
        !           181:   set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg]
        !           182:   lappend v $msg
        !           183: } {1 {table biG already exists}}
        !           184: do_test table-3.4 {
        !           185:   set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
        !           186:   lappend v $msg
        !           187: } {1 {table bIg already exists}}
        !           188: do_test table-3.5 {
        !           189:   db close
        !           190:   sqlite3 db test.db
        !           191:   set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
        !           192:   lappend v $msg
        !           193: } {1 {table Big already exists}}
        !           194: do_test table-3.6 {
        !           195:   execsql {DROP TABLE big}
        !           196:   execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
        !           197: } {}
        !           198: 
        !           199: # Try creating large numbers of tables
        !           200: #
        !           201: set r {}
        !           202: for {set i 1} {$i<=100} {incr i} {
        !           203:   lappend r [format test%03d $i]
        !           204: }
        !           205: do_test table-4.1 {
        !           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,"
        !           210:     }
        !           211:     append sql "last_field text)"
        !           212:     execsql $sql
        !           213:   }
        !           214:   execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
        !           215: } $r
        !           216: do_test table-4.1b {
        !           217:   db close
        !           218:   sqlite3 db test.db
        !           219:   execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
        !           220: } $r
        !           221: 
        !           222: # Drop the even numbered tables
        !           223: #
        !           224: set r {}
        !           225: for {set i 1} {$i<=100} {incr i 2} {
        !           226:   lappend r [format test%03d $i]
        !           227: }
        !           228: do_test table-4.2 {
        !           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]"
        !           232:     execsql $sql
        !           233:   }
        !           234:   execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
        !           235: } $r
        !           236: #exit
        !           237: 
        !           238: # Drop the odd number tables
        !           239: #
        !           240: do_test table-4.3 {
        !           241:   for {set i 1} {$i<=100} {incr i 2} {
        !           242:     set sql "DROP TABLE [format test%03d $i]"
        !           243:     execsql $sql
        !           244:   }
        !           245:   execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
        !           246: } {}
        !           247: 
        !           248: # Try to drop a table that does not exist
        !           249: #
        !           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}
        !           255: } {0 {}}
        !           256: 
        !           257: # Try to drop sqlite_master
        !           258: #
        !           259: do_test table-5.2 {
        !           260:   catchsql {DROP TABLE IF EXISTS sqlite_master}
        !           261: } {1 {table sqlite_master may not be dropped}}
        !           262: 
        !           263: # Dropping sqlite_statN tables is OK.
        !           264: #
        !           265: do_test table-5.2.1 {
        !           266:   db eval {
        !           267:     ANALYZE;
        !           268:     DROP TABLE IF EXISTS sqlite_stat1;
        !           269:     DROP TABLE IF EXISTS sqlite_stat2;
        !           270:     DROP TABLE IF EXISTS sqlite_stat3;
        !           271:     SELECT name FROM sqlite_master WHERE name GLOB 'sqlite_stat*';
        !           272:   }
        !           273: } {}
        !           274: 
        !           275: # Make sure an EXPLAIN does not really create a new table
        !           276: #
        !           277: do_test table-5.3 {
        !           278:   ifcapable {explain} {
        !           279:     execsql {EXPLAIN CREATE TABLE test1(f1 int)}
        !           280:   }
        !           281:   execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
        !           282: } {}
        !           283: 
        !           284: # Make sure an EXPLAIN does not really drop an existing table
        !           285: #
        !           286: do_test table-5.4 {
        !           287:   execsql {CREATE TABLE test1(f1 int)}
        !           288:   ifcapable {explain} {
        !           289:     execsql {EXPLAIN DROP TABLE test1}
        !           290:   }
        !           291:   execsql {SELECT name FROM sqlite_master WHERE type!='meta'}
        !           292: } {test1}
        !           293: 
        !           294: # Create a table with a goofy name
        !           295: #
        !           296: #do_test table-6.1 {
        !           297: #  execsql {CREATE TABLE 'Spaces In This Name!'(x int)}
        !           298: #  execsql {INSERT INTO 'spaces in this name!' VALUES(1)}
        !           299: #  set list [glob -nocomplain testdb/spaces*.tbl]
        !           300: #} {testdb/spaces+in+this+name+.tbl}
        !           301: 
        !           302: # Try using keywords as table names or column names.
        !           303: # 
        !           304: do_test table-7.1 {
        !           305:   set v [catch {execsql {
        !           306:     CREATE TABLE weird(
        !           307:       desc text,
        !           308:       asc text,
        !           309:       key int,
        !           310:       [14_vac] boolean,
        !           311:       fuzzy_dog_12 varchar(10),
        !           312:       begin blob,
        !           313:       end clob
        !           314:     )
        !           315:   }} msg]
        !           316:   lappend v $msg
        !           317: } {0 {}}
        !           318: do_test table-7.2 {
        !           319:   execsql {
        !           320:     INSERT INTO weird VALUES('a','b',9,0,'xyz','hi','y''all');
        !           321:     SELECT * FROM weird;
        !           322:   }
        !           323: } {a b 9 0 xyz hi y'all}
        !           324: do_test table-7.3 {
        !           325:   execsql2 {
        !           326:     SELECT * FROM weird;
        !           327:   }
        !           328: } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
        !           329: do_test table-7.3 {
        !           330:   execsql {
        !           331:     CREATE TABLE savepoint(release);
        !           332:     INSERT INTO savepoint(release) VALUES(10);
        !           333:     UPDATE savepoint SET release = 5;
        !           334:     SELECT release FROM savepoint;
        !           335:   }
        !           336: } {5}
        !           337: 
        !           338: # Try out the CREATE TABLE AS syntax
        !           339: #
        !           340: do_test table-8.1 {
        !           341:   execsql2 {
        !           342:     CREATE TABLE t2 AS SELECT * FROM weird;
        !           343:     SELECT * FROM t2;
        !           344:   }
        !           345: } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
        !           346: do_test table-8.1.1 {
        !           347:   execsql {
        !           348:     SELECT sql FROM sqlite_master WHERE name='t2';
        !           349:   }
        !           350: } {{CREATE TABLE t2(
        !           351:   "desc" TEXT,
        !           352:   "asc" TEXT,
        !           353:   "key" INT,
        !           354:   "14_vac" NUM,
        !           355:   fuzzy_dog_12 TEXT,
        !           356:   "begin",
        !           357:   "end" TEXT
        !           358: )}}
        !           359: do_test table-8.2 {
        !           360:   execsql {
        !           361:     CREATE TABLE "t3""xyz"(a,b,c);
        !           362:     INSERT INTO [t3"xyz] VALUES(1,2,3);
        !           363:     SELECT * FROM [t3"xyz];
        !           364:   }
        !           365: } {1 2 3}
        !           366: do_test table-8.3 {
        !           367:   execsql2 {
        !           368:     CREATE TABLE [t4"abc] AS SELECT count(*) as cnt, max(b+c) FROM [t3"xyz];
        !           369:     SELECT * FROM [t4"abc];
        !           370:   }
        !           371: } {cnt 1 max(b+c) 5}
        !           372: 
        !           373: # Update for v3: The declaration type of anything except a column is now a
        !           374: # NULL pointer, so the created table has no column types. (Changed result
        !           375: # from {{CREATE TABLE 't4"abc'(cnt NUMERIC,"max(b+c)" NUMERIC)}}).
        !           376: do_test table-8.3.1 {
        !           377:   execsql {
        !           378:     SELECT sql FROM sqlite_master WHERE name='t4"abc'
        !           379:   }
        !           380: } {{CREATE TABLE "t4""abc"(cnt,"max(b+c)")}}
        !           381: 
        !           382: ifcapable tempdb {
        !           383:   do_test table-8.4 {
        !           384:     execsql2 {
        !           385:       CREATE TEMPORARY TABLE t5 AS SELECT count(*) AS [y'all] FROM [t3"xyz];
        !           386:       SELECT * FROM t5;
        !           387:     }
        !           388:   } {y'all 1}
        !           389: }
        !           390: 
        !           391: do_test table-8.5 {
        !           392:   db close
        !           393:   sqlite3 db test.db
        !           394:   execsql2 {
        !           395:     SELECT * FROM [t4"abc];
        !           396:   }
        !           397: } {cnt 1 max(b+c) 5}
        !           398: do_test table-8.6 {
        !           399:   execsql2 {
        !           400:     SELECT * FROM t2;
        !           401:   }
        !           402: } {desc a asc b key 9 14_vac 0 fuzzy_dog_12 xyz begin hi end y'all}
        !           403: do_test table-8.7 {
        !           404:   catchsql {
        !           405:     SELECT * FROM t5;
        !           406:   }
        !           407: } {1 {no such table: t5}}
        !           408: do_test table-8.8 {
        !           409:   catchsql {
        !           410:     CREATE TABLE t5 AS SELECT * FROM no_such_table;
        !           411:   }
        !           412: } {1 {no such table: no_such_table}}
        !           413: 
        !           414: do_test table-8.9 {
        !           415:   execsql {
        !           416:     CREATE TABLE t10("col.1" [char.3]);
        !           417:     CREATE TABLE t11 AS SELECT * FROM t10;
        !           418:     SELECT sql FROM sqlite_master WHERE name = 't11';
        !           419:   }
        !           420: } {{CREATE TABLE t11("col.1" TEXT)}}
        !           421: do_test table-8.10 {
        !           422:   execsql {
        !           423:     CREATE TABLE t12(
        !           424:       a INTEGER,
        !           425:       b VARCHAR(10),
        !           426:       c VARCHAR(1,10),
        !           427:       d VARCHAR(+1,-10),
        !           428:       e VARCHAR (+1,-10),
        !           429:       f "VARCHAR (+1,-10, 5)",
        !           430:       g BIG INTEGER
        !           431:     );
        !           432:     CREATE TABLE t13 AS SELECT * FROM t12;
        !           433:     SELECT sql FROM sqlite_master WHERE name = 't13';
        !           434:   }
        !           435: } {{CREATE TABLE t13(
        !           436:   a INT,
        !           437:   b TEXT,
        !           438:   c TEXT,
        !           439:   d TEXT,
        !           440:   e TEXT,
        !           441:   f TEXT,
        !           442:   g INT
        !           443: )}}
        !           444: 
        !           445: # Make sure we cannot have duplicate column names within a table.
        !           446: #
        !           447: do_test table-9.1 {
        !           448:   catchsql {
        !           449:     CREATE TABLE t6(a,b,a);
        !           450:   }
        !           451: } {1 {duplicate column name: a}}
        !           452: do_test table-9.2 {
        !           453:   catchsql {
        !           454:     CREATE TABLE t6(a varchar(100), b blob, a integer);
        !           455:   }
        !           456: } {1 {duplicate column name: a}}
        !           457: 
        !           458: # Check the foreign key syntax.
        !           459: #
        !           460: ifcapable {foreignkey} {
        !           461: do_test table-10.1 {
        !           462:   catchsql {
        !           463:     CREATE TABLE t6(a REFERENCES t4(a) NOT NULL);
        !           464:     INSERT INTO t6 VALUES(NULL);
        !           465:   }
        !           466: } {1 {t6.a may not be NULL}}
        !           467: do_test table-10.2 {
        !           468:   catchsql {
        !           469:     DROP TABLE t6;
        !           470:     CREATE TABLE t6(a REFERENCES t4(a) MATCH PARTIAL);
        !           471:   }
        !           472: } {0 {}}
        !           473: do_test table-10.3 {
        !           474:   catchsql {
        !           475:     DROP TABLE t6;
        !           476:     CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON DELETE SET NULL NOT NULL);
        !           477:   }
        !           478: } {0 {}}
        !           479: do_test table-10.4 {
        !           480:   catchsql {
        !           481:     DROP TABLE t6;
        !           482:     CREATE TABLE t6(a REFERENCES t4 MATCH FULL ON UPDATE SET DEFAULT DEFAULT 1);
        !           483:   }
        !           484: } {0 {}}
        !           485: do_test table-10.5 {
        !           486:   catchsql {
        !           487:     DROP TABLE t6;
        !           488:     CREATE TABLE t6(a NOT NULL NOT DEFERRABLE INITIALLY IMMEDIATE);
        !           489:   }
        !           490: } {0 {}}
        !           491: do_test table-10.6 {
        !           492:   catchsql {
        !           493:     DROP TABLE t6;
        !           494:     CREATE TABLE t6(a NOT NULL DEFERRABLE INITIALLY DEFERRED);
        !           495:   }
        !           496: } {0 {}}
        !           497: do_test table-10.7 {
        !           498:   catchsql {
        !           499:     DROP TABLE t6;
        !           500:     CREATE TABLE t6(a,
        !           501:       FOREIGN KEY (a) REFERENCES t4(b) DEFERRABLE INITIALLY DEFERRED
        !           502:     );
        !           503:   }
        !           504: } {0 {}}
        !           505: do_test table-10.8 {
        !           506:   catchsql {
        !           507:     DROP TABLE t6;
        !           508:     CREATE TABLE t6(a,b,c,
        !           509:       FOREIGN KEY (b,c) REFERENCES t4(x,y) MATCH PARTIAL
        !           510:         ON UPDATE SET NULL ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
        !           511:     );
        !           512:   }
        !           513: } {0 {}}
        !           514: do_test table-10.9 {
        !           515:   catchsql {
        !           516:     DROP TABLE t6;
        !           517:     CREATE TABLE t6(a,b,c,
        !           518:       FOREIGN KEY (b,c) REFERENCES t4(x)
        !           519:     );
        !           520:   }
        !           521: } {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
        !           522: do_test table-10.10 {
        !           523:   catchsql {DROP TABLE t6}
        !           524:   catchsql {
        !           525:     CREATE TABLE t6(a,b,c,
        !           526:       FOREIGN KEY (b,c) REFERENCES t4(x,y,z)
        !           527:     );
        !           528:   }
        !           529: } {1 {number of columns in foreign key does not match the number of columns in the referenced table}}
        !           530: do_test table-10.11 {
        !           531:   catchsql {DROP TABLE t6}
        !           532:   catchsql {
        !           533:     CREATE TABLE t6(a,b, c REFERENCES t4(x,y));
        !           534:   }
        !           535: } {1 {foreign key on c should reference only one column of table t4}}
        !           536: do_test table-10.12 {
        !           537:   catchsql {DROP TABLE t6}
        !           538:   catchsql {
        !           539:     CREATE TABLE t6(a,b,c,
        !           540:       FOREIGN KEY (b,x) REFERENCES t4(x,y)
        !           541:     );
        !           542:   }
        !           543: } {1 {unknown column "x" in foreign key definition}}
        !           544: do_test table-10.13 {
        !           545:   catchsql {DROP TABLE t6}
        !           546:   catchsql {
        !           547:     CREATE TABLE t6(a,b,c,
        !           548:       FOREIGN KEY (x,b) REFERENCES t4(x,y)
        !           549:     );
        !           550:   }
        !           551: } {1 {unknown column "x" in foreign key definition}}
        !           552: } ;# endif foreignkey
        !           553: 
        !           554: # Test for the "typeof" function. More tests for the
        !           555: # typeof() function are found in bind.test and types.test.
        !           556: #
        !           557: do_test table-11.1 {
        !           558:   execsql {
        !           559:     CREATE TABLE t7(
        !           560:        a integer primary key,
        !           561:        b number(5,10),
        !           562:        c character varying (8),
        !           563:        d VARCHAR(9),
        !           564:        e clob,
        !           565:        f BLOB,
        !           566:        g Text,
        !           567:        h
        !           568:     );
        !           569:     INSERT INTO t7(a) VALUES(1);
        !           570:     SELECT typeof(a), typeof(b), typeof(c), typeof(d),
        !           571:            typeof(e), typeof(f), typeof(g), typeof(h)
        !           572:     FROM t7 LIMIT 1;
        !           573:   }
        !           574: } {integer null null null null null null null} 
        !           575: do_test table-11.2 {
        !           576:   execsql {
        !           577:     SELECT typeof(a+b), typeof(a||b), typeof(c+d), typeof(c||d)
        !           578:     FROM t7 LIMIT 1;
        !           579:   }
        !           580: } {null null null null}
        !           581: 
        !           582: # Test that when creating a table using CREATE TABLE AS, column types are
        !           583: # assigned correctly for (SELECT ...) and 'x AS y' expressions.
        !           584: do_test table-12.1 {
        !           585:   ifcapable subquery {
        !           586:     execsql {
        !           587:       CREATE TABLE t8 AS SELECT b, h, a as i, (SELECT f FROM t7) as j FROM t7;
        !           588:     }
        !           589:   } else {
        !           590:     execsql {
        !           591:       CREATE TABLE t8 AS SELECT b, h, a as i, f as j FROM t7;
        !           592:     }
        !           593:   }
        !           594: } {}
        !           595: do_test table-12.2 {
        !           596:   execsql {
        !           597:     SELECT sql FROM sqlite_master WHERE tbl_name = 't8'
        !           598:   }
        !           599: } {{CREATE TABLE t8(b NUM,h,i INT,j)}}
        !           600: 
        !           601: #--------------------------------------------------------------------
        !           602: # Test cases table-13.*
        !           603: #
        !           604: # Test the ability to have default values of CURRENT_TIME, CURRENT_DATE
        !           605: # and CURRENT_TIMESTAMP.
        !           606: #
        !           607: do_test table-13.1 {
        !           608:   execsql {
        !           609:     CREATE TABLE tablet8(
        !           610:        a integer primary key,
        !           611:        tm text DEFAULT CURRENT_TIME,
        !           612:        dt text DEFAULT CURRENT_DATE,
        !           613:        dttm text DEFAULT CURRENT_TIMESTAMP
        !           614:     );
        !           615:     SELECT * FROM tablet8;
        !           616:   }
        !           617: } {}
        !           618: set i 0
        !           619: unset -nocomplain date time seconds
        !           620: foreach {date time seconds} {
        !           621:   1976-07-04 12:00:00 205329600
        !           622:   1994-04-16 14:00:00 766504800
        !           623:   2000-01-01 00:00:00 946684800
        !           624:   2003-12-31 12:34:56 1072874096
        !           625: } {
        !           626:   incr i
        !           627:   set sqlite_current_time $seconds
        !           628:   do_test table-13.2.$i {
        !           629:     execsql "
        !           630:       INSERT INTO tablet8(a) VALUES($i);
        !           631:       SELECT tm, dt, dttm FROM tablet8 WHERE a=$i;
        !           632:     "
        !           633:   } [list $time $date [list $date $time]]
        !           634: }
        !           635: set sqlite_current_time 0
        !           636: 
        !           637: #--------------------------------------------------------------------
        !           638: # Test cases table-14.*
        !           639: #
        !           640: # Test that a table cannot be created or dropped while other virtual
        !           641: # machines are active. This is required because otherwise when in 
        !           642: # auto-vacuum mode the btree-layer may need to move the root-pages of 
        !           643: # a table for which there is an open cursor.
        !           644: #
        !           645: # 2007-05-02:  A open btree cursor no longer blocks CREATE TABLE.
        !           646: # But DROP TABLE is still prohibited because we do not want to
        !           647: # delete a table out from under a running query.
        !           648: #
        !           649: 
        !           650: # db eval {
        !           651: #   pragma vdbe_trace = 0;
        !           652: # }
        !           653: # Try to create a table from within a callback:
        !           654: unset -nocomplain result
        !           655: do_test table-14.1 {
        !           656:   set rc [
        !           657:     catch {
        !           658:       db eval {SELECT * FROM tablet8 LIMIT 1} {} {
        !           659:         db eval {CREATE TABLE t9(a, b, c)}
        !           660:       }
        !           661:     } msg
        !           662:   ]
        !           663:   set result [list $rc $msg]
        !           664: } {0 {}}
        !           665: 
        !           666: # Try to drop a table from within a callback:
        !           667: do_test table-14.2 {
        !           668:   set rc [
        !           669:     catch {
        !           670:       db eval {SELECT * FROM tablet8 LIMIT 1} {} {
        !           671:         db eval {DROP TABLE t9;}
        !           672:       }
        !           673:     } msg
        !           674:   ] 
        !           675:   set result [list $rc $msg]
        !           676: } {1 {database table is locked}}
        !           677: 
        !           678: ifcapable attach {
        !           679:   # Now attach a database and ensure that a table can be created in the 
        !           680:   # attached database whilst in a callback from a query on the main database.
        !           681:   do_test table-14.3 {
        !           682:     forcedelete test2.db
        !           683:     forcedelete test2.db-journal
        !           684:     execsql {
        !           685:       ATTACH 'test2.db' as aux;
        !           686:     }
        !           687:     db eval {SELECT * FROM tablet8 LIMIT 1} {} {
        !           688:       db eval {CREATE TABLE aux.t1(a, b, c)}
        !           689:     }
        !           690:   } {}
        !           691:   
        !           692:   # On the other hand, it should be impossible to drop a table when any VMs 
        !           693:   # are active. This is because VerifyCookie instructions may have already
        !           694:   # been executed, and btree root-pages may not move after this (which a
        !           695:   # delete table might do).
        !           696:   do_test table-14.4 {
        !           697:     set rc [
        !           698:       catch {
        !           699:         db eval {SELECT * FROM tablet8 LIMIT 1} {} {
        !           700:           db eval {DROP TABLE aux.t1;}
        !           701:         }
        !           702:       } msg
        !           703:     ] 
        !           704:     set result [list $rc $msg]
        !           705:   } {1 {database table is locked}}
        !           706: }
        !           707: 
        !           708: # Create and drop 2000 tables. This is to check that the balance_shallow()
        !           709: # routine works correctly on the sqlite_master table. At one point it
        !           710: # contained a bug that would prevent the right-child pointer of the
        !           711: # child page from being copied to the root page.
        !           712: #
        !           713: do_test table-15.1 {
        !           714:   execsql {BEGIN}
        !           715:   for {set i 0} {$i<2000} {incr i} {
        !           716:     execsql "CREATE TABLE tbl$i (a, b, c)"
        !           717:   }
        !           718:   execsql {COMMIT}
        !           719: } {}
        !           720: do_test table-15.2 {
        !           721:   execsql {BEGIN}
        !           722:   for {set i 0} {$i<2000} {incr i} {
        !           723:     execsql "DROP TABLE tbl$i"
        !           724:   }
        !           725:   execsql {COMMIT}
        !           726: } {}
        !           727: 
        !           728: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>