att_isnull

From: Robert Haas <robertmhaas(at)gmail(dot)com>
To: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: att_isnull
Date: 2019-05-10 14:20:05
Message-ID: CA+TgmobHOP8r6cG+UnsDFMrS30-m=jRrCBhgw-nFkn0k9QnFsg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

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

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alvaro Herrera 2019-05-10 14:34:35 Re: att_isnull
Previous Message Tom Lane 2019-05-10 14:18:23 Re: pg12 release notes