Spec-Zone .ru
спецификации, руководства, описания, API

9.2.4. Парсинг Имени функции и Разрешение

MySQL 5.7 поддерживает встроенные (собственные) функции, определяемые пользователем функции (UDFs), и сохраненные функции. Этот раздел описывает, как сервер распознает, используется ли имя встроенной функции в качестве вызова функции или в качестве идентификатора, и как сервер определяет, какую функцию использовать в случаях, когда функции различных типов существуют с именем.

Встроенный Парсинг Имени функции

Синтаксический анализатор использует правила значения по умолчанию для того, чтобы проанализировать имена встроенных функций. Эти правила могут быть изменены, включая IGNORE_SPACE Режим SQL.

Когда синтаксический анализатор встречается со словом, которое является именем встроенной функции, это должно определить, показывает ли имя вызов функции или является вместо этого ссылкой невыражения на идентификатор, такой как имя таблицы или имя столбца. Например, в следующих операторах, первой ссылке на count вызов функции, тогда как вторая ссылка является именем таблицы:

SELECT COUNT(*) FROM mytable;CREATE TABLE count (i INT);

Синтаксический анализатор должен распознать имя встроенной функции как указание на вызов функции только, анализируя, что, как ожидают, будет выражением. Таким образом, в контексте невыражения имена функций разрешаются как идентификаторы.

Однако, у некоторых встроенных функций есть специальные соображения парсинга или реализации, таким образом, синтаксический анализатор использует следующие правила по умолчанию, чтобы различить, используются ли их имена в качестве вызовов функции или в качестве идентификаторов в контексте невыражения:

Требование, чтобы вызовы функции быть записанными без пробела между именем и круглой скобкой применялись только к встроенным функциям, у которых есть специальные соображения. COUNT одно такое имя. Точный список имен функций, для которых следование за пробелом определяет их интерпретацию, является перечисленными в sql_functions[] массив sql/lex.h исходный файл. Перед MySQL 5.1 они являются довольно многочисленными (приблизительно 200), таким образом, можно счесть самым легким обработать непробельное требование как применяющийся ко всем вызовам функции. В MySQL 5.1 и позже, улучшения синтаксического анализатора сокращают к приблизительно 30 количество имен функций, на которые влияют.

Для функций, не перечисленных в sql_functions[]) массив, пробел не имеет значения. Они интерпретируются как вызовы функции только когда использующийся в контексте выражения и могут использоваться свободно в качестве идентификаторов иначе. ASCII одно такое имя. Однако, для этих имен функций, на которые невлияют, интерпретация может измениться по контексту выражения: func_name () интерпретируется как встроенная функция, если есть один с именем; в противном случае func_name () интерпретируется как определяемая пользователем функция или сохранил функцию, если Вы существуете с тем именем.

IGNORE_SPACE Режим SQL может использоваться, чтобы изменить, как синтаксический анализатор обрабатывает имена функций, которые чувствительны к пробелу:

Включать IGNORE_SPACE Режим SQL, используйте этот оператор:

SET sql_mode = 'IGNORE_SPACE';

IGNORE_SPACE также включается определенными другими составными режимами такой как ANSI это включает это в их значение:

SET sql_mode = 'ANSI';

Проверьте Раздел 5.1.7, "Режимы SQL Сервера", чтобы видеть, которому включают составные режимы IGNORE_SPACE.

Чтобы минимизировать зависимость SQL кодируют на IGNORE_SPACE устанавливая, используйте эти направляющие линии:

Число имен функций, на которые влияют IGNORE_SPACE был уменьшен значительно в MySQL 5.1.13, от приблизительно 200 до приблизительно 30. С MySQL 5.1.13 только на следующие функции все еще влияют IGNORE_SPACE установка.

ADDDATE BIT_AND BIT_OR BIT_XOR
CAST COUNT CURDATE CURTIME
DATE_ADD DATE_SUB EXTRACT GROUP_CONCAT
MAX MID MIN NOW
POSITION SESSION_USER STD STDDEV
STDDEV_POP STDDEV_SAMP SUBDATE SUBSTR
SUBSTRING SUM SYSDATE SYSTEM_USER
TRIM VARIANCE VAR_POP VAR_SAMP

Для более ранних версий MySQL проверьте содержание sql_functions[] массив в sql/lex.h исходный файл, чтобы видеть, которым влияют на функции IGNORE_SPACE.

Несовместимость, предупреждающая: изменение в MySQL 5.1.13, который сокращает количество имен функций, на которые влияют IGNORE_SPACE улучшает непротиворечивость работы синтаксического анализатора. Однако, это также представляет возможность несовместимости для старого кода SQL, который полагается на следующие условия:

Для функций, которыми больше не влияют IGNORE_SPACE с MySQL 5.1.13 больше не работает та стратегия. Любой из следующих подходов может использоваться, если у Вас есть код, который подвергается предыдущей несовместимости:

Разрешение Имени функции

Следующие правила описывают, как сервер разрешает ссылки на имена функций для функционального создания и вызова:

У предыдущих правил разрешения имени функции есть импликации для того, чтобы обновить до версий MySQL, которые реализуют новые встроенные функции: