对于redundent类型,由于已经有了列个数信息,无需进行修改
数据词典信息
对数据词典进行了扩展并记录:
在第一次instant add column之前的列个数
每次加的列的默认值
通过这些信息加上记录上的额外信息,可以正确解析出记录上的数据
数据词典:
a) dd::Table::se_private_data::instant_col:在第一次instant ADD COLUMN之前表上面的列的个数b) dd::Partition::se_private_data::instant_col, 和a类似,存储分区表上instant col的个数,但有所不同的是,分区表上的分区之间可能存在不同列的个数。因为我们单独truncate一个分区,而truncate操作会清空instant标记,因此b)中存储的instant_col不应该比a)中每个分区上的instant_col要小 c) dd::Column::se_private_data::default_null, 表示默认值为NULLd) dd::Column::se_private_data::default, 当默认值不为null时,这里存储默认值DD_instant_col_val_coder--- column default value需要从innodb类型byte转换成se_private_data中的text类型(char), 使用一个类型DD_instant_col_val_coder来辅助转换
example: 0XFF => 0x0F, 0x0F
在将表load到内存建立表对象dict_table_t和索引对象dict_index_t时,有几个关键成员要载入进来,因为会用于辅助解析记录
dict_table_t::n_instant_cols 第一次instant add column之前的非虚拟列个数,(包含系统列dict_index_t::instant_cols flag用于标示是否存在Instant column
dict_index_t::n_instant_nullable: 第一次instant add column之前的可为null的列个数
dict_col_t::instant_default: 存储默认值及其长度, 当解析数据时看到Instant column, 会直接引用到这里的数据指针
载入逻辑: