MySQL源码 解析器

  sql请求发送到server端,需要经过解析器生成内部的数据结构对象,以方便进行优化和生成执行计划。解析器主要做了两件事情,词法分析和语法分析。

词法和语法分析:mysql使用lex词法分析器,yacc语法分析器进行分析,最后保存到lex对象结构中。

例如:     select id, name from xpchild where
id=1

1.
在mysql_parse函数中使用lex_start初始化thd->lex对象,然后调用yacc中的MYSQLparse函数进行词法和语法分析。

sql_yacc.cc是yacc在编译后生成出来的源文件,而在sql_yacc.yy文件中定义了大量的语法规则。下面找到select的语法定义。

2. 语法解析部分:

  根据词法分析器的分析后的结果,应用下面的语法规则

  


 %token  SELECT_SYM

select:
select_init
{
LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT;
};

select_item_list:
select_item_list ‘,‘ select_item
| select_item
| ‘*‘
{
THD *thd= YYTHD;
Item *item= new (thd->mem_root) Item_field(&thd->lex->current_select->context,NULL, NULL, "*");
if (item == NULL)
MYSQL_YYABORT;
if (add_item_to_list(thd, item))
MYSQL_YYABORT;
(thd->lex->current_select->with_wild)++;
};

where_clause:
/* empty */ { Select->where= 0; }
| WHERE
{
Select->parsing_place= IN_WHERE;
}
expr
{
SELECT_LEX *select= Select;
select->where= $3;
select->parsing_place= NO_MATTER;
if ($3)
$3->top_level_item();
};

可以看到,上面的sql语句被解析出来的几个部分:(保存在lex结构中)

1. sql_command=SQLCOM_SELECT;

2. where子句:select_lex->where

3. table列表:select_lex->table_list

4. 字段列表:select_lex->item_list

具体内容:

1.  table_list

  


     (gdb) print select_lex->table_list
$33 = {
<Sql_alloc> = {<No data fields>},
members of SQL_I_List<TABLE_LIST>:
elements = 1,
first = 0x8ca04818,
next = 0x8ca04818

  只有一个table, db = 0x8ca04bc8 "test", table_name =
0x8ca047f0 "xpchild"

 

  2.   where

          (gdb) print select_lex->where->type()
$32 = Item::FUNC_ITEM
(gdb) p select_lex->where)->args))->type()
$30 = Item::FIELD_ITEM
(gdb) p select_lex->where)->args++))->type()
$29 = Item::INT_ITEM

    结构如下:

where
|-->FUNC_ITEM
|-->FIELD_ITEM("id")
|-->INT_ITEM(1)

  3.   item_list

          (gdb) print *(Item_field*)(select_lex->item_list->first->info)
name = 0x8ca04758 "id",
(gdb) print *(Item_field*)(select_lex->item_list->first->next->info)
name = 0x8cb047f8 "name",

    结构如下:

item_list:
|-->Item_field("id")
|-->Item_field("name")

MySQL源码 解析器,布布扣,bubuko.com

时间: 2024-11-03 03:24:47

MySQL源码 解析器的相关文章

MySQL源码 优化器

完成了sql的解析过程后,开始进入优化器: 调用的流程分为: mysql_select: JOIN::prepare: JOIN::optimize: JOIN::exec: prepare过程: 组装各个组件,包括:stepup tables, fields, condition, order 1. tables: setup_tables_and_check_access:从table_list中检查访问权限,并加入到leaf_tables中,增加tables计数. setup_tables

设计模式课程 设计模式精讲 6-3 抽象工厂源码解析

1 源码解析 1.1 mysql源码解析 1.2 mybaties 的sqlsession源码解析 1 源码解析 1.1 mysql源码解析 1.2 mybaties 的sqlsession源码解析 原文地址:https://www.cnblogs.com/1446358788-qq/p/11295158.html

第二章 Google guava cache源码解析1--构建缓存器

1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHashMap(或者说成就是一个ConcurrentHashMap,只是在其上多添加了一些功能) 2.使用实例 具体在实际中使用的例子,去查看<第七章 企业项目开发--本地缓存guava cache>,下面只列出测试实例: import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit;

AngularJS源码解析4:Parse解析器的详解

$ParseProvider简介 此服务提供者也是angularjs中用的比较多的,下面我们来详细的说下这个provider. function $ParseProvider() { var cache = {}; var $parseOptions = { csp: false, unwrapPromises: false, logPromiseWarnings: true }; this.unwrapPromises = function(value) { if (isDefined(val

美女图片采集器 (源码+解析)

前言: 有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该. 前一段确实比较忙, ...小小地给自己的懒找个借口吧. 大二即将结束, 学习iOS也有一段时间了.今天抽点时间, 开源一个前几天刚上传的App里面的一个功能, RT, 美女图片采集器.   美女.. 相信没有人不喜欢吧, 基于此, 这个小Demo应运而生. 效果演示: 看到这里, 如果还有兴趣学习的话, 可以先到我的git中下载源码, 然后配合着源码看我下面的解析.相信, 会让你有所收获的. git下载链接: Bea

DRF-解析器组件源码解析

解析器组件源码解析 解析器组件源码解析 1 执行request.data 开始找重装的request中的data方法 2 在dispatch找到重装的request def dispatch(self, request, *args, **kwargs): request = self.initialize_request(request, *args, **kwargs) ***这里开始找data 3 在initialize_request中找到实例request的类Request() def

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](https://www.jianshu.com/p/bf1d01b79ce7) [Okhttp3源码解析(2)-Request分析](https://www.jianshu.com/p/5a85345c8ea7) [Okhttp3源码解析(3)-Call分析(整体流程)](https://www.jian

Linux(CentOS或RadHat)下MySQL源码安装

安装环境: CentOS6.3 64位 软件: Mysql-5.6 所需包: gcc/g++ :MySQL 5.6开始,需要使用g++进行编译.cmake  :MySQL 5.5开始,使用cmake进行工程管理,cmake需要2.8以上版本.bison  :MySQL语法解析器需要使用bison进行编译.ncurses-devel :用于终端操作的开发包.zlib    :MySQL使用zlib进行压缩 有关库包下载: 可以自己去官网下载,也可以去网盘下载 http://pan.baidu.co

mybatis源码-解析配置文件(三)之配置文件Configuration解析(超详细, 值得收藏)

1. 简介 1.1 系列内容 本系列文章讲解的是mybatis解析配置文件内部的逻辑, 即 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 其背后的逻辑. 1.2 适合对象 了解如何使用 mybatis 来访问数据库.可参看<