MySQL 源码|111 - 抽象语法树:(3) 字符串类型的节点

LEX_STRINGlexer.lex_str):字符串

LEX_STRING 是一个结构体,主要用来表示标识符或字符串字面值的节点,定义如下:

// inlcude/mysql/mysql_lex_string.h
struct MYSQL_LEX_STRING {
  char *str;
  size_t length;
};

YACC 语义组:

  • select_alias:DQL 语句的 SELECT 子句中字段的别名
  • IDENT_sysopt_identident_or_textrole_ident_or_textident_or_empty:标识符
  • TEXT_STRING_sysTEXT_STRING_literalTEXT_STRING_filesystemTEXT_STRING_passwordTEXT_STRING_validatedTEXT_STRING_hashTEXT_STRING_sys_nonewlinefilter_wild_db_table_string:单引号 / 双引号字符串
  • opt_constraint_nameCONSTRAINT 关键字引导的约束条件名称(标识符)
  • ts_datafileopt_ts_datafile_nameDATEFILE 关键字引导的文件名(字符串)
  • lg_undofileUNDOFILE 关键字引导的文件名(字符串)
  • opt_logfile_group_nameUSE LOGFILE GROUP 引导的组名(标识符)
  • opt_describe_columnDESCRIBE 语句中需要描述的字段名(标识符或字符串)
  • opt_datadir_ssl:SSL 类型(常量)
  • default_encryptionENCRYPTION 关键字引导的名称(字符串)
  • schema:库名(字符串)
  • engine_or_all:存储引擎名称或 ALL 关键字(字符串)
  • opt_binlog_inSHOW 语句中 IN 引导的 Biglog 日志文件名(字符串)
  • persisted_variable_identIF EXISTS 子句中的名称,格式包括 标识符标识符.标识符DEFAULT.标识符
  • routine_string【待梳理】
  • opt_explain_into【待梳理】
Mem_root_array_YY<LEX_STRING>lex_str_list):字符串的列表

Mem_root_array_YY 是 MySQL 自定义的类型安全的动态数组。

YACC 语义组:

  • TEXT_STRING_sys_list:逗号分隔的单引号 / 双引号字符串(TEXT_STRING_sys)的列表。
LEX_CSTRINGlex_cstr):不可变字符串

LEX_CSTRING 也是结构体,主要也用来表示标识符或字符串字面值的节点,定义如下:

// inlcude/mysql/mysql_lex_string.h
struct MYSQL_LEX_CSTRING {
  const char *str;
  size_t length;
};

YACC 语义组:

  • key_cache_nameCACHE INDEX 语句中的缓存名称(标识符或 DEFAULT 关键字)
  • opt_table_alias:表语句(表名或子查询)后,可选的表别名 AS 子句(标识符)
  • opt_replace_passwordSET 语句中可选的替换密码 REPLACE 子句(字符串)
  • sp_opt_label【待梳理】
  • json_attribute:用于设置 ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 的 Json 格式字符串(字符串)
  • opt_channelFOR CHANNEL 子句(字符串)
  • opt_explain_for_schemaEXPLAIN 语句中可选的 FOR DATABASE 子句(标识符)
  • opt_compression_algorithmLOAD 语句中可选的 COMPRESSION 子句(字符串)
Mem_root_array<LEX_CSTRING> *lex_cstring_list):不可变字符串的列表

Mem_root_array 是 MySQL 自定义的类型安全的动态数组。

YACC 语义组:

  • opt_column_list / column_list:逗号分隔的标识符的列表。
Mem_root_array_YY<LEX_CSTRING>simple_ident_list):不可变字符串的列表
// sql/parser_yystype.h
typedef Mem_root_array_YY<LEX_CSTRING> Create_col_name_list;

YACC 语义组:

  • opt_derived_column_list / simple_ident_list:逗号分隔的标识符(字段名)的列表。
