Обсуждение: See the WHERE clause of a partial index
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.
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
> 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.
> 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.
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
> 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.