[CP] [OBCDC] fix udt main column not found when xml column is fast deleted

This commit is contained in:
shadowao
2024-07-15 15:58:36 +00:00
committed by ob-robot
parent de0149c8c8
commit 8c6dda735b
4 changed files with 26 additions and 5 deletions

View File

@ -304,7 +304,6 @@ public:
OB_INLINE uint64_t get_udt_set_id() const { return udt_set_id_; }
OB_INLINE uint64_t get_sub_data_type() const { return sub_type_; }
OB_INLINE bool is_udt_column() const { return udt_set_id_ > 0 && OB_INVALID_ID != udt_set_id_; }
OB_INLINE bool is_udt_hidden_column() const { return is_udt_column() && is_hidden(); }
OB_INLINE bool is_xmltype() const {
return is_udt_column()
&& (((meta_type_.is_ext() || meta_type_.is_user_defined_sql_type()) && sub_type_ == T_OBJ_XML)

View File

@ -181,7 +181,7 @@ int MutatorRow::parse_columns_(
bool ignore_column = false;
if (OB_NOT_NULL(tb_schema_info)) {
// for normal column which is not belong to some udt, is_usr_column is true and is_udt_column is false
// for udt column
// for udt column that is not deleted
// if is main column of group, is_usr_column is true , is_udt_column is also true.
// if is hidden column of udt, is_usr_column is false, is_udt_column is true.
if (! (column_schema_info->is_usr_column() || column_schema_info->is_udt_column())) {
@ -190,6 +190,20 @@ int MutatorRow::parse_columns_(
K(tenant_id), K(table_id), K(column_stored_idx), K(is_parse_new_col), K(column_schema_info));
ignore_column = true;
// when udt is fast deleted, main column is marked as hidden and is_usr_column is false, but not real delete.
// so need ignore all column of udt when main column of udt is_usr_column is false
} else if (column_schema_info->is_udt_column()) {
ColumnSchemaInfo *udt_main_column_schema_info = nullptr;
if (OB_FAIL(tb_schema_info->get_main_column_of_udt(column_schema_info->get_udt_set_id(), udt_main_column_schema_info))) {
LOG_ERROR("get udt main column schema fail", KR(ret), K(tenant_id), K(table_id), K(column_stored_idx),
KPC(column_schema_info), KPC(tb_schema_info));
} else if (! udt_main_column_schema_info->is_usr_column()) {
ignore_column = true;
LOG_DEBUG("ignore udt column", K(tenant_id), K(table_id), K(column_stored_idx), KPC(column_schema_info));
} else {
ignore_column = false;
LOG_DEBUG("not ignore udt column", K(tenant_id), K(table_id), K(column_stored_idx), KPC(column_schema_info));
}
} else {
ignore_column = false;
}

View File

@ -878,7 +878,7 @@ int TableSchemaInfo::add_udt_column_(ColumnSchemaInfo *column_info)
// add
if (OB_SUCC(ret) && OB_NOT_NULL(udt_schema_info)) {
if (column_info->is_hidden()) {
if (! column_info->is_udt_main_column()) {
if (OB_FAIL(udt_schema_info->add_hidden_column(column_info))) {
LOG_ERROR("add hidden column info fail", KR(ret), K(column_info));
}
@ -938,6 +938,9 @@ int TableSchemaInfo::get_main_column_of_udt(
LOG_ERROR("get udt column schema fail", KR(ret), K(udt_set_id));
} else if (OB_FAIL(udt_schema_info->get_main_column(column_schema_info))) {
LOG_ERROR("get main column of udt fail", KR(ret), K(udt_set_id));
} else if (OB_ISNULL(column_schema_info)) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("main column is null", KR(ret), K(udt_set_id));
}
return ret;
}

View File

@ -116,8 +116,13 @@ public:
inline void set_sub_data_type(const uint64_t sub_data_type) { sub_type_ = sub_data_type; }
inline uint64_t get_sub_data_type() const { return sub_type_; }
inline bool is_udt_hidden_column() const { return is_udt_column() && is_hidden(); }
inline bool is_udt_main_column() const { return is_udt_column() && ! is_hidden(); }
// When fast column deletion occurs, the xml is marked as a hidden column instead of a true many deletion,
// and it is not possible to determine whether it is a udt main column based on is_hidden
// and currently, only xmltype is a udt type
// so it must be the udt main column when it is xmltype, whether it's a hidden column or not
// and there is no other udt type, so only need to determine whether it is a main column based on xmltype
inline bool is_udt_main_column() const { return is_xmltype(); }
inline bool is_xmltype() const {
return is_udt_column()
&& (((meta_type_.is_ext() || meta_type_.is_user_defined_sql_type()) && sub_type_ == T_OBJ_XML)