]> granicus.if.org Git - postgresql/commitdiff
Improve efficiency of recent changes to plperl's sv2cstr().
authorAndrew Dunstan <andrew@dunslane.net>
Sun, 15 Jan 2012 21:20:39 +0000 (16:20 -0500)
committerAndrew Dunstan <andrew@dunslane.net>
Sun, 15 Jan 2012 21:20:39 +0000 (16:20 -0500)
Along the way, add a missing dependency in the GNUmakefile.

Alex Hunsaker, with a slight adjustment by me.

src/pl/plperl/GNUmakefile
src/pl/plperl/expected/plperl_elog.out
src/pl/plperl/plperl_helpers.h
src/pl/plperl/sql/plperl_elog.sql

index 55f48cd401a15e05c02feec089e7cd8fe9619c41..2f448018a42a8ca95f27f3c227a1b1d51fa33943 100644 (file)
@@ -72,11 +72,11 @@ perlchunks.h: $(PERLCHUNKS)
 
 all: all-lib
 
-SPI.c: SPI.xs
+SPI.c: SPI.xs plperl_helpers.h
        @if [ x"$(perl_privlibexp)" = x"" ]; then echo "configure switch --with-perl was not specified."; exit 1; fi
        $(PERL) $(XSUBPPDIR)/ExtUtils/xsubpp -typemap $(perl_privlibexp)/ExtUtils/typemap $< >$@
 
-Util.c: Util.xs
+Util.c: Util.xs plperl_helpers.h
        @if [ x"$(perl_privlibexp)" = x"" ]; then echo "configure switch --with-perl was not specified."; exit 1; fi
        $(PERL) $(XSUBPPDIR)/ExtUtils/xsubpp -typemap $(perl_privlibexp)/ExtUtils/typemap $< >$@
 
index 02497d9e02bea1b865b35d148c6750a2f7649d0f..60eade8dddac8e5b9c7f674ad5be83195363d066 100644 (file)
@@ -58,3 +58,7 @@ select uses_global();
  uses_global worked
 (1 row)
 
+-- make sure we don't choke on readonly values
+do language plperl $$ elog(NOTICE, ${^TAINT}); $$;
+NOTICE:  0
+CONTEXT:  PL/Perl anonymous code block
index 800a408ac4cd7f0a76978c22c516f6fda5711838..35e1257457ff2d6ea57015ab42a273461e9862cf 100644 (file)
@@ -47,28 +47,35 @@ sv2cstr(SV *sv)
 {
        char       *val, *res;
        STRLEN          len;
-       SV         *nsv;
 
        /*
         * get a utf8 encoded char * out of perl. *note* it may not be valid utf8!
         *
         * SvPVutf8() croaks nastily on certain things, like typeglobs and
         * readonly objects such as $^V. That's a perl bug - it's not supposed to
-        * happen. To avoid crashing the backend, we make a copy of the
-        * sv before passing it to SvPVutf8(). The copy is garbage collected 
+        * happen. To avoid crashing the backend, we make a copy of the sv before
+        * passing it to SvPVutf8(). The copy is garbage collected 
         * when we're done with it.
         */
-       nsv = newSVsv(sv);
-       val = SvPVutf8(nsv, len);
+       if (SvREADONLY(sv) ||
+               isGV_with_GP(sv) ||
+               (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM))
+               sv = newSVsv(sv);
+       else
+               /* increase the reference count so we cant just SvREFCNT_dec() it when
+                * we are done */
+               SvREFCNT_inc(sv);
+
+       val = SvPVutf8(sv, len);
 
        /*
         * we use perl's length in the event we had an embedded null byte to ensure
         * we error out properly
         */
-       res =  utf_u2e(val, len);
+       res = utf_u2e(val, len);
 
        /* safe now to garbage collect the new SV */
-       SvREFCNT_dec(nsv);
+       SvREFCNT_dec(sv);
 
        return res;
 }
index 4f1c014efbdf2ba59d308a6cf19a771af345dc01..40896a48f482c840986e31df59596060ee51f0a2 100644 (file)
@@ -43,3 +43,6 @@ create or replace function uses_global() returns text language plperl as $$
 $$;
 
 select uses_global();
+
+-- make sure we don't choke on readonly values
+do language plperl $$ elog(NOTICE, ${^TAINT}); $$;