Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9403598

Browse files
committed
Fix plperl and pltcl to include the name of the current function when
passing on errors from the language interpreter. (plpython seemsfairly OK about this already.) Per gripe from Robert Kleemann.
1 parente77df38 commit9403598

File tree

4 files changed

+50
-32
lines changed

4 files changed

+50
-32
lines changed

‎src/pl/plperl/expected/plperl.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,4 +496,4 @@ CREATE OR REPLACE FUNCTION perl_spi_prepared_bad(double precision) RETURNS doubl
496496
return $result;
497497
$$ LANGUAGE plperl;
498498
SELECT perl_spi_prepared_bad(4.35) as "double precision";
499-
ERROR: error from Perl function: type "does_not_exist" does not exist at line 2.
499+
ERROR: error from Perl function "perl_spi_prepared_bad": type "does_not_exist" does not exist at line 2.

‎src/pl/plperl/expected/plperl_elog.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ create or replace function uses_global() returns text language plperl as $$
3535
return 'uses_global worked';
3636

3737
$$;
38-
ERROR: creation of Perl function failed: Global symbol "$global" requires explicit package name at line 3.
38+
ERROR: creation of Perl function"uses_global"failed: Global symbol "$global" requires explicit package name at line 3.
3939
Global symbol "$other_global" requires explicit package name at line 4.
4040
select uses_global();
4141
ERROR: function uses_global() does not exist

‎src/pl/plperl/plperl.c

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**********************************************************************
22
* plperl.c - perl as a procedural language for PostgreSQL
33
*
4-
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.129 2007/06/28 17:49:59 tgl Exp $
4+
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.130 2007/10/05 17:06:11 tgl Exp $
55
*
66
**********************************************************************/
77

