Re: determine what column(s) form the primary key, in C extention

From: alex maslakov <alex(at)serendipia(dot)email>
To: David Rowley <dgrowleyml(at)gmail(dot)com>
Cc: pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: determine what column(s) form the primary key, in C extention
Date: 2020-07-28 15:45:49
Message-ID: 4e3b5a5e-00eb-56dd-aa17-f6f340a91c8d@serendipia.email
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers pgsql-general

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(at)serendipia(dot)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

In response to

Responses

Browse pgsql-committers by date

  From Date Subject
Next Message David Rowley 2020-07-28 23:42:56 pgsql: Make EXPLAIN ANALYZE of HashAgg more similar to Hash Join
Previous Message David Rowley 2020-07-28 10:55:19 pgsql: Doc: Improve documentation for pg_jit_available()

Browse pgsql-general by date

  From Date Subject
Next Message Shaozhong SHI 2020-07-28 15:51:14 Re: Issues of slow running queries when dealing with Big Data
Previous Message Michael Lewis 2020-07-28 15:41:56 Re: Issues of slow running queries when dealing with Big Data