|
|
|
@ -1200,6 +1200,40 @@ select * from my_ancestors; |
|
|
|
|
|
|
|
drop table my_ancestors; |
|
|
|
|
|
|
|
# |
|
|
|
# MDEV-17967 Add a solution of the 8 queens problem to the regression test for CTE |
|
|
|
# |
|
|
|
# adapted to MariaDB from https://rosettacode.org/wiki/N-queens_problem#SQL |
|
|
|
# |
|
|
|
let $N=4; # 8 takes too long for a test |
|
|
|
eval WITH RECURSIVE |
|
|
|
positions(i) AS ( |
|
|
|
VALUES(0) |
|
|
|
UNION SELECT ALL |
|
|
|
i+1 FROM positions WHERE i < $N*$N-1 |
|
|
|
), |
|
|
|
solutions(board, n_queens) AS ( |
|
|
|
SELECT REPEAT('-', $N*$N), 0 |
|
|
|
FROM positions |
|
|
|
UNION |
|
|
|
SELECT |
|
|
|
concat(substr(board, 1, i),'*',substr(board, i+2)),n_queens + 1 AS n_queens |
|
|
|
FROM positions AS ps, solutions |
|
|
|
WHERE n_queens < $N |
|
|
|
AND substr(board,1,i) != '*' |
|
|
|
AND NOT EXISTS ( |
|
|
|
SELECT 1 FROM positions WHERE |
|
|
|
substr(board,i+1,1) = '*' AND |
|
|
|
( |
|
|
|
i % $N = ps.i % $N OR |
|
|
|
i div $N = ps.i div $N OR |
|
|
|
i div $N + (i % $N) = ps.i div $N + (ps.i % $N) OR |
|
|
|
i div $N - (i % $N) = ps.i div $N - (ps.i % $N) |
|
|
|
) |
|
|
|
) |
|
|
|
) |
|
|
|
SELECT regexp_replace(board,concat('(',REPEAT('.', $N),')'),'\\\\1\\n') n_queens FROM solutions WHERE n_queens = $N; |
|
|
|
|
|
|
|
--echo # |
|
|
|
--echo # MDEV-10883: execution of prepared statement from SELECT |
|
|
|
--echo # with recursive CTE that renames columns |
|
|
|
|