pá 22. 5. 2020 v 11:25 odesílatel Peter Eisentraut <
peter.eisentr...@2ndquadrant.com> napsal:

> On 2020-05-20 21:28, Vik Fearing wrote:
> > 1)
> > There are some smart quotes in the comments that should be converted to
> > single quotes.
>
> ok, fixing that
>
> > 2)
> > This query is an infinite loop, as expected:
> >
> >    with recursive a as (select 1 as b union all select b from a)
> >    table a;
> >
> > But it becomes an error when you add a cycle clause to it:
> >
> >    with recursive a as (select 1 as b union all table a)
> >      cycle b set c to true default false using p
> >    table a;
> >
> >    ERROR:  each UNION query must have the same number of columns
>
> table a expands to select * from a, and if you have a cycle clause, then
> a has three columns, but the other branch of the union only has one, so
> that won't work anymore, will it?
>
> > 3)
> > If I take the same infinite loop query but replace the TABLE syntax with
> > a SELECT and add a cycle clause, it's not an infinite loop anymore.
> >
> >    with recursive a as (select 1 as b union all select b from a)
> >      cycle b set c to true default false using p
> >    table a;
> >
> >   b | c |     p
> > ---+---+-----------
> >   1 | f | {(1)}
> >   1 | t | {(1),(1)}
> > (2 rows)
> >
> > Why does it stop?  It should still be an infinite loop.
>
> If you specify the cycle clause, then the processing will stop if it
> sees the same row more than once, which it did here.
>
> > 4)
> > If I use NULL instead of false, I only get one row back.
> >
> >    with recursive a as (select 1 as b union all select b from a)
> >      cycle b set c to true default false using p
> >    table a;
> >
> >   b | c |   p
> > ---+---+-------
> >   1 |   | {(1)}
> > (1 row)
>
> If you specify null, then the cycle check expression will always fail,
> so it will abort after the first row.  (We should perhaps prohibit
> specifying null, but see below.)
>
> > 5)
> > I can set both states to the same value.
> >
> >    with recursive a as (select 1 as b union all select b from a)
> >      cycle b set c to true default true using p
> >    table a;
>
> > This is a direct violation of 7.18 SR 2.b.ii.3 as well as common sense.
> >   BTW, I applaud your decision to violate the other part of that rule and
> > allowing any data type here.
> >
> >
> > 5)
> > The same rule as above says that the value and the default value must be
> > literals but not everything that a human might consider a literal is
> > accepted.  In particular:
> >
> >    with recursive a as (select 1 as b union all select b from a)
> >      cycle b set c to 1 default -1 using p
> >    table a;
> >
> >    ERROR:  syntax error at or near "-"
> >
> > Can we just accept a full a_expr here instead of AexprConst?  Both
> > DEFAULT and USING are fully reserved keywords.
>
> This is something we need to think about.  If we want to check at parse
> time whether the two values are not the same (and perhaps not null),
> then we either need to restrict the generality of what we can specify,
> or we need to be prepared to do full expression evaluation in the
> parser.  A simple and practical way might be to only allow string and
> boolean literal.  I don't have a strong opinion here.
>

if you check it in parse time, then you disallow parametrization there.

Is any reason to do this check in parse time?


> --
> Peter Eisentraut              http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>
>
>

Reply via email to