Re: BUG #17068: Incorrect ordering of a particular row. - Mailing list pgsql-bugs

From David Rowley
Subject Re: BUG #17068: Incorrect ordering of a particular row.
Date
Msg-id CAApHDvr=A5ZMYm-Jy1g4AyfMBeOJGfP_5zJEW9N9k_S5PjwN4Q@mail.gmail.com
Whole thread Raw
In response to BUG #17068: Incorrect ordering of a particular row.  (PG Bug reporting form <noreply@postgresql.org>)
Responses Re: BUG #17068: Incorrect ordering of a particular row.  (Thomas Munro <thomas.munro@gmail.com>)
Re: BUG #17068: Incorrect ordering of a particular row.  (David Rowley <dgrowleyml@gmail.com>)
List pgsql-bugs
On Tue, 22 Jun 2021 at 21:39, PG Bug reporting form
<noreply@postgresql.org> wrote:
>   5 | Nikon
>   1 |
>   1 |
>   1 |
>   3 |
>   3 |
>   3 |
>   3 |
>   5 |
>   4 |
>   4 |
>   4 |
>   4 |
> (44 rows)
> ```
>
> Problem:
> `5|` ordering is incorrect.
>
> Result expected:
> `5|` row should be the last row in the output.

That seems very bug-like to me. Thanks for reporting it.

I've attached an SQL file to make it easier to reproduce.

The top-level sort does appear to contain all the correct columns and
as far as I can tell the sort operation is using all the correct
functions during the comparison. record_cmp() seems to be correctly
returning 0 when the final columns being compared are both NULL.
Putting some debug inside btint4fastcmp(), it seems to receive:

NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 5, b = 3, compare = 1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 5, b = 3, compare = 1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 1, compare = 1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 5, b = 3, compare = 1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 3, b = 5, compare = -1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 5, b = 3, compare = 1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 4, b = 4, compare = 0
NOTICE:  a = 4, b = 4, compare = 0
NOTICE:  a = 4, b = 4, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 3, b = 5, compare = -1
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 5, b = 3, compare = 1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 3, compare = -1
NOTICE:  a = 3, b = 3, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 1, b = 1, compare = 0
NOTICE:  a = 1, b = 1, compare = 0

It seems a bit fishy that the only 4s that appear here are being
compared to 4.  How does qsort figure out that 5 > 4 or 4 < 5?

David

Attachment

pgsql-bugs by date:

Previous
From: Thomas Munro
Date:
Subject: Re: BUG #17064: Parallel VACUUM operations cause the error "global/pg_filenode.map contains incorrect checksum"
Next
From: Thomas Munro
Date:
Subject: Re: BUG #17068: Incorrect ordering of a particular row.