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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

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

WHERE-1

验证:


(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

WHERE-2


(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)

WHERE-3


(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 ))WHERE-4

3. Item对象的继承关系图

3.1 Item_bool_func的继承关系图

classItem__bool__func__inherit__graph

3.2 完整Item对象继承关系图

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

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
存储 关系型数据库 MySQL
简述MySQL数据库中九种基本对象的定义
简述MySQL数据库中九种基本对象的定义。
77 0
|
8月前
|
JSON 关系型数据库 MySQL
mysql中保存并操作json对象
mysql中保存并操作json对象
|
8月前
|
SQL 关系型数据库 MySQL
MySQL数据库对象与数据备份和还原详解(下)
MySQL数据库对象与数据备份和还原详解(下)
41 0
|
8月前
|
存储 关系型数据库 MySQL
MySQL数据库对象与数据备份和还原详解(上)
MySQL数据库对象与数据备份和还原详解(上)
66 1
|
9月前
|
存储 JavaScript 前端开发
使用 Flask 的g对象和 MySQL 实现用户登录和注销功能
使用 Flask 的g对象和 MySQL 实现用户登录和注销功能
|
10月前
|
存储 关系型数据库 MySQL
MySQL数据库实验五 MySQL过程式数据库对象
MySQL数据库实验五 MySQL过程式数据库对象
95 0
|
11月前
|
存储 SQL Java
MySQL中的字段类型对应于Java对象中的数据类型
还在纠结javaType和jdbcType?MySQL数据类型对应Java什么类型?JdbcType类型和Java对象有什么对应关系?数据库类型的Integer是对应int还是对应Integer?本文带你一探究竟!
226 0
MySQL中的字段类型对应于Java对象中的数据类型
|
12月前
|
JSON 关系型数据库 MySQL
MySQL:json字段查询:数组、对象、成员检查
MySQL:json字段查询:数组、对象、成员检查
580 0
|
XML 关系型数据库 Linux
从小白到专家 PG技术大讲堂 - Part 2:PostgreSQL源代码安装
Part 2:PG源代码安装 步骤1 创建用户与环境配置 步骤2 系统内核参数配置 步骤3 PostgreSQL 安装
249 1
从小白到专家 PG技术大讲堂 - Part 2:PostgreSQL源代码安装
|
SQL canal JSON
Elastic实战:canal同步mysql到es之父子表数据同步|对象型数组同步|nested数组同步
最近在做mysql到es的数据同步,涉及到父子表数据同步,特此记录,以供后续参考
406 0
Elastic实战:canal同步mysql到es之父子表数据同步|对象型数组同步|nested数组同步