On Tue, Mar 19, 2024 at 6:49 AM Paul Jungwirth <p...@illuminatedcomputing.com> wrote: > > Rebased to 846311051e. >
Hi, I just found out some minor issues. + * types matching the PERIOD element. periodprocoid is a GiST support function to + * aggregate multiple PERIOD element values into a single value + * (whose return type need not match its inputs, + * e.g. many ranges can be aggregated into a multirange). * And aggedperiodoperoid is also a ContainedBy operator, - * but one whose rhs is anymultirange. + * but one whose rhs matches the type returned by aggedperiodoperoid. * That way foreign keys can compare fkattr <@ range_agg(pkattr). */ void -FindFKPeriodOpers(Oid opclass, - Oid *periodoperoid, - Oid *aggedperiodoperoid) +FindFKPeriodOpersAndProcs(Oid opclass, + Oid *periodoperoid, + Oid *aggedperiodoperoid, + Oid *periodprocoid) I think, aggedperiodoperoid is more descriptive than periodprocoid, in 0005, you don't need to rename it. aslo do we need to squash v29 0001 to 0005 together? --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -1167,7 +1167,8 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM column(s) of some row of the referenced table. If the <replaceable class="parameter">refcolumn</replaceable> list is omitted, the primary key of the <replaceable class="parameter">reftable</replaceable> - is used. Otherwise, the <replaceable class="parameter">refcolumn</replaceable> + is used (omitting any part declared with <literal>WITHOUT OVERLAPS</literal>). + Otherwise, the <replaceable class="parameter">refcolumn</replaceable> list must refer to the columns of a non-deferrable unique or primary key constraint or be the columns of a non-partial unique index. </para> I think this does not express that foreign key is PERIOD, then the last column of refcolumn must specify PERIOD? + <para> + If the last column is marked with <literal>PERIOD</literal>, + it is treated in a special way. + While the non-<literal>PERIOD</literal> columns are compared for equality + (and there must be at least one of them), + the <literal>PERIOD</literal> column is not. + Instead the constraint is considered satisfied + if the referenced table has matching records + (based on the non-<literal>PERIOD</literal> parts of the key) + whose combined <literal>PERIOD</literal> values completely cover + the referencing record's. + In other words, the reference must have a referent for its entire duration. + This column must be a column with a range type. + In addition the referenced table must have a primary key + or unique constraint declared with <literal>WITHOUT PORTION</literal>. + </para> you forgot to change <literal>WITHOUT PORTION</literal> to <literal>WITHOUT OVERLAPS</literal> Oid pf_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = FK) */ Oid pp_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (PK = PK) */ Oid ff_eq_oprs[RI_MAX_NUMKEYS]; /* equality operators (FK = FK) */ in struct RI_ConstraintInfo, these comments need to be updated?