@@ -579,79 +579,79 @@ insert into graph values
579579 (1, 4, 'arc 1 -> 4'),
580580 (4, 5, 'arc 4 -> 5'),
581581 (5, 1, 'arc 5 -> 1');
582- with recursive search_graph(f, t, label, path, cycle ) as (
583- select *, array[row(g.f, g.t)], false from graph g
582+ with recursive search_graph(f, t, label, is_cycle, path ) as (
583+ select *, false, array[row(g.f, g.t)] from graph g
584584 union all
585- select g.*, path || row(g.f, g.t), row(g.f, g.t) = any(path )
585+ select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t)
586586 from graph g, search_graph sg
587- where g.f = sg.t and not cycle
587+ where g.f = sg.t and not is_cycle
588588)
589589select * from search_graph;
590- f | t | label | path | cycle
591- ---+---+------------+-------------------------------------------+ -------
592- 1 | 2 | arc 1 -> 2 | {"(1,2)"} | f
593- 1 | 3 | arc 1 -> 3 | {"(1,3)"} | f
594- 2 | 3 | arc 2 -> 3 | {"(2,3)"} | f
595- 1 | 4 | arc 1 -> 4 | {"(1,4)"} | f
596- 4 | 5 | arc 4 -> 5 | {"(4,5)"} | f
597- 5 | 1 | arc 5 -> 1 | {"(5,1)"} | f
598- 1 | 2 | arc 1 -> 2 | {"(5,1)","(1,2)"} | f
599- 1 | 3 | arc 1 -> 3 | {"(5,1)","(1,3)"} | f
600- 1 | 4 | arc 1 -> 4 | {"(5,1)","(1,4)"} | f
601- 2 | 3 | arc 2 -> 3 | {"(1,2)","(2,3)"} | f
602- 4 | 5 | arc 4 -> 5 | {"(1,4)","(4,5)"} | f
603- 5 | 1 | arc 5 -> 1 | {"(4,5)","(5,1)"} | f
604- 1 | 2 | arc 1 -> 2 | {"(4,5)","(5,1)","(1,2)"} | f
605- 1 | 3 | arc 1 -> 3 | {"(4,5)","(5,1)","(1,3)"} | f
606- 1 | 4 | arc 1 -> 4 | {"(4,5)","(5,1)","(1,4)"} | f
607- 2 | 3 | arc 2 -> 3 | {"(5,1)","(1,2)","(2,3)"} | f
608- 4 | 5 | arc 4 -> 5 | {"(5,1)","(1,4)","(4,5)"} | f
609- 5 | 1 | arc 5 -> 1 | {"(1,4)","(4,5)","(5,1)"} | f
610- 1 | 2 | arc 1 -> 2 | {"(1,4)","(4,5)","(5,1)","(1,2)"} | f
611- 1 | 3 | arc 1 -> 3 | {"(1,4)","(4,5)","(5,1)","(1,3)"} | f
612- 1 | 4 | arc 1 -> 4 | {"(1,4)","(4,5)","(5,1)","(1,4)"} | t
613- 2 | 3 | arc 2 -> 3 | {"(4,5)","(5,1)","(1,2)","(2,3)"} | f
614- 4 | 5 | arc 4 -> 5 | {"(4,5)","(5,1)","(1,4)","(4,5)"} | t
615- 5 | 1 | arc 5 -> 1 | {"(5,1)","(1,4)","(4,5)","(5,1)"} | t
616- 2 | 3 | arc 2 -> 3 | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} | f
590+ f | t | label | is_cycle | path
591+ ---+---+------------+----------+ ------------------------------------ -------
592+ 1 | 2 | arc 1 -> 2 | f | {"(1,2)"}
593+ 1 | 3 | arc 1 -> 3 | f | {"(1,3)"}
594+ 2 | 3 | arc 2 -> 3 | f | {"(2,3)"}
595+ 1 | 4 | arc 1 -> 4 | f | {"(1,4)"}
596+ 4 | 5 | arc 4 -> 5 | f | {"(4,5)"}
597+ 5 | 1 | arc 5 -> 1 | f | {"(5,1)"}
598+ 1 | 2 | arc 1 -> 2 | f | {"(5,1)","(1,2)"}
599+ 1 | 3 | arc 1 -> 3 | f | {"(5,1)","(1,3)"}
600+ 1 | 4 | arc 1 -> 4 | f | {"(5,1)","(1,4)"}
601+ 2 | 3 | arc 2 -> 3 | f | {"(1,2)","(2,3)"}
602+ 4 | 5 | arc 4 -> 5 | f | {"(1,4)","(4,5)"}
603+ 5 | 1 | arc 5 -> 1 | f | {"(4,5)","(5,1)"}
604+ 1 | 2 | arc 1 -> 2 | f | {"(4,5)","(5,1)","(1,2)"}
605+ 1 | 3 | arc 1 -> 3 | f | {"(4,5)","(5,1)","(1,3)"}
606+ 1 | 4 | arc 1 -> 4 | f | {"(4,5)","(5,1)","(1,4)"}
607+ 2 | 3 | arc 2 -> 3 | f | {"(5,1)","(1,2)","(2,3)"}
608+ 4 | 5 | arc 4 -> 5 | f | {"(5,1)","(1,4)","(4,5)"}
609+ 5 | 1 | arc 5 -> 1 | f | {"(1,4)","(4,5)","(5,1)"}
610+ 1 | 2 | arc 1 -> 2 | f | {"(1,4)","(4,5)","(5,1)","(1,2)"}
611+ 1 | 3 | arc 1 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,3)"}
612+ 1 | 4 | arc 1 -> 4 | t | {"(1,4)","(4,5)","(5,1)","(1,4)"}
613+ 2 | 3 | arc 2 -> 3 | f | {"(4,5)","(5,1)","(1,2)","(2,3)"}
614+ 4 | 5 | arc 4 -> 5 | t | {"(4,5)","(5,1)","(1,4)","(4,5)"}
615+ 5 | 1 | arc 5 -> 1 | t | {"(5,1)","(1,4)","(4,5)","(5,1)"}
616+ 2 | 3 | arc 2 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"}
617617(25 rows)
618618
619619-- ordering by the path column has same effect as SEARCH DEPTH FIRST
620- with recursive search_graph(f, t, label, path, cycle ) as (
621- select *, array[row(g.f, g.t)], false from graph g
620+ with recursive search_graph(f, t, label, is_cycle, path ) as (
621+ select *, false, array[row(g.f, g.t)] from graph g
622622 union all
623- select g.*, path || row(g.f, g.t), row(g.f, g.t) = any(path )
623+ select g.*, row(g.f, g.t) = any(path), path || row(g.f, g.t)
624624 from graph g, search_graph sg
625- where g.f = sg.t and not cycle
625+ where g.f = sg.t and not is_cycle
626626)
627627select * from search_graph order by path;
628- f | t | label | path | cycle
629- ---+---+------------+-------------------------------------------+ -------
630- 1 | 2 | arc 1 -> 2 | {"(1,2)"} | f
631- 2 | 3 | arc 2 -> 3 | {"(1,2)","(2,3)"} | f
632- 1 | 3 | arc 1 -> 3 | {"(1,3)"} | f
633- 1 | 4 | arc 1 -> 4 | {"(1,4)"} | f
634- 4 | 5 | arc 4 -> 5 | {"(1,4)","(4,5)"} | f
635- 5 | 1 | arc 5 -> 1 | {"(1,4)","(4,5)","(5,1)"} | f
636- 1 | 2 | arc 1 -> 2 | {"(1,4)","(4,5)","(5,1)","(1,2)"} | f
637- 2 | 3 | arc 2 -> 3 | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"} | f
638- 1 | 3 | arc 1 -> 3 | {"(1,4)","(4,5)","(5,1)","(1,3)"} | f
639- 1 | 4 | arc 1 -> 4 | {"(1,4)","(4,5)","(5,1)","(1,4)"} | t
640- 2 | 3 | arc 2 -> 3 | {"(2,3)"} | f
641- 4 | 5 | arc 4 -> 5 | {"(4,5)"} | f
642- 5 | 1 | arc 5 -> 1 | {"(4,5)","(5,1)"} | f
643- 1 | 2 | arc 1 -> 2 | {"(4,5)","(5,1)","(1,2)"} | f
644- 2 | 3 | arc 2 -> 3 | {"(4,5)","(5,1)","(1,2)","(2,3)"} | f
645- 1 | 3 | arc 1 -> 3 | {"(4,5)","(5,1)","(1,3)"} | f
646- 1 | 4 | arc 1 -> 4 | {"(4,5)","(5,1)","(1,4)"} | f
647- 4 | 5 | arc 4 -> 5 | {"(4,5)","(5,1)","(1,4)","(4,5)"} | t
648- 5 | 1 | arc 5 -> 1 | {"(5,1)"} | f
649- 1 | 2 | arc 1 -> 2 | {"(5,1)","(1,2)"} | f
650- 2 | 3 | arc 2 -> 3 | {"(5,1)","(1,2)","(2,3)"} | f
651- 1 | 3 | arc 1 -> 3 | {"(5,1)","(1,3)"} | f
652- 1 | 4 | arc 1 -> 4 | {"(5,1)","(1,4)"} | f
653- 4 | 5 | arc 4 -> 5 | {"(5,1)","(1,4)","(4,5)"} | f
654- 5 | 1 | arc 5 -> 1 | {"(5,1)","(1,4)","(4,5)","(5,1)"} | t
628+ f | t | label | is_cycle | path
629+ ---+---+------------+----------+ ------------------------------------ -------
630+ 1 | 2 | arc 1 -> 2 | f | {"(1,2)"}
631+ 2 | 3 | arc 2 -> 3 | f | {"(1,2)","(2,3)"}
632+ 1 | 3 | arc 1 -> 3 | f | {"(1,3)"}
633+ 1 | 4 | arc 1 -> 4 | f | {"(1,4)"}
634+ 4 | 5 | arc 4 -> 5 | f | {"(1,4)","(4,5)"}
635+ 5 | 1 | arc 5 -> 1 | f | {"(1,4)","(4,5)","(5,1)"}
636+ 1 | 2 | arc 1 -> 2 | f | {"(1,4)","(4,5)","(5,1)","(1,2)"}
637+ 2 | 3 | arc 2 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,2)","(2,3)"}
638+ 1 | 3 | arc 1 -> 3 | f | {"(1,4)","(4,5)","(5,1)","(1,3)"}
639+ 1 | 4 | arc 1 -> 4 | t | {"(1,4)","(4,5)","(5,1)","(1,4)"}
640+ 2 | 3 | arc 2 -> 3 | f | {"(2,3)"}
641+ 4 | 5 | arc 4 -> 5 | f | {"(4,5)"}
642+ 5 | 1 | arc 5 -> 1 | f | {"(4,5)","(5,1)"}
643+ 1 | 2 | arc 1 -> 2 | f | {"(4,5)","(5,1)","(1,2)"}
644+ 2 | 3 | arc 2 -> 3 | f | {"(4,5)","(5,1)","(1,2)","(2,3)"}
645+ 1 | 3 | arc 1 -> 3 | f | {"(4,5)","(5,1)","(1,3)"}
646+ 1 | 4 | arc 1 -> 4 | f | {"(4,5)","(5,1)","(1,4)"}
647+ 4 | 5 | arc 4 -> 5 | t | {"(4,5)","(5,1)","(1,4)","(4,5)"}
648+ 5 | 1 | arc 5 -> 1 | f | {"(5,1)"}
649+ 1 | 2 | arc 1 -> 2 | f | {"(5,1)","(1,2)"}
650+ 2 | 3 | arc 2 -> 3 | f | {"(5,1)","(1,2)","(2,3)"}
651+ 1 | 3 | arc 1 -> 3 | f | {"(5,1)","(1,3)"}
652+ 1 | 4 | arc 1 -> 4 | f | {"(5,1)","(1,4)"}
653+ 4 | 5 | arc 4 -> 5 | f | {"(5,1)","(1,4)","(4,5)"}
654+ 5 | 1 | arc 5 -> 1 | t | {"(5,1)","(1,4)","(4,5)","(5,1)"}
655655(25 rows)
656656
657657--
0 commit comments