]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the CLI ".dump" command so that it does not make duplicate
authordrh <>
Thu, 30 Oct 2025 11:39:49 +0000 (11:39 +0000)
committerdrh <>
Thu, 30 Oct 2025 11:39:49 +0000 (11:39 +0000)
sqlite_sequence table entries as described in
[forum:/forumpost/b1674b56ad|forum thread b1674b56ad].

FossilOrigin-Name: c833f26a6780f919551e50c67d308e96293cec8481899354411d805617481f24

manifest
manifest.uuid
src/shell.c.in
test/shell1.test

index 1804028a0358af69f3ac2bce12ddcf961b17bcd7..da6deb9e99d93160c165ecd4224813ea17910621 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Prevent\sa\sharmless\ssigned\sinteger\soverflow\sin\sthe\sCLI\sif\sthe\sargument\nto\sthe\s--skip\soption\sof\sthe\s".inport"\scommand\sis\s-9223372036854775808.
-D 2025-10-30T10:36:10.874
+C Fix\sthe\sCLI\s".dump"\scommand\sso\sthat\sit\sdoes\snot\smake\sduplicate\nsqlite_sequence\stable\sentries\sas\sdescribed\sin\n[forum:/forumpost/b1674b56ad|forum\sthread\sb1674b56ad].
+D 2025-10-30T11:39:49.298
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -736,7 +736,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c f8d1d011aba0964ff1bdccd049d4d2c2fec217efd90d202a4bb775e926b2c25d
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c b95181711d59c36d9789e67f76c4cfec64b99f9629a50be5e6566e117b87d957
-F src/shell.c.in cdb6d741c515fdcc7957a2f10e51d5b49f52b628f0f88e005cc206588e614832
+F src/shell.c.in 4dd1b2acb7a55fd8d8eaed9f63d12534a21e46cb617fd30ad5e47b84b07168d4
 F src/sqlite.h.in f7944026ee89ea348f89aec56372d6d25b6cafc1d89df741278d6917e86326a3
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 7f236ca1b175ffe03316d974ef57df79b3938466c28d2f95caef5e08c57f3a52
@@ -1600,7 +1600,7 @@ F test/sharedA.test 64bdd21216dda2c6a3bd3475348ccdc108160f34682c97f2f51c19fc0e21
 F test/sharedB.test 1a84863d7a2204e0d42f2e1606577c5e92e4473fa37ea0f5bdf829e4bf8ee707
 F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939
 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304
-F test/shell1.test 396c04132628fe1c627fd4807a93a116f712cfb1cfe9ca5d553b1c89361a899f
+F test/shell1.test ab6c74a807903df21e9ee62003bf9954513d06b8b52186c25782dbe9f1204518
 F test/shell2.test ab23f01ea2347e4b72bb2399af7ee82aa00f9c059141749f7c4064abca5ad728
 F test/shell3.test 603b448e917537cf77be0f265c05c6f63bc677c63a533c8e96aae923b56f4a0e
 F test/shell4.test 03593fa7908a55f255916ffeda707cdf55680c777736e3da62b1d78cde0d684d
@@ -2171,8 +2171,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P a7be7d155aa6f02075f939ab6d26cfdfe2d0832b59da39c8bf4a74fc4845bd05
-R f468ecedeb30cd67397eb0c0bd9c5d77
+P 247277d9373cb2614a1bc4c1e08b904315e5e8c0c2a7fbe9c2ac651481601642
+R ad4fa6006b8fe57ba4747be404a8634d
 U drh
-Z 8dce804823bfd278976a90c9488c60e6
+Z 65e039244d2f80115d8841c51c1920c6
 # Remove this line to create a well-formed Fossil manifest.
index 1c1d73279b85db9cecc2bd5bb1753dc0c23d9a61..82822cd7463e2975c2984cb675d5bc6f472643eb 100644 (file)
@@ -1 +1 @@
-247277d9373cb2614a1bc4c1e08b904315e5e8c0c2a7fbe9c2ac651481601642
+c833f26a6780f919551e50c67d308e96293cec8481899354411d805617481f24
index c7b1c199b66db5a123aef635ada335b1d77dde14..c74ec05e12f074429cea29e33a1abba5e5d52be1 100644 (file)
@@ -4963,6 +4963,10 @@ static void toggleSelectOrder(sqlite3 *db){
   sqlite3_exec(db, zStmt, 0, 0, 0);
 }
 
+/* Forward reference */
+static int db_int(sqlite3 *db, const char *zSql, ...);
+
+
 /*
 ** This is a different callback routine used for dumping the database.
 ** Each row received by this callback consists of a table name,
@@ -4989,7 +4993,16 @@ static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
   noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
 
   if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
-    /* no-op */
+    /* The sqlite_sequence table is repopulated last.  Delete content
+    ** in the sqlite_sequence table added by prior repopulations prior to
+    ** repopulating sqlite_sequence itself.  But only do this if the
+    ** table is non-empty, because if it is empty the table might not
+    ** have been recreated by prior repopulations. See forum posts:
+    ** 2024-10-13T17:10:01z and 2025-10-29T19:38:43z
+    */
+    if( db_int(p->db, "SELECT count(*) FROM sqlite_sequence")>0 ){
+      sqlite3_fputs("DELETE FROM sqlite_sequence;\n", p->out); 
+    }
   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
     if( !dataOnly ) sqlite3_fputs("ANALYZE sqlite_schema;\n", p->out);
   }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
index 8c24655820967aae0a4629fd90b00f47a88829b3..4f56895130734748b44a7cd24c811288d14540f5 100644 (file)
@@ -945,6 +945,45 @@ do_test shell1-4.1.6 {
 
 }
 
+# DELETE content of sqlite_sequence prior to repopulating,
+# but only if the sqlite_sequence table is non-empty.
+# Forum: 2024-10-13T17:10:01z and 2025-10-29T19:38:43z
+#
+do_test shell1-4.1.7 {
+  db close
+  forcedelete test2.db
+  sqlite3 db test2.db
+  db eval {
+    CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
+    INSERT INTO t1 VALUES(1,2),(20,21),(15,16);
+  }
+  catchcmd test2.db {.dump}
+} {0 {PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
+INSERT INTO t1 VALUES(1,2);
+INSERT INTO t1 VALUES(15,16);
+INSERT INTO t1 VALUES(20,21);
+DELETE FROM sqlite_sequence;
+INSERT INTO sqlite_sequence VALUES('t1',20);
+COMMIT;}}
+do_test shell1-4.1.8 {
+  db close
+  forcedelete test2.db
+  sqlite3 db test2.db
+  db eval {
+    CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
+    INSERT INTO t1 VALUES(1,2),(20,21),(15,16);
+    CREATE TABLE t2(x,y);
+    INSERT INTO t2 VALUES(99,88);
+    DROP TABLE t1;
+  }
+  catchcmd test2.db {.dump}
+} {0 {PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE t2(x,y);
+INSERT INTO t2 VALUES(99,88);
+COMMIT;}}
 
 # Test the output of ".mode insert"
 #