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= ; }
| WHERE
{
Select->parsing_place= IN_WHERE;
}
expr
{
SELECT_LEX *select= Select;
select->where= $;
select->parsing_place= NO_MATTER;
if ($)
$->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
$ = {
<Sql_alloc> = {<No data fields>},
members of SQL_I_List<TABLE_LIST>:
elements = ,
first = 0x8ca04818,
next = 0x8ca04818
  只有一个table, db = 0x8ca04bc8 "test", table_name = 0x8ca047f0 "xpchild"
 

  2.   where
          (gdb) print select_lex->where->type()
$ = Item::FUNC_ITEM
(gdb) p select_lex->where)->args))->type()
$ = Item::FIELD_ITEM
(gdb) p select_lex->where)->args++))->type()
$ = Item::INT_ITEM

    结构如下:

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

  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源码 解析器的更多相关文章

  1. MySQL源码解析之执行计划

    MySQL源码解析之执行计划 MySQL执行计划介绍 MySQL执行计划代码概览 MySQL执行计划总结 一.MySQL执行计划介绍 在MySQL中,执行计划的实现是基于JOIN和QEP_TAB这两个 ...

  2. MySQL源码 优化器

    完成了sql的解析过程后,开始进入优化器: 调用的流程分为:     mysql_select:           JOIN::prepare:           JOIN::optimize: ...

  3. 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...

  4. springMVC源码解析--ViewResolver视图解析器执行(三)

    之前两篇博客springMVC源码分析--ViewResolver视图解析器(一)和springMVC源码解析--ViewResolverComposite视图解析器集合(二)中我们已经简单介绍了一些 ...

  5. springMVC 拦截器源码解析

    前言:这两天学习了代理模式,自然想到了 springmvc 的 aop 使用的就是动态代理,拦截器使用的就是 jdk 的动态代理.今天看了看源码,记录一下.转载请注明出处:https://www.cn ...

  6. MySQL的JDBC驱动源码解析

    原文:   MySQL的JDBC驱动源码解析 大家都知道JDBC是Java访问数据库的一套规范,具体访问数据库的细节有各个数据库厂商自己实现 Java数据库连接(JDBC)由一组用 Java 编程语言 ...

  7. Google guava cache源码解析1--构建缓存器(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHas ...

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

    1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHashMap(或者说成就是一个ConcurrentHashMap,只是在其上多添加了一些功能) ...

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

    $ParseProvider简介 此服务提供者也是angularjs中用的比较多的,下面我们来详细的说下这个provider. function $ParseProvider() { var cach ...

随机推荐

  1. android .9文件的一点处理

    Android上面有很多平台,造成比较严重的碎片问题,适配比较困难,作为应用,一般都需要图文并茂,图片又是比较占资源的.面对缩放的问题,于是出来了矢量图片文件,作一点矢量处理,于是就是.9图片,IOS ...

  2. hdoj1325 Is It A Tree?

    Is It A Tree?题目链接 题意: 多组测试数据, 每组数据有多个数对, 表示一条有向边(即第一个数是第二个数的父节点), 以 0,0 为一组测试数据结束标志.当输入-1,-1时测试结束. 从 ...

  3. WCF学习系列一_创建第一个WCF服务

    原创作者:灰灰虫的家http://hi.baidu.com/grayworm WCF开发实战系列一:创建第一个WCF服务 在这个实战中我们将使用DataContract,ServiceContract ...

  4. 那天有个小孩跟我说LINQ(四)转载

    1  LINQ TO SQL(代码下载)       我们以一个酒店管理系统的数据库为例子         表结构很简单:GuestInfo(客人信息表),Room(房间表),RoomType(房间类 ...

  5. 最近整理的一些行列转换sql(有自己的,有别人的),留作记录

    --case when 经典用法SELECT * FROM        (SELECT 1 NUM,              '奖项金额',              SUM(CASE WHEN ...

  6. checkbox 选择一个checkbox,其他checkbox也会选择

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  7. 10.29_Extjs-lovcombo

    (1) Ext.ux.form.LovCombo多选下拉框 :http://www.iteye.com/topic/340900 (2)combox:icon,lovcombo:icon (3) (4 ...

  8. 在ARM Linux 使用 Valgrind

    Linux valgrind 移植到ARM-Linux  一.Cross-Compile/交叉编译 (1)下载及解压Valgrind-3.11 (2)修改confirure 将armv7*)修改为ar ...

  9. (zzuli)1907 小火山的宝藏收益

    Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏, ...

  10. 九度OJ 1076 N的阶乘 -- 大数运算

    题目地址:http://ac.jobdu.com/problem.php?pid=1076 题目描述: 输入一个正整数N,输出N的阶乘. 输入: 正整数N(0<=N<=1000) 输出: ...