From a11cf4334138c3af8504c71a091b4f5c317776ef Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Thu, 4 Aug 2011 13:05:32 -0400 Subject: [PATCH] Restore the primacy of postgres.h in plpython.c. To avoid having the python headers hijack various definitions, we now include them after all the system headers we want, having first undefined some of the things they want to define. After that's done we restore the things they scribbled on that matter, namely our snprintf and vsnprintf macros, if we're using them. --- src/pl/plpython/plpython.c | 95 +++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 28 deletions(-) diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c index e03d7cead0..da34a1732e 100644 --- a/src/pl/plpython/plpython.c +++ b/src/pl/plpython/plpython.c @@ -6,6 +6,56 @@ ********************************************************************* */ +#include "postgres.h" + +/* system stuff */ +#include +#include + +/* postgreSQL stuff */ +#include "catalog/pg_proc.h" +#include "catalog/pg_type.h" +#include "commands/trigger.h" +#include "executor/spi.h" +#include "funcapi.h" +#include "fmgr.h" +#include "mb/pg_wchar.h" +#include "miscadmin.h" +#include "nodes/makefuncs.h" +#include "parser/parse_type.h" +#include "tcop/tcopprot.h" +#include "access/transam.h" +#include "access/xact.h" +#include "utils/builtins.h" +#include "utils/hsearch.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" +#include "utils/rel.h" +#include "utils/syscache.h" +#include "utils/typcache.h" + +/* + * Undefine some things that get (re)defined in the + * Python headers. They aren't used below and we've + * already included all the headers we need, so this + * should be pretty safe. + */ + +#undef _POSIX_C_SOURCE +#undef _XOPEN_SOURCE +#undef HAVE_STRERROR +#undef HAVE_TZNAME + +/* + * Sometimes python carefully scribbles on our *printf macros. + * So we undefine them here and redefine them after it's done its dirty deed. + */ + +#ifdef USE_REPL_SNPRINTF +#undef snprintf +#undef vsnprintf +#endif + #if defined(_MSC_VER) && defined(_DEBUG) /* Python uses #pragma to bring in a non-default libpython on VC++ if * _DEBUG is defined */ @@ -84,34 +134,6 @@ typedef int Py_ssize_t; PyObject_HEAD_INIT(type) size, #endif -#include "postgres.h" - -/* system stuff */ -#include -#include - -/* postgreSQL stuff */ -#include "catalog/pg_proc.h" -#include "catalog/pg_type.h" -#include "commands/trigger.h" -#include "executor/spi.h" -#include "funcapi.h" -#include "fmgr.h" -#include "mb/pg_wchar.h" -#include "miscadmin.h" -#include "nodes/makefuncs.h" -#include "parser/parse_type.h" -#include "tcop/tcopprot.h" -#include "access/transam.h" -#include "access/xact.h" -#include "utils/builtins.h" -#include "utils/hsearch.h" -#include "utils/lsyscache.h" -#include "utils/memutils.h" -#include "utils/rel.h" -#include "utils/syscache.h" -#include "utils/typcache.h" - /* define our text domain for translations */ #undef TEXTDOMAIN #define TEXTDOMAIN PG_TEXTDOMAIN("plpython") @@ -119,6 +141,23 @@ typedef int Py_ssize_t; #include #include +/* put back our snprintf and vsnprintf */ +#ifdef USE_REPL_SNPRINTF +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsnprintf +#undef vsnprintf +#endif +#ifdef __GNUC__ +#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__) +#define snprintf(...) pg_snprintf(__VA_ARGS__) +#else +#define vsnprintf pg_vsnprintf +#define snprintf pg_snprintf +#endif /* __GNUC__ */ +#endif /* USE_REPL_SNPRINTF */ + PG_MODULE_MAGIC; /* convert Postgresql Datum or tuple into a PyObject.