MySQL 源码|57 - 语法解析:UPDATE 表达式和 DELETE 表达式

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

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

前置文档:


在此之前,我们已经梳理了 update_stmt 规则和 delete_stmt 规则中涉及的 WITH 子句、WHERE 子句、ORDER BY 子句,现在,我们来梳理 update_stmt 规则和 delete_stmt 规则。

本节涉及相关关系如下图所示:其中绿色节点为本章节梳理,蓝色节点为之前章节已梳理,红色节点为后续章节梳理。

在这里插入图片描述

update_stmt 规则

update_stmt 规则用于匹配 UPDATE 表达式,标准语法如下,详见 MySQL 参考手册 - 15.2.17 UPDATE Statement

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

value:
    {expr | DEFAULT}

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

Bison 语法如下:

update_stmt:
          opt_with_clause
          UPDATE_SYM            /* #1 */
          opt_low_priority      /* #2 */
          opt_ignore            /* #3 */
          table_reference_list  /* #4 */
          SET_SYM               /* #5 */
          update_list           /* #6 */
          opt_where_clause      /* #7 */
          opt_order_clause      /* #8 */
          opt_simple_limit      /* #9 */
          {
            $$= NEW_PTN PT_update(@$, $1, $2, $3, $4, $5, $7.column_list, $7.value_list,
                                  $8, $9, $10);
          }
        ;
opt_low_priority 规则

opt_low_priority 规则用于匹配可选的 LOW_PRIORITY 关键字,Bison 语法如下:

opt_low_priority:
          %empty { $$= TL_WRITE_DEFAULT; }
        | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; }
        ;
opt_ignore 规则

opt_ignore 规则用于匹配可选的 IGNORE 关键字,Bison 语法如下:

opt_ignore:
          %empty      { $$= false; }
        | IGNORE_SYM  { $$= true; }
        ;
update_list 规则

update_list 规则用于匹配任意数量的、逗号分隔的赋值语句的列表,对应的标准语法如下:

assignment [, assignment] ...

assignment:
    col_name = value

Bison 语法如下:

update_list:
          update_list ',' update_elem
          {
            $$= $1;
            if ($$.column_list->push_back($3.column) ||
                $$.value_list->push_back($3.value))
              MYSQL_YYABORT; // OOM
          }
        | update_elem
          {
            $$.column_list= NEW_PTN PT_item_list(@$);
            $$.value_list= NEW_PTN PT_item_list(@$);
            if ($$.column_list == nullptr || $$.value_list == nullptr ||
                $$.column_list->push_back($1.column) ||
                $$.value_list->push_back($1.value))
              MYSQL_YYABORT; // OOM
          }
        ;
update_elem 规则

update_elem 规则用于匹配赋值语句,对应标准语法 col_name = value,Bison 语法如下:

update_elem:
          simple_ident_nospvar equal expr_or_default
          {
            $$.column= $1;
            $$.value= $3;
          }
        ;
  • simple_ident_nospvar 规则:匹配 identident.identident.ident.ident,即需要被更新的字段名
  • equal 规则:匹配 =SET_VAR 关键字
  • expr_or_default 规则:匹配一般表达式(expr)或 DEFAULT 关键字
simple_ident_nospvar 规则

simple_ident_nospvar 规则匹配 identident.identident.ident.ident,对应标准语法 col_name,Bison 语法如下:

simple_ident_nospvar:
          ident
          {
            $$= NEW_PTN PTI_simple_ident_nospvar_ident(@$, $1);
          }
        | simple_ident_q
        ;
  • ident 规则:匹配标识符
  • simple_ident_q 规则:匹配 ident.identident.ident.ident
equal 规则

equal 规则匹配 =EQUAL)或 SET_VAR 关键字(SET_VAR),Bison 语法如下:

equal:
          EQ
        | SET_VAR
        ;
expr_or_default 规则

expr_or_default 规则用于匹配一般表达式(expr)或 DEFAULT 关键字,Bison 语法如下:

expr_or_default:
          expr
        | DEFAULT_SYM
          {
            $$= NEW_PTN Item_default_value(@$);
          }
        ;
opt_simple_limit 规则

opt_simple_limit 规则用于匹配可选的 LIMIT 子句,Bison 语法如下:

opt_simple_limit:
          %empty { $$= nullptr; }
        | LIMIT limit_option { $$= $2; }
        ;
limit_option 规则

limit_option 规则用于匹配 LIMIT 的值,包括标识符、参数值或整数字面值,Bison 语法如下:

limit_option:
          ident
          {
            $$= NEW_PTN PTI_limit_option_ident(@$, to_lex_cstring($1));
          }
        | param_marker
          {
            $$= NEW_PTN PTI_limit_option_param_marker(@$, $1);
          }
        | ULONGLONG_NUM
          {
            $$= NEW_PTN Item_uint(@$, $1.str, $1.length);
          }
        | LONG_NUM
          {
            $$= NEW_PTN Item_uint(@$, $1.str, $1.length);
          }
        | NUM
          {
            $$= NEW_PTN Item_uint(@$, $1.str, $1.length);
          }
        ;
delete_stmt 规则

delete_stmt 规则用于匹配 DELETE 表达式,有如下三种标准语法,详见 MySQL 参考手册 - 15.2.17 UPDATE Statement

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

对应的,delete_stmt 规则的 Bison 语法也有三种备选方案,分别对应上述三种标准语法:

delete_stmt:
          opt_with_clause
          DELETE_SYM
          opt_delete_options
          FROM
          table_ident
          opt_table_alias
          opt_use_partition
          opt_where_clause
          opt_order_clause
          opt_simple_limit
          {
            $$= NEW_PTN PT_delete(@$, $1, $2, $3, $5, $6, $7, $8, $9, $10);
          }
        | opt_with_clause
          DELETE_SYM
          opt_delete_options
          table_alias_ref_list
          FROM
          table_reference_list
          opt_where_clause
          {
            $$= NEW_PTN PT_delete(@$, $1, $2, $3, $4, $6, $7);
          }
        | opt_with_clause
          DELETE_SYM
          opt_delete_options
          FROM
          table_alias_ref_list
          USING
          table_reference_list
          opt_where_clause
          {
            $$= NEW_PTN PT_delete(@$, $1, $2, $3, $5, $7, $8);
          }
        ;
opt_delete_options 规则

opt_delete_options 规则用于匹配可选的、逗号分隔的 DELETE 语句选项,对应标准语法 [LOW_PRIORITY] [QUICK] [IGNORE],Bison 语法如下:

opt_delete_options:
          %empty { $$= 0; }
        | opt_delete_option opt_delete_options { $$= $1 | $2; }
        ;
  • opt_delete_option 规则用于匹配 QUICKLOW_PRIORITYIGNORE
opt_delete_option 规则

opt_delete_option 规则用于匹配 QUICKLOW_PRIORITYIGNORE,Bison 语法如下:

opt_delete_option:
          QUICK        { $$= DELETE_QUICK; }
        | LOW_PRIORITY { $$= DELETE_LOW_PRIORITY; }
        | IGNORE_SYM   { $$= DELETE_IGNORE; }
        ;
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值