By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE edges(
src integer,
dst integer,
data integer
);
INSERT INTO edges VALUES (1, 2, 1);
1 rows affected
INSERT INTO edges VALUES (2, 3, 1);
1 rows affected
INSERT INTO edges VALUES (3, 2, 1);
1 rows affected
INSERT INTO edges VALUES (1, 4, 1);
1 rows affected
INSERT INTO edges VALUES (4, 5, 1);
1 rows affected
INSERT INTO edges VALUES (5, 2, 1);
1 rows affected
INSERT INTO edges VALUES (1, 4, 2);
1 rows affected
INSERT INTO edges VALUES (4, 5, 2);
1 rows affected
INSERT INTO edges VALUES (4, 6, 2);
1 rows affected
WITH paths(node, data,depth,path) AS (
SELECT
src as node
, data as data
, 0 as depth
, TO_CHAR(src)as path
FROM edges
WHERE src IN (1,2)
UNION ALL
SELECT
edges.dst
, edges.data
, depth + 1
, paths.path || '->' || edges.dst
FROM paths
JOIN edges
ON edges.src = paths.node
AND edges.data = paths.data
) CYCLE node SET cycle TO 1 DEFAULT 0
SELECT DISTINCT * FROM paths
NODE | DATA | DEPTH | PATH | CYCLE |
---|---|---|---|---|
1 | 1 | 0 | 1 | 0 |
3 | 1 | 2 | 1->2->3 | 0 |
3 | 1 | 1 | 2->3 | 0 |
4 | 1 | 1 | 1->4 | 0 |
4 | 2 | 1 | 1->4 | 0 |
5 | 1 | 2 | 1->4->5 | 0 |
2 | 1 | 0 | 2 | 0 |
6 | 2 | 2 | 1->4->6 | 0 |
2 | 1 | 3 | 1->4->5->2 | 0 |
2 | 1 | 5 | 1->4->5->2->3->2 | 1 |
2 | 1 | 3 | 1->2->3->2 | 1 |
2 | 1 | 2 | 2->3->2 | 1 |
1 | 2 | 0 | 1 | 0 |
2 | 1 | 1 | 1->2 | 0 |
5 | 2 | 2 | 1->4->5 | 0 |
3 | 1 | 4 | 1->4->5->2->3 | 0 |