大牛那海蓝蓝
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类型数据的处理函数。
特别注意,本文中,说“定义时间和日期的处理函数”中的函数一词,除了有编程中的函数的含义外,更多的指得是“功能”,即数据库提供处理时间和日期的能力。其他类似。