Про баг в MSSQL 2000 и обратную совместимость

Базы данных  /  Внезапно Databases  /  Microsoft

Приходит как-то ко мне мой коллега Дима Писаренко и говорит — “есть вопрос по SQL, но это надо видеть”. И таки-да, это стоило увидеть :)

Как думаете, что возвращал подобный запрос (любое сходство с реальными данными случайно)?

SELECT name, B as A FROM (SELECT 'first' as name, 1 as A, 2 as B UNION SELECT 'second', 2, 1) T1 ORDER BY T1.A;

Если вы пользуетесь SQL, то знаете, что первая строчка будет “first”, а вторая — “second”. Ведь правда? Но не в нашем запутанном случае :)

Дело осложнялось тем, что у Димы запрос был сложнее и сгенерирован Entity Framework. Для справки, MSSQL был 2008. Мы (независимо) пришли к двум одинаковым догадкам:

В итоге, пока я писал Диме, что на моём MSSQL 2008 работает правильно, он уже локализовал проблему — исходная БД работала в режиме совместимости с MSSQL 2000.

Философское отступление

К вопросу о совместимости. Восхищаюсь разработчиками “старой школы” из Microsoft, которые оставили багу ради обратной совместимости со сторонними приложениями (если использовать соответствующий режим для БД).

Восхищаюсь в хорошем смысле. Да, было время, когда винда проверяла наличие запущенного SimCity. Теперь PlatformNotSupportedException в .NET Core — “нормальный подход, зато API совместимы”…

Базы данных  /  Внезапно Databases  /  Microsoft