Re: WITH RECURSIVE doesn't work properly for me

From: Jing Fan <fanjing09(at)gmail(dot)com>
To: Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
Cc: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: WITH RECURSIVE doesn't work properly for me
Date: 2013-11-06 14:53:15
Message-ID: CA+Bectk=hL08A+DEASMLYNDXy6rV7MU5ECZMMwa4kNJ5wHH-Rg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Yeah, that can explain why it doesn't work.

Thank you very much:)

On Wed, Nov 6, 2013 at 8:40 AM, Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>wrote:

> Jing Fan wrote:
> > On Wed, Nov 6, 2013 at 8:10 AM, Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
> wrote:
> >> Let's assume that we have three nodes A, B and C.
> >> Also, A points to B, B points to C and C points to B.
> >>
> >> Let's assume that we already generated (A, B, 1) and (A, C, 2)
> >> in previous iterations.
> >>
> >> Then the "recursive statement" will generate the new
> >> rows (A, C, 2) and (A, B, 3).
> >> The SELECT ... GROUP BY only surrounds the recursive statement,
> >> So the result will still be (A, C, 2) and (A, B, 3).
> >>
> >> Then the UNION will take care of the first triple, but the second
> >> one will be added in this iteration.
> >>
> >> And so on ad infinitum.
>
> > But after this iteration, the paths will be:
> > A B 1
> > B C 1
> > C B 1
> > A C 2
> > A B 3
> >
> > in next iteration, the recursive statement will generate (A,C,2),
> (A,B,3), and (A,C,4), after the
> > group by, it will still be (A,C,2) and (A,B,3)
> > so I think it should stop after this iteration.
>
> I see, I didn't notice that.
>
> Actually there is a mistake in my explanation above, see
>
> http://www.postgresql.org/docs/9.3/static/queries-with.html#QUERIES-WITH-SELECT
> "Recursive Query Evaluation" for a detailed explanation:
>
> In step 2b, the "working table" is replaced with the "intermediate table",
> so the next iteration does not see all previously generated rows,
> but only the ones that were generated in the previous iteration.
>
> So in our case, the working table will look like this:
>
> Initially:
> A B 1
> B C 1
> C B 1
>
> After the first iteration:
> A C 2
>
> After the third iteration:
> A B 3
>
> After the fourth iteration:
> A C 4
>
> ... and so on.
>
> Your GROUP BY assumes that the working table contains
> all previously generated rows.
>
> Yours,
> Laurenz Albe
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Joshua D. Drake 2013-11-06 16:10:44 Re: Is it advisable to pg_upgrade directly from 9.0 to 9.3?
Previous Message Albe Laurenz 2013-11-06 14:40:23 Re: WITH RECURSIVE doesn't work properly for me