]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge various minor code and documentation fixes from trunk into the
authordrh <>
Thu, 13 Nov 2025 11:34:38 +0000 (11:34 +0000)
committerdrh <>
Thu, 13 Nov 2025 11:34:38 +0000 (11:34 +0000)
patch branch for 3.51.

FossilOrigin-Name: 9a00fe5eb69050ddc569d2a857309c2779a48414135f0967531999b7afd84283

13 files changed:
autoconf/tea/Makefile.in
autosetup/teaish/core.tcl
ext/intck/sqlite3intck.c
manifest
manifest.uuid
src/callback.c
src/hash.c
src/hash.h
src/main.c
src/sqlite.h.in
src/test1.c
test/misuse.test
test/returning1.test

index ccf9a7b945c2cc5b4c0a861e5e8216fb91da84cc..04c8f87f555b87a39beeafd9a8ce51fb51963347 100644 (file)
@@ -119,7 +119,7 @@ TCLLIBDIR         = @TCLLIBDIR@
 # typically come from the ./configure command-line invocation).
 #
 CFLAGS.configure = @SH_CFLAGS@ @TEAISH_CFLAGS@ @CFLAGS@ @CPPFLAGS@ $(TCL_INCLUDE_SPEC)
-#CFLAGS.configure += -DUSE_TCL_STUBS=1
+CFLAGS.configure += -DUSE_TCL_STUBS=@TEAISH_USE_STUBS@
 
 #
 # LDFLAGS.configure = LDFLAGS as known at configure-time.
@@ -153,6 +153,7 @@ tx.src     = @TEAISH_EXT_SRC@
 # gets set up via the configure script.
 #
 tx.CFLAGS  =
+tx.CPPFLAGS  =
 
 #
 # tx.LDFLAGS is typically set by teaish.make, whereas TEAISH_LDFLAGS
@@ -218,7 +219,7 @@ config.log: @TEAISH_TEST_TCL_IN@
 # CC variant for compiling Tcl-using sources.
 #
 CC.tcl = \
-  $(CC) -o $@ $(CFLAGS.configure) $(CFLAGS) $(tx.CFLAGS)
+  $(CC) -o $@ $(CFLAGS.configure) $(CFLAGS) $(tx.CFLAGS) $(tx.CPPFLAGS)
 
 #
 # CC variant for linking $(tx.src) into an extension DLL.  Note that
index a4a6b001f29f8311787f1487d5c56981a4ca4777..c9abfa0626c04936285f7e598f5049b0d787b3b3 100644 (file)
@@ -220,7 +220,9 @@ proc teaish-configure-core {} {
       => {Full pathname of tclsh to use.  It is used for trying to find
           tclConfig.sh.  Warning: if its containing dir has multiple tclsh
           versions, it may select the wrong tclConfig.sh!
-          Defaults to the $TCLSH environment variable.}
+        Defaults to the $TCLSH environment variable.}
+
+    tcl-stubs=0 => {Enable use of Tcl stubs library.}
 
     # TEA has --with-tclinclude but it appears to only be useful for
     # building an extension against an uninstalled copy of TCL's own
@@ -498,6 +500,8 @@ proc teaish__configure_phase1 {} {
   }
   teaish-checks-run -post
 