char *simple_string):指向字符串的指针

simple_string 是指向字符串的指针,在联合体 MY_SQL_PARSER_STYPE 中定义如下:

char *simple_string;

YACC 语义组:

  • opt_dbSHOW 语句中可选的 FROMIN 子句(标识符)
List<char> *name_list):指向字符串的指针的列表

YACC 语义组:

  • opt_name_list / name_listPARTITION BY 子句中逗号分隔的字段名(标识符)的列表。
Stringstring):包含字符集的字符串

String 类是 MySQL 自定义的包含字符集的字符串,定义在 include/sql_string.h 中。

核心属性:

  • char *m_ptr:指向字符串的指针
  • size_t m_length:字符串的长度
  • const CHARSET_INFO *m_charset:字符串的字符集

YACC 语义组:

  • text_string:字面值字面值、十六进制字面值或二进制字面值
  • opt_gconcat_separatorgroup_concat 函数中可选的指定分隔符的 SEPARATOR 子句
  • opt_xml_rows_identified_byLOAD 语句中可选的指定 XML 文件行分隔符的 ROWS IDENTIFIED BY 子句
List<String> *string_list):包含字符集的字符串的列表

YACC 语义组:

  • string_list:各个场景下,逗号分隔的 text_string(字面值字面值、十六进制字面值或二进制字面值)的列表
  • ident_string_list / using_list:各个场景下,逗号分隔的 ident(标识符)的列表
  • opt_use_partition / use_partition:描述 PARITITION (list of partitions) 子句。
  • all_or_alt_part_name_listALTER 语句的 PARTITION 子句中,指定分区范围的 ALL 关键字或部分名称的列表。
Item_stringitem_string):继承自 Item 的字符串

Item_string 是继承自 MySQL 抽象语法树节点基类 Item 的字符串类型节点,它存储了指向字符串的指针、字符串的长度以及字符串的字符集,并将这些信息存储在 Itemstr_value 属性中。

继承关系:Parse_tree_node > Item > Item_basic_constant > Item_string

核心属性:

  • String str_value:包含字符集的字符串

YACC 语义组:

  • window_name / opt_existing_window_name:窗口子句中的窗口名称(标识符)
  • filter_db_identCHANGE REPLICATION 语句中 REPLICATE_DO_DB 配置项或 REPLICATE_IGNORE_DB 配置项中的数据库名称(标识符)
  • filter_table_identCHANGE REPLICATION 语句中 REPLICATE_DO_TABLE 配置项或 REPLICATE_IGNORE_TABLE 配置项中的表名称(标识符)
  • filter_stringCHANGE REPLICATION 语句中 REPLICATE_WILD_DO_TABLE 配置项或 REPLICATE_WILD_IGNORE_TABLE 配置项中包含通配符的表名称(字符串),这里的 Item_string 对象是基于 lexer.lex_str 类型构造的。
mem_root_deque<Item *> *:继承自 Item 的字符串

YACC 语义组:

  • filter_db_listopt_filter_db_list:逗号分隔的 filter_db_ident 的列表。
  • filter_table_listopt_filter_table_list:逗号分隔的 filter_table_ident 的列表。
  • filter_string_listopt_filter_string_list:逗号分隔的 filter_string 的列表。
  • filter_db_pair_listopt_filter_db_pair_list:逗号分隔的 (filter_db_ident, filter_db_ident) 的列表。
const chat *c_str):指向字符串的不可变指针

simple_string 是指向字符串的指针,在联合体 MY_SQL_PARSER_STYPE 中定义如下:

const char *c_str;

YACC 语义组:

  • field_length / opt_field_length:在 DDL 语句中,指定字段类型长度的括号。
  • type_datetime_precision:在 DDL 语句或 CAST 函数中,指定时间类型精度的括号。
  • opt_place:在 DDL 语句中指定新增字段位置的可选的 FIRSTAFTER column_name 子句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值