]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Extra tests and fixes.
authordan <Dan Kennedy>
Wed, 14 Sep 2022 18:57:46 +0000 (18:57 +0000)
committerdan <Dan Kennedy>
Wed, 14 Sep 2022 18:57:46 +0000 (18:57 +0000)
FossilOrigin-Name: deed5336931b23bb507c064d08e9899b33f04e4f7eee03beb8d7147eb4caa030

ext/recover/recover1.test
ext/recover/recovercorrupt2.test [new file with mode: 0644]
ext/recover/recoverfault.test
ext/recover/sqlite3recover.c
ext/recover/test_recover.c
manifest
manifest.uuid

index 358015a591a22ceca90837a48c5870911ee7aacd..79258b7e8f040044f0129329aca1b69fd4fb9e34 100644 (file)
@@ -195,7 +195,19 @@ do_execsql_test 11.1 {
 
 do_recover_test 11 
 
-
+do_test 12.1 {
+  set R [sqlite3_recover_init db "" test.db2]
+  $R config lostandfound ""
+  $R config invalid xyz
+} {12}
+do_test 12.2 {
+  $R run
+  $R run
+} {21}
+
+do_test 12.3 {
+  $R finish
+} {}
 
 finish_test
 
diff --git a/ext/recover/recovercorrupt2.test b/ext/recover/recovercorrupt2.test
new file mode 100644 (file)
index 0000000..58dee54
--- /dev/null
@@ -0,0 +1,76 @@
+# 2022 August 28
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+if {![info exists testdir]} {
+  set testdir [file join [file dirname [info script]] .. .. test]
+} 
+source [file join [file dirname [info script]] recover_common.tcl]
+source $testdir/tester.tcl
+
+set testprefix recovercorrupt2
+
+do_execsql_test 1.0 {
+  PRAGMA page_size = 512;
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
+  INSERT INTO t1 VALUES(1, 2, 3);
+  INSERT INTO t1 VALUES(2, hex(randomblob(100)), randomblob(200));
+  CREATE INDEX i1 ON t1(b, c);
+  CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID;
+  INSERT INTO t2 VALUES(1, 2, 3);
+  INSERT INTO t2 VALUES(2, hex(randomblob(100)), randomblob(200));
+  ANALYZE;
+  PRAGMA writable_schema = 1;
+  UPDATE sqlite_schema SET sql = 'CREATE INDEX i1 ON o(world)' WHERE name='i1'; 
+}
+
+do_test 1.1 {
+  set R [sqlite3_recover_init db main test.db2]
+  $R run
+  $R finish
+} {}
+
+sqlite3 db2 test.db2
+do_execsql_test -db db2 1.2 {
+  SELECT sql FROM sqlite_schema
+} {
+  {CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c)}
+  {CREATE TABLE t2(a PRIMARY KEY, b, c) WITHOUT ROWID} 
+  {CREATE TABLE sqlite_stat1(tbl,idx,stat)} 
+  {CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample)}
+}
+db2 close
+
+do_execsql_test 1.3 {
+  PRAGMA writable_schema = 1;
+  UPDATE sqlite_schema SET sql = 'CREATE TABLE t2 syntax error!' WHERE name='t2';
+}
+
+do_test 1.4 {
+  set R [sqlite3_recover_init db main test.db2]
+  $R run
+  $R finish
+} {}
+
+sqlite3 db2 test.db2
+do_execsql_test -db db2 1.5 {
+  SELECT sql FROM sqlite_schema
+} {
+  {CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c)}
+  {CREATE TABLE sqlite_stat1(tbl,idx,stat)} 
+  {CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample)}
+}
+db2 close
+
+
+
+finish_test
+
index e6d8392a44b0f5f4ea2a423ca917e09cae391269..2ea87860b365ad942ae4cd49d17f0ed31d4ba229 100644 (file)
@@ -72,6 +72,7 @@ do_execsql_test 2.0 {
   PRAGMA writable_schema = 1;
   DELETE FROM sqlite_schema WHERE name='t2';
 }
