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:
parent
bb003edbb7
commit
1f194ed6c2
@ -2719,7 +2719,8 @@ check_memoizable(RestrictInfo *restrictinfo)
|
|||||||
{
|
{
|
||||||
TypeCacheEntry *typentry;
|
TypeCacheEntry *typentry;
|
||||||
Expr *clause = restrictinfo->clause;
|
Expr *clause = restrictinfo->clause;
|
||||||
Node *leftarg;
|
Oid lefttype;
|
||||||
|
Oid righttype;
|
||||||
|
|
||||||
if (restrictinfo->pseudoconstant)
|
if (restrictinfo->pseudoconstant)
|
||||||
return;
|
return;
|
||||||
@ -2728,9 +2729,19 @@ check_memoizable(RestrictInfo *restrictinfo)
|
|||||||
if (list_length(((OpExpr *) clause)->args) != 2)
|
if (list_length(((OpExpr *) clause)->args) != 2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
leftarg = linitial(((OpExpr *) clause)->args);
|
lefttype = exprType(linitial(((OpExpr *) clause)->args));
|
||||||
|
righttype = exprType(lsecond(((OpExpr *) clause)->args));
|
||||||
|
|
||||||
typentry = lookup_type_cache(exprType(leftarg), TYPECACHE_HASH_PROC |
|
/*
|
||||||
|
* Really there should be a field for both the left and right hash
|
||||||
|
* equality operator, however, in v14, there's only a single field in
|
||||||
|
* RestrictInfo to record the operator in, so we must insist that the left
|
||||||
|
* and right types match.
|
||||||
|
*/
|
||||||
|
if (lefttype != righttype)
|
||||||
|
return;
|
||||||
|
|
||||||
|
typentry = lookup_type_cache(lefttype, TYPECACHE_HASH_PROC |
|
||||||
TYPECACHE_EQ_OPR);
|
TYPECACHE_EQ_OPR);
|
||||||
|
|
||||||
if (!OidIsValid(typentry->hash_proc) || !OidIsValid(typentry->eq_opr))
|
if (!OidIsValid(typentry->hash_proc) || !OidIsValid(typentry->eq_opr))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user