MySQL源代码:关于MySQL的Item对象

1. Item对象@MySQL Internal

(建议阅读:The Item Class@MySQL Internals Manual,忽略本小结)

MySQL Internals Manual较为详细的介绍了Item对象。Item对象经常被称作"thingamabob"( A thingamabob is a noun used to describe items that either you can't remember the name of or that don't actually exist.)。Item是一个类,每一个Item实例都:(1)代表一个SQL语句里的对象;(2)有取值;(3)有数据类型指针。

下面列出的的SQL相关的对象都是一个Item对象,或者继承至Item:(1)一段字符; (2)数据表的某列; (3)一个局部或全局变量; (4)一个存储过程的变量; (5) 一个用户参数; (6)一个函数/存储过程(这包括运算符+、||、=、like等) 。例如下面的SQL语句:

SELECT UPPER(column1) FROM t WHERE column2 = @x;

MySQL需要一系列的Item来描述上面的SQL:一个描述column1对象,描述UPPER函数的对象,还有描述WHERE语句的几个相关的Item对象。Item对象可以理解做一个特殊的数据对象。MySQL的Item对象定义在./sql/item.h中,其子类都定义在./sql/item*.h中,例如item_cmpfunc.h, item_func.h。在MySQL Server层代码中有大量操作和使用Item对象的代码,建议阅读的时候,慢慢理解。

2. WHERE对应的Item对象

本节将介绍MySQL中如何使用Item对象描述一个WHERE条件。下面从简单到复杂,逐个介绍:

2.1 WHERE id >= 1 and id < 3

2.2 WHERE id = 1 or id >10

2.3 WHERE id >= 0 and id < 2 or id = 20

验证:


(gdb) p ((Item_cond *)conds)->functype()
$5 = Item_func::COND_OR_FUNC

打印WHERE(也就是Item_cond_or) List中的第一个元素:

(gdb) p ((Item_cond *)(((Item_cond *)conds)->list->first->info))->functype()
$17 = Item_func::COND_AND_FUNC

第二个元素

(gdb) p ((Item_cond *)(((Item_cond *)conds)->list->first->next->info))->functype()
$18 = Item_func::EQ_FUNC

2.4 WHERE (id = 10 or ... ) and id >= 15

WHERE (id = 10 or id < 3 ) and id >= 15

(gdb) p ((Item_cond_or *)((Item_cond_and *)conds)->list->first->info)->list->first
$39 = (list_node *) 0x7facfc005698
(gdb) p ((Item_cond_or *)((Item_cond_and *)conds)->list->first->info)->list->first->info
$40 = (void *) 0x7facfc005150
(gdb) p (Item *)$40
$41 = (Item *) 0x7facfc005150
(gdb) p ((Item *)$40)->type()
$42 = Item::FUNC_ITEM
(gdb) p ((Item_func *)$40)->functype()
$43 = Item_func::EQ_FUNC
(gdb) p ((Item_func_eq *)$40)->arg_count
$44 = 2
(gdb) p ((Item_func_eq *)$40)->args[0]
$45 = (Item *) 0x7facfc004fe0

2.5 WHERE id >= 15 or (id > 1 and id < 10)

(gdb) p ((Item *)conds)->type()
$47 = Item::COND_ITEM
(gdb) p ((Item_cond *)conds)->functype()
$48 = Item_func::COND_OR_FUNC

(gdb) p ((Item_cond_or *)conds)->list->first->next->info
$56 = (void *) 0x7facfc0058b8
(gdb) p ((Item *)$56)->type()
$57 = Item::COND_ITEM
(gdb) p ((Item_cond *)$56)->functype()
$58 = Item_func::COND_AND_FUNC

2.6 WHERE id >= 15 or ( ... and ( ... or ... ))

WHERE id >= 15 or ( id > 1 and ( id < 4 or id = 0 ))

3. Item对象的继承关系图

3.1 Item_bool_func的继承关系图

3.2 完整Item对象继承关系图

