]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Additional test cases to cover branches in pager.c.
authordan <dan@noemail.net>
Fri, 2 Jul 2010 11:27:43 +0000 (11:27 +0000)
committerdan <dan@noemail.net>
Fri, 2 Jul 2010 11:27:43 +0000 (11:27 +0000)
FossilOrigin-Name: eddfb2b4062f8a8b907f0c7bc08a05c16692e900

manifest
manifest.uuid
src/os.c
src/test_malloc.c
test/pager1.test
test/pagerfault.test
test/pagerfault2.test
test/permutations.test

index 231e442c7ec65562c9fb574b5d60a62ca2ce2037..2b480879ddf2e084c31426cf75131b588ed4f410 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,5 @@
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-C Add\sa\sNEVER\sto\ssqlite3PagerCommitPhaseTwo()\sbecause\sit\sis\snow\sno\slonger\npossible\sto\sinvoke\sthat\sfunction\swithout\sholding\sa\sRESERVED\slock.
-D 2010-07-02T01:18:12
+C Additional\stest\scases\sto\scover\sbranches\sin\spager.c.
+D 2010-07-02T11:27:43
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -153,7 +150,7 @@ F src/mutex_os2.c 6a62583e374ba3ac1a3fcc0da2bfdac7d3942689
 F src/mutex_unix.c cf84466b4fdd2baa0d5a10bb19f08b2abc1ce42e
 F src/mutex_w32.c 1fe0e735897be20e09dd6f53c3fb516c6b48c0eb
 F src/notify.c cbfa66a836da3a51567209636e6a94059c137930
-F src/os.c 9c4a2f82a50306a33907678ec0187b6ad1486bfe
+F src/os.c 1b3a1edf20587639d9d88bfebe018f7a6e7ba0ec
 F src/os.h d7775504a51e6e0d40315aa427b3e229ff9ff9ca
 F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f
 F src/os_os2.c 665876d5eec7585226b0a1cf5e18098de2b2da19
@@ -203,7 +200,7 @@ F src/test_intarray.c d879bbf8e4ce085ab966d1f3c896a7c8b4f5fc99
 F src/test_intarray.h 489edb9068bb926583445cb02589344961054207
 F src/test_journal.c 044c1a53ec4dd6f0dde66727b154cd099f5f34d1
 F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e
-F src/test_malloc.c 2842c922b8e8d992aba722214952204ca025b411
+F src/test_malloc.c 4ab85f2b8ae3a237f4e6557b0a641181a19ffab1
 F src/test_mutex.c ce06b59aca168cd8c520b77159a24352a7469bd3
 F src/test_onefile.c fb979cecd57217fd49023ed5468d8c93429c4fbe
 F src/test_osinst.c f1e4194860aa7e2f2ed7375c6b1f23a4290dd98c
@@ -538,15 +535,15 @@ F test/notify3.test b923ff67728f363378698fb27b5f41a5a1b4d9e0
 F test/notnull.test cc7c78340328e6112a13c3e311a9ab3127114347
 F test/null.test a8b09b8ed87852742343b33441a9240022108993
 F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec
-F test/pager1.test 67de7de48695203bab435eca9e650fb5ec634da6
+F test/pager1.test 4984a90b28abb4dca597b92912558c36ea87350b
 F test/pager2.test f5c757c271ce642d36a393ecbfb3aef1c240dcef
-F test/pagerfault.test 6ece6ceb6384e90ec526a65c4f4e8cd9b6dc7d61
-F test/pagerfault2.test 1287f123bd5d20452113739ed7755fd254e502f1
+F test/pagerfault.test 743952c5509244a71d66d67bf960d920793bb847
+F test/pagerfault2.test be9088b0daff0e63983138e0bde2311eb734f900
 F test/pageropt.test 8146bf448cf09e87bb1867c2217b921fb5857806
 F test/pagesize.test 76aa9f23ecb0741a4ed9d2e16c5fa82671f28efb
 F test/pcache.test 4118a183908ecaed343a06fcef3ba82e87e0129d
 F test/pcache2.test 0d85f2ab6963aee28c671d4c71bec038c00a1d16
-F test/permutations.test 81d93c4650073c332f9e4406e4b5d1e7f52c097f
+F test/permutations.test e0f281e97b5d0064a04b9ceb48be27c57a0a35b5
 F test/pragma.test a869b428b861f9dbbdb25461a104e8e830fc3026
 F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
 F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
@@ -833,14 +830,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 95c69dfbddaf4367cd699dfe8fcf8e06030c1f53
-R 930bbf4b4a963aec35ed6b03fae686d4
-U drh
-Z 540bd39ddc7176815db98ecf80c42f23
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.6 (GNU/Linux)
-
-iD8DBQFMLT5joxKgR168RlERAlVIAJ42G6HI9TMCYeZcCnG5KLimD/q0MwCfUMqn
-uE0Yc+lcE/Y/v45SPR8cU9U=
-=OxES
------END PGP SIGNATURE-----
+P 6ae7617298c70f8e03dd0ed73b8153d4871fb023
+R 83a0c7d4f2d6c19f7630fe52766d7d11
+U dan
+Z 7699ffebb24a4e13d73e3bdae384a3cd
index 2d5e538794d4aeefb24cc8f195d51474678267be..85e0009fae8dbad76614b8ba18d46b67557641be 100644 (file)
@@ -1 +1 @@
-6ae7617298c70f8e03dd0ed73b8153d4871fb023
\ No newline at end of file
+eddfb2b4062f8a8b907f0c7bc08a05c16692e900
\ No newline at end of file
index 8fa10a9c02908a14103adfdd3574b55eff296970..dea5f3803daee9052f87bcc03a97685363f4cdb4 100644 (file)
--- a/src/os.c
+++ b/src/os.c
@@ -35,7 +35,9 @@
 **
 */
 #if defined(SQLITE_TEST) && (SQLITE_OS_WIN==0)
