Skip to content

Commit be136b2

Browse files
committed
Revert "Fix an O(N^2) problem in foreign key references".
Commit 5ddc728 does not actually work because it will happily blow away ri_constraint_cache entries that are in active use in outer call levels. In any case, it's a very ugly, brute-force solution to the problem of limiting the cache size. Revert until it can be redesigned.
1 parent ca44504 commit be136b2

File tree

1 file changed

+3
-35
lines changed

1 file changed

+3
-35
lines changed

src/backend/utils/adt/ri_triggers.c

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ typedef struct RI_CompareHashEntry
182182
* ----------
183183
*/
184184
static HTAB *ri_constraint_cache = NULL;
185-
static long ri_constraint_cache_seq_count = 0;
186185
static HTAB *ri_query_cache = NULL;
187186
static HTAB *ri_compare_cache = NULL;
188187

@@ -215,7 +214,6 @@ static bool ri_KeysEqual(Relation rel, HeapTuple oldtup, HeapTuple newtup,
215214
static bool ri_AttributesEqual(Oid eq_opr, Oid typeid,
216215
Datum oldvalue, Datum newvalue);
217216

218-
static void ri_InitConstraintCache(void);
219217
static void ri_InitHashTables(void);
220218
static void InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue);
221219
static SPIPlanPtr ri_FetchPreparedPlan(RI_QueryKey *key);
@@ -2934,20 +2932,6 @@ InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue)
29342932

29352933
Assert(ri_constraint_cache != NULL);
29362934

2937-
/*
2938-
* Prevent an O(N^2) problem when creating large amounts of foreign
2939-
* key constraints with ALTER TABLE, like it happens at the end of
2940-
* a pg_dump with hundred-thousands of tables having references.
2941-
*/
2942-
ri_constraint_cache_seq_count += hash_get_num_entries(ri_constraint_cache);
2943-
if (ri_constraint_cache_seq_count > 1000000)
2944-
{
2945-
hash_destroy(ri_constraint_cache);
2946-
ri_InitConstraintCache();
2947-
ri_constraint_cache_seq_count = 0;
2948-
return;
2949-
}
2950-
29512935
hash_seq_init(&status, ri_constraint_cache);
29522936
while ((hentry = (RI_ConstraintInfo *) hash_seq_search(&status)) != NULL)
29532937
{
@@ -3342,15 +3326,13 @@ ri_NullCheck(HeapTuple tup,
33423326

33433327

33443328
/* ----------
3345-
* ri_InitConstraintCache
3346-
*
3347-
* Initialize ri_constraint_cache when new or being rebuilt.
3329+
* ri_InitHashTables -
33483330
*
3349-
* This needs to be done from two places, so split it out to prevent drift.
3331+
* Initialize our internal hash tables.
33503332
* ----------
33513333
*/
33523334
static void
3353-
ri_InitConstraintCache(void)
3335+
ri_InitHashTables(void)
33543336
{
33553337
HASHCTL ctl;
33563338

@@ -3361,20 +3343,6 @@ ri_InitConstraintCache(void)
33613343
ri_constraint_cache = hash_create("RI constraint cache",
33623344
RI_INIT_CONSTRAINTHASHSIZE,
33633345
&ctl, HASH_ELEM | HASH_FUNCTION);
3364-
}
3365-
3366-
/* ----------
3367-
* ri_InitHashTables -
3368-
*
3369-
* Initialize our internal hash tables.
3370-
* ----------
3371-
*/
3372-
static void
3373-
ri_InitHashTables(void)
3374-
{
3375-
HASHCTL ctl;
3376-
3377-
ri_InitConstraintCache();
33783346

33793347
/* Arrange to flush cache on pg_constraint changes */
33803348
CacheRegisterSyscacheCallback(CONSTROID,

0 commit comments

Comments
 (0)