0
点赞
收藏
分享

微信扫一扫

29 “select *“ 或者 “select field1, field2“ 的实现


前言

这里我们来探究一下 “select *” 或者 “select 字段列表“ 的相关实现 

当然 这一部分在 “mysql union” 里面有具体的体现, 只是 可能没有那么细致

这里 来概览一下 这里的整个流程

 

 

select * from tz_test;

setup_wild 的地方是处理 “select *” 的地方 

29 “select *“ 或者 “select field1, field2“ 的实现_字段

 

外层迭代的是 table 的所有的字段, 这里迭代的是 “id”, “field1”, “field2”

然后这里 evalutate 的貌似有点问题, 但是 实际是迭代了 这三个字段

29 “select *“ 或者 “select field1, field2“ 的实现_迭代_02

 

 

select id, field1, field2, field1 from tz_test; 

这部分的处理皮是在 setup_fields 中处理的, 然后 field_list 中即为 各个选择列

然后 在 Item_field.fix_fields 中是根据给定的 符号引用, 获取到真实的给定的 Table 的 Field 以及相关信息 

29 “select *“ 或者 “select field1, field2“ 的实现_mysql_03

 

比如, 这里拿到的是 id 对应的 Field, 这里是关联到 Item_field 的属性上面 

29 “select *“ 或者 “select field1, field2“ 的实现_字段_04

 

select *, field1 from tz_test;

这个就是 上面两种情况的结合

“select *” 基于 setup_wild 来 apply 字段列表 

“select 字段列表” 基于 setup_fields 来 apply 字段列表 

 

“select *” 会选择 tz_test 表的 “id”, “field1”, “field2” 三个字段 

29 “select *“ 或者 “select field1, field2“ 的实现_字段_05

 

 “select field1” 会选择 tz_test 表的 “field1” 一个字段 

29 “select *“ 或者 “select field1, field2“ 的实现_mysql_06

 

 

数据从 rec 转换到 mysql_rec

这里的处理是将具体的 rec 中的给定的字段复制到 mysql_rec 中存储 

这部分数据会存储到 table->record[0], 然后 后面用于 迭代输出

29 “select *“ 或者 “select field1, field2“ 的实现_astar_07

 

外层是遍历字段, 遍历完字段之后 需要的字段就已经转换到了 mysql_rec 中 

29 “select *“ 或者 “select field1, field2“ 的实现_mysql_08

 

mysql_rec 中的顺序和 select 中的顺序无关 

rec 的数据部分结构如下 

29 “select *“ 或者 “select field1, field2“ 的实现_astar_09

 

mysql_rec 的结构如下, prebuilt->mysql_template[i] 中存储的是响应的字段的元数据  

29 “select *“ 或者 “select field1, field2“ 的实现_字段_10

 

 

字段列表的输出

遍历符合条件的记录列表, 然后 循环选择列 输出

其他的信息不多赘述, 其中 两个字段列 field1

29 “select *“ 或者 “select field1, field2“ 的实现_astar_11

 

 

完 

 

 

 

举报

相关推荐

0 条评论