Thread

Commits

  1. Fix assorted bugs in pg_get_partition_constraintdef().

  2. Local partitioned indexes

  1. \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
    
    
    
  2. 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