Commit 8283d7f7 authored by Igor Babaev's avatar Igor Babaev

Added the test case from mdev-11259.

parent 92bcb906
......@@ -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;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment