Re: pg_restore error with partitioned table having exclude constraint - Mailing list pgsql-bugs

From Japin Li
Subject Re: pg_restore error with partitioned table having exclude constraint
Date
Msg-id ME0P300MB0445F93240E1311A2DB1269AB6BC2@ME0P300MB0445.AUSP300.PROD.OUTLOOK.COM
Whole thread Raw
In response to pg_restore error with partitioned table having exclude constraint  (Keith Paskett <keith.paskett@logansw.com>)
List pgsql-bugs
On Wed, 16 Apr 2025 at 23:11, Keith Paskett <keith.paskett@logansw.com> wrote:
> Postgresql 17.4
>
> A table partitioned by LIST with an exclusion constraint errors on creating the constraint on the parent table when
doing
> a pg_dump/pg_restore
>
> ERROR:
>
> pg_restore: error: could not execute query: ERROR:  cannot attach index
> "pkg708_had_working_hist_context_id_had_person_id_active_ts_excl" as a partition of index
"had_working_hist_tsr_excl"
>
> DETAIL:  The index definitions do not match.
>
> Command was: ALTER INDEX apps.had_working_hist_tsr_excl ATTACH PARTITION
> apps_part.pkg708_had_working_hist_context_id_had_person_id_active_ts_excl;
>
> TABLE AFTER pg_restore
>
> \d+ apps.had_working_hist
>
>                                                                   Partitioned table "apps.had_working_hist"
>
>        Column        |           Type           | Collation | Nullable |                    Default
 |
 
> Storage  | Compression | Stats target | Description 
>
>
---------------------+--------------------------+-----------+----------+------------------------------------------------+----------+-------------+--------------+-------------
>
>
>  had_working_hist_id | integer                  |           | not null |
nextval('apps.had_working_hist_seq'::regclass)|
 
> plain    |             |              | 
>
>  context_id          | integer                  |           | not null |
 |
 
> plain    |             |              | 
>
>  had_person_id       | integer                  |           | not null |
 |
 
> plain    |             |              | 
>
>  comment             | text                     |           |          |
 |
 
> extended |             |              | 
>
>  active_tsr          | tstzrange                |           | not null |
 |
 
> extended |             |              | 
>
>  add_tstz            | timestamp with time zone |           | not null | CURRENT_TIMESTAMP
 |
 
> plain    |             |              | 
>
>  add_by_id           | integer                  |           | not null |
 |
 
> plain    |             |              | 
>
>  mod_tstz            | timestamp with time zone |           | not null | CURRENT_TIMESTAMP
 |
 
> plain    |             |              | 
>
>  mod_by_id           | integer                  |           | not null |
 |
 
> plain    |             |              | 
>
> Partition key: LIST (context_id)
>
> Indexes:
>
>     "had_working_hist_pkey" PRIMARY KEY, btree (had_working_hist_id, context_id)
>
>     "had_working_hist_add_by_id_idx" btree (add_by_id)
>
>     "had_working_hist_had_person_id_idx" btree (had_person_id)
>
>     "had_working_hist_mod_by_id_idx" btree (mod_by_id)
>
>     "had_working_hist_tsr_excl" EXCLUDE USING gist (context_id WITH =, had_person_id WITH =, active_tsr WITH &&)
INVALID
>
> Foreign-key constraints:
>
>     "had_working_hist__add_by_id_fk" FOREIGN KEY (add_by_id) REFERENCES persons(person_id)
>
>     "had_working_hist__context_id_fk" FOREIGN KEY (context_id) REFERENCES apm_packages(package_id)
>
>     "had_working_hist__had_person_id_fk" FOREIGN KEY (had_person_id, context_id) REFERENCES apps.had_person
> (had_person_id, context_id)
>
>     "had_working_hist__mod_by_id_fk" FOREIGN KEY (mod_by_id) REFERENCES persons(person_id)
>
> Partitions: apps_part.pkg708_had_working_hist FOR VALUES IN (708)
>

Hi, Keith

I can replicate this issue on the current master branch. After some investigation,
I found the following code at the end of the CompareIndexInfo() function:

    /* No support currently for comparing exclusion indexes. */
    if (info1->ii_ExclusionOps != NULL || info2->ii_ExclusionOps != NULL)
        return false;

I believe this is why the exclusion index is rejected.  Commit 8b08f7d482
introduces a change that disables the creation of exclusion constraints on
partitioned tables, while commit 8c852ba9a4 allows some exclusion consistency
on partitions.

Here is a patch to fix it.  It just compares the OIDs of two exclusion constraints.



-- 
Regrads,
Japin Li

Attachment

pgsql-bugs by date:

Previous
From: Keith Paskett
Date:
Subject: pg_restore error with partitioned table having exclude constraint
Next
From: Álvaro Herrera
Date:
Subject: Re: pg_restore error with partitioned table having exclude constraint