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