I'm emailing it to the 'general' list.

(1)

This:


    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?



(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?




El 28/07/2020 a las 03:20, David Rowley escribió:
Hi Alex,

On Tue, 28 Jul 2020 at 05:47, alex maslakov <alex@serendipia.email> wrote:
I was suggested to use `get_primary_key_attnos` from
`src/include/catalog/pg_constraint.h`

extern Bitmapset *get_primary_key_attnos(Oid relid, bool deferrableOk)


It returns *Bitstamp. And it's got "nwords" and "words[]". But those
return just big numbers, not something that look similar to an index of
the primary key column.


And therefore I haven't had any luck thus far.

How to do it?
You'll need to loop over the return value of that function with
bms_next_member()

e.g.
pkattnos = get_primary_key_attnos(oid, false);
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 */
}

For the future, for questions, you should use the general list.  If
the question is very source code related then you might have more luck
in pgsql-hackers.  This is not the right list. Please post any
followup questions on one of those lists.

Note the description for this list, per
https://www.postgresql.org/list/ is "Notification of git commits are
sent to this list. Do not post here!"

David


Reply via email to