Thread: How to retrieve functional index column names

How to retrieve functional index column names

From
glogy@centrum.cz (Jakub)
Date:
Hi,
I need to retrieve the name of the function and the index column names
of the functional index. The system information about the
index(function and its args) is stored in the system catalog column
pg_index.indexprs. Do I have to parse pg_index.indexprs text or
pg_get_indexdef(pg_index.indexrelid) result? Am I wrong? Is there
another way to retrieve the column names? Could anybody help me
please.

Regards Jakub


Re: How to retrieve functional index column names

From
Tom Lane
Date:
glogy@centrum.cz (Jakub) writes:
> I need to retrieve the name of the function and the index column names
> of the functional index. The system information about the
> index(function and its args) is stored in the system catalog column
> pg_index.indexprs.

As of 7.4, this is a requirement badly in need of reconsideration.
What makes you think there is any function name involved?  Consider
something likecreate index i on t ((col + 2));

Getting the column names is still a sensible operation though.  I'd
suggest looking in pg_depend to see which columns of the table the
index depends on.
        regards, tom lane


Re: How to retrieve functional index column names

From
"Tom Hebbron"
Date:
"Jakub" <glogy@centrum.cz> wrote in message
news:c7ed2227.0401052332.3512fbd0@posting.google.com...
> Hi,
> I need to retrieve the name of the function and the index column names
> of the functional index. The system information about the
> index(function and its args) is stored in the system catalog column
> pg_index.indexprs. Do I have to parse pg_index.indexprs text or
> pg_get_indexdef(pg_index.indexrelid) result? Am I wrong? Is there
> another way to retrieve the column names? Could anybody help me
> please.
>
> Regards Jakub

the column names are stored in pg_catalog.pg_attribute.attname - linked to
the oid in pg_class of the index.

select
c.oid::regclass,
i.*,
ia.attname
from   pg_catalog.pg_class  c
inner join  pg_catalog.pg_index  i  ON (i.indrelid = c.oid)
inner join  pg_catalog.pg_attribute ia ON (i.indexrelid = ia.attrelid);

should do the trick.


--
Tom Hebbron
www.hebbron.com





Re: How to retrieve functional index column names

From
glogy@centrum.cz (Jakub)
Date:
"Tom Hebbron" <news_user@hebbron.com> wrote in message news:<bterm0$1u8h$1@news.hub.org>...
> "Jakub" <glogy@centrum.cz> wrote in message
> news:c7ed2227.0401052332.3512fbd0@posting.google.com...
> > Hi,
> > I need to retrieve the name of the function and the index column names
> > of the functional index. The system information about the
> > index(function and its args) is stored in the system catalog column
> > pg_index.indexprs. Do I have to parse pg_index.indexprs text or
> > pg_get_indexdef(pg_index.indexrelid) result? Am I wrong? Is there
> > another way to retrieve the column names? Could anybody help me
> > please.
> >
> > Regards Jakub
> 
> the column names are stored in pg_catalog.pg_attribute.attname - linked to
> the oid in pg_class of the index.
> 
> select
> c.oid::regclass,
> i.*,
> ia.attname
> from   pg_catalog.pg_class  c
> inner join  pg_catalog.pg_index  i  ON (i.indrelid = c.oid)
> inner join  pg_catalog.pg_attribute ia ON (i.indexrelid = ia.attrelid);
> 
> should do the trick.

You are right Tom but when the index contains an expression (e.g.:
Create index "index1" on "Entity1" using btree (lower("a"));) there is
a "pg_expression_x" text stored in the pg_attribute.attname linked to
the oid in pg_class of the index. The only way I see is to parse the
pg_index.indexprs text to get the column numbers of the related table.
The pg_get_indexdef() function returns the whole expression lower("a")
but I want to retrieve the list of column names only.
Anyways thank for your comment. 

Jakub


Re: How to retrieve functional index column names

From
glogy@centrum.cz (Jakub)
Date:
> As of 7.4, this is a requirement badly in need of reconsideration.
> What makes you think there is any function name involved?  Consider
> something like
>     create index i on t ((col + 2));
> 
> Getting the column names is still a sensible operation though.  I'd
> suggest looking in pg_depend to see which columns of the table the
> index depends on.

Thank you for your help Tom!

Regards Jakub