Bug in brin_minmax_multi_distance_numeric() - Mailing list pgsql-hackers

From Tom Lane
Subject Bug in brin_minmax_multi_distance_numeric()
Date
Msg-id 2093712.1753983215@sss.pgh.pa.us
Whole thread Raw
Responses Re: Bug in brin_minmax_multi_distance_numeric()
List pgsql-hackers
Per the discussion in [1], I think we need something like

-    PG_RETURN_FLOAT8(DirectFunctionCall1(numeric_float8, d));
+    PG_RETURN_DATUM(DirectFunctionCall1(numeric_float8, d));

in brin_minmax_multi_distance_numeric().  Peter was proposing
that as cosmetic cleanup, but I think it's actually a functional
bug that needs to be back-patched.  It is certainly broken on
32-bit machines where the Datum result of numeric_float8 will
be a pointer, so that we will convert the numeric pointer value
to a float and return that, yielding a totally-garbage distance
value.  But I think it's broken on 64-bit machines too, because
we'll be interpreting the output of numeric_float8 as a uintptr_t
and applying some unwanted conversion to make that a float.

It's not clear to me exactly what this function is used for,
but I guess the consequences would be broken BRIN indexes
on numeric columns?

            regards, tom lane

[1] https://www.postgresql.org/message-id/2091622.1753982274%40sss.pgh.pa.us



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Datum as struct
Next
From: Nathan Bossart
Date:
Subject: Re: Non-text mode for pg_dumpall