[bugfix] fix fix-length dict with element length larger than 64k

This commit is contained in:
saltonz
2022-11-09 11:35:54 +00:00
committed by wangzelin.wzl
parent 685fdbbffe
commit 21188a6f7c
3 changed files with 73 additions and 8 deletions

View File

@ -95,7 +95,7 @@ int ObDictEncoder::traverse(bool &suitable)
count_ = ht_->size();
const bool enable_bit_packing = ctx_->encoding_ctx_->encoder_opt_.enable_bit_packing_;
if (0 > dict_fix_data_size_) {
if (store_var_dict()) {
dict_index_byte_ = var_data_size_ <= UINT8_MAX ? 1 : 2;
if (OB_UNLIKELY(var_data_size_ > UINT16_MAX)) {
dict_index_byte_ = 4;
@ -183,7 +183,7 @@ int ObDictEncoder::store_meta(ObBufferWriter &buf_writer)
dict_meta_header_ = reinterpret_cast<ObDictMetaHeader *>(buf);
buf += sizeof(ObDictMetaHeader);
if (0 > dict_fix_data_size_) { // fill var dict data
if (store_var_dict()) { // fill var dict data
// var: the first var do not need index
const int64_t meta_size = sizeof(ObDictMetaHeader) +
(count_ - 1) * dict_index_byte_ + var_data_size_;

View File

@ -108,7 +108,7 @@ public:
inline int64_t calc_meta_size() const
{
int64_t size = sizeof(ObDictMetaHeader);
if (0 > dict_fix_data_size_) { // dict
if (store_var_dict()) { // dict
// we do not store the index for the first
// element, since it is always 0
size += dict_index_byte_ * (count_ - 1) + var_data_size_;
@ -127,6 +127,7 @@ private:
{
return sizeof(obj.nmb_desc_) + obj.nmb_desc_.len_ * sizeof(obj.v_.nmb_digits_[0]);
}
bool store_var_dict() const { return 0 > dict_fix_data_size_ || UINT16_MAX < dict_fix_data_size_; }
struct ColumnStoreFiller;
private: