PL/Perl portability fix: absorb relevant -D switches from Perl.
authorTom Lane
Mon, 31 Jul 2017 16:38:35 +0000 (12:38 -0400)
committerTom Lane
Mon, 31 Jul 2017 16:38:35 +0000 (12:38 -0400)
Back-patch of commit 3c163a7fc76debbbdad1bdd3c43721cffe72f4db,
which see for more info.

Also throw in commit b4cc35fbb709bd6fcae8998f041fd731c9acbf42,
so Coverity doesn't whine about the back branches.

Ashutosh Sharma, some adjustments by me

Discussion: https://postgr.es/m/CANFyU97OVQ3+Mzfmt3MhuUm5NwPU=-FtbNH5Eb7nZL9ua8=rcA@mail.gmail.com

config/perl.m4
configure
configure.in
contrib/hstore_plperl/Makefile
src/Makefile.global.in
src/pl/plperl/GNUmakefile
src/pl/plperl/plperl.c
src/tools/msvc/Mkvcbuild.pm

index bed2eae57fe21af61dd764408ae3c038eee7fa16..9706c4de6aca951b9187c0b3f689faf581084ddf 100644 (file)
@@ -49,6 +49,31 @@ AC_DEFUN([PGAC_CHECK_PERL_CONFIGS],
 [m4_foreach([pgac_item], [$1], [PGAC_CHECK_PERL_CONFIG(pgac_item)])])
 
 
+# PGAC_CHECK_PERL_EMBED_CCFLAGS
+# -----------------------------
+# We selectively extract stuff from $Config{ccflags}.  We don't really need
+# anything except -D switches, and other sorts of compiler switches can
+# actively break things if Perl was compiled with a different compiler.
+# Moreover, although Perl likes to put stuff like -D_LARGEFILE_SOURCE and
+# -D_FILE_OFFSET_BITS=64 here, it would be fatal to try to compile PL/Perl
+# to a different libc ABI than core Postgres uses.  The available information
+# says that all the symbols that affect Perl's own ABI begin with letters,
+# so it should be sufficient to adopt -D switches for symbols not beginning
+# with underscore.
+# For debugging purposes, let's have the configure output report the raw
+# ccflags value as well as the set of flags we chose to adopt.
+AC_DEFUN([PGAC_CHECK_PERL_EMBED_CCFLAGS],
+[AC_REQUIRE([PGAC_PATH_PERL])
+AC_MSG_CHECKING([for CFLAGS recommended by Perl])
+perl_ccflags=`$PERL -MConfig -e ['print $Config{ccflags}']`
+AC_MSG_RESULT([$perl_ccflags])
+AC_MSG_CHECKING([for CFLAGS to compile embedded Perl])
+perl_embed_ccflags=`$PERL -MConfig -e ['foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/)}']`
+AC_SUBST(perl_embed_ccflags)dnl
+AC_MSG_RESULT([$perl_embed_ccflags])
+])# PGAC_CHECK_PERL_EMBED_CCFLAGS
+
+
 # PGAC_CHECK_PERL_EMBED_LDFLAGS
 # -----------------------------
 # We are after Embed's ldopts, but without the subset mentioned in
index 50461e2faa8f99be39d30f29c71caf8de91c85fb..190027bafb6111f890dd6381a8d86859ba1f656f 100755 (executable)
--- a/configure
+++ b/configure
@@ -670,6 +670,7 @@ python_version
 python_majorversion
 PYTHON
 perl_embed_ldflags
+perl_embed_ccflags
 perl_useshrplib
 perl_privlibexp
 perl_archlibexp
@@ -7511,6 +7512,18 @@ documentation for details.  Use --without-perl to disable building
 PL/Perl." "$LINENO" 5
   fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAGS recommended by Perl" >&5
+$as_echo_n "checking for CFLAGS recommended by Perl... " >&6; }
+perl_ccflags=`$PERL -MConfig -e 'print $Config{ccflags}'`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $perl_ccflags" >&5
+$as_echo "$perl_ccflags" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAGS to compile embedded Perl" >&5
+$as_echo_n "checking for CFLAGS to compile embedded Perl... " >&6; }
+perl_embed_ccflags=`$PERL -MConfig -e 'foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/)}'`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $perl_embed_ccflags" >&5
+$as_echo "$perl_embed_ccflags" >&6; }
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flags to link embedded Perl" >&5
 $as_echo_n "checking for flags to link embedded Perl... " >&6; }
 if test "$PORTNAME" = "win32" ; then
index 35f3a7d0c7237e24d79e7714543aa43728cb285d..53c9674780b729a9847fb818d328ae0ed108e5c4 100644 (file)
@@ -928,6 +928,7 @@ You might have to rebuild your Perl installation.  Refer to the
 documentation for details.  Use --without-perl to disable building
 PL/Perl.])
   fi
+  PGAC_CHECK_PERL_EMBED_CCFLAGS
   PGAC_CHECK_PERL_EMBED_LDFLAGS
 fi
 
index b3b8654bc80d068528002452a3bba66da3efc7c1..8fdca04bfb931b74b5daf45415819bd247083f6e 100644 (file)
@@ -43,4 +43,4 @@ endif
 # last, probably because it sometimes contains some header files with names
 # that clash with some of ours, or with some that we include, notably on
 # Windows.
