]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Allow Tcl-defined UDFs to 'break' to result in an SQL NULL, as per suggestion in...
authorstephan <stephan@noemail.net>
Mon, 5 May 2025 16:49:16 +0000 (16:49 +0000)
committerstephan <stephan@noemail.net>
Mon, 5 May 2025 16:49:16 +0000 (16:49 +0000)
FossilOrigin-Name: 034211985da244a7e6544cb57a3273fb99e5939d6c3446ec3afc1c2d84b5ec98

manifest
manifest.uuid
src/tclsqlite.c
test/tclsqlite.test

index 37b79aec84a4f14c4f133abafe7adf31bb8d94c0..bde4822b93a73677046e48c3129176568325f3f2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\ssqlite3_rsync\sso\sthat\sif\sthe\sfirst\sattempt\sto\sinvoke\sa\scopy\nof\sitself\son\sthe\sremote\ssystem\susing\sssh\sfails,\stry\sagain\safter\naugmenting\sthe\sPATH.\s\sThis\senables\ssqlite3_rsync\sto\swork\swithout\sthe\n--exe\soption\swhen\sthe\sremote\ssystem\sis\sa\sMac.
-D 2025-05-03T15:17:21.853
+C Allow\sTcl-defined\sUDFs\sto\s'break'\sto\sresult\sin\san\sSQL\sNULL,\sas\sper\ssuggestion\sin\s[forum:585ebac2c48f1411|forum\spost\s585ebac2c48f1411].
+D 2025-05-05T16:49:16.878
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -794,7 +794,7 @@ F src/sqliteInt.h 8b18ed676757ce49df633b603a465655aa105d9862821ffa9296afb189ba56
 F src/sqliteLimit.h 6d817c28a8f19af95e6f4921933b7fbbca48a962bce0eb0ec81e8bb3ef38e68b
 F src/status.c 0e72e4f6be6ccfde2488eb63210297e75f569f3ce9920f6c3d77590ec6ce5ffd
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
-F src/tclsqlite.c 767a11d470b031e85f51b8924a0e8929b2362ff1975aee3474a10eba3c2e0d36
+F src/tclsqlite.c 23cab775ff323bbd119eabf78bf747c9b88463bd12d46017a95c0b845f6a7d52
 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395
 F src/test1.c 9b54135e5f1352f06b1d23d7c183f124c1f33de6ea8997cd801f0f215c43591d
 F src/test2.c 62f0830958f9075692c29c6de51b495ae8969e1bef85f239ffcd9ba5fb44a5ff
@@ -1725,7 +1725,7 @@ F test/tabfunc01.test 8a484fe8b19fc24844f72ca1ceb7c9ae8c9a6bca000a5c6ccab5d89f5c
 F test/table.test e87294bf1c80bfd7792142b84ab32ea5beb4f3f71e535d7fb263a6b2068377bf
 F test/tableapi.test e37c33e6be2276e3a96bb54b00eea7f321277115d10e5b30fdb52a112b432750
 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
-F test/tclsqlite.test ad0bbd92edabe64cc91d990a0748142fe5ab962d74ac71fa3bfa94d50d2f4c87
+F test/tclsqlite.test 7ca1af2b2db4d36f5f853ac5408d1fcbb17c4751c421953d8be6320b34ba5ed8
 F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08
 F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440
 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900
@@ -2207,8 +2207,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P f8f15eff6ae50d569ed13a3b18f33eaa43453c0cb80b6007df38e880b62f45d0
-R 92ec366dcda46ad4e89bcad267e1732a
-U drh
-Z 6f2331f004388e224b4ac4ea1a14b67b
+P 38d4c94d8c7802101ef3bfb411002f9497fdbbbd2b4d3514cef5b76ffd66f75b
+R d84cf2b8dde8ffbdca8896f454df8fbd
+T *branch * tcl-cw
+T *sym-tcl-cw *
+T -sym-trunk * Cancelled\sby\sbranch.
+U stephan
+Z ec5156f3d6619e2e3e084b033e0d009a
 # Remove this line to create a well-formed Fossil manifest.
index f3c2df3c41c1b4bf9f53dcc360b2ce18fb58101f..81db4b122b05b20dad067d7ff3439bf2cb5448c1 100644 (file)
@@ -1 +1 @@
-38d4c94d8c7802101ef3bfb411002f9497fdbbbd2b4d3514cef5b76ffd66f75b
+034211985da244a7e6544cb57a3273fb99e5939d6c3446ec3afc1c2d84b5ec98
index 7675a91254c099acec34b87641afec50a2a33f2c..5a06ebd049c409788919c210028375a1eb47769c 100644 (file)
@@ -1084,7 +1084,9 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){
     Tcl_DecrRefCount(pCmd);
   }
 
-  if( rc && rc!=TCL_RETURN ){
+  if( TCL_BREAK==rc ){
+    sqlite3_result_null(context);
+  }else if( rc && rc!=TCL_RETURN ){
     sqlite3_result_error(context, Tcl_GetStringResult(p->interp), -1);
   }else{
     Tcl_Obj *pVar = Tcl_GetObjResult(p->interp);
@@ -1102,7 +1104,7 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){
       }else if( (c=='b' && pVar->bytes==0 && strcmp(zType,"boolean")==0 )
              || (c=='b' && pVar->bytes==0 && strcmp(zType,"booleanString")==0 )
              || (c=='w' && strcmp(zType,"wideInt")==0)
-             || (c=='i' && strcmp(zType,"int")==0) 
+             || (c=='i' && strcmp(zType,"int")==0)
       ){
         eType = SQLITE_INTEGER;
       }else if( c=='d' && strcmp(zType,"double")==0 ){
index 0758abd822e7d305f204504b2ed2530ee306f136..0761a191f1cb8a961ad52b24710880f9470ebf1d 100644 (file)
@@ -358,6 +358,16 @@ do_test tcl-9.3 {
   db function ret_int {return [expr {int(rand()*200)}]}
   execsql {SELECT typeof(ret_int())}
 } {integer}
+proc breakAsNullUdf args {return -code break}
+do_test tcl-9.4 {
+  db function banu breakAsNullUdf
+  execsql {SELECT typeof(banu())}
+} {null}
+do_test tcl-9.5 {
+  db nullvalue banunull
+  db eval {SELECT 1, banu(), 3}
+} {1 banunull 3}
+
 
 # Recursive calls to the same user-defined function
 #
@@ -862,7 +872,6 @@ do_test 20.1 {
   } msg]
   list $rc $msg
 } {1 {invalid command name "db"}}
-  
 
 proc closedb {} {
   db close