@@ -39,7 +39,7 @@ PG_MODULE_MAGIC;
3939
**********************************************************************/
4040
typedefstructplperl_proc_desc
4141
{
42-
char*proname;
42+
char*proname;/* user name of procedure */
4343
TransactionIdfn_xmin;
4444
ItemPointerDatafn_tid;
4545
boolfn_readonly;
@@ -60,7 +60,7 @@ typedef struct plperl_proc_desc
6060

6161
typedefstructplperl_proc_entry
6262
{
63-
charproc_name[NAMEDATALEN];
63+
charproc_name[NAMEDATALEN];/* internal name, eg __PLPerl_proc_39987 */
6464
plperl_proc_desc*proc_data;
6565
}plperl_proc_entry;
6666

@@ -887,7 +887,7 @@ plperl_validator(PG_FUNCTION_ARGS)
887887
* supplied in s, and returns a reference to the closure.
888888
*/
889889
staticSV*
890-
plperl_create_sub(char*s,booltrusted)
890+
plperl_create_sub(char*proname,char*s,booltrusted)
891891
{
892892
dSP;
893893
SV*subref;
@@ -941,7 +941,8 @@ plperl_create_sub(char *s, bool trusted)
941941
LEAVE;
942942
ereport(ERROR,
943943
(errcode(ERRCODE_SYNTAX_ERROR),
944-
errmsg("creation of Perl function failed: %s",
944+
errmsg("creation of Perl function \"%s\" failed: %s",
945+
proname,
945946
strip_trailing_ws(SvPV(ERRSV,PL_na)))));
946947
}
947948

@@ -1070,7 +1071,8 @@ plperl_call_perl_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo)
10701071
LEAVE;
10711072
/* XXX need to find a way to assign an errcode here */
10721073
ereport(ERROR,
1073-
(errmsg("error from Perl function: %s",
1074+
(errmsg("error from Perl function \"%s\": %s",
1075+
desc->proname,
10741076
strip_trailing_ws(SvPV(ERRSV,PL_na)))));
10751077
}
10761078

@@ -1127,7 +1129,8 @@ plperl_call_perl_trigger_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo,
11271129
LEAVE;
11281130
/* XXX need to find a way to assign an errcode here */
11291131
ereport(ERROR,
1130-
(errmsg("error from Perl trigger function: %s",
1132+
(errmsg("error from Perl function \"%s\": %s",
1133+
desc->proname,
11311134
strip_trailing_ws(SvPV(ERRSV,PL_na)))));
11321135
}
11331136

@@ -1403,7 +1406,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
14031406
{
14041407
HeapTupleprocTup;
14051408
Form_pg_procprocStruct;
1406-
charinternal_proname[64];
1409+
charinternal_proname[NAMEDATALEN];
14071410
plperl_proc_desc*prodesc=NULL;
14081411
inti;
14091412
plperl_proc_entry*hash_entry;
@@ -1448,10 +1451,11 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
14481451

14491452
if (!uptodate)
14501453
{
1451-
free(prodesc);/* are we leaking memory here? */
1454+
free(prodesc->proname);
1455+
free(prodesc);
14521456
prodesc=NULL;
14531457
hash_search(plperl_proc_hash,internal_proname,
1454-
HASH_REMOVE,NULL);
1458+
HASH_REMOVE,NULL);
14551459
}
14561460
}
14571461

@@ -1482,7 +1486,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
14821486
(errcode(ERRCODE_OUT_OF_MEMORY),
14831487
errmsg("out of memory")));
14841488
MemSet(prodesc,0,sizeof(plperl_proc_desc));
1485-
prodesc->proname=strdup(internal_proname);
1489+
prodesc->proname=strdup(NameStr(procStruct->proname));
14861490
prodesc->fn_xmin=HeapTupleHeaderGetXmin(procTup->t_data);
14871491
prodesc->fn_tid=procTup->t_self;
14881492

@@ -1628,7 +1632,9 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
16281632

16291633
check_interp(prodesc->lanpltrusted);
16301634

1631-
prodesc->reference=plperl_create_sub(proc_source,prodesc->lanpltrusted);
1635+
prodesc->reference=plperl_create_sub(prodesc->proname,
1636+
proc_source,
1637+
prodesc->lanpltrusted);
16321638

16331639
restore_context(oldcontext);
16341640

‎src/pl/tcl/pltcl.c

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* pltcl.c- PostgreSQL support for Tcl as
33
* procedural language (PL)
44
*
5-
* $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.114 2007/09/28 22:33:20 momjian Exp $
5+
* $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.115 2007/10/05 17:06:11 tgl Exp $
66
*
77
**********************************************************************/
88

@@ -76,7 +76,8 @@ PG_MODULE_MAGIC;
7676
**********************************************************************/
7777
typedefstructpltcl_proc_desc
7878
{
79-
char*proname;
79+
char*user_proname;
80+
char*internal_proname;
8081
TransactionIdfn_xmin;
8182
ItemPointerDatafn_tid;
8283
boolfn_readonly;
@@ -549,7 +550,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
549550
************************************************************/
550551
Tcl_DStringInit(&tcl_cmd);
551552
Tcl_DStringInit(&list_tmp);
552-
Tcl_DStringAppendElement(&tcl_cmd,prodesc->proname);
553+
Tcl_DStringAppendElement(&tcl_cmd,prodesc->internal_proname);
553554

554555
/************************************************************
555556
* Add all call arguments to the command
@@ -636,9 +637,10 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
636637
UTF_BEGIN;
637638
ereport(ERROR,
638639
(errmsg("%s",interp->result),
639-
errcontext("%s",
640+
errcontext("%s\nin PL/Tcl function \"%s\"",
640641
UTF_U2E(Tcl_GetVar(interp,"errorInfo",
641-
TCL_GLOBAL_ONLY)))));
642+
TCL_GLOBAL_ONLY)),
643+
prodesc->user_proname)));
642644
UTF_END;
643645
}
644646

@@ -723,7 +725,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
723725
PG_TRY();
724726
{
725727
/* The procedure name */
726-
Tcl_DStringAppendElement(&tcl_cmd,prodesc->proname);
728+
Tcl_DStringAppendElement(&tcl_cmd,prodesc->internal_proname);
727729

728730
/* The trigger name for argument TG_name */
729731
Tcl_DStringAppendElement(&tcl_cmd,trigdata->tg_trigger->tgname);
@@ -865,9 +867,10 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
865867
UTF_BEGIN;
866868
ereport(ERROR,
867869
(errmsg("%s",interp->result),
868-
errcontext("%s",
870+
errcontext("%s\nin PL/Tcl function \"%s\"",
869871
UTF_U2E(Tcl_GetVar(interp,"errorInfo",
870-
TCL_GLOBAL_ONLY)))));
872+
TCL_GLOBAL_ONLY)),
873+
prodesc->user_proname)));
871874
UTF_END;
872875
}
873876

