前篇介绍了MySQL如何从SQL语句转换成一个内部对象。本文是前篇的延续,将更加详细的介绍WHERE语句对应的Item对象。

1. Item对象@MySQL Internal

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文档)。

参考

MySQL source code

MySQL Internal Manual

觉得文章有用?立即:

和朋友一起 共学习 共进步!

猜您喜欢

mysql item_MySQL源代码:关于MySQL的Item对象相关推荐

  1. Python基于mysql+Django框架图书管理系统源代码(含mysql文件)

    项目前台和后台界面模板都是自己编写,前台采用Bootstrap框架UI,后台EasyUI框架UI,没有采用Django自动生成的那个后台管理,因为那个后台实在是太丑了,丑得惨不忍睹!整个项目主要负责图 ...

  2. c# ef报错_C# EF调用MySql出现“未将对象引用设置到对象的实例”错误解决方案

    C# EF调用MySql出现"未将对象引用设置到对象的实例"错误解决方案---修改步骤---1.打开Nuget管理包,把Mysql.Data替换为6.10.0以下任意版本.这里选择 ...

  3. 从源码安装mysql_从源代码安装mysql

    一.下载的源代码版本是mysql-5.0.83 以下以root身份执行 二.添加用户和组 groupadd mysql useradd -d /home/mysql -g [mysql组的id] my ...

  4. scrapy链接mysql_Scrapy存入MySQL(四):scrapy item pipeline组件实现细节

    Scrapy存入MySQL或是其他数据库,虽然scrapy没有给我们提供拿来就用的类,但是她已经给我们实现了部分方法,我们继承它给我们实现的方法就能轻松的把数据存入你想存入的数据库,那我们要肿么继承呢 ...

  5. MySQL基础(二)【MySQL数据库对象与应用】

    2.1-MySQL数据类型 Number不止一种 ××× 浮点型 ××× INT SMALLINT MEDIUMINT BIGINT type Storage Minumun Value Maximu ...

  6. MySQL学习(二)【MySQL数据库对象与应用】

    2.1-MySQL数据类型 Number不止一种 整形 浮点型 整形 INT SMALLINT MEDIUMINT BIGINT type Storage Minumun Value Maximum ...

  7. mysql innodb源代码调试跟踪分析 何登成_Mysql+Innodb源代码调试跟踪分析+何登成_IT168文库...

    Mysql+Innodb源代码调试跟踪分析+何登成_IT168文库 Mysql Innodb源代码调试跟踪分析 何登成 1 2 3 4 5 6 7 8 9 10 10.1 10.2 10.3 10.4 ...

  8. mysql数据库在线查看器_mysqlshow(数据库对象查看工具)

    mysqlshow是mysql客户端对象查看工具,可以用来查看数据库.数据库中的表.表中的列.索引等. 1.mysqlshow命令的语法 shell > mysqlshow [options] ...

  9. MySQL存储过程详解 mysql 存储过程

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

最新文章

  1. Content-Type: application/vnd.ms-excel
  2. jquery 中attr和prop的区别
  3. 安卓用户又少了一项自由,Android 11不再支持更改默认相机程序
  4. stm32cubeide烧写程序_stm32mp157 Cortex M4开发篇:stm32CubeIDE开发环境搭建
  5. Linux基础命令---more
  6. 我的世界服务器怎么显示腐竹来了,我的世界腐竹开服必看manu权限组教程
  7. Java什么时候提高境界支持async/await写法啊?
  8. iOS 相册图片选择器
  9. 虚拟机中试用windows 8(视频)
  10. 微信小程序页面跳转时数据传输
  11. 监控摄像头接入GB28181平台实现监控视频直播的详细搭建流程
  12. 炒币机器人:炒币投资要大气
  13. 大学计算机课算绩点吗,大学体育成绩算入绩点吗?
  14. 基音检测算法的性能:Performance Evaluation of Pitch Detection Algorithms
  15. java读取word表格中的数据_JAVA获取word表格中数据的方案
  16. Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Compressed class space
  17. OpenSUSE 内核编译教程 (kernel 2.6.x)
  18. js中unload什么意思_javascript事件之卸载(unload)事件
  19. 亳州工业学校计算机,2018亳州市中专讲师助讲专业技术职务评审结果公示
  20. 【EXP】函数使用技巧

热门文章

  1. windows无法发现任何计算机或设备,Win10系统提示windows无法与设备或资源通信如何解决...
  2. 【转】使用Azure Rest API获得Access Token介绍
  3. ASP.Net请求处理机制初步探索之旅 - Part 3 管道
  4. C#多线程之旅(4)——APM初探
  5. Spark一些组件的定义
  6. 截屏当前界面_电脑屏幕怎么截取,常见的几种电脑截屏方法
  7. 【Python学习】 - 解决DataFrame占用内存过大问题
  8. 【CodeForces - 1197C】Array Splitting(水题)
  9. 【HDU - 1564 】Play a game (博弈问题,找规律,奇偶博弈)
  10. 机器学习笔记(十六):大规模机器学习