See the WHERE clause of a partial index

Started by Paul Jungwirthover 13 years ago6 messagesgeneral
Jump to latest
#1Paul Jungwirth
pj@illuminatedcomputing.com

Hello,

I created some indexes with WHERE clauses, so that only part of the
table would be indexed. Now I'd like to get a list of indexes, and
include the WHERE clause if an index has one. This is what I'm trying
right now:

SELECT indc.relname, ind.indpred
FROM pg_index ind, pg_class indc
WHERE indc.oid = ind.indexrelid;

But that gives results like this:

relname | indpred
--------------------+------------------------
. . .
index_pwords_on_language_id | NULL
index_user_languages_on_user_id_and_language_id |
{NULLTEST :arg {VAR :varno 1 :varattno 6 :vartype 1114 :vartypmod -1
:varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 6 :location 128}
:nulltesttype 0 :argisrow false}
index_user_lists_on_user_id | NULL
index_users_on_email | NULL
. . .

I'm not sure how to interpret that `indpred` column. Is there any way
to reconstruct the WHERE clause I originally passed to the CREATE
INDEX command?

Thanks,
Paul

--
_________________________________
Pulchritudo splendor veritatis.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Paul Jungwirth (#1)
Re: See the WHERE clause of a partial index

Paul Jungwirth <pj@illuminatedcomputing.com> writes:

I'm not sure how to interpret that `indpred` column. Is there any way
to reconstruct the WHERE clause I originally passed to the CREATE
INDEX command?

pg_get_indexdef() should help. If you really want just the WHERE
clause, possibly pg_get_expr() would work, but I've not tried it on
index clauses.

regards, tom lane

#3Paul Jungwirth
pj@illuminatedcomputing.com
In reply to: Tom Lane (#2)
Re: See the WHERE clause of a partial index

pg_get_indexdef() should help. If you really want just the WHERE
clause, possibly pg_get_expr() would work, but I've not tried it on
index clauses.

Thank you for such a quick response!

pg_get_indexdef is very helpful:

select pg_get_indexdef(223630);

pg_get_indexdef
-----------------------------------------------------------------------------------------------------------------------------------------------------
CREATE UNIQUE INDEX
index_user_languages_on_user_id_and_language_id ON user_languages
USING btree (user_id, language_id) WHERE (deleted_at IS NULL)
(1 row)

It'd be great to get just the WHERE clause if possible, although I can
work around it if not. I couldn't find much documentation re
pg_get_expr. Does this message mean I can't use it, or am I just doing
something wrong?:

select pg_get_expr('{NULLTEST :arg {VAR :varno 1 :varattno 6

:vartype 1114 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1
:varoattno 6 :location 128} :nulltesttype 0 :argisrow false}',
223630);
ERROR: cannot accept a value of type pg_node_tree
LINE 1: select pg_get_expr('{NULLTEST :arg {VAR :varno 1 :varattno 6...

Thank you for your help!
Paul

--
_________________________________
Pulchritudo splendor veritatis.

#4Paul Jungwirth
pj@illuminatedcomputing.com
In reply to: Paul Jungwirth (#3)
Re: See the WHERE clause of a partial index

It'd be great to get just the WHERE clause if possible, although I can
work around it if not. I couldn't find much documentation re
pg_get_expr.

To answer my own question, this works:

select pg_get_expr(indpred, indrelid) from pg_index where

indexrelid = 223630;
pg_get_expr
----------------------
(deleted_at IS NULL)
(1 row)

So I guess the problem was trying to get a pg_node_tree out of a string.

Thanks again!
Paul

--
_________________________________
Pulchritudo splendor veritatis.

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Paul Jungwirth (#3)
Re: See the WHERE clause of a partial index

Paul Jungwirth <pj@illuminatedcomputing.com> writes:

It'd be great to get just the WHERE clause if possible, although I can
work around it if not. I couldn't find much documentation re
pg_get_expr. Does this message mean I can't use it, or am I just doing
something wrong?:

select pg_get_expr('{NULLTEST :arg {VAR :varno 1 :varattno 6

:vartype 1114 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1
:varoattno 6 :location 128} :nulltesttype 0 :argisrow false}',
223630);
ERROR: cannot accept a value of type pg_node_tree
LINE 1: select pg_get_expr('{NULLTEST :arg {VAR :varno 1 :varattno 6...

That's a security restriction (if you could pass random text to
pg_get_expr, you could probably crash it). If you feed the actual
pg_index.indpred column to it, that won't happen. I think the OID
argument will need to be the table not the index, but not 100% sure.

regards, tom lane

#6Paul Jungwirth
pj@illuminatedcomputing.com
In reply to: Tom Lane (#5)
Re: See the WHERE clause of a partial index

I think the OID
argument will need to be the table not the index, but not 100% sure.

Yep, that's true. :-)

Paul

--
_________________________________
Pulchritudo splendor veritatis.