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 ...
随机推荐
- Java多态的体现之继承
/** * * 功能:演示多态 */ package com.litao; public class Demo5 { public static void main(String[] args) { ...
- 将一个字符串映射为一个Delphi页面控件属性名(通过FindComponent和GetPropInfo找到这个控件指针)
uses TypInfo; function TForm1.SetControlProp(ComStr, value: string): boolean; var ComName, ComProp: ...
- 利用逻辑运算符?"三个数字比大小
static void Main(string[] args) { int a, b, c; while (true) ...
- 轻松搭建自己的Linux发行版本
许多人想要搭建自己的Linux发行版本,可能是觉得有趣,也可能是为了学习更多的Linux知识,或者因为他们有很正式的问题要解决.但是秘密是:自己搭建完美的发行版本不是很困难的一件事.事实上,我们收集了 ...
- dtree的使用
第一步:到官网下载下载dtree的相关包. 第二步:导入相关包 <link rel="StyleSheet" href="${ctx}/dtree/dtree. ...
- NEsper使用的事件类型 z
NEsper使用的事件类型来描述事件的类型信息.你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型. EPL中的create schema 的语法允许在运行 ...
- Oracle 12c创建用户时出现“ORA-65096: invalid common user or role name”的错误
这篇文章主要介绍CDB和PDB的基本管理,资料来源oracle官方. 基本概念: Multitenant Environment:多租户环境 CDB(Container Database):数据库容器 ...
- [codevs4247]奇特的生物
题目描述 Description 科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限.已知年龄为1岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具 ...
- LCD驱动(FrameBuffer)实例开发讲解
一.开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.背景知识 ...
- Storm系列(十)聚流示例
功能:将多个数据源的数据汇集到一个处理单元进行集中分类处理: 入口类TestMain 1 ; i < size; i++) { 31 content += input ...