From: Tom Lane Date: Thu, 28 Apr 2016 15:50:58 +0000 (-0400) Subject: Adjust DatumGetBool macro, this time for sure. X-Git-Tag: REL9_2_17~11 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c563d97c6bfd63e4d533bf01d0074d3a47e7a12c;p=postgresql 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. --- diff --git a/src/include/postgres.h b/src/include/postgres.h index 90cd3d5553..b34b93d8e4 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