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

26
задан 18.05.2020, 04:01

1 ответ

MySQL Optimizer оптимизирует отправляемый вами запрос. К тому времени, когда это выполнено, это могло бы выглядеть довольно по-другому. Также идея о том, что линия столбец будет оставаться неизменной в течение этого времени, не является правильной.

Вот взгляд на то, как 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- сообщения об ошибках / http://www.mysqlperformanceblog.com/2008/03/16/mysql-error-message-nonsenses/

1
ответ дан 18.05.2020, 04:02
  • 1
    Это выглядит действительно хорошим и легким, но я don' t добираются, как использовать это. Вы могли объяснить, что /b и где мы дадим каталог? – smttsp 04.10.2019, 11:34
  • 2
    Много компиляторов для языков программирования общего назначения выполняют сложную оптимизацию и преобразования также. Парсинг и создание отчетов о синтаксических ошибках происходят задолго до этого. Я don' t видят как it' s относящийся к созданию хороших ошибок. – michiakig 18.05.2020, 04:02
  • 3
    Этот doesn' t означают, что, после того, как ошибка произошла, исходный запрос can' t получаться, и затем управляться на втором разе синтаксическим анализатором, разработанным для обеспечения более полезного сообщения об ошибке. – Conspicuous Compiler 18.05.2020, 04:03
  • 4
    Я думаю, что это было решением, принятым Sun. Я действительно соглашаюсь, что сообщение об ошибке действительно сосет с MySQL. Необходимо видеть тип ошибок, которые я раньше получал, по крайней мере, Вы получили фразу NULL, который привел Вас куда-нибудь. – Aziz Saleh 18.05.2020, 04:03

Теги

Похожие вопросы