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

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

From
alex maslakov
Date:
Hey. I'm creating an extention in C. An extention will be fired as, or 
inside, a trigger.

What I need: dynamically, inside a trigger, identify which column, or 
columns if the primary key is composed of multiple columns, form the 
primary key -- their indexes or names.

I need a fast way, therefore I don't consider using SPI_exec(..) and the 
like.


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?




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

From
David Rowley
Date:
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