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

1.1       misho       1: # 2008 April 17
                      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 focus
                     12: # of these tests is the journal mode pragma.
                     13: #
                     14: # $Id: jrnlmode.test,v 1.16 2009/06/05 17:09:12 drh Exp $
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: 
                     19: ifcapable {!pager_pragmas} {
                     20:   finish_test
                     21:   return
                     22: }
                     23: 
                     24: if {[info exists TEMP_STORE] && $TEMP_STORE>=2} {
                     25:   set temp_persist memory
                     26:   set temp_delete memory
                     27:   set temp_truncate memory
                     28:   set temp_off off
                     29: } else {
                     30:   set temp_persist persist
                     31:   set temp_delete delete
                     32:   set temp_truncate truncate
                     33:   set temp_off off
                     34: }
                     35: 
                     36: proc temp_journal_mode {newmode} {
                     37:   if {[info exists ::TEMP_STORE] && $::TEMP_STORE>=2} {
                     38:     if {$newmode ne "off" && $newmode ne "memory"} {
                     39:       execsql {PRAGMA temp.journal_mode}
                     40:       set newmode [db one {PRAGMA temp.journal_mode}]
                     41:     }
                     42:   }
                     43:   set newmode
                     44: }
                     45: 
                     46: #----------------------------------------------------------------------
                     47: # Test cases jrnlmode-1.X test the PRAGMA logic.
                     48: #
                     49: do_test jrnlmode-1.0 {
                     50:   execsql {
                     51:     PRAGMA journal_mode;
                     52:     PRAGMA main.journal_mode;
                     53:     PRAGMA temp.journal_mode;
                     54:   } 
                     55: } [list delete delete [temp_journal_mode delete]]
                     56: do_test jrnlmode-1.1 {
                     57:   execsql {
                     58:     PRAGMA journal_mode = persist;
                     59:   } 
                     60: } {persist}
                     61: do_test jrnlmode-1.2 {
                     62:   execsql {
                     63:     PRAGMA journal_mode;
                     64:     PRAGMA main.journal_mode;
                     65:     PRAGMA temp.journal_mode;
                     66:   } 
                     67: } [list persist persist [temp_journal_mode persist]]
                     68: do_test jrnlmode-1.4 {
                     69:   execsql {
                     70:     PRAGMA journal_mode = off;
                     71:   } 
                     72: } {off}
                     73: do_test jrnlmode-1.5 {
                     74:   execsql {
                     75:     PRAGMA journal_mode;
                     76:     PRAGMA main.journal_mode;
                     77:     PRAGMA temp.journal_mode;
                     78:   } 
                     79: } [list off off [temp_journal_mode off]]
                     80: do_test jrnlmode-1.6 {
                     81:   execsql {
                     82:     PRAGMA journal_mode = delete;
                     83:   } 
                     84: } {delete}
                     85: do_test jrnlmode-1.7 {
                     86:   execsql {
                     87:     PRAGMA journal_mode;
                     88:     PRAGMA main.journal_mode;
                     89:     PRAGMA Temp.journal_mode;
                     90:   } 
                     91: } [list delete delete [temp_journal_mode delete]]
                     92: do_test jrnlmode-1.7.1 {
                     93:   execsql {
                     94:     PRAGMA journal_mode = truncate;
                     95:   } 
                     96: } {truncate}
                     97: do_test jrnlmode-1.7.2 {
                     98:   execsql {
                     99:     PRAGMA journal_mode;
                    100:     PRAGMA main.journal_mode;
                    101:     PRAGMA temp.journal_mode;
                    102:   } 
                    103: } [list truncate truncate [temp_journal_mode truncate]]
                    104: do_test jrnlmode-1.8 {
                    105:   execsql {
                    106:     PRAGMA journal_mode = off;
                    107:     PRAGMA journal_mode = invalid;
                    108:   } 
                    109: } {off off}
                    110: ifcapable attach {
                    111:   do_test jrnlmode-1.9 {
                    112:     execsql {
                    113:       PRAGMA journal_mode = PERSIST;
                    114:       ATTACH ':memory:' as aux1;
                    115:     }
                    116:     execsql {
                    117:       PRAGMA main.journal_mode;
                    118:       PRAGMA aux1.journal_mode;
                    119:     }
                    120:   } {persist memory}
                    121:   do_test jrnlmode-1.10 {
                    122:     execsql {
                    123:       PRAGMA main.journal_mode = OFF;
                    124:     }
                    125:     execsql {
                    126:       PRAGMA main.journal_mode;
                    127:       PRAGMA temp.journal_mode;
                    128:       PRAGMA aux1.journal_mode;
                    129:     }
                    130:   } [list off [temp_journal_mode persist] memory]
                    131:   do_test jrnlmode-1.11 {
                    132:     execsql {
                    133:       PRAGMA journal_mode;
                    134:     }
                    135:   } {off}
                    136:   do_test jrnlmode-1.12 {
                    137:     execsql {
                    138:       ATTACH ':memory:' as aux2;
                    139:     }
                    140:     execsql {
                    141:       PRAGMA main.journal_mode;
                    142:       PRAGMA aux1.journal_mode;
                    143:       PRAGMA aux2.journal_mode;
                    144:     }
                    145:   } {off memory memory}
                    146:   do_test jrnlmode-1.13 {
                    147:     # The journal-mode used by in-memory databases cannot be changed.
                    148:     execsql {
                    149:       PRAGMA aux1.journal_mode = DELETE;
                    150:     }
                    151:     execsql {
                    152:       PRAGMA main.journal_mode;
                    153:       PRAGMA aux1.journal_mode;
                    154:       PRAGMA aux2.journal_mode;
                    155:     }
                    156:   } {off memory memory}
                    157:   do_test jrnlmode-1.14 {
                    158:     execsql {
                    159:       PRAGMA journal_mode = delete;
                    160:     }
                    161:     execsql {
                    162:       PRAGMA main.journal_mode;
                    163:       PRAGMA temp.journal_mode;
                    164:       PRAGMA aux1.journal_mode;
                    165:       PRAGMA aux2.journal_mode;
                    166:     }
                    167:   } [list delete [temp_journal_mode delete] memory memory]
                    168:   do_test jrnlmode-1.15 {
                    169:     execsql {
                    170:       ATTACH ':memory:' as aux3;
                    171:     }
                    172:     execsql {
                    173:       PRAGMA main.journal_mode;
                    174:       PRAGMA temp.journal_mode;
                    175:       PRAGMA aux1.journal_mode;
                    176:       PRAGMA aux2.journal_mode;
                    177:       PRAGMA aux3.journal_mode;
                    178:     }
                    179:   } [list delete [temp_journal_mode delete] memory memory memory]
                    180:   do_test jrnlmode-1.16 {
                    181:     execsql {
                    182:       PRAGMA journal_mode = TRUNCATE;
                    183:     }
                    184:     execsql {
                    185:       PRAGMA main.journal_mode;
                    186:       PRAGMA temp.journal_mode;
                    187:       PRAGMA aux1.journal_mode;
                    188:       PRAGMA aux2.journal_mode;
                    189:       PRAGMA aux3.journal_mode;
                    190:     }
                    191:   } [list truncate [temp_journal_mode truncate] memory memory memory]
                    192: 
                    193:   do_test jrnlmode-1.99 {
                    194:     execsql {
                    195:       DETACH aux1;
                    196:       DETACH aux2;
                    197:       DETACH aux3;
                    198:     }
                    199:   } {}
                    200: }
                    201: 
                    202: ifcapable attach {
                    203:   forcedelete test2.db
                    204:   do_test jrnlmode-2.1 {
                    205:     execsql {
                    206:       ATTACH 'test2.db' AS aux;
                    207:       PRAGMA main.journal_mode = persist;
                    208:       PRAGMA aux.journal_mode = persist;
                    209:       CREATE TABLE abc(a, b, c);
                    210:       CREATE TABLE aux.def(d, e, f);
                    211:     }
                    212:     execsql {
                    213:       BEGIN;
                    214:       INSERT INTO abc VALUES(1, 2, 3);
                    215:       INSERT INTO def VALUES(4, 5, 6);
                    216:       COMMIT;
                    217:     }
                    218:     list [file exists test.db-journal] [file exists test2.db-journal]
                    219:   } {1 1}
                    220: 
                    221:   do_test jrnlmode-2.2 {
                    222:     file size test.db-journal
                    223:   } {0}
                    224: 
                    225:   do_test jrnlmode-2.3 {
                    226:     execsql {
                    227:       SELECT * FROM abc;
                    228:     }
                    229:   } {1 2 3}
                    230: 
                    231:   do_test jrnlmode-2.4 {
                    232:     file size test.db-journal
                    233:   } {0}
                    234: 
                    235:   do_test jrnlmode-2.5 {
                    236:     execsql {
                    237:       SELECT * FROM def;
                    238:     }
                    239:   } {4 5 6}
                    240: 
                    241: #----------------------------------------------------------------------
                    242: # Test caes jrnlmode-3.X verify that ticket #3127 has been fixed.
                    243: #
                    244:   db close
                    245:   forcedelete test2.db
                    246:   forcedelete test.db
                    247:   sqlite3 db test.db
                    248: 
                    249:   do_test jrnlmode-3.1 {
                    250:     execsql { 
                    251:       CREATE TABLE x(n INTEGER); 
                    252:       ATTACH 'test2.db' AS a; 
                    253:       create table a.x ( n integer ); 
                    254:       insert into a.x values(1); 
                    255:       insert into a.x values (2); 
                    256:       insert into a.x values (3); 
                    257:       insert into a.x values (4); 
                    258:     }
                    259:   } {}
                    260:   
                    261:   do_test jrnlmode-3.2 {
                    262:     execsql { PRAGMA journal_mode=off; }
                    263:     execsql { 
                    264:       BEGIN IMMEDIATE;
                    265:       INSERT OR IGNORE INTO main.x SELECT * FROM a.x;
                    266:       COMMIT;
                    267:     }
                    268:   } {}
                    269: }
                    270: 
                    271: ifcapable autovacuum&&pragma {
                    272:   db close
                    273:   forcedelete test.db
                    274:   sqlite3 db test.db
                    275:   do_test jrnlmode-4.1 {
                    276:     execsql {
                    277:       PRAGMA cache_size = 1;
                    278:       PRAGMA auto_vacuum = 1;
                    279:       CREATE TABLE abc(a, b, c);
                    280:     }
                    281:     execsql { PRAGMA page_count }
                    282:   } {3}
                    283: 
                    284:   do_test jrnlmode-4.2 {
                    285:     execsql { PRAGMA journal_mode = off }
                    286:   } {off}
                    287: 
                    288:   do_test jrnlmode-4.3 {
                    289:     execsql { INSERT INTO abc VALUES(1, 2, randomblob(2000)) }
                    290:   } {}
                    291: 
                    292:   # This will attempt to truncate the database file. Check that this
                    293:   # is not a problem when journal_mode=off.
                    294:   do_test jrnlmode-4.4 {
                    295:     execsql { DELETE FROM abc }
                    296:   } {}
                    297: 
                    298:   integrity_check jrnlmode-4.5
                    299: }
                    300: 
                    301: #------------------------------------------------------------------------
                    302: # The following test caes, jrnlmode-5.*, test the journal_size_limit
                    303: # pragma.
                    304: ifcapable pragma {
                    305:   db close
                    306:   forcedelete test.db test2.db test3.db
                    307:   sqlite3 db test.db
                    308: 
                    309:   do_test jrnlmode-5.1 {
                    310:     execsql {pragma page_size=1024}
                    311:     execsql {pragma journal_mode=persist}
                    312:   } {persist}
                    313: 
                    314:   do_test jrnlmode-5.2 {
                    315:     execsql { PRAGMA journal_size_limit }
                    316:   } {-1}
                    317:   do_test jrnlmode-5.3 {
                    318:     execsql { 
                    319:       ATTACH 'test2.db' AS aux;
                    320:       PRAGMA aux.journal_mode=persist;
                    321:       PRAGMA aux.journal_size_limit;
                    322:     }
                    323:   } {persist -1}
                    324:   do_test jrnlmode-5.4.1 {
                    325:     execsql { PRAGMA aux.journal_size_limit = 999999999999 }
                    326:   } {999999999999}
                    327:   do_test jrnlmode-5.4.2 {
                    328:     execsql { PRAGMA aux.journal_size_limit = 10240 }
                    329:   } {10240}
                    330:   do_test jrnlmode-5.5 {
                    331:     execsql { PRAGMA main.journal_size_limit = 20480 }
                    332:   } {20480}
                    333:   do_test jrnlmode-5.6 {
                    334:     execsql { PRAGMA journal_size_limit }
                    335:   } {20480}
                    336:   do_test jrnlmode-5.7 {
                    337:     execsql { PRAGMA aux.journal_size_limit }
                    338:   } {10240}
                    339: 
                    340:   do_test jrnlmode-5.8 {
                    341:     execsql {
                    342:       ATTACH 'test3.db' AS aux2;
                    343:       PRAGMA aux2.journal_mode=persist;
                    344:     }
                    345:   } {persist}
                    346: 
                    347:   do_test jrnlmode-5.9 {
                    348:     execsql {
                    349:       CREATE TABLE main.t1(a, b, c);
                    350:       CREATE TABLE aux.t2(a, b, c);
                    351:       CREATE TABLE aux2.t3(a, b, c);
                    352:     }
                    353:   } {}
                    354:   do_test jrnlmode-5.10 {
                    355:     list \
                    356:       [file exists test.db-journal]  \
                    357:       [file exists test2.db-journal] \
                    358:       [file exists test3.db-journal]
                    359:   } {1 1 1}
                    360:   do_test jrnlmode-5.11 {
                    361:     execsql {
                    362:       BEGIN;
                    363:       INSERT INTO t3 VALUES(randomblob(1000),randomblob(1000),randomblob(1000));
                    364:       INSERT INTO t3 
                    365:           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
                    366:       INSERT INTO t3 
                    367:           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
                    368:       INSERT INTO t3 
                    369:           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
                    370:       INSERT INTO t3 
                    371:           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
                    372:       INSERT INTO t3 
                    373:           SELECT randomblob(1000),randomblob(1000),randomblob(1000) FROM t3;
                    374:       INSERT INTO t2 SELECT * FROM t3;
                    375:       INSERT INTO t1 SELECT * FROM t2;
                    376:       COMMIT;
                    377:     }
                    378:     list \
                    379:       [file exists test.db-journal]  \
                    380:       [file exists test2.db-journal] \
                    381:       [file exists test3.db-journal] \
                    382:       [file size test.db-journal]    \
                    383:       [file size test2.db-journal]   \
                    384:       [file size test3.db-journal]
                    385:   } {1 1 1 0 0 0}
                    386: 
                    387:   do_test jrnlmode-5.12 {
                    388:     execsql {
                    389:       BEGIN;
                    390:       UPDATE t1 SET a = randomblob(1000);
                    391:     }
                    392:     expr {[file size test.db-journal]>30000}
                    393:   } {1}
                    394:   do_test jrnlmode-5.13 {
                    395:     execsql COMMIT
                    396:     file size test.db-journal
                    397:   } {20480}
                    398: 
                    399:   do_test jrnlmode-5.14 {
                    400:     execsql {
                    401:       BEGIN;
                    402:       UPDATE t2 SET a = randomblob(1000);
                    403:     }
                    404:     expr {[file size test2.db-journal]>30000}
                    405:   } {1}
                    406:   do_test jrnlmode-5.15 {
                    407:     execsql COMMIT
                    408:     file size test2.db-journal
                    409:   } {10240}
                    410: 
                    411:   do_test jrnlmode-5.16 {
                    412:     execsql {
                    413:       BEGIN;
                    414:       UPDATE t3 SET a = randomblob(1000);
                    415:     }
                    416:     set journalsize [file size test3.db-journal]
                    417:     expr {$journalsize>30000}
                    418:   } {1}
                    419:   do_test jrnlmode-5.17 {
                    420:     execsql COMMIT
                    421:     set sz [file size test3.db-journal]
                    422:     expr {$sz>=$journalsize}
                    423:   } {1}
                    424: 
                    425:   do_test jrnlmode-5.18 {
                    426:     execsql {
                    427:       PRAGMA journal_size_limit = -4;
                    428:       BEGIN;
                    429:       UPDATE t1 SET a = randomblob(1000);
                    430:     }
                    431:     set journalsize [file size test.db-journal]
                    432:     expr {$journalsize>30000}
                    433:   } {1}
                    434:   do_test jrnlmode-5.19 {
                    435:     execsql COMMIT
                    436:     set sz [file size test.db-journal]
                    437:     expr {$sz>=$journalsize}
                    438:   } {1}
                    439: 
                    440:   # Test a size-limit of 0.
                    441:   #
                    442:   do_test jrnlmode-5.20 {
                    443:     execsql {
                    444:       PRAGMA journal_size_limit = 0;
                    445:       BEGIN;
                    446:       UPDATE t1 SET a = randomblob(1000);
                    447:     }
                    448:   } {0}
                    449:   do_test jrnlmode-5.21 {
                    450:     expr {[file size test.db-journal] > 1024}
                    451:   } {1}
                    452:   do_test jrnlmode-5.22 {
                    453:     execsql COMMIT
                    454:     list [file exists test.db-journal] [file size test.db-journal]
                    455:   } {1 0}
                    456: }
                    457: 
                    458: ifcapable pragma {
                    459:   # These tests are not run as part of the "journaltest" permutation,
                    460:   # as the test_journal.c layer is incompatible with in-memory journaling.
                    461:   if {[permutation] ne "journaltest"} {
                    462: 
                    463:     do_test jrnlmode-6.1 {
                    464:       execsql {
                    465:         PRAGMA journal_mode = truncate;
                    466:         CREATE TABLE t4(a, b);
                    467:         BEGIN;
                    468:           INSERT INTO t4 VALUES(1, 2);
                    469:           PRAGMA journal_mode = memory;
                    470:       }
                    471:     } {truncate truncate}
                    472:     do_test jrnlmode-6.2 {
                    473:       file exists test.db-journal
                    474:     } {1}
                    475:     do_test jrnlmode-6.3 {
                    476:       execsql {
                    477:         COMMIT;
                    478:         SELECT * FROM t4;
                    479:       }
                    480:     } {1 2}
                    481:     do_test jrnlmode-6.4 {
                    482:       file exists test.db-journal
                    483:     } {1}
                    484:     do_test jrnlmode-6.5 {
                    485:       execsql {
                    486:         PRAGMA journal_mode = MEMORY;
                    487:         BEGIN;
                    488:           INSERT INTO t4 VALUES(3, 4);
                    489:       }
                    490:       file exists test.db-journal
                    491:     } {0}
                    492:     do_test jrnlmode-6.7 {
                    493:       execsql {
                    494:         COMMIT;
                    495:         SELECT * FROM t4;
                    496:       }
                    497:     } {1 2 3 4}
                    498:     do_test jrnlmode-6.8 {
                    499:       file exists test.db-journal
                    500:     } {0}
                    501:     do_test jrnlmode-6.9 {
                    502:       execsql {
                    503:         PRAGMA journal_mode = DELETE;
                    504:         BEGIN IMMEDIATE; INSERT INTO t4 VALUES(1,2); COMMIT;
                    505:       }
                    506:       file exists test.db-journal
                    507:     } {0}
                    508:   }
                    509: }
                    510: 
                    511: ifcapable pragma {
                    512:   catch { db close }
                    513:   do_test jrnlmode-7.1 {
                    514:     foreach f [glob -nocomplain test.db*] { forcedelete $f }
                    515:     sqlite3 db test.db
                    516:     execsql {
                    517:       PRAGMA journal_mode = memory;
                    518:       PRAGMA auto_vacuum = 0;
                    519:       PRAGMA page_size = 1024;
                    520:       PRAGMA user_version = 5;
                    521:       PRAGMA user_version;
                    522:     }
                    523:   } {memory 5}
                    524:   do_test jrnlmode-7.2 { file size test.db } {1024}
                    525: }
                    526: 
                    527: do_execsql_test jrnlmode-8.1  { PRAGMA locking_mode=EXCLUSIVE } {exclusive}
                    528: do_execsql_test jrnlmode-8.2  { CREATE TABLE t1(x) }            {}
                    529: do_execsql_test jrnlmode-8.3  { INSERT INTO t1 VALUES(123) }    {}
                    530: do_execsql_test jrnlmode-8.4  { SELECT * FROM t1 }              {123}
                    531: do_execsql_test jrnlmode-8.5  { PRAGMA journal_mode=PERSIST }   {persist}
                    532: do_execsql_test jrnlmode-8.6  { PRAGMA journal_mode=DELETE }    {delete}
                    533: do_execsql_test jrnlmode-8.7  { PRAGMA journal_mode=TRUNCATE }  {truncate}
                    534: do_execsql_test jrnlmode-8.8  { PRAGMA journal_mode=DELETE }    {delete}
                    535: do_execsql_test jrnlmode-8.9  { CREATE TABLE t2(y) }            {}
                    536: do_execsql_test jrnlmode-8.10 { INSERT INTO t2 VALUES(456) }    {}
                    537: do_execsql_test jrnlmode-8.11 { SELECT * FROM t1, t2 }          {123 456}
                    538: do_execsql_test jrnlmode-8.12 { PRAGMA locking_mode=NORMAL }    {normal}
                    539: do_execsql_test jrnlmode-8.13 { PRAGMA journal_mode=PERSIST }   {persist}
                    540: do_execsql_test jrnlmode-8.14 { PRAGMA journal_mode=TRUNCATE }  {truncate}
                    541: do_execsql_test jrnlmode-8.15 { PRAGMA journal_mode=PERSIST }   {persist}
                    542: do_execsql_test jrnlmode-8.16 { PRAGMA journal_mode=DELETE }    {delete}
                    543: do_execsql_test jrnlmode-8.17 { PRAGMA journal_mode=TRUNCATE }  {truncate}
                    544: do_execsql_test jrnlmode-8.18 { PRAGMA locking_mode=EXCLUSIVE } {exclusive}
                    545: do_execsql_test jrnlmode-8.19 { CREATE TABLE t3(z) }            {}
                    546: do_execsql_test jrnlmode-8.20 { BEGIN IMMEDIATE }               {}
                    547: do_execsql_test jrnlmode-8.21 { PRAGMA journal_mode=DELETE }    {delete}
                    548: do_execsql_test jrnlmode-8.22 { COMMIT }                        {}
                    549: do_execsql_test jrnlmode-8.23 { PRAGMA journal_mode=DELETE }    {delete}
                    550: do_execsql_test jrnlmode-8.24 { PRAGMA journal_mode=TRUNCATE }  {truncate}
                    551: do_execsql_test jrnlmode-8.25 { PRAGMA locking_mode=NORMAL }    {normal}
                    552: do_execsql_test jrnlmode-8.26 { CREATE TABLE t4(w) }            {}
                    553: do_execsql_test jrnlmode-8.27 { BEGIN IMMEDIATE }               {}
                    554: do_execsql_test jrnlmode-8.28 { PRAGMA journal_mode=DELETE }    {delete}
                    555: do_execsql_test jrnlmode-8.29 { COMMIT }                        {}
                    556: do_execsql_test jrnlmode-8.30 { PRAGMA journal_mode=DELETE }    {delete}
                    557: 
                    558: finish_test

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