11/**********************************************************************
22 * plperl.c - perl as a procedural language for PostgreSQL
33 *
4- * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.128 2007/04/02 03 :49:41 tgl Exp $
4+ * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.129 2007/06/28 17 :49:59 tgl Exp $
55 *
66 **********************************************************************/
77
@@ -547,7 +547,7 @@ plperl_build_tuple_result(HV *perlhash, AttInMetadata *attinmeta)
547547(errcode (ERRCODE_UNDEFINED_COLUMN ),
548548errmsg ("Perl hash contains nonexistent column \"%s\"" ,
549549key )));
550- if (SvOK (val )&& SvTYPE ( val ) != SVt_NULL )
550+ if (SvOK (val ))
551551values [attn - 1 ]= SvPV (val ,PL_na );
552552}
553553hv_iterinit (perlhash );
@@ -743,7 +743,7 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup)
743743& typinput ,& typioparam );
744744fmgr_info (typinput ,& finfo );
745745atttypmod = tupdesc -> attrs [attn - 1 ]-> atttypmod ;
746- if (SvOK (val )&& SvTYPE ( val ) != SVt_NULL )
746+ if (SvOK (val ))
747747{
748748modvalues [slotsused ]= InputFunctionCall (& finfo ,
749749SvPV (val ,PL_na ),
@@ -1197,9 +1197,10 @@ plperl_func_handler(PG_FUNCTION_ARGS)
11971197 * If the Perl function returned an arrayref, we pretend that it
11981198 * called return_next() for each element of the array, to handle old
11991199 * SRFs that didn't know about return_next(). Any other sort of return
1200- * value is an error.
1200+ * value is an error, except undef which means return an empty set .
12011201 */
1202- if (SvTYPE (perlret )== SVt_RV &&
1202+ if (SvOK (perlret )&&
1203+ SvTYPE (perlret )== SVt_RV &&
12031204SvTYPE (SvRV (perlret ))== SVt_PVAV )
12041205{
12051206int i = 0 ;
@@ -1212,7 +1213,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
12121213i ++ ;
12131214}
12141215}
1215- else if (SvTYPE (perlret )!= SVt_NULL )
1216+ else if (SvOK (perlret ))
12161217{
12171218ereport (ERROR ,
12181219(errcode (ERRCODE_DATATYPE_MISMATCH ),
@@ -1228,7 +1229,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
12281229}
12291230retval = (Datum )0 ;
12301231}
1231- else if (SvTYPE (perlret )== SVt_NULL )
1232+ else if (! SvOK (perlret ))
12321233{
12331234/* Return NULL if Perl code returned undef */
12341235if (rsi && IsA (rsi ,ReturnSetInfo ))
@@ -1335,7 +1336,7 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
13351336if (SPI_finish ()!= SPI_OK_FINISH )
13361337elog (ERROR ,"SPI_finish() failed" );
13371338
1338- if (!( perlret && SvOK ( perlret ) && SvTYPE (perlret ) != SVt_NULL ))
1339+ if (perlret == NULL || ! SvOK (perlret ))
13391340{
13401341/* undef result means go ahead with original tuple */
13411342TriggerData * trigdata = ((TriggerData * )fcinfo -> context );
@@ -1900,7 +1901,7 @@ plperl_return_next(SV *sv)
19001901Datum ret ;
19011902bool isNull ;
19021903
1903- if (SvOK (sv )&& SvTYPE ( sv ) != SVt_NULL )
1904+ if (SvOK (sv ))
19041905{
19051906char * val = SvPV (sv ,PL_na );
19061907
@@ -2292,7 +2293,7 @@ plperl_spi_exec_prepared(char *query, HV *attr, int argc, SV **argv)
22922293
22932294for (i = 0 ;i < argc ;i ++ )
22942295{
2295- if (SvTYPE (argv [i ])!= SVt_NULL )
2296+ if (SvOK (argv [i ]))
22962297{
22972298argvalues [i ]= InputFunctionCall (& qdesc -> arginfuncs [i ],
22982299SvPV (argv [i ],PL_na ),
@@ -2423,7 +2424,7 @@ plperl_spi_query_prepared(char *query, int argc, SV **argv)
24232424
24242425for (i = 0 ;i < argc ;i ++ )
24252426{
2426- if (SvTYPE (argv [i ])!= SVt_NULL )
2427+ if (SvOK (argv [i ]))
24272428{
24282429argvalues [i ]= InputFunctionCall (& qdesc -> arginfuncs [i ],
24292430SvPV (argv [i ],PL_na ),