On Mon, Feb 6, 2023 at 3:06 PM PG Bug reporting form <
noreply@postgresql.org> wrote:
> This assert() is not easily reproducible, but thought the backtraces may be
> interesting.
>
> TRAP: FailedAssertion("(delta >= 0) && (delta <= 1)", File:
> "brin_minmax_multi.c", Line: 2393, PID: 2922100)
> #2 0x000055e143f0ae8b in ExceptionalCondition (
> conditionName=0x55e143f92604 "(delta >= 0) && (delta <= 1)",
> errorType=0x55e143f91ef4 "FailedAssertion",
> fileName=0x55e143f91ee0 "brin_minmax_multi.c", lineNumber=2393)
> at assert.c:69
> No locals.
> #3 0x000055e1437e8972 in brin_minmax_multi_distance_inet (
> fcinfo=0x7ffc448234f0) at brin_minmax_multi.c:2393
> delta = -2.3283064365386963e-10
> i = -1
> len = 4
> addra = 0x55e14ee95fc0 ""
> addrb = 0x55e14ee95fe0 ""
> ipa = 0x55e14d95a1e0
> ipb = 0x55e149a6fdc8
> lena = 0
> lenb = 32
Thanks for the report! From the stack trace we can see that it computed a negative delta, coming from:
/* Calculate the difference between the addresses. */
delta = 0;
for (i = len - 1; i >= 0; i--)
{
unsigned char a = addra[i];
unsigned char b = addrb[i];
delta += (float8) b - (float8) a;
delta /= 256;
}
Assert((delta >= 0) && (delta <= 1));
I wonder if it needs to be something like "delta += Abs((float8) b - (float8) a);".
--
John Naylor
EDB:
http://www.enterprisedb.com