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