MySQL 源码|41 - 语法解析:标识符 IDENT
源码位置(版本 = MySQL 8.0.37):
前置文档:
在此之前,我们已经梳理的规则关系如下图所示。下面我们梳理基础语法元素 ident
和 ident_or_text
。
涉及标识符句的规则如下图所示:其中绿色节点为本章节梳理,蓝色节点为之前章节已梳理,红色节点为后续章节梳理。
总体来说,标识符(ident
规则)允许是 IDENT
或 IDENT_QUOTED
类型的 token 对应的标识符,以及允许被用作标识符的未保留的关键字。
ident_or_text
规则
ident_or_text
规则包含如下 3 种备选方案:
- 匹配
ident
规则的匹配结果 - 匹配
TEXT_STRING_sys
规则的匹配结果 - 匹配
@
之后的语法元素(LEX_HOSTNAME
)
Bison 语法如下:
ident_or_text:
ident { $$=$1;}
| TEXT_STRING_sys { $$=$1;}
| LEX_HOSTNAME { $$=$1;}
;
TEXT_STRING_sys
规则
TEXT_STRING_sys
规则只有匹配 TEXT_STRING
这一种备选方案,其中 TEXT_STRING
类型 token 对应被引号框柱的字符串。Bison 语法如下:
TEXT_STRING_sys:
TEXT_STRING
{
THD *thd= YYTHD;
if (thd->charset_is_system_charset)
$$= $1;
else
{
if (thd->convert_string(&$$, system_charset_info,
$1.str, $1.length, thd->charset()))
MYSQL_YYABORT;
}
}
;
ident
规则
ident
规则有匹配 IDENT_sys
规则匹配结果;匹配 ident_keyword
规则匹配结果两种备选方案。Bison 语法如下:
ident:
IDENT_sys { $$=$1; }
| ident_keyword
{
THD *thd= YYTHD;
$$.str= thd->strmake($1.str, $1.length);
if ($$.str == nullptr)
MYSQL_YYABORT;
$$.length= $1.length;
}
;
IDENT_sys
规则
IDENT_sys
规则有匹配 IDENT
类型 token 和匹配 IDENT_QUOTED
类型 token 两种备选方案。根据 MySQL 源码|21 - 词法解析:状态转移逻辑梳理 中梳理的 MySQL 词法解析源码,可知 IDENT
和 IDENT_QUOTED
这 2 种 token 都是针对没有引号且不是关键字的普通标识符,这个语法元素可能是比字段名、参数名、UDF 函数名或其他任意标识符。如果在标识符中包含多字节字符,则为 IDENT_QUOTED
类型 token;否则,为 IDENT
类型 token。Bison 语法如下:
IDENT_sys:
IDENT { $$= $1; }
| IDENT_QUOTED
{
THD *thd= YYTHD;
if (thd->charset_is_system_charset)
{
const CHARSET_INFO *cs= system_charset_info;
int dummy_error;
size_t wlen= cs->cset->well_formed_len(cs, $1.str,
$1.str+$1.length,
$1.length, &dummy_error);
if (wlen < $1.length)
{
ErrConvString err($1.str, $1.length, &my_charset_bin);
my_error(ER_INVALID_CHARACTER_STRING, MYF(0),
cs->csname, err.ptr());
MYSQL_YYABORT;
}
$$= $1;
}
else
{
if (thd->convert_string(&$$, system_charset_info,
$1.str, $1.length, thd->charset()))
MYSQL_YYABORT;
}
}
;
ident_keyword
规则
ident_keyword
规则有匹配 ident_keywords_unambiguous
规则匹配结果,匹配 ident_keywords_ambiguous_1_roles_and_labels
规则匹配结果,匹配 ident_keywords_ambiguous_2_labels
规则匹配结果,匹配 ident_keywords_ambiguous_3_roles
规则匹配结果和匹配 ident_keywords_ambiguous_4_system_variables
规则匹配结果共 5 种备选方案。Bison 语法如下:
ident_keyword:
ident_keywords_unambiguous
| ident_keywords_ambiguous_1_roles_and_labels
| ident_keywords_ambiguous_2_labels
| ident_keywords_ambiguous_3_roles
| ident_keywords_ambiguous_4_system_variables
;
ident_keywords_unambiguous
规则
ident_keywords_unambiguous
规则中均为未保留的关键字,这些关键字可以在不引入语法冲突的情况下在任何地方用作未加引号的标识符。Bison 语法过长,如需了解可查看 sql_yacc.yy
文件的 15559 行。
ident_keywords_ambiguous_1_roles_and_labels
规则
ident_keywords_ambiguous_1_roles_and_labels
规则中为不允许用作 roles 名称和 SP label 名称的未保留的关键字,包括 EXECUTE
、RESTART
和 SHUTDOWN
。Bison 语法如下:
ident_keywords_ambiguous_1_roles_and_labels:
EXECUTE_SYM
| RESTART_SYM
| SHUTDOWN
;
ident_keywords_ambiguous_2_labels
规则
ident_keywords_ambiguous_2_labels
规则中为不允许用于未加括号的 SP label 名称的未保留的关键字,包括 ASCII
、BEGIN
、BYTE
、CACHE
、CHARSET
、CHARSUM
、CLONE
、COMMENT
、COMMIT
、CONTAINS
、DEALLOCATE
、DO
、END
、FLUSH
、FOLLOWS
、HANDLER
、HELP
、IMPORT
、INSTALL
、LANUAGE
、NO
、PRECEDES
、PREPARE
、REPAIR
、RESET
、ROLLBACK
、SAVEPOINT
、SIGNED
、SLAVE
、START
、STOP
、TRUNCATE
、UNICODE
、UNINSTALL
、XA
。Bison 语法如下:
ident_keywords_ambiguous_2_labels:
ASCII_SYM
| BEGIN_SYM
| BYTE_SYM
| CACHE_SYM
| CHARSET
| CHECKSUM_SYM
| CLONE_SYM
| COMMENT_SYM
| COMMIT_SYM
| CONTAINS_SYM
| DEALLOCATE_SYM
| DO_SYM
| END
| FLUSH_SYM
| FOLLOWS_SYM
| HANDLER_SYM
| HELP_SYM
| IMPORT
| INSTALL_SYM
| LANGUAGE_SYM
| NO_SYM
| PRECEDES_SYM
| PREPARE_SYM
| REPAIR
| RESET_SYM
| ROLLBACK_SYM
| SAVEPOINT_SYM
| SIGNED_SYM
| SLAVE
| START_SYM
| STOP_SYM
| TRUNCATE_SYM
| UNICODE_SYM
| UNINSTALL_SYM
| XA_SYM
;
ident_keywords_ambiguous_3_roles
规则
ident_keywords_ambiguous_3_roles
规则中为不允许用于未加括号的 role 名称的未保留的关键字,包括 EVENT
、FILE
、NONE
、PROCESS
、PROXY
、RELOAD
、REPLICATION
、RESOURCE
、SUPER
。Bison 语法如下:
ident_keywords_ambiguous_3_roles:
EVENT_SYM
| FILE_SYM
| NONE_SYM
| PROCESS
| PROXY_SYM
| RELOAD
| REPLICATION
| RESOURCE_SYM
| SUPER_SYM
;
ident_keywords_ambiguous_4_system_variables
规则
ident_keywords_ambiguous_4_system_variables
规则中为不允许在未加括号且无前缀的情况下,用作 SET
语句复制操作左侧变量名的未保留的关键字,包括 GLOBAL
、LOCAL
、PERSIST
、PERSIST_ONLY
、SESSION
。Bison 语法如下:
ident_keywords_ambiguous_4_system_variables:
GLOBAL_SYM
| LOCAL_SYM
| PERSIST_SYM
| PERSIST_ONLY_SYM
| SESSION_SYM
;