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

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