Annotation of embedaddon/sqlite3/test/temptable.test, revision 1.1.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>