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类型数据的处理函数。

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

时间: 2024-11-05 07:36:18

mysql 函数在源码中的定义的相关文章

MySQL 5.7 源码中的目录结构

MySQl Server的源码可以直接去Github浏览. 这里我们选择5.7版本的:https://github.com/mysql/mysql-server/tree/5.7 也可以通过: git clone https://github.com/mysql/mysql-server.git 下载下来. 源码根目录中主要目录和文件的作用: BUILD:里面包含各个平台,各个编译器下进行编译的脚本: CMakeLists.txt:CMake入口编译文件: client:客户端工具,所有客户端工

C#中Stack<T>类的使用及部分成员函数的源码分析

Stack<T>类 Stack<T> 作为数组来实现. Stack<T> 的容量是 Stack<T> 可以包含的元素数. 当向 Stack<T> 中添加元素时,将通过重新分配内部数组来根据需要自动增大容量. 可通过调用 TrimExcess 来减少容量. 如果 Count 小于堆栈的容量,则 Push 的运算复杂度是 O(1). 如果需要增加容量以容纳新元素,则 Push 的运算复杂度成为 O(n),其中 n 为 Count. Pop 的运算复杂

从源码中浅析Android中如何利用attrs和styles定义控件

一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了textColor,它就能够改变这个TextView的文本的颜色.这是如何做到的呢?我们分3个部分来看这个问题1.attrs.xml  2.styles.xml  3.看组件的源码. 1.attrs.xml: 我们知道Android的源码中有attrs.xml这个文件,这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性 你可以找到attr

在Android源码中查找Java代码中native函数对应的C++实现

Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码: static native Thread currentThread(); 如何根据方法名找到其对应的C++实现,有两个方法. 先来个java代码的示例VMThread.java: package java.lang; class VMThread { Thread thread; int vmData; VMThread(Thread t) { thread = t; } native

OpenCV 源码中分水岭算法 watershed 函数源码注解

为了研究分水岭算法,阅读了OpenCV 2.4.9 中watershed函数的源码实现部分,代码位于 opencv\sources\modules\imgproc\src\segmentation.cpp 文件中.先贴出加了注解的代码,以后补充对分水岭算法的解释. #include "precomp.hpp" /******************************************************* Watershed **********************

Redis源码中探秘SHA-1算法原理及其编程实现

导读 SHA-1算法是第一代"安全散列算法"的缩写,其本质就是一个Hash算法.SHA系列标准主要用于数字签名,生成消息摘要,曾被认为是MD5算法的后继者.如今SHA家族已经出现了5个算法.Redis使用的是SHA-1,它能将一个最大2^64比特的消息,转换成一串160位的消息摘要,并能保证任何两组不同的消息产生的消息摘要是不同的.虽然SHA1于早年间也传出了破解之道,但作为SHA家族的第一代算法,对我们仍然很具有学习价值和指导意义. SHA-1算法的详细内容可以参考官方的RFC:ht

Android系统篇之----编写系统服务并且将其编译到系统源码中

在之前已经介绍了一篇关于如何编写简单的驱动以及访问该驱动的小程序,最后将程序编译到Android内核源码中通过程序访问驱动验证是可以通过的,那么本文就继续这个知识点,把这个驱动程序通过JNI连接创建一个系统服务,提供给上层应用访问改服务功能,可以看到前一篇介绍驱动程序的功能是属于内核层的,而本文介绍的内容是Framework层的知识. 声明:本文内容参考罗升阳的书籍:<Android系统源代码情景分析> 如果想了解更详细的内容非常建议购买此书 非常感谢罗神的这本书,给我带来很多未知的知识,大神

Android系统篇之—-编写系统服务并且将其编译到系统源码中【转】

本文转载自:http://www.wjdiankong.cn/android%E7%B3%BB%E7%BB%9F%E7%AF%87%E4%B9%8B-%E7%BC%96%E5%86%99%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1%E5%B9%B6%E4%B8%94%E5%B0%86%E5%85%B6%E7%BC%96%E8%AF%91%E5%88%B0%E7%B3%BB%E7%BB%9F%E6%BA%90%E7%A0%81/ 在之前已经介绍了一篇关于 如何编写简单的

从express源码中探析其路由机制

引言 在web开发中,一个简化的处理流程就是:客户端发起请求,然后服务端进行处理,最后返回相关数据.不管对于哪种语言哪种框架,除去细节的处理,简化后的模型都是一样的.客户端要发起请求,首先需要一个标识,通常情况下是URL,通过这个标识将请求发送给服务端的某个具体处理程序,在这个过程中,请求可能会经历一系列全局处理,比如验证.授权.URL解析等,然后定位到某个处理程序进行业务处理,最后将生成的数据返回客户端,客户端将数据结合视图模版呈现出合适的样式.这个过程涉及到的模块比较多,本文只探讨前半部分,