On 2015-08-11 13:49:19 -0300, Alvaro Herrera wrote:
> Andres Freund wrote:
> > On 2015-08-11 12:43:03 -0400, Robert Haas wrote:
> > > On Tue, Aug 11, 2015 at 12:40 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> > > > We do not use !! elsewhere for this purpose, and I for one find it a
> > > > pretty ugly locution.
> > > 
> > > We do, actually, now, in contrib/pg_xlogdump/pg_xlogdump.c.  I'd be in
> > > favor of getting rid of those.

Those got already removed by Heikki's WAL format changes...

> > And a bunch more places actually. Blame me. I'll come up with a patch
> > fixing the macros and converting existing !! style ones.
> 
> Actually there's one that's not yours ...

I'm not touching sepgsql... ;)

I went through all headers in src/include and checked for macros
containing [^&]&[^&] and checked whether they have this hazard. Found a
fair number.

That patch also changes !! tests into != 0 style.

Greetings,

Andres Freund
>From 2c67e83b945ff9183dd3b5cdeea78f4bde5b8a74 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Wed, 12 Aug 2015 16:05:35 +0200
Subject: [PATCH] Return only 0/1 from boolean macros.

Previously some test macros returned the result of bit operations. That
obviously works without problems when used as part of a boolean
expression - but if e.g. the result is assigned to a boolean variable
the result in some cases can be less than pretty.

Depending on the source of the type definition for bool the result might
be too wide or, if going through a pointer, the result can be an invalid
value for a boolean (stdbool.h's bool e.g. only allows 0 and 1
values). The latter e.g. causes test failures with gcc when using a
stdbool.h type boolean.

As discussed also change some existing macros that forced a 0/1 return
value by using !! to != 0 comparisons.

I tried to find all relevant test macros in headers, there very well
might be additional ones in C files themselves.

Discussion: 20150811154237.gd17...@awork2.anarazel.de
---
 src/backend/access/transam/xact.c               |  3 ++-
 src/backend/replication/logical/reorderbuffer.c |  2 +-
 src/backend/storage/lmgr/lwlock.c               |  6 +++---
 src/include/access/gin_private.h                | 16 ++++++++--------
 src/include/access/gist.h                       |  8 ++++----
 src/include/access/htup_details.h               |  8 ++++----
 src/include/access/itup.h                       |  4 ++--
 src/include/access/nbtree.h                     | 14 +++++++-------
 src/include/access/spgist_private.h             | 10 +++++-----
 src/include/access/xact.h                       |  4 ++--
 src/include/catalog/pg_trigger.h                | 10 +++++-----
 src/include/commands/trigger.h                  |  2 +-
 src/include/regex/regguts.h                     |  2 +-
 src/include/storage/bufpage.h                   |  6 +++---
 src/include/utils/jsonb.h                       |  6 +++---
 15 files changed, 51 insertions(+), 50 deletions(-)

diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index b53d95f..f5ec79f 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -5310,7 +5310,8 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
 		LWLockRelease(XidGenLock);
 	}
 
-	Assert(!!(parsed->xinfo & XACT_XINFO_HAS_ORIGIN) == (origin_id != InvalidRepOriginId));
+	Assert(((parsed->xinfo & XACT_XINFO_HAS_ORIGIN) != 0) ==
+		   (origin_id != InvalidRepOriginId));
 
 	if (parsed->xinfo & XACT_XINFO_HAS_ORIGIN)
 		commit_time = parsed->origin_timestamp;
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index cdc7bd7..6664baa 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -575,7 +575,7 @@ ReorderBufferTXNByXid(ReorderBuffer *rb, TransactionId xid, bool create,
 	if (is_new)
 		*is_new = !found;
 
-	Assert(!create || !!txn);
+	Assert(!create || txn != NULL);
 	return txn;
 }
 
diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c
index 687ed63..99a1d3c 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -190,11 +190,11 @@ PRINT_LWDEBUG(const char *where, LWLock *lock, LWLockMode mode)
 				 errmsg("%d: %s(%s %d): excl %u shared %u haswaiters %u waiters %u rOK %d",
 						MyProcPid,
 						where, T_NAME(lock), T_ID(lock),
-						!!(state & LW_VAL_EXCLUSIVE),
+						(state & LW_VAL_EXCLUSIVE) != 0,
 						state & LW_SHARED_MASK,
-						!!(state & LW_FLAG_HAS_WAITERS),
+						(state & LW_FLAG_HAS_WAITERS) != 0,
 						pg_atomic_read_u32(&lock->nwaiters),
-						!!(state & LW_FLAG_RELEASE_OK))));
+						(state & LW_FLAG_RELEASE_OK) != 0)));
 	}
 }
 
diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h
index 5095fc1..1b63ead 100644
--- a/src/include/access/gin_private.h
+++ b/src/include/access/gin_private.h
@@ -112,22 +112,22 @@ typedef struct GinMetaPageData
  */
 #define GinPageGetOpaque(page) ( (GinPageOpaque) PageGetSpecialPointer(page) )
 
-#define GinPageIsLeaf(page)    ( GinPageGetOpaque(page)->flags & GIN_LEAF )
+#define GinPageIsLeaf(page)    ( (GinPageGetOpaque(page)->flags & GIN_LEAF) != 0 )
 #define GinPageSetLeaf(page)   ( GinPageGetOpaque(page)->flags |= GIN_LEAF )
 #define GinPageSetNonLeaf(page)    ( GinPageGetOpaque(page)->flags &= ~GIN_LEAF )
-#define GinPageIsData(page)    ( GinPageGetOpaque(page)->flags & GIN_DATA )
+#define GinPageIsData(page)    ( (GinPageGetOpaque(page)->flags & GIN_DATA) != 0 )
 #define GinPageSetData(page)   ( GinPageGetOpaque(page)->flags |= GIN_DATA )
-#define GinPageIsList(page)    ( GinPageGetOpaque(page)->flags & GIN_LIST )
+#define GinPageIsList(page)    ( (GinPageGetOpaque(page)->flags & GIN_LIST) != 0 )
 #define GinPageSetList(page)   ( GinPageGetOpaque(page)->flags |= GIN_LIST )
-#define GinPageHasFullRow(page)    ( GinPageGetOpaque(page)->flags & GIN_LIST_FULLROW )
+#define GinPageHasFullRow(page)    ( (GinPageGetOpaque(page)->flags & GIN_LIST_FULLROW) != 0 )
 #define GinPageSetFullRow(page)   ( GinPageGetOpaque(page)->flags |= GIN_LIST_FULLROW )
-#define GinPageIsCompressed(page)	 ( GinPageGetOpaque(page)->flags & GIN_COMPRESSED )
+#define GinPageIsCompressed(page)	 ( (GinPageGetOpaque(page)->flags & GIN_COMPRESSED) != 0 )
 #define GinPageSetCompressed(page)	 ( GinPageGetOpaque(page)->flags |= GIN_COMPRESSED )
 
-#define GinPageIsDeleted(page) ( GinPageGetOpaque(page)->flags & GIN_DELETED)
+#define GinPageIsDeleted(page) ( (GinPageGetOpaque(page)->flags & GIN_DELETED) != 0 )
 #define GinPageSetDeleted(page)    ( GinPageGetOpaque(page)->flags |= GIN_DELETED)
 #define GinPageSetNonDeleted(page) ( GinPageGetOpaque(page)->flags &= ~GIN_DELETED)
-#define GinPageIsIncompleteSplit(page) ( GinPageGetOpaque(page)->flags & GIN_INCOMPLETE_SPLIT)
+#define GinPageIsIncompleteSplit(page) ( (GinPageGetOpaque(page)->flags & GIN_INCOMPLETE_SPLIT) != 0 )
 
 #define GinPageRightMost(page) ( GinPageGetOpaque(page)->rightlink == InvalidBlockNumber)
 
@@ -224,7 +224,7 @@ typedef signed char GinNullCategory;
 #define GinGetPostingOffset(itup)	(GinItemPointerGetBlockNumber(&(itup)->t_tid) & (~GIN_ITUP_COMPRESSED))
 #define GinSetPostingOffset(itup,n) ItemPointerSetBlockNumber(&(itup)->t_tid,(n)|GIN_ITUP_COMPRESSED)
 #define GinGetPosting(itup)			((Pointer) ((char*)(itup) + GinGetPostingOffset(itup)))
