MySQL 源码|47 - 语法解析:子查询

目录文档:MySQL 源码|源码剖析文档目录

源码位置(版本 = MySQL 8.0.37):sql/sql_yacc.yy

前置文档:


在此之前,我们已经梳理的规则关系如下图所示。

在这里插入图片描述

下面我们梳理在 simple_expr 中使用的 row_subquery 规则和 table_subquery 规则,这两个规则用于处理单行子查询和多行子查询。涉及为子查询的规则如下图所示:其中绿色节点为本章节梳理,蓝色节点为之前章节已梳理,红色节点为后续章节梳理。

在这里插入图片描述

row_subquery 规则

row_subquery 规则用于匹配单行子查询,只有匹配 subquery 规则匹配结果这一种备选方案,Bison 语法如下:

row_subquery:
          subquery
        ;
table_subquery 规则

table_subquery 规则用于匹配多行子查询,只有匹配 subquery 规则匹配结果这一种备选方案,Bison 语法如下:

table_subquery:
          subquery
        ;
subquery 规则

subquery 规则用于匹配子查询,只有匹配 query_expression_parens 规则匹配结果这一种备选方案,Bison 语法如下:

subquery:
          query_expression_parens %prec SUBQUERY_AS_EXPR
          {
            $$= NEW_PTN PT_subquery(@$, $1);
          }
        ;
query_expression_parens 规则

query_expression_parens 规则用于匹配子查询,包含如下两种备选方案:

  • 依次匹配 (query_expression_parens 规则匹配结果和 ),通过这个备选方案,使 query_expression_parens 规则外可以嵌套任意层数的括号
  • 依次匹配 (query_expression_with_opt_locking_clauses 规则匹配结果和 )

Bison 语法如下:

query_expression_parens:
          '(' query_expression_parens ')'
          { $$ = $2;
            if ($$ != nullptr) $$->m_pos = @$;
          }
        | '(' query_expression_with_opt_locking_clauses')'
          { $$ = $2;
            if ($$ != nullptr) $$->m_pos = @$;
          }
        ;
query_expression_with_opt_locking_clauses 规则

query_expression_with_opt_locking_clauses 规则用于匹配子查询中的查询语句,该规则包含如下两种备选方案:

  • 匹配 query_expression 规则匹配结果
  • 依次匹配 query_expression 规则匹配结果和 locking_clause_list 规则匹配结果

通过以上两种备选方案,实现了匹配 query_expression 规则匹配结果和可选的 locking_clause_list 规则匹配结果的效果,Bison 语法如下:

query_expression_with_opt_locking_clauses:
          query_expression                      { $$ = $1; }
        | query_expression locking_clause_list
          {
            $$ = NEW_PTN PT_locking(@$, $1, $2);
          }
        ;
locking_clause_list 规则

locking_clause_list 规则用于匹配锁模式子句,有如下两种备选方案,实现了匹配任意数量的 locking_clause 子句的效果,Bison 语法如下:

locking_clause_list:
          locking_clause_list locking_clause
          {
            $$= $1;
            if ($$->push_back($2))
              MYSQL_YYABORT; // OOM
          }
        | locking_clause
          {
            $$= NEW_PTN PT_locking_clause_list(@$, YYTHD->mem_root);
            if ($$ == nullptr || $$->push_back($1))
              MYSQL_YYABORT; // OOM
          }
        ;
locking_clause 规则

locking_clause 规则用于匹配锁模式子句,有如下三种备选方案:

  • 依次匹配 FOR 关键字、lock_strength 规则匹配结果、opt_locked_row_action 规则匹配结果
  • 依次匹配 FOR 关键字、lock_strength 规则匹配结果、table_locking_list 规则匹配结果、opt_locked_row_action 规则匹配结果
  • 依次匹配 LOCK 关键字、IN 关键字、SHARE 关键字、MODE 关键字

通过第一种和第二种备选方案,实现了可选的 table_locking_list 效果。其中:

  • lock_strength 规则用于匹配 UPDATESHARE
  • opt_locked_row_action 规则用于匹配可选的 SKIP LOCKEDNOWAIT

Bison 语法如下:

locking_clause:
          FOR_SYM lock_strength opt_locked_row_action
          {
            $$= NEW_PTN PT_query_block_locking_clause(@$, $2, $3);
          }
        | FOR_SYM lock_strength table_locking_list opt_locked_row_action
          {
            $$= NEW_PTN PT_table_locking_clause(@$, $2, $3, $4);
          }
        | LOCK_SYM IN_SYM SHARE_SYM MODE_SYM
          {
            $$= NEW_PTN PT_query_block_locking_clause(@$, Lock_strength::SHARE);
          }
        ;
