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>