Annotation of embedaddon/sqlite3/test/temptable.test, revision 1.1
1.1 ! misho 1: # 2001 October 7
! 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.
! 12: #
! 13: # This file implements tests for temporary tables and indices.
! 14: #
! 15: # $Id: temptable.test,v 1.21 2009/06/16 17:49:36 drh Exp $
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: ifcapable !tempdb {
! 21: finish_test
! 22: return
! 23: }
! 24:
! 25: # Create an alternative connection to the database
! 26: #
! 27: do_test temptable-1.0 {
! 28: sqlite3 db2 ./test.db
! 29: set dummy {}
! 30: } {}
! 31:
! 32: # Create a permanent table.
! 33: #
! 34: do_test temptable-1.1 {
! 35: execsql {CREATE TABLE t1(a,b,c);}
! 36: execsql {INSERT INTO t1 VALUES(1,2,3);}
! 37: execsql {SELECT * FROM t1}
! 38: } {1 2 3}
! 39: do_test temptable-1.2 {
! 40: catch {db2 eval {SELECT * FROM sqlite_master}}
! 41: db2 eval {SELECT * FROM t1}
! 42: } {1 2 3}
! 43: do_test temptable-1.3 {
! 44: execsql {SELECT name FROM sqlite_master}
! 45: } {t1}
! 46: do_test temptable-1.4 {
! 47: db2 eval {SELECT name FROM sqlite_master}
! 48: } {t1}
! 49:
! 50: # Create a temporary table. Verify that only one of the two
! 51: # processes can see it.
! 52: #
! 53: do_test temptable-1.5 {
! 54: db2 eval {
! 55: CREATE TEMP TABLE t2(x,y,z);
! 56: INSERT INTO t2 VALUES(4,5,6);
! 57: }
! 58: db2 eval {SELECT * FROM t2}
! 59: } {4 5 6}
! 60: do_test temptable-1.6 {
! 61: catch {execsql {SELECT * FROM sqlite_master}}
! 62: catchsql {SELECT * FROM t2}
! 63: } {1 {no such table: t2}}
! 64: do_test temptable-1.7 {
! 65: catchsql {INSERT INTO t2 VALUES(8,9,0);}
! 66: } {1 {no such table: t2}}
! 67: do_test temptable-1.8 {
! 68: db2 eval {INSERT INTO t2 VALUES(8,9,0);}
! 69: db2 eval {SELECT * FROM t2 ORDER BY x}
! 70: } {4 5 6 8 9 0}
! 71: do_test temptable-1.9 {
! 72: db2 eval {DELETE FROM t2 WHERE x==8}
! 73: db2 eval {SELECT * FROM t2 ORDER BY x}
! 74: } {4 5 6}
! 75: do_test temptable-1.10 {
! 76: db2 eval {DELETE FROM t2}
! 77: db2 eval {SELECT * FROM t2}
! 78: } {}
! 79: do_test temptable-1.11 {
! 80: db2 eval {
! 81: INSERT INTO t2 VALUES(7,6,5);
! 82: INSERT INTO t2 VALUES(4,3,2);
! 83: SELECT * FROM t2 ORDER BY x;
! 84: }
! 85: } {4 3 2 7 6 5}
! 86: do_test temptable-1.12 {
! 87: db2 eval {DROP TABLE t2;}
! 88: set r [catch {db2 eval {SELECT * FROM t2}} msg]
! 89: lappend r $msg
! 90: } {1 {no such table: t2}}
! 91:
! 92: # Make sure temporary tables work with transactions
! 93: #
! 94: do_test temptable-2.1 {
! 95: execsql {
! 96: BEGIN TRANSACTION;
! 97: CREATE TEMPORARY TABLE t2(x,y);
! 98: INSERT INTO t2 VALUES(1,2);
! 99: SELECT * FROM t2;
! 100: }
! 101: } {1 2}
! 102: do_test temptable-2.2 {
! 103: execsql {ROLLBACK}
! 104: catchsql {SELECT * FROM t2}
! 105: } {1 {no such table: t2}}
! 106: do_test temptable-2.3 {
! 107: execsql {
! 108: BEGIN TRANSACTION;
! 109: CREATE TEMPORARY TABLE t2(x,y);
! 110: INSERT INTO t2 VALUES(1,2);
! 111: SELECT * FROM t2;
! 112: }
! 113: } {1 2}
! 114: do_test temptable-2.4 {
! 115: execsql {COMMIT}
! 116: catchsql {SELECT * FROM t2}
! 117: } {0 {1 2}}
! 118: do_test temptable-2.5 {
! 119: set r [catch {db2 eval {SELECT * FROM t2}} msg]
! 120: lappend r $msg
! 121: } {1 {no such table: t2}}
! 122:
! 123: # Make sure indices on temporary tables are also temporary.
! 124: #
! 125: do_test temptable-3.1 {
! 126: execsql {
! 127: CREATE INDEX i2 ON t2(x);
! 128: SELECT name FROM sqlite_master WHERE type='index';
! 129: }
! 130: } {}
! 131: do_test temptable-3.2 {
! 132: execsql {
! 133: SELECT y FROM t2 WHERE x=1;
! 134: }
! 135: } {2}
! 136: do_test temptable-3.3 {
! 137: execsql {
! 138: DROP INDEX i2;
! 139: SELECT y FROM t2 WHERE x=1;
! 140: }
! 141: } {2}
! 142: do_test temptable-3.4 {
! 143: execsql {
! 144: CREATE INDEX i2 ON t2(x);
! 145: DROP TABLE t2;
! 146: }
! 147: catchsql {DROP INDEX i2}
! 148: } {1 {no such index: i2}}
! 149:
! 150: # Check for correct name collision processing. A name collision can
! 151: # occur when process A creates a temporary table T then process B
! 152: # creates a permanent table also named T. The temp table in process A
! 153: # hides the existance of the permanent table.
! 154: #
! 155: do_test temptable-4.1 {
! 156: execsql {
! 157: CREATE TEMP TABLE t2(x,y);
! 158: INSERT INTO t2 VALUES(10,20);
! 159: SELECT * FROM t2;
! 160: } db2
! 161: } {10 20}
! 162: do_test temptable-4.2 {
! 163: execsql {
! 164: CREATE TABLE t2(x,y,z);
! 165: INSERT INTO t2 VALUES(9,8,7);
! 166: SELECT * FROM t2;
! 167: }
! 168: } {9 8 7}
! 169: do_test temptable-4.3 {
! 170: catchsql {
! 171: SELECT * FROM t2;
! 172: } db2
! 173: } {0 {10 20}}
! 174: do_test temptable-4.4.1 {
! 175: catchsql {
! 176: SELECT * FROM temp.t2;
! 177: } db2
! 178: } {0 {10 20}}
! 179: do_test temptable-4.4.2 {
! 180: catchsql {
! 181: SELECT * FROM main.t2;
! 182: } db2
! 183: } {0 {9 8 7}}
! 184: #do_test temptable-4.4.3 {
! 185: # catchsql {
! 186: # SELECT name FROM main.sqlite_master WHERE type='table';
! 187: # } db2
! 188: #} {1 {database schema has changed}}
! 189: do_test temptable-4.4.4 {
! 190: catchsql {
! 191: SELECT name FROM main.sqlite_master WHERE type='table';
! 192: } db2
! 193: } {0 {t1 t2}}
! 194: do_test temptable-4.4.5 {
! 195: catchsql {
! 196: SELECT * FROM main.t2;
! 197: } db2
! 198: } {0 {9 8 7}}
! 199: do_test temptable-4.4.6 {
! 200: # TEMP takes precedence over MAIN
! 201: catchsql {
! 202: SELECT * FROM t2;
! 203: } db2
! 204: } {0 {10 20}}
! 205: do_test temptable-4.5 {
! 206: catchsql {
! 207: DROP TABLE t2; -- should drop TEMP
! 208: SELECT * FROM t2; -- data should be from MAIN
! 209: } db2
! 210: } {0 {9 8 7}}
! 211: do_test temptable-4.6 {
! 212: db2 close
! 213: sqlite3 db2 ./test.db
! 214: catchsql {
! 215: SELECT * FROM t2;
! 216: } db2
! 217: } {0 {9 8 7}}
! 218: do_test temptable-4.7 {
! 219: catchsql {
! 220: DROP TABLE t2;
! 221: SELECT * FROM t2;
! 222: }
! 223: } {1 {no such table: t2}}
! 224: do_test temptable-4.8 {
! 225: db2 close
! 226: sqlite3 db2 ./test.db
! 227: execsql {
! 228: CREATE TEMP TABLE t2(x unique,y);
! 229: INSERT INTO t2 VALUES(1,2);
! 230: SELECT * FROM t2;
! 231: } db2
! 232: } {1 2}
! 233: do_test temptable-4.9 {
! 234: execsql {
! 235: CREATE TABLE t2(x unique, y);
! 236: INSERT INTO t2 VALUES(3,4);
! 237: SELECT * FROM t2;
! 238: }
! 239: } {3 4}
! 240: do_test temptable-4.10.1 {
! 241: catchsql {
! 242: SELECT * FROM t2;
! 243: } db2
! 244: } {0 {1 2}}
! 245: # Update: The schema is reloaded in test temptable-4.10.1. And tclsqlite.c
! 246: # handles it and retries the query anyway.
! 247: # do_test temptable-4.10.2 {
! 248: # catchsql {
! 249: # SELECT name FROM sqlite_master WHERE type='table'
! 250: # } db2
! 251: # } {1 {database schema has changed}}
! 252: do_test temptable-4.10.3 {
! 253: catchsql {
! 254: SELECT name FROM sqlite_master WHERE type='table'
! 255: } db2
! 256: } {0 {t1 t2}}
! 257: do_test temptable-4.11 {
! 258: execsql {
! 259: SELECT * FROM t2;
! 260: } db2
! 261: } {1 2}
! 262: do_test temptable-4.12 {
! 263: execsql {
! 264: SELECT * FROM t2;
! 265: }
! 266: } {3 4}
! 267: do_test temptable-4.13 {
! 268: catchsql {
! 269: DROP TABLE t2; -- drops TEMP.T2
! 270: SELECT * FROM t2; -- uses MAIN.T2
! 271: } db2
! 272: } {0 {3 4}}
! 273: do_test temptable-4.14 {
! 274: execsql {
! 275: SELECT * FROM t2;
! 276: }
! 277: } {3 4}
! 278: do_test temptable-4.15 {
! 279: db2 close
! 280: sqlite3 db2 ./test.db
! 281: execsql {
! 282: SELECT * FROM t2;
! 283: } db2
! 284: } {3 4}
! 285:
! 286: # Now create a temporary table in db2 and a permanent index in db. The
! 287: # temporary table in db2 should mask the name of the permanent index,
! 288: # but the permanent index should still be accessible and should still
! 289: # be updated when its corresponding table changes.
! 290: #
! 291: do_test temptable-5.1 {
! 292: execsql {
! 293: CREATE TEMP TABLE mask(a,b,c)
! 294: } db2
! 295: if {[permutation]=="prepare"} { db2 cache flush }
! 296: execsql {
! 297: CREATE INDEX mask ON t2(x);
! 298: SELECT * FROM t2;
! 299: }
! 300: } {3 4}
! 301: #do_test temptable-5.2 {
! 302: # catchsql {
! 303: # SELECT * FROM t2;
! 304: # } db2
! 305: #} {1 {database schema has changed}}
! 306: do_test temptable-5.3 {
! 307: catchsql {
! 308: SELECT * FROM t2;
! 309: } db2
! 310: } {0 {3 4}}
! 311: do_test temptable-5.4 {
! 312: execsql {
! 313: SELECT y FROM t2 WHERE x=3
! 314: }
! 315: } {4}
! 316: do_test temptable-5.5 {
! 317: execsql {
! 318: SELECT y FROM t2 WHERE x=3
! 319: } db2
! 320: } {4}
! 321: do_test temptable-5.6 {
! 322: execsql {
! 323: INSERT INTO t2 VALUES(1,2);
! 324: SELECT y FROM t2 WHERE x=1;
! 325: } db2
! 326: } {2}
! 327: do_test temptable-5.7 {
! 328: execsql {
! 329: SELECT y FROM t2 WHERE x=3
! 330: } db2
! 331: } {4}
! 332: do_test temptable-5.8 {
! 333: execsql {
! 334: SELECT y FROM t2 WHERE x=1;
! 335: }
! 336: } {2}
! 337: do_test temptable-5.9 {
! 338: execsql {
! 339: SELECT y FROM t2 WHERE x=3
! 340: }
! 341: } {4}
! 342:
! 343: db2 close
! 344:
! 345: # Test for correct operation of read-only databases
! 346: #
! 347: do_test temptable-6.1 {
! 348: execsql {
! 349: CREATE TABLE t8(x);
! 350: INSERT INTO t8 VALUES('xyzzy');
! 351: SELECT * FROM t8;
! 352: }
! 353: } {xyzzy}
! 354: do_test temptable-6.2 {
! 355: db close
! 356: catch {file attributes test.db -permissions 0444}
! 357: catch {file attributes test.db -readonly 1}
! 358: sqlite3 db test.db
! 359: if {[file writable test.db]} {
! 360: error "Unable to make the database file test.db readonly - rerun this test as an unprivileged user"
! 361: }
! 362: execsql {
! 363: SELECT * FROM t8;
! 364: }
! 365: } {xyzzy}
! 366: do_test temptable-6.3 {
! 367: if {[file writable test.db]} {
! 368: error "Unable to make the database file test.db readonly - rerun this test as an unprivileged user"
! 369: }
! 370: catchsql {
! 371: CREATE TABLE t9(x,y);
! 372: }
! 373: } {1 {attempt to write a readonly database}}
! 374: do_test temptable-6.4 {
! 375: catchsql {
! 376: CREATE TEMP TABLE t9(x,y);
! 377: }
! 378: } {0 {}}
! 379: do_test temptable-6.5 {
! 380: catchsql {
! 381: INSERT INTO t9 VALUES(1,2);
! 382: SELECT * FROM t9;
! 383: }
! 384: } {0 {1 2}}
! 385: do_test temptable-6.6 {
! 386: if {[file writable test.db]} {
! 387: error "Unable to make the database file test.db readonly - rerun this test as an unprivileged user"
! 388: }
! 389: catchsql {
! 390: INSERT INTO t8 VALUES('hello');
! 391: SELECT * FROM t8;
! 392: }
! 393: } {1 {attempt to write a readonly database}}
! 394: do_test temptable-6.7 {
! 395: catchsql {
! 396: SELECT * FROM t8,t9;
! 397: }
! 398: } {0 {xyzzy 1 2}}
! 399: do_test temptable-6.8 {
! 400: db close
! 401: sqlite3 db test.db
! 402: catchsql {
! 403: SELECT * FROM t8,t9;
! 404: }
! 405: } {1 {no such table: t9}}
! 406:
! 407: forcedelete test2.db test2.db-journal
! 408: ifcapable attach {
! 409: do_test temptable-7.1 {
! 410: catchsql {
! 411: ATTACH 'test2.db' AS two;
! 412: CREATE TEMP TABLE two.abc(x,y);
! 413: }
! 414: } {1 {temporary table name must be unqualified}}
! 415: }
! 416:
! 417: # Need to do the following for tcl 8.5 on mac. On that configuration, the
! 418: # -readonly flag is taken so seriously that a subsequent [forcedelete]
! 419: # (required before the next test file can be executed) will fail.
! 420: #
! 421: catch {file attributes test.db -readonly 0}
! 422:
! 423: do_test temptable-8.0 {
! 424: db close
! 425: catch {forcedelete test.db}
! 426: sqlite3 db test.db
! 427: } {}
! 428: do_test temptable-8.1 {
! 429: execsql { CREATE TEMP TABLE tbl2(a, b); }
! 430: execsql {
! 431: CREATE TABLE tbl(a, b);
! 432: INSERT INTO tbl VALUES(1, 2);
! 433: }
! 434: execsql {SELECT * FROM tbl}
! 435: } {1 2}
! 436: do_test temptable-8.2 {
! 437: execsql { CREATE TEMP TABLE tbl(a, b); }
! 438: execsql {SELECT * FROM tbl}
! 439: } {}
! 440:
! 441: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>