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类型数据的处理函数。
特别注意,本文中,说“定义时间和日期的处理函数”中的函数一词,除了有编程中的函数的含义外,更多的指得是“功能”,即数据库提供处理时间和日期的能力。其他类似。
mysql 函数在源码中的定义的更多相关文章
- MySQL 5.7 源码中的目录结构
MySQl Server的源码可以直接去Github浏览. 这里我们选择5.7版本的:https://github.com/mysql/mysql-server/tree/5.7 也可以通过: git ...
- 自定义函数hello,并注册到hive源码中并重新编译
1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...
- 在Android源码中查找Java代码中native函数对应的C++实现
Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码: static native Thread currentThread(); 如何根据方法名 ...
- Linux 中mysql安装(源码安装方式)
本文是介绍以源码安装的方式编译和安装Mysql 5.6(可以指定安装路径),也可以不采用源码安装方式,直接用安装包的方式. 源码安装方式慎用,容易报错. 1.卸载旧版本 rpm -qa | grep ...
- 从express源码中探析其路由机制
引言 在web开发中,一个简化的处理流程就是:客户端发起请求,然后服务端进行处理,最后返回相关数据.不管对于哪种语言哪种框架,除去细节的处理,简化后的模型都是一样的.客户端要发起请求,首先需要一个标识 ...
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...
- Jquery源码中的Javascript基础知识(三)
这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...
- Jquery源码中的Javascript基础知识(一)
jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...
- sleep函数——Gevent源码分析
gevent是一个异步I/O框架,当遇到I/O操作的时候,会自动切换任务,从而能异步地完成I/O操作 但是在测试的情况下,可以使用sleep函数来让gevent进行任务切换.示例如下: import ...
随机推荐
- SPRING IN ACTION 第4版笔记-第六章RENDERING WEB VIEWS-002- Spring的JSP标签之form标签(<sf:input><sf:errors><sf:form>)
一. Spring offers two JSP tag libraries to help define the view of your Spring MVC web views. One tag ...
- VCL+FMX 双剑合壁编程
VCL 是经典,FMX 是新生,新生事物总会带来一些好玩新奇的东西.舍弃经典是浪费,不了解新生事物是等死,那么我们来一个二合一双剑合壁又如何呢? 要双剑合壁,就得投些机,取些巧.由于 Delphi / ...
- 在Myeclipse buildpath 加server lib
把eclipse下的工程复制过来后,发现缺少Server Runtime.本想直接在buildpath里加lib,在Myeclipse里找了一圈,恁是没发现在哪里可以添加,虽然在preference里 ...
- bios作用
BOIS有四个作用: 一:POST 怎么讲呢? 也就是: Power On self rest ,检测主板各个设备,并sel error log. 二:计算机参数配置,也就是硬件和功能设置.例如内存啊 ...
- platform_driver与file_operations两种方法开发led驱动
下面是两个LED灯的驱动程序 一个用platform_driver 另一个用file_operations #include <linux/kernel.h> #include <l ...
- C#中的异常处理
C#中的异常处理 while (ex != null) { WriteExceptionLog(ex, fileName); ex = ex.InnerException; } /// <sum ...
- Java中的比较
Java SE.Java EE.Java ME区别 是什么: Java SE=Java Standard Edition=J2SE= Java标准版 Java EE=Java Enterprise E ...
- QNX环境
QNX开发环境和QNX虚拟机都搭建好了,开始写第一个QNX程序. 关于QNX程序开发的最好参考是QNX官网上的pdf书<10 Steps to Developing a QNX Program: ...
- eight - zoj 1217 poj 1077
学习了多位大牛的方法,看看到底能把时耗降到多少? A* // zojfulltest: 30000ms # include <stdio.h> # include <ctype.h& ...
- XmlNode中Value和InnerText的区别
XmlNode中Value和InnerText的区别 这个问题我想很多人在使用.NET 操作 Xml 文档时都遇到过,先看一下MSDN里对这两个属性的解释: XmlNode.Value:获取或设置 ...