aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/ri_triggers.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2015-09-15 11:08:56 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2015-09-15 11:08:56 -0400
commit541ec18acf2f6c8df095e45af980f59b82475d1e (patch)
treeed734b8786c04db1091b4cbfec236a92cac0d90f /src/backend/utils/adt/ri_triggers.c
parent35d2fc1f299a977483a1ac6d08bfbda104ad2b25 (diff)
downloadpostgresql-541ec18acf2f6c8df095e45af980f59b82475d1e.tar.gz
postgresql-541ec18acf2f6c8df095e45af980f59b82475d1e.zip
Revert "Fix an O(N^2) problem in foreign key references".
Commit 5ddc72887a012f6a8b85707ef27d85c274faf53d 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.
Diffstat (limited to 'src/backend/utils/adt/ri_triggers.c')
-rw-r--r--src/backend/utils/adt/ri_triggers.c38
1 files changed, 3 insertions, 35 deletions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3de2018bef9..9052052407f 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -182,7 +182,6 @@ typedef struct RI_CompareHashEntry
* ----------
*/
static HTAB *ri_constraint_cache = NULL;
-static long ri_constraint_cache_seq_count = 0;
static HTAB *ri_query_cache = NULL;
static HTAB *ri_compare_cache = NULL;
@@ -215,7 +214,6 @@ static bool ri_KeysEqual(Relation rel, HeapTuple oldtup, HeapTuple newtup,
static bool ri_AttributesEqual(Oid eq_opr, Oid typeid,
Datum oldvalue, Datum newvalue);
-static void ri_InitConstraintCache(void);
static void ri_InitHashTables(void);
static void InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue);
static SPIPlanPtr ri_FetchPreparedPlan(RI_QueryKey *key);
@@ -2934,20 +2932,6 @@ InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue)
Assert(ri_constraint_cache != NULL);
- /*
- * Prevent an O(N^2) problem when creating large amounts of foreign
- * key constraints with ALTER TABLE, like it happens at the end of
- * a pg_dump with hundred-thousands of tables having references.
- */
- ri_constraint_cache_seq_count += hash_get_num_entries(ri_constraint_cache);
- if (ri_constraint_cache_seq_count > 1000000)
- {
- hash_destroy(ri_constraint_cache);
- ri_InitConstraintCache();
- ri_constraint_cache_seq_count = 0;
- return;
- }
-
hash_seq_init(&status, ri_constraint_cache);
while ((hentry = (RI_ConstraintInfo *) hash_seq_search(&status)) != NULL)
{
@@ -3343,15 +3327,13 @@ ri_NullCheck(HeapTuple tup,
/* ----------
- * ri_InitConstraintCache
- *
- * Initialize ri_constraint_cache when new or being rebuilt.
+ * ri_InitHashTables -
*
- * This needs to be done from two places, so split it out to prevent drift.
+ * Initialize our internal hash tables.
* ----------
*/
static void
-ri_InitConstraintCache(void)
+ri_InitHashTables(void)
{
HASHCTL ctl;
@@ -3362,20 +3344,6 @@ ri_InitConstraintCache(void)
ri_constraint_cache = hash_create("RI constraint cache",
RI_INIT_CONSTRAINTHASHSIZE,
&ctl, HASH_ELEM | HASH_FUNCTION);
-}
-
-/* ----------
- * ri_InitHashTables -
- *
- * Initialize our internal hash tables.
- * ----------
- */
-static void
-ri_InitHashTables(void)
-{
- HASHCTL ctl;
-
- ri_InitConstraintCache();
/* Arrange to flush cache on pg_constraint changes */
CacheRegisterSyscacheCallback(CONSTROID,