Подтвердить что ты не робот

Почему сообщения об ошибках синтаксиса 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?

4b9b3361

Ответ 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 и другие вилки, когда мне дают выбор.