Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e248016

Browse files
committed
plperl was not being quite paranoid enough about detecting 'undef' values
returned by Perl. Per report from Nicolas Addington.
1 parent 6ff4087 commit e248016

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/pl/plperl/plperl.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* ENHANCEMENTS, OR MODIFICATIONS.
3434
*
3535
* IDENTIFICATION
36-
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.65 2004/11/29 20:11:05 tgl Exp $
36+
* $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.66 2005/01/11 06:08:45 tgl Exp $
3737
*
3838
**********************************************************************/
3939

@@ -295,7 +295,7 @@ plperl_build_tuple_result(HV *perlhash, AttInMetadata *attinmeta)
295295
(errcode(ERRCODE_UNDEFINED_COLUMN),
296296
errmsg("Perl hash contains nonexistent column \"%s\"",
297297
key)));
298-
if (SvTYPE(val) != SVt_NULL)
298+
if (SvOK(val) && SvTYPE(val) != SVt_NULL)
299299
values[attn - 1] = SvPV(val, PL_na);
300300
}
301301
hv_iterinit(perlhash);
@@ -446,7 +446,7 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup)
446446
ereport(ERROR,
447447
(errcode(ERRCODE_UNDEFINED_COLUMN),
448448
errmsg("$_TD->{new} does not exist")));
449-
if (SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
449+
if (!SvOK(*svp) || SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
450450
ereport(ERROR,
451451
(errcode(ERRCODE_DATATYPE_MISMATCH),
452452
errmsg("$_TD->{new} is not a hash reference")));
@@ -467,7 +467,7 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup)
467467
(errcode(ERRCODE_UNDEFINED_COLUMN),
468468
errmsg("Perl hash contains nonexistent column \"%s\"",
469469
key)));
470-
if (SvTYPE(val) != SVt_NULL)
470+
if (SvOK(val) && SvTYPE(val) != SVt_NULL)
471471
{
472472
Oid typinput;
473473
Oid typioparam;
@@ -873,7 +873,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
873873
TupleDesc tupdesc;
874874
AttInMetadata *attinmeta;
875875

876-
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
876+
if (!SvOK(perlret) || SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
877877
ereport(ERROR,
878878
(errcode(ERRCODE_DATATYPE_MISMATCH),
879879
errmsg("set-returning Perl function must return reference to array")));
@@ -911,7 +911,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
911911
svp = av_fetch(ret_av, funcctx->call_cntr, FALSE);
912912
Assert(svp != NULL);
913913

914-
if (SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
914+
if (!SvOK(*svp) || SvTYPE(*svp) != SVt_RV || SvTYPE(SvRV(*svp)) != SVt_PVHV)
915915
ereport(ERROR,
916916
(errcode(ERRCODE_DATATYPE_MISMATCH),
917917
errmsg("elements of Perl result array must be reference to hash")));
@@ -933,7 +933,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
933933
AV *ret_av;
934934
FuncCallContext *funcctx;
935935

936-
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
936+
if (!SvOK(perlret) || SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVAV)
937937
ereport(ERROR,
938938
(errcode(ERRCODE_DATATYPE_MISMATCH),
939939
errmsg("set-returning Perl function must return reference to array")));
@@ -957,7 +957,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
957957
svp = av_fetch(ret_av, funcctx->call_cntr, FALSE);
958958
Assert(svp != NULL);
959959

960-
if (SvTYPE(*svp) != SVt_NULL)
960+
if (SvOK(*svp) && SvTYPE(*svp) != SVt_NULL)
961961
{
962962
char *val = SvPV(*svp, PL_na);
963963

@@ -988,7 +988,7 @@ plperl_func_handler(PG_FUNCTION_ARGS)
988988
AttInMetadata *attinmeta;
989989
HeapTuple tup;
990990

991-
if (SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVHV)
991+
if (!SvOK(perlret) || SvTYPE(perlret) != SVt_RV || SvTYPE(SvRV(perlret)) != SVt_PVHV)
992992
ereport(ERROR,
993993
(errcode(ERRCODE_DATATYPE_MISMATCH),
994994
errmsg("composite-returning Perl function must return reference to hash")));

0 commit comments

Comments
 (0)