Annotation of embedaddon/sqlite3/test/trans.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 script is database locks.
        !            13: #
        !            14: # $Id: trans.test,v 1.41 2009/04/28 16:37:59 danielk1977 Exp $
        !            15: 
        !            16: 
        !            17: set testdir [file dirname $argv0]
        !            18: source $testdir/tester.tcl
        !            19: 
        !            20: # Create several tables to work with.
        !            21: #
        !            22: wal_set_journal_mode
        !            23: do_test trans-1.0 {
        !            24:   execsql {
        !            25:     CREATE TABLE one(a int PRIMARY KEY, b text);
        !            26:     INSERT INTO one VALUES(1,'one');
        !            27:     INSERT INTO one VALUES(2,'two');
        !            28:     INSERT INTO one VALUES(3,'three');
        !            29:     SELECT b FROM one ORDER BY a;
        !            30:   }
        !            31: } {one two three}
        !            32: integrity_check trans-1.0.1
        !            33: do_test trans-1.1 {
        !            34:   execsql {
        !            35:     CREATE TABLE two(a int PRIMARY KEY, b text);
        !            36:     INSERT INTO two VALUES(1,'I');
        !            37:     INSERT INTO two VALUES(5,'V');
        !            38:     INSERT INTO two VALUES(10,'X');
        !            39:     SELECT b FROM two ORDER BY a;
        !            40:   }
        !            41: } {I V X}
        !            42: do_test trans-1.9 {
        !            43:   sqlite3 altdb test.db
        !            44:   execsql {SELECT b FROM one ORDER BY a} altdb
        !            45: } {one two three}
        !            46: do_test trans-1.10 {
        !            47:   execsql {SELECT b FROM two ORDER BY a} altdb
        !            48: } {I V X}
        !            49: integrity_check trans-1.11
        !            50: wal_check_journal_mode trans-1.12
        !            51: 
        !            52: # Basic transactions
        !            53: #
        !            54: do_test trans-2.1 {
        !            55:   set v [catch {execsql {BEGIN}} msg]
        !            56:   lappend v $msg
        !            57: } {0 {}}
        !            58: do_test trans-2.2 {
        !            59:   set v [catch {execsql {END}} msg]
        !            60:   lappend v $msg
        !            61: } {0 {}}
        !            62: do_test trans-2.3 {
        !            63:   set v [catch {execsql {BEGIN TRANSACTION}} msg]
        !            64:   lappend v $msg
        !            65: } {0 {}}
        !            66: do_test trans-2.4 {
        !            67:   set v [catch {execsql {COMMIT TRANSACTION}} msg]
        !            68:   lappend v $msg
        !            69: } {0 {}}
        !            70: do_test trans-2.5 {
        !            71:   set v [catch {execsql {BEGIN TRANSACTION 'foo'}} msg]
        !            72:   lappend v $msg
        !            73: } {0 {}}
        !            74: do_test trans-2.6 {
        !            75:   set v [catch {execsql {ROLLBACK TRANSACTION 'foo'}} msg]
        !            76:   lappend v $msg
        !            77: } {0 {}}
        !            78: do_test trans-2.10 {
        !            79:   execsql {
        !            80:     BEGIN;
        !            81:     SELECT a FROM one ORDER BY a;
        !            82:     SELECT a FROM two ORDER BY a;
        !            83:     END;
        !            84:   }
        !            85: } {1 2 3 1 5 10}
        !            86: integrity_check trans-2.11
        !            87: wal_check_journal_mode trans-2.12
        !            88: 
        !            89: # Check the locking behavior
        !            90: #
        !            91: do_test trans-3.1 {
        !            92:   execsql {
        !            93:     BEGIN;
        !            94:     UPDATE one SET a = 0 WHERE 0;
        !            95:     SELECT a FROM one ORDER BY a;
        !            96:   }
        !            97: } {1 2 3}
        !            98: do_test trans-3.2 {
        !            99:   catchsql {
        !           100:     SELECT a FROM two ORDER BY a;
        !           101:   } altdb
        !           102: } {0 {1 5 10}}
        !           103: 
        !           104: do_test trans-3.3 {
        !           105:   catchsql {
        !           106:     SELECT a FROM one ORDER BY a;
        !           107:   } altdb
        !           108: } {0 {1 2 3}}
        !           109: do_test trans-3.4 {
        !           110:   catchsql {
        !           111:     INSERT INTO one VALUES(4,'four');
        !           112:   }
        !           113: } {0 {}}
        !           114: do_test trans-3.5 {
        !           115:   catchsql {
        !           116:     SELECT a FROM two ORDER BY a;
        !           117:   } altdb
        !           118: } {0 {1 5 10}}
        !           119: do_test trans-3.6 {
        !           120:   catchsql {
        !           121:     SELECT a FROM one ORDER BY a;
        !           122:   } altdb
        !           123: } {0 {1 2 3}}
        !           124: do_test trans-3.7 {
        !           125:   catchsql {
        !           126:     INSERT INTO two VALUES(4,'IV');
        !           127:   }
        !           128: } {0 {}}
        !           129: do_test trans-3.8 {
        !           130:   catchsql {
        !           131:     SELECT a FROM two ORDER BY a;
        !           132:   } altdb
        !           133: } {0 {1 5 10}}
        !           134: do_test trans-3.9 {
        !           135:   catchsql {
        !           136:     SELECT a FROM one ORDER BY a;
        !           137:   } altdb
        !           138: } {0 {1 2 3}}
        !           139: do_test trans-3.10 {
        !           140:   execsql {END TRANSACTION}
        !           141: } {}
        !           142: 
        !           143: do_test trans-3.11 {
        !           144:   set v [catch {execsql {
        !           145:     SELECT a FROM two ORDER BY a;
        !           146:   } altdb} msg]
        !           147:   lappend v $msg
        !           148: } {0 {1 4 5 10}}
        !           149: do_test trans-3.12 {
        !           150:   set v [catch {execsql {
        !           151:     SELECT a FROM one ORDER BY a;
        !           152:   } altdb} msg]
        !           153:   lappend v $msg
        !           154: } {0 {1 2 3 4}}
        !           155: do_test trans-3.13 {
        !           156:   set v [catch {execsql {
        !           157:     SELECT a FROM two ORDER BY a;
        !           158:   } db} msg]
        !           159:   lappend v $msg
        !           160: } {0 {1 4 5 10}}
        !           161: do_test trans-3.14 {
        !           162:   set v [catch {execsql {
        !           163:     SELECT a FROM one ORDER BY a;
        !           164:   } db} msg]
        !           165:   lappend v $msg
        !           166: } {0 {1 2 3 4}}
        !           167: integrity_check trans-3.15
        !           168: wal_check_journal_mode trans-3.16
        !           169: 
        !           170: do_test trans-4.1 {
        !           171:   set v [catch {execsql {
        !           172:     COMMIT;
        !           173:   } db} msg]
        !           174:   lappend v $msg
        !           175: } {1 {cannot commit - no transaction is active}}
        !           176: do_test trans-4.2 {
        !           177:   set v [catch {execsql {
        !           178:     ROLLBACK;
        !           179:   } db} msg]
        !           180:   lappend v $msg
        !           181: } {1 {cannot rollback - no transaction is active}}
        !           182: do_test trans-4.3 {
        !           183:   catchsql {
        !           184:     BEGIN TRANSACTION;
        !           185:     UPDATE two SET a = 0 WHERE 0;
        !           186:     SELECT a FROM two ORDER BY a;
        !           187:   } db
        !           188: } {0 {1 4 5 10}}
        !           189: do_test trans-4.4 {
        !           190:   catchsql {
        !           191:     SELECT a FROM two ORDER BY a;
        !           192:   } altdb
        !           193: } {0 {1 4 5 10}}
        !           194: do_test trans-4.5 {
        !           195:   catchsql {
        !           196:     SELECT a FROM one ORDER BY a;
        !           197:   } altdb
        !           198: } {0 {1 2 3 4}}
        !           199: do_test trans-4.6 {
        !           200:   catchsql {
        !           201:     BEGIN TRANSACTION;
        !           202:     SELECT a FROM one ORDER BY a;
        !           203:   } db
        !           204: } {1 {cannot start a transaction within a transaction}}
        !           205: do_test trans-4.7 {
        !           206:   catchsql {
        !           207:     SELECT a FROM two ORDER BY a;
        !           208:   } altdb
        !           209: } {0 {1 4 5 10}}
        !           210: do_test trans-4.8 {
        !           211:   catchsql {
        !           212:     SELECT a FROM one ORDER BY a;
        !           213:   } altdb
        !           214: } {0 {1 2 3 4}}
        !           215: do_test trans-4.9 {
        !           216:   set v [catch {execsql {
        !           217:     END TRANSACTION;
        !           218:     SELECT a FROM two ORDER BY a;
        !           219:   } db} msg]
        !           220:   lappend v $msg
        !           221: } {0 {1 4 5 10}}
        !           222: do_test trans-4.10 {
        !           223:   set v [catch {execsql {
        !           224:     SELECT a FROM two ORDER BY a;
        !           225:   } altdb} msg]
        !           226:   lappend v $msg
        !           227: } {0 {1 4 5 10}}
        !           228: do_test trans-4.11 {
        !           229:   set v [catch {execsql {
        !           230:     SELECT a FROM one ORDER BY a;
        !           231:   } altdb} msg]
        !           232:   lappend v $msg
        !           233: } {0 {1 2 3 4}}
        !           234: integrity_check trans-4.12
        !           235: wal_check_journal_mode trans-4.13
        !           236: wal_check_journal_mode trans-4.14 altdb
        !           237: do_test trans-4.98 {
        !           238:   altdb close
        !           239:   execsql {
        !           240:     DROP TABLE one;
        !           241:     DROP TABLE two;
        !           242:   }
        !           243: } {}
        !           244: integrity_check trans-4.99
        !           245: 
        !           246: # Check out the commit/rollback behavior of the database
        !           247: #
        !           248: do_test trans-5.1 {
        !           249:   execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
        !           250: } {}
        !           251: do_test trans-5.2 {
        !           252:   execsql {BEGIN TRANSACTION}
        !           253:   execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
        !           254: } {}
        !           255: do_test trans-5.3 {
        !           256:   execsql {CREATE TABLE one(a text, b int)}
        !           257:   execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
        !           258: } {one}
        !           259: do_test trans-5.4 {
        !           260:   execsql {SELECT a,b FROM one ORDER BY b}
        !           261: } {}
        !           262: do_test trans-5.5 {
        !           263:   execsql {INSERT INTO one(a,b) VALUES('hello', 1)}
        !           264:   execsql {SELECT a,b FROM one ORDER BY b}
        !           265: } {hello 1}
        !           266: do_test trans-5.6 {
        !           267:   execsql {ROLLBACK}
        !           268:   execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
        !           269: } {}
        !           270: do_test trans-5.7 {
        !           271:   set v [catch {
        !           272:     execsql {SELECT a,b FROM one ORDER BY b}
        !           273:   } msg]
        !           274:   lappend v $msg
        !           275: } {1 {no such table: one}}
        !           276: 
        !           277: # Test commits and rollbacks of table CREATE TABLEs, CREATE INDEXs
        !           278: # DROP TABLEs and DROP INDEXs
        !           279: #
        !           280: do_test trans-5.8 {
        !           281:   execsql {
        !           282:     SELECT name fROM sqlite_master 
        !           283:     WHERE type='table' OR type='index'
        !           284:     ORDER BY name
        !           285:   }
        !           286: } {}
        !           287: do_test trans-5.9 {
        !           288:   execsql {
        !           289:     BEGIN TRANSACTION;
        !           290:     CREATE TABLE t1(a int, b int, c int);
        !           291:     SELECT name fROM sqlite_master 
        !           292:     WHERE type='table' OR type='index'
        !           293:     ORDER BY name;
        !           294:   }
        !           295: } {t1}
        !           296: do_test trans-5.10 {
        !           297:   execsql {
        !           298:     CREATE INDEX i1 ON t1(a);
        !           299:     SELECT name fROM sqlite_master 
        !           300:     WHERE type='table' OR type='index'
        !           301:     ORDER BY name;
        !           302:   }
        !           303: } {i1 t1}
        !           304: do_test trans-5.11 {
        !           305:   execsql {
        !           306:     COMMIT;
        !           307:     SELECT name fROM sqlite_master 
        !           308:     WHERE type='table' OR type='index'
        !           309:     ORDER BY name;
        !           310:   }
        !           311: } {i1 t1}
        !           312: do_test trans-5.12 {
        !           313:   execsql {
        !           314:     BEGIN TRANSACTION;
        !           315:     CREATE TABLE t2(a int, b int, c int);
        !           316:     CREATE INDEX i2a ON t2(a);
        !           317:     CREATE INDEX i2b ON t2(b);
        !           318:     DROP TABLE t1;
        !           319:     SELECT name fROM sqlite_master 
        !           320:     WHERE type='table' OR type='index'
        !           321:     ORDER BY name;
        !           322:   }
        !           323: } {i2a i2b t2}
        !           324: do_test trans-5.13 {
        !           325:   execsql {
        !           326:     ROLLBACK;
        !           327:     SELECT name fROM sqlite_master 
        !           328:     WHERE type='table' OR type='index'
        !           329:     ORDER BY name;
        !           330:   }
        !           331: } {i1 t1}
        !           332: do_test trans-5.14 {
        !           333:   execsql {
        !           334:     BEGIN TRANSACTION;
        !           335:     DROP INDEX i1;
        !           336:     SELECT name fROM sqlite_master 
        !           337:     WHERE type='table' OR type='index'
        !           338:     ORDER BY name;
        !           339:   }
        !           340: } {t1}
        !           341: do_test trans-5.15 {
        !           342:   execsql {
        !           343:     ROLLBACK;
        !           344:     SELECT name fROM sqlite_master 
        !           345:     WHERE type='table' OR type='index'
        !           346:     ORDER BY name;
        !           347:   }
        !           348: } {i1 t1}
        !           349: do_test trans-5.16 {
        !           350:   execsql {
        !           351:     BEGIN TRANSACTION;
        !           352:     DROP INDEX i1;
        !           353:     CREATE TABLE t2(x int, y int, z int);
        !           354:     CREATE INDEX i2x ON t2(x);
        !           355:     CREATE INDEX i2y ON t2(y);
        !           356:     INSERT INTO t2 VALUES(1,2,3);
        !           357:     SELECT name fROM sqlite_master 
        !           358:     WHERE type='table' OR type='index'
        !           359:     ORDER BY name;
        !           360:   }
        !           361: } {i2x i2y t1 t2}
        !           362: do_test trans-5.17 {
        !           363:   execsql {
        !           364:     COMMIT;
        !           365:     SELECT name fROM sqlite_master 
        !           366:     WHERE type='table' OR type='index'
        !           367:     ORDER BY name;
        !           368:   }
        !           369: } {i2x i2y t1 t2}
        !           370: do_test trans-5.18 {
        !           371:   execsql {
        !           372:     SELECT * FROM t2;
        !           373:   }
        !           374: } {1 2 3}
        !           375: do_test trans-5.19 {
        !           376:   execsql {
        !           377:     SELECT x FROM t2 WHERE y=2;
        !           378:   }
        !           379: } {1}
        !           380: do_test trans-5.20 {
        !           381:   execsql {
        !           382:     BEGIN TRANSACTION;
        !           383:     DROP TABLE t1;
        !           384:     DROP TABLE t2;
        !           385:     SELECT name fROM sqlite_master 
        !           386:     WHERE type='table' OR type='index'
        !           387:     ORDER BY name;
        !           388:   }
        !           389: } {}
        !           390: do_test trans-5.21 {
        !           391:   set r [catch {execsql {
        !           392:     SELECT * FROM t2
        !           393:   }} msg]
        !           394:   lappend r $msg
        !           395: } {1 {no such table: t2}}
        !           396: do_test trans-5.22 {
        !           397:   execsql {
        !           398:     ROLLBACK;
        !           399:     SELECT name fROM sqlite_master 
        !           400:     WHERE type='table' OR type='index'
        !           401:     ORDER BY name;
        !           402:   }
        !           403: } {i2x i2y t1 t2}
        !           404: do_test trans-5.23 {
        !           405:   execsql {
        !           406:     SELECT * FROM t2;
        !           407:   }
        !           408: } {1 2 3}
        !           409: integrity_check trans-5.23
        !           410: 
        !           411: 
        !           412: # Try to DROP and CREATE tables and indices with the same name
        !           413: # within a transaction.  Make sure ROLLBACK works.
        !           414: #
        !           415: do_test trans-6.1 {
        !           416:   execsql2 {
        !           417:     INSERT INTO t1 VALUES(1,2,3);
        !           418:     BEGIN TRANSACTION;
        !           419:     DROP TABLE t1;
        !           420:     CREATE TABLE t1(p,q,r);
        !           421:     ROLLBACK;
        !           422:     SELECT * FROM t1;
        !           423:   }
        !           424: } {a 1 b 2 c 3}
        !           425: do_test trans-6.2 {
        !           426:   execsql2 {
        !           427:     INSERT INTO t1 VALUES(1,2,3);
        !           428:     BEGIN TRANSACTION;
        !           429:     DROP TABLE t1;
        !           430:     CREATE TABLE t1(p,q,r);
        !           431:     COMMIT;
        !           432:     SELECT * FROM t1;
        !           433:   }
        !           434: } {}
        !           435: do_test trans-6.3 {
        !           436:   execsql2 {
        !           437:     INSERT INTO t1 VALUES(1,2,3);
        !           438:     SELECT * FROM t1;
        !           439:   }
        !           440: } {p 1 q 2 r 3}
        !           441: do_test trans-6.4 {
        !           442:   execsql2 {
        !           443:     BEGIN TRANSACTION;
        !           444:     DROP TABLE t1;
        !           445:     CREATE TABLE t1(a,b,c);
        !           446:     INSERT INTO t1 VALUES(4,5,6);
        !           447:     SELECT * FROM t1;
        !           448:     DROP TABLE t1;
        !           449:   }
        !           450: } {a 4 b 5 c 6}
        !           451: do_test trans-6.5 {
        !           452:   execsql2 {
        !           453:     ROLLBACK;
        !           454:     SELECT * FROM t1;
        !           455:   }
        !           456: } {p 1 q 2 r 3}
        !           457: do_test trans-6.6 {
        !           458:   execsql2 {
        !           459:     BEGIN TRANSACTION;
        !           460:     DROP TABLE t1;
        !           461:     CREATE TABLE t1(a,b,c);
        !           462:     INSERT INTO t1 VALUES(4,5,6);
        !           463:     SELECT * FROM t1;
        !           464:     DROP TABLE t1;
        !           465:   }
        !           466: } {a 4 b 5 c 6}
        !           467: do_test trans-6.7 {
        !           468:   catchsql {
        !           469:     COMMIT;
        !           470:     SELECT * FROM t1;
        !           471:   }
        !           472: } {1 {no such table: t1}}
        !           473: 
        !           474: # Repeat on a table with an automatically generated index.
        !           475: #
        !           476: do_test trans-6.10 {
        !           477:   execsql2 {
        !           478:     CREATE TABLE t1(a unique,b,c);
        !           479:     INSERT INTO t1 VALUES(1,2,3);
        !           480:     BEGIN TRANSACTION;
        !           481:     DROP TABLE t1;
        !           482:     CREATE TABLE t1(p unique,q,r);
        !           483:     ROLLBACK;
        !           484:     SELECT * FROM t1;
        !           485:   }
        !           486: } {a 1 b 2 c 3}
        !           487: do_test trans-6.11 {
        !           488:   execsql2 {
        !           489:     BEGIN TRANSACTION;
        !           490:     DROP TABLE t1;
        !           491:     CREATE TABLE t1(p unique,q,r);
        !           492:     COMMIT;
        !           493:     SELECT * FROM t1;
        !           494:   }
        !           495: } {}
        !           496: do_test trans-6.12 {
        !           497:   execsql2 {
        !           498:     INSERT INTO t1 VALUES(1,2,3);
        !           499:     SELECT * FROM t1;
        !           500:   }
        !           501: } {p 1 q 2 r 3}
        !           502: do_test trans-6.13 {
        !           503:   execsql2 {
        !           504:     BEGIN TRANSACTION;
        !           505:     DROP TABLE t1;
        !           506:     CREATE TABLE t1(a unique,b,c);
        !           507:     INSERT INTO t1 VALUES(4,5,6);
        !           508:     SELECT * FROM t1;
        !           509:     DROP TABLE t1;
        !           510:   }
        !           511: } {a 4 b 5 c 6}
        !           512: do_test trans-6.14 {
        !           513:   execsql2 {
        !           514:     ROLLBACK;
        !           515:     SELECT * FROM t1;
        !           516:   }
        !           517: } {p 1 q 2 r 3}
        !           518: do_test trans-6.15 {
        !           519:   execsql2 {
        !           520:     BEGIN TRANSACTION;
        !           521:     DROP TABLE t1;
        !           522:     CREATE TABLE t1(a unique,b,c);
        !           523:     INSERT INTO t1 VALUES(4,5,6);
        !           524:     SELECT * FROM t1;
        !           525:     DROP TABLE t1;
        !           526:   }
        !           527: } {a 4 b 5 c 6}
        !           528: do_test trans-6.16 {
        !           529:   catchsql {
        !           530:     COMMIT;
        !           531:     SELECT * FROM t1;
        !           532:   }
        !           533: } {1 {no such table: t1}}
        !           534: 
        !           535: do_test trans-6.20 {
        !           536:   execsql {
        !           537:     CREATE TABLE t1(a integer primary key,b,c);
        !           538:     INSERT INTO t1 VALUES(1,-2,-3);
        !           539:     INSERT INTO t1 VALUES(4,-5,-6);
        !           540:     SELECT * FROM t1;
        !           541:   }
        !           542: } {1 -2 -3 4 -5 -6}
        !           543: do_test trans-6.21 {
        !           544:   execsql {
        !           545:     CREATE INDEX i1 ON t1(b);
        !           546:     SELECT * FROM t1 WHERE b<1;
        !           547:   }
        !           548: } {4 -5 -6 1 -2 -3}
        !           549: do_test trans-6.22 {
        !           550:   execsql {
        !           551:     BEGIN TRANSACTION;
        !           552:     DROP INDEX i1;
        !           553:     SELECT * FROM t1 WHERE b<1;
        !           554:     ROLLBACK;
        !           555:   }
        !           556: } {1 -2 -3 4 -5 -6}
        !           557: do_test trans-6.23 {
        !           558:   execsql {
        !           559:     SELECT * FROM t1 WHERE b<1;
        !           560:   }
        !           561: } {4 -5 -6 1 -2 -3}
        !           562: do_test trans-6.24 {
        !           563:   execsql {
        !           564:     BEGIN TRANSACTION;
        !           565:     DROP TABLE t1;
        !           566:     ROLLBACK;
        !           567:     SELECT * FROM t1 WHERE b<1;
        !           568:   }
        !           569: } {4 -5 -6 1 -2 -3}
        !           570: 
        !           571: do_test trans-6.25 {
        !           572:   execsql {
        !           573:     BEGIN TRANSACTION;
        !           574:     DROP INDEX i1;
        !           575:     CREATE INDEX i1 ON t1(c);
        !           576:     SELECT * FROM t1 WHERE b<1;
        !           577:   }
        !           578: } {1 -2 -3 4 -5 -6}
        !           579: do_test trans-6.26 {
        !           580:   execsql {
        !           581:     SELECT * FROM t1 WHERE c<1;
        !           582:   }
        !           583: } {4 -5 -6 1 -2 -3}
        !           584: do_test trans-6.27 {
        !           585:   execsql {
        !           586:     ROLLBACK;
        !           587:     SELECT * FROM t1 WHERE b<1;
        !           588:   }
        !           589: } {4 -5 -6 1 -2 -3}
        !           590: do_test trans-6.28 {
        !           591:   execsql {
        !           592:     SELECT * FROM t1 WHERE c<1;
        !           593:   }
        !           594: } {1 -2 -3 4 -5 -6}
        !           595: 
        !           596: # The following repeats steps 6.20 through 6.28, but puts a "unique"
        !           597: # constraint the first field of the table in order to generate an
        !           598: # automatic index.
        !           599: #
        !           600: do_test trans-6.30 {
        !           601:   execsql {
        !           602:     BEGIN TRANSACTION;
        !           603:     DROP TABLE t1;
        !           604:     CREATE TABLE t1(a int unique,b,c);
        !           605:     COMMIT;
        !           606:     INSERT INTO t1 VALUES(1,-2,-3);
        !           607:     INSERT INTO t1 VALUES(4,-5,-6);
        !           608:     SELECT * FROM t1 ORDER BY a;
        !           609:   }
        !           610: } {1 -2 -3 4 -5 -6}
        !           611: do_test trans-6.31 {
        !           612:   execsql {
        !           613:     CREATE INDEX i1 ON t1(b);
        !           614:     SELECT * FROM t1 WHERE b<1;
        !           615:   }
        !           616: } {4 -5 -6 1 -2 -3}
        !           617: do_test trans-6.32 {
        !           618:   execsql {
        !           619:     BEGIN TRANSACTION;
        !           620:     DROP INDEX i1;
        !           621:     SELECT * FROM t1 WHERE b<1;
        !           622:     ROLLBACK;
        !           623:   }
        !           624: } {1 -2 -3 4 -5 -6}
        !           625: do_test trans-6.33 {
        !           626:   execsql {
        !           627:     SELECT * FROM t1 WHERE b<1;
        !           628:   }
        !           629: } {4 -5 -6 1 -2 -3}
        !           630: do_test trans-6.34 {
        !           631:   execsql {
        !           632:     BEGIN TRANSACTION;
        !           633:     DROP TABLE t1;
        !           634:     ROLLBACK;
        !           635:     SELECT * FROM t1 WHERE b<1;
        !           636:   }
        !           637: } {4 -5 -6 1 -2 -3}
        !           638: 
        !           639: do_test trans-6.35 {
        !           640:   execsql {
        !           641:     BEGIN TRANSACTION;
        !           642:     DROP INDEX i1;
        !           643:     CREATE INDEX i1 ON t1(c);
        !           644:     SELECT * FROM t1 WHERE b<1;
        !           645:   }
        !           646: } {1 -2 -3 4 -5 -6}
        !           647: do_test trans-6.36 {
        !           648:   execsql {
        !           649:     SELECT * FROM t1 WHERE c<1;
        !           650:   }
        !           651: } {4 -5 -6 1 -2 -3}
        !           652: do_test trans-6.37 {
        !           653:   execsql {
        !           654:     DROP INDEX i1;
        !           655:     SELECT * FROM t1 WHERE c<1;
        !           656:   }
        !           657: } {1 -2 -3 4 -5 -6}
        !           658: do_test trans-6.38 {
        !           659:   execsql {
        !           660:     ROLLBACK;
        !           661:     SELECT * FROM t1 WHERE b<1;
        !           662:   }
        !           663: } {4 -5 -6 1 -2 -3}
        !           664: do_test trans-6.39 {
        !           665:   execsql {
        !           666:     SELECT * FROM t1 WHERE c<1;
        !           667:   }
        !           668: } {1 -2 -3 4 -5 -6}
        !           669: integrity_check trans-6.40
        !           670: 
        !           671: # Test to make sure rollback restores the database back to its original
        !           672: # state.
        !           673: #
        !           674: do_test trans-7.1 {
        !           675:   execsql {BEGIN}
        !           676:   for {set i 0} {$i<1000} {incr i} {
        !           677:     set r1 [expr {rand()}]
        !           678:     set r2 [expr {rand()}]
        !           679:     set r3 [expr {rand()}]
        !           680:     execsql "INSERT INTO t2 VALUES($r1,$r2,$r3)"
        !           681:   }
        !           682:   execsql {COMMIT}
        !           683:   set ::checksum [execsql {SELECT md5sum(x,y,z) FROM t2}]
        !           684:   set ::checksum2 [
        !           685:     execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           686:   ]
        !           687:   execsql {SELECT count(*) FROM t2}
        !           688: } {1001}
        !           689: do_test trans-7.2 {
        !           690:   execsql {SELECT md5sum(x,y,z) FROM t2}
        !           691: } $checksum
        !           692: do_test trans-7.2.1 {
        !           693:   execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           694: } $checksum2
        !           695: do_test trans-7.3 {
        !           696:   execsql {
        !           697:     BEGIN;
        !           698:     DELETE FROM t2;
        !           699:     ROLLBACK;
        !           700:     SELECT md5sum(x,y,z) FROM t2;
        !           701:   }
        !           702: } $checksum
        !           703: do_test trans-7.4 {
        !           704:   execsql {
        !           705:     BEGIN;
        !           706:     INSERT INTO t2 SELECT * FROM t2;
        !           707:     ROLLBACK;
        !           708:     SELECT md5sum(x,y,z) FROM t2;
        !           709:   }
        !           710: } $checksum
        !           711: do_test trans-7.5 {
        !           712:   execsql {
        !           713:     BEGIN;
        !           714:     DELETE FROM t2;
        !           715:     ROLLBACK;
        !           716:     SELECT md5sum(x,y,z) FROM t2;
        !           717:   }
        !           718: } $checksum
        !           719: do_test trans-7.6 {
        !           720:   execsql {
        !           721:     BEGIN;
        !           722:     INSERT INTO t2 SELECT * FROM t2;
        !           723:     ROLLBACK;
        !           724:     SELECT md5sum(x,y,z) FROM t2;
        !           725:   }
        !           726: } $checksum
        !           727: do_test trans-7.7 {
        !           728:   execsql {
        !           729:     BEGIN;
        !           730:     CREATE TABLE t3 AS SELECT * FROM t2;
        !           731:     INSERT INTO t2 SELECT * FROM t3;
        !           732:     ROLLBACK;
        !           733:     SELECT md5sum(x,y,z) FROM t2;
        !           734:   }
        !           735: } $checksum
        !           736: do_test trans-7.8 {
        !           737:   execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           738: } $checksum2
        !           739: ifcapable tempdb {
        !           740:   do_test trans-7.9 {
        !           741:     execsql {
        !           742:       BEGIN;
        !           743:       CREATE TEMP TABLE t3 AS SELECT * FROM t2;
        !           744:       INSERT INTO t2 SELECT * FROM t3;
        !           745:       ROLLBACK;
        !           746:       SELECT md5sum(x,y,z) FROM t2;
        !           747:     }
        !           748:   } $checksum
        !           749: }
        !           750: do_test trans-7.10 {
        !           751:   execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           752: } $checksum2
        !           753: ifcapable tempdb {
        !           754:   do_test trans-7.11 {
        !           755:     execsql {
        !           756:       BEGIN;
        !           757:       CREATE TEMP TABLE t3 AS SELECT * FROM t2;
        !           758:       INSERT INTO t2 SELECT * FROM t3;
        !           759:       DROP INDEX i2x;
        !           760:       DROP INDEX i2y;
        !           761:       CREATE INDEX i3a ON t3(x);
        !           762:       ROLLBACK;
        !           763:       SELECT md5sum(x,y,z) FROM t2;
        !           764:     }
        !           765:   } $checksum
        !           766: }
        !           767: do_test trans-7.12 {
        !           768:   execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           769: } $checksum2
        !           770: ifcapable tempdb {
        !           771:   do_test trans-7.13 {
        !           772:     execsql {
        !           773:       BEGIN;
        !           774:       DROP TABLE t2;
        !           775:       ROLLBACK;
        !           776:       SELECT md5sum(x,y,z) FROM t2;
        !           777:     }
        !           778:   } $checksum
        !           779: }
        !           780: do_test trans-7.14 {
        !           781:   execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           782: } $checksum2
        !           783: integrity_check trans-7.15
        !           784: wal_check_journal_mode trans-7.16
        !           785: 
        !           786: # Arrange for another process to begin modifying the database but abort
        !           787: # and die in the middle of the modification.  Then have this process read
        !           788: # the database.  This process should detect the journal file and roll it
        !           789: # back.  Verify that this happens correctly.
        !           790: #
        !           791: set fd [open test.tcl w]
        !           792: puts $fd {
        !           793:   sqlite3_test_control_pending_byte 0x0010000
        !           794:   sqlite3 db test.db
        !           795:   db eval {
        !           796:     PRAGMA default_cache_size=20;
        !           797:     BEGIN;
        !           798:     CREATE TABLE t3 AS SELECT * FROM t2;
        !           799:     DELETE FROM t2;
        !           800:   }
        !           801:   sqlite_abort
        !           802: }
        !           803: close $fd
        !           804: do_test trans-8.1 {
        !           805:   catch {exec [info nameofexec] test.tcl}
        !           806:   execsql {SELECT md5sum(x,y,z) FROM t2}
        !           807: } $checksum
        !           808: do_test trans-8.2 {
        !           809:   execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           810: } $checksum2
        !           811: integrity_check trans-8.3
        !           812: set fd [open test.tcl w]
        !           813: puts $fd {
        !           814:   sqlite3_test_control_pending_byte 0x0010000
        !           815:   sqlite3 db test.db
        !           816:   db eval {
        !           817:     PRAGMA journal_mode=persist;
        !           818:     PRAGMA default_cache_size=20;
        !           819:     BEGIN;
        !           820:     CREATE TABLE t3 AS SELECT * FROM t2;
        !           821:     DELETE FROM t2;
        !           822:   }
        !           823:   sqlite_abort
        !           824: }
        !           825: close $fd
        !           826: do_test trans-8.4 {
        !           827:   catch {exec [info nameofexec] test.tcl}
        !           828:   execsql {SELECT md5sum(x,y,z) FROM t2}
        !           829: } $checksum
        !           830: do_test trans-8.5 {
        !           831:   execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
        !           832: } $checksum2
        !           833: integrity_check trans-8.6
        !           834: wal_check_journal_mode trans-8.7
        !           835: 
        !           836: # In the following sequence of tests, compute the MD5 sum of the content
        !           837: # of a table, make lots of modifications to that table, then do a rollback.
        !           838: # Verify that after the rollback, the MD5 checksum is unchanged.
        !           839: #
        !           840: do_test trans-9.1 {
        !           841:   execsql {
        !           842:     PRAGMA default_cache_size=10;
        !           843:   }
        !           844:   db close
        !           845:   sqlite3 db test.db
        !           846:   execsql {
        !           847:     BEGIN;
        !           848:     CREATE TABLE t3(x TEXT);
        !           849:     INSERT INTO t3 VALUES(randstr(10,400));
        !           850:     INSERT INTO t3 VALUES(randstr(10,400));
        !           851:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           852:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           853:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           854:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           855:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           856:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           857:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           858:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           859:     INSERT INTO t3 SELECT randstr(10,400) FROM t3;
        !           860:     COMMIT;
        !           861:     SELECT count(*) FROM t3;
        !           862:   }
        !           863: } {1024}
        !           864: wal_check_journal_mode trans-9.1.1
        !           865: 
        !           866: # The following procedure computes a "signature" for table "t3".  If
        !           867: # T3 changes in any way, the signature should change.  
        !           868: #
        !           869: # This is used to test ROLLBACK.  We gather a signature for t3, then
        !           870: # make lots of changes to t3, then rollback and take another signature.
        !           871: # The two signatures should be the same.
        !           872: #
        !           873: proc signature {} {
        !           874:   return [db eval {SELECT count(*), md5sum(x) FROM t3}]
        !           875: }
        !           876: 
        !           877: # Repeat the following group of tests 20 times for quick testing and
        !           878: # 40 times for full testing.  Each iteration of the test makes table
        !           879: # t3 a little larger, and thus takes a little longer, so doing 40 tests
        !           880: # is more than 2.0 times slower than doing 20 tests.  Considerably more.
        !           881: #
        !           882: # Also, if temporary tables are stored in memory and the test pcache
        !           883: # is in use, only 20 iterations. Otherwise the test pcache runs out
        !           884: # of page slots and SQLite reports "out of memory".
        !           885: #
        !           886: if {[info exists G(isquick)] || (
        !           887:   $TEMP_STORE==3 && [regexp {^pcache[[:digit:]]*$} [permutation]]
        !           888: ) } {
        !           889:   set limit 20
        !           890: } elseif {[info exists G(issoak)]} {
        !           891:   set limit 100
        !           892: } else {
        !           893:   set limit 40
        !           894: }
        !           895: 
        !           896: # Do rollbacks.  Make sure the signature does not change.
        !           897: #
        !           898: for {set i 2} {$i<=$limit} {incr i} {
        !           899:   set ::sig [signature]
        !           900:   set cnt [lindex $::sig 0]
        !           901:   if {$i%2==0} {
        !           902:     execsql {PRAGMA fullfsync=ON}
        !           903:   } else {
        !           904:     execsql {PRAGMA fullfsync=OFF}
        !           905:   }
        !           906:   set sqlite_sync_count 0
        !           907:   set sqlite_fullsync_count 0
        !           908:   do_test trans-9.$i.1-$cnt {
        !           909:      execsql {
        !           910:        BEGIN;
        !           911:        DELETE FROM t3 WHERE random()%10!=0;
        !           912:        INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
        !           913:        INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
        !           914:        ROLLBACK;
        !           915:      }
        !           916:      signature
        !           917:   } $sig
        !           918:   do_test trans-9.$i.2-$cnt {
        !           919:      execsql {
        !           920:        BEGIN;
        !           921:        DELETE FROM t3 WHERE random()%10!=0;
        !           922:        INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
        !           923:        DELETE FROM t3 WHERE random()%10!=0;
        !           924:        INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
        !           925:        ROLLBACK;
        !           926:      }
        !           927:      signature
        !           928:   } $sig
        !           929:   if {$i<$limit} {
        !           930:     do_test trans-9.$i.3-$cnt {
        !           931:        execsql {
        !           932:          INSERT INTO t3 SELECT randstr(10,400) FROM t3 WHERE random()%10==0;
        !           933:        }
        !           934:     } {}
        !           935:     catch flush_async_queue
        !           936:     if {$tcl_platform(platform)=="unix"} {
        !           937:       do_test trans-9.$i.4-$cnt {
        !           938:          expr {$sqlite_sync_count>0}
        !           939:       } 1
        !           940:       ifcapable pager_pragmas {
        !           941:         do_test trans-9.$i.5-$cnt {
        !           942:            expr {$sqlite_fullsync_count>0}
        !           943:         } [expr {$i%2==0}]
        !           944:       } else {
        !           945:         do_test trans-9.$i.5-$cnt {
        !           946:           expr {$sqlite_fullsync_count==0}
        !           947:         } {1}
        !           948:       }
        !           949:     }
        !           950:   }
        !           951: 
        !           952:   wal_check_journal_mode trans-9.$i.6-$cnt
        !           953:   set ::pager_old_format 0
        !           954: }
        !           955:    
        !           956: finish_test

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