Почему сообщения об ошибках синтаксиса MySQL так плохо?
Ошибки синтаксиса MySQL часто довольно расплывчаты, только указывая строку, в которой происходит ошибка. Написание парсера, который дает точное и полезное сообщение об ошибке, не является полностью тривиальным, но это не проблема открытого исследования: большинство компиляторов для языков программирования общего назначения создают сообщения об ошибках, которые намного полезнее.
Так почему же анализатор MySQL не создает более качественные сообщения об ошибках? Это как-то связано с MySQL, или грамматика SQL, как правило, делает это чрезвычайно трудным?
Вот пример:
SELECT * FROM foo
WHERE bar > 0
AND baz NOT NULL
ORDER BY qux ASC
MySQL генерирует следующее сообщение об ошибке: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL ORDER BY qux ASC'
Фактически, NOT NULL
должен быть IS NOT NULL
. Итак, почему MySQL не генерирует ошибку, например Unexpected token NOT at line 3 column 8
?
Ответы
Ответ 1
Оптимизатор MySQL оптимизирует отправляемый запрос. К тому времени, когда он будет выполнен, он может выглядеть совсем по-другому. Также идея о том, что строка столбца останется неизменной за это время, неверна.
Вот пример того, как MySQL оптимизирует запросы, которые он получает:
http://dev.mysql.com/doc/internals/en/optimizer-primary-optimizations.html
Обновление 1:
Выше было мое предположение о том, почему отчетность об ошибках не так хороша. Ни в коем случае я не говорю, что отчет об ошибках MySQL хорош, это действительно плохо. Иногда я получаю ошибки, которые не имеют ничего общего с фактической ошибкой. Вот некоторые проблемы, с которыми столкнулся Питер Зайцев (потрясающий блог для людей, работающих с MySQL):
http://www.mysqlperformanceblog.com/2011/04/06/more-on-mysql-error-messages/
http://www.mysqlperformanceblog.com/2008/03/16/mysql-error-message-nonsenses/
Ответ 2
Oracle - это то, где программное обеспечение с открытым исходным кодом переходит в умереть. У них есть сдержанность, чтобы сделать свободно доступного конкурента к их коммерческим приложениям базы данных очень хорошим. Это было достаточно хорошо, что никто не сделал бы другого, какое-то время, и теперь я предпочитаю MariaDB и другие вилки, когда мне дают выбор.