Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
怎么给MySQL添加自定义语法_创想鸟

怎么给MySQL添加自定义语法

1 背景

mysql语法解析器用的bison(即yacc)来实现的,而词法解析是自己来实现的,涉及到的token都在文件lex.h里面,然后通过lex_input_stream 里面相关的函数,解析client的sql字节流(其中会通过提前构造好的hash表帮助快速找到对应symbol,相关代码在sql_lex_hash.cc里面),转换为token,交给bison进行语法解析。

为了给MySQL添加一个新的语法,我们必须添加新的token(如果有新增),以及增加新的语法(sql_yacc.yy)里面。本文以给create table增加一个新的options为例,来演示如何给MySQL新增一个语法。最终的效果如下:

create table t1 (  id int primary key,  name varchar(100)) global_partition by hash(id) partitions 10; //global_partition by为新增语法,global_partition为新增token

涉及到的修改文件如下:

sql/lex.h //tokensql/parse_tree_nodes.ccsql/parse_tree_nodes.hsql/parse_tree_partitions.ccsql/parse_tree_partitions.hsql/parser_yystype.hsql/sql_yacc.yy

2 新增关键词(token)

文件:sql/lex.h

static const SYMBOL symbols[] = {    /*     Insert new SQL keywords after that commentary (by alphabetical order):    */    //省略部分代码    {SYM("GLOBAL_PARTITION", GLOBAL_PARTITION_SYM)}, //注意按照字典序进行添加。    //省略部分代码};

按照上面的格式添加即可

3 新增语法

文件:sql/sql_yacc.yy

该文件为bison的语法,关于bison语法可以查看这里。下面凡是注释标有###为新增部分,没有标的注释是为了方便理解

%token GLOBAL_PARTITION_SYM 1309            /* seancheer */  //### 声明上一步添加的token,声明了才可以使用,编号1309选择一个未使用的就行%type  global_partition_clause //### 声明新增加的数据结构,后面会介绍create_table_stmt:          CREATE opt_temporary TABLE_SYM opt_if_not_exists table_ident          '(' table_element_list ')' opt_create_table_options_etc //最后一个标记在YYSTYPE中对应的是create_table_tail, 后面会介绍          {            $$= NEW_PTN PT_create_table_stmt(YYMEM_ROOT, $1, $2, $4, $5,                                             $7,                                             $9.opt_create_table_options,                                             $9.opt_partitioning,                                             $9.opt_global_partitioning, //### 赋值给对应参数,该构造函数需要新增,后面会介绍                                             $9.on_duplicate,                                             $9.opt_query_expression);          }        | CREATE opt_temporary TABLE_SYM opt_if_not_exists table_ident          opt_create_table_options_etc          {            $$= NEW_PTN PT_create_table_stmt(YYMEM_ROOT, $1, $2, $4, $5,                                             NULL,                                             $6.opt_create_table_options,                                             $6.opt_partitioning,                                             $6.opt_global_partitioning, //### 赋值给对应参数,该构造函数需要新增,后面会介绍                                             $6.on_duplicate,                                             $6.opt_query_expression);//partition相关的语法                                             opt_create_partitioning_etc:          partition_clause opt_duplicate_as_qe //这里是原生的partition表语法          {            $$= $2;            $$.opt_partitioning= $1;          }        | global_partition_clause opt_duplicate_as_qe //### 此处是新增的global_partition语法,          {            $$= $2;            $$.opt_global_partitioning= $1;          }        | opt_duplicate_as_qe        ;//### 下面为重点,新增的global_partition语法,可以看到,用到了新增的tokenglobal_partition_clause:          GLOBAL_PARTITION_SYM BY part_type_def opt_num_parts          {            $$= NEW_PTN PT_global_partition($3, @4, $4);          }        ;

4 类似于PT_partition添加对应的数据结构global_partition_clause

文件:parser_yystype.h:该文件是bison(yacc)运行的一环,代替bison内置的YYSTYPE的,当bison对相关语法解析后,需要构造相关的数据结构,通过对YYSTYPE的自定义,就可以实现构造自定义数据结构的目的了。添加我们自定义的数据结构代码如下:

法语写作助手 法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

法语写作助手 31 查看详情 法语写作助手

union YYSTYPE {  PT_sub_partition *opt_sub_part;  PT_part_type_def *part_type_def;  PT_partition *partition_clause;  PT_global_partition *global_partition_clause; //新加数据结构    struct {    Mem_root_array *opt_create_table_options;    PT_partition *opt_partitioning;    PT_global_partition *opt_global_partitioning; //同时注意添加到create_table_tail里面,因为create table语法会有该操作    On_duplicate on_duplicate;    PT_query_primary *opt_query_expression;  } create_table_tail;};static_assert(sizeof(YYSTYPE) <= 40, "YYSTYPE is too big"); //因为struct里面添加了一个成员变量,所以该union需要的空间也会变大,因此注意修改这一行

下面内容介绍PT_global_partition数据结构,为了保持和MySQL习惯一致,新增加的数据结构放在了

sql/parse_tree_nodes.cc sql/parse_tree_nodes.h sql/parse_tree_partitions.cc sql/parse_tree_partitions.h

四个文件里,理论上可以放在任何地方。可根据自身需求添加对应数据结构:

文件:sql/parse_tree_partitions.h sql/parse_tree_partitions.cc

/**新增数据结构*/class PT_global_partition : public Parse_tree_node {    typedef Parse_tree_node super;    PT_part_type_def *const part_type_def;    const POS part_defs_pos;    uint num_parts;public:    partition_info part_info;public:    PT_global_partition(PT_part_type_def *part_type_def, const POS &part_defs_pos,                        uint opt_num_parts)            : part_type_def(part_type_def),              part_defs_pos(part_defs_pos),              num_parts(opt_num_parts) {}    bool contextualize(Parse_context *pc) override;};//模仿其原生的实现方式即可bool PT_global_partition::contextualize(Parse_context *pc) {    if (super::contextualize(pc)) return true;    Partition_parse_context part_pc(pc->thd, &part_info, false);    if (part_type_def->contextualize(&part_pc)) return true;    if (part_info.part_type != partition_type::HASH) {        //only support hash partition for shard key        my_error(ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), "NOT HASH");        return true;    }    uint count_curr_parts = part_info.partitions.elements;    if (part_info.num_parts != 0) {        if (part_info.num_parts != count_curr_parts) {            error(&part_pc, part_defs_pos,                  ER_THD(pc->thd, ER_PARTITION_WRONG_NO_PART_ERROR));            return true;        }    } else if (count_curr_parts > 0)        part_info.num_parts = count_curr_parts;    return false;}

文件:sql/parse_tree_nodes.cc sql/parse_tree_nodes.h

接下来修改create table对应的数据结构,将新增的PT_global_partition添加到create table里面

class PT_create_table_stmt final : public PT_table_ddl_stmt_base {  PT_partition *opt_partitioning;  PT_global_partition *opt_global_partitioning; //添加成员变量  PT_create_table_stmt(    MEM_ROOT *mem_root, PT_hint_list *opt_hints, bool is_temporary,    bool only_if_not_exists, Table_ident *table_name,    const Mem_root_array *opt_table_element_list,    const Mem_root_array *opt_create_table_options,    PT_partition *opt_partitioning,    PT_global_partition *opt_global_partitioning, On_duplicate on_duplicate,    PT_query_primary *opt_query_expression)    : PT_table_ddl_stmt_base(mem_root),  m_opt_hints(opt_hints),  is_temporary(is_temporary),  only_if_not_exists(only_if_not_exists),  table_name(table_name),  opt_table_element_list(opt_table_element_list),  opt_create_table_options(opt_create_table_options),  opt_partitioning(opt_partitioning),  opt_global_partitioning(opt_global_partitioning), //添加构造函数,主要是为了增加对PT_global_partition的赋值操作  on_duplicate(on_duplicate),  opt_query_expression(opt_query_expression),  opt_like_clause(nullptr) {}  //在其对应的函数中增加相关逻辑,调用对应的初始化函数contextualizeSql_cmd *PT_create_table_stmt::make_cmd(THD *thd) {    if (opt_global_partitioning){        if (opt_global_partitioning->contextualize(&pc)) return nullptr;        lex->part_info = &opt_global_partitioning->part_info;    }}

以上就是怎么给MySQL添加自定义语法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/262625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
汇顶科技Q1实现营收10.64亿元,净利润同比增长20.29%
上一篇 2025年11月4日 09:30:48
Java中如何播放音频 掌握Clip播放声音
下一篇 2025年11月4日 09:30:54

相关推荐

  • MySQL中如何导入和导出数据_常用格式有哪些?

    MySQL中如何导入和导出数据_常用格式有哪些?MySQL中如何导入和导出数据_常用格式有哪些?MySQL中如何导入和导出数据_常用格式有哪些?MySQL中如何导入和导出数据_常用格式有哪些?

    mysql中导入导出数据常用方式有三种:一是使用mysqldump导出为sql文件,适合整库或单表备份迁移,命令如mysqldump -u root -p mydb > /backup/mydb.sql;二是通过select into outfile导出csv文件,适用于数据分析与excel处…

    2026年9月22日 用户投稿
    400
  • Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析

    Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析

    sublime可通过插件实现与mysql联动监控触发器日志写入。具体步骤如下:1.安装package control、mysql语法高亮、构建系统等插件;2.创建日志表并编写触发器记录数据变更;3.配置.sublime-build文件调用mysql命令行执行sql脚本;4.使用快捷键提升日志查询和处…

    2026年9月22日 用户投稿
    000
  • MySQL常见连接错误及其解决方案汇总_开发和运维必备?

    MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?MySQL常见连接错误及其解决方案汇总_开发和运维必备?

    access denied错误需检查用户名密码及权限,使用grant授权并执行flush privileges;2. can’t connect错误应确认mysql运行状态、防火墙设置及bind-address配置;3. host not allowed错误需创建用户并授权特定或全部ip…

    2026年9月22日 用户投稿
    000
  • MySQL备份压缩与加密技巧_MySQL提升备份安全与效率

    MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率

    mysql备份压缩与加密的核心在于减少存储空间并提升数据安全性。1. 压缩能显著降低存储成本,提升传输效率,加快恢复速度,简化备份管理,并有助于满足合规要求;2. 加密则通过防止未授权访问保障数据安全。实现方式主要有:1. 使用mysqldump结合gzip和gpg/openssl进行逻辑备份、压缩…

    2026年9月22日 用户投稿
    100
  • MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板

    MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板

    如何利用sublime text插件提升mysql字段映射表生成效率?1. 插件通过自动化提取sql语句中的表结构信息,减少手动操作;2. 支持一键导出为json或结构化模板(如markdown、html表格),提升开发效率;3. 利用sublime text的python插件机制,实现快速集成与执…

    2026年9月22日 用户投稿
    000
  • 玩转 Spring Boot 集成篇(定时任务框架Quartz)

    玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)玩转 Spring Boot 集成篇(定时任务框架Quartz)

    在日常项目研发中,定时任务可谓是必不可少的一环,关于 spring boot 如何实现静态定时任务、动态定时任务以及如何开启多线程跑任务,均已在上篇分享过,不再赘述。 虽然 Spring Boot 内置注解方式实现的定时任务,在一定程度上也能解决一定的业务场景问题,但是若做更复杂的动作,例如启停任务…

    2026年9月22日 用户投稿
    200
  • 如何用Sublime导出MySQL数据表结构_生成Markdown或HTML格式文档

    要使用 sublime text 导出 mysql 数据表结构并生成 markdown 或 html 文档,需通过以下步骤操作:1. 使用 show create table 命令或 mysqldump 工具获取建表语句;2. 在 sublime 中整理字段信息,按字段名、类型、是否为空、键、默认值…

    2026年9月22日
    100
  • MySQL备份数据恢复演练_MySQL数据恢复流程与实战

    MySQL备份数据恢复演练_MySQL数据恢复流程与实战MySQL备份数据恢复演练_MySQL数据恢复流程与实战MySQL备份数据恢复演练_MySQL数据恢复流程与实战MySQL备份数据恢复演练_MySQL数据恢复流程与实战

    mysql备份数据恢复演练是为了验证备份有效性并提升dba恢复能力的必要措施。其核心流程包括:1.准备与生产环境相似的演练环境并明确恢复目标;2.检查备份策略并准备所需全量与增量备份文件;3.模拟数据丢失场景并记录故障时间;4.停止mysql服务、清理数据目录后从全量备份恢复;5.依次应用增量备份并…

    2026年9月22日 用户投稿
    100
  • MySQL自动化备份如何实现_适合企业级部署吗?

    MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?MySQL自动化备份如何实现_适合企业级部署吗?

    mysql的自动化备份对企业级部署是必要的,且可通过多种方式实现。1. 使用mysqldump+定时任务(crontab)是最基础的方式,操作简单适合中小规模数据库,但备份时可能锁表影响业务;2. 增量备份结合二进制日志(binary log)更高效,适用于频繁变更的数据,支持精确恢复到某时间点;3…

    2026年9月21日 用户投稿
    100
  • Online Config VS Code

    Online Config VS CodeOnline Config VS CodeOnline Config VS CodeOnline Config VS Code

    run vs view Install Code Server Update Code Server Database:It is recommended to create a Docker container for the database. Code Language: JavaScript…

    2026年9月21日 用户投稿
    100
  • Bun 1.3 正式发布

    2025年10月10日,高性能 javascript 运行时 bun 发布了 1.3 版本。这是 bun 项目迄今为止最重大的版本更新,标志着 bun 从单纯的运行时工具演变为一个功能完备的全栈 javascript 开发平台。 从运行时到全栈平台的跨越 Bun 1.3 的核心突破在于将前端开发能力…

    2026年9月21日
    100
  • MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    要快速补全mysql字段注释,可通过sublime text编写python脚本实现自动化;1. 脚本获取表名,可手动输入或从当前sql文件解析;2. 通过subprocess调用mysql命令行获取show full columns信息;3. 解析输出内容,提取字段名和现有注释;4. 生成alte…

    2026年9月21日 用户投稿
    200
  • 在Java中如何实现对象的唯一标识

    答案:Java中实现对象唯一标识主要有四种方式:1. 使用UUID生成全局唯一ID,适用于无数据库或分布式场景;2. 利用数据库自增主键,通过JPA的@Id和@GeneratedValue实现持久化唯一性;3. 重写equals与hashCode方法,基于不可变业务字段保证逻辑唯一;4. 采用Sno…

    2026年9月21日
    100
  • MySQL数据备份自动化实施_MySQL定时任务与脚本管理

    MySQL数据备份自动化实施_MySQL定时任务与脚本管理MySQL数据备份自动化实施_MySQL定时任务与脚本管理MySQL数据备份自动化实施_MySQL定时任务与脚本管理MySQL数据备份自动化实施_MySQL定时任务与脚本管理

    mysql数据备份的自动化实施核心在于结合mysqldump等工具与操作系统的定时任务(如linux的cron或windows的task scheduler),通过编写和管理脚本实现定期执行备份。1. 使用mysqldump作为基础工具,编写包含数据库连接信息、时间戳文件名、日志记录、压缩清理等功能…

    2026年9月21日 用户投稿
    200
  • MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    mysql热点数据缓存的核心在于将频繁访问的数据保留在内存中以减少磁盘i/o,提升查询速度并缓解数据库压力。1. innodb缓冲池是关键机制,需合理配置其大小(通常为服务器内存的70-80%)及实例数以优化性能;2. 应用层缓存如redis/memcached通过前置缓存逻辑减少对mysql的直接…

    2026年9月21日 用户投稿
    200
  • MySQL常见错误码代表什么_如何快速定位问题?

    MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?

    遇到mysql错误码应先明确错误类型再逐步排查。error 1045表示用户名、密码或访问权限问题,需检查拼写、ip限制和远程访问权限;error 2003表示连接失败,需依次检查服务器状态、mysql服务运行情况、防火墙设置及bind-address配置;error 1054表示sql语句中引用了…

    2026年9月21日 用户投稿
    100
  • MySQL如何实现数据的实时备份_有哪些高效工具和方法?

    mysql 实时备份主要依赖主从复制、二进制日志(binlog)配合增量备份,以及借助专业工具实现自动化监控与恢复。一、主从复制通过将主库数据变更同步到从库实现“准实时”备份,但存在延迟风险,建议开启 gtid 模式提升一致性;二、结合 binlog 与定时归档实现可回溯的增量备份,配合全量备份可恢…

    2026年9月21日
    100
  • SpringBoot的定时任务

    SpringBoot的定时任务SpringBoot的定时任务SpringBoot的定时任务SpringBoot的定时任务

    大家好,我是你们的老朋友全栈君。我们又见面了。 一、基于注解(@Scheduled)的定时任务 使用SpringBoot的@Scheduled注解来创建定时任务非常简单,只需几行代码就能实现。然而,@Scheduled默认是单线程运行,这意味着当启动多个任务时,一个任务的执行时间可能会影响到下一个任…

    2026年9月21日 用户投稿
    500
  • MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    mysql原生全文搜索功能存在明显局限,需结合外部搜索引擎才能满足复杂需求。1. mysql全文搜索适用于小数据量、简单查询场景,但分词能力弱,尤其对中文支持差,查询功能有限,无法实现模糊查询、纠错等高级功能,且性能随数据量增长显著下降。2. 外部搜索引擎如elasticsearch(es)和sph…

    2026年9月21日 用户投稿
    100
  • MySQL慢查询到底是什么_怎样快速定位并修复它?

    MySQL慢查询到底是什么_怎样快速定位并修复它?MySQL慢查询到底是什么_怎样快速定位并修复它?MySQL慢查询到底是什么_怎样快速定位并修复它?MySQL慢查询到底是什么_怎样快速定位并修复它?

    mysql慢查询可通过开启日志、分析日志和针对性优化快速定位修复。具体步骤:1. 修改配置文件或使用命令开启慢查询日志并设置阈值;2. 利用mysqldumpslow或pt-query-digest工具分析日志内容,找出耗时sql;3. 针对常见原因如缺少索引、sql写法不合理、数据量过大、锁竞争及…

    2026年9月21日 用户投稿
    100

发表回复

登录后才能评论
关注微信