前言
这里我们来探究一下 “select *” 或者 “select 字段列表“ 的相关实现
当然 这一部分在 “mysql union” 里面有具体的体现, 只是 可能没有那么细致
这里 来概览一下 这里的整个流程
select * from tz_test;
setup_wild 的地方是处理 “select *” 的地方
外层迭代的是 table 的所有的字段, 这里迭代的是 “id”, “field1”, “field2”
然后这里 evalutate 的貌似有点问题, 但是 实际是迭代了 这三个字段
select id, field1, field2, field1 from tz_test;
这部分的处理皮是在 setup_fields 中处理的, 然后 field_list 中即为 各个选择列
然后 在 Item_field.fix_fields 中是根据给定的 符号引用, 获取到真实的给定的 Table 的 Field 以及相关信息
比如, 这里拿到的是 id 对应的 Field, 这里是关联到 Item_field 的属性上面
select *, field1 from tz_test;
这个就是 上面两种情况的结合
“select *” 基于 setup_wild 来 apply 字段列表
“select 字段列表” 基于 setup_fields 来 apply 字段列表
“select *” 会选择 tz_test 表的 “id”, “field1”, “field2” 三个字段
“select field1” 会选择 tz_test 表的 “field1” 一个字段
数据从 rec 转换到 mysql_rec
这里的处理是将具体的 rec 中的给定的字段复制到 mysql_rec 中存储
这部分数据会存储到 table->record[0], 然后 后面用于 迭代输出
外层是遍历字段, 遍历完字段之后 需要的字段就已经转换到了 mysql_rec 中
mysql_rec 中的顺序和 select 中的顺序无关
rec 的数据部分结构如下
mysql_rec 的结构如下, prebuilt->mysql_template[i] 中存储的是响应的字段的元数据
字段列表的输出
遍历符合条件的记录列表, 然后 循环选择列 输出
其他的信息不多赘述, 其中 两个字段列 field1
完