Obviously, this macro does not do what it claims to do:

/*
 * check to see if the ATT'th bit of an array of 8-bit bytes is set.
 */
#define att_isnull(ATT, BITS) (!((BITS)[(ATT) >> 3] & (1 << ((ATT) & 0x07))))

OK, I lied.  It's not at all obvious, or at least it wasn't to me.
The macro actually tests whether the bit is *unset*, because there's
an exclamation point in there.  I think the comment should be updated
to something like "Check a tuple's null bitmap to determine whether
the attribute is null.  Note that a 0 in the null bitmap indicates a
null, while 1 indicates non-null."

There is some kind of broader confusion here, I think, because we
refer in many places to the "null bitmap" but it's actually not a
bitmap of which attributes are null but rather of which attributes are
not null.  That is confusing in and of itself, and it's also not very
intuitive that it uses exactly the opposite convention from what we do
with datum/isnull arrays.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


Reply via email to