mysql 函数在源码中的定义

大牛那海蓝蓝

 

MySQL提供了较为丰富的SQL语句,用以支持MySQL提供的主要功能。在数据库内部,MySQL又是怎么知道自己能够处理哪些对象、处理哪些事情的?

如果我们输入一条SQL语句,MySQL可能报告语法错误或对象不存在等错误提示,这些提示,大致可以分为2类,一类是针对解析用户命令的如语法错误,一类是针对语义检查如说对象不存在的。其实还有其他类型如权限等检查,只是这些与本文无关,且简单故忽略莫执著于此处。

这2类错误提示,其实可以对应到MySQL的2个重要文件上,这是从源码的角度来看的。

首先,sql_yacc.yy文件,帮MySQL解决了怎么知道处理哪些事情。

其次,item.h这个文件,帮MySQL解决了怎么知道处理哪些对象。

本文从代码的角度,简单解析item.h这个文件。

 

一 从文件名看MySQL可以处理的对象

MySQL可以处理的各种对象、以及对象间的关系,可以从如下文件认识。

1 item.h: 总的对象定义类,定义了'Item'类作为总的对象类,此后,本文件中定义了许多子类,来丰富和发展MySQL可以处理的对象。但此类继承自'Parse_tree_node'类,使得对象和词法语法解析关联起来,这个不细述。

2 item_cmpfunc.h:定义了'Item_bool_func'类,继承自'Item_int_func'类,而Item_int_func继承自Item_func,Item_func类继承自Item类。'Item_bool_func'类主要用于支持比较操作,如等于、大于、小于、IN、BETWEEN、是否为NULL等。

3 item_create.h:用户自定义函数的创建接口。

4 item_func.h:定义了 Item_func类,继承自Item类,用以支持各种函数操作。如求绝对值、求长度、取余等等。本文件中也定义了许多子类,来丰富和发展MySQL可以处理的对象。

5 item_geofunc.h:空间对象处理相关函数。

6 item_inetfunc.h:定义IPv4、IP6的处理。

7 item_row.h:行值函数定义,用以支持类似如下操作:

(a, b, c) > (10, 10, 30)

(a, b, c) = (select c, d, e, from t1 where x=12)

(a, b, c) IN ((1,2,2), (3,4,5), (6,7,8)

(a, b, c) IN (select c, d, e, from t1)

8 item_strfunc.h:定义了字符类型的处理函数(主要是字符类型, 还有一些其他类型,如make_set函数的处理但返回值是字符类型)。如一些字符集相关的处理、去左空格、字符串替换等。

9 item_subselect.h:尽管子查询可以被优化,即需要对子查询内部的对象分解,但是,MySQL把子查询当作一个对象,相关辅助处理子查询的对象也在这个文件中定义。

10 item_sum.h:定义聚集函数的处理。包括MIN和MAX,但通常这2函数个是利用索引进行优化的。

11 item_timefunc.h:定义时间和日期的处理函数。

12 item_xmlfunc.h:定义XML类型数据的处理函数。

 

特别注意,本文中,说“定义时间和日期的处理函数”中的函数一词,除了有编程中的函数的含义外,更多的指得是“功能”,即数据库提供处理时间和日期的能力。其他类似。

posted @ 2016-07-04 17:05  zengkefu  阅读(1134)  评论(0编辑  收藏  举报