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

From Dmitry Dolgov
Subject Re: BUG #17774: Assert triggered on brin_minmax_multi.c
Date
Msg-id 20230208100658.mz2kkeruoma6iqtw@ddolgov.remote.csb
Whole thread Raw
In response to Re: BUG #17774: Assert triggered on brin_minmax_multi.c  (John Naylor <john.naylor@enterprisedb.com>)
Responses Re: BUG #17774: Assert triggered on brin_minmax_multi.c  (Dmitry Dolgov <9erthalion6@gmail.com>)
Re: BUG #17774: Assert triggered on brin_minmax_multi.c  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
> On Wed, Feb 08, 2023 at 04:26:49PM +0700, John Naylor wrote:
> 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);".

The negative delta might be only a consequence. From what I see it's
called from build_distances, and the idea is to find the gaps between
the max value of the current interval and the min value of the next one,
so they should be ordered and delta should be always positive.

In fact, I've just reproduced it by randomly inserting some inets into
the test table, let me see if I can get a stable reproducer.



pgsql-bugs by date:

Previous
From: John Naylor
Date:
Subject: Re: BUG #17774: Assert triggered on brin_minmax_multi.c
Next
From: Dmitry Dolgov
Date:
Subject: Re: BUG #17774: Assert triggered on brin_minmax_multi.c