Update plperl to use ereport() not elog() for user-facing messages,
so that they will be translatable. Give messages some semblance of conformance to the style guide.
This commit is contained in:
parent
71929165e8
commit
af434fcdf4
@ -33,7 +33,7 @@
|
|||||||
* ENHANCEMENTS, OR MODIFICATIONS.
|
* ENHANCEMENTS, OR MODIFICATIONS.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.64 2004/11/24 18:47:38 tgl Exp $
|
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.65 2004/11/29 20:11:05 tgl Exp $
|
||||||
*
|
*
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
@ -200,7 +200,7 @@ plperl_init_interp(void)
|
|||||||
|
|
||||||
plperl_interp = perl_alloc();
|
plperl_interp = perl_alloc();
|
||||||
if (!plperl_interp)
|
if (!plperl_interp)
|
||||||
elog(ERROR, "could not allocate perl interpreter");
|
elog(ERROR, "could not allocate Perl interpreter");
|
||||||
|
|
||||||
perl_construct(plperl_interp);
|
perl_construct(plperl_interp);
|
||||||
perl_parse(plperl_interp, plperl_init_shared_libs, 3, embedding, NULL);
|
perl_parse(plperl_interp, plperl_init_shared_libs, 3, embedding, NULL);
|
||||||
@ -233,8 +233,8 @@ plperl_safe_init(void)
|
|||||||
"$PLContainer->permit_only(':default');"
|
"$PLContainer->permit_only(':default');"
|
||||||
"$PLContainer->share(qw[&elog &ERROR ]);"
|
"$PLContainer->share(qw[&elog &ERROR ]);"
|
||||||
"sub ::mksafefunc { return $PLContainer->reval(qq[sub { "
|
"sub ::mksafefunc { return $PLContainer->reval(qq[sub { "
|
||||||
"elog(ERROR,'trusted perl functions disabled - "
|
"elog(ERROR,'trusted Perl functions disabled - "
|
||||||
"please upgrade perl Safe module to at least 2.09');}]); }"
|
"please upgrade Perl Safe module to version 2.09 or later');}]); }"
|
||||||
;
|
;
|
||||||
|
|
||||||
SV *res;
|
SV *res;
|
||||||
@ -291,7 +291,10 @@ plperl_build_tuple_result(HV *perlhash, AttInMetadata *attinmeta)
|
|||||||
int attn = SPI_fnumber(td, key);
|
int attn = SPI_fnumber(td, key);
|
||||||
|
|
||||||
if (attn <= 0 || td->attrs[attn - 1]->attisdropped)
|
if (attn <= 0 || td->attrs[attn - 1]->attisdropped)
|
||||||
elog(ERROR, "plperl: invalid attribute \"%s\" in hash", key);
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_UNDEFINED_COLUMN),
|
||||||
|
errmsg("Perl hash contains nonexistent column \"%s\"",
|
||||||
|
key)));
|
||||||
if (SvTYPE(val) != SVt_NULL)
|
if (SvTYPE(val) != SVt_NULL)
|
||||||
values[attn - 1] = SvPV(val, PL_na);
|
values[attn - 1] = SvPV(val, PL_na);
|
||||||
}
|
}
|
||||||
@ -408,8 +411,9 @@ get_function_tupdesc(Oid result_type, ReturnSetInfo *rsinfo)
|
|||||||
if (!rsinfo || !IsA(rsinfo, ReturnSetInfo) ||
|
if (!rsinfo || !IsA(rsinfo, ReturnSetInfo) ||
|
||||||
rsinfo->expectedDesc == NULL)
|
rsinfo->expectedDesc == NULL)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
errmsg("could not determine row description for function returning record")));
|
errmsg("function returning record called in context "
|
||||||
|
"that cannot accept type record")));
|
||||||
return rsinfo->expectedDesc;
|
return rsinfo->expectedDesc;
|
||||||
}
|
}
|
||||||
else /* ordinary composite type */
|
else /* ordinary composite type */
|
||||||
@ -439,9 +443,13 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup)
|
|||||||
|
|
||||||
svp = hv_fetch(hvTD, "new", 3, FALSE);
|
svp = hv_fetch(hvTD, "new", 3, FALSE);
|
||||||
if (!svp)
|
if (!svp)
|
||||||
elog(ERROR, "plperl: key \"new\" not found");
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_UNDEFINED_COLUMN),
|
||||||
|
errmsg("$_TD->{new} does not exist")));
|
||||||
if (SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
|
if (SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
|
||||||
elog(ERROR, "plperl: $_TD->{new} is not a hash reference");
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||||
|
errmsg("$_TD->{new} is not a hash reference")));
|
||||||
hvNew = (HV *) SvRV(*svp);
|
hvNew = (HV *) SvRV(*svp);
|
||||||
|
|
||||||
modattrs = palloc(tupdesc->natts * sizeof(int));
|
modattrs = palloc(tupdesc->natts * sizeof(int));
|
||||||
@ -455,7 +463,10 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup)
|
|||||||
int attn = SPI_fnumber(tupdesc, key);
|
int attn = SPI_fnumber(tupdesc, key);
|
||||||
|
|
||||||
if (attn <= 0 || tupdesc->attrs[attn - 1]->attisdropped)
|
if (attn <= 0 || tupdesc->attrs[attn - 1]->attisdropped)
|
||||||
elog(ERROR, "plperl: invalid attribute \"%s\" in hash", key);
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_UNDEFINED_COLUMN),
|
||||||
|
errmsg("Perl hash contains nonexistent column \"%s\"",
|
||||||
|
key)));
|
||||||
if (SvTYPE(val) != SVt_NULL)
|
if (SvTYPE(val) != SVt_NULL)
|
||||||
{
|
{
|
||||||
Oid typinput;
|
Oid typinput;
|
||||||
@ -490,7 +501,7 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup)
|
|||||||
pfree(modnulls);
|
pfree(modnulls);
|
||||||
|
|
||||||
if (rtup == NULL)
|
if (rtup == NULL)
|
||||||
elog(ERROR, "plperl: SPI_modifytuple failed: %s",
|
elog(ERROR, "SPI_modifytuple failed: %s",
|
||||||
SPI_result_code_string(SPI_result));
|
SPI_result_code_string(SPI_result));
|
||||||
|
|
||||||
return rtup;
|
return rtup;
|
||||||
@ -594,8 +605,10 @@ plperl_create_sub(char *s, bool trusted)
|
|||||||
PUTBACK;
|
PUTBACK;
|
||||||
FREETMPS;
|
FREETMPS;
|
||||||
LEAVE;
|
LEAVE;
|
||||||
elog(ERROR, "creation of function failed: %s",
|
ereport(ERROR,
|
||||||
strip_trailing_ws(SvPV(ERRSV, PL_na)));
|
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||||
|
errmsg("creation of Perl function failed: %s",
|
||||||
|
strip_trailing_ws(SvPV(ERRSV, PL_na)))));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -722,8 +735,10 @@ plperl_call_perl_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo)
|
|||||||
PUTBACK;
|
PUTBACK;
|
||||||
FREETMPS;
|
FREETMPS;
|
||||||
LEAVE;
|
LEAVE;
|
||||||
elog(ERROR, "error from function: %s",
|
/* XXX need to find a way to assign an errcode here */
|
||||||
strip_trailing_ws(SvPV(ERRSV, PL_na)));
|
ereport(ERROR,
|
||||||
|
(errmsg("error from Perl function: %s",
|
||||||
|
strip_trailing_ws(SvPV(ERRSV, PL_na)))));
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = newSVsv(POPs);
|
retval = newSVsv(POPs);
|
||||||
@ -780,8 +795,10 @@ plperl_call_perl_trigger_func(plperl_proc_desc *desc, FunctionCallInfo fcinfo,
|
|||||||
PUTBACK;
|
PUTBACK;
|
||||||
FREETMPS;
|
FREETMPS;
|
||||||
LEAVE;
|
LEAVE;
|
||||||
elog(ERROR, "error from trigger function: %s",
|
/* XXX need to find a way to assign an errcode here */
|
||||||
strip_trailing_ws(SvPV(ERRSV, PL_na)));
|
ereport(ERROR,
|
||||||
|
(errmsg("error from Perl trigger function: %s",
|
||||||
|
strip_trailing_ws(SvPV(ERRSV, PL_na)))));
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = newSVsv(POPs);
|
retval = newSVsv(POPs);
|
||||||
@ -857,7 +874,9 @@ plperl_func_handler(PG_FUNCTION_ARGS)
|
|||||||
AttInMetadata *attinmeta;
|
AttInMetadata *attinmeta;
|
||||||
|
|
||||||
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
|
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
|
||||||
elog(ERROR, "plperl: set-returning function must return reference to array");
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||||
|
errmsg("set-returning Perl function must return reference to array")));
|
||||||
ret_av = (AV *) SvRV(perlret);
|
ret_av = (AV *) SvRV(perlret);
|
||||||
|
|
||||||
if (SRF_IS_FIRSTCALL())
|
if (SRF_IS_FIRSTCALL())
|
||||||
@ -893,7 +912,9 @@ plperl_func_handler(PG_FUNCTION_ARGS)
|
|||||||
Assert(svp != NULL);
|
Assert(svp != NULL);
|
||||||
|
|
||||||
if (SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
|
if (SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
|
||||||
elog(ERROR, "plperl: element of result array is not a reference to hash");
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||||
|
errmsg("elements of Perl result array must be reference to hash")));
|
||||||
row_hv = (HV *) SvRV(*svp);
|
row_hv = (HV *) SvRV(*svp);
|
||||||
|
|
||||||
tuple = plperl_build_tuple_result(row_hv, attinmeta);
|
tuple = plperl_build_tuple_result(row_hv, attinmeta);
|
||||||
@ -913,7 +934,9 @@ plperl_func_handler(PG_FUNCTION_ARGS)
|
|||||||
FuncCallContext *funcctx;
|
FuncCallContext *funcctx;
|
||||||
|
|
||||||
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
|
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
|
||||||
elog(ERROR, "plperl: set-returning function must return reference to array");
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||||
|
errmsg("set-returning Perl function must return reference to array")));
|
||||||
ret_av = (AV *) SvRV(perlret);
|
ret_av = (AV *) SvRV(perlret);
|
||||||
|
|
||||||
if (SRF_IS_FIRSTCALL())
|
if (SRF_IS_FIRSTCALL())
|
||||||
@ -966,7 +989,9 @@ plperl_func_handler(PG_FUNCTION_ARGS)
|
|||||||
HeapTuple tup;
|
HeapTuple tup;
|
||||||
|
|
||||||
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVHV)
|
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVHV)
|
||||||
elog(ERROR, "plperl: composite-returning function must return a reference to hash");
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||||
|
errmsg("composite-returning Perl function must return reference to hash")));
|
||||||
perlhash = (HV *) SvRV(perlret);
|
perlhash = (HV *) SvRV(perlret);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1036,7 +1061,7 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
|
|||||||
* because SPI_finish would free it).
|
* because SPI_finish would free it).
|
||||||
************************************************************/
|
************************************************************/
|
||||||
if (SPI_finish() != SPI_OK_FINISH)
|
if (SPI_finish() != SPI_OK_FINISH)
|
||||||
elog(ERROR, "plperl: SPI_finish() failed");
|
elog(ERROR, "SPI_finish() failed");
|
||||||
|
|
||||||
if (!(perlret && SvOK(perlret) && SvTYPE(perlret) != SVt_NULL))
|
if (!(perlret && SvOK(perlret) && SvTYPE(perlret) != SVt_NULL))
|
||||||
{
|
{
|
||||||
@ -1073,13 +1098,17 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
|
|||||||
trigdata->tg_newtuple);
|
trigdata->tg_newtuple);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elog(WARNING, "plperl: ignoring modified tuple in DELETE trigger");
|
ereport(WARNING,
|
||||||
|
(errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
|
||||||
|
errmsg("ignoring modified tuple in DELETE trigger")));
|
||||||
trv = NULL;
|
trv = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elog(ERROR, "plperl: expected trigger result to be undef, \"SKIP\" or \"MODIFY\"");
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED),
|
||||||
|
errmsg("result of Perl trigger function must be undef, \"SKIP\" or \"MODIFY\"")));
|
||||||
trv = NULL;
|
trv = NULL;
|
||||||
}
|
}
|
||||||
retval = PointerGetDatum(trv);
|
retval = PointerGetDatum(trv);
|
||||||
@ -1318,7 +1347,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
|
|||||||
************************************************************/
|
************************************************************/
|
||||||
prodesc->reference = plperl_create_sub(proc_source, prodesc->lanpltrusted);
|
prodesc->reference = plperl_create_sub(proc_source, prodesc->lanpltrusted);
|
||||||
pfree(proc_source);
|
pfree(proc_source);
|
||||||
if (!prodesc->reference)
|
if (!prodesc->reference) /* can this happen? */
|
||||||
{
|
{
|
||||||
free(prodesc->proname);
|
free(prodesc->proname);
|
||||||
free(prodesc);
|
free(prodesc);
|
||||||
|
@ -119,9 +119,9 @@ CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
|
|||||||
];
|
];
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT perl_set();
|
SELECT perl_set();
|
||||||
ERROR: plperl: element of result array is not a reference to hash
|
ERROR: elements of Perl result array must be reference to hash
|
||||||
SELECT * FROM perl_set();
|
SELECT * FROM perl_set();
|
||||||
ERROR: plperl: element of result array is not a reference to hash
|
ERROR: elements of Perl result array must be reference to hash
|
||||||
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
|
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
|
||||||
return [
|
return [
|
||||||
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
|
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
|
||||||
@ -166,7 +166,7 @@ CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
|
|||||||
return {f2 => 'hello', f1 => 1, f3 => 'world'};
|
return {f2 => 'hello', f1 => 1, f3 => 'world'};
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT perl_record();
|
SELECT perl_record();
|
||||||
ERROR: could not determine row description for function returning record
|
ERROR: function returning record called in context that cannot accept type record
|
||||||
SELECT * FROM perl_record();
|
SELECT * FROM perl_record();
|
||||||
ERROR: a column definition list is required for functions returning "record"
|
ERROR: a column definition list is required for functions returning "record"
|
||||||
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
|
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
|
||||||
@ -198,11 +198,11 @@ CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
|
|||||||
];
|
];
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT perl_record_set();
|
SELECT perl_record_set();
|
||||||
ERROR: could not determine row description for function returning record
|
ERROR: function returning record called in context that cannot accept type record
|
||||||
SELECT * FROM perl_record_set();
|
SELECT * FROM perl_record_set();
|
||||||
ERROR: a column definition list is required for functions returning "record"
|
ERROR: a column definition list is required for functions returning "record"
|
||||||
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
|
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
|
||||||
ERROR: plperl: element of result array is not a reference to hash
|
ERROR: elements of Perl result array must be reference to hash
|
||||||
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
|
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
|
||||||
return [
|
return [
|
||||||
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
|
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
|
||||||
@ -211,7 +211,7 @@ CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
|
|||||||
];
|
];
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT perl_record_set();
|
SELECT perl_record_set();
|
||||||
ERROR: could not determine row description for function returning record
|
ERROR: function returning record called in context that cannot accept type record
|
||||||
SELECT * FROM perl_record_set();
|
SELECT * FROM perl_record_set();
|
||||||
ERROR: a column definition list is required for functions returning "record"
|
ERROR: a column definition list is required for functions returning "record"
|
||||||
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
|
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
|
||||||
@ -240,12 +240,12 @@ CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
|
|||||||
return {y => 3, z => 4};
|
return {y => 3, z => 4};
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT * FROM foo_bad();
|
SELECT * FROM foo_bad();
|
||||||
ERROR: plperl: invalid attribute "z" in hash
|
ERROR: Perl hash contains nonexistent column "z"
|
||||||
CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
|
CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
|
||||||
return 42;
|
return 42;
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT * FROM foo_bad();
|
SELECT * FROM foo_bad();
|
||||||
ERROR: plperl: composite-returning function must return a reference to hash
|
ERROR: composite-returning Perl function must return reference to hash
|
||||||
CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
|
CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
|
||||||
return [
|
return [
|
||||||
[1, 2],
|
[1, 2],
|
||||||
@ -253,17 +253,17 @@ return [
|
|||||||
];
|
];
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT * FROM foo_bad();
|
SELECT * FROM foo_bad();
|
||||||
ERROR: plperl: composite-returning function must return a reference to hash
|
ERROR: composite-returning Perl function must return reference to hash
|
||||||
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
||||||
return 42;
|
return 42;
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT * FROM foo_set_bad();
|
SELECT * FROM foo_set_bad();
|
||||||
ERROR: plperl: set-returning function must return reference to array
|
ERROR: set-returning Perl function must return reference to array
|
||||||
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
||||||
return {y => 3, z => 4};
|
return {y => 3, z => 4};
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT * FROM foo_set_bad();
|
SELECT * FROM foo_set_bad();
|
||||||
ERROR: plperl: set-returning function must return reference to array
|
ERROR: set-returning Perl function must return reference to array
|
||||||
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
||||||
return [
|
return [
|
||||||
[1, 2],
|
[1, 2],
|
||||||
@ -271,14 +271,14 @@ return [
|
|||||||
];
|
];
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT * FROM foo_set_bad();
|
SELECT * FROM foo_set_bad();
|
||||||
ERROR: plperl: element of result array is not a reference to hash
|
ERROR: elements of Perl result array must be reference to hash
|
||||||
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
|
||||||
return [
|
return [
|
||||||
{y => 3, z => 4}
|
{y => 3, z => 4}
|
||||||
];
|
];
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
SELECT * FROM foo_set_bad();
|
SELECT * FROM foo_set_bad();
|
||||||
ERROR: plperl: invalid attribute "z" in hash
|
ERROR: Perl hash contains nonexistent column "z"
|
||||||
CREATE OR REPLACE FUNCTION perl_get_field(footype, text) RETURNS integer AS $$
|
CREATE OR REPLACE FUNCTION perl_get_field(footype, text) RETURNS integer AS $$
|
||||||
return $_[0]->{$_[1]};
|
return $_[0]->{$_[1]};
|
||||||
$$ LANGUAGE plperl;
|
$$ LANGUAGE plperl;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user