完整的Item继承关系图非常复杂,下面是缩略图:(完整图,1.8MB,谨慎打开

这是一幅庞大关系图,使用doxygen+graphviz绘制(如何使用doxygen如何配置doxygen生成MySQL文档)。

时间: 2024-10-29 09:24:23

MySQL源代码:关于MySQL的Item对象的相关文章

MySQL源代码:从SQL语句到MySQL内部对象

0 写在前面 本文解决了什么问题:希望通过这些文章能够帮你更加顺畅的理解MySQL优化器的行为:在你阅读MySQL源代码之前了解更多的背后思路. 本文不解决什么问题:教你如何读懂源代码: 这个系列很长,大概按这样的思路进行下去: 基本的数据结构.语法解析.JOIN的主要算法.JOIN顺序和单表访问.数据结构(以及他们的关系)和算法流程总是相互穿插介绍. 建议阅读:参考文献中的文章和书籍,都建议在阅读本文之前阅读. 1 SQL语句解析基础 1.1 语法解析基础/Flex与Bison MySQL语法

MYSQL · 新特性 · MySQL 8.0对Parser所做的改进

背景介绍 众所周知,MySQL Parser是利用C/C++实现的开源yacc/lex组合,也就是 GNU bison/flex.Flex负责生成tokens, Bison负责语法解析.开始介绍MySQL 8.0的新特新之前,我们先简单了解一下通用的两种Parser.一种是Bottom-up parser,另外一种是Top-down parser. Bottom-up parser Bottom-up解析是从parse tree底层开始向上构造,然后将每个token移进(shift),进而规约(

不能通过mysql.sock连接MySQL问题的解决办法

    这个问题主要提示是,不能通过'/tmp/mysql.sock'连到服务器,而php标准配置正是用过'/tmp/mysql.sock',但是一些mysql安装方法将mysql.sock放在/var/lib/mysql.sock或者其他的什么地方,你可以通过修改/etc/my.cnf文件来修正它,打开文件,可以看到如下的东东: [mysqld] socket=/var/lib/mysql.sock 改一下就好了,但也会引起其他的问题,如mysql程序连不上了,再加一点: [mysql] so

使用MySQL Proxy解决MySQL主从同步延迟

  MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方 面开发带来了极大的便利.但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而且由于服务器负 载.网络拥堵等方面的原因,Master与Slave之间的数据同步延迟是完全没有保证的.短在1秒内,长则几秒.几十秒甚至更长都有可能. 由于数据延迟问题的存在,当应用程序在Master上进行数据更新,然后又立刻需要从数据库中读取数据时,这时候如果应用程序从Slave上取数据(这也

Mtop,Mysql Top,一个Mysql的监控工具

mtop 实时监控 MySQL Requires the following perl modules:       Module             Available At     ------------     --------------------------------------------------------     Curses              http://cpan.linuxforum.net/authors/id/G/GI/GIRAFFED     D

快速插表-MYSQL 如果提升 MYSQL 插入数据库表的速度

问题描述 MYSQL 如果提升 MYSQL 插入数据库表的速度 我在插入 MYSQL 数据库表时 800 多个表 插入时间大 45 秒钟 速度太慢了. 解决方案 你的意思是如何插入数据, 还是创建表?感觉意思不是很清楚 解决方案二: 不明白你要创建那么多表做什么如果你需要创建那么多表, 而且表的结构都是统一的, 不妨每天晚上创建好一万个备用表(有就不用, 不够了才加).在需要创建表时,把备用表改一下名就得.

mysql linux-linux上mysql可以正常启动,却打mysql提示错误进不去

问题描述 linux上mysql可以正常启动,却打mysql提示错误进不去 service mysqld start Starting mysqld: [ OK ] [root@chanct201 etc]# [root@chanct201 etc]# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '--default-character-set=utf8' (2) [root@chanc

【MySQL基础】MySQL安装第三弹-mariadb-10.2.8

MySQL安装第二弹-Percona5.7安装 一.操作系统选择 Centos/RHEL/ORACLE LIUNX 5.X/6.X/7.X x86_64 发行版 二.操作系统参数调整 2.1 selinux设置 [root@localhost ~]# cat /etc/selinux/config SELINUX=disabled #关闭selinux  2.2调整最大文件数限制 [root@localhost ~]# ulimit -a core file size (blocks, -c)

【MySQL基础】MySQL安装第一弹-MySQL5.7安装

MySQL安装第一弹-MySQL5.7安装 一.操作系统选择 Centos/RHEL/ORACLE LIUNX 5.X/6.X/7.X x86_64 发行版 如果是其他操作系统 则参考官方文档 https://www.mysql.com/support/supportedplatforms/database.html MySQL支持的平台 二.操作系统参数调整 2.1 selinux设置 [root@localhost ~]# cat /etc/selinux/config SELINUX=di