From c563d97c6bfd63e4d533bf01d0074d3a47e7a12c Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 28 Apr 2016 11:50:58 -0400
Subject: [PATCH] Adjust DatumGetBool macro, this time for sure.

Commit 23a41573c attempted to fix the DatumGetBool macro to ignore bits
in a Datum that are to the left of the actual bool value.  But it did that
by casting the Datum to bool; and on compilers that use C99 semantics for
bool, that ends up being a whole-word test, not a 1-byte test.  This seems
to be the true explanation for contrib/seg failing in VS2015.  To fix, use
GET_1_BYTE() explicitly.  I think in the previous patch, I'd had some idea
of not having to commit to bool being exactly 1 byte wide, but regardless
of what the compiler's bool is, boolean columns and Datums are certainly
1 byte wide.

The previous fix was (eventually) back-patched into all active versions,
so do likewise with this one.
---
 src/include/postgres.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/include/postgres.h b/src/include/postgres.h
index 90cd3d55532..b34b93d8e4f 100644
--- a/src/include/postgres.h
+++ b/src/include/postgres.h
@@ -326,7 +326,7 @@ typedef Datum *DatumPtr;
  * the left of the width of bool, per comment above.
  */
 
-#define DatumGetBool(X) ((bool) (((bool) (X)) != 0))
+#define DatumGetBool(X) ((bool) (GET_1_BYTE(X) != 0))
 
 /*
  * BoolGetDatum
-- 
GitLab