]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the ".intck ?STEPS_PER_UNLOCK?" command to the shell tool.
authordan <Dan Kennedy>
Fri, 23 Feb 2024 18:21:51 +0000 (18:21 +0000)
committerdan <Dan Kennedy>
Fri, 23 Feb 2024 18:21:51 +0000 (18:21 +0000)
FossilOrigin-Name: cfd051836b72f7d4e38cc9614f6ae5c003de4ce377359fd391adf06fe1ddf6b9

ext/intck/intck2.test
manifest
manifest.uuid
src/shell.c.in

index 54c392b0f5bab314b2a5d4a7cf654b7b89e5d574..c1681185357a4bb0093e0367b0e4522c2e9a0223 100644 (file)
@@ -1,4 +1,4 @@
-# 2008 Feb 19
+# 2024 Feb 19
 #
 # The author disclaims copyright to this source code.  In place of
 # a legal notice, here is a blessing:
@@ -142,6 +142,35 @@ do_intck_test 3.5 {
   {surplus entry (NULL,NULL,NULL,4) in index x1all}
 }
 
-finish_test
+reset_db
+
+do_execsql_test 3.6 {
+  CREATE TABLE w1(a PRIMARY KEY, b, c);
+  INSERT INTO w1 VALUES(1.0, NULL, NULL);
+  INSERT INTO w1 VALUES(33.0, NULL, NULL);
+  INSERT INTO w1 VALUES(100.0, NULL, NULL);
+  CREATE INDEX w1bc ON w1(b, c);
+}
 
+do_intck_test 3.7 {
+}
+
+imposter_edit w1 {
+  CREATE TABLE imp(a, b, c);
+} {
+  DELETE FROM imp WHERE a=33;
+  INSERT INTO imp(a) VALUES(1234.5);
+  INSERT INTO imp(a) VALUES(-1234.5);
+}
+
+do_intck_test 3.8 {
+  {surplus entry (33.0,2) in index sqlite_autoindex_w1_1}
+  {entry (1234.5,4) missing from index sqlite_autoindex_w1_1} 
+  {entry (NULL,NULL,4) missing from index w1bc} 
+  {entry (-1234.5,5) missing from index sqlite_autoindex_w1_1} 
+  {entry (NULL,NULL,5) missing from index w1bc} 
+  {surplus entry (NULL,NULL,2) in index w1bc}
+}
+
+finish_test
 
index f702e591f9a80d1782bf43a205dc974e6e816e57..266c84bd6a2295a3783df141f20d70cce03baeaf 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sdetection\sof\ssurplus\sindex\sentries\swhen\sall\sindexed\sfields\sare\sNULL.
-D 2024-02-23T17:10:39.995
+C Add\sthe\s".intck\s?STEPS_PER_UNLOCK?"\scommand\sto\sthe\sshell\stool.
+D 2024-02-23T18:21:51.131
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -249,7 +249,7 @@ F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f4
 F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
 F ext/intck/intck1.test e73c4f87b54176291b9a01b52dbc9dd88f42f3ec8aea48c8e0bd7f87a1440a40
-F ext/intck/intck2.test 348a8c505bfe843eceaedd911f91ba4516b5e9c2d4aa83a300a6e84de6ff0955
+F ext/intck/intck2.test 97daaf43b8a3c870ba7c2fd421dc1887053f5b30188896fa64677ce8174c206f
 F ext/intck/intck_common.tcl 9e51458126576783f11051ac0fd25bea3f6b17f570a55884223737f3200b214b
 F ext/intck/intckcorrupt.test 3211ef68ac53e83951b6c8f6a8d2396506d123fe5898f97f848a25837744ec56
 F ext/intck/sqlite3intck.c c8515c1ed1bc725e156fc5053e8f9c8cff3c440f3bca47a8309e76d2411fc73d
@@ -747,7 +747,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c d77c6160bc8f249c2196fdd3e75f66a1dd70e37aa25c39aedc7b1f93c42b7c6d
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c 43fabfc01bf87addd15e39f112f1e2ade15b19594835ab8a9e5bd50839d4e1b1
-F src/shell.c.in e4a38496290d3979ea3d953fba0bc187d350d6e80f8e33c2e37b9a924850439b
+F src/shell.c.in 0c13f7cc3bb8c31190efbd96f5c1d8f2fafdbcad549424b7e7850cb5617b115a
 F src/sqlite.h.in 020d7b7307dda51420dc48b47e5334eaface77baba6bd9818375d392eb3ab5b5
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
@@ -2169,8 +2169,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 0f68b35a000ef9f4691c59797c66ed6c3435fc5c503e9d24f891afec6aceeada
-R 67e774420e8bc9ef111ef98dbd2b2abc
+P 5f310fb7be450c96f01c21e6fd1377d4a274784377d0bd811922ab63e612bd11
+R 86a36a81ccd4a5a3ded74d8234b0250a
 U dan
