From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andrew Gierth <andrew@tao11.riddles.org.uk>
Cc: Amit Kapila <amit.kapila16@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Cc: Michael Meskes <meskes@postgresql.org>
Subject: Re: define bool in pgtypeslib_extern.h
Date: Thu, 07 Nov 2019 15:47:52 -0500
Message-ID: <21017.1573159672@sss.pgh.pa.us> (raw)
In-Reply-To: <32373.1572110364@sss.pgh.pa.us>
References: <CAA4eK1LmaKO7Du9M9Lo=kxGU8sB6aL8fa3sF6z6d5yYYVe3BuQ@mail.gmail.com>
<16583.1572010913@sss.pgh.pa.us>
<18578.1572020755@sss.pgh.pa.us>
<CAA4eK1LUFKhiq4vfrvG089wtSvnbfAs3sdTFdbuq428bQ7wCzg@mail.gmail.com>
<32373.1572110364@sss.pgh.pa.us>
I wrote:
> I'm inclined to think that we need to make ecpglib.h's bool-related
> definitions exactly match c.h, which will mean that it has to pull in
> <stdbool.h> on most platforms, which will mean adding a control symbol
> for that to ecpg_config.h. I do not think we should export
> HAVE_STDBOOL_H and SIZEOF_BOOL there though; probably better to have
> configure make the choice and export something named like PG_USE_STDBOOL.
Here's a proposed patch that does it like that.
I'm of two minds about whether to back-patch or not. This shouldn't
really change anything except on platforms where sizeof(_Bool) isn't
one. We have some reason to think that nobody is actually using
ecpg on such platforms :-(, because if they were, they'd likely have
complained about breakage. So maybe we should just put this in HEAD
and be done.
regards, tom lane
Attachments:
[text/x-diff] make-ecpgs-bool-definition-match-c-h.patch (5.8K, ../21017.1573159672@sss.pgh.pa.us/2-make-ecpgs-bool-definition-match-c-h.patch)
download | inline diff:diff --git a/configure b/configureindex 7312bd7..21ee193 100755--- a/configure+++ b/configure@@ -14729,6 +14729,12 @@ _ACEOF+if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then++$as_echo "#define PG_USE_STDBOOL 1" >>confdefs.h++fi+
##
## Functions, global variables
diff --git a/configure.in b/configure.inindex ea83d92..d128e59 100644--- a/configure.in+++ b/configure.in@@ -1590,6 +1590,13 @@ AC_CHECK_SIZEOF([bool], [],
#include <stdbool.h>
#endif])
+dnl We use <stdbool.h> if we have it and it declares type bool as having+dnl size 1. Otherwise, c.h will fall back to declaring bool as unsigned char.+if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then+ AC_DEFINE([PG_USE_STDBOOL], 1,+ [Define to 1 to use <stdbool.h> to define type bool.])+fi+
##
## Functions, global variables
diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.cindex be68478..c8d2cef 100644--- a/src/backend/utils/fmgr/dfmgr.c+++ b/src/backend/utils/fmgr/dfmgr.c@@ -23,7 +23,7 @@
* On macOS, <dlfcn.h> insists on including <stdbool.h>. If we're not
* using stdbool, undef bool to undo the damage.
*/
-#ifndef USE_STDBOOL+#ifndef PG_USE_STDBOOL
#ifdef bool
#undef bool
#endif
diff --git a/src/include/c.h b/src/include/c.hindex c95acd3..5f800a3 100644--- a/src/include/c.h+++ b/src/include/c.h@@ -288,20 +288,21 @@
* bool
* Boolean value, either true or false.
*
- * Use stdbool.h if available and its bool has size 1. That's useful for+ * We use stdbool.h if available and its bool has size 1. That's useful for
* better compiler and debugger output and for compatibility with third-party
* libraries. But PostgreSQL currently cannot deal with bool of other sizes;
* there are static assertions around the code to prevent that.
*
* For C++ compilers, we assume the compiler has a compatible built-in
* definition of bool.
+ *+ * Note: this stanza also appears in src/interfaces/ecpg/include/ecpglib.h.
*/
#ifndef __cplusplus
-#if defined(HAVE_STDBOOL_H) && SIZEOF_BOOL == 1+#ifdef PG_USE_STDBOOL
#include <stdbool.h>
-#define USE_STDBOOL 1
#else
#ifndef bool
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.inindex 2bf5060..249161c 100644--- a/src/include/pg_config.h.in+++ b/src/include/pg_config.h.in@@ -823,6 +823,9 @@
/* Define to best printf format archetype, usually gnu_printf if available. */
#undef PG_PRINTF_ATTRIBUTE
+/* Define to 1 to use <stdbool.h> to define type bool. */+#undef PG_USE_STDBOOL+
/* PostgreSQL version as a string */
#undef PG_VERSION
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32index 6b67fb0..6c98ef4 100644--- a/src/include/pg_config.h.win32+++ b/src/include/pg_config.h.win32@@ -624,6 +624,9 @@
(--with-krb-srvnam=NAME) */
#define PG_KRB_SRVNAM "postgres"
+/* Define to 1 to use <stdbool.h> to define type bool. */+#define PG_USE_STDBOOL 1+
/* A string containing the version number, platform, and C compiler */
#define PG_VERSION_STR "Uninitialized version string (win32)"
diff --git a/src/interfaces/ecpg/include/ecpg_config.h.in b/src/interfaces/ecpg/include/ecpg_config.h.inindex c185561..17e93c4 100644--- a/src/interfaces/ecpg/include/ecpg_config.h.in+++ b/src/interfaces/ecpg/include/ecpg_config.h.in@@ -10,6 +10,9 @@
/* Define to 1 if `long long int' works and is 64 bits. */
#undef HAVE_LONG_LONG_INT_64
+/* Define to 1 to use <stdbool.h> to define type bool. */+#undef PG_USE_STDBOOL+
/* Define to 1 to build client libraries as thread-safe code.
* (--enable-thread-safety) */
#undef ENABLE_THREAD_SAFETY
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.hindex de9c76a..5cb31e2 100644--- a/src/interfaces/ecpg/include/ecpglib.h+++ b/src/interfaces/ecpg/include/ecpglib.h@@ -1,6 +1,6 @@
/*
- * this is a small part of c.h since we don't want to leak all postgres- * definitions into ecpg programs+ * Client-visible declarations for ecpglib+ *
* src/interfaces/ecpg/include/ecpglib.h
*/
@@ -8,30 +8,36 @@
#define _ECPGLIB_H
#include "libpq-fe.h"
+#include "ecpg_config.h"
#include "ecpgtype.h"
#include "sqlca.h"
#include <string.h>
+/*+ * this is a small extract from c.h since we don't want to leak all postgres+ * definitions into ecpg programs; but we need to know what bool is.+ */
#ifndef __cplusplus
++#ifdef PG_USE_STDBOOL+#include <stdbool.h>+#else+
#ifndef bool
-#define bool char-#endif /* ndef bool */+typedef unsigned char bool;+#endif
#ifndef true
#define true ((bool) 1)
-#endif /* ndef true */+#endif+
#ifndef false
#define false ((bool) 0)
-#endif /* ndef false */-#endif /* not C++ */+#endif-#ifndef TRUE-#define TRUE 1-#endif /* TRUE */+#endif+#endif /* not C++ */-#ifndef FALSE-#define FALSE 0-#endif /* FALSE */
#ifdef __cplusplus
extern "C"
diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.hindex 3748158..7ae3c69 100644--- a/src/pl/plperl/plperl.h+++ b/src/pl/plperl/plperl.h@@ -64,7 +64,7 @@
* warnings. If PostgreSQL does not but Perl does, we need to undefine bool
* after we include the Perl headers; see below.
*/
-#ifdef USE_STDBOOL+#ifdef PG_USE_STDBOOL
#define HAS_BOOL 1
#endif
@@ -175,7 +175,7 @@
* makes bool a macro, but our own replacement is a typedef, so the undef
* makes ours visible again).
*/
-#ifndef USE_STDBOOL+#ifndef PG_USE_STDBOOL
#ifdef bool
#undef bool
#endif
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pmindex a695827..7f179f1 100644--- a/src/tools/msvc/Solution.pm+++ b/src/tools/msvc/Solution.pm@@ -513,6 +513,7 @@ sub GenerateFiles
print $o <<EOF;
#define HAVE_LONG_LONG_INT 1
#define HAVE_LONG_LONG_INT_64 1
+#define PG_USE_STDBOOL 1
#define ENABLE_THREAD_SAFETY 1
EOF
close($o);
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: tgl@sss.pgh.pa.us, andrew@tao11.riddles.org.uk, amit.kapila16@gmail.com, pgsql-hackers@lists.postgresql.org, meskes@postgresql.org
Subject: Re: define bool in pgtypeslib_extern.h
In-Reply-To: <21017.1573159672@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox