return error when the decimal pricision is not match with datum len
This commit is contained in:
@ -107,11 +107,14 @@ int ObCSEncodingUtil::build_cs_column_encoding_ctx(ObEncodingHashTable *ht,
|
|||||||
col_ctx.is_wide_int_ = false;
|
col_ctx.is_wide_int_ = false;
|
||||||
decint_cmp_fp cmp = wide::ObDecimalIntCmpSet::get_decint_decint_cmp_func(precision_bytes, sizeof(int64_t));
|
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();
|
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_;
|
const ObDatum &datum = *ht->get_node_list()[i].datum_;
|
||||||
if (!datum.is_null()) {
|
if (!datum.is_null()) {
|
||||||
ob_assert(datum.len_ == precision_bytes);
|
if (OB_UNLIKELY(datum.len_ != precision_bytes)) {
|
||||||
if (cmp(datum.get_decimal_int(), (ObDecimalInt*)&int64_min) < 0 || cmp(datum.get_decimal_int(), (ObDecimalInt*)&int64_max) > 0) {
|
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;
|
col_ctx.is_wide_int_ = true;
|
||||||
break;
|
break;
|
||||||
} else { // value range is not over int64_t, store as integer
|
} 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_min_ = static_cast<uint64_t>(int_min);
|
||||||
col_ctx.integer_max_ = static_cast<uint64_t>(int_max);
|
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)
|
FOREACH(l, *ht)
|
||||||
{
|
{
|
||||||
const int64_t len = l->header_->datum_->len_;
|
const int64_t len = l->header_->datum_->len_;
|
||||||
ob_assert(len == precision_bytes);
|
|
||||||
col_ctx.var_data_size_ += len * l->size_;
|
col_ctx.var_data_size_ += len * l->size_;
|
||||||
col_ctx.dict_var_data_size_ += len;
|
col_ctx.dict_var_data_size_ += len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user