return error when the decimal pricision is not match with datum len

This commit is contained in:
windye
2023-12-06 02:42:04 +00:00
committed by ob-robot
parent 7b8ff9b9db
commit cbc059fad1

View File

@ -107,11 +107,14 @@ int ObCSEncodingUtil::build_cs_column_encoding_ctx(ObEncodingHashTable *ht,
col_ctx.is_wide_int_ = false;
decint_cmp_fp cmp = wide::ObDecimalIntCmpSet::get_decint_decint_cmp_func(precision_bytes, sizeof(int64_t));
const int64_t row_count = ht->get_node_cnt();
for (int64_t i = 0; i < row_count; ++i) {
for (int64_t i = 0; OB_SUCC(ret) && i < row_count; ++i) {
const ObDatum &datum = *ht->get_node_list()[i].datum_;
if (!datum.is_null()) {
ob_assert(datum.len_ == precision_bytes);
if (cmp(datum.get_decimal_int(), (ObDecimalInt*)&int64_min) < 0 || cmp(datum.get_decimal_int(), (ObDecimalInt*)&int64_max) > 0) {
if (OB_UNLIKELY(datum.len_ != precision_bytes)) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("datum len is not match with precision bytes",
K(ret), K(datum), K(precision_bytes), K(i), K(row_count));
} else if (cmp(datum.get_decimal_int(), (ObDecimalInt*)&int64_min) < 0 || cmp(datum.get_decimal_int(), (ObDecimalInt*)&int64_max) > 0) {
col_ctx.is_wide_int_ = true;
break;
} else { // value range is not over int64_t, store as integer
@ -130,6 +133,8 @@ int ObCSEncodingUtil::build_cs_column_encoding_ctx(ObEncodingHashTable *ht,
}
}
}
if (OB_SUCC(ret)) {
col_ctx.integer_min_ = static_cast<uint64_t>(int_min);
col_ctx.integer_max_ = static_cast<uint64_t>(int_max);
@ -138,11 +143,11 @@ int ObCSEncodingUtil::build_cs_column_encoding_ctx(ObEncodingHashTable *ht,
FOREACH(l, *ht)
{
const int64_t len = l->header_->datum_->len_;
ob_assert(len == precision_bytes);
col_ctx.var_data_size_ += len * l->size_;
col_ctx.dict_var_data_size_ += len;
}
}
}
break;
}