Re: BUG #18429: Inconsistent results on similar queries with join lateral
Benoit Ryder <b.ryder@ateme.com>
From: Benoit Ryder <b.ryder@ateme.com>
To: "David G. Johnston" <david.g.johnston@gmail.com>, "pgsql-bugs@lists.postgresql.org" <pgsql-bugs@lists.postgresql.org>
Date: 2024-04-12T14:43:24Z
Lists: pgsql-bugs
I suspected a rounding issue at some point, but using floor didn't helped.
Displaying the values of `c2.t` shows more:
```
with c2 as (
select arrayd.ad d, coalesce(c.t, 0) t
from unnest(ARRAY[4]) as arrayd(ad)
left join lateral (
select wt t from weird.t
where wd = arrayd.ad
order by wt desc limit 1
) c on true
)
select c2.t, c2.d from c2
where (14 - c2.t) / c2.d = (12 - c2.t) / c2.d;
t | d
---+---
0 | 4
(1 row)
with c2 as (
select arrayd.ad d, coalesce(c.t, 0) t
from unnest(ARRAY[4]) as arrayd(ad)
left join lateral (
select wt t from weird.t
where wd = arrayd.ad
order by wt desc limit 1
) c on true
)
select c2.t, c2.d from c2
where true;
t | d
---+---
6 | 4
(1 row)
```
The only difference is the where clause, and it changes the returned value of `c2.t`.
If `c2.t = 0`, the where condition is true with proper integer rounding/truncation, which explains the result from Q1.
________________________________
From: David G. Johnston <david.g.johnston@gmail.com>
Sent: Friday, April 12, 2024 15:52
To: Benoit Ryder <b.ryder@ateme.com>; pgsql-bugs@lists.postgresql.org <pgsql-bugs@lists.postgresql.org>
Subject: Re: BUG #18429: Inconsistent results on similar queries with join lateral
You don't often get email from david.g.johnston@gmail.com. Learn why this is important<https://aka.ms/LearnAboutSenderIdentification>
CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
On Friday, April 12, 2024, PG Bug reporting form <noreply@postgresql.org<mailto:noreply@postgresql.org>> wrote:
The following bug has been logged on the website:
Bug reference: 18429
Logged by: Benoît Ryder
Email address: b.ryder@ateme.com<mailto:b.ryder@ateme.com>
PostgreSQL version: 15.6
Operating system: Debian
Description:
-- `where` clause should return false: (14 - 6) / 4 = (12 - 6) / 4 → false
select 1 from c2 where (14 - c2.t) / c2.d = (12 - c2.t) / c2.
You are doing integer division here and the right hand side equals, 1.5; I suppose something may have used to round that up to the integer 2 which would make both sides equals but now (v16) rounds it down (or more accurately truncates it) to 1.
David J.
Commits
-
Ensure generated join clauses for child rels have correct relids.
- 03107b4eda7f 17.0 landed
- 91800af13710 16.3 landed
-
Fix generation of EC join conditions at the wrong plan level.
- f502849d49a4 12.19 landed
- d9e4ee74f48c 13.15 landed
- ab2402268c04 14.12 landed
- 5aacfa64e5da 15.7 landed
-
Make Vars be outer-join-aware.
- 2489d76c4906 16.0 cited