目录文档:MySQL 源码|源码剖析文档目录
源码位置(版本 = MySQL 8.0.37):sql/sql_yacc.yy
前置文档:
- MySQL 源码|39 - 语法解析:ORDER BY 子句
- MySQL 源码|47 - 语法解析:子查询
- MySQL 源码|52 - 语法解析:FROM 子句和 JOIN 子句
- MySQL 源码|55 - 语法解析:基础查询语句(query_specification)
- MySQL 源码|56 - 语法解析:WITH 子句
在此之前,我们已经梳理了 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_with_clause
规则:匹配可选的WITH
子句,详见 MySQL 源码|56 - 语法解析:WITH 子句opt_low_priority
规则:匹配可选的LOW_PRIORITY
关键字opt_ignore
规则:匹配可选的IGNORE
关键字table_reference_list
规则:匹配需要更新的表语句的列表,详见 MySQL 源码|52 - 语法解析:FROM 子句和 JOIN 子句update_list
规则:匹配任意数量的、逗号分隔的赋值语句的列表opt_where_clause
规则:匹配可选的WHERE
子句,详见 MySQL 源码|55 - 语法解析:基础查询语句(query_specification)opt_order_clause
规则:匹配可选的ORDER BY
子句,详见 MySQL 源码|39 - 语法解析:ORDER BY 子句opt_simple_limit
规则:匹配可选的LIMIT
子句
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
规则:匹配ident
、ident.ident
或ident.ident.ident
,即需要被更新的字段名equal
规则:匹配=
或SET_VAR
关键字expr_or_default
规则:匹配一般表达式(expr
)或DEFAULT
关键字
simple_ident_nospvar
规则
simple_ident_nospvar
规则匹配 ident
、ident.ident
或 ident.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.ident
或ident.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_with_clause
规则:匹配可选的WITH
子句,详见 MySQL 源码|56 - 语法解析:WITH 子句opt_delete_options
规则:匹配可选的、逗号分隔的DELETE
语句选项table_ident
规则:匹配ident
或ident.ident
,即需要删除记录的表名,详见 MySQL 源码|52 - 语法解析:FROM 子句和 JOIN 子句opt_table_alias
规则:匹配可选的AS
子句指定表别名,详见 MySQL 源码|52 - 语法解析:FROM 子句和 JOIN 子句opt_use_partition
规则:匹配可选的PARTITION
子句,详见 MySQL 源码|52 - 语法解析:FROM 子句和 JOIN 子句opt_where_clause
规则:匹配可选的WHERE
子句,详见 MySQL 源码|55 - 语法解析:基础查询语句(query_specification)opt_order_clause
规则:匹配可选的ORDER BY
子句,详见 MySQL 源码|39 - 语法解析:ORDER BY 子句opt_simple_limit
规则:匹配可选的LIMIT
子句table_alias_ref_list
规则:匹配需要删除的逗号分隔的、任意数量的表子句的列表,详见 MySQL 源码|47 - 语法解析:子查询table_reference_list
规则:匹配用于查询的FROM
子句中逗号分隔的、任意数量的表信息(包含JOIN
子句),详见 MySQL 源码|52 - 语法解析:FROM 子句和 JOIN 子句
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
规则用于匹配QUICK
、LOW_PRIORITY
或IGNORE
opt_delete_option
规则
opt_delete_option
规则用于匹配 QUICK
、LOW_PRIORITY
或 IGNORE
,Bison 语法如下:
opt_delete_option:
QUICK { $$= DELETE_QUICK; }
| LOW_PRIORITY { $$= DELETE_LOW_PRIORITY; }
| IGNORE_SYM { $$= DELETE_IGNORE; }
;