-override CPPFLAGS := $(CPPFLAGS) -I$(perl_archlibexp)/CORE
+override CPPFLAGS := $(CPPFLAGS) $(perl_embed_ccflags) -I$(perl_archlibexp)/CORE
index 8ac7ca7d2bf729721b95a5e1f6e861c162663ecc..cb939b5855116da192b0c6629f93684a795db891 100644 (file)
@@ -298,6 +298,7 @@ else
 endif
 perl_archlibexp        = @perl_archlibexp@
 perl_privlibexp        = @perl_privlibexp@
+perl_embed_ccflags = @perl_embed_ccflags@
 perl_embed_ldflags = @perl_embed_ldflags@
 
 # Miscellaneous
index b8e3585254426a1c5794e15c473e6fe2cdadfb7d..191f74067a6583b4ab75ccc68312fc873d42dd2f 100644 (file)
@@ -12,7 +12,11 @@ override CPPFLAGS += -DPLPERL_HAVE_UID_GID
 override CPPFLAGS += -Wno-comment
 endif
 
-override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) -I$(perl_archlibexp)/CORE
+# Note: we need to make sure that the CORE directory is included last,
+# probably because it sometimes contains some header files with names
+# that clash with some of ours, or with some that we include, notably on
+# Windows.
+override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) $(perl_embed_ccflags) -I$(perl_archlibexp)/CORE
 
 rpathdir = $(perl_archlibexp)/CORE
 
index e58c85c7b476fd3617604e669c0cd591801db89e..f4180117a58adb503cb7f1bdc8378ab853ef7bbc 100644 (file)
@@ -3248,12 +3248,18 @@ plperl_return_next_internal(SV *sv)
 
        /*
         * This is the first call to return_next in the current PL/Perl
-        * function call, so memoize some lookups
+        * function call, so identify the output tuple descriptor and create a
+        * tuplestore to hold the result rows.
         */
        if (prodesc->fn_retistuple)
            (void) get_call_result_type(fcinfo, NULL, &tupdesc);
        else
+       {
            tupdesc = rsi->expectedDesc;
+           /* Protect assumption below that we return exactly one column */
+           if (tupdesc == NULL || tupdesc->natts != 1)
+               elog(ERROR, "expected single-column result descriptor for non-composite SETOF result");
+       }
 
        /*
         * Make sure the tuple_store and ret_tdesc are sufficiently
@@ -3301,20 +3307,20 @@ plperl_return_next_internal(SV *sv)
    }
    else
    {
-       Datum       ret;
-       bool        isNull;
+       Datum       ret[1];
+       bool        isNull[1];
 
-       ret = plperl_sv_to_datum(sv,
-                                prodesc->result_oid,
-                                -1,
-                                fcinfo,
-                                &prodesc->result_in_func,
-                                prodesc->result_typioparam,
-                                &isNull);
+       ret[0] = plperl_sv_to_datum(sv,
+                                   prodesc->result_oid,
+                                   -1,
+                                   fcinfo,
+                                   &prodesc->result_in_func,
+                                   prodesc->result_typioparam,
+                                   &isNull[0]);
 
        tuplestore_putvalues(current_call_data->tuple_store,
                             current_call_data->ret_tdesc,
-                            &ret, &isNull);
+                            ret, isNull);
    }
 
    MemoryContextSwitchTo(old_cxt);
index 6285aab2b65f934417242fa97332769b0c5d94f6..f3bd30540a27b8b88e38a150902500e511ba749a 100644 (file)
@@ -516,7 +516,26 @@ sub mkvcbuild
        my $plperl =
          $solution->AddProject('plperl', 'dll', 'PLs', 'src/pl/plperl');
        $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE');
-       $plperl->AddDefine('PLPERL_HAVE_UID_GID');
+
+       # Add defines from Perl's ccflags; see PGAC_CHECK_PERL_EMBED_CCFLAGS
+       my @perl_embed_ccflags;
+       foreach my $f (split(" ",$Config{ccflags}))
+       {
+           if ($f =~ /^-D[^_]/)
+           {
+               $f =~ s/\-D//;
+               push(@perl_embed_ccflags, $f);
+           }
+       }
+
+       # XXX this probably is redundant now?
+       push(@perl_embed_ccflags, 'PLPERL_HAVE_UID_GID');
+
+       foreach my $f (@perl_embed_ccflags)
+       {
+           $plperl->AddDefine($f);
+       }
+
        foreach my $xs ('SPI.xs', 'Util.xs')
        {
            (my $xsc = $xs) =~ s/\.xs/.c/;
@@ -599,7 +618,11 @@ sub mkvcbuild
            'hstore_plperl', 'contrib/hstore_plperl',
            'plperl',        'src/pl/plperl',
            'hstore',        'contrib/hstore');
-       $hstore_plperl->AddDefine('PLPERL_HAVE_UID_GID');
+
+       foreach my $f (@perl_embed_ccflags)
+       {
+           $hstore_plperl->AddDefine($f);
+       }
    }
 
    $mf =