diff options
| author | Peter Eisentraut <peter@eisentraut.org> | 2025-01-21 14:34:44 +0100 |
|---|---|---|
| committer | Peter Eisentraut <peter@eisentraut.org> | 2025-01-21 14:39:24 +0100 |
| commit | 1772d554b089c4779eaa13ae1487721e3080d119 (patch) | |
| tree | 3f458b0cb9ba438b42673dab27fc6b44f9c8fbca /src/include | |
| parent | 888d4523f0c2f7e410739feff3ff97c5f3b9b3ea (diff) | |
Fix NO ACTION temporal foreign keys when the referenced endpoints change
If a referenced UPDATE changes the temporal start/end times, shrinking
the span the row is valid, we get a false return from
ri_Check_Pk_Match(), but overlapping references may still be valid, if
their reference didn't overlap with the removed span.
We need to consider what span(s) are still provided in the referenced
table. Instead of returning that from ri_Check_Pk_Match(), we can
just look it up in the main SQL query.
Reported-by: Sam Gabrielsson <sam@movsom.se>
Author: Paul Jungwirth <pj@illuminatedcomputing.com>
Discussion: https://www.postgresql.org/message-id/flat/CA+renyUApHgSZF9-nd-a0+OPGharLQLO=mDHcY4_qQ0+noCUVg@mail.gmail.com
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/catalog/pg_constraint.h | 3 | ||||
| -rw-r--r-- | src/include/catalog/pg_operator.dat | 6 |
2 files changed, 6 insertions, 3 deletions
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h index 89e5a8ad796..6da164e7e4d 100644 --- a/src/include/catalog/pg_constraint.h +++ b/src/include/catalog/pg_constraint.h @@ -290,7 +290,8 @@ extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, int *num_fk_del_set_cols, AttrNumber *fk_del_set_cols); extern void FindFKPeriodOpers(Oid opclass, Oid *containedbyoperoid, - Oid *aggedcontainedbyoperoid); + Oid *aggedcontainedbyoperoid, + Oid *intersectoperoid); extern bool check_functional_grouping(Oid relid, Index varno, Index varlevelsup, diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat index 4c86f93cb0c..6d9dc1528d6 100644 --- a/src/include/catalog/pg_operator.dat +++ b/src/include/catalog/pg_operator.dat @@ -3150,7 +3150,8 @@ { oid => '3899', descr => 'range difference', oprname => '-', oprleft => 'anyrange', oprright => 'anyrange', oprresult => 'anyrange', oprcode => 'range_minus' }, -{ oid => '3900', descr => 'range intersection', +{ oid => '3900', oid_symbol => 'OID_RANGE_INTERSECT_RANGE_OP', + descr => 'range intersection', oprname => '*', oprleft => 'anyrange', oprright => 'anyrange', oprresult => 'anyrange', oprcom => '*(anyrange,anyrange)', oprcode => 'range_intersect' }, @@ -3417,7 +3418,8 @@ { oid => '4393', descr => 'multirange minus', oprname => '-', oprleft => 'anymultirange', oprright => 'anymultirange', oprresult => 'anymultirange', oprcode => 'multirange_minus' }, -{ oid => '4394', descr => 'multirange intersect', +{ oid => '4394', oid_symbol => 'OID_MULTIRANGE_INTERSECT_MULTIRANGE_OP', + descr => 'multirange intersect', oprname => '*', oprleft => 'anymultirange', oprright => 'anymultirange', oprresult => 'anymultirange', oprcom => '*(anymultirange,anymultirange)', oprcode => 'multirange_intersect' }, |
