Fix order of parameters in BRIN minmax-multi calls
authorTomas Vondra <[email protected]>
Sun, 4 Apr 2021 17:25:36 +0000 (19:25 +0200)
committerTomas Vondra <[email protected]>
Sun, 4 Apr 2021 17:25:41 +0000 (19:25 +0200)
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

index 19ded7d933c9e52c91a395449fa63d499d8f3661..2f4e92695c79061039855fe791584991cd329dc3 100644 (file)
@@ -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))