Используя MariaDB 10.0, следующий код SQL возвращает только одну строку:
DROP TABLE IF EXISTS TestTable1;
CREATE TABLE `TestTable1` (
`SomeColumn` int(11) NOT NULL,
PRIMARY KEY (`SomeColumn`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO TestTable1 (`SomeColumn`) VALUES ('42');
SELECT * FROM TestTable1 LEFT JOIN (SELECT @p:=123 AS moo) pd ON TRUE;
# SomeColumn, moo
42, 123
Однако тот же код в MariaDB 10.3 и 10.4 (к сожалению, у меня нет доступа к MariaDB 10.1 или 10.2) возвращает две строки!
# SomeColumn, moo
42, 123
42, 123
Обратите внимание, что это происходит только при использовании пользовательской переменной . Например, следующий код создает только одну строку, как и ожидалось:
DROP TABLE IF EXISTS TestTable1;
CREATE TABLE `TestTable1` (
`SomeColumn` int(11) NOT NULL,
PRIMARY KEY (`SomeColumn`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO TestTable1 (`SomeColumn`) VALUES ('42');
SELECT * FROM TestTable1 LEFT JOIN (SELECT 123 AS moo) pd ON TRUE;
У нас много кода, который зависит от этого поведения, и моя цель - заставить MariaDB 10.3+ вести себя «по-старому» и вернуть только одну строку в этом случае.
NB: Вы можете легко попробовать это самостоятельно с помощью https://dbfiddle.uk/
NB2: Отчет об ошибке: https://jira.mariadb.org/browse/MDEV-22264