mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Flush Memoize cache when non-key parameters change
It's possible that a subplan below a Memoize node contains a parameter from above the Memoize node. If this parameter changes then cache entries may become out-dated due to the new parameter value. Previously Memoize was mistakenly not aware of this. We fix this here by flushing the cache whenever a parameter that's not part of the cache key changes. Bug: #17213 Reported by: Elvis Pranskevichus Author: David Rowley Discussion: https://postgr.es/m/17213-988ed34b225a2862@postgresql.org Backpatch-through: 14, where Memoize was added
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -5214,3 +5215,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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user