mirror of
https://github.com/postgres/postgres.git
synced 2025-08-31 17:02:12 +03:00
Fix incorrect hash equality operator bug in Memoize
In v14, because we don't have a field in RestrictInfo to cache both the left and right type's hash equality operator, we just restrict the scope of Memoize to only when the left and right types of a RestrictInfo are the same. In master we add another field to RestrictInfo and cache both hash equality operators. Reported-by: Jaime Casanova Author: David Rowley Discussion: https://postgr.es/m/20210929185544.GB24346%40ahch-to Backpatch-through: 14
This commit is contained in:
@@ -394,9 +394,15 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info,
|
||||
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
|
||||
OpExpr *opexpr;
|
||||
Node *expr;
|
||||
Oid hasheqoperator;
|
||||
|
||||
/* can't use a memoize node without a valid hash equals operator */
|
||||
if (!OidIsValid(rinfo->hasheqoperator) ||
|
||||
opexpr = (OpExpr *) rinfo->clause;
|
||||
|
||||
/*
|
||||
* Bail if the rinfo is not compatible. We need a join OpExpr
|
||||
* with 2 args.
|
||||
*/
|
||||
if (!IsA(opexpr, OpExpr) || list_length(opexpr->args) != 2 ||
|
||||
!clause_sides_match_join(rinfo, outerrel, innerrel))
|
||||
{
|
||||
list_free(*operators);
|
||||
@@ -404,17 +410,26 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info,
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* We already checked that this is an OpExpr with 2 args when
|
||||
* setting hasheqoperator.
|
||||
*/
|
||||
opexpr = (OpExpr *) rinfo->clause;
|
||||
if (rinfo->outer_is_left)
|
||||
{
|
||||
expr = (Node *) linitial(opexpr->args);
|
||||
hasheqoperator = rinfo->left_hasheqoperator;
|
||||
}
|
||||
else
|
||||
{
|
||||
expr = (Node *) lsecond(opexpr->args);
|
||||
hasheqoperator = rinfo->right_hasheqoperator;
|
||||
}
|
||||
|
||||
*operators = lappend_oid(*operators, rinfo->hasheqoperator);
|
||||
/* can't do memoize if we can't hash the outer type */
|
||||
if (!OidIsValid(hasheqoperator))
|
||||
{
|
||||
list_free(*operators);
|
||||
list_free(*param_exprs);
|
||||
return false;
|
||||
}
|
||||
|
||||
*operators = lappend_oid(*operators, hasheqoperator);
|
||||
*param_exprs = lappend(*param_exprs, expr);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user