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

1.1     ! misho       1: # 2003 April 4
        !             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 related functionality.
        !            14: #
        !            15: # $Id: attach.test,v 1.52 2009/05/29 14:39:08 drh 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: for {set i 2} {$i<=15} {incr i} {
        !            27:   forcedelete test$i.db
        !            28:   forcedelete test$i.db-journal
        !            29: }
        !            30: 
        !            31: do_test attach-1.1 {
        !            32:   execsql {
        !            33:     CREATE TABLE t1(a,b);
        !            34:     INSERT INTO t1 VALUES(1,2);
        !            35:     INSERT INTO t1 VALUES(3,4);
        !            36:     SELECT * FROM t1;
        !            37:   }
        !            38: } {1 2 3 4}
        !            39: do_test attach-1.2 {
        !            40:   sqlite3 db2 test2.db
        !            41:   execsql {
        !            42:     CREATE TABLE t2(x,y);
        !            43:     INSERT INTO t2 VALUES(1,'x');
        !            44:     INSERT INTO t2 VALUES(2,'y');
        !            45:     SELECT * FROM t2;
        !            46:   } db2
        !            47: } {1 x 2 y}
        !            48: do_test attach-1.3 {
        !            49:   execsql {
        !            50:     ATTACH DATABASE 'test2.db' AS two;
        !            51:     SELECT * FROM two.t2;
        !            52:   }
        !            53: } {1 x 2 y}
        !            54: 
        !            55: # Tests for the sqlite3_db_filename interface
        !            56: #
        !            57: do_test attach-1.3.1 {
        !            58:   file tail [sqlite3_db_filename db main]
        !            59: } {test.db}
        !            60: do_test attach-1.3.2 {
        !            61:   file tail [sqlite3_db_filename db MAIN]
        !            62: } {test.db}
        !            63: do_test attach-1.3.3 {
        !            64:   file tail [sqlite3_db_filename db temp]
        !            65: } {}
        !            66: do_test attach-1.3.4 {
        !            67:   file tail [sqlite3_db_filename db two]
        !            68: } {test2.db}
        !            69: do_test attach-1.3.5 {
        !            70:   file tail [sqlite3_db_filename db three]
        !            71: } {}
        !            72: 
        !            73: do_test attach-1.4 {
        !            74:   execsql {
        !            75:     SELECT * FROM t2;
        !            76:   }
        !            77: } {1 x 2 y}
        !            78: do_test attach-1.5 {
        !            79:   execsql {
        !            80:     DETACH DATABASE two;
        !            81:     SELECT * FROM t1;
        !            82:   }
        !            83: } {1 2 3 4}
        !            84: do_test attach-1.6 {
        !            85:   catchsql {
        !            86:     SELECT * FROM t2;
        !            87:   }
        !            88: } {1 {no such table: t2}}
        !            89: do_test attach-1.7 {
        !            90:   catchsql {
        !            91:     SELECT * FROM two.t2;
        !            92:   }
        !            93: } {1 {no such table: two.t2}}
        !            94: do_test attach-1.8 {
        !            95:   catchsql {
        !            96:     ATTACH DATABASE 'test3.db' AS three;
        !            97:   }
        !            98: } {0 {}}
        !            99: do_test attach-1.9 {
        !           100:   catchsql {
        !           101:     SELECT * FROM three.sqlite_master;
        !           102:   }
        !           103: } {0 {}}
        !           104: do_test attach-1.10 {
        !           105:   catchsql {
        !           106:     DETACH DATABASE [three];
        !           107:   }
        !           108: } {0 {}}
        !           109: do_test attach-1.11 {
        !           110:   execsql {
        !           111:     ATTACH 'test.db' AS db2;
        !           112:     ATTACH 'test.db' AS db3;
        !           113:     ATTACH 'test.db' AS db4;
        !           114:     ATTACH 'test.db' AS db5;
        !           115:     ATTACH 'test.db' AS db6;
        !           116:     ATTACH 'test.db' AS db7;
        !           117:     ATTACH 'test.db' AS db8;
        !           118:     ATTACH 'test.db' AS db9;
        !           119:   }
        !           120: } {}
        !           121: proc db_list {db} {
        !           122:   set list {}
        !           123:   foreach {idx name file} [execsql {PRAGMA database_list} $db] {
        !           124:     lappend list $idx $name
        !           125:   }
        !           126:   return $list
        !           127: }
        !           128: ifcapable schema_pragmas {
        !           129: do_test attach-1.11b {
        !           130:   db_list db
        !           131: } {0 main 2 db2 3 db3 4 db4 5 db5 6 db6 7 db7 8 db8 9 db9}
        !           132: } ;# ifcapable schema_pragmas 
        !           133: do_test attach-1.12 {
        !           134:   catchsql {
        !           135:     ATTACH 'test.db' as db2;
        !           136:   }
        !           137: } {1 {database db2 is already in use}}
        !           138: do_test attach-1.12.2 {
        !           139:   db errorcode
        !           140: } {1}
        !           141: do_test attach-1.13 {
        !           142:   catchsql {
        !           143:     ATTACH 'test.db' as db5;
        !           144:   }
        !           145: } {1 {database db5 is already in use}}
        !           146: do_test attach-1.14 {
        !           147:   catchsql {
        !           148:     ATTACH 'test.db' as db9;
        !           149:   }
        !           150: } {1 {database db9 is already in use}}
        !           151: do_test attach-1.15 {
        !           152:   catchsql {
        !           153:     ATTACH 'test.db' as main;
        !           154:   }
        !           155: } {1 {database main is already in use}}
        !           156: ifcapable tempdb {
        !           157:   do_test attach-1.16 {
        !           158:     catchsql {
        !           159:       ATTACH 'test.db' as temp;
        !           160:     }
        !           161:   } {1 {database temp is already in use}}
        !           162: }
        !           163: do_test attach-1.17 {
        !           164:   catchsql {
        !           165:     ATTACH 'test.db' as MAIN;
        !           166:   }
        !           167: } {1 {database MAIN is already in use}}
        !           168: do_test attach-1.18 {
        !           169:   catchsql {
        !           170:     ATTACH 'test.db' as db10;
        !           171:     ATTACH 'test.db' as db11;
        !           172:   }
        !           173: } {0 {}}
        !           174: if {$SQLITE_MAX_ATTACHED==10} {
        !           175:   do_test attach-1.19 {
        !           176:     catchsql {
        !           177:       ATTACH 'test.db' as db12;
        !           178:     }
        !           179:   } {1 {too many attached databases - max 10}}
        !           180:   do_test attach-1.19.1 {
        !           181:     db errorcode
        !           182:   } {1}
        !           183: }
        !           184: do_test attach-1.20.1 {
        !           185:   execsql {
        !           186:     DETACH db5;
        !           187:   }
        !           188: } {}
        !           189: ifcapable schema_pragmas {
        !           190: do_test attach-1.20.2 {
        !           191:   db_list db
        !           192: } {0 main 2 db2 3 db3 4 db4 5 db6 6 db7 7 db8 8 db9 9 db10 10 db11}
        !           193: } ;# ifcapable schema_pragmas
        !           194: integrity_check attach-1.20.3
        !           195: ifcapable tempdb {
        !           196:   execsql {select * from sqlite_temp_master}
        !           197: }
        !           198: do_test attach-1.21 {
        !           199:   catchsql {
        !           200:     ATTACH 'test.db' as db12;
        !           201:   }
        !           202: } {0 {}}
        !           203: if {$SQLITE_MAX_ATTACHED==10} {
        !           204:   do_test attach-1.22 {
        !           205:     catchsql {
        !           206:       ATTACH 'test.db' as db13;
        !           207:     }
        !           208:   } {1 {too many attached databases - max 10}}
        !           209:   do_test attach-1.22.1 {
        !           210:     db errorcode
        !           211:   } {1}
        !           212: }
        !           213: do_test attach-1.23 {
        !           214:   catchsql {
        !           215:     DETACH "db14";
        !           216:   }
        !           217: } {1 {no such database: db14}}
        !           218: do_test attach-1.24 {
        !           219:   catchsql {
        !           220:     DETACH db12;
        !           221:   }
        !           222: } {0 {}}
        !           223: do_test attach-1.25 {
        !           224:   catchsql {
        !           225:     DETACH db12;
        !           226:   }
        !           227: } {1 {no such database: db12}}
        !           228: do_test attach-1.26 {
        !           229:   catchsql {
        !           230:     DETACH main;
        !           231:   }
        !           232: } {1 {cannot detach database main}}
        !           233: 
        !           234: ifcapable tempdb {
        !           235:   do_test attach-1.27 {
        !           236:     catchsql {
        !           237:       DETACH Temp;
        !           238:     }
        !           239:   } {1 {cannot detach database Temp}}
        !           240: } else {
        !           241:   do_test attach-1.27 {
        !           242:     catchsql {
        !           243:       DETACH Temp;
        !           244:     }
        !           245:   } {1 {no such database: Temp}}
        !           246: }
        !           247: 
        !           248: do_test attach-1.28 {
        !           249:   catchsql {
        !           250:     DETACH db11;
        !           251:     DETACH db10;
        !           252:     DETACH db9;
        !           253:     DETACH db8;
        !           254:     DETACH db7;
        !           255:     DETACH db6;
        !           256:     DETACH db4;
        !           257:     DETACH db3;
        !           258:     DETACH db2;
        !           259:   }
        !           260: } {0 {}}
        !           261: ifcapable schema_pragmas {
        !           262:   ifcapable tempdb {
        !           263:     do_test attach-1.29 {
        !           264:       db_list db
        !           265:     } {0 main 1 temp}
        !           266:   } else {
        !           267:     do_test attach-1.29 {
        !           268:       db_list db
        !           269:     } {0 main}
        !           270:   }
        !           271: } ;# ifcapable schema_pragmas
        !           272: 
        !           273: ifcapable {trigger} {  # Only do the following tests if triggers are enabled
        !           274: do_test attach-2.1 {
        !           275:   execsql {
        !           276:     CREATE TABLE tx(x1,x2,y1,y2);
        !           277:     CREATE TRIGGER r1 AFTER UPDATE ON t2 FOR EACH ROW BEGIN
        !           278:       INSERT INTO tx(x1,x2,y1,y2) VALUES(OLD.x,NEW.x,OLD.y,NEW.y);
        !           279:     END;
        !           280:     SELECT * FROM tx;
        !           281:   } db2;
        !           282: } {}
        !           283: do_test attach-2.2 {
        !           284:   execsql {
        !           285:     UPDATE t2 SET x=x+10;
        !           286:     SELECT * FROM tx;
        !           287:   } db2;
        !           288: } {1 11 x x 2 12 y y}
        !           289: do_test attach-2.3 {
        !           290:   execsql {
        !           291:     CREATE TABLE tx(x1,x2,y1,y2);
        !           292:     SELECT * FROM tx;
        !           293:   }
        !           294: } {}
        !           295: do_test attach-2.4 {
        !           296:   execsql {
        !           297:     ATTACH 'test2.db' AS db2;
        !           298:   }
        !           299: } {}
        !           300: do_test attach-2.5 {
        !           301:   execsql {
        !           302:     UPDATE db2.t2 SET x=x+10;
        !           303:     SELECT * FROM db2.tx;
        !           304:   }
        !           305: } {1 11 x x 2 12 y y 11 21 x x 12 22 y y}
        !           306: do_test attach-2.6 {
        !           307:   execsql {
        !           308:     SELECT * FROM main.tx;
        !           309:   }
        !           310: } {}
        !           311: do_test attach-2.7 {
        !           312:   execsql {
        !           313:     SELECT type, name, tbl_name FROM db2.sqlite_master;
        !           314:   }
        !           315: } {table t2 t2 table tx tx trigger r1 t2}
        !           316: 
        !           317: ifcapable schema_pragmas&&tempdb {
        !           318:   do_test attach-2.8 {
        !           319:     db_list db
        !           320:   } {0 main 1 temp 2 db2}
        !           321: } ;# ifcapable schema_pragmas&&tempdb
        !           322: ifcapable schema_pragmas&&!tempdb {
        !           323:   do_test attach-2.8 {
        !           324:     db_list db
        !           325:   } {0 main 2 db2}
        !           326: } ;# ifcapable schema_pragmas&&!tempdb
        !           327: 
        !           328: do_test attach-2.9 {
        !           329:   execsql {
        !           330:     CREATE INDEX i2 ON t2(x);
        !           331:     SELECT * FROM t2 WHERE x>5;
        !           332:   } db2
        !           333: } {21 x 22 y}
        !           334: do_test attach-2.10 {
        !           335:   execsql {
        !           336:     SELECT type, name, tbl_name FROM sqlite_master;
        !           337:   } db2
        !           338: } {table t2 t2 table tx tx trigger r1 t2 index i2 t2}
        !           339: #do_test attach-2.11 {
        !           340: #  catchsql { 
        !           341: #    SELECT * FROM t2 WHERE x>5;
        !           342: #  }
        !           343: #} {1 {database schema has changed}}
        !           344: ifcapable schema_pragmas {
        !           345:   ifcapable tempdb {
        !           346:     do_test attach-2.12 {
        !           347:       db_list db
        !           348:     } {0 main 1 temp 2 db2}
        !           349:   } else {
        !           350:     do_test attach-2.12 {
        !           351:       db_list db
        !           352:     } {0 main 2 db2}
        !           353:   }
        !           354: } ;# ifcapable schema_pragmas
        !           355: do_test attach-2.13 {
        !           356:   catchsql {
        !           357:     SELECT * FROM t2 WHERE x>5;
        !           358:   }
        !           359: } {0 {21 x 22 y}}
        !           360: do_test attach-2.14 {
        !           361:   execsql {
        !           362:     SELECT type, name, tbl_name FROM sqlite_master;
        !           363:   }
        !           364: } {table t1 t1 table tx tx}
        !           365: do_test attach-2.15 {
        !           366:   execsql {
        !           367:     SELECT type, name, tbl_name FROM db2.sqlite_master;
        !           368:   }
        !           369: } {table t2 t2 table tx tx trigger r1 t2 index i2 t2}
        !           370: do_test attach-2.16 {
        !           371:   db close
        !           372:   sqlite3 db test.db
        !           373:   execsql {
        !           374:     ATTACH 'test2.db' AS db2;
        !           375:     SELECT type, name, tbl_name FROM db2.sqlite_master;
        !           376:   }
        !           377: } {table t2 t2 table tx tx trigger r1 t2 index i2 t2}
        !           378: } ;# End of ifcapable {trigger}
        !           379: 
        !           380: do_test attach-3.1 {
        !           381:   db close
        !           382:   db2 close
        !           383:   sqlite3 db test.db
        !           384:   sqlite3 db2 test2.db
        !           385:   execsql {
        !           386:     SELECT * FROM t1
        !           387:   }
        !           388: } {1 2 3 4}
        !           389: 
        !           390: # If we are testing a version of the code that lacks trigger support,
        !           391: # adjust the database contents so that they are the same if triggers
        !           392: # had been enabled.
        !           393: ifcapable {!trigger} {
        !           394:   db2 eval {
        !           395:     DELETE FROM t2;
        !           396:     INSERT INTO t2 VALUES(21, 'x');
        !           397:     INSERT INTO t2 VALUES(22, 'y');
        !           398:     CREATE TABLE tx(x1,x2,y1,y2);
        !           399:     INSERT INTO tx VALUES(1, 11, 'x', 'x');
        !           400:     INSERT INTO tx VALUES(2, 12, 'y', 'y');
        !           401:     INSERT INTO tx VALUES(11, 21, 'x', 'x');
        !           402:     INSERT INTO tx VALUES(12, 22, 'y', 'y');
        !           403:     CREATE INDEX i2 ON t2(x);
        !           404:   }
        !           405: }
        !           406: 
        !           407: do_test attach-3.2 {
        !           408:   catchsql {
        !           409:     SELECT * FROM t2
        !           410:   }
        !           411: } {1 {no such table: t2}}
        !           412: do_test attach-3.3 {
        !           413:   catchsql {
        !           414:     ATTACH DATABASE 'test2.db' AS db2;
        !           415:     SELECT * FROM t2
        !           416:   }
        !           417: } {0 {21 x 22 y}}
        !           418: 
        !           419: # Even though 'db' has started a transaction, it should not yet have
        !           420: # a lock on test2.db so 'db2' should be readable.
        !           421: do_test attach-3.4 {
        !           422:   execsql BEGIN
        !           423:   catchsql {
        !           424:     SELECT * FROM t2;
        !           425:   } db2;
        !           426: } {0 {21 x 22 y}}
        !           427: 
        !           428: # Reading from test2.db from db within a transaction should not
        !           429: # prevent test2.db from being read by db2.
        !           430: do_test attach-3.5 {
        !           431:   execsql {SELECT * FROM t2}
        !           432:   catchsql {
        !           433:     SELECT * FROM t2;
        !           434:   } db2;
        !           435: } {0 {21 x 22 y}}
        !           436: 
        !           437: # Making a change to test2.db through db  causes test2.db to get
        !           438: # a reserved lock.  It should still be accessible through db2.
        !           439: do_test attach-3.6 {
        !           440:   execsql {
        !           441:     UPDATE t2 SET x=x+1 WHERE x=50;
        !           442:   }
        !           443:   catchsql {
        !           444:     SELECT * FROM t2;
        !           445:   } db2;
        !           446: } {0 {21 x 22 y}}
        !           447: 
        !           448: do_test attach-3.7 {
        !           449:   execsql ROLLBACK
        !           450:   execsql {SELECT * FROM t2} db2
        !           451: } {21 x 22 y}
        !           452: 
        !           453: # Start transactions on both db and db2.  Once again, just because
        !           454: # we make a change to test2.db using db2, only a RESERVED lock is
        !           455: # obtained, so test2.db should still be readable using db.
        !           456: #
        !           457: do_test attach-3.8 {
        !           458:   execsql BEGIN
        !           459:   execsql BEGIN db2
        !           460:   execsql {UPDATE t2 SET x=0 WHERE 0} db2
        !           461:   catchsql {SELECT * FROM t2}
        !           462: } {0 {21 x 22 y}}
        !           463: 
        !           464: # It is also still accessible from db2.
        !           465: do_test attach-3.9 {
        !           466:   catchsql {SELECT * FROM t2} db2
        !           467: } {0 {21 x 22 y}}
        !           468: 
        !           469: do_test attach-3.10 {
        !           470:   execsql {SELECT * FROM t1}
        !           471: } {1 2 3 4}
        !           472: 
        !           473: do_test attach-3.11 {
        !           474:   catchsql {UPDATE t1 SET a=a+1}
        !           475: } {0 {}}
        !           476: do_test attach-3.12 {
        !           477:   execsql {SELECT * FROM t1}
        !           478: } {2 2 4 4}
        !           479: 
        !           480: # db2 has a RESERVED lock on test2.db, so db cannot write to any tables
        !           481: # in test2.db.
        !           482: do_test attach-3.13 {
        !           483:   catchsql {UPDATE t2 SET x=x+1 WHERE x=50}
        !           484: } {1 {database is locked}}
        !           485: 
        !           486: # Change for version 3. Transaction is no longer rolled back
        !           487: # for a locked database.
        !           488: execsql {ROLLBACK}
        !           489: 
        !           490: # db is able to reread its schema because db2 still only holds a
        !           491: # reserved lock.
        !           492: do_test attach-3.14 {
        !           493:   catchsql {SELECT * FROM t1}
        !           494: } {0 {1 2 3 4}}
        !           495: do_test attach-3.15 {
        !           496:   execsql COMMIT db2
        !           497:   execsql {SELECT * FROM t1}
        !           498: } {1 2 3 4}
        !           499: 
        !           500: # Ticket #323
        !           501: do_test attach-4.1 {
        !           502:   execsql {DETACH db2}
        !           503:   db2 close
        !           504:   sqlite3 db2 test2.db
        !           505:   execsql {
        !           506:     CREATE TABLE t3(x,y);
        !           507:     CREATE UNIQUE INDEX t3i1 ON t3(x);
        !           508:     INSERT INTO t3 VALUES(1,2);
        !           509:     SELECT * FROM t3;
        !           510:   } db2;
        !           511: } {1 2}
        !           512: do_test attach-4.2 {
        !           513:   execsql {
        !           514:     CREATE TABLE t3(a,b);
        !           515:     CREATE UNIQUE INDEX t3i1b ON t3(a);
        !           516:     INSERT INTO t3 VALUES(9,10);
        !           517:     SELECT * FROM t3;
        !           518:   }
        !           519: } {9 10}
        !           520: do_test attach-4.3 {
        !           521:   execsql {
        !           522:     ATTACH DATABASE 'test2.db' AS db2;
        !           523:     SELECT * FROM db2.t3;
        !           524:   }
        !           525: } {1 2}
        !           526: do_test attach-4.4 {
        !           527:   execsql {
        !           528:     SELECT * FROM main.t3;
        !           529:   }
        !           530: } {9 10}
        !           531: do_test attach-4.5 {
        !           532:   execsql {
        !           533:     INSERT INTO db2.t3 VALUES(9,10);
        !           534:     SELECT * FROM db2.t3;
        !           535:   }
        !           536: } {1 2 9 10}
        !           537: execsql {
        !           538:   DETACH db2;
        !           539: }
        !           540: ifcapable {trigger} {
        !           541:   do_test attach-4.6 {
        !           542:     execsql {
        !           543:       CREATE TABLE t4(x);
        !           544:       CREATE TRIGGER t3r3 AFTER INSERT ON t3 BEGIN
        !           545:         INSERT INTO t4 VALUES('db2.' || NEW.x);
        !           546:       END;
        !           547:       INSERT INTO t3 VALUES(6,7);
        !           548:       SELECT * FROM t4;
        !           549:     } db2
        !           550:   } {db2.6}
        !           551:   do_test attach-4.7 {
        !           552:     execsql {
        !           553:       CREATE TABLE t4(y);
        !           554:       CREATE TRIGGER t3r3 AFTER INSERT ON t3 BEGIN
        !           555:         INSERT INTO t4 VALUES('main.' || NEW.a);
        !           556:       END;
        !           557:       INSERT INTO main.t3 VALUES(11,12);
        !           558:       SELECT * FROM main.t4;
        !           559:     }
        !           560:   } {main.11}
        !           561: }
        !           562: ifcapable {!trigger} {
        !           563:   # When we do not have trigger support, set up the table like they
        !           564:   # would have been had triggers been there.  The tests that follow need
        !           565:   # this setup.
        !           566:   execsql {
        !           567:     CREATE TABLE t4(x);
        !           568:     INSERT INTO t3 VALUES(6,7);
        !           569:     INSERT INTO t4 VALUES('db2.6');
        !           570:     INSERT INTO t4 VALUES('db2.13');
        !           571:   } db2
        !           572:   execsql {
        !           573:     CREATE TABLE t4(y);
        !           574:     INSERT INTO main.t3 VALUES(11,12);
        !           575:     INSERT INTO t4 VALUES('main.11');
        !           576:   }
        !           577: }
        !           578: 
        !           579: 
        !           580: # This one is tricky.  On the UNION ALL select, we have to make sure
        !           581: # the schema for both main and db2 is valid before starting to execute
        !           582: # the first query of the UNION ALL.  If we wait to test the validity of
        !           583: # the schema for main until after the first query has run, that test will
        !           584: # fail and the query will abort but we will have already output some
        !           585: # results.  When the query is retried, the results will be repeated.
        !           586: #
        !           587: ifcapable compound {
        !           588: do_test attach-4.8 {
        !           589:   execsql {
        !           590:     ATTACH DATABASE 'test2.db' AS db2;
        !           591:     INSERT INTO db2.t3 VALUES(13,14);
        !           592:     SELECT * FROM db2.t4 UNION ALL SELECT * FROM main.t4;
        !           593:   }
        !           594: } {db2.6 db2.13 main.11}
        !           595: 
        !           596: do_test attach-4.9 {
        !           597:   ifcapable {!trigger} {execsql {INSERT INTO main.t4 VALUES('main.15')}}
        !           598:   execsql {
        !           599:     INSERT INTO main.t3 VALUES(15,16);
        !           600:     SELECT * FROM db2.t4 UNION ALL SELECT * FROM main.t4;
        !           601:   }
        !           602: } {db2.6 db2.13 main.11 main.15}
        !           603: } ;# ifcapable compound
        !           604: 
        !           605: ifcapable !compound {
        !           606:   ifcapable {!trigger} {execsql {INSERT INTO main.t4 VALUES('main.15')}}
        !           607:   execsql {
        !           608:     ATTACH DATABASE 'test2.db' AS db2;
        !           609:     INSERT INTO db2.t3 VALUES(13,14);
        !           610:     INSERT INTO main.t3 VALUES(15,16);
        !           611:   } 
        !           612: } ;# ifcapable !compound
        !           613: 
        !           614: ifcapable view {
        !           615: do_test attach-4.10 {
        !           616:   execsql {
        !           617:     DETACH DATABASE db2;
        !           618:   }
        !           619:   execsql {
        !           620:     CREATE VIEW v3 AS SELECT x*100+y FROM t3;
        !           621:     SELECT * FROM v3;
        !           622:   } db2
        !           623: } {102 910 607 1314}
        !           624: do_test attach-4.11 {
        !           625:   execsql {
        !           626:     CREATE VIEW v3 AS SELECT a*100+b FROM t3;
        !           627:     SELECT * FROM v3;
        !           628:   }
        !           629: } {910 1112 1516}
        !           630: do_test attach-4.12 {
        !           631:   execsql {
        !           632:     ATTACH DATABASE 'test2.db' AS db2;
        !           633:     SELECT * FROM db2.v3;
        !           634:   }
        !           635: } {102 910 607 1314}
        !           636: do_test attach-4.13 {
        !           637:   execsql {
        !           638:     SELECT * FROM main.v3;
        !           639:   }
        !           640: } {910 1112 1516}
        !           641: } ;# ifcapable view
        !           642: 
        !           643: # Tests for the sqliteFix...() routines in attach.c
        !           644: #
        !           645: ifcapable {trigger} {
        !           646: do_test attach-5.1 {
        !           647:   db close
        !           648:   sqlite3 db test.db
        !           649:   db2 close
        !           650:   forcedelete test2.db
        !           651:   sqlite3 db2 test2.db
        !           652:   catchsql {
        !           653:     ATTACH DATABASE 'test.db' AS orig;
        !           654:     CREATE TRIGGER r1 AFTER INSERT ON orig.t1 BEGIN
        !           655:       SELECT 'no-op';
        !           656:     END;
        !           657:   } db2
        !           658: } {1 {trigger r1 cannot reference objects in database orig}}
        !           659: do_test attach-5.2 {
        !           660:   catchsql {
        !           661:     CREATE TABLE t5(x,y);
        !           662:     CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           663:       SELECT 'no-op';
        !           664:     END;
        !           665:   } db2
        !           666: } {0 {}}
        !           667: do_test attach-5.3 {
        !           668:   catchsql {
        !           669:     DROP TRIGGER r5;
        !           670:     CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           671:       SELECT 'no-op' FROM orig.t1;
        !           672:     END;
        !           673:   } db2
        !           674: } {1 {trigger r5 cannot reference objects in database orig}}
        !           675: ifcapable tempdb {
        !           676:   do_test attach-5.4 {
        !           677:     catchsql {
        !           678:       CREATE TEMP TABLE t6(p,q,r);
        !           679:       CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           680:         SELECT 'no-op' FROM temp.t6;
        !           681:       END;
        !           682:     } db2
        !           683:   } {1 {trigger r5 cannot reference objects in database temp}}
        !           684: }
        !           685: ifcapable subquery {
        !           686:   do_test attach-5.5 {
        !           687:     catchsql {
        !           688:       CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           689:         SELECT 'no-op' || (SELECT * FROM temp.t6);
        !           690:       END;
        !           691:     } db2
        !           692:   } {1 {trigger r5 cannot reference objects in database temp}}
        !           693:   do_test attach-5.6 {
        !           694:     catchsql {
        !           695:       CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           696:         SELECT 'no-op' FROM t1 WHERE x<(SELECT min(x) FROM temp.t6);
        !           697:       END;
        !           698:     } db2
        !           699:   } {1 {trigger r5 cannot reference objects in database temp}}
        !           700:   do_test attach-5.7 {
        !           701:     catchsql {
        !           702:       CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           703:         SELECT 'no-op' FROM t1 GROUP BY 1 HAVING x<(SELECT min(x) FROM temp.t6);
        !           704:       END;
        !           705:     } db2
        !           706:   } {1 {trigger r5 cannot reference objects in database temp}}
        !           707:   do_test attach-5.7 {
        !           708:     catchsql {
        !           709:       CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           710:         SELECT max(1,x,(SELECT min(x) FROM temp.t6)) FROM t1;
        !           711:       END;
        !           712:     } db2
        !           713:   } {1 {trigger r5 cannot reference objects in database temp}}
        !           714:   do_test attach-5.8 {
        !           715:     catchsql {
        !           716:       CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           717:         INSERT INTO t1 VALUES((SELECT min(x) FROM temp.t6),5);
        !           718:       END;
        !           719:     } db2
        !           720:   } {1 {trigger r5 cannot reference objects in database temp}}
        !           721:   do_test attach-5.9 {
        !           722:     catchsql {
        !           723:       CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
        !           724:         DELETE FROM t1 WHERE x<(SELECT min(x) FROM temp.t6);
        !           725:       END;
        !           726:     } db2
        !           727:   } {1 {trigger r5 cannot reference objects in database temp}}
        !           728: } ;# endif subquery
        !           729: } ;# endif trigger
        !           730: 
        !           731: # Check to make sure we get a sensible error if unable to open
        !           732: # the file that we are trying to attach.
        !           733: #
        !           734: do_test attach-6.1 {
        !           735:   catchsql {
        !           736:     ATTACH DATABASE 'no-such-file' AS nosuch;
        !           737:   }
        !           738: } {0 {}}
        !           739: if {$tcl_platform(platform)=="unix"} {
        !           740:   do_test attach-6.2 {
        !           741:     sqlite3 dbx cannot-read
        !           742:     dbx eval {CREATE TABLE t1(a,b,c)}
        !           743:     dbx close
        !           744:     file attributes cannot-read -permission 0000
        !           745:     if {[file writable cannot-read]} {
        !           746:       puts "\n**** Tests do not work when run as root ****"
        !           747:       forcedelete cannot-read
        !           748:       exit 1
        !           749:     }
        !           750:     catchsql {
        !           751:       ATTACH DATABASE 'cannot-read' AS noread;
        !           752:     }
        !           753:   } {1 {unable to open database: cannot-read}}
        !           754:   do_test attach-6.2.2 {
        !           755:     db errorcode
        !           756:   } {14}
        !           757:   forcedelete cannot-read
        !           758: }
        !           759: 
        !           760: # Check the error message if we try to access a database that has
        !           761: # not been attached.
        !           762: do_test attach-6.3 {
        !           763:   catchsql {
        !           764:     CREATE TABLE no_such_db.t1(a, b, c);
        !           765:   }
        !           766: } {1 {unknown database no_such_db}}
        !           767: for {set i 2} {$i<=15} {incr i} {
        !           768:   catch {db$i close}
        !           769: }
        !           770: db close
        !           771: forcedelete test2.db
        !           772: forcedelete no-such-file
        !           773: 
        !           774: ifcapable subquery {
        !           775:   do_test attach-7.1 {
        !           776:     forcedelete test.db test.db-journal
        !           777:     sqlite3 db test.db
        !           778:     catchsql {
        !           779:       DETACH RAISE ( IGNORE ) IN ( SELECT "AAAAAA" . * ORDER BY 
        !           780:       REGISTER LIMIT "AAAAAA" . "AAAAAA" OFFSET RAISE ( IGNORE ) NOT NULL )
        !           781:     }
        !           782:   } {1 {no such table: AAAAAA}}
        !           783: }
        !           784: 
        !           785: # Create a malformed file (a file that is not a valid database)
        !           786: # and try to attach it
        !           787: #
        !           788: do_test attach-8.1 {
        !           789:   set fd [open test2.db w]
        !           790:   puts $fd "This file is not a valid SQLite database"
        !           791:   close $fd
        !           792:   catchsql {
        !           793:     ATTACH 'test2.db' AS t2;
        !           794:   }
        !           795: } {1 {file is encrypted or is not a database}}
        !           796: do_test attach-8.2 {
        !           797:   db errorcode
        !           798: } {26}
        !           799: forcedelete test2.db
        !           800: do_test attach-8.3 {
        !           801:   sqlite3 db2 test2.db
        !           802:   db2 eval {CREATE TABLE t1(x); BEGIN EXCLUSIVE}
        !           803:   catchsql {
        !           804:     ATTACH 'test2.db' AS t2;
        !           805:   }
        !           806: } {1 {database is locked}}
        !           807: do_test attach-8.4 {
        !           808:   db errorcode
        !           809: } {5}
        !           810: db2 close
        !           811: forcedelete test2.db
        !           812: 
        !           813: # Test that it is possible to attach the same database more than
        !           814: # once when not in shared-cache mode. That this is not possible in
        !           815: # shared-cache mode is tested in shared7.test.
        !           816: do_test attach-9.1 {
        !           817:   forcedelete test4.db
        !           818:   execsql {
        !           819:     ATTACH 'test4.db' AS aux1;
        !           820:     CREATE TABLE aux1.t1(a, b);
        !           821:     INSERT INTO aux1.t1 VALUES(1, 2);
        !           822:     ATTACH 'test4.db' AS aux2;
        !           823:     SELECT * FROM aux2.t1;
        !           824:   }
        !           825: } {1 2}
        !           826: do_test attach-9.2 {
        !           827:   catchsql {
        !           828:     BEGIN;
        !           829:       INSERT INTO aux1.t1 VALUES(3, 4);
        !           830:       INSERT INTO aux2.t1 VALUES(5, 6);
        !           831:   }
        !           832: } {1 {database is locked}}
        !           833: do_test attach-9.3 {
        !           834:   execsql {
        !           835:     COMMIT;
        !           836:     SELECT * FROM aux2.t1;
        !           837:   }
        !           838: } {1 2 3 4}
        !           839: 
        !           840: # Ticket [abe728bbc311d81334dae9762f0db87c07a98f79].
        !           841: # Multi-database commit on an attached TEMP database.
        !           842: #
        !           843: do_test attach-10.1 {
        !           844:   execsql {
        !           845:     ATTACH '' AS noname;
        !           846:     ATTACH ':memory:' AS inmem;
        !           847:     BEGIN;
        !           848:     CREATE TABLE noname.noname(x);
        !           849:     CREATE TABLE inmem.inmem(y);
        !           850:     CREATE TABLE main.main(z);
        !           851:     COMMIT;
        !           852:     SELECT name FROM noname.sqlite_master;
        !           853:     SELECT name FROM inmem.sqlite_master;
        !           854:   }
        !           855: } {noname inmem}
        !           856: do_test attach-10.2 {
        !           857:   lrange [execsql {
        !           858:     PRAGMA database_list;
        !           859:   }] 9 end
        !           860: } {4 noname {} 5 inmem {}}
        !           861: 
        !           862: finish_test

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