MySQL и MariaDB развелись достаточно давно, и сейчас их следует уже воспринимать как две разные, хоть и высоко-совместимые СУБД. Если этого не учитывать, можно наткнуться на проблему. Потому что даже во вроде бы простой ситуации с очевидным решением можно наткнуться на различие. Одно такое различие попалось мне сегодня.
На заре становления MySQL старался быть максимально user-friendly, вплоть до lamer-friendly, и позволял то, что строгие диалекты отвергали. В частности, MySQL не был против неполной группировки, когда поле выходного набора не входило в выражение группировки, но и не было аргументом агрегатной функции. Разрешение такой фичи регулировалось флагом ONLY_FULL_GROUP_BY в системной переменной Server SQL Mode - @@sql_mode. Только в 8-й версии этот флаг стал включаться в значение переменной по умолчанию.
Также в 8-й версии были реализованы и оконные функции. Особенностью их является то, что это не агрегатные, а скалярные функции, и выполняются они уже после группировки на полях выходного набора, а не на исходных данных. Соответственно если использовать в выходном наборе оконную функцию от аргумента, не входящего в выражение группировки, или при неявной группировке, при ONLY_FULL_GROUP_BY получим ошибку.
CREATE TABLE test (id INT, x INT);
INSERT INTO test VALUES
(1,1), (1,2), (2,3), (2,4);
Соответственно запрос
SELECT id,
SUM(x) sum_x,
SUM(x) OVER (PARTITION BY id) wsum_x
FROM test
GROUP BY id;
будет выполнен при сброшенном флаге и приведёт к ошибке 1055 при установленном.
А вот в MariaDB, по крайней мере для версий 10.3 и старше, как выяснилось, в случае такого комбинирования ошибка - не возникает! Более того, наличие в Server SQL Mode флага ONLY_FULL_GROUP_BY - просто игнорируется!
То ли бага, то ли фича, но логического объяснения такой "особенности" я не нахожу. Придётся просто помнить.