On 10/27/2010 11:38 PM, Tom Lane wrote:
Andrew Dunstan<and...@dunslane.net> writes:
But I think we can do better than this. We should really pass an hashref
with the record's column names as keys rather than just calling
record_out. I'll work on that.
Definitely. If you aren't providing that info then it's hard to write
a generic function, which is more or less the whole point here. I'd
even argue that it'd be nice if the function could find out the data
types of the record's columns; though I have no idea what a reasonable
API for that would be in Perl.
Well, it turns out that the hashref required exactly one more line to
achieve. We already have all the infrastructure on the composite
handling code, and all it requires it to enable it for the RECORDOID case.
As for your idea of exposing type info, we could certainly do that using
the same mechanism we use for the trigger $_TD stuff.
Patch so far attached.
cheers
andrew
*** a/src/pl/plperl/plperl.c
--- b/src/pl/plperl/plperl.c
***************
*** 1371,1377 **** plperl_validator(PG_FUNCTION_ARGS)
&argtypes, &argnames, &argmodes);
for (i = 0; i < numargs; i++)
{
! if (get_typtype(argtypes[i]) == TYPTYPE_PSEUDO)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("PL/Perl functions cannot accept type %s",
--- 1371,1378 ----
&argtypes, &argnames, &argmodes);
for (i = 0; i < numargs; i++)
{
! if (get_typtype(argtypes[i]) == TYPTYPE_PSEUDO &&
! argtypes[i] != RECORDOID)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("PL/Perl functions cannot accept type %s",
***************
*** 2105,2111 **** compile_plperl_function(Oid fn_oid, bool is_trigger)
typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
/* Disallow pseudotype argument */
! if (typeStruct->typtype == TYPTYPE_PSEUDO)
{
free(prodesc->proname);
free(prodesc);
--- 2106,2113 ----
typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
/* Disallow pseudotype argument */
! if (typeStruct->typtype == TYPTYPE_PSEUDO &&
! procStruct->proargtypes.values[i] != RECORDOID)
{
free(prodesc->proname);
free(prodesc);
***************
*** 2115,2121 **** compile_plperl_function(Oid fn_oid, bool is_trigger)
format_type_be(procStruct->proargtypes.values[i]))));
}
! if (typeStruct->typtype == TYPTYPE_COMPOSITE)
prodesc->arg_is_rowtype[i] = true;
else
{
--- 2117,2124 ----
format_type_be(procStruct->proargtypes.values[i]))));
}
! if (typeStruct->typtype == TYPTYPE_COMPOSITE ||
! procStruct->proargtypes.values[i] == RECORDOID)
prodesc->arg_is_rowtype[i] = true;
else
{
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers