From: stephan Date: Mon, 5 May 2025 16:49:16 +0000 (+0000) Subject: Allow Tcl-defined UDFs to 'break' to result in an SQL NULL, as per suggestion in... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=66937b8fbd9cbb7dff027f74d1c7259d007529c8;p=thirdparty%2Fsqlite.git Allow Tcl-defined UDFs to 'break' to result in an SQL NULL, as per suggestion in [forum:585ebac2c48f1411|forum post 585ebac2c48f1411]. FossilOrigin-Name: 034211985da244a7e6544cb57a3273fb99e5939d6c3446ec3afc1c2d84b5ec98 --- diff --git a/manifest b/manifest index 37b79aec84..bde4822b93 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index f3c2df3c41..81db4b122b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -38d4c94d8c7802101ef3bfb411002f9497fdbbbd2b4d3514cef5b76ffd66f75b +034211985da244a7e6544cb57a3273fb99e5939d6c3446ec3afc1c2d84b5ec98 diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 7675a91254..5a06ebd049 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -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 ){ diff --git a/test/tclsqlite.test b/test/tclsqlite.test index 0758abd822..0761a191f1 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -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