MySQL 源码|53 - 语法解析(V2):INTO 子句|V20240915

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

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


下面我们梳理 INTO 子句,INTO 子句用于将查询结果存储到变量或写入到文件。其中涉及的 symbol 及 symbol 之间的关系如下(图中绿色节点为字符串字面值涉及节点、蓝色节点为其他语义组、灰色节点为其他终结符):

在这里插入图片描述

语义组:into_clause

into_clause 语义组用于解析 INTO 子句。

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}
  • 返回值类型:PT_into_destination 对象(into_destination
  • 使用场景:查询表达式(query_specification 语义组),SELECT 表达式(select_stmt_with_into)语义组
  • Bison 语法如下:
into_clause:
          INTO into_destination
          {
            $$= $2;
          }
        ;
语义组:into_destination

into_destination 语义组用于解析 INTO 子句中 INTO 关键字之后的部分。

  OUTFILE 'file_name'
      [CHARACTER SET charset_name]
      export_options
| DUMPFILE 'file_name'
| var_name [, var_name] ...
  • 返回值类型:PT_into_destination 对象(into_destination
  • 备选规则和 Bison 语法如下:
备选规则规则含义
OUTFILE TEXT_STRING_filesystem opt_load_data_charset opt_field_term opt_line_term将查询到的行写出到文件,可以指定列终止符和行终止符以生成特定的输出格式
DUMPFILE TEXT_STRING_filesystem将单个行写入文件而不进行任何格式化
select_var_list选择列值并将它们存储到变量中
into_destination:
          OUTFILE TEXT_STRING_filesystem
          opt_load_data_charset
          opt_field_term opt_line_term
          {
            $$= NEW_PTN PT_into_destination_outfile(@$, $2, $3, $4, $5);
          }
        | DUMPFILE TEXT_STRING_filesystem
          {
            $$= NEW_PTN PT_into_destination_dumpfile(@$, $2);
          }
        | select_var_list { $$= $1; }
        ;

TEXT_STRING_filesystem 语义组用于解析作为文件系统路径的单引号 / 双引号字符串,详见 MySQL 源码|65 - 语法解析(V2):字符串字面值

opt_load_data_charset 语义组用于解析可选的指定字符集子句,详见下文;

opt_field_term 语义组用于解析写出到文件的列配置信息,包括 TERMINATED BYOPTIONALLY ENCLOSED BYENCLOSED BYESCAPED BY,详见下文;

opt_line_term 语义组用于解析析出到文件的行配置信息,包括 TERMINATED BYSTARTING BY,详见下文;

select_var_list 语义组用于解析任意数量、逗号分隔的变量的列表,详见下文。

语义组:opt_load_data_charset

opt_load_data_charset 语义组用于解析可选的指定字符集子句。

  • 标准语法:[CHARACTER SET charset_name]
  • 返回值类型:CHARSET_INFO 结构体(lexer.charset
  • Bison 语法如下:
opt_load_data_charset:
          %empty { $$= nullptr; }
        | character_set charset_name { $$ = $2; }
        ;

character_set 语义组用于解析 CHAR SETCHARSET,详见 MySQL 源码|73 - 语法解析(V2):数据类型(type)

charset_name 语义组用于解析字符集名称,详见 MySQL 源码|43 - 语法解析(V2):关键字函数

语义组:opt_field_term

opt_field_term 语义组用于解析写出到文件的列配置信息,包括 TERMINATED BYOPTIONALLY ENCLOSED BYENCLOSED BYESCAPED BY

  • 返回值类型:Field_separators 结构体(field_separators),其中包含字段名(field_term)、需转移的字符(escaped)、括号字符(enclosed),可选的括号字符(opt_enclosed)这 4 个属性
  • Bison 语法如下:
opt_field_term:
          %empty { $$.cleanup(); }
        | COLUMNS field_term_list { $$= $2; }
        ;
语义组:field_term_list

field_term_list 语义组用于解析空格分隔的、任意数量的 TERMINATED BYOPTIONALLY ENCLOSED BYENCLOSED BYESCAPED BY 导出文件的列配置信息。

  • 返回值类型:Field_separators 结构体(field_separators
  • Bison 语法如下:
field_term_list:
          field_term_list field_term
          {
            $$= $1;
            $$.merge_field_separators($2);
          }
        | field_term
        ;
语义组:field_term

field_term 语义组用于解析 TERMINATED BYOPTIONALLY ENCLOSED BYENCLOSED BYESCAPED BY 导出文件的列配置信息。

  • 返回值类型:Field_separators 结构体(field_separators
  • Bison 语法如下:
field_term:
          TERMINATED BY text_string
          {
            $$.cleanup();
            $$.field_term= $3;
          }
        | OPTIONALLY ENCLOSED BY text_string
          {
            $$.cleanup();
            $$.enclosed= $4;
            $$.opt_enclosed= 1;
          }
        | ENCLOSED BY text_string
          {
            $$.cleanup();
            $$.enclosed= $3;
          }
        | ESCAPED BY text_string
          {
            $$.cleanup();
            $$.escaped= $3;
          }
        ;

text_string 语义组用于解析单引号 / 双引号字符串、十六进制数或二进制数,详见 MySQL 源码|65 - 语法解析(V2):字符串字面值

语义组:opt_line_term

opt_line_term 语义组用于解析析出到文件的行配置信息,包括 TERMINATED BYSTARTING BY

  • 返回值类型:Line_separators 结构体(line_separators),包括行结束符(line_term)和行起始符(line_start)这 2 个属性
  • Bison 语法如下:
opt_line_term:
          %empty { $$.cleanup(); }
        | LINES line_term_list { $$= $2; }
        ;
语义组:line_term_list

line_term_list 语义组用于解析空格分隔的、任意数量的 TERMINATED BYSTARTING BY 导出文件的行配置信息。

  • 返回值类型:Line_separators 结构体(line_separators
  • Bison 语法如下:
line_term_list:
          line_term_list line_term
          {
            $$= $1;
            $$.merge_line_separators($2);
          }
        | line_term
        ;
语义组:line_term

line_term 语义组用于解析 TERMINATED BYSTARTING BY 导出文件的行配置信息。

  • 返回值类型:Line_separators 结构体(line_separators
  • Bison 语法如下:
line_term:
          TERMINATED BY text_string
          {
            $$.cleanup();
            $$.line_term= $3;
          }
        | STARTING BY text_string
          {
            $$.cleanup();
            $$.line_start= $3;
          }
        ;
语义组:select_var_list

select_var_list 语义组用于解析任意数量、逗号分隔的变量的列表。

  • 标准语法:var_name [, var_name]
  • 返回值类型:PT_select_var_list 对象(select_var_list
  • Bison 语法如下:
select_var_list:
          select_var_list ',' select_var_ident
          {
            $$= $1;
            if ($$ == nullptr || $$->push_back($3))
              MYSQL_YYABORT;
          }
        | select_var_ident
          {
            $$= NEW_PTN PT_select_var_list(@$);
            if ($$ == nullptr || $$->push_back($1))
              MYSQL_YYABORT;
          }
        ;
语义组:select_var_ident

select_var_ident 语义组用于解析单个变来那个。

  • 返回值类型:PT_select_var 对象(select_var_ident
  • Bison 语法如下:
select_var_ident:
          '@' ident_or_text
          {
            $$= NEW_PTN PT_select_var(@$, $2);
          }
        | ident_or_text
          {
            $$= NEW_PTN PT_select_sp_var(@$, $1);
          }
        ;

ident_or_text 语义组用于解析标识符、任意未保留关键字、单引号 / 双引号字符串或用户自定义变量,详见 MySQL 源码|41 - 语法解析(V2):标识符 IDENT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值