Thread
Commits
-
Fix assorted bugs in pg_get_partition_constraintdef().
- aaf10f32a308 12.0 landed
- dff3f06dc95e 10.6 landed
- 49507dec4601 11.0 landed
-
Local partitioned indexes
- 8b08f7d4820f 11.0 cited
-
\d+ fails on index on partition
Justin Pryzby <pryzby@telsasoft.com> — 2018-09-27T20:00:20Z
For indices inherited from relkind=p: pryzbyj=# CREATE TABLE tt(i int)PARTITION BY RANGE(i); pryzbyj=# CREATE TABLE tt1 PARTITION OF tt DEFAULT; pryzbyj=# CREATE INDEX ON tt((0+i)); pryzbyj=# ALTER INDEX tt1_expr_idx ALTER COLUMN 1 SET STATISTICS 123; pryzbyj=# \d+ tt1_expr_idx ERROR: 42809: "tt1_expr_idx" is an index LOCATION: heap_open, heapam.c:1305 Failing due to: ********* QUERY ********** SELECT inhparent::pg_catalog.regclass, pg_catalog.pg_get_expr(c.relpartbound, inhrelid), pg_catalog.pg_get_partition_constraintdef(inhrelid) FROM pg_catalog.pg_class c JOIN pg_catalog.pg_inherits i ON c.oid = inhrelid WHERE c.oid = '40129092' AND c.relispartition; ************************** pg_get_partition_constraintdef() doesn't like being passed a relkind='I', "ATTACH"ed index, which I guess is included in pg_inherit (commit 8b08f7d48): pryzbyj=# SELECT inhparent::regclass, inhrelid::regclass, * FROM pg_inherits WHERE inhrelid='tt1_expr_idx'::regclass; inhparent | tt_expr_idx inhrelid | tt1_expr_idx inhrelid | 40129092 inhparent | 40129091 inhseqno | 1 I'll spare you the burden of any fix I might attempt to cobble together. Justin
-
Re: \d+ fails on index on partition
Tom Lane <tgl@sss.pgh.pa.us> — 2018-09-27T20:51:39Z
Justin Pryzby <pryzby@telsasoft.com> writes: > pg_get_partition_constraintdef() doesn't like being passed a relkind='I', It'll also fall over if the passed OID isn't a relation at all, which is also very much not-nice for SQL-exposed inquiry functions. I'm inclined to fix this by (1) inventing an lsyscache function to fetch relispartition, which will have the behavior of returning false for a lookup failure (which is generally consistent with the behavior of most of the other lsyscache functions). (2) replace the if (rel->rd_rel->relispartition) check in get_partition_qual_relid with a test like if (get_rel_relispartition(relid)), and don't open the Relation at all unless that succeeds. regards, tom lane