]> granicus.if.org Git - postgresql/commitdiff
PL/Perl portability fix: absorb relevant -D switches from Perl.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 31 Jul 2017 16:38:35 +0000 (12:38 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
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 =