Обсуждение: [GENERAL] is this a known bug in 9.6?
Hi,
this is a stock PGDG 9.6:
postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select x from (select x from i union all select y from j) b;
x
---
1
2
(2 rows)
postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select max(x) from (select x from i union all select y from j) b;
ERROR: could not find plan for CTE "i"
x
---
1
2
(2 rows)
postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select max(x) from (select x from i union all select y from j) b;
ERROR: could not find plan for CTE "i"
The same on 9.5:
postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select x from (select x from i union all select y from j) b;
x
---
1
2
(2 rows)
postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select max(x) from (select x from i union all select y from j) b;
max
-----
2
(1 row)
x
---
1
2
(2 rows)
postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select max(x) from (select x from i union all select y from j) b;
max
-----
2
(1 row)
Is this a bug or is my assumption that this should work wrong?
Both the aggregate and the UNION are required to trigger the bug:
postgres=# with i(x) as (values (1::int)) select x from (select x from i union all select 3::int) b;
x
---
1
3
(2 rows)
postgres=# with i(x) as (values (1::int)) select max(x) from (select x from i) b;
max
-----
1
(1 row)
postgres=# with i(x) as (values (1::int)) select max(x) from (select x from i union all select 3::int) b;
ERROR: could not find plan for CTE "i"
x
---
1
3
(2 rows)
postgres=# with i(x) as (values (1::int)) select max(x) from (select x from i) b;
max
-----
1
(1 row)
postgres=# with i(x) as (values (1::int)) select max(x) from (select x from i union all select 3::int) b;
ERROR: could not find plan for CTE "i"
Thanks,
Torsten
=?UTF-8?Q?Torsten_F=C3=B6rtsch?= <tfoertsch123@gmail.com> writes: > postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select > x from (select x from i union all select y from j) b; > x > --- > 1 > 2 > (2 rows) > postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select > max(x) from (select x from i union all select y from j) b; > ERROR: could not find plan for CTE "i" Yup, sure looks like a bug to me, especially since it seems to work as expected before 9.5. No idea offhand what broke it. regards, tom lane
> -----Original Message----- > From: pgsql-general-owner@postgresql.org [mailto:pgsql-general- > owner@postgresql.org] On Behalf Of Tom Lane > Sent: Dienstag, 13. Dezember 2016 16:32 > To: Torsten Förtsch > Cc: pgsql-general@postgresql.org > Subject: Re: [GENERAL] is this a known bug in 9.6? > > =?UTF-8?Q?Torsten_F=C3=B6rtsch?= <tfoertsch123@gmail.com> writes: > > postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) > > select x from (select x from i union all select y from j) b; x > > --- > > 1 > > 2 > > (2 rows) > > > postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) > > select > > max(x) from (select x from i union all select y from j) b; > > ERROR: could not find plan for CTE "i" > > Yup, sure looks like a bug to me, especially since it seems to work as > expected before 9.5. No idea offhand what broke it. > > regards, tom lane This is strange: using another aggreg. function works: with i as (select 1::int x), j as (select 1::int x) select count(x) from (select x from i union all select x from j) b; --- 2 with i as (select 1::int x), j as (select 1::int x) select max(x) from (select x from i union all select x from j) b; --- ERROR: could not find plan for CTE "i" regards, Marc Mamin
Thanks for confirming.
Here are a few more examples that also work:
with i(x) as (values (1::int)) select x from (select x from i union all select 3::int) b order by x desc limit 1;
with i(x) as (values (1::int)) select max(x) from (select x from i union select 3::int) b;
It also works with EXCEPT or INTERSECT, both with or without ALL.
The UNION ALL version fails with MIN and MAX but it works with all other aggregates that I have tested.
On Tue, Dec 13, 2016 at 4:31 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Torsten F\xC3=B6rtsch <tfoertsch123@gmail.com> writes:
> postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select
> x from (select x from i union all select y from j) b;
> x
> ---
> 1
> 2
> (2 rows)
> postgres=# with i(x) as (values (1::int)), j(y) as (values (2::int)) select
> max(x) from (select x from i union all select y from j) b;
> ERROR: could not find plan for CTE "i"
Yup, sure looks like a bug to me, especially since it seems to work as
expected before 9.5. No idea offhand what broke it.
regards, tom lane
I wrote: > Yup, sure looks like a bug to me, especially since it seems to work as > expected before 9.5. No idea offhand what broke it. The answer is, I broke it, through some ill-advised neatnik-ism :-(, ie clearing a field I thought would be unused but it wasn't. Fix pushed. Thanks for the report! regards, tom lane
Thanks Tom
On Tue, Dec 13, 2016 at 7:22 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
I wrote:
> Yup, sure looks like a bug to me, especially since it seems to work as
> expected before 9.5. No idea offhand what broke it.
The answer is, I broke it, through some ill-advised neatnik-ism :-(,
ie clearing a field I thought would be unused but it wasn't.
Fix pushed. Thanks for the report!
regards, tom lane