Annotation of embedaddon/sqlite3/test/jrnlmode.test, revision 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>