11/**********************************************************************
22 * plperl.c - perl as a procedural language for PostgreSQL
33 *
4- * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.114 2006/08/11 19:42:35 momjian Exp $
4+ * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.115 2006/08/12 04:16:45 momjian Exp $
55 *
66 **********************************************************************/
77
@@ -52,7 +52,6 @@ typedef struct plperl_proc_desc
5252FmgrInfo result_in_func ;/* I/O function and arg for result type */
5353Oid result_typioparam ;
5454int nargs ;
55- int num_out_args ;/* number of out arguments */
5655FmgrInfo arg_out_func [FUNC_MAX_ARGS ];
5756bool arg_is_rowtype [FUNC_MAX_ARGS ];
5857SV * reference ;
@@ -116,9 +115,6 @@ static SV *plperl_hash_from_tuple(HeapTuple tuple, TupleDesc tupdesc);
116115static void plperl_init_shared_libs (pTHX );
117116static HV * plperl_spi_execute_fetch_result (SPITupleTable * ,int ,int );
118117
119- static SV * plperl_convert_to_pg_array (SV * src );
120- static SV * plperl_transform_result (plperl_proc_desc * prodesc ,SV * result );
121-
122118/*
123119 * This routine is a crock, and so is everyplace that calls it. The problem
124120 * is that the cached form of plperl functions/queries is allocated permanently
@@ -408,12 +404,7 @@ plperl_build_tuple_result(HV *perlhash, AttInMetadata *attinmeta)
408404(errcode (ERRCODE_UNDEFINED_COLUMN ),
409405errmsg ("Perl hash contains nonexistent column \"%s\"" ,
410406key )));
411-
412- /* if value is ref on array do to pg string array conversion */
413- if (SvTYPE (val )== SVt_RV &&
414- SvTYPE (SvRV (val ))== SVt_PVAV )
415- values [attn - 1 ]= SvPV (plperl_convert_to_pg_array (val ),PL_na );
416- else if (SvOK (val )&& SvTYPE (val )!= SVt_NULL )
407+ if (SvOK (val )&& SvTYPE (val )!= SVt_NULL )
417408values [attn - 1 ]= SvPV (val ,PL_na );
418409}
419410hv_iterinit (perlhash );
@@ -690,7 +681,12 @@ plperl_validator(PG_FUNCTION_ARGS)
690681HeapTuple tuple ;
691682Form_pg_proc proc ;
692683char functyptype ;
684+ int numargs ;
685+ Oid * argtypes ;
686+ char * * argnames ;
687+ char * argmodes ;
693688bool istrigger = false;
689+ int i ;
694690
695691/* Get the new function's pg_proc entry */
696692tuple = SearchSysCache (PROCOID ,
@@ -718,6 +714,18 @@ plperl_validator(PG_FUNCTION_ARGS)
718714format_type_be (proc -> prorettype ))));
719715}
720716
717+ /* Disallow pseudotypes in arguments (either IN or OUT) */
718+ numargs = get_func_arg_info (tuple ,
719+ & argtypes ,& argnames ,& argmodes );
720+ for (i = 0 ;i < numargs ;i ++ )
721+ {
722+ if (get_typtype (argtypes [i ])== 'p' )
723+ ereport (ERROR ,
724+ (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
725+ errmsg ("plperl functions cannot take type %s" ,
726+ format_type_be (argtypes [i ]))));
727+ }
728+
721729ReleaseSysCache (tuple );
722730
723731/* Postpone body checks if !check_function_bodies */
@@ -1120,8 +1128,6 @@ plperl_func_handler(PG_FUNCTION_ARGS)
11201128/* Return a perl string converted to a Datum */
11211129char * val ;
11221130
1123- perlret = plperl_transform_result (prodesc ,perlret );
1124-
11251131if (prodesc -> fn_retisarray && SvROK (perlret )&&
11261132SvTYPE (SvRV (perlret ))== SVt_PVAV )
11271133{
@@ -1250,6 +1256,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
12501256char internal_proname [64 ];
12511257int proname_len ;
12521258plperl_proc_desc * prodesc = NULL ;
1259+ int i ;
12531260SV * * svp ;
12541261
12551262/* We'll need the pg_proc tuple in any case... */
@@ -1312,12 +1319,6 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
13121319Datum prosrcdatum ;
13131320bool isnull ;
13141321char * proc_source ;
1315- int i ;
1316- int numargs ;
1317- Oid * argtypes ;
1318- char * * argnames ;
1319- char * argmodes ;
1320-
13211322
13221323/************************************************************
13231324 * Allocate a new procedure description block
@@ -1336,25 +1337,6 @@ compile_plperl_function(Oid fn_oid, bool is_trigger)
13361337prodesc -> fn_readonly =
13371338(procStruct -> provolatile != PROVOLATILE_VOLATILE );
13381339
1339-
1340- /* Disallow pseudotypes in arguments (either IN or OUT) */
1341- /* Count number of out arguments */
1342- numargs = get_func_arg_info (procTup ,
1343- & argtypes ,& argnames ,& argmodes );
1344- for (i = 0 ;i < numargs ;i ++ )
1345- {
1346- if (get_typtype (argtypes [i ])== 'p' )
1347- ereport (ERROR ,
1348- (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
1349- errmsg ("plperl functions cannot take type %s" ,
1350- format_type_be (argtypes [i ]))));
1351-
1352- if (argmodes && argmodes [i ]== PROARGMODE_OUT )
1353- prodesc -> num_out_args ++ ;
1354-
1355- }
1356-
1357-
13581340/************************************************************
13591341 * Lookup the pg_language tuple by Oid
13601342 ************************************************************/
@@ -1694,8 +1676,6 @@ plperl_return_next(SV *sv)
16941676fcinfo = current_call_data -> fcinfo ;
16951677rsi = (ReturnSetInfo * )fcinfo -> resultinfo ;
16961678
1697- sv = plperl_transform_result (prodesc ,sv );
1698-
16991679if (!prodesc -> fn_retisset )
17001680ereport (ERROR ,
17011681(errcode (ERRCODE_SYNTAX_ERROR ),
@@ -1773,16 +1753,7 @@ plperl_return_next(SV *sv)
17731753
17741754if (SvOK (sv )&& SvTYPE (sv )!= SVt_NULL )
17751755{
1776- char * val ;
1777- SV * array_ret ;
1778-
1779- if (SvROK (sv )&& SvTYPE (SvRV (sv ))== SVt_PVAV )
1780- {
1781- array_ret = plperl_convert_to_pg_array (sv );
1782- sv = array_ret ;
1783- }
1784-
1785- val = SvPV (sv ,PL_na );
1756+ char * val = SvPV (sv ,PL_na );
17861757
17871758ret = InputFunctionCall (& prodesc -> result_in_func ,val ,
17881759prodesc -> result_typioparam ,-1 );
@@ -2397,46 +2368,3 @@ plperl_spi_freeplan(char *query)
23972368
23982369SPI_freeplan (plan );
23992370}
2400-
2401- /*
2402- * If plerl result is hash and fce result is scalar, it's hash form of
2403- * out argument. Then, transform it to scalar
2404- */
2405-
2406- static SV *
2407- plperl_transform_result (plperl_proc_desc * prodesc ,SV * result )
2408- {
2409- bool exactly_one_field = false;
2410- HV * hvr ;
2411- SV * val ;
2412- char * key ;
2413- I32 klen ;
2414-
2415-
2416- if (prodesc -> num_out_args == 1 && SvOK (result )
2417- && SvTYPE (result )== SVt_RV && SvTYPE (SvRV (result ))== SVt_PVHV )
2418- {
2419- hvr = (HV * )SvRV (result );
2420- hv_iterinit (hvr );
2421-
2422- while ((val = hv_iternextsv (hvr ,& key ,& klen )))
2423- {
2424- if (exactly_one_field )
2425- ereport (ERROR ,
2426- (errcode (ERRCODE_UNDEFINED_COLUMN ),
2427- errmsg ("Perl hash contains nonexistent column \"%s\"" ,
2428- key )));
2429- exactly_one_field = true;
2430- result = val ;
2431- }
2432-
2433- if (!exactly_one_field )
2434- ereport (ERROR ,
2435- (errcode (ERRCODE_UNDEFINED_COLUMN ),
2436- errmsg ("Perl hash is empty" )));
2437-
2438- hv_iterinit (hvr );
2439- }
2440-
2441- return result ;
2442- }