> At David's request I've been looking through this patch.
> 
> Regarding documentation: if it would help, I can write some; I have
> already made a start on writing down what is going on internally in
> order to understand it myself.

Thanks. There was some docs written in Japanese by Yoshiyuki. Recently
he updagted it. I will translate into English and post here.

> I've found three more bugs so far:
> 
> 1)
> 
> create view v2(id) as values (1);
> with recursive t(id) as (select id from v2
>                          union all select id+1 from t where id < 5)
> select * from t;
> ERROR:  could not open relation 1663/16384/24588: No such file or directory
> 
> Here it seems that rewriting is simply not being applied to CTEs where
> a recursive clause is present; the reference to "v2" remains in the
> query up until execution time, at which point it errors out (in
> ExecInitSeqScan called from InitPlan).

Yes, we need to make the rewrite system to understand CTEs. Probably
fireRIRrules() needs to have lines something like:

                if (rte->rtekind == RTE_RECURSIVE)
                {
                        rte->non_recursive_query = 
fireRIRrules(rte->non_recursive_query, activeRIRs);
                        continue;
                }

But I still see the error message. Will look into more.

For below, I will ask Yoshiyuki.
--
Tatsuo Ishii
SRA OSS, Inc. Japan

> 2)
> 
> with recursive t(id) as (values (1)
>                          union all select id+1 from t where id < 5
>                          union all values (2))
> select * from t;
> ERROR:  table "t" has 0 columns available but 1 columns specified
> 
> This seems to be caused by incorrect assumptions in checkWellFormedCte
> and checkCteSelectStmt (which should have been rejecting the query).
> The query tree as seen by checkWellFormedCte here is (values(1) union
> all select ...) union all (values (2)), and when the left subtree is
> passed to checkCteSelectStmt, it believes it to be non-recursive due
> to the lack of any From clause. The unexpected error is produced
> later.
> 
> 3)
> 
> with recursive t(id)
>   as (values (1)
>       union all select t.id+1
>                   from t left join (values (1)) as s(x) on (false)
>                  where t.id < 5)
> select * from t;
>  id 
> ----
>   1
>   2
> (2 rows)
> 
> This behaviour is clearly intentional, since the entire mechanism of
> estate->es_disallow_tuplestore exists for no other reason, but it
> seems to me to be clearly wrong. What is the justification for it?
> 
> -- 
> Andrew (irc:RhodiumToad)
> 
> -- 
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to