diff options
author | Tom Lane | 2016-04-28 15:50:58 +0000 |
---|---|---|
committer | Tom Lane | 2016-04-28 15:51:26 +0000 |
commit | a6c6789c46843988f8eef4afc462311f41bd6e27 (patch) | |
tree | 6d0a9d51f7d8f55f2cdb2e0643f507d6307ca5d1 | |
parent | cbff4b7085d779759e0e287ec3534d3da9ce72ab (diff) |
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.
-rw-r--r-- | src/include/postgres.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/include/postgres.h b/src/include/postgres.h index d14440951e4..7de7ff2fad2 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 |