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

前篇介绍了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

daa62867098b900f96d8fd73e5a0eaf6.png

验证:

(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

aa6ab411b40b797fa081af6012bd9492.png

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

6d54d5eb9b5b27290373670249b5dead.png

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

5e95d25292db80dc8402d148cd41a24e.png

3. Item对象的继承关系图

3.1 Item_bool_func的继承关系图

89361e11bf3512a151204f4dc22c2ccc.png

3.2 完整Item对象继承关系图

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

classItem__inherit__graph-s.png

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

参考

MySQL source code

MySQL Internal Manual

觉得文章有用?立即:

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

猜您喜欢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值