diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c index 31e3972223..683502dd90 100644 --- a/src/backend/executor/nodeMemoize.c +++ b/src/backend/executor/nodeMemoize.c @@ -367,37 +367,6 @@ remove_cache_entry(MemoizeState *mstate, MemoizeEntry *entry) pfree(key); } -/* - * cache_purge_all - * Remove all items from the cache - */ -static void -cache_purge_all(MemoizeState *mstate) -{ - uint64 evictions = mstate->hashtable->members; - PlanState *pstate = (PlanState *) mstate; - - /* - * Likely the most efficient way to remove all items is to just reset the - * memory context for the cache and then rebuild a fresh hash table. This - * saves having to remove each item one by one and pfree each cached tuple - */ - MemoryContextReset(mstate->tableContext); - - /* Make the hash table the same size as the original size */ - build_hash_table(mstate, ((Memoize *) pstate->plan)->est_entries); - - /* reset the LRU list */ - dlist_init(&mstate->lru_list); - mstate->last_tuple = NULL; - mstate->entry = NULL; - - mstate->mem_used = 0; - - /* XXX should we add something new to track these purges? */ - mstate->stats.cache_evictions += evictions; /* Update Stats */ -} - /* * cache_reduce_memory * Evict older and less recently used items from the cache in order to @@ -1010,7 +979,6 @@ ExecInitMemoize(Memoize *node, EState *estate, int eflags) * getting the first tuple. This allows us to mark it as so. */ mstate->singlerow = node->singlerow; - mstate->keyparamids = node->keyparamids; /* * Record if the cache keys should be compared bit by bit, or logically @@ -1114,12 +1082,6 @@ ExecReScanMemoize(MemoizeState *node) if (outerPlan->chgParam == NULL) ExecReScan(outerPlan); - /* - * Purge the entire cache if a parameter changed that is not part of the - * cache key. - */ - if (bms_nonempty_difference(outerPlan->chgParam, node->keyparamids)) - cache_purge_all(node); } /* diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c index bff70cfb1a..649478b0d4 100644 --- a/src/backend/nodes/bitmapset.c +++ b/src/backend/nodes/bitmapset.c @@ -540,8 +540,6 @@ bms_overlap_list(const Bitmapset *a, const List *b) /* * bms_nonempty_difference - do sets have a nonempty difference? - * - * i.e., are any members set in 'a' that are not also set in 'b'. */ bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b) diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index f12660a260..866f19f64c 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -280,7 +280,7 @@ static Material *make_material(Plan *lefttree); static Memoize *make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations, List *param_exprs, bool singlerow, bool binary_mode, - uint32 est_entries, Bitmapset *keyparamids); + uint32 est_entries); static WindowAgg *make_windowagg(List *tlist, Index winref, int partNumCols, AttrNumber *partColIdx, Oid *partOperators, Oid *partCollations, int ordNumCols, AttrNumber *ordColIdx, Oid *ordOperators, Oid *ordCollations, @@ -1586,7 +1586,6 @@ static Memoize * create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags) { Memoize *plan; - Bitmapset *keyparamids; Plan *subplan; Oid *operators; Oid *collations; @@ -1618,11 +1617,9 @@ create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags) i++; } - keyparamids = pull_paramids((Expr *) param_exprs); - plan = make_memoize(subplan, operators, collations, param_exprs, best_path->singlerow, best_path->binary_mode, - best_path->est_entries, keyparamids); + best_path->est_entries); copy_generic_path_info(&plan->plan, (Path *) best_path); @@ -6423,7 +6420,7 @@ materialize_finished_plan(Plan *subplan) static Memoize * make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations, List *param_exprs, bool singlerow, bool binary_mode, - uint32 est_entries, Bitmapset *keyparamids) + uint32 est_entries) { Memoize *node = makeNode(Memoize); Plan *plan = &node->plan; @@ -6440,7 +6437,6 @@ make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations, node->singlerow = singlerow; node->binary_mode = binary_mode; node->est_entries = est_entries; - node->keyparamids = keyparamids; return node; } diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 873e43bfe6..109f93d109 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -152,7 +152,6 @@ static Query *substitute_actual_srf_parameters(Query *expr, int nargs, List *args); static Node *substitute_actual_srf_parameters_mutator(Node *node, substitute_actual_srf_parameters_context *context); -static bool pull_paramids_walker(Node *node, Bitmapset **context); /***************************************************************************** @@ -5215,33 +5214,3 @@ substitute_actual_srf_parameters_mutator(Node *node, substitute_actual_srf_parameters_mutator, (void *) context); } - -/* - * pull_paramids - * Returns a Bitmapset containing the paramids of all Params in 'expr'. - */ -Bitmapset * -pull_paramids(Expr *expr) -{ - Bitmapset *result = NULL; - - (void) pull_paramids_walker((Node *) expr, &result); - - return result; -} - -static bool -pull_paramids_walker(Node *node, Bitmapset **context) -{ - if (node == NULL) - return false; - if (IsA(node, Param)) - { - Param *param = (Param *)node; - - *context = bms_add_member(*context, param->paramid); - return false; - } - return expression_tree_walker(node, pull_paramids_walker, - (void *) context); -} diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index ddc3529332..d96ace32e4 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -2113,8 +2113,6 @@ typedef struct MemoizeState * by bit, false when using hash equality ops */ MemoizeInstrumentation stats; /* execution statistics */ SharedMemoizeInfo *shared_info; /* statistics for parallel workers */ - Bitmapset *keyparamids; /* Param->paramids of expressions belonging to - * param_exprs */ } MemoizeState; /* ---------------- diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index be3c30704a..f1328be354 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -804,7 +804,6 @@ typedef struct Memoize uint32 est_entries; /* The maximum number of entries that the * planner expects will fit in the cache, or 0 * if unknown */ - Bitmapset *keyparamids; /* paramids from param_exprs */ } Memoize; /* ---------------- diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index bc3f3e60d4..0673887a85 100644 --- a/src/include/optimizer/clauses.h +++ b/src/include/optimizer/clauses.h @@ -53,6 +53,4 @@ extern void CommuteOpExpr(OpExpr *clause); extern Query *inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte); -extern Bitmapset *pull_paramids(Expr *expr); - #endif /* CLAUSES_H */ diff --git a/src/test/regress/expected/memoize.out b/src/test/regress/expected/memoize.out index 9102957927..0ed5d8474a 100644 --- a/src/test/regress/expected/memoize.out +++ b/src/test/regress/expected/memoize.out @@ -196,45 +196,6 @@ SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false); (8 rows) DROP TABLE strtest; --- Exercise Memoize code that flushes the cache when a parameter changes which --- is not part of the cache key. --- Ensure we get a Memoize plan -EXPLAIN (COSTS OFF) -SELECT UNIQUE1 FROM tenk1 t0 -WHERE unique1 < 3 - AND EXISTS ( - SELECT 1 FROM tenk1 t1 - INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred - WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); - QUERY PLAN ----------------------------------------------------------------- - Index Scan using tenk1_unique1 on tenk1 t0 - Index Cond: (unique1 < 3) - Filter: (SubPlan 1) - SubPlan 1 - -> Nested Loop - -> Index Scan using tenk2_hundred on tenk2 t2 - Filter: (t0.two <> four) - -> Memoize - Cache Key: t2.hundred - Cache Mode: logical - -> Index Scan using tenk1_unique1 on tenk1 t1 - Index Cond: (unique1 = t2.hundred) - Filter: (t0.ten = twenty) -(13 rows) - --- Ensure the above query returns the correct result -SELECT UNIQUE1 FROM tenk1 t0 -WHERE unique1 < 3 - AND EXISTS ( - SELECT 1 FROM tenk1 t1 - INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred - WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); - unique1 ---------- - 2 -(1 row) - RESET enable_seqscan; RESET enable_mergejoin; RESET work_mem; diff --git a/src/test/regress/sql/memoize.sql b/src/test/regress/sql/memoize.sql index 00f38f933c..3c7360adf9 100644 --- a/src/test/regress/sql/memoize.sql +++ b/src/test/regress/sql/memoize.sql @@ -103,26 +103,6 @@ SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false); DROP TABLE strtest; --- Exercise Memoize code that flushes the cache when a parameter changes which --- is not part of the cache key. - --- Ensure we get a Memoize plan -EXPLAIN (COSTS OFF) -SELECT UNIQUE1 FROM tenk1 t0 -WHERE unique1 < 3 - AND EXISTS ( - SELECT 1 FROM tenk1 t1 - INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred - WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); - --- Ensure the above query returns the correct result -SELECT UNIQUE1 FROM tenk1 t0 -WHERE unique1 < 3 - AND EXISTS ( - SELECT 1 FROM tenk1 t1 - INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred - WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0); - RESET enable_seqscan; RESET enable_mergejoin; RESET work_mem;