diff options
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 10 | ||||
-rw-r--r-- | src/backend/optimizer/util/clauses.c | 31 |
2 files changed, 38 insertions, 3 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index cc8d44bdc09..5658f24323f 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); + uint32 est_entries, Bitmapset *keyparamids); 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,6 +1586,7 @@ static Memoize * create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags) { Memoize *plan; + Bitmapset *keyparamids; Plan *subplan; Oid *operators; Oid *collations; @@ -1617,9 +1618,11 @@ 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); + best_path->est_entries, keyparamids); copy_generic_path_info(&plan->plan, (Path *) best_path); @@ -6419,7 +6422,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) + uint32 est_entries, Bitmapset *keyparamids) { Memoize *node = makeNode(Memoize); Plan *plan = &node->plan; @@ -6436,6 +6439,7 @@ 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 4d0e093b314..9d7aa8b10ff 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -152,6 +152,7 @@ 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); /***************************************************************************** @@ -5167,3 +5168,33 @@ 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); +} |