From 1dad2a5ea3d14dd205603c31cc94ec088183ab2a Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sun, 4 Apr 2021 19:25:36 +0200 Subject: [PATCH] Fix order of parameters in BRIN minmax-multi calls The BRIN minmax-multi consistent function incorrectly assumed it can lookup an operator, and then swap the arguments to get the commutator. For example <(a,b) would be called as <(b,a) to get >(a,b). This works when the arguments are of the same type, but with cross-type opclasses this fails. We can't swap <(float4,float8) arguments, for example. Fixed by passing arguments in the right order. Discussion: https://postgr.es/m/CAJKUy5jLZFLCxyxfT%3DMfK5mtPfSzHA1rVLowR-j4RRsFVvKm7A%40mail.gmail.com --- src/backend/access/brin/brin_minmax_multi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index 19ded7d933c..2f4e92695c7 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -2606,16 +2606,16 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) * value in the array. */ cmpFn = minmax_multi_get_strategy_procinfo(bdesc, attno, subtype, - BTLessStrategyNumber); - compar = FunctionCall2Coll(cmpFn, colloid, value, minval); + BTGreaterStrategyNumber); + compar = FunctionCall2Coll(cmpFn, colloid, minval, value); /* smaller than the smallest value in this range */ if (DatumGetBool(compar)) break; cmpFn = minmax_multi_get_strategy_procinfo(bdesc, attno, subtype, - BTGreaterStrategyNumber); - compar = FunctionCall2Coll(cmpFn, colloid, value, maxval); + BTLessStrategyNumber); + compar = FunctionCall2Coll(cmpFn, colloid, maxval, value); /* larger than the largest value in this range */ if (DatumGetBool(compar))