-  #define DO_OS_MALLOC_TEST(x) if (!x || !sqlite3IsMemJournal(x)) {     \
+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);                                         \
index d5f0a6df5afc16d9b65732e1f78e9496b47a7e2f..1267f6e78f195106b96706de18def8a0daf69334 100644 (file)
@@ -1359,6 +1359,25 @@ static int test_install_memsys3(
   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.
 */
@@ -1396,6 +1415,7 @@ int Sqlitetest_malloc_Init(Tcl_Interp *interp){
      { "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++){
index f64001fe5d49b4dfc29734cfaa988dc0a3a03852..ec950eac5095ba293ce4c216f4c18c896f20e961 100644 (file)
@@ -59,6 +59,15 @@ do_not_use_codec
 #              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
@@ -1223,14 +1232,35 @@ do_test pager1-9.2.4 { execsql { SELECT count(*) FROM ab } } {128}
 db close
 db2 close
 
-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 }
-}
+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
@@ -1858,16 +1888,11 @@ do_test pager1-20.3.1 {
   }
 } {wal}
 do_test pager1-20.3.2 {
-  proc recursive_select {id} {
-    db eval {SELECT rowid, x FROM t1 WHERE rowid = ($id-1)} {
-      recursive_select $rowid
-    }
-  }
   execsql {
     BEGIN;
     INSERT INTO t2 VALUES('xxxx');
   }
-  recursive_select 32
+  recursive_select 32 t1
   execsql COMMIT
 } {}
 
@@ -2066,20 +2091,12 @@ do_test pager1-24.1.1 {
     INSERT INTO x1 SELECT * FROM x2;
   }
 } {}
-proc recursive_select {id {script {}}} {
-  set cnt 0
-  db eval {SELECT rowid, x,y,z FROM x2 WHERE rowid = ($id-1)} {
-    recursive_select $rowid $script
-    incr cnt
-  }
-  if {$cnt==0} { eval $script }
-}
 do_test pager1-24.1.2 {
   execsql {
     BEGIN;
       DELETE FROM x1 WHERE rowid<32;
   }
-  recursive_select 64
+  recursive_select 64 x2
 } {}
 do_test pager1-24.1.3 {
   execsql { 
@@ -2098,7 +2115,7 @@ do_test pager1-24.1.4 {
       DELETE FROM x1 WHERE rowid<32;
       UPDATE x1 SET z = a_string(299) WHERE rowid>40;
   }
-  recursive_select 64 {db eval COMMIT}
+  recursive_select 64 x2 {db eval COMMIT}
   execsql {
     PRAGMA integrity_check;
     SELECT count(*) FROM x1;
@@ -2110,7 +2127,7 @@ do_test pager1-24.1.5 {
     DELETE FROM x1;
     INSERT INTO x1 SELECT * FROM x2;
   }
-  recursive_select 64 { db eval {CREATE TABLE x3(x, y, z)} }
+  recursive_select 64 x2 { db eval {CREATE TABLE x3(x, y, z)} }
   execsql { SELECT * FROM x3 }
 } {}
 
@@ -2139,4 +2156,45 @@ do_test pager1-25-2 {
   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
index 542bb30ce8bd0e8bf39cfe09940b1890db6e05aa..75b21a796e1c9f7b1423397a25b17b395e534f28 100644 (file)
@@ -545,6 +545,9 @@ do_faultsim_test pagerfault-11 -prep {
   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.
@@ -571,7 +574,8 @@ do_test pagerfault-12-pre1 {
   }
   faultsim_save_and_close
 } {}
-do_faultsim_test pagerfault-12 -prep {
+
+do_faultsim_test pagerfault-12a -prep {
   faultsim_restore_and_reopen
   execsql { PRAGMA cache_size = 10 }
   db func a_string a_string;
@@ -584,6 +588,31 @@ do_faultsim_test pagerfault-12 -prep {
   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
@@ -936,7 +965,5 @@ do_faultsim_test pagerfault-21 -prep {
   faultsim_test_result {0 {}}
 }
 
-}
-
 
 finish_test
index 634e539e62f64226545b06b24864b3fc6dc0a1ed..edc24bda7e1515359867ed6ef12f1939642b06df 100644 (file)
@@ -22,6 +22,8 @@ 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
@@ -30,37 +32,62 @@ proc a_string {n} {
 }
 db func a_string a_string
 
-
-# The following tests, pagerfault2-1.*, attempt to provoke OOM errors when
-# manipulating the internal "bitvec" structures. Since bitvec structures
-# only allocate memory very rarely, this requires fairly large databases.
-#
 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 < 14} {incr ii} {
+  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
-} {}
-do_faultsim_test pagerfault2-1.1 -faults oom* -prep {
+  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';
+        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 {}}
-  faultsim_integrity_check
 }
 
+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
+
index 3d112610782044cde3690a23e55e1df7bee5f161..453764e51882d4ddeced3bb5380e5550233fa9f7 100644 (file)
@@ -171,6 +171,7 @@ test_suite "coverage-pager" -description {
   pager1.test
   pager2.test
   pagerfault.test
+  pagerfault2.test
   walfault.test
   walbak.test
   journal2.test