lock_strength 规则

lock_strength 规则用于匹配 UPDATE 关键字或 SHARE 关键字,Bison 语法如下:

lock_strength:
          UPDATE_SYM { $$= Lock_strength::UPDATE; }
        | SHARE_SYM  { $$= Lock_strength::SHARE; }
        ;
opt_locked_row_action 规则

opt_locked_row_action 规则用于匹配可选的 SKIP LOCKEDNOWAIT,有不匹配和匹配 locked_row_action 规则匹配结果两种备选方案,Bison 语法如下:

opt_locked_row_action:
          %empty { $$= Locked_row_action::WAIT; }
        | locked_row_action
        ;
locked_row_action 规则

locked_row_action 规则用于匹配 SKIP LOCKEDNOWAIT,Bison 语法如下:

locked_row_action:
          SKIP_SYM LOCKED_SYM { $$= Locked_row_action::SKIP; }
        | NOWAIT_SYM { $$= Locked_row_action::NOWAIT; }
        ;
table_locking_list 规则

table_locking_list 规则用于匹配指定行锁的行,Bison 语法如下:

table_locking_list:
          OF_SYM table_alias_ref_list { $$= $2; }
        ;
table_alias_ref_list 规则

table_alias_ref_list 规则用于匹配任意数量的逗号分隔的 table_ident_opt_wild 规则匹配结果,其中 table_ident_opt_wild 用于匹配行,Bison 语法如下:

table_alias_ref_list:
          table_ident_opt_wild
          {
            $$.init(YYMEM_ROOT);
            if ($$.push_back($1))
              MYSQL_YYABORT; // OOM
          }
        | table_alias_ref_list ',' table_ident_opt_wild
          {
            $$= $1;
            if ($$.push_back($3))
              MYSQL_YYABORT; // OOM
          }
        ;
table_ident_opt_wild 规则

table_ident_opt_wild 规则用于匹配行,有如下两种备选方案:

  • 匹配 ident[.*]:依次匹配 ident 规则匹配结果和 opt_wild 规则匹配结果
  • 匹配 ident.ident[.*]:依次匹配 ident 规则匹配结果、.ident 规则匹配结果和 opt_wild 规则匹配结果
table_ident_opt_wild:
          ident opt_wild
          {
            $$= NEW_PTN Table_ident(to_lex_cstring($1));
            if ($$ == nullptr)
              MYSQL_YYABORT;
          }
        | ident '.' ident opt_wild
          {
            $$= NEW_PTN Table_ident(YYTHD->get_protocol(),
                                    to_lex_cstring($1),
                                    to_lex_cstring($3), 0);
            if ($$ == nullptr)
              MYSQL_YYABORT;
          }
        ;
opt_wild 规则

opt_wild 规则用于匹配可选的 .*,Bison 语法如下:

opt_wild:
          %empty
        | '.' '*'
        ;
  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这个命令有一个错误,应该是: ``` rpm -qa | grep -i -E "mysql|mariadb" | xargs -n1 sudo rpm -e --nodeps ``` 具体解释如下: - rpm: Red Hat Package Manager,它是一种用于在 Red Hat 系统中安装、升级、删除软件包的工具。 - -qa: 查询已安装的软件包,其中 -q 表示查询软件包,-a 表示查询全部已安装的软件包。 - |: 管道符,将 rpm -qa 命令的输出作为下一个命令 grep 的输入。 - grep: 这是一个用于在文本中查找特定字符串的命令。 - -i: 在 grep 命令中表示忽略大小写。 - -E: 在 grep 命令中表示使用扩展正则表达式进行匹配。 - "mysql|mariadb": 这里是要查询的字符串,表示同时查询包含 mysql 或 mariadb 的软件包名称。注意,这里使用了双引号将 mysql 和 mariadb 括起来,表示将它们作为一个整体进行匹配。 - |: 再次使用管道符将 grep 命令的输出作为下一个命令 xargs 的输入。 - xargs: 一个命令行工具,可以将标准输入中的数据转换成命令行参数。在这里它的作用是将查询到的软件包名称传递给下一个命令进行卸载操作。 - -n1: 表示每次只传递一个参数给下一个命令。 - sudo: 以超级用户身份运行命令。 - rpm -e --nodeps: 卸载软件包,其中 -e 表示卸载软件包,--nodeps 表示忽略依赖关系,强制卸载软件包。 因此,整个命令的意思是查询已安装的 MySQL 或 MariaDB 数据库软件包名称,并强制卸载它们。在卸载过程中,忽略软件包之间的依赖关系。注意,这个命令会卸载整个数据库软件包,包括数据库数据和配置文件等,所以在使用之前请确保已备份重要的数据库数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值