]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add tests for edge cases in the new code on this branch.
authordan <Dan Kennedy>
Wed, 14 Jan 2026 15:27:26 +0000 (15:27 +0000)
committerdan <Dan Kennedy>
Wed, 14 Jan 2026 15:27:26 +0000 (15:27 +0000)
FossilOrigin-Name: cd115f0f4437bf254058e40d70ba4e82e87227d2752695aa18f8431c3abc5c0b

ext/session/sessionchange2.test
ext/session/sessionfault3.test
ext/session/test_session.c
manifest
manifest.uuid

index 6a508ef221132c6d5a7103de38f8b05d01ecfb08..64208d223ca1efba22e8d97a106dcb585d129982 100644 (file)
@@ -20,16 +20,20 @@ ifcapable !session {finish_test; return}
 
 set testprefix sessionchange2
 
-do_test 1.0 {
+do_test 1.1.1 {
   sqlite3changegroup grp
   list [catch { grp change_begin INSERT "nosuchtable" 0 } msg] $msg
 } {1 {SQLITE_ERROR - no such table: nosuchtable}}
 
-do_test 1.1 {
+do_test 1.1.2 {
   grp schema db main
   list [catch { grp change_begin INSERT "nosuchtable" 0 } msg] $msg
 } {1 {SQLITE_ERROR - no such table: nosuchtable}}
 
+do_test 1.1.3 {
+  list [catch { grp change_begin_ne INSERT "nosuchtable" 0 } msg] $msg
+} {1 SQLITE_ERROR}
+
 do_execsql_test 1.2.1 {
   CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
 }
@@ -328,5 +332,69 @@ do_changegroup_script_test 3.4 {
   {INSERT t1 0 X. {} {i 1000 b bcda}}
 }
 
+do_changegroup_script_test 3.5 {
+  grp change_begin DELETE t1 0
+  grp change_int64  old 0 1000
+  grp change_text-1 old 1 "hello world"
+  grp change_finish false
+} {
+  {DELETE t1 0 X. {i 1000 t {hello world}} {}}
+} {
+  {DELETE t1 0 X. {i 1000 {} {}} {}}
+}
+
+#-------------------------------------------------------------------------
+
+# Calling sqlite3changegroup_change_finish() if a change has not been
+# started is a no-op.
+#
+do_test 4.0 {
+  sqlite3changegroup grp
+  grp change_finish false
+} {}
+
+# But calling any other sqlite3changegroup_change_xxx() function if a
+# change has not been started is a misuse.
+#
+foreach {tn cmd} {
+  1 { grp change_blob   old 0 abcd } 
+  2 { grp change_text   new 1 helloworld } 
+  3 { grp change_int64  old 2 12345678 } 
+  4 { grp change_double new 3 12.345 } 
+  5 { grp change_null   old 4 }
+} {
+  do_test 4.1.$tn {
+    list [catch $::cmd msg] $msg
+  } {1 SQLITE_MISUSE}
+}
+grp delete
+
+do_execsql_test 4.2.1 {
+  CREATE TABLE t3(a, b PRIMARY KEY);
+}
+do_test 4.2 {
+  sqlite3changegroup grp
+  grp schema db main
+  grp change_begin INSERT t3 0 
+
+  list [catch { grp change_begin INSERT t3 0 } msg] $msg
+} {1 SQLITE_MISUSE}
+grp delete
+
+do_test 4.3 {
+  sqlite3changegroup grp
+  grp schema db main
+  grp change_begin UPDATE t3 0
+} {}
+foreach {tn cmd} {
+  1 { grp change_blob   old -1 abcd } 
+  2 { grp change_text   new 2 helloworld } 
+} {
+  do_test 4.4.$tn {
+    list [catch $::cmd msg] $msg
+  } {1 SQLITE_RANGE}
+}
+grp delete
+
 finish_test
 
index 5af9c9ed7009e843699d2636e97544c71c8e9b90..f2bcb894172864762d3421ed9b031c2cf282d126 100644 (file)
@@ -43,7 +43,7 @@ set C2 [changeset_from_sql {
   INSERT INTO t1 VALUES(0, 0, 0, 0);
 }]
 
-do_faultsim_test 1 -faults oom* -prep {
+do_faultsim_test 1.2 -faults oom* -prep {
   sqlite3changegroup G
 } -body {
   G schema db main
@@ -56,6 +56,20 @@ do_faultsim_test 1 -faults oom* -prep {
   faultsim_test_result {0 {}} {1 SQLITE_NOMEM}
 }
 
+do_faultsim_test 1.3 -faults oom* -prep {
+  sqlite3changegroup G
+} -body {
+  G schema db main
+  G change_begin INSERT t1 0
+  G change_int64 new 0 12345
+  G change_int64 new 1 67890
+  G output
+  set {} {}
+} -test {
+  catch { G delete }
+  faultsim_test_result {0 {}} {1 SQLITE_NOMEM}
+}
+
 #-------------------------------------------------------------------------
 reset_db
 do_execsql_test 2.0 {
index 03929284db6d4c2ccc0d5f9c3415131c37afbd12..a6d94ca5f3ae17cd813e968d0a300380711bc49e 100644 (file)
@@ -1557,21 +1557,23 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
     int nArg;
     const char *zMsg;
   } aSub[] = {
-    { "schema",        2, "DB DBNAME"            },    /* 0 */
-    { "add",           1, "CHANGESET"            },    /* 1 */
-    { "output",        0, ""                     },    /* 2 */
-    { "delete",        0, ""                     },    /* 3 */
-    { "add_change",    1, "ITERATOR"             },    /* 4 */
-
-    { "change_begin",  3, "TYPE TABLE INDIRECT"  },    /* 5 */
-    { "change_int64",  3, "[new|old] ICOL VALUE" },    /* 6 */
-    { "change_null",   2, "[new|old] ICOL"       },    /* 7 */
-    { "change_double", 3, "[new|old] ICOL VALUE" },    /* 8 */
-    { "change_text",   3, "[new|old] ICOL VALUE" },    /* 9 */
-    { "change_blob",   3, "[new|old] ICOL VALUE" },    /* 10 */
-    { "change_finish", 1, "BDISCARD"             },    /* 11 */
-
-    { "config",        2, "OPTION INTVAL"        },    /* 12 */
+    { "schema",          2, "DB DBNAME"            },    /* 0 */
+    { "add",             1, "CHANGESET"            },    /* 1 */
+    { "output",          0, ""                     },    /* 2 */
+    { "delete",          0, ""                     },    /* 3 */
+    { "add_change",      1, "ITERATOR"             },    /* 4 */
+
+    { "change_begin",    3, "TYPE TABLE INDIRECT"  },    /* 5 */
+    { "change_int64",    3, "[new|old] ICOL VALUE" },    /* 6 */
+    { "change_null",     2, "[new|old] ICOL"       },    /* 7 */
+    { "change_double",   3, "[new|old] ICOL VALUE" },    /* 8 */
+    { "change_text",     3, "[new|old] ICOL VALUE" },    /* 9 */
+    { "change_blob",     3, "[new|old] ICOL VALUE" },    /* 10 */
+    { "change_finish",   1, "BDISCARD"             },    /* 11 */
+
+    { "config",          2, "OPTION INTVAL"        },    /* 12 */
+    { "change_text-1",   3, "[new|old] ICOL VALUE" },    /* 13 */
+    { "change_begin_ne", 3, "TYPE TABLE INDIRECT"  },    /* 14 */
     { 0, 0, 0 }
   };
   int rc = TCL_OK;
@@ -1641,7 +1643,8 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
       break;
     };
 
-    case 5: {      /* change_begin */
+    case 14:        /* change_beginne */
+    case 5: {       /* change_begin */
       struct ChangeType {
         const char *zType;
         int eType;
@@ -1656,6 +1659,7 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
       int bIndirect;
       int iIdx = 0;
       char *zErr = 0;
+      char **pz = ((iSub==5) ? &zErr : 0);
 
       if( TCL_OK!=Tcl_GetIntFromObj(0, objv[2], &eType) ){
         rc = Tcl_GetIndexFromObjStruct(
@@ -1669,7 +1673,7 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
         return TCL_ERROR;
       }
 
-      rc = sqlite3changegroup_change_begin(p->pGrp, eType,zTab,bIndirect,&zErr);
+      rc = sqlite3changegroup_change_begin(p->pGrp, eType, zTab, bIndirect, pz);
       assert( zErr==0 || rc!=SQLITE_OK );
       if( rc!=SQLITE_OK ){
         rc = test_session_error(interp, rc, zErr);
@@ -1809,6 +1813,23 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
       break;
     }
 
+    case 13: {      /* change_text-1 */
+      int bNew = 0;
+      int iCol = 0;
+      if( TCL_OK!=testGetNewOrOld(interp, objv[2], &bNew)
+       || TCL_OK!=Tcl_GetIntFromObj(interp, objv[3], &iCol)
+      ){
+        rc = TCL_ERROR;
+      }else{
+        const char *pVal = Tcl_GetString(objv[4]);
+        rc = sqlite3changegroup_change_text(p->pGrp, bNew, iCol, pVal, -1);
+        if( rc!=SQLITE_OK ){
+          rc = test_session_error(interp, rc, 0);
+        }
+      }
+      break;
+    }
+
     default: {     /* delete */
       assert( iSub==3 );
       Tcl_DeleteCommand(interp, Tcl_GetString(objv[0]));
index c4852e1c4a34352811f3cc859434c85687e7ad4a..c093bdcad2b35e20403c5c832691e8ace29c77ec 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Allow\sthe\sAPIs\son\sthis\sbranch\sto\sbe\sused\sto\screate\spatchsets\sas\swell\sas\schangesets.
-D 2026-01-13T19:59:47.818
+C Add\stests\sfor\sedge\scases\sin\sthe\snew\scode\son\sthis\sbranch.
+D 2026-01-14T15:27:26.954
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -562,12 +562,12 @@ F ext/session/sessionat.test 00c8badb35e43a2f12a716d2734a44d614ff62361979b6b8541
 F ext/session/sessionbig.test 47c381e7acfabeef17d98519a3080d69151723354d220afa2053852182ca7adf
 F ext/session/sessionblob.test 87faf667870b72f08e91969abd9f52a383ab7b514506ee194d64a39d8faff00a
 F ext/session/sessionchange.test 6618cb1c1338a4b6df173b6ac42d09623fb71269962abf23ebb7617fe9f45a50
-F ext/session/sessionchange2.test 601d8151b7faeef300355b9eaea65c26d823746e83ccaa8d674198a12d6641dd
+F ext/session/sessionchange2.test 6b5b7e3d1cc4ede43817f7fb68e3771aac4aa6500adb21a458b3e5a9fd841f83
 F ext/session/sessionconflict.test 19e4a53795c4c930bfec49e809311e09b2a9e202d9446e56d7a8b139046a0c07 x
 F ext/session/sessiondiff.test e89f7aedcdd89e5ebac3a455224eb553a171e9586fc3e1e6a7b3388d2648ba8d
 F ext/session/sessionfault.test c2b43d01213b389a3f518e90775fca2120812ba51e50444c4066962263e45c11
 F ext/session/sessionfault2.test b0d6a7c1d7398a7e800d84657404909c7d385965ea8576dc79ed344c46fbf41c
-F ext/session/sessionfault3.test ce0b5d182133935c224d72507dbf1c5be1a1febf7e85d0b0fbd6d2f724b32b96
+F ext/session/sessionfault3.test 9397819ec25b0960c5bc03c78613f9cb5cacc970f83e817aec1775c2a839a787
 F ext/session/sessioninvert.test 9018f6a7387ac745084b6374c5e1aa14d648b372e6e1181cfab3df632b662d26 x
 F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09
 F ext/session/sessionnoact.test 4c7ae5c7d351cb5323bca62b6b095592ad24bd90a6713c178b62ab0063d23e19
@@ -580,7 +580,7 @@ F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544
 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
 F ext/session/sqlite3session.c 16c36e63d41e2d0f6a8d4593618f221185064ab01d49b8514cb5e710642bdb67
 F ext/session/sqlite3session.h cb6d25b573751afd9668f9ae8f1c7819df30916f43cc4c06b57749a6c2ce3e10
-F ext/session/test_session.c c4164b818cbdfaa3ebbcde31a9a620a63478478154715276ce09bced8918429b
+F ext/session/test_session.c dae76c3da7eb51bc500451a37d23382f0d63f169927c5a26aee1db5a7dd6d91a
 F ext/wasm/GNUmakefile c3d007dd181527283d8674c812cc60518353f1f69c9a9d3008f10f53cea4a3c1
 F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a
 F ext/wasm/README.md 2e87804e12c98f1d194b7a06162a88441d33bb443efcfe00dc6565a780d2f259
@@ -2192,8 +2192,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 27150a8c22dc5331efa9e97637eae3741682bc14ae993f0b7672ccc63c37f1f9
-R f6f93392cfb2ac7fdf4dfeb41e3a044d
+P 8699fe5b24c8aeb5e552aa7f4995f2b50dd33d1febd23ec1c07c8fc72497da72
+R 05ca11675af54a626e0a105c1338dfe9
 U dan
-Z b3689361f6f700b24a921b70fab2026e
+Z f1ad619150ebc2af383c65f82ab9b53f
 # Remove this line to create a well-formed Fossil manifest.
index 4b3655ff91330c6fafcb366750a81a4be9cb3475..a7cf753e342eed5f8f3265e1c61d73784f601fc6 100644 (file)
@@ -1 +1 @@
-8699fe5b24c8aeb5e552aa7f4995f2b50dd33d1febd23ec1c07c8fc72497da72
+cd115f0f4437bf254058e40d70ba4e82e87227d2752695aa18f8431c3abc5c0b