+  define TEAISH_USE_STUBS [opt-bool tcl-stubs]
+
   apply {{} {
     # Set up "vsatisfies" code for pkgIndex.tcl.in,
     # _teaish.tester.tcl.in, and for a configure-time check.  We would
index ed169a26643b5dcec0bab8e2df36da8c24619055..5f645fae6e8521011f802d9d909fb31bd7d575c8 100644 (file)
@@ -160,6 +160,7 @@ static char *intckMprintf(sqlite3_intck *p, const char *zFmt, ...){
     sqlite3_free(zRet);
     zRet = 0;
   }
+  va_end(ap);
   return zRet;
 }
 
index 5dd02ae63326a0ff0b5ff82e6519c9339f8fb02f..e86e52e3111867e2e45835576c8b7a6ca4d8a22a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Kick\soff\sbranch-3.51:\sbump\sversion\sto\s3.51.1\sand\scherrypick\s[0f712b6b0516dc151d].
-D 2025-11-09T06:38:48.807
+C Merge\svarious\sminor\scode\sand\sdocumentation\sfixes\sfrom\strunk\sinto\sthe\npatch\sbranch\sfor\s3.51.
+D 2025-11-13T11:34:38.886
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -22,7 +22,7 @@ F autoconf/Makefile.msc 803aa9e23b6a764751f6a91d0673620eefa46729fb80faf51391120e
 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136
 F autoconf/README.txt b749816b8452b3af994dc6d607394bef3df1736d7e09359f1087de8439a52807
 F autoconf/auto.def 3d994f3a9cc9b712dbce92a5708570ddcf3b988141b6eb738f2ed16127a9f0ac
-F autoconf/tea/Makefile.in bf6b43eafcd18766d81a8f0085cfc9cb051d8abae9031a8e7c3f5f1246e8f166
+F autoconf/tea/Makefile.in 00e60cf3bf5580f31bfdcf3c914e9ba1831d676948363962de92ce65e5be4431
 F autoconf/tea/README.txt 23475876343498ef2b514cc7510e8f1559a17e8e03fbc7a41c1c8a3b89e7b7e3
 F autoconf/tea/_teaish.tester.tcl.in 8253b44be88e2e3f21de95a65d3a90c2be8e70b7bdd08a5b80e337ba7402f8f1
 F autoconf/tea/auto.def ce95b9450e2fa4ba5dc857e208fe10f4e6f2d737796ac3278aee6079db417529
@@ -50,7 +50,7 @@ F autosetup/proj.tcl 6fc14ef82b19b77a95788ffbcfad7989b4e3cb4ce96a21dcb5cf7312f36
 F autosetup/sqlite-config.tcl 5d779fce20c11fde3fe99d157dcd5b5569d729b301141b8dfb8d5aacf9d48cba
 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9
 F autosetup/teaish/README.txt b40071e6f8506500a2f7f71d5fc69e0bf87b9d7678dd9da1e5b4d0acbf40b1ca
-F autosetup/teaish/core.tcl aee092fc71986d1272b835ea7492bb55ffc213a289502e4f14da80cf67b7e3c3
+F autosetup/teaish/core.tcl e014dd95900c7f9a34e8e0f460f47e94841059827bce8b4c49668b0c7ae3f1a0
 F autosetup/teaish/feature.tcl 18194fb79a24d30e5bbdeab40999616f39278b53a27525349ded033af2fd73be
 F autosetup/teaish/tester.tcl 1799514c2652db49561b3386c5242b94534d1663f2cfac861a955e071895fdd0
 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x
@@ -284,7 +284,7 @@ F ext/intck/intck_common.tcl a61fd2697ae55b0a3d89847ca0b590c6e0d8ff64bebb70920d9
 F ext/intck/intckbusy.test d5ed4ef85a4b1dc1dee2484bd14a4bb68529659cca743327df0c775f005fa387
 F ext/intck/intckcorrupt.test f6c302792326fb3db9dcfc70b554c55369bc4b52882eaaf039cfe0b74c821029
 F ext/intck/intckfault.test cff3f75dff74abb3edfcb13f6aa53f6436746ab64b09fe5e2028f051e985efab
-F ext/intck/sqlite3intck.c 0d10df36e2b7b438aa80ecd3f5e584d41b747586b038258fe6b407f66b81e7c5
+F ext/intck/sqlite3intck.c b1c8a86f90fc00741d13314db9c58f7e2f92d1d19c5ad1c6904ec83a6bbd5c96
 F ext/intck/sqlite3intck.h 2b40c38e7063ab822c974c0bd4aed97dabb579ccfe2e180a4639bb3bbef0f1c9
 F ext/intck/test_intck.c 4f9eaadaedccb9df1d26ba41116a0a8e5b0c5556dc3098c8ff68633adcccdea8
 F ext/jni/GNUmakefile 8a94e3a1953b88cf117fb2a5380480feada8b4f5316f02572cab425030a720b4
@@ -679,7 +679,7 @@ F src/btree.c cb5b8ceb9baa02a63a2f83dec09c4153e1cfbdf9c2adef5c62c26d2160eeb067
 F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0
 F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886
 F src/build.c 611e07299d72ff04bbcb9e7109183467e30925d203c3e121ef9bb3cf6876289b
-F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
+F src/callback.c afa59adfaa483f668260ce69f740c8273dee3e6fee9106846e0499ebdd1ac076
 F src/carray.c ff6081a31878fc34df8fa1052a9cbf17ddc22652544dcb3e2326886ed1053b55
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/date.c e19e0cfff9a41bfdd884c655755f6f00bca4c1a22272b56e0dd6667b7ea893a2
@@ -691,15 +691,15 @@ F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
 F src/func.c 0b802107498048d3dcac0b757720bcb8506507ce02159e213ab8161458eb293b
 F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b
-F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7
-F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
+F src/hash.c dff10fa89d4a8280b764df9599b29342ea98cba2b868dccb5dfb3c419841a3f0
+F src/hash.h c5f4a02aaf1dca835a68b51c8b906af265c6ca3d8d53d255e0453f0abce561be
 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
 F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd
 F src/json.c fb031340edee159c07ad37dbe668ffe945ed86f525b0eb3822e4a67cbc498a72
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c a3bc9a2522dc3b960e38b7582d1818f6245a49289387c2c7b19f27bfeabf1e81
-F src/main.c ce69a2650e3d359ed6a8a2867ccafb27ac62ce1d39f3120a84ff513320952a6c
+F src/main.c 65d11c17890966d271c925c6cc55e3ba50fa08374633cb99c0dee4719a20915a
 F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -737,7 +737,7 @@ F src/resolve.c 5616fbcf3b833c7c705b24371828215ad0925d0c0073216c4f153348d5753f0a
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c ba9cd07ffa3277883c1986085f6ddc4320f4d35d5f212ab58df79a7ecc1a576a
 F src/shell.c.in 265015aaec4580a0bef50ff570ec8d2813498ee49dcfdf9757e76f3b2a59fc97
-F src/sqlite.h.in f7944026ee89ea348f89aec56372d6d25b6cafc1d89df741278d6917e86326a3
+F src/sqlite.h.in c0979f9ac1f5be887397dd2a0bb485636893a81b34d64df85123aae9650c42f2
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 7f236ca1b175ffe03316d974ef57df79b3938466c28d2f95caef5e08c57f3a52
 F src/sqliteInt.h 88f7fc9ce1630d9a5f7e0a8e1f3287cdc63882fba985c18e7eee1b9f457f59aa
@@ -746,7 +746,7 @@ F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
 F src/tclsqlite.c 3c604c49e6cf4211960a9ddb9505280fd22cde32175f40884c641c0f5a286036
 F src/tclsqlite.h 614b3780a62522bc9f8f2b9fb22689e8009958e7aa77e572d0f3149050af348a
-F src/test1.c f880ab766eeedf2c063662bd9538b923fd42c4341b7bfc2150a6d93ab8b9341c
+F src/test1.c d27c91455865fb191eb1b2c892e7586c5e3d9d3977f54913c8e70e2e8e5148b3
 F src/test2.c 62f0830958f9075692c29c6de51b495ae8969e1bef85f239ffcd9ba5fb44a5ff
 F src/test3.c 432646f581d8af1bb495e58fc98234380250954f5d5535e507fc785eccc3987a
 F src/test4.c 0ac87fc13cdb334ab3a71823f99b6c32a6bebe5d603cd6a71d84c823d43a25a0
@@ -1429,7 +1429,7 @@ F test/misc5.test 02fcaf4d42405be02ec975e946270a50b0282dac98c78303ade0d1392839d2
 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91
 F test/misc7.test d595599972ec0b436985f0f02f243b68500ffc977b9b3194ec66c0866cfddcab
 F test/misc8.test 08d2380bc435486b12161521f225043ac2be26f02471c2c1ea4cac0b1548edbd
-F test/misuse.test 46d42ffdf375833ea5828796e56f84660344f7548659b493059f152f00e66840
+F test/misuse.test 859f37014d9824ca66bd90c36372c08c80c51c9593a7cfa8a31d4f92cd4d5b7f
 F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152
 F test/mmap1.test 18de3fd7b70a777af6004ca2feecfcdd3d0be17fa04058e808baf530c94b1a1d
 F test/mmap2.test dba452dc7db91e9df10f70bdd73dc4190c7b8ee7b5133b4684f04277ada0b9ac
@@ -1526,7 +1526,7 @@ F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2
 F test/reservebytes.test 6163640b5a5120c0dee6591481e673a0fa0bf0d12d4da7513bad692c1a49a162
 F test/resetdb.test 54c06f18bc832ac6d6319e5ab23d5c8dd49fdbeec7c696d791682a8006bd5fc3
 F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
-F test/returning1.test 212cd4111bb941a60abf608f20250db666c21eb1bc4d49217e96c87ff3ab9d1a
+F test/returning1.test cd32517148948859db214dd814354597dd40e7489259590fac1a4f7bf44deb97
 F test/returningfault.test ae4c4b5e8745813287a359d9ccdb9d5c883c2e68afb18fb0767937d5de5692a4
 F test/rollback.test 952c4d805bca96adc2be76f621ea22115fe40b330015af36fcc8028c8547fcee
 F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f
@@ -2171,12 +2171,14 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P fb2c931ae597f8d00a37574ff67aeed3eced4e5547f9120744ae4bfa8e74527b
-Q +0f712b6b0516dc151d3bcbb63497661c82e11eae368e639bbdf197e1b3467195
-R 09e0764b6cb609ca65a3985b0ebfa71c
-T *branch * branch-3.51
-T *sym-branch-3.51 *
-T -sym-trunk *
-U stephan
-Z 663f8465bcf4b51c26b5756b844d4d92
+P 1b908c439a4d2614cb6a4cec36d8d876eec68b1e2e80d6aad7e21d61d159df7d
+Q +36cd33f634a45900f6e52ba07aa20242a5f2b29c7cbe19be968c52ffef34fcde
+Q +45d820ca227eb1ade4dda498b0f94b2c5df4bab3fc5fcdd517ee125a43d16f4d
+Q +4954b94763052ed60ad2ae610e4f5c18fdba4475a39eb369408e984c89805e97
+Q +5f5a736f88bc9bc6c9c83d2cbfd74c0b5357d7417d9993d34a78f0b7317ff796
+Q +62ad2350e368dc337ba2d0fb6847d07c40a6f79520dd6414d22b5b54983b0b12
+Q +7a644178c8d289ca18631844b2d73b32fddc72afcc80906633dd38c14eba2ca9
+R 14565952030a019021e7f14d5b14445b
+U drh
+Z e997942eb71c33e24bddc68463d572ec
 # Remove this line to create a well-formed Fossil manifest.
index df0929bbd1f8e2d29db4847ceeb80d62e9f9f24d..9ce5359cc98dfe5d3ad338873dc5fdf8a146580b 100644 (file)
@@ -1 +1 @@
-1b908c439a4d2614cb6a4cec36d8d876eec68b1e2e80d6aad7e21d61d159df7d
+9a00fe5eb69050ddc569d2a857309c2779a48414135f0967531999b7afd84283
index 6fe21a295621ecdcf4b5e45fc72bbda0a718353e..9ea3616b383307a88720140f1d8a3c00f36f19c2 100644 (file)
@@ -504,8 +504,16 @@ void sqlite3SchemaClear(void *p){
   temp2 = pSchema->trigHash;
   sqlite3HashInit(&pSchema->trigHash);
   sqlite3HashClear(&pSchema->idxHash);
-  for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
-    sqlite3DeleteTrigger(&xdb, (Trigger*)sqliteHashData(pElem));
+  for(pElem=sqliteHashFirst(&temp2); pElem; ){
+    HashElem *pNext = sqliteHashNext(pElem);
+    Trigger *pTrig = (Trigger*)sqliteHashData(pElem);
+    if( pTrig->bReturning ){
+      /* Do not remove RETURNING triggers from the temp-triggers hash */
+      sqlite3HashTransfer(&pSchema->trigHash, &temp2, pElem);
+    }else{
+      sqlite3DeleteTrigger(&xdb, pTrig);
+    }
+    pElem = pNext;
   }
   sqlite3HashClear(&temp2);
   sqlite3HashInit(&pSchema->tblHash);
index 8cc6c09663c05beffeaa1194ffb09497323bb13e..670df16d8193f2ab3e24fba58038378eaba7c518 100644 (file)
@@ -270,3 +270,26 @@ void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){
   insertElement(pH, pH->ht ? &pH->ht[new_elem->h % pH->htsize] : 0, new_elem);
   return 0;
 }
+
+/*
+** Parameter pElem is currently part of hash table pFrom. Add it to hash 
+** table pTo. 
+**
+** This procedure corrupts hash table pFrom. Specifically, it removes element
+** pElem from the list of all elements in the hash table, but may leave
+** a pointer to it in one of the hash buckets of pFrom. This is not a problem
+** because this function is only called if hash table pFrom will be cleared
+** before any further lookups or inserts are attempted.
+*/
+void sqlite3HashTransfer(Hash *pTo, Hash *pFrom, HashElem *pElem){
+  if( pElem->prev ){
+    pElem->prev->next = pElem->next; 
+  }else{
+    assert( pFrom->first==pElem );
+    pFrom->first = pElem->next;
+  }
+  pTo->count++;
+  insertElement(pTo, pTo->ht ? &pTo->ht[pElem->h % pTo->htsize] : 0, pElem);
+}
+
+
index cff65d6e508717c7b6ac63bf92429e1139bbc265..4cb1fbe47b08d76adafaae12c66057f4c6425ad3 100644 (file)
@@ -70,6 +70,7 @@ void sqlite3HashInit(Hash*);
 void *sqlite3HashInsert(Hash*, const char *pKey, void *pData);
 void *sqlite3HashFind(const Hash*, const char *pKey);
 void sqlite3HashClear(Hash*);
+void sqlite3HashTransfer(Hash*, Hash*, HashElem *pElem);
 
 /*
 ** Macros for looping over all elements of a hash table.  The idiom is
index ef1bc685342cf484edb8de2b5ad18b215579c816..6efe538d4d9621818e41e996b622d131d3e216f1 100644 (file)
@@ -1394,6 +1394,7 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
   /* Clear the TEMP schema separately and last */
   if( db->aDb[1].pSchema ){
     sqlite3SchemaClear(db->aDb[1].pSchema);
+    assert( db->aDb[1].pSchema->trigHash.count==0 );
   }
   sqlite3VtabUnlockList(db);
 
@@ -2722,7 +2723,7 @@ const char *sqlite3_errmsg(sqlite3 *db){
 */
 int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zMsg){
   int rc = SQLITE_OK;
-  if( !sqlite3SafetyCheckSickOrOk(db) ){
+  if( !sqlite3SafetyCheckOk(db) ){
     return SQLITE_MISUSE_BKPT;
   }
   sqlite3_mutex_enter(db->mutex);
index a821ecb3016aed5e1d5d490603888f7e8c364cd4..f6ed48c20fe5537e49b7b51dc8948dd266d89b17 100644 (file)
@@ -10426,7 +10426,7 @@ int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle);
 ** &nbsp;  ){
 ** &nbsp;    // do something with pVal
 ** &nbsp;  }
-** &nbsp;  if( rc!=SQLITE_OK ){
+** &nbsp;  if( rc!=SQLITE_DONE ){
 ** &nbsp;    // an error has occurred
 ** &nbsp;  }
 ** </pre></blockquote>)^
index f89359932b3d1ec91560f94416133a077f46564c..2b16053863a37aeeba739f43b230c7e07c906ea7 100644 (file)
@@ -4972,6 +4972,37 @@ static int SQLITE_TCLAPI test_errmsg16(
   return TCL_OK;
 }
 
+/*
+** Usage:   sqlite3_set_errmsg DB ERRCODE ERRMSG
+*/
+static int SQLITE_TCLAPI test_set_errmsg(
+  void * clientData,
+  Tcl_Interp *interp,
+  int objc,
+  Tcl_Obj *CONST objv[]
+){
+  const char *zDb = 0;
+  const char *zErr = 0;
+  int iErr = 0;
+  sqlite3 *db = 0;
+  int rc;
+
+  if( objc!=4 ){
+    Tcl_WrongNumArgs(interp, 1, objv, "DB ERRCODE ERRMSG");
+    return TCL_ERROR;
+  }
+  zDb = Tcl_GetString(objv[1]);
+  if( zDb[0] ){
+    if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
+  }
+  if( Tcl_GetIntFromObj(interp, objv[2], &iErr) ) return TCL_ERROR;
+  zErr = Tcl_GetString(objv[3]);
+
+  rc = sqlite3_set_errmsg(db, iErr, (zErr[0] ? zErr : 0));
+  Tcl_SetResult(interp, (char *)t1ErrorName(rc), 0);
+  return TCL_OK;
+}
+
 /*
 ** Usage: sqlite3_prepare DB sql bytes ?tailvar?
 **
@@ -9077,6 +9108,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
      { "sqlite3_errmsg",                test_errmsg        ,0 },
      { "sqlite3_error_offset",          test_error_offset  ,0 },
      { "sqlite3_errmsg16",              test_errmsg16      ,0 },
+     { "sqlite3_set_errmsg",            test_set_errmsg    ,0 },
      { "sqlite3_open",                  test_open          ,0 },
      { "sqlite3_open16",                test_open16        ,0 },
      { "sqlite3_open_v2",               test_open_v2       ,0 },
index 2ba61f9eb54e4d50fb68024bab35074f3c03238c..640cb5a4d3eee803a2664c1ad9c651e237631109 100644 (file)
@@ -211,4 +211,16 @@ if {[clang_sanitize_address]==0 && 0} {
   } {1 {(21) bad parameter or other API misuse}}
 }
 
+#-------------------------------------------------------------------------
+reset_db
+do_test misuse-6.0 {
+  sqlite3_set_errmsg db 1 "an error has occurred"
+} {SQLITE_OK}
+do_test misuse-6.1 {
+  sqlite3_errmsg db
+} {an error has occurred}
+do_test misuse-6.2 {
+  sqlite3_set_errmsg "" 1 "an error has occurred"
+} {SQLITE_MISUSE}
+
 finish_test
index e7be7c65a3e997a3e520c90660bfdb6c6b4dfa70..9ab646a3b74b5799b5303e14cbf2b4b9f9a77a44 100644 (file)
@@ -544,4 +544,54 @@ do_catchsql_test 22.1 {
 } {1 {no such column: sqlite_master.name}}
 
 
+#-------------------------------------------------------------------------
+reset_db 
+do_execsql_test 23.0 {
+  PRAGMA recursive_triggers = 1;
+  CREATE TABLE t1(x, y);
+  CREATE TRIGGER t1insert AFTER INSERT ON t1 WHEN new.x<5 BEGIN
+    INSERT INTO t1 VALUES(new.x+1, new.y);
+  END;
+}
+
+do_execsql_test 23.1 {
+  INSERT INTO t1 VALUES(1, 'one') RETURNING *;
+} {1 one}
+
+do_execsql_test 23.2 {
+  SELECT * FROM t1
+} {1 one 2 one 3 one 4 one 5 one}
+
+#-------------------------------------------------------------------------
+reset_db 
+ifcapable fts5 {
+
+  do_execsql_test 24.0 {
+    CREATE VIRTUAL TABLE ft USING fts5(c);
+    CREATE TABLE t1(x);
+    INSERT INTO t1 VALUES('x');
+  }
+  
+  db close
+  
+  sqlite3 db test.db
+  sqlite3 db2 test.db
+  
+  do_execsql_test 24.1 {
+    SELECT * FROM t1
+  } {x}
+  
+  do_execsql_test -db db2 24.2 {
+    CREATE TABLE t2(y);
+    INSERT INTO t2 VALUES('y');
+  } {}
+
+  db2 close
+  
+  do_execsql_test 24.3 {
+    INSERT INTO ft VALUES('hello world') RETURNING *
+  } {{hello world}}
+}
+
+
 finish_test