-Z f383f29167401158528bd4b4e88fca49
+Z 39f7083bcdb0c03c315a581938028ce8
 # Remove this line to create a well-formed Fossil manifest.
index 1b5128f2f2e083b02189f1a9aa422a75f4dc1f9c..ff9880a342f00de5afcf5970aed4d7fa877855a8 100644 (file)
@@ -1 +1 @@
-5f310fb7be450c96f01c21e6fd1377d4a274784377d0bd811922ab63e612bd11
\ No newline at end of file
+cfd051836b72f7d4e38cc9614f6ae5c003de4ce377359fd391adf06fe1ddf6b9
\ No newline at end of file
index da377982e1dfa651ff83eb637d0acb0847aa55c2..07e4b201ceaf188e53b0c8f9ff1d8b765bbca48c 100644 (file)
@@ -1222,6 +1222,9 @@ INCLUDE ../ext/misc/sqlar.c
 INCLUDE ../ext/expert/sqlite3expert.h
 INCLUDE ../ext/expert/sqlite3expert.c
 
+INCLUDE ../ext/intck/sqlite3intck.h
+INCLUDE ../ext/intck/sqlite3intck.c
+
 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
 #define SQLITE_SHELL_HAVE_RECOVER 1
 #else
@@ -4741,6 +4744,7 @@ static const char *(azHelp[]) = {
   ".indexes ?TABLE?         Show names of indexes",
   "                           If TABLE is specified, only show indexes for",
   "                           tables matching TABLE using the LIKE operator.",
+  ".intck ?STEPS_PER_UNLOCK?  Run an incremental integrity check on the db",
 #ifdef SQLITE_ENABLE_IOTRACE
   ",iotrace FILE            Enable I/O diagnostic logging to FILE",
 #endif
@@ -7650,6 +7654,40 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
 }
 #endif /* SQLITE_SHELL_HAVE_RECOVER */
 
+/*
+** Implementation of ".intck STEPS_PER_UNLOCK" command.
+*/
+static int intckDatabaseCmd(ShellState *pState, i64 nStepPerUnlock){
+  sqlite3_intck *p = 0;
+  int rc = SQLITE_OK;
+
+  rc = sqlite3_intck_open(pState->db, "main", &p);
+  if( rc==SQLITE_OK ){
+    i64 nStep = 0;
+    i64 nError = 0;
+    const char *zErr = 0;
+    while( SQLITE_OK==sqlite3_intck_step(p) ){
+      const char *zMsg = sqlite3_intck_message(p);
+      if( zMsg ){
+        oputf("%s\n", zMsg);
+        nError++;
+      }
+      nStep++;
+      if( nStepPerUnlock && (nStep % nStepPerUnlock)==0 ){
+        sqlite3_intck_unlock(p);
+      }
+    }
+    rc = sqlite3_intck_error(p, &zErr);
+    if( zErr ){
+      eputf("%s\n", zErr);
+    }
+    sqlite3_intck_close(p);
+
+    oputf("%lld steps, %lld errors\n", nStep, nError);
+  }
+
+  return rc;
+}
 
 /*
  * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
@@ -9140,6 +9178,21 @@ static int do_meta_command(char *zLine, ShellState *p){
   }else
 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
 
+  if( c=='i' && cli_strncmp(azArg[0], "intck", n)==0 ){
+    i64 iArg = 0;
+    if( nArg==2 ){
+      iArg = integerValue(azArg[1]);
+      if( iArg==0 ) iArg = -1;
+    }
+    if( (nArg!=1 && nArg!=2) || iArg<0 ){
+      eputf("Usage: .intck STEPS_PER_UNLOCK\n");
+      rc = 1;
+      goto meta_command_exit;
+    }
+    open_db(p, 0);
+    rc = intckDatabaseCmd(p, iArg);
+  }else
+
 #ifdef SQLITE_ENABLE_IOTRACE
   if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);