*** 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
  				{