-#define GinItupIsCompressed(itup)	(GinItemPointerGetBlockNumber(&(itup)->t_tid) & GIN_ITUP_COMPRESSED)
+#define GinItupIsCompressed(itup)	((GinItemPointerGetBlockNumber(&(itup)->t_tid) & GIN_ITUP_COMPRESSED) != 0)
 
 /*
  * Maximum size of an item on entry tree page. Make sure that we fit at least
diff --git a/src/include/access/gist.h b/src/include/access/gist.h
index 81e559b..f3852b6 100644
--- a/src/include/access/gist.h
+++ b/src/include/access/gist.h
@@ -126,18 +126,18 @@ typedef struct GISTENTRY
 
 #define GistPageGetOpaque(page) ( (GISTPageOpaque) PageGetSpecialPointer(page) )
 
-#define GistPageIsLeaf(page)	( GistPageGetOpaque(page)->flags & F_LEAF)
+#define GistPageIsLeaf(page)	( (GistPageGetOpaque(page)->flags & F_LEAF) != 0)
 #define GIST_LEAF(entry) (GistPageIsLeaf((entry)->page))
 
-#define GistPageIsDeleted(page) ( GistPageGetOpaque(page)->flags & F_DELETED)
+#define GistPageIsDeleted(page) ( (GistPageGetOpaque(page)->flags & F_DELETED) != 0)
 #define GistPageSetDeleted(page)	( GistPageGetOpaque(page)->flags |= F_DELETED)
 #define GistPageSetNonDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_DELETED)
 
-#define GistTuplesDeleted(page) ( GistPageGetOpaque(page)->flags & F_TUPLES_DELETED)
+#define GistTuplesDeleted(page) ( (GistPageGetOpaque(page)->flags & F_TUPLES_DELETED) != 0)
 #define GistMarkTuplesDeleted(page) ( GistPageGetOpaque(page)->flags |= F_TUPLES_DELETED)
 #define GistClearTuplesDeleted(page)	( GistPageGetOpaque(page)->flags &= ~F_TUPLES_DELETED)
 
-#define GistFollowRight(page) ( GistPageGetOpaque(page)->flags & F_FOLLOW_RIGHT)
+#define GistFollowRight(page) ( (GistPageGetOpaque(page)->flags & F_FOLLOW_RIGHT) != 0)
 #define GistMarkFollowRight(page) ( GistPageGetOpaque(page)->flags |= F_FOLLOW_RIGHT)
 #define GistClearFollowRight(page)	( GistPageGetOpaque(page)->flags &= ~F_FOLLOW_RIGHT)
 
diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h
index 8dd530bd..d954cde 100644
--- a/src/include/access/htup_details.h
+++ b/src/include/access/htup_details.h
@@ -214,7 +214,7 @@ struct HeapTupleHeaderData
  * Beware of multiple evaluations of the argument.
  */
 #define HEAP_XMAX_IS_LOCKED_ONLY(infomask) \