+faultsim_save_and_close
 
 do_faultsim_test 2 -faults oom* -prep {
   faultsim_restore_and_reopen
index c67d9b3d49330f8ac856aa4dda7610369e1e7529..6c52d99855d21602ee8b73b00c60ed6e5b2185a5 100644 (file)
@@ -768,7 +768,7 @@ static int recoverOpenOutput(sqlite3_recover *p){
     if( rc==SQLITE_OK ){
       sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main");
       if( pBackup ){
-        while( sqlite3_backup_step(pBackup, 1000)==SQLITE_OK );
+        sqlite3_backup_step(pBackup, -1);
         p->errCode = sqlite3_backup_finish(pBackup);
       }else{
         recoverDbError(p, db);
@@ -1042,10 +1042,10 @@ static int recoverWriteSchema2(sqlite3_recover *p){
       i64 iRoot = sqlite3_column_int64(pSelect, 0);
       const char *zSql = (const char*)sqlite3_column_text(pSelect, 1);
       int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
-      if( rc!=SQLITE_OK && rc!=SQLITE_ERROR ){
-        recoverDbError(p, p->dbOut);
-      }else if( rc==SQLITE_OK ){
+      if( rc==SQLITE_OK ){
         recoverSqlCallback(p, zSql);
+      }else if( rc!=SQLITE_ERROR ){
+        recoverDbError(p, p->dbOut);
       }
     }
   }
@@ -1316,9 +1316,7 @@ static void recoverLostAndFoundPopulate(
     int iCell = sqlite3_column_int64(pStmt, 2);
     int iField = sqlite3_column_int64(pStmt, 3);
 
-    if( iPrevRoot>0 && (
-      iPrevRoot!=iRoot || iPrevPage!=iPage || iPrevCell!=iCell
-    )){
+    if( iPrevRoot>0 && (iPrevPage!=iPage || iPrevCell!=iCell) ){
       /* Insert the new row */
       sqlite3_bind_int64(pInsert, 1, iPrevRoot);  /* rootpgno */
       sqlite3_bind_int64(pInsert, 2, iPrevPage);  /* pgno */
@@ -1329,7 +1327,7 @@ static void recoverLostAndFoundPopulate(
       for(ii=0; ii<nVal; ii++){
         recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
       }
-      if( sqlite3_step(pInsert)==SQLITE_ROW && p->xSql ){
+      if( sqlite3_step(pInsert)==SQLITE_ROW ){
         recoverSqlCallback(p, sqlite3_column_text(pInsert, 0));
       }
       recoverReset(p, pInsert);
@@ -1586,7 +1584,7 @@ static int recoverWriteData(sqlite3_recover *p){
                   sqlite3_bind_int64(pInsert, pTab->iRowidBind, iRowid);
                 }
 
-                if( SQLITE_ROW==sqlite3_step(pInsert) && p->xSql ){
+                if( SQLITE_ROW==sqlite3_step(pInsert) ){
                   const char *z = (const char*)sqlite3_column_text(pInsert, 0);
                   recoverSqlCallback(p, z);
                 }
index 7ab440fa37e06b0d0270c847e83d284b183dcab9..d660a5345ec20e507d2422270733e9a74a6dc82d 100644 (file)
@@ -84,7 +84,7 @@ static int testRecoverCmd(
     int nArg;
     const char *zMsg;
   } aSub[] = {
-    { "config",    2, "REBASE-BLOB" }, /* 0 */
+    { "config",    2, "ARG"         }, /* 0 */
     { "run",      0, ""             }, /* 1 */
     { "errmsg",    0, ""            }, /* 2 */
     { "errcode",   0, ""            }, /* 3 */
@@ -115,6 +115,7 @@ static int testRecoverCmd(
         "lostandfound",    /* 1 */
         "freelistcorrupt", /* 2 */
         "rowids",          /* 3 */
+        "invalid",         /* 4 */
         0
       };
       int iOp = 0;
@@ -128,11 +129,13 @@ static int testRecoverCmd(
               789, (void*)Tcl_GetString(objv[3]) /* MAGIC NUMBER! */
           );
           break;
-        case 1:
+        case 1: {
+          const char *zStr = Tcl_GetString(objv[3]);
           res = sqlite3_recover_config(pTest->p, 
-              SQLITE_RECOVER_LOST_AND_FOUND, (void*)Tcl_GetString(objv[3])
+              SQLITE_RECOVER_LOST_AND_FOUND, (void*)(zStr[0] ? zStr : 0)
           );
           break;
+        }
         case 2: {
           int iVal = 0;
           if( Tcl_GetBooleanFromObj(interp, objv[3], &iVal) ) return TCL_ERROR;
@@ -149,6 +152,10 @@ static int testRecoverCmd(
           );
           break;
         }
+        case 4: {
+          res = sqlite3_recover_config(pTest->p, 12345, 0);
+          break;
+        }
       }
       Tcl_SetObjResult(interp, Tcl_NewIntObj(res));
       break;
@@ -210,6 +217,7 @@ static int test_sqlite3_recover_init(
   }
   if( getDbPointer(interp, objv[1], &db) ) return TCL_ERROR;
   zDb = Tcl_GetString(objv[2]);
+  if( zDb[0]=='\0' ) zDb = 0;
 
   pNew = ckalloc(sizeof(TestRecover));
   if( bSql==0 ){
index b17390fa0eb7dba68af3021648ce5597ad77f365..cc05de1c51b939e7b13f979888c21a69e08d92aa 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\srecovery\sof\sutf-16\sdatabases.
-D 2022-09-14T16:37:59.285
+C Extra\stests\sand\sfixes.
+D 2022-09-14T18:57:46.380
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -387,18 +387,19 @@ F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2
 F ext/rbu/sqlite3rbu.c 8737cabdfbee84bb25a7851ecef8b1312be332761238da9be6ddb10c62ad4291
 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812
 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a
-F ext/recover/recover1.test 167ad4b267f6db5c06963a72196527cb42369c7cd77de2b4273d9fdc8bd7a254
+F ext/recover/recover1.test 3f26db7692ed98c0de4fc9511f3d3a2f2c91a137b7e6666f3b85b593438b5d09
 F ext/recover/recover_common.tcl 6679af7dffc858e345053a91c9b0a897595b4a13007aceffafca75304ccb137c
 F ext/recover/recoverclobber.test 294dcc894124ab4ca3a7b35766630742a3d25810fceac22220beb64f70a33a60
 F ext/recover/recovercorrupt.test e3f3cbe0162ba681518aac9ea0ae8119f32ac93fb0900b5f09b6318966108e54
-F ext/recover/recoverfault.test f3587c218c448545a082b99d59294dff5ec0b7daa15b0556cf926f6c350f221e
+F ext/recover/recovercorrupt2.test 7a1e3fe43231e7571aff4a09f359dcc0c98ef8f74d507c17953d35f2ad9f4c1f
+F ext/recover/recoverfault.test 3a0a32b9fc216592b97775d69220695b0926980c0f7424b7a59144e47d7cb568
 F ext/recover/recoverfault2.test 321036336af23e778a87f148c4cc4407f88fbdab1fd72ddb661669be9020d36b
 F ext/recover/recoverold.test 46e9d99b595fac583d4c67f74d7d89c20a435c752ef6eeb3e918b599940c88e0
 F ext/recover/recoverrowid.test 1694a1a5526d825f71279f3d02ab02a1ee4c5265de18858bf54cb8ec54487ac8
 F ext/recover/recoversql.test f9872ff2114e13ffd8ee31e1de06919f62b9b48bc080191b5bd076d10becb60f
-F ext/recover/sqlite3recover.c 1afcac2bbfcf5ef67a3391f59678dc866348ac88745067e683052ede02c425fb
+F ext/recover/sqlite3recover.c 29cb0ef3ff22e4a813d741930be123b7a44d59ba4c93868e74c4b0ebbee90a62
 F ext/recover/sqlite3recover.h 81108efb8c4618d3d9c6da4df785212b0e4501aa0d25edfc463405fe839a6640
-F ext/recover/test_recover.c 6a6f86ea61d728c67382047d574c62df83e6a28db23c329e93a177093689cd20
+F ext/recover/test_recover.c 72a765616a3fa9dae2ed537d79b00f365d9f639d347858341b71bda7a3a45f56
 F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15
 F ext/repair/checkfreelist.c e21f06995ff4efdc1622dcceaea4dcba2caa83ca2f31a1607b98a8509168a996
 F ext/repair/checkindex.c 4383e4469c21e5b9ae321d0d63cec53e981af9d7a6564be6374f0eeb93dfc890
@@ -2011,8 +2012,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 9b6b4c7162439a889144edb561356afc66436db921a867c20871f0c556716502
-R 7d7577824671621531c65dae0de3846f
+P 5b05be0861f35804270fbd184ad4b89c23e98cc2fbd56b9e4fe6197daef5fe49
+R 7d672439d169025c8f5a2255e79dee5d
 U dan
-Z b3ef1682460d7df284b8cd64863e6715
+Z 7e26bca497bd6fe58832c34f4ec41a30
 # Remove this line to create a well-formed Fossil manifest.
index 05a5c951ed76756565b314eb1b016c0c3790bf31..9efa9051fdd0a7b22a780b7965760b8439b1d6bd 100644 (file)
@@ -1 +1 @@
-5b05be0861f35804270fbd184ad4b89c23e98cc2fbd56b9e4fe6197daef5fe49
\ No newline at end of file
+deed5336931b23bb507c064d08e9899b33f04e4f7eee03beb8d7147eb4caa030
\ No newline at end of file