Annotation of embedaddon/sqlite3/test/attach3.test, revision 1.1.1.1

1.1       misho       1: # 2003 July 1
                      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 script is testing the ATTACH and DETACH commands
                     13: # and schema changes to attached databases.
                     14: #
                     15: # $Id: attach3.test,v 1.18 2007/10/09 08:29:32 danielk1977 Exp $
                     16: #
                     17: 
                     18: set testdir [file dirname $argv0]
                     19: source $testdir/tester.tcl
                     20: 
                     21: ifcapable !attach {
                     22:   finish_test
                     23:   return
                     24: }
                     25: 
                     26: # The tests in this file were written before SQLite supported recursive
                     27: # trigger invocation, and some tests depend on that to pass. So disable
                     28: # recursive triggers for this file.
                     29: catchsql { pragma recursive_triggers = off } 
                     30: 
                     31: # Create tables t1 and t2 in the main database
                     32: execsql {
                     33:   CREATE TABLE t1(a, b);
                     34:   CREATE TABLE t2(c, d);
                     35: }
                     36: 
                     37: # Create tables t1 and t2 in database file test2.db
                     38: forcedelete test2.db
                     39: forcedelete test2.db-journal
                     40: sqlite3 db2 test2.db
                     41: execsql {
                     42:   CREATE TABLE t1(a, b);
                     43:   CREATE TABLE t2(c, d);
                     44: } db2
                     45: db2 close
                     46: 
                     47: # Create a table in the auxilary database.
                     48: do_test attach3-1.1 {
                     49:   execsql {
                     50:     ATTACH 'test2.db' AS aux;
                     51:   }
                     52: } {}
                     53: do_test attach3-1.2 {
                     54:   execsql {
                     55:     CREATE TABLE aux.t3(e, f);
                     56:   }
                     57: } {}
                     58: do_test attach3-1.3 {
                     59:   execsql {
                     60:     SELECT * FROM sqlite_master WHERE name = 't3';
                     61:   }
                     62: } {}
                     63: do_test attach3-1.4 {
                     64:   execsql {
                     65:     SELECT * FROM aux.sqlite_master WHERE name = 't3';
                     66:   }
                     67: } "table t3 t3 [expr $AUTOVACUUM?5:4] {CREATE TABLE t3(e, f)}"
                     68: do_test attach3-1.5 {
                     69:   execsql {
                     70:     INSERT INTO t3 VALUES(1, 2);
                     71:     SELECT * FROM t3;
                     72:   }
                     73: } {1 2}
                     74: 
                     75: # Create an index on the auxilary database table.
                     76: do_test attach3-2.1 {
                     77:   execsql {
                     78:     CREATE INDEX aux.i1 on t3(e);
                     79:   }
                     80: } {}
                     81: do_test attach3-2.2 {
                     82:   execsql {
                     83:     SELECT * FROM sqlite_master WHERE name = 'i1';
                     84:   }
                     85: } {}
                     86: do_test attach3-2.3 {
                     87:   execsql {
                     88:     SELECT * FROM aux.sqlite_master WHERE name = 'i1';
                     89:   }
                     90: } "index i1 t3 [expr $AUTOVACUUM?6:5] {CREATE INDEX i1 on t3(e)}"
                     91: 
                     92: # Drop the index on the aux database table.
                     93: do_test attach3-3.1 {
                     94:   execsql {
                     95:     DROP INDEX aux.i1;
                     96:     SELECT * FROM aux.sqlite_master WHERE name = 'i1';
                     97:   }
                     98: } {}
                     99: do_test attach3-3.2 {
                    100:   execsql {
                    101:     CREATE INDEX aux.i1 on t3(e);
                    102:     SELECT * FROM aux.sqlite_master WHERE name = 'i1';
                    103:   }
                    104: } "index i1 t3 [expr $AUTOVACUUM?6:5] {CREATE INDEX i1 on t3(e)}"
                    105: do_test attach3-3.3 {
                    106:   execsql {
                    107:     DROP INDEX i1;
                    108:     SELECT * FROM aux.sqlite_master WHERE name = 'i1';
                    109:   }
                    110: } {}
                    111: 
                    112: # Drop tables t1 and t2 in the auxilary database.
                    113: do_test attach3-4.1 {
                    114:   execsql {
                    115:     DROP TABLE aux.t1;
                    116:     SELECT name FROM aux.sqlite_master;
                    117:   }
                    118: } {t2 t3}
                    119: do_test attach3-4.2 {
                    120:   # This will drop main.t2
                    121:   execsql {
                    122:     DROP TABLE t2;
                    123:     SELECT name FROM aux.sqlite_master;
                    124:   }
                    125: } {t2 t3}
                    126: do_test attach3-4.3 {
                    127:   execsql {
                    128:     DROP TABLE t2;
                    129:     SELECT name FROM aux.sqlite_master;
                    130:   }
                    131: } {t3}
                    132: 
                    133: # Create a view in the auxilary database.
                    134: ifcapable view {
                    135: do_test attach3-5.1 {
                    136:   execsql {
                    137:     CREATE VIEW aux.v1 AS SELECT * FROM t3;
                    138:   }
                    139: } {}
                    140: do_test attach3-5.2 {
                    141:   execsql {
                    142:     SELECT * FROM aux.sqlite_master WHERE name = 'v1';
                    143:   }
                    144: } {view v1 v1 0 {CREATE VIEW v1 AS SELECT * FROM t3}}
                    145: do_test attach3-5.3 {
                    146:   execsql {
                    147:     INSERT INTO aux.t3 VALUES('hello', 'world');
                    148:     SELECT * FROM v1;
                    149:   }
                    150: } {1 2 hello world}
                    151: 
                    152: # Drop the view 
                    153: do_test attach3-6.1 {
                    154:   execsql {
                    155:     DROP VIEW aux.v1;
                    156:   }
                    157: } {}
                    158: do_test attach3-6.2 {
                    159:   execsql {
                    160:     SELECT * FROM aux.sqlite_master WHERE name = 'v1';
                    161:   }
                    162: } {}
                    163: } ;# ifcapable view
                    164: 
                    165: ifcapable {trigger} {
                    166: # Create a trigger in the auxilary database.
                    167: do_test attach3-7.1 {
                    168:   execsql {
                    169:     CREATE TRIGGER aux.tr1 AFTER INSERT ON t3 BEGIN
                    170:       INSERT INTO t3 VALUES(new.e*2, new.f*2);
                    171:     END;
                    172:   }
                    173: } {}
                    174: do_test attach3-7.2 {
                    175:   execsql {
                    176:     DELETE FROM t3;
                    177:     INSERT INTO t3 VALUES(10, 20);
                    178:     SELECT * FROM t3;
                    179:   }
                    180: } {10 20 20 40}
                    181: do_test attach3-5.3 {
                    182:   execsql {
                    183:     SELECT * FROM aux.sqlite_master WHERE name = 'tr1';
                    184:   }
                    185: } {trigger tr1 t3 0 {CREATE TRIGGER tr1 AFTER INSERT ON t3 BEGIN
                    186:       INSERT INTO t3 VALUES(new.e*2, new.f*2);
                    187:     END}}
                    188: 
                    189: # Drop the trigger 
                    190: do_test attach3-8.1 {
                    191:   execsql {
                    192:     DROP TRIGGER aux.tr1;
                    193:   }
                    194: } {}
                    195: do_test attach3-8.2 {
                    196:   execsql {
                    197:     SELECT * FROM aux.sqlite_master WHERE name = 'tr1';
                    198:   }
                    199: } {}
                    200: 
                    201: ifcapable tempdb {
                    202:   # Try to trick SQLite into dropping the wrong temp trigger.
                    203:   do_test attach3-9.0 {
                    204:     execsql {
                    205:       CREATE TABLE main.t4(a, b, c);
                    206:       CREATE TABLE aux.t4(a, b, c);
                    207:       CREATE TEMP TRIGGER tst_trigger BEFORE INSERT ON aux.t4 BEGIN 
                    208:         SELECT 'hello world';
                    209:       END;
                    210:       SELECT count(*) FROM sqlite_temp_master;
                    211:     }
                    212:   } {1}
                    213:   do_test attach3-9.1 {
                    214:     execsql {
                    215:       DROP TABLE main.t4;
                    216:       SELECT count(*) FROM sqlite_temp_master;
                    217:     }
                    218:   } {1}
                    219:   do_test attach3-9.2 {
                    220:     execsql {
                    221:       DROP TABLE aux.t4;
                    222:       SELECT count(*) FROM sqlite_temp_master;
                    223:     }
                    224:   } {0}
                    225: }
                    226: } ;# endif trigger
                    227: 
                    228: # Make sure the aux.sqlite_master table is read-only
                    229: do_test attach3-10.0 {
                    230:   catchsql {
                    231:     INSERT INTO aux.sqlite_master VALUES(1, 2, 3, 4, 5);
                    232:   }
                    233: } {1 {table sqlite_master may not be modified}}
                    234: 
                    235: # Failure to attach leaves us in a workable state.
                    236: # Ticket #811
                    237: #
                    238: do_test attach3-11.0 {
                    239:   catchsql {
                    240:     ATTACH DATABASE '/nodir/nofile.x' AS notadb;
                    241:   }
                    242: } {1 {unable to open database: /nodir/nofile.x}}
                    243: do_test attach3-11.1 {
                    244:   catchsql {
                    245:     ATTACH DATABASE ':memory:' AS notadb;
                    246:   }
                    247: } {0 {}}
                    248: do_test attach3-11.2 {
                    249:   catchsql {
                    250:     DETACH DATABASE notadb;
                    251:   }
                    252: } {0 {}}
                    253: 
                    254: # Return a list of attached databases
                    255: #
                    256: proc db_list {} {
                    257:   set x [execsql {
                    258:     PRAGMA database_list;
                    259:   }]
                    260:   set y {}
                    261:   foreach {n id file} $x {lappend y $id}
                    262:   return $y
                    263: }
                    264: 
                    265: ifcapable schema_pragmas&&tempdb {
                    266: 
                    267: ifcapable !trigger {
                    268:   execsql {create temp table dummy(dummy)}
                    269: }
                    270: 
                    271: # Ticket #1825
                    272: #
                    273: do_test attach3-12.1 {
                    274:   db_list
                    275: } {main temp aux}
                    276: do_test attach3-12.2 {
                    277:   execsql {
                    278:     ATTACH DATABASE ? AS ?
                    279:   }
                    280:   db_list
                    281: } {main temp aux {}}
                    282: do_test attach3-12.3 {
                    283:   execsql {
                    284:     DETACH aux
                    285:   }
                    286:   db_list
                    287: } {main temp {}}
                    288: do_test attach3-12.4 {
                    289:   execsql {
                    290:     DETACH ?
                    291:   }
                    292:   db_list
                    293: } {main temp}
                    294: do_test attach3-12.5 {
                    295:   execsql {
                    296:     ATTACH DATABASE '' AS ''
                    297:   }
                    298:   db_list
                    299: } {main temp {}}
                    300: do_test attach3-12.6 {
                    301:   execsql {
                    302:     DETACH ''
                    303:   }
                    304:   db_list
                    305: } {main temp}
                    306: do_test attach3-12.7 {
                    307:   execsql {
                    308:     ATTACH DATABASE '' AS ?
                    309:   }
                    310:   db_list
                    311: } {main temp {}}
                    312: do_test attach3-12.8 {
                    313:   execsql {
                    314:     DETACH ''
                    315:   }
                    316:   db_list
                    317: } {main temp}
                    318: do_test attach3-12.9 {
                    319:   execsql {
                    320:     ATTACH DATABASE '' AS NULL
                    321:   }
                    322:   db_list
                    323: } {main temp {}}
                    324: do_test attach3-12.10 {
                    325: breakpoint
                    326:   execsql {
                    327:     DETACH ?
                    328:   }
                    329:   db_list
                    330: } {main temp}
                    331: do_test attach3-12.11 {
                    332:   catchsql {
                    333:     DETACH NULL
                    334:   }
                    335: } {1 {no such database: }}
                    336: do_test attach3-12.12 {
                    337:   catchsql {
                    338:     ATTACH null AS null;
                    339:     ATTACH '' AS '';
                    340:   }
                    341: } {1 {database  is already in use}}
                    342: do_test attach3-12.13 {
                    343:   db_list
                    344: } {main temp {}}
                    345: do_test attach3-12.14 {
                    346:   execsql {
                    347:     DETACH '';
                    348:   }
                    349:   db_list
                    350: } {main temp}
                    351: 
                    352: } ;# ifcapable pragma
                    353: 
                    354: finish_test

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