Re: BUG #17774: Assert triggered on brin_minmax_multi.c - Mailing list pgsql-bugs

From John Naylor
Subject Re: BUG #17774: Assert triggered on brin_minmax_multi.c
Date
Msg-id CAFBsxsEMigeTVhBOpsBHw+SJS1n776akNqVC8ATEDmGo_OPgrw@mail.gmail.com
Whole thread Raw
In response to BUG #17774: Assert triggered on brin_minmax_multi.c  (PG Bug reporting form <noreply@postgresql.org>)
Responses Re: BUG #17774: Assert triggered on brin_minmax_multi.c
List pgsql-bugs
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

pgsql-bugs by date:

Previous
From: Richard Guo
Date:
Subject: Re: BUG #17781: Assert in setrefs.c
Next
From: Dmitry Dolgov
Date:
Subject: Re: BUG #17774: Assert triggered on brin_minmax_multi.c