On Mon, Mar 11, 2024 at 3:46 PM Peter Eisentraut <pe...@eisentraut.org> wrote: > > A few general comments on the tests: > > - In the INSERT commands, specify the column names explicitly. This > makes the tests easier to read (especially since the column order > between the PK and the FK table is sometimes different). > > - Let's try to make it so that the inserted literals match the values > shown in the various error messages, so it's easier to match them up. > So, change the int4range literals to half-open notation. And also maybe > change the date output format to ISO. > maybe just change the tsrange type to daterange, then the dot out file will be far less verbose.
minor issues while reviewing v27, 0001 to 0004. transformFkeyGetPrimaryKey comments need to update, since bool pk_period also returned. +/* + * FindFKComparisonOperators - + * + * Gets the operators for pfeqopOut, ppeqopOut, and ffeqopOut. + * Sets old_check_ok if we can avoid re-validating the constraint. + * Sets old_pfeqop_item to the old pfeqop values. + */ +static void +FindFKComparisonOperators(Constraint *fkconstraint, + AlteredTableInfo *tab, + int i, + int16 *fkattnum, + bool *old_check_ok, + ListCell **old_pfeqop_item, + Oid pktype, Oid fktype, Oid opclass, + Oid *pfeqopOut, Oid *ppeqopOut, Oid *ffeqopOut) I think the above comments is `Sets the operators for pfeqopOut, ppeqopOut, and ffeqopOut.`. + if (is_temporal) + { + if (!fkconstraint->fk_with_period) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FOREIGN_KEY), + errmsg("foreign key uses PERIOD on the referenced table but not the referencing table"))); + } can be if (is_temporal && !fkconstraint->fk_with_period) ereport(ERROR, (errcode(ERRCODE_INVALID_FOREIGN_KEY), errmsg("foreign key uses PERIOD on the referenced table but not the referencing table"))); + + if (is_temporal) + { + if (!fkconstraint->pk_with_period) + /* Since we got pk_attrs, one should be a period. */ + ereport(ERROR, + (errcode(ERRCODE_INVALID_FOREIGN_KEY), + errmsg("foreign key uses PERIOD on the referencing table but not the referenced table"))); + } can be if (is_temporal && !fkconstraint->pk_with_period) /* Since we got pk_attrs, one should be a period. */ ereport(ERROR, (errcode(ERRCODE_INVALID_FOREIGN_KEY), errmsg("foreign key uses PERIOD on the referencing table but not the referenced table"))); refactor decompile_column_index_array seems unnecessary. Peter already mentioned it at [1], I have tried to fix it at [2]. @@ -12141,7 +12245,8 @@ transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid, /* * Now build the list of PK attributes from the indkey definition (we - * assume a primary key cannot have expressional elements) + * assume a primary key cannot have expressional elements, unless it + * has a PERIOD) */ *attnamelist = NIL; for (i = 0; i < indexStruct->indnkeyatts; i++) @@ -12155,6 +12260,8 @@ transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid, makeString(pstrdup(NameStr(*attnumAttName(pkrel, pkattno))))); } + *pk_period = (indexStruct->indisexclusion); I don't understand the "expression elements" in the comments, most of the tests case is like ` PRIMARY KEY (id, valid_at WITHOUT OVERLAPS) ` + *pk_period = (indexStruct->indisexclusion); can be `+ *pk_period = indexStruct->indisexclusion;` [1] https://postgr.es/m/7be8724a-5c25-46d7-8325-1bd8be6fa...@eisentraut.org [2] https://postgr.es/m/CACJufxHVg65raNhG2zBwXgjrD6jqace4NZbePyMhP8-_Q=i...@mail.gmail.com