I can also reproduce in Alma Linux 8.10 with tcl-devel 8.6.8 gdb says:
(gdb) p interp $1 = (Tcl_Interp *) 0x288a500 (gdb) p *interp $2 = {resultDontUse = 0x288a6d8 "", freeProcDontUse = 0x0, errorLineDontUse = 1} (gdb) p msg No symbol "msg" in current context. (gdb) p emsg $3 = 0x27ebe48 "list element in braces followed by \")\" instead of space" Involved PG source code is: ********************************************************************** * throw_tcl_error - ereport an error returned from the Tcl interpreter **********************************************************************/ static void throw_tcl_error <https://doxygen.postgresql.org/pltcl_8c.html#a82838fc9c33c4745329af8b74a52b27f>(Tcl_Interp *interp, const char *proname <https://doxygen.postgresql.org/pg__proc_8h.html#af3197a24ed757df3d91f9c41a3622b2c> ) { /* * Caution is needed here because Tcl_GetVar could overwrite the * interpreter result (even though it's not really supposed to), and we * can't control the order of evaluation of ereport arguments. Hence, make * real sure we have our own copy of the result string before invoking * Tcl_GetVar. */ char *emsg; char *econtext; emsg = pstrdup <https://doxygen.postgresql.org/mcxt_8c.html#a4c9fd325849ffd3be847d985ef319c41> (utf_u2e <https://doxygen.postgresql.org/pltcl_8c.html#aefb17648f789247bf5cfc5a9cd53f19c> (Tcl_GetStringResult(interp))); econtext = utf_u2e <https://doxygen.postgresql.org/pltcl_8c.html#aefb17648f789247bf5cfc5a9cd53f19c>(Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY)); ereport <https://doxygen.postgresql.org/elog_8h.html#ae15bca8edf22ffe24b23e89348568b7c> (ERROR <https://doxygen.postgresql.org/elog_8h.html#a8fe83ac76edc595f6b98cd4a4127aed5> , (errcode <https://doxygen.postgresql.org/elog_8c.html#ab243d4465b39d615088449de076a217d> (ERRCODE_EXTERNAL_ROUTINE_EXCEPTION), errmsg <https://doxygen.postgresql.org/elog_8c.html#ac15cbe2e9b7f41f40df622ac31521987> ("%s", emsg), errcontext <https://doxygen.postgresql.org/elog_8h.html#a26722e60709391a7cdd6e1881a220336> ("%s\nin PL/Tcl function \"%s\"", econtext, proname <https://doxygen.postgresql.org/pg__proc_8h.html#af3197a24ed757df3d91f9c41a3622b2c> ))); } I understand that Tcl_GetVar should not be used any more and should be replaced by Tcl_GetStringResult (but I know nothing about Tcl internals) Following patch : diff postgres/src/pl/tcl/pltcl.c.orig postgres/src/pl/tcl/pltcl.c 1373c1373,1376 < econtext = utf_u2e(Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY)); --- > /* > * econtext = utf_u2e(Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY)); > */ > econtext = utf_u2e(Tcl_GetStringResult(interp)); gives: pierre=# CREATE OR REPLACE PROCEDURE test_proc(INOUT a text) AS $$ set aa [concat $1 "+" $1] return [list $aa $aa]) $$ LANGUAGE pltcl; CREATE PROCEDURE pierre=# CALL test_proc('abc'); 2024-06-02 14:22:45.223 CEST [61649] ERROR: list element in braces followed by ")" instead of space 2024-06-02 14:22:45.223 CEST [61649] CONTEXT: list element in braces followed by ")" instead of space in PL/Tcl function "test_proc" 2024-06-02 14:22:45.223 CEST [61649] STATEMENT: CALL test_proc('abc'); ERROR: list element in braces followed by ")" instead of space CONTEXT: list element in braces followed by ")" instead of space in PL/Tcl function "test_proc" PF Le sam. 1 juin 2024 à 06:36, a.kozhemyakin <a.kozhemya...@postgrespro.ru> a écrit : > Hello hackers, > > When executing the following query on master branch: > > CREATE EXTENSION pltcl; > CREATE or replace PROCEDURE test_proc5(INOUT a text) > LANGUAGE pltcl > AS $$ > set aa [concat $1 "+" $1] > return [list $aa $aa]) > $$; > > CALL test_proc5('abc'); > CREATE EXTENSION > CREATE PROCEDURE > server closed the connection unexpectedly > This probably means the server terminated abnormally > before or while processing the request. > The connection to the server was lost. Attempting reset: Failed. > > The connection to the server was lost. Attempting reset: Failed. > > > Core was generated by `postgres: postgres postgres [loca'. > Program terminated with signal SIGSEGV, Segmentation fault. > #0 __strlen_sse2 () at ../sysdeps/x86_64/multiarch/strlen-sse2.S:142 > 142 ../sysdeps/x86_64/multiarch/strlen-sse2.S: No such file or > directory. > (gdb) bt > #0 __strlen_sse2 () at ../sysdeps/x86_64/multiarch/strlen-sse2.S:142 > #1 0x00007f5f1353ba6a in utf_u2e (src=0x0) at pltcl.c:77 > #2 0x00007f5f1353c9f7 in throw_tcl_error (interp=0x55ec24bdaf70, > proname=0x55ec24b6b140 "test_proc5") at pltcl.c:1373 > #3 0x00007f5f1353ed64 in pltcl_func_handler > (fcinfo=fcinfo@entry=0x7ffdbfb407a0, > call_state=call_state@entry=0x7ffdbfb405d0, > pltrusted=pltrusted@entry=true) at pltcl.c:1029 > #4 0x00007f5f1353ee8d in pltcl_handler (fcinfo=0x7ffdbfb407a0, > pltrusted=pltrusted@entry=true) at pltcl.c:765 > #5 0x00007f5f1353f1ef in pltcl_call_handler (fcinfo=<optimized out>) at > pltcl.c:698 > #6 0x000055ec239ec64a in ExecuteCallStmt > (stmt=stmt@entry=0x55ec24a9a940, params=params@entry=0x0, > atomic=atomic@entry=false, dest=dest@entry=0x55ec24a6ea18) at > functioncmds.c:2285 > #7 0x000055ec23c103a7 in standard_ProcessUtility (pstmt=0x55ec24a9a9d8, > queryString=0x55ec24a99e68 "CALL test_proc5('abc');", > readOnlyTree=<optimized out>, context=PROCESS_UTILITY_TOPLEVEL, > params=0x0, queryEnv=0x0, dest=0x55ec24a6ea18, > qc=0x7ffdbfb40f40) at utility.c:851 > #8 0x000055ec23c1081b in ProcessUtility > (pstmt=pstmt@entry=0x55ec24a9a9d8, queryString=<optimized out>, > readOnlyTree=<optimized out>, > context=context@entry=PROCESS_UTILITY_TOPLEVEL, params=<optimized out>, > queryEnv=<optimized out>, > dest=0x55ec24a6ea18, qc=0x7ffdbfb40f40) at utility.c:523 > #9 0x000055ec23c0e04e in PortalRunUtility > (portal=portal@entry=0x55ec24b18108, pstmt=0x55ec24a9a9d8, > isTopLevel=isTopLevel@entry=true, > setHoldSnapshot=setHoldSnapshot@entry=true, > dest=dest@entry=0x55ec24a6ea18, qc=qc@entry=0x7ffdbfb40f40) > at pquery.c:1158 > #10 0x000055ec23c0e3b7 in FillPortalStore > (portal=portal@entry=0x55ec24b18108, isTopLevel=isTopLevel@entry=true) > at pquery.c:1031 > #11 0x000055ec23c0e6ee in PortalRun (portal=portal@entry=0x55ec24b18108, > count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry=true, > run_once=run_once@entry=true, dest=dest@entry=0x55ec24a9aec8, > altdest=altdest@entry=0x55ec24a9aec8, > qc=0x7ffdbfb41130) at pquery.c:763 > #12 0x000055ec23c0acca in exec_simple_query > (query_string=query_string@entry=0x55ec24a99e68 "CALL > test_proc5('abc');") at postgres.c:1274 > #13 0x000055ec23c0caad in PostgresMain (dbname=<optimized out>, > username=<optimized out>) at postgres.c:4680 > #14 0x000055ec23c0687a in BackendMain (startup_data=<optimized out>, > startup_data_len=<optimized out>) at backend_startup.c:105 > #15 0x000055ec23b766bf in postmaster_child_launch > (child_type=child_type@entry=B_BACKEND, > startup_data=startup_data@entry=0x7ffdbfb41354 "", > startup_data_len=startup_data_len@entry=4, > client_sock=client_sock@entry=0x7ffdbfb41390) > at launch_backend.c:265 > #16 0x000055ec23b7ab36 in BackendStartup > (client_sock=client_sock@entry=0x7ffdbfb41390) at postmaster.c:3593 > #17 0x000055ec23b7adb0 in ServerLoop () at postmaster.c:1674 > #18 0x000055ec23b7c20c in PostmasterMain (argc=argc@entry=3, > argv=argv@entry=0x55ec24a54030) at postmaster.c:1372 > #19 0x000055ec23aacf9f in main (argc=3, argv=0x55ec24a54030) at main.c:197 > > > >