Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Additional test cases to cover branches in pager.c. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
eddfb2b4062f8a8b907f0c7bc08a05c1 |
User & Date: | dan 2010-07-02 11:27:43.000 |
Context
2010-07-02
| ||
13:49 | Run tkt-9d68c883.test along with the other pager.c coverage tests. Add a test case to pager1.test. (check-in: c6714b0dbd user: dan tags: trunk) | |
11:27 | Additional test cases to cover branches in pager.c. (check-in: eddfb2b406 user: dan tags: trunk) | |
01:18 | Add a NEVER to sqlite3PagerCommitPhaseTwo() because it is now no longer possible to invoke that function without holding a RESERVED lock. (check-in: 6ae7617298 user: drh tags: trunk) | |
Changes
Changes to src/os.c.
︙ | ︙ | |||
31 32 33 34 35 36 37 | ** sqlite3OsRead() ** sqlite3OsWrite() ** sqlite3OsSync() ** sqlite3OsLock() ** */ #if defined(SQLITE_TEST) && (SQLITE_OS_WIN==0) | > | > | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | ** sqlite3OsRead() ** sqlite3OsWrite() ** sqlite3OsSync() ** sqlite3OsLock() ** */ #if defined(SQLITE_TEST) && (SQLITE_OS_WIN==0) int sqlite3_memdebug_vfs_oom_test = 1; #define DO_OS_MALLOC_TEST(x) \ if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3IsMemJournal(x))) { \ void *pTstAlloc = sqlite3Malloc(10); \ if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \ sqlite3_free(pTstAlloc); \ } #else #define DO_OS_MALLOC_TEST(x) #endif |
︙ | ︙ |
Changes to src/test_malloc.c.
︙ | ︙ | |||
1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 | #ifdef SQLITE_ENABLE_MEMSYS3 const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); rc = sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetMemsys3()); #endif Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); return TCL_OK; } /* ** Register commands with the TCL interpreter. */ int Sqlitetest_malloc_Init(Tcl_Interp *interp){ static struct { char *zName; | > > > > > > > > > > > > > > > > > > > | 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 | #ifdef SQLITE_ENABLE_MEMSYS3 const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); rc = sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetMemsys3()); #endif Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); return TCL_OK; } static int test_vfs_oom_test( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[] ){ extern int sqlite3_memdebug_vfs_oom_test; if( objc>2 ){ Tcl_WrongNumArgs(interp, 1, objv, "?INTEGER?"); return TCL_ERROR; }else if( objc==2 ){ int iNew; if( Tcl_GetIntFromObj(interp, objv[1], &iNew) ) return TCL_ERROR; sqlite3_memdebug_vfs_oom_test = iNew; } Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_memdebug_vfs_oom_test)); return TCL_OK; } /* ** Register commands with the TCL interpreter. */ int Sqlitetest_malloc_Init(Tcl_Interp *interp){ static struct { char *zName; |
︙ | ︙ | |||
1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 | { "sqlite3_config_memstatus", test_config_memstatus ,0 }, { "sqlite3_config_lookaside", test_config_lookaside ,0 }, { "sqlite3_config_error", test_config_error ,0 }, { "sqlite3_db_config_lookaside",test_db_config_lookaside ,0 }, { "sqlite3_dump_memsys3", test_dump_memsys3 ,3 }, { "sqlite3_dump_memsys5", test_dump_memsys3 ,5 }, { "sqlite3_install_memsys3", test_install_memsys3 ,0 }, }; int i; for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ ClientData c = (ClientData)aObjCmd[i].clientData; Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, c, 0); } return TCL_OK; } #endif | > | 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 | { "sqlite3_config_memstatus", test_config_memstatus ,0 }, { "sqlite3_config_lookaside", test_config_lookaside ,0 }, { "sqlite3_config_error", test_config_error ,0 }, { "sqlite3_db_config_lookaside",test_db_config_lookaside ,0 }, { "sqlite3_dump_memsys3", test_dump_memsys3 ,3 }, { "sqlite3_dump_memsys5", test_dump_memsys3 ,5 }, { "sqlite3_install_memsys3", test_install_memsys3 ,0 }, { "sqlite3_memdebug_vfs_oom_test", test_vfs_oom_test ,0 }, }; int i; for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ ClientData c = (ClientData)aObjCmd[i].clientData; Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, c, 0); } return TCL_OK; } #endif |
Changes to test/pager1.test.
︙ | ︙ | |||
54 55 56 57 58 59 60 61 62 63 64 65 66 67 | # pager1-16.*: Varying sqlite3_vfs.mxPathname # # pager1-17.*: Tests related to "PRAGMA omit_readlock" # # pager1-18.*: Test that the pager layer responds correctly if the b-tree # requests an invalid page number (due to db corruption). # set a_string_counter 1 proc a_string {n} { global a_string_counter incr a_string_counter string range [string repeat "${a_string_counter}." $n] 1 $n } | > > > > > > > > > | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # pager1-16.*: Varying sqlite3_vfs.mxPathname # # pager1-17.*: Tests related to "PRAGMA omit_readlock" # # pager1-18.*: Test that the pager layer responds correctly if the b-tree # requests an invalid page number (due to db corruption). # proc recursive_select {id table {script {}}} { set cnt 0 db eval "SELECT rowid, * FROM $table WHERE rowid = ($id-1)" { recursive_select $rowid $table $script incr cnt } if {$cnt==0} { eval $script } } set a_string_counter 1 proc a_string {n} { global a_string_counter incr a_string_counter string range [string repeat "${a_string_counter}." $n] 1 $n } |
︙ | ︙ | |||
1219 1220 1221 1222 1223 1224 1225 | do_test pager1-9.2.3 { db one {SELECT md5sum(a, b) FROM ab} } [db2 one {SELECT md5sum(a, b) FROM ab}] do_test pager1-9.2.4 { execsql { SELECT count(*) FROM ab } } {128} db close db2 close | | > | > | > > > > > > | > > > | | > > > > > > > > > > | | | 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 | do_test pager1-9.2.3 { db one {SELECT md5sum(a, b) FROM ab} } [db2 one {SELECT md5sum(a, b) FROM ab}] do_test pager1-9.2.4 { execsql { SELECT count(*) FROM ab } } {128} db close db2 close do_test pager1-9.3.1 { testvfs tv -default 1 tv sectorsize 4096 faultsim_delete_and_reopen execsql { PRAGMA page_size = 1024 } for {set ii 0} {$ii < 4} {incr ii} { execsql "CREATE TABLE t${ii}(a, b)" } } {} do_test pager1-9.3.2 { sqlite3 db2 test.db2 execsql { PRAGMA page_size = 4096; PRAGMA synchronous = OFF; CREATE TABLE t1(a, b); CREATE TABLE t2(a, b); } db2 sqlite3_backup B db2 main db main B step 30 list [B step 10000] [B finish] } {SQLITE_DONE SQLITE_OK} do_test pager1-9.3.3 { db2 close db close tv delete file size test.db2 } [file size test.db] #------------------------------------------------------------------------- # Test that regardless of the value returned by xSectorSize(), the # minimum effective sector-size is 512 and the maximum 65536 bytes. # testvfs tv -default 1 foreach sectorsize { |
︙ | ︙ | |||
1854 1855 1856 1857 1858 1859 1860 | INSERT INTO t1 SELECT a_string(800) FROM t1; /* 8 */ INSERT INTO t1 SELECT a_string(800) FROM t1; /* 16 */ INSERT INTO t1 SELECT a_string(800) FROM t1; /* 32 */ COMMIT; } } {wal} do_test pager1-20.3.2 { | < < < < < | | 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 | INSERT INTO t1 SELECT a_string(800) FROM t1; /* 8 */ INSERT INTO t1 SELECT a_string(800) FROM t1; /* 16 */ INSERT INTO t1 SELECT a_string(800) FROM t1; /* 32 */ COMMIT; } } {wal} do_test pager1-20.3.2 { execsql { BEGIN; INSERT INTO t2 VALUES('xxxx'); } recursive_select 32 t1 execsql COMMIT } {} #------------------------------------------------------------------------- # Test that a WAL database may not be opened if: # # pager1-21.1.*: The VFS has an iVersion less than 2, or |
︙ | ︙ | |||
2062 2063 2064 2065 2066 2067 2068 | INSERT INTO x2 SELECT a_string(400), a_string(500), a_string(600) FROM x2; INSERT INTO x2 SELECT a_string(600), a_string(400), a_string(500) FROM x2; INSERT INTO x2 SELECT a_string(500), a_string(600), a_string(400) FROM x2; INSERT INTO x2 SELECT a_string(400), a_string(500), a_string(600) FROM x2; INSERT INTO x1 SELECT * FROM x2; } } {} | < < < < < < < < | | | | 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 | INSERT INTO x2 SELECT a_string(400), a_string(500), a_string(600) FROM x2; INSERT INTO x2 SELECT a_string(600), a_string(400), a_string(500) FROM x2; INSERT INTO x2 SELECT a_string(500), a_string(600), a_string(400) FROM x2; INSERT INTO x2 SELECT a_string(400), a_string(500), a_string(600) FROM x2; INSERT INTO x1 SELECT * FROM x2; } } {} do_test pager1-24.1.2 { execsql { BEGIN; DELETE FROM x1 WHERE rowid<32; } recursive_select 64 x2 } {} do_test pager1-24.1.3 { execsql { UPDATE x1 SET z = a_string(300) WHERE rowid>40; COMMIT; PRAGMA integrity_check; SELECT count(*) FROM x1; } } {ok 33} do_test pager1-24.1.4 { execsql { DELETE FROM x1; INSERT INTO x1 SELECT * FROM x2; BEGIN; DELETE FROM x1 WHERE rowid<32; UPDATE x1 SET z = a_string(299) WHERE rowid>40; } recursive_select 64 x2 {db eval COMMIT} execsql { PRAGMA integrity_check; SELECT count(*) FROM x1; } } {ok 33} do_test pager1-24.1.5 { execsql { DELETE FROM x1; INSERT INTO x1 SELECT * FROM x2; } recursive_select 64 x2 { db eval {CREATE TABLE x3(x, y, z)} } execsql { SELECT * FROM x3 } } {} #------------------------------------------------------------------------- # do_test pager1-25-1 { faultsim_delete_and_reopen |
︙ | ︙ | |||
2134 2135 2136 2137 2138 2139 2140 2141 2142 | SAVEPOINT abc; CREATE TABLE t1(a, b); ROLLBACK TO abc; COMMIT; } db close } {} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 | SAVEPOINT abc; CREATE TABLE t1(a, b); ROLLBACK TO abc; COMMIT; } db close } {} #------------------------------------------------------------------------- # Sector-size tests. # do_test pager1-26.1 { testvfs tv -default 1 tv sectorsize 4096 faultsim_delete_and_reopen db func a_string a_string execsql { PRAGMA page_size = 512; CREATE TABLE tbl(a PRIMARY KEY, b UNIQUE); BEGIN; INSERT INTO tbl VALUES(a_string(25), a_string(600)); INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl; INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl; INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl; INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl; INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl; INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl; INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl; COMMIT; } } {} do_execsql_test pager1-26.1 { UPDATE tbl SET b = a_string(550); } {} db close tv delete #------------------------------------------------------------------------- do_test pager1.27.1 { faultsim_delete_and_reopen sqlite3_pager_refcounts db execsql { BEGIN; CREATE TABLE t1(a, b); } sqlite3_pager_refcounts db execsql COMMIT } {} finish_test |
Changes to test/pagerfault.test.
︙ | ︙ | |||
540 541 542 543 544 545 546 547 548 549 550 551 552 553 | DELETE FROM t3; RELEASE trans; } } -test { faultsim_test_result {0 {}} faultsim_integrity_check } #------------------------------------------------------------------------- # Test fault injection when writing to a database file that resides on # a file-system with a sector-size larger than the database page-size. # do_test pagerfault-12-pre1 { testvfs ss_layer -default 1 | > > > | 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 | DELETE FROM t3; RELEASE trans; } } -test { faultsim_test_result {0 {}} faultsim_integrity_check } } #------------------------------------------------------------------------- # Test fault injection when writing to a database file that resides on # a file-system with a sector-size larger than the database page-size. # do_test pagerfault-12-pre1 { testvfs ss_layer -default 1 |
︙ | ︙ | |||
567 568 569 570 571 572 573 | INSERT INTO t1 SELECT a_string(333+rowid), a_string(444+rowid) FROM t1; INSERT INTO t1 SELECT a_string(333+rowid), a_string(444+rowid) FROM t1; INSERT INTO t1 SELECT a_string(44), a_string(55) FROM t1 LIMIT 13; COMMIT; } faultsim_save_and_close } {} | > | > > > > > > > > > > > > > > > > > > > > > > > > > | 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 | INSERT INTO t1 SELECT a_string(333+rowid), a_string(444+rowid) FROM t1; INSERT INTO t1 SELECT a_string(333+rowid), a_string(444+rowid) FROM t1; INSERT INTO t1 SELECT a_string(44), a_string(55) FROM t1 LIMIT 13; COMMIT; } faultsim_save_and_close } {} do_faultsim_test pagerfault-12a -prep { faultsim_restore_and_reopen execsql { PRAGMA cache_size = 10 } db func a_string a_string; } -body { execsql { UPDATE t1 SET x = a_string(length(x)), y = a_string(length(y)); } } -test { faultsim_test_result {0 {}} faultsim_integrity_check } do_test pagerfault-12-pre2 { faultsim_restore_and_reopen execsql { CREATE TABLE t2 AS SELECT * FROM t1 LIMIT 10; } faultsim_save_and_close } {} do_faultsim_test pagerfault-12b -prep { faultsim_restore_and_reopen db func a_string a_string; execsql { SELECT * FROM t1 } } -body { set sql(1) { UPDATE t2 SET x = a_string(280) } set sql(2) { UPDATE t1 SET x = a_string(280) WHERE rowid = 5 } db eval { SELECT rowid FROM t1 LIMIT 2 } { db eval $sql($rowid) } } -test { faultsim_test_result {0 {}} faultsim_integrity_check } catch { db close } ss_layer delete #------------------------------------------------------------------------- # Test fault injection when SQLite opens a database where the size of the # database file is zero bytes but the accompanying journal file is larger # than that. In this scenario SQLite should delete the journal file # without rolling it back, even if it is in all other respects a valid |
︙ | ︙ | |||
930 931 932 933 934 935 936 | } -body { db eval { SELECT * FROM t0 LIMIT 1 } { db eval { INSERT INTO t0 SELECT a+1, b FROM t0 } db eval { INSERT INTO t0 SELECT a+2, b FROM t0 } } } -test { faultsim_test_result {0 {}} | < < | 959 960 961 962 963 964 965 966 967 968 969 | } -body { db eval { SELECT * FROM t0 LIMIT 1 } { db eval { INSERT INTO t0 SELECT a+1, b FROM t0 } db eval { INSERT INTO t0 SELECT a+2, b FROM t0 } } } -test { faultsim_test_result {0 {}} } finish_test |
Changes to test/pagerfault2.test.
︙ | ︙ | |||
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl source $testdir/malloc_common.tcl set a_string_counter 1 proc a_string {n} { global a_string_counter incr a_string_counter string range [string repeat "${a_string_counter}." $n] 1 $n } db func a_string a_string | > > < < < < < > | > > | | > > | > > > > > > | > | > > > > > > > > > > > > > > > > > > | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl source $testdir/malloc_common.tcl sqlite3_memdebug_vfs_oom_test 0 set a_string_counter 1 proc a_string {n} { global a_string_counter incr a_string_counter string range [string repeat "${a_string_counter}." $n] 1 $n } db func a_string a_string do_test pagerfault2-1-pre1 { faultsim_delete_and_reopen db func a_string a_string execsql { PRAGMA journal_mode = DELETE; PRAGMA page_size = 1024; CREATE TABLE t1(a, b); INSERT INTO t1 VALUES(a_string(401), a_string(402)); } for {set ii 0} {$ii < 13} {incr ii} { execsql { INSERT INTO t1 SELECT a_string(401), a_string(402) FROM t1 } } faultsim_save_and_close file size test.db } [expr 1024 * 8268] do_faultsim_test pagerfault2-1 -faults oom-transient -prep { faultsim_restore_and_reopen sqlite3_db_config_lookaside db 0 256 4096 execsql { BEGIN; SELECT * FROM t1; INSERT INTO t1 VALUES(5, 6); SAVEPOINT abc; UPDATE t1 SET a = a||'x' WHERE rowid<3700; } } -body { execsql { UPDATE t1 SET a = a||'x' WHERE rowid>=3700 AND rowid<=4200 } execsql { ROLLBACK TO abc } } -test { faultsim_test_result {0 {}} } do_test pagerfault2-2-pre1 { faultsim_restore_and_reopen execsql { DELETE FROM t1 } faultsim_save_and_close } {} do_faultsim_test pagerfault2-2 -faults oom-transient -prep { faultsim_restore_and_reopen sqlite3_db_config_lookaside db 0 256 4096 db func a_string a_string execsql { PRAGMA cache_size = 20; BEGIN; INSERT INTO t1 VALUES(a_string(401), a_string(402)); SAVEPOINT abc; } } -body { execsql { INSERT INTO t1 VALUES (a_string(2000000), a_string(2500000)) } } -test { faultsim_test_result {0 {}} } sqlite3_memdebug_vfs_oom_test 1 finish_test |
Changes to test/permutations.test.
︙ | ︙ | |||
167 168 169 170 171 172 173 174 175 176 177 178 179 180 | test_suite "coverage-pager" -description { Coverage tests for file pager.c. } -files { pager1.test pager2.test pagerfault.test walfault.test walbak.test journal2.test } lappend ::testsuitelist xxx | > | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | test_suite "coverage-pager" -description { Coverage tests for file pager.c. } -files { pager1.test pager2.test pagerfault.test pagerfault2.test walfault.test walbak.test journal2.test } lappend ::testsuitelist xxx |
︙ | ︙ |