/* Fast-path metadata for RI checks on foreign key referencing tables */
typedef struct FastPathMeta
{
- RI_CompareHashEntry *compare_entries[RI_MAX_NUMKEYS];
+ FmgrInfo eq_opr_finfo[RI_MAX_NUMKEYS];
+ FmgrInfo cast_func_finfo[RI_MAX_NUMKEYS];
RegProcedure regops[RI_MAX_NUMKEYS];
Oid subtypes[RI_MAX_NUMKEYS];
int strats[RI_MAX_NUMKEYS];
*/
for (int i = 0; i < riinfo->nkeys; i++)
{
- if (pk_nulls[i] != 'n')
- {
- RI_CompareHashEntry *entry = fpmeta->compare_entries[i];
-
- if (OidIsValid(entry->cast_func_finfo.fn_oid))
- pk_vals[i] = FunctionCall3(&entry->cast_func_finfo,
- pk_vals[i],
- Int32GetDatum(-1), /* typmod */
- BoolGetDatum(false)); /* implicit coercion */
- }
+ if (pk_nulls[i] != 'n' &&
+ OidIsValid(fpmeta->cast_func_finfo[i].fn_oid))
+ pk_vals[i] = FunctionCall3(&fpmeta->cast_func_finfo[i],
+ pk_vals[i],
+ Int32GetDatum(-1), /* typmod */
+ BoolGetDatum(false)); /* implicit coercion */
}
/*
Oid lefttype;
RI_CompareHashEntry *entry = ri_HashCompareOp(eq_opr, typeid);
- fpmeta->compare_entries[i] = entry;
+ fmgr_info_copy(&fpmeta->cast_func_finfo[i], &entry->cast_func_finfo,
+ CurrentMemoryContext);
+ fmgr_info_copy(&fpmeta->eq_opr_finfo[i], &entry->eq_opr_finfo,
+ CurrentMemoryContext);
fpmeta->regops[i] = get_opcode(eq_opr);
get_op_opfamily_properties(eq_opr,