-	(((infomask) & HEAP_XMAX_LOCK_ONLY) || \
+	(((infomask) & HEAP_XMAX_LOCK_ONLY) != 0 || \
 	 (((infomask) & (HEAP_XMAX_IS_MULTI | HEAP_LOCK_MASK)) == HEAP_XMAX_EXCL_LOCK))
 
 /*
@@ -292,7 +292,7 @@ struct HeapTupleHeaderData
 
 #define HeapTupleHeaderXminCommitted(tup) \
 ( \
-	(tup)->t_infomask & HEAP_XMIN_COMMITTED \
+	((tup)->t_infomask & HEAP_XMIN_COMMITTED) != 0 \
 )
 
 #define HeapTupleHeaderXminInvalid(tup) \
@@ -476,7 +476,7 @@ do { \
 
 #define HeapTupleHeaderIsHeapOnly(tup) \
 ( \
-  (tup)->t_infomask2 & HEAP_ONLY_TUPLE \
+  ((tup)->t_infomask2 & HEAP_ONLY_TUPLE) != 0 \
 )
 
 #define HeapTupleHeaderSetHeapOnly(tup) \
@@ -491,7 +491,7 @@ do { \
 
 #define HeapTupleHeaderHasMatch(tup) \
 ( \
-  (tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH \
+  ((tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH) != 0 \
 )
 
 #define HeapTupleHeaderSetMatch(tup) \
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index c997545..5b88fbd 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -69,8 +69,8 @@ typedef IndexAttributeBitMapData *IndexAttributeBitMap;
 
 #define IndexTupleSize(itup)		((Size) (((IndexTuple) (itup))->t_info & INDEX_SIZE_MASK))
 #define IndexTupleDSize(itup)		((Size) ((itup).t_info & INDEX_SIZE_MASK))
-#define IndexTupleHasNulls(itup)	((((IndexTuple) (itup))->t_info & INDEX_NULL_MASK))
-#define IndexTupleHasVarwidths(itup) ((((IndexTuple) (itup))->t_info & INDEX_VAR_MASK))
+#define IndexTupleHasNulls(itup)	((((IndexTuple) (itup))->t_info & INDEX_NULL_MASK) != 0)
+#define IndexTupleHasVarwidths(itup) ((((IndexTuple) (itup))->t_info & INDEX_VAR_MASK) != 0)
 
 
 /*
diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h
index 9e48efd..bae2136 100644
--- a/src/include/access/nbtree.h
+++ b/src/include/access/nbtree.h
@@ -174,13 +174,13 @@ typedef struct BTMetaPageData
  */
 #define P_LEFTMOST(opaque)		((opaque)->btpo_prev == P_NONE)
 #define P_RIGHTMOST(opaque)		((opaque)->btpo_next == P_NONE)
-#define P_ISLEAF(opaque)		((opaque)->btpo_flags & BTP_LEAF)
-#define P_ISROOT(opaque)		((opaque)->btpo_flags & BTP_ROOT)
-#define P_ISDELETED(opaque)		((opaque)->btpo_flags & BTP_DELETED)
-#define P_ISHALFDEAD(opaque)	((opaque)->btpo_flags & BTP_HALF_DEAD)
-#define P_IGNORE(opaque)		((opaque)->btpo_flags & (BTP_DELETED|BTP_HALF_DEAD))
-#define P_HAS_GARBAGE(opaque)	((opaque)->btpo_flags & BTP_HAS_GARBAGE)
-#define P_INCOMPLETE_SPLIT(opaque)	((opaque)->btpo_flags & BTP_INCOMPLETE_SPLIT)
+#define P_ISLEAF(opaque)		(((opaque)->btpo_flags & BTP_LEAF) != 0)
+#define P_ISROOT(opaque)		(((opaque)->btpo_flags & BTP_ROOT) != 0)
+#define P_ISDELETED(opaque)		(((opaque)->btpo_flags & BTP_DELETED) != 0)
+#define P_ISHALFDEAD(opaque)	(((opaque)->btpo_flags & BTP_HALF_DEAD) != 0)
+#define P_IGNORE(opaque)		(((opaque)->btpo_flags & (BTP_DELETED|BTP_HALF_DEAD)) != 0)
+#define P_HAS_GARBAGE(opaque)	(((opaque)->btpo_flags & BTP_HAS_GARBAGE) != 0)
+#define P_INCOMPLETE_SPLIT(opaque)	(((opaque)->btpo_flags & BTP_INCOMPLETE_SPLIT) != 0)
 
 /*
  *	Lehman and Yao's algorithm requires a ``high key'' on every non-rightmost
diff --git a/src/include/access/spgist_private.h b/src/include/access/spgist_private.h
index fae1050..3a9a088 100644
--- a/src/include/access/spgist_private.h
+++ b/src/include/access/spgist_private.h
@@ -54,10 +54,10 @@ typedef SpGistPageOpaqueData *SpGistPageOpaque;
 #define SPGIST_NULLS		(1<<3)
 
 #define SpGistPageGetOpaque(page) ((SpGistPageOpaque) PageGetSpecialPointer(page))
-#define SpGistPageIsMeta(page) (SpGistPageGetOpaque(page)->flags & SPGIST_META)
-#define SpGistPageIsDeleted(page) (SpGistPageGetOpaque(page)->flags & SPGIST_DELETED)
-#define SpGistPageIsLeaf(page) (SpGistPageGetOpaque(page)->flags & SPGIST_LEAF)
-#define SpGistPageStoresNulls(page) (SpGistPageGetOpaque(page)->flags & SPGIST_NULLS)
+#define SpGistPageIsMeta(page) ((SpGistPageGetOpaque(page)->flags & SPGIST_META) != 0)
+#define SpGistPageIsDeleted(page) ((SpGistPageGetOpaque(page)->flags & SPGIST_DELETED) != 0)
+#define SpGistPageIsLeaf(page) ((SpGistPageGetOpaque(page)->flags & SPGIST_LEAF) != 0)
+#define SpGistPageStoresNulls(page) ((SpGistPageGetOpaque(page)->flags & SPGIST_NULLS) != 0)
 
 /*
  * The page ID is for the convenience of pg_filedump and similar utilities,
@@ -607,7 +607,7 @@ typedef struct spgxlogVacuumRedirect
 
 #define GBUF_PARITY_MASK		0x03
 #define GBUF_REQ_LEAF(flags)	(((flags) & GBUF_PARITY_MASK) == GBUF_LEAF)
-#define GBUF_REQ_NULLS(flags)	((flags) & GBUF_NULLS)
+#define GBUF_REQ_NULLS(flags)	(((flags) & GBUF_NULLS) != 0)
 
 /* spgutils.c */
 extern SpGistCache *spgGetCache(Relation index);
diff --git a/src/include/access/xact.h b/src/include/access/xact.h
index cb1c2db..b665912 100644
--- a/src/include/access/xact.h
+++ b/src/include/access/xact.h
@@ -149,9 +149,9 @@ typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid,
 
 /* Access macros for above flags */
 #define XactCompletionRelcacheInitFileInval(xinfo) \
-	(!!(xinfo & XACT_COMPLETION_UPDATE_RELCACHE_FILE))
+	((xinfo & XACT_COMPLETION_UPDATE_RELCACHE_FILE) != 0)
 #define XactCompletionForceSyncCommit(xinfo) \
-	(!!(xinfo & XACT_COMPLETION_FORCE_SYNC_COMMIT))
+	((xinfo & XACT_COMPLETION_FORCE_SYNC_COMMIT) != 0)
 
 typedef struct xl_xact_assignment
 {
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index a2e303f..a227b6f 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -123,14 +123,14 @@ typedef FormData_pg_trigger *Form_pg_trigger;
 #define TRIGGER_SETT_UPDATE(type)		((type) |= TRIGGER_TYPE_UPDATE)
 #define TRIGGER_SETT_TRUNCATE(type)		((type) |= TRIGGER_TYPE_TRUNCATE)
 
-#define TRIGGER_FOR_ROW(type)			((type) & TRIGGER_TYPE_ROW)
+#define TRIGGER_FOR_ROW(type)			(((type) & TRIGGER_TYPE_ROW) != 0)
 #define TRIGGER_FOR_BEFORE(type)		(((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_BEFORE)
 #define TRIGGER_FOR_AFTER(type)			(((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_AFTER)
 #define TRIGGER_FOR_INSTEAD(type)		(((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_INSTEAD)
-#define TRIGGER_FOR_INSERT(type)		((type) & TRIGGER_TYPE_INSERT)
-#define TRIGGER_FOR_DELETE(type)		((type) & TRIGGER_TYPE_DELETE)
-#define TRIGGER_FOR_UPDATE(type)		((type) & TRIGGER_TYPE_UPDATE)
-#define TRIGGER_FOR_TRUNCATE(type)		((type) & TRIGGER_TYPE_TRUNCATE)
+#define TRIGGER_FOR_INSERT(type)		(((type) & TRIGGER_TYPE_INSERT) != 0)
+#define TRIGGER_FOR_DELETE(type)		(((type) & TRIGGER_TYPE_DELETE) != 0)
+#define TRIGGER_FOR_UPDATE(type)		(((type) & TRIGGER_TYPE_UPDATE) != 0)
+#define TRIGGER_FOR_TRUNCATE(type)		(((type) & TRIGGER_TYPE_TRUNCATE) != 0)
 
 /*
  * Efficient macro for checking if tgtype matches a particular level
diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h
index 1a53f6c..294184e 100644
--- a/src/include/commands/trigger.h
+++ b/src/include/commands/trigger.h
@@ -78,7 +78,7 @@ typedef struct TriggerData
 	(((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_TRUNCATE)
 
 #define TRIGGER_FIRED_FOR_ROW(event) \
-	((event) & TRIGGER_EVENT_ROW)
+	(((event) & TRIGGER_EVENT_ROW) == TRIGGER_EVENT_ROW)
 
 #define TRIGGER_FIRED_FOR_STATEMENT(event) \
 	(!TRIGGER_FIRED_FOR_ROW(event))
diff --git a/src/include/regex/regguts.h b/src/include/regex/regguts.h
index 2f3be1a..595f899 100644
--- a/src/include/regex/regguts.h
+++ b/src/include/regex/regguts.h
@@ -209,7 +209,7 @@ struct colordesc
 	int			flags;			/* bit values defined next */
 #define  FREECOL 01				/* currently free */
 #define  PSEUDO  02				/* pseudocolor, no real chars */
-#define  UNUSEDCOLOR(cd) ((cd)->flags & FREECOL)
+#define  UNUSEDCOLOR(cd) (((cd)->flags & FREECOL) != 0)
 	union tree *block;			/* block of solid color, if any */
 };
 
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index a2f78ee..6827434 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -349,21 +349,21 @@ typedef PageHeaderData *PageHeader;
 	PageXLogRecPtrSet(((PageHeader) (page))->pd_lsn, lsn)
 
 #define PageHasFreeLinePointers(page) \
-	(((PageHeader) (page))->pd_flags & PD_HAS_FREE_LINES)
+	((((PageHeader) (page))->pd_flags & PD_HAS_FREE_LINES) != 0)
 #define PageSetHasFreeLinePointers(page) \
 	(((PageHeader) (page))->pd_flags |= PD_HAS_FREE_LINES)
 #define PageClearHasFreeLinePointers(page) \
 	(((PageHeader) (page))->pd_flags &= ~PD_HAS_FREE_LINES)
 
 #define PageIsFull(page) \
-	(((PageHeader) (page))->pd_flags & PD_PAGE_FULL)
+	((((PageHeader) (page))->pd_flags & PD_PAGE_FULL) != 0)
 #define PageSetFull(page) \
 	(((PageHeader) (page))->pd_flags |= PD_PAGE_FULL)
 #define PageClearFull(page) \
 	(((PageHeader) (page))->pd_flags &= ~PD_PAGE_FULL)
 
 #define PageIsAllVisible(page) \
-	(((PageHeader) (page))->pd_flags & PD_ALL_VISIBLE)
+	((((PageHeader) (page))->pd_flags & PD_ALL_VISIBLE) != 0)
 #define PageSetAllVisible(page) \
 	(((PageHeader) (page))->pd_flags |= PD_ALL_VISIBLE)
 #define PageClearAllVisible(page) \
diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h
index 3049a87..e0fffd5 100644
--- a/src/include/utils/jsonb.h
+++ b/src/include/utils/jsonb.h
@@ -214,9 +214,9 @@ typedef struct
 
 /* convenience macros for accessing the root container in a Jsonb datum */
 #define JB_ROOT_COUNT(jbp_)		( *(uint32*) VARDATA(jbp_) & JB_CMASK)
-#define JB_ROOT_IS_SCALAR(jbp_) ( *(uint32*) VARDATA(jbp_) & JB_FSCALAR)
-#define JB_ROOT_IS_OBJECT(jbp_) ( *(uint32*) VARDATA(jbp_) & JB_FOBJECT)
-#define JB_ROOT_IS_ARRAY(jbp_)	( *(uint32*) VARDATA(jbp_) & JB_FARRAY)
+#define JB_ROOT_IS_SCALAR(jbp_) ( (*(uint32*) VARDATA(jbp_) & JB_FSCALAR) != 0)
+#define JB_ROOT_IS_OBJECT(jbp_) ( (*(uint32*) VARDATA(jbp_) & JB_FOBJECT) != 0)
+#define JB_ROOT_IS_ARRAY(jbp_)	( (*(uint32*) VARDATA(jbp_) & JB_FARRAY) != 0)
 
 
 /*
-- 
2.3.0.149.gf3f4077.dirty

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to