@@ -579,79 +579,79 @@ insert into graph values
579
579
(1, 4, 'arc 1 -> 4'),
580
580
(4, 5, 'arc 4 -> 5'),
581
581
(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
584
584
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)
586
586
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
588
588
)
589
589
select * 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)"}
617
617
(25 rows)
618
618
619
619
-- 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
622
622
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)
624
624
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
626
626
)
627
627
select * 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)"}
655
655
(25 rows)
656
656
657
657
--
0 commit comments