Fix create unique index on newly added column failed

This commit is contained in:
Hongqin-Li 2024-06-17 13:06:16 +00:00 committed by ob-robot
parent 6987a0d672
commit 7223e9e121

View File

@ -97,9 +97,9 @@ int ObUniqueIndexChecker::calc_column_checksum(
const int64_t column_cnt = output_projector.count();
row_count = 0;
column_checksum.reuse();
if (OB_UNLIKELY(column_cnt <= 0)) {
if (OB_UNLIKELY(column_cnt <= 0 || column_cnt > need_reshape.count() || column_cnt > cols_desc.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "invalid arguments", K(ret), K(column_cnt));
STORAGE_LOG(WARN, "invalid arguments", K(ret), K(column_cnt), K(need_reshape), K(cols_desc));
} else if (OB_FAIL(column_checksum.reserve(column_cnt))) {
STORAGE_LOG(WARN, "fail to reserve column", K(ret), K(column_cnt));
} else {
@ -128,7 +128,11 @@ int ObUniqueIndexChecker::calc_column_checksum(
} else {
++row_count;
for (int64_t i = 0; OB_SUCC(ret) && i < column_cnt; ++i) {
column_checksum.at(i) += row->storage_datums_[i].checksum(0);
if (need_reshape.at(i) && OB_FAIL(ObDDLUtil::reshape_ddl_column_obj(row->storage_datums_[i], cols_desc.at(i).col_type_))) {
LOG_WARN("reshape ddl column obj failed", K(ret));
} else {
column_checksum.at(i) += row->storage_datums_[i].checksum(0);
}
}
if (OB_FAIL(dag_yield())) {
STORAGE_LOG(WARN, "fail to yield dag", KR(ret));
@ -200,7 +204,7 @@ int ObUniqueIndexChecker::scan_table_with_column_checksum(
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get column schema", K(ret), K(param), K(col_id));
} else {
const bool col_need_reshape = !param.is_scan_index_ && col->is_virtual_generated_column()
const bool col_need_reshape = !param.is_scan_index_ && (col->is_virtual_generated_column() || !col->get_orig_default_value().is_null())
&& col->get_meta_type().is_fixed_len_char_type();
if (OB_FAIL(need_reshape.push_back(col_need_reshape))) {
LOG_WARN("failed to push back is virtual col", K(ret));
@ -208,7 +212,7 @@ int ObUniqueIndexChecker::scan_table_with_column_checksum(
}
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(calc_column_checksum(need_reshape, *param.col_ids_, *param.output_projector_, local_scan, column_checksum, row_count))) {
} else if (OB_FAIL(calc_column_checksum(need_reshape, *param.org_col_ids_, *param.output_projector_, local_scan, column_checksum, row_count))) {
LOG_WARN("fail to calc column checksum", K(ret));
}
}