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: