您的位置:首页 > 博客中心 > 数据库 >

MySQL源码 解析器

时间:2022-03-10 17:12

  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. 语法解析部分:   根据词法分析器的分析后的结果,应用下面的语法规则    gxlsystem.com,布布扣   只有一个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

热门排行

今日推荐

热门手游