mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Added the test case from mdev-11259.
This commit is contained in:
@@ -1862,3 +1862,468 @@ a
|
||||
2
|
||||
drop view v1;
|
||||
drop table t1,t2;
|
||||
#
|
||||
# MDEV-11259: recursive CTE with concatenation operation
|
||||
#
|
||||
DROP TABLE IF EXISTS edges;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'test.edges'
|
||||
CREATE TABLE edges(
|
||||
a int(10) unsigned NOT NULL,
|
||||
b int(10) unsigned NOT NULL,
|
||||
PRIMARY KEY (a,b),
|
||||
KEY b(b)
|
||||
);
|
||||
INSERT INTO edges
|
||||
VALUES (1,3),(2,1),(2,4),(3,4),(3,5),(3,6),(4,7),(5,1),(5,6),(6,1);
|
||||
DROP TABLE IF EXISTS edges2;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'test.edges2'
|
||||
CREATE VIEW edges2 (a, b) AS
|
||||
SELECT a, b FROM edges UNION ALL SELECT b, a FROM edges;
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges
|
||||
UNION ALL
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges AS e
|
||||
JOIN transitive_closure AS tc
|
||||
ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT * FROM transitive_closure
|
||||
ORDER BY a, b, distance;
|
||||
a b distance path_string
|
||||
1 3 1 1.3.
|
||||
1 4 2 1.3.4.
|
||||
1 5 2 1.3.5.
|
||||
1 6 2 1.3.6.
|
||||
1 6 3 1.3.5.6.
|
||||
1 7 3 1.3.4.7.
|
||||
2 1 1 2.1.
|
||||
2 3 2 2.1.3.
|
||||
2 4 1 2.4.
|
||||
2 4 3 2.1.3.4.
|
||||
2 5 3 2.1.3.5.
|
||||
2 6 3 2.1.3.6.
|
||||
2 6 4 2.1.3.5.6.
|
||||
2 7 2 2.4.7.
|
||||
2 7 4 2.1.3.4.7.
|
||||
3 1 2 3.6.1.
|
||||
3 1 2 3.5.1.
|
||||
3 1 3 3.5.6.1.
|
||||
3 4 1 3.4.
|
||||
3 5 1 3.5.
|
||||
3 6 1 3.6.
|
||||
3 6 2 3.5.6.
|
||||
3 7 2 3.4.7.
|
||||
4 7 1 4.7.
|
||||
5 1 1 5.1.
|
||||
5 1 2 5.6.1.
|
||||
5 3 2 5.1.3.
|
||||
5 3 3 5.6.1.3.
|
||||
5 4 3 5.1.3.4.
|
||||
5 4 4 5.6.1.3.4.
|
||||
5 6 1 5.6.
|
||||
5 6 3 5.1.3.6.
|
||||
5 7 4 5.1.3.4.7.
|
||||
5 7 5 5.6.1.3.4.7.
|
||||
6 1 1 6.1.
|
||||
6 3 2 6.1.3.
|
||||
6 4 3 6.1.3.4.
|
||||
6 5 3 6.1.3.5.
|
||||
6 7 4 6.1.3.4.7.
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges
|
||||
WHERE a = 1 -- source
|
||||
UNION ALL
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges AS e
|
||||
JOIN transitive_closure AS tc ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT * FROM transitive_closure
|
||||
WHERE b = 6 -- destination
|
||||
ORDER BY a, b, distance;
|
||||
a b distance path_string
|
||||
1 6 2 1.3.6.
|
||||
1 6 3 1.3.5.6.
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges2
|
||||
UNION ALL
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges2 AS e
|
||||
JOIN transitive_closure AS tc ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT * FROM transitive_closure
|
||||
ORDER BY a, b, distance;
|
||||
a b distance path_string
|
||||
1 2 1 1.2.
|
||||
1 2 3 1.3.4.2.
|
||||
1 2 4 1.5.3.4.2.
|
||||
1 2 4 1.6.3.4.2.
|
||||
1 2 5 1.5.6.3.4.2.
|
||||
1 2 5 1.6.5.3.4.2.
|
||||
1 3 1 1.3.
|
||||
1 3 2 1.5.3.
|
||||
1 3 2 1.6.3.
|
||||
1 3 3 1.2.4.3.
|
||||
1 3 3 1.5.6.3.
|
||||
1 3 3 1.6.5.3.
|
||||
1 4 2 1.2.4.
|
||||
1 4 2 1.3.4.
|
||||
1 4 3 1.5.3.4.
|
||||
1 4 3 1.6.3.4.
|
||||
1 4 4 1.5.6.3.4.
|
||||
1 4 4 1.6.5.3.4.
|
||||
1 5 1 1.5.
|
||||
1 5 2 1.3.5.
|
||||
1 5 2 1.6.5.
|
||||
1 5 3 1.3.6.5.
|
||||
1 5 3 1.6.3.5.
|
||||
1 5 4 1.2.4.3.5.
|
||||
1 5 5 1.2.4.3.6.5.
|
||||
1 6 1 1.6.
|
||||
1 6 2 1.3.6.
|
||||
1 6 2 1.5.6.
|
||||
1 6 3 1.3.5.6.
|
||||
1 6 3 1.5.3.6.
|
||||
1 6 4 1.2.4.3.6.
|
||||
1 6 5 1.2.4.3.5.6.
|
||||
1 7 3 1.2.4.7.
|
||||
1 7 3 1.3.4.7.
|
||||
1 7 4 1.5.3.4.7.
|
||||
1 7 4 1.6.3.4.7.
|
||||
1 7 5 1.5.6.3.4.7.
|
||||
1 7 5 1.6.5.3.4.7.
|
||||
2 1 1 2.1.
|
||||
2 1 3 2.4.3.1.
|
||||
2 1 4 2.4.3.5.1.
|
||||
2 1 4 2.4.3.6.1.
|
||||
2 1 5 2.4.3.5.6.1.
|
||||
2 1 5 2.4.3.6.5.1.
|
||||
2 3 2 2.1.3.
|
||||
2 3 2 2.4.3.
|
||||
2 3 3 2.1.5.3.
|
||||
2 3 3 2.1.6.3.
|
||||
2 3 4 2.1.5.6.3.
|
||||
2 3 4 2.1.6.5.3.
|
||||
2 4 1 2.4.
|
||||
2 4 3 2.1.3.4.
|
||||
2 4 4 2.1.5.3.4.
|
||||
2 4 4 2.1.6.3.4.
|
||||
2 4 5 2.1.5.6.3.4.
|
||||
2 4 5 2.1.6.5.3.4.
|
||||
2 5 2 2.1.5.
|
||||
2 5 3 2.1.3.5.
|
||||
2 5 3 2.1.6.5.
|
||||
2 5 3 2.4.3.5.
|
||||
2 5 4 2.1.3.6.5.
|
||||
2 5 4 2.1.6.3.5.
|
||||
2 5 4 2.4.3.1.5.
|
||||
2 5 4 2.4.3.6.5.
|
||||
2 5 5 2.4.3.1.6.5.
|
||||
2 5 5 2.4.3.6.1.5.
|
||||
2 6 2 2.1.6.
|
||||
2 6 3 2.1.3.6.
|
||||
2 6 3 2.1.5.6.
|
||||
2 6 3 2.4.3.6.
|
||||
2 6 4 2.1.3.5.6.
|
||||
2 6 4 2.1.5.3.6.
|
||||
2 6 4 2.4.3.1.6.
|
||||
2 6 4 2.4.3.5.6.
|
||||
2 6 5 2.4.3.1.5.6.
|
||||
2 6 5 2.4.3.5.1.6.
|
||||
2 7 2 2.4.7.
|
||||
2 7 4 2.1.3.4.7.
|
||||
2 7 5 2.1.5.3.4.7.
|
||||
2 7 5 2.1.6.3.4.7.
|
||||
2 7 6 2.1.5.6.3.4.7.
|
||||
2 7 6 2.1.6.5.3.4.7.
|
||||
3 1 1 3.1.
|
||||
3 1 2 3.5.1.
|
||||
3 1 2 3.6.1.
|
||||
3 1 3 3.4.2.1.
|
||||
3 1 3 3.5.6.1.
|
||||
3 1 3 3.6.5.1.
|
||||
3 2 2 3.1.2.
|
||||
3 2 2 3.4.2.
|
||||
3 2 3 3.5.1.2.
|
||||
3 2 3 3.6.1.2.
|
||||
3 2 4 3.5.6.1.2.
|
||||
3 2 4 3.6.5.1.2.
|
||||
3 4 1 3.4.
|
||||
3 4 3 3.1.2.4.
|
||||
3 4 4 3.5.1.2.4.
|
||||
3 4 4 3.6.1.2.4.
|
||||
3 4 5 3.5.6.1.2.4.
|
||||
3 4 5 3.6.5.1.2.4.
|
||||
3 5 1 3.5.
|
||||
3 5 2 3.1.5.
|
||||
3 5 2 3.6.5.
|
||||
3 5 3 3.1.6.5.
|
||||
3 5 3 3.6.1.5.
|
||||
3 5 4 3.4.2.1.5.
|
||||
3 5 5 3.4.2.1.6.5.
|
||||
3 6 1 3.6.
|
||||
3 6 2 3.1.6.
|
||||
3 6 2 3.5.6.
|
||||
3 6 3 3.1.5.6.
|
||||
3 6 3 3.5.1.6.
|
||||
3 6 4 3.4.2.1.6.
|
||||
3 6 5 3.4.2.1.5.6.
|
||||
3 7 2 3.4.7.
|
||||
3 7 4 3.1.2.4.7.
|
||||
3 7 5 3.5.1.2.4.7.
|
||||
3 7 5 3.6.1.2.4.7.
|
||||
3 7 6 3.5.6.1.2.4.7.
|
||||
3 7 6 3.6.5.1.2.4.7.
|
||||
4 1 2 4.2.1.
|
||||
4 1 2 4.3.1.
|
||||
4 1 3 4.3.5.1.
|
||||
4 1 3 4.3.6.1.
|
||||
4 1 4 4.3.5.6.1.
|
||||
4 1 4 4.3.6.5.1.
|
||||
4 2 1 4.2.
|
||||
4 2 3 4.3.1.2.
|
||||
4 2 4 4.3.5.1.2.
|
||||
4 2 4 4.3.6.1.2.
|
||||
4 2 5 4.3.5.6.1.2.
|
||||
4 2 5 4.3.6.5.1.2.
|
||||
4 3 1 4.3.
|
||||
4 3 3 4.2.1.3.
|
||||
4 3 4 4.2.1.5.3.
|
||||
4 3 4 4.2.1.6.3.
|
||||
4 3 5 4.2.1.5.6.3.
|
||||
4 3 5 4.2.1.6.5.3.
|
||||
4 5 2 4.3.5.
|
||||
4 5 3 4.2.1.5.
|
||||
4 5 3 4.3.1.5.
|
||||
4 5 3 4.3.6.5.
|
||||
4 5 4 4.2.1.3.5.
|
||||
4 5 4 4.2.1.6.5.
|
||||
4 5 4 4.3.1.6.5.
|
||||
4 5 4 4.3.6.1.5.
|
||||
4 5 5 4.2.1.3.6.5.
|
||||
4 5 5 4.2.1.6.3.5.
|
||||
4 6 2 4.3.6.
|
||||
4 6 3 4.2.1.6.
|
||||
4 6 3 4.3.1.6.
|
||||
4 6 3 4.3.5.6.
|
||||
4 6 4 4.2.1.3.6.
|
||||
4 6 4 4.2.1.5.6.
|
||||
4 6 4 4.3.1.5.6.
|
||||
4 6 4 4.3.5.1.6.
|
||||
4 6 5 4.2.1.3.5.6.
|
||||
4 6 5 4.2.1.5.3.6.
|
||||
4 7 1 4.7.
|
||||
5 1 1 5.1.
|
||||
5 1 2 5.3.1.
|
||||
5 1 2 5.6.1.
|
||||
5 1 3 5.3.6.1.
|
||||
5 1 3 5.6.3.1.
|
||||
5 1 4 5.3.4.2.1.
|
||||
5 1 5 5.6.3.4.2.1.
|
||||
5 2 2 5.1.2.
|
||||
5 2 3 5.3.1.2.
|
||||
5 2 3 5.3.4.2.
|
||||
5 2 3 5.6.1.2.
|
||||
5 2 4 5.1.3.4.2.
|
||||
5 2 4 5.3.6.1.2.
|
||||
5 2 4 5.6.3.1.2.
|
||||
5 2 4 5.6.3.4.2.
|
||||
5 2 5 5.1.6.3.4.2.
|
||||
5 2 5 5.6.1.3.4.2.
|
||||
5 3 1 5.3.
|
||||
5 3 2 5.1.3.
|
||||
5 3 2 5.6.3.
|
||||
5 3 3 5.1.6.3.
|
||||
5 3 3 5.6.1.3.
|
||||
5 3 4 5.1.2.4.3.
|
||||
5 3 5 5.6.1.2.4.3.
|
||||
5 4 2 5.3.4.
|
||||
5 4 3 5.1.2.4.
|
||||
5 4 3 5.1.3.4.
|
||||
5 4 3 5.6.3.4.
|
||||
5 4 4 5.1.6.3.4.
|
||||
5 4 4 5.3.1.2.4.
|
||||
5 4 4 5.6.1.2.4.
|
||||
5 4 4 5.6.1.3.4.
|
||||
5 4 5 5.3.6.1.2.4.
|
||||
5 4 5 5.6.3.1.2.4.
|
||||
5 6 1 5.6.
|
||||
5 6 2 5.1.6.
|
||||
5 6 2 5.3.6.
|
||||
5 6 3 5.1.3.6.
|
||||
5 6 3 5.3.1.6.
|
||||
5 6 5 5.1.2.4.3.6.
|
||||
5 6 5 5.3.4.2.1.6.
|
||||
5 7 3 5.3.4.7.
|
||||
5 7 4 5.1.2.4.7.
|
||||
5 7 4 5.1.3.4.7.
|
||||
5 7 4 5.6.3.4.7.
|
||||
5 7 5 5.1.6.3.4.7.
|
||||
5 7 5 5.3.1.2.4.7.
|
||||
5 7 5 5.6.1.2.4.7.
|
||||
5 7 5 5.6.1.3.4.7.
|
||||
5 7 6 5.3.6.1.2.4.7.
|
||||
5 7 6 5.6.3.1.2.4.7.
|
||||
6 1 1 6.1.
|
||||
6 1 2 6.3.1.
|
||||
6 1 2 6.5.1.
|
||||
6 1 3 6.3.5.1.
|
||||
6 1 3 6.5.3.1.
|
||||
6 1 4 6.3.4.2.1.
|
||||
6 1 5 6.5.3.4.2.1.
|
||||
6 2 2 6.1.2.
|
||||
6 2 3 6.3.1.2.
|
||||
6 2 3 6.3.4.2.
|
||||
6 2 3 6.5.1.2.
|
||||
6 2 4 6.1.3.4.2.
|
||||
6 2 4 6.3.5.1.2.
|
||||
6 2 4 6.5.3.1.2.
|
||||
6 2 4 6.5.3.4.2.
|
||||
6 2 5 6.1.5.3.4.2.
|
||||
6 2 5 6.5.1.3.4.2.
|
||||
6 3 1 6.3.
|
||||
6 3 2 6.1.3.
|
||||
6 3 2 6.5.3.
|
||||
6 3 3 6.1.5.3.
|
||||
6 3 3 6.5.1.3.
|
||||
6 3 4 6.1.2.4.3.
|
||||
6 3 5 6.5.1.2.4.3.
|
||||
6 4 2 6.3.4.
|
||||
6 4 3 6.1.2.4.
|
||||
6 4 3 6.1.3.4.
|
||||
6 4 3 6.5.3.4.
|
||||
6 4 4 6.1.5.3.4.
|
||||
6 4 4 6.3.1.2.4.
|
||||
6 4 4 6.5.1.2.4.
|
||||
6 4 4 6.5.1.3.4.
|
||||
6 4 5 6.3.5.1.2.4.
|
||||
6 4 5 6.5.3.1.2.4.
|
||||
6 5 1 6.5.
|
||||
6 5 2 6.1.5.
|
||||
6 5 2 6.3.5.
|
||||
6 5 3 6.1.3.5.
|
||||
6 5 3 6.3.1.5.
|
||||
6 5 5 6.1.2.4.3.5.
|
||||
6 5 5 6.3.4.2.1.5.
|
||||
6 7 3 6.3.4.7.
|
||||
6 7 4 6.1.2.4.7.
|
||||
6 7 4 6.1.3.4.7.
|
||||
6 7 4 6.5.3.4.7.
|
||||
6 7 5 6.1.5.3.4.7.
|
||||
6 7 5 6.3.1.2.4.7.
|
||||
6 7 5 6.5.1.2.4.7.
|
||||
6 7 5 6.5.1.3.4.7.
|
||||
6 7 6 6.3.5.1.2.4.7.
|
||||
6 7 6 6.5.3.1.2.4.7.
|
||||
7 1 3 7.4.2.1.
|
||||
7 1 3 7.4.3.1.
|
||||
7 1 4 7.4.3.5.1.
|
||||
7 1 4 7.4.3.6.1.
|
||||
7 1 5 7.4.3.5.6.1.
|
||||
7 1 5 7.4.3.6.5.1.
|
||||
7 2 2 7.4.2.
|
||||
7 2 4 7.4.3.1.2.
|
||||
7 2 5 7.4.3.5.1.2.
|
||||
7 2 5 7.4.3.6.1.2.
|
||||
7 2 6 7.4.3.5.6.1.2.
|
||||
7 2 6 7.4.3.6.5.1.2.
|
||||
7 3 2 7.4.3.
|
||||
7 3 4 7.4.2.1.3.
|
||||
7 3 5 7.4.2.1.5.3.
|
||||
7 3 5 7.4.2.1.6.3.
|
||||
7 3 6 7.4.2.1.5.6.3.
|
||||
7 3 6 7.4.2.1.6.5.3.
|
||||
7 4 1 7.4.
|
||||
7 5 3 7.4.3.5.
|
||||
7 5 4 7.4.2.1.5.
|
||||
7 5 4 7.4.3.1.5.
|
||||
7 5 4 7.4.3.6.5.
|
||||
7 5 5 7.4.2.1.3.5.
|
||||
7 5 5 7.4.2.1.6.5.
|
||||
7 5 5 7.4.3.1.6.5.
|
||||
7 5 5 7.4.3.6.1.5.
|
||||
7 5 6 7.4.2.1.3.6.5.
|
||||
7 5 6 7.4.2.1.6.3.5.
|
||||
7 6 3 7.4.3.6.
|
||||
7 6 4 7.4.2.1.6.
|
||||
7 6 4 7.4.3.1.6.
|
||||
7 6 4 7.4.3.5.6.
|
||||
7 6 5 7.4.2.1.3.6.
|
||||
7 6 5 7.4.2.1.5.6.
|
||||
7 6 5 7.4.3.1.5.6.
|
||||
7 6 5 7.4.3.5.1.6.
|
||||
7 6 6 7.4.2.1.3.5.6.
|
||||
7 6 6 7.4.2.1.5.3.6.
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string)
|
||||
AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges2
|
||||
UNION ALL
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges2 AS e
|
||||
JOIN transitive_closure AS tc ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT a, b, min(distance) AS dist FROM transitive_closure
|
||||
GROUP BY a, b
|
||||
ORDER BY a, dist, b;
|
||||
a b dist
|
||||
1 2 1
|
||||
1 3 1
|
||||
1 4 2
|
||||
1 5 1
|
||||
1 6 1
|
||||
1 7 3
|
||||
2 1 1
|
||||
2 3 2
|
||||
2 4 1
|
||||
2 5 2
|
||||
2 6 2
|
||||
2 7 2
|
||||
3 1 1
|
||||
3 2 2
|
||||
3 4 1
|
||||
3 5 1
|
||||
3 6 1
|
||||
3 7 2
|
||||
4 1 2
|
||||
4 2 1
|
||||
4 3 1
|
||||
4 5 2
|
||||
4 6 2
|
||||
4 7 1
|
||||
5 1 1
|
||||
5 2 2
|
||||
5 3 1
|
||||
5 4 2
|
||||
5 6 1
|
||||
5 7 3
|
||||
6 1 1
|
||||
6 2 2
|
||||
6 3 1
|
||||
6 4 2
|
||||
6 5 1
|
||||
6 7 3
|
||||
7 1 3
|
||||
7 2 2
|
||||
7 3 2
|
||||
7 4 1
|
||||
7 5 3
|
||||
7 6 3
|
||||
DROP VIEW edges2;
|
||||
DROP TABLE edges;
|
||||
|
||||
@@ -1389,3 +1389,97 @@ select * from t1;
|
||||
drop view v1;
|
||||
drop table t1,t2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-11259: recursive CTE with concatenation operation
|
||||
--echo #
|
||||
|
||||
DROP TABLE IF EXISTS edges;
|
||||
CREATE TABLE edges(
|
||||
a int(10) unsigned NOT NULL,
|
||||
b int(10) unsigned NOT NULL,
|
||||
PRIMARY KEY (a,b),
|
||||
KEY b(b)
|
||||
);
|
||||
|
||||
INSERT INTO edges
|
||||
VALUES (1,3),(2,1),(2,4),(3,4),(3,5),(3,6),(4,7),(5,1),(5,6),(6,1);
|
||||
|
||||
DROP TABLE IF EXISTS edges2;
|
||||
CREATE VIEW edges2 (a, b) AS
|
||||
SELECT a, b FROM edges UNION ALL SELECT b, a FROM edges;
|
||||
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges AS e
|
||||
JOIN transitive_closure AS tc
|
||||
ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT * FROM transitive_closure
|
||||
ORDER BY a, b, distance;
|
||||
|
||||
--sorted_result
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges
|
||||
WHERE a = 1 -- source
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges AS e
|
||||
JOIN transitive_closure AS tc ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT * FROM transitive_closure
|
||||
WHERE b = 6 -- destination
|
||||
ORDER BY a, b, distance;
|
||||
|
||||
--sorted_result
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges2
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges2 AS e
|
||||
JOIN transitive_closure AS tc ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT * FROM transitive_closure
|
||||
ORDER BY a, b, distance;
|
||||
|
||||
--sorted_result
|
||||
WITH RECURSIVE transitive_closure(a, b, distance, path_string)
|
||||
AS
|
||||
( SELECT a, b, 1 AS distance,
|
||||
concat(a, '.', b, '.') AS path_string
|
||||
FROM edges2
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT tc.a, e.b, tc.distance + 1,
|
||||
concat(tc.path_string, e.b, '.') AS path_string
|
||||
FROM edges2 AS e
|
||||
JOIN transitive_closure AS tc ON e.a = tc.b
|
||||
WHERE tc.path_string NOT LIKE concat('%', e.b, '.%')
|
||||
)
|
||||
SELECT a, b, min(distance) AS dist FROM transitive_closure
|
||||
GROUP BY a, b
|
||||
ORDER BY a, dist, b;
|
||||
|
||||
DROP VIEW edges2;
|
||||
DROP TABLE edges;
|
||||
|
||||
Reference in New Issue
Block a user