On Wed, 29 Jul 2020 at 03:45, alex maslakov <alex@serendipia.email> wrote:
>      int i = -1;
>      while ((i = bms_next_member(pkattnos , i)) >= 0) {
>          /* do stuff with i */
>          /* you'll need to use i - FirstLowInvalidHeapAttributeNumber to
> get the pg_attribute.attnum */
>
>
>          elog(INFO, "bms_next_member i: %d", i);
>      }
>
> prints 10 and then 9
>
> Then:
>
>    10 - FirstLowInvalidHeapAttributeNumber (-8) ==> 2
>
>    9 - FirstLowInvalidHeapAttributeNumber (-8) ==> 1
>
> These are indexes of the columns, right?
>
> Do they start from 1, not from 0?

User attributes start at 1. Have a look at the pg_attribute system
catalogue table. The number you get will be the attnum column from
that table.

> (2)
>
> I'll use this C code as an example to build an extention in Rust. The
> Postgresql bindings for Rust I have don't contain a definition of
> `FirstLowInvalidHeapAttributeNumber` for some reason. I can define it
> since it's simply single digit constant.
>
> However what does in some source files it's defined as (-7) and in some
> as (-8)? Which should I use?

It did recently change from -8 to -7 when we removed Oid as a system
column in pg12. The number will never change on a major version, so
you'll always know what it is for versions that have already been
released.  There's always a chance it'll change from -7 in some future
PostgreSQL version though.

David


Reply via email to