@@ -1085,7 +1088,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
10851088
(errcode(ERRCODE_OUT_OF_MEMORY),
10861089
errmsg("out of memory")));
10871090
MemSet(prodesc,0,sizeof(pltcl_proc_desc));
1088-
prodesc->proname=strdup(internal_proname);
1091+
prodesc->user_proname=strdup(NameStr(procStruct->proname));
1092+
prodesc->internal_proname=strdup(internal_proname);
10891093
prodesc->fn_xmin=HeapTupleHeaderGetXmin(procTup->t_data);
10901094
prodesc->fn_tid=procTup->t_self;
10911095

@@ -1101,7 +1105,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
11011105
0,0,0);
11021106
if (!HeapTupleIsValid(langTup))
11031107
{
1104-
free(prodesc->proname);
1108+
free(prodesc->user_proname);
1109+
free(prodesc->internal_proname);
11051110
free(prodesc);
11061111
elog(ERROR,"cache lookup failed for language %u",
11071112
procStruct->prolang);
@@ -1126,7 +1131,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
11261131
0,0,0);
11271132
if (!HeapTupleIsValid(typeTup))
11281133
{
1129-
free(prodesc->proname);
1134+
free(prodesc->user_proname);
1135+
free(prodesc->internal_proname);
11301136
free(prodesc);
11311137
elog(ERROR,"cache lookup failed for type %u",
11321138
procStruct->prorettype);
@@ -1140,15 +1146,17 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
11401146
/* okay */ ;
11411147
elseif (procStruct->prorettype==TRIGGEROID)
11421148
{
1143-
free(prodesc->proname);
1149+
free(prodesc->user_proname);
1150+
free(prodesc->internal_proname);
11441151
free(prodesc);
11451152
ereport(ERROR,
11461153
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
11471154
errmsg("trigger functions can only be called as triggers")));
11481155
}
11491156
else
11501157
{
1151-
free(prodesc->proname);
1158+
free(prodesc->user_proname);
1159+
free(prodesc->internal_proname);
11521160
free(prodesc);
11531161
ereport(ERROR,
11541162
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -1159,7 +1167,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
11591167

11601168
if (typeStruct->typtype==TYPTYPE_COMPOSITE)
11611169
{
1162-
free(prodesc->proname);
1170+
free(prodesc->user_proname);
1171+
free(prodesc->internal_proname);
11631172
free(prodesc);
11641173
ereport(ERROR,
11651174
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -1187,7 +1196,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
11871196
0,0,0);
11881197
if (!HeapTupleIsValid(typeTup))
11891198
{
1190-
free(prodesc->proname);
1199+
free(prodesc->user_proname);
1200+
free(prodesc->internal_proname);
11911201
free(prodesc);
11921202
elog(ERROR,"cache lookup failed for type %u",
11931203
procStruct->proargtypes.values[i]);
@@ -1197,7 +1207,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
11971207
/* Disallow pseudotype argument */
11981208
if (typeStruct->typtype==TYPTYPE_PSEUDO)
11991209
{
1200-
free(prodesc->proname);
1210+
free(prodesc->user_proname);
1211+
free(prodesc->internal_proname);
12011212
free(prodesc);
12021213
ereport(ERROR,
12031214
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -1305,7 +1316,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
13051316
Tcl_DStringFree(&proc_internal_def);
13061317
if (tcl_rc!=TCL_OK)
13071318
{
1308-
free(prodesc->proname);
1319+
free(prodesc->user_proname);
1320+
free(prodesc->internal_proname);
13091321
free(prodesc);
13101322
elog(ERROR,"could not create internal procedure \"%s\": %s",
13111323
internal_proname,interp->result);
@@ -1315,7 +1327,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid)
13151327
* Add the proc description block to the hashtable
13161328
************************************************************/
13171329
hashent=Tcl_CreateHashEntry(pltcl_proc_hash,
1318-
prodesc->proname,&hashnew);
1330+
prodesc->internal_proname,&hashnew);
13191331
Tcl_SetHashValue(hashent, (ClientData)prodesc);
13201332
}
13211333

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp