以在columns中增加一列xxx_type为例
修改系统表定义
- sql/dd/impl/tables/columns.h里增加enum:FIELD_XXX_TYPE
- sql/dd/impl/tables/columns.cc里增加:
m_target_def.add_field(FIELD_XXX_TYPE,
"FIELD_XXX_TYPE",
"xxx_type BIGINT UNSIGNED");
修改存储和dd之间的存取接口和序列化反序列化协议
- sql/dd/impl/types/column_impl.h增加dd里的属性定义:
//XXX information blow enum class enum_xxx_type { INVALID = 0, XXX1, XXX2, XXX3, }; ulonglong m_xxx_type;
- sql/dd/impl/types/column_impl.cc修改构造函数、存取接口和协议,还要修改static_asset,否则编译过不去
//For XXX information blow
m_xxx_type = r.read_uint(Columns::FIELD_XXX_TYPE);
r->store(Columns::FIELD_XXX_TYPE, m_xxx_type);
......
修改升级协议
- sql/dd/impl/upgrade/dd.cc里修改columns的升级语句,以及static_assert:
+ /*
+ * Also need to store 0 for new column mysql.xxx_type.
+ * So dd::tables::Columns::NUMBER_OF_FIELDS is 32 + 1 = 33
+ * */
if (migrate_table(
"columns",
- "INSERT INTO columns SELECT *, NULL, NULL FROM mysql.columns")) {
+ "INSERT INTO columns SELECT *, NULL, NULL, 0 FROM mysql.columns")) {
重新init数据库
修改了系统表之后一定要重新init数据库,否则会core掉。重新init的时候要把mysqldata整个目录删掉。