> On 14. Jan 2022, at 13:21, Peter Eisentraut 
> <peter.eisentr...@enterprisedb.com> wrote:

> 
> There is nothing in there that says that certain branches of the UNION in a 
> recursive query mean certain things. In fact, it doesn't even require the 
> query to contain a UNION at all.  It just says to iterate on evaluating the 
> query until a fixed point is reached.  I think this supports my claim that 
> the associativity and commutativity of a UNION in a recursive query still 
> apply.
> 
> This is all very complicated, so I don't claim this to be authoritative, but 
> I just don't see anything in the spec that supports what you are saying.


I disagree. In SQL:2016, it's discussed in 7.16 <query expression> syntax rule 
3) j) i), which defines:

> 3) Among the WQEi, ... WQEk of a given stratum, there shall be at least one 
> <query expres-
>    sion>, say WQEj, such that:
>     A) WQEj is a <query expression body> that immediately contains UNION.
>     B) WQEj has one operand that does not contain a <query name> referencing 
> any of WQNi,
>        ..., WQNk. This operand is said to be the non-recursive operand of 
> WQEj.
>     C) WQEj is said to be an anchor expression, and WQNj an anchor name.

Where <query expression body> is defined as:
> <query expression body> ::=
>     <query term>
>   | <query expression body> UNION [ALL | DISTINCT]
>       [ <corresponding spec> ] <query term>
>
> <query term> ::=
>     <query primary>
>   | ...
>
> <query primary> ::= ...
>   | <left paren> <query expression body> ... <right paren>

This definition pretty much sums up what I have called RUNION.

The SQL standard might not impose a strict order on the UNION branches.
But you have to be able to uniquely identify the anchor expression.

Best,
  -- Denis

Reply via email to