背景

一个最简单的select语句包含select子句、from子句、where子句等,这些子句都不包含子查询(subselect),也没有union操作。而复杂的select语句包含select子句、from子句、where子句(这些子查询可以y是最简单的select语句也可以y是复杂的select语句),同时select语句中可能包含union,即将数个select子句联合在一起。

MySQL解析器(lex+yacc)是如何解析上述复杂的SQL的呢?又是使用什么样的数据结构来完整的维护一个大的select中包含的subselect、union的d关系呢?本文希望通过介绍MySQL解析器中相关的数据结构及处理过程,解答上述两个问题。

主要数据结构及其之间关系

MySQL解析器中负责分析和存储一个select语句信息的数据结构是st_select_lex类(MySQL中同时将该类宏定义为SELECT_LEX),同时负责分析和存储union关系的数据结构是st_select_lex_unit(MySQL中同时将该类宏定义为SELECT_LEX_UNIT),而这两个类都继承于st_select_lex_node类。

对于SELECT_LEX类,它主要是存储一个select语句中select子句的返回列信息,from子句中的表信息,order by,group by子句的列信息等。对于本文所关心的问题,SELECT_LEX类使用继承于st_select_lex_node类的next指针存储和该select语句进行union操作的其他select语句对应的SELECT_LEX的地址,通过这个指针串成union链表。

例如:SQL1:select * from test1 where id=5 union select * from test1 where id=6;

对于SELECT_LEX_UNIT负责管理处于同一级的进行union操作的数个select子句对应的SELECT_LEX。SELECT_LEX_UNIT通过继承于st_select_lex_node类的slave指针存储属于这一级的进行union操作的第一个SELECT_LEX,而这一级别其他参与union操作的SELECT_LEX,可以通过next指针串成的链表依次找到。同时SELECT_LEX_UNIT类中还有一个成员变量fake_select_lex,它来保存整个union操作的order by,limit条件。

例如:

对于select子句,from子句,where子句中出现子查询(subselect)的情况,MySQL解析器会先建一个SELECT_LEX_UNIT,将此SELECT_LEX_UNIT挂在该子查询上一级select对应的SELECT_LEX下(即该SELECT_LEX的slave指针赋值为此SELECT_LEX_UNIT对应的地址),同时新建一个SELECT_LEX和这个子查询对应,将这个新建的SELECT_LEX挂在刚建的SELECT_LEX_UNIT下。

(未完待续)

mysql源码如何解析where字句_MySQL解析器源码分析--对select语句中子查询处理逻辑的分析(一)...相关推荐

  1. mysql 两个select结果_MySQL UNION连接两个以上的SELECT语句的结果组合到一个结果集合...

    在MySQL中,UNION 操作符用于把来自多个 SELECT 语句的结果组合到一个结果集合中. 语法格式:SELECT ... UNION [ALL | DISTINCT] SELECT ... [ ...

  2. mysql select源码分析_MYSQL源码分析(三)--Select语句

    ●MYSQL的查询语句起始于:mysql_execute_command(THD *thd),(sql_http://www.doczj.com/doc/2e2a5f295f0e7cd18425367 ...

  3. mysql解析json字符串_Mysql解析json字符串/数组

    1 Mysql解析json字符串 解决方法:JSON_EXTRACT(原字段,'$.json字段名') 执行SQL: SELECT JSON_EXTRACT( t.result,'$.row'), J ...

  4. mysql两列查询结果列拼接一个表输出_sql select语句,查询出两列结果拼接在一起...

    展开全部 1.Oracle创建表,含两列,name和job:create table test_job(name varchar2(30), job varchar2(30)); 2.插636f707 ...

  5. mysql 用select 语句的查询结果当作 insert 语句需要插入的值

    在实际使用中会遇到这样的场景,需要根据一个表里的内容在其他表中添加关联的数据,这时候就会用到 insert into {table_name} select x1,x2,x3... from {tab ...

  6. mysql的基本内容介绍简书_MySQL 基本内容

    MySQL的基础 Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image ...

  7. mysql数据库的安装和使用方法_Mysql数据库的安装和使用

    mysql数据库的安装: 选择 typical 类型 >install>next>next> configure teh mysql server now 打勾 点击finis ...

  8. PHP哔哩哔哩bilibili视频弹幕播放器源码 带后台版本

    简介: PHP哔哩哔哩bilibili视频弹幕播放器源码 带后台版本 此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况. 环境:PHP7.0+MySQL5.6 优化修复功能: ...

  9. 多款Android播放器源码集锦

    Android传说中的3D播放器源码 Android 3D播放器 源码 170 2011-09-28 by:豆沙包 • android音乐播放器源码 android 237 2011-09-03 by ...

最新文章

  1. Android基础之Java接口
  2. 怎样才能最短时、高效、踏实地学习3D视觉?
  3. Win2000 DDK 附带例子概览(图解)
  4. 日均互动50万次 微信的营销的成功之道
  5. 用css及jQuery实现的精美拉下菜单导航条
  6. MSpider爬虫搜索
  7. VBA学习笔记(6)--抽取第一列中叫“虹虹”的个人信息
  8. ARTS打卡第14周
  9. 开源对象存储MinIO技术白皮书
  10. 机器学习(十七):网格搜索(Grid Search)和SVM
  11. drf 配置文件 过滤类 全局异常 接口文档
  12. Android recovery分区表
  13. Visio中的字体对应Word中字体字号
  14. java spring 中 每小时一次_spring 定时任务的 执行时间设置规则
  15. JSON数据交互和RESTful支持
  16. 2021年全国职业院校技能大赛:网络系统管理项目-真题-模块C-2全套视频讲解含无线地勘
  17. 零基础学习微信小程序(7):组件
  18. VARIANT 类型说明
  19. linux遇到nul字符,linux TXT文件操作 '^@ ' 'NUL' 符号乱码问题
  20. 粒子滤波 机器学习_用机器学习研究粒子物理学中的开放性问题

热门文章

  1. Java中当对象不再使用时,不赋值为null会导致什么后果 ?
  2. Java 8 Time Api 使用指南【珍藏限量版】
  3. Spring Security 入门(五):在 Spring-Boot中的应用
  4. 为了方便读者检索和阅读以往的内容,已开通“号内搜”功能
  5. php支付密码控件,vue支付密码的图文实例
  6. 告别CPU,加速100-1000倍!只用GPU就能完成物理模拟和强化学习训练
  7. cpp cu入门教程
  8. pytorch转caffe
  9. c++ float 转string
  10. OpenVINO FPS也可以达100帧