čt 4. 7. 2024 v 19:36 odesílatel Tom Lane <t...@sss.pgh.pa.us> napsal:
> Pavel Stehule <pavel.steh...@gmail.com> writes: > > čt 4. 7. 2024 v 17:27 odesílatel Heikki Linnakangas <hlinn...@iki.fi> > > napsal: > >> What happens if you rename a function? I guess the error context will > >> still print the old name, but that's pretty harmless. > > > The rename should to generate different tid, so the function will be > > recompiled > > Right. With patch: > > regression=# create function bogus() returns int language pltcl as > 'return [expr 1 / 0]'; > CREATE FUNCTION > regression=# select bogus(); > ERROR: divide by zero > CONTEXT: while executing > "expr 1 / 0" > (procedure "__PLTcl_proc_bogus" line 2) > invoked from within > "__PLTcl_proc_bogus" > in PL/Tcl function "bogus" > regression=# alter function bogus() rename to stillbogus; > ALTER FUNCTION > regression=# select stillbogus(); > ERROR: divide by zero > CONTEXT: while executing > "expr 1 / 0" > (procedure "__PLTcl_proc_stillbogus" line 2) > invoked from within > "__PLTcl_proc_stillbogus" > in PL/Tcl function "stillbogus" > > >> Hmm, could we do something with tcl namespaces to allow having two > >> procedures with the same name? E.g. create a separate namespace, based > >> on the OID, for each procedure. I wonder how the stack trace would look > >> like then. > > If the namespace depends on the OID then we still have nonreproducible > stack traces, no? We could maybe make Tcl namespaces that match the > SQL schema names, but that doesn't get us out of the duplication > problem when there are similarly-named functions with different > argument lists. > > Another idea is to make the Tcl names include the SQL schema name, > that is __PLTcl_proc_myschema_myfunction. That avoids needing to > append OIDs when the problem is functions in different schemas, > but it doesn't move the needle for overloaded functions. On the > whole I feel like that'd add verbosity without buying much. > I like the idea of using a schema name inside. It doesn't fix all, but the cost can be low, and some risk of duplicity is reduced. Getting unique name based on suffix _oid looks not too much nice (using _increment can be nicer), but it should to work PLpgSQL uses more often function signature (2024-07-04 19:49:20) postgres=# select bx(0); ERROR: division by zero CONTEXT: PL/pgSQL function fx(integer) line 1 at RETURN PL/pgSQL function bx(integer) line 1 at RETURN What can be interesting information How much work can be using modified function signature for internal name like __PLTcl_proc_myschema_myfunction_integer __PLTcl_trigger_myschema_myfunction_table_schema_table Is there some size limit for variable name? I didn't find it. > regards, tom lane >