MySQL 源码|41 - 语法解析:标识符 IDENT

MySQL 源码|41 - 语法解析:标识符 IDENT

源码位置(版本 = MySQL 8.0.37):

前置文档:

在此之前,我们已经梳理的规则关系如下图所示。下面我们梳理基础语法元素 identident_or_text

在这里插入图片描述

涉及标识符句的规则如下图所示:其中绿色节点为本章节梳理,蓝色节点为之前章节已梳理,红色节点为后续章节梳理。

在这里插入图片描述

总体来说,标识符(ident 规则)允许是 IDENTIDENT_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 词法解析源码,可知 IDENTIDENT_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 名称的未保留的关键字,包括 EXECUTERESTARTSHUTDOWN。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 名称的未保留的关键字,包括 ASCIIBEGINBYTECACHECHARSETCHARSUMCLONECOMMENTCOMMITCONTAINSDEALLOCATEDOENDFLUSHFOLLOWSHANDLERHELPIMPORTINSTALLLANUAGENOPRECEDESPREPAREREPAIRRESETROLLBACKSAVEPOINTSIGNEDSLAVESTARTSTOPTRUNCATEUNICODEUNINSTALLXA。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 名称的未保留的关键字,包括 EVENTFILENONEPROCESSPROXYRELOADREPLICATIONRESOURCESUPER。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 语句复制操作左侧变量名的未保留的关键字,包括 GLOBALLOCALPERSISTPERSIST_ONLYSESSION。Bison 语法如下:

ident_keywords_ambiguous_4_system_variables:
          GLOBAL_SYM
        | LOCAL_SYM
        | PERSIST_SYM
        | PERSIST_ONLY_SYM
        | SESSION_SYM
        ;
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值