[BUGFIX] fix lob bugs
This commit is contained in:
@ -1626,7 +1626,7 @@ static int common_copy_string_zf_to_text_result(const ObExpr &expr,
|
||||
} else {
|
||||
int64_t zf_len = out_len - src.length();
|
||||
if (0 < zf_len) {
|
||||
if (OB_FAIL(str_result.fill(0, 0, zf_len))) {
|
||||
if (OB_FAIL(str_result.fill(0, '0', zf_len))) {
|
||||
} else if (OB_FAIL(str_result.lseek(zf_len, 0))) {
|
||||
} else { /* do nothing */ };
|
||||
}
|
||||
|
||||
@ -2234,14 +2234,14 @@ int ObLobManager::write_outrow_inner(ObLobAccessParam& param, ObLobQueryIter *it
|
||||
} else {
|
||||
if (meta_iter.is_range_begin(result.meta_result_.info_)) {
|
||||
if (OB_FAIL(range_begin.deep_copy(*param.allocator_, result.meta_result_.info_))) {
|
||||
LOG_WARN("deep copy meta info failed", K(ret));
|
||||
LOG_WARN("deep copy meta info failed", K(ret), K(meta_iter));
|
||||
} else {
|
||||
found_begin = true;
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret) && meta_iter.is_range_end(result.meta_result_.info_)) {
|
||||
if (OB_FAIL(range_end.deep_copy(*param.allocator_, result.meta_result_.info_))) {
|
||||
LOG_WARN("deep copy meta info failed", K(ret));
|
||||
LOG_WARN("deep copy meta info failed", K(ret), K(meta_iter));
|
||||
} else {
|
||||
found_end = true;
|
||||
}
|
||||
@ -2310,9 +2310,11 @@ int ObLobManager::write_outrow_inner(ObLobAccessParam& param, ObLobQueryIter *it
|
||||
// prepare write iter
|
||||
ObLobMetaWriteIter write_iter(read_buf, param.allocator_, ObLobMetaUtil::LOB_OPER_PIECE_DATA_SIZE);
|
||||
if (OB_FAIL(write_iter.open(param, iter, read_buf, padding_size, post_data, remain_buf, seq_id_st, seq_id_ed))) {
|
||||
LOG_WARN("failed to open meta writer", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end));
|
||||
LOG_WARN("failed to open meta writer", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end),
|
||||
K(range_begin), K(range_end));
|
||||
} else if (OB_FAIL(write_outrow_result(param, write_iter))) {
|
||||
LOG_WARN("failed to write outrow result", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end));
|
||||
LOG_WARN("failed to write outrow result", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end),
|
||||
K(range_begin), K(range_end));
|
||||
}
|
||||
write_iter.close();
|
||||
}
|
||||
|
||||
@ -29,6 +29,7 @@ int ObLobMetaScanIter::open(ObLobAccessParam ¶m, ObILobApator* lob_adatper)
|
||||
lob_adatper_ = lob_adatper;
|
||||
param_ = param;
|
||||
cur_pos_ = 0;
|
||||
cur_byte_pos_ = 0;
|
||||
if (OB_FAIL(lob_adatper->scan_lob_meta(param, scan_param_, meta_iter_))) {
|
||||
LOG_WARN("failed to open iter", K(ret));
|
||||
}
|
||||
@ -36,7 +37,7 @@ int ObLobMetaScanIter::open(ObLobAccessParam ¶m, ObILobApator* lob_adatper)
|
||||
}
|
||||
|
||||
ObLobMetaScanIter::ObLobMetaScanIter()
|
||||
: lob_adatper_(nullptr), meta_iter_(nullptr), param_(), scan_param_(), cur_pos_(0) {}
|
||||
: lob_adatper_(nullptr), meta_iter_(nullptr), param_(), scan_param_(), cur_pos_(0), cur_byte_pos_(0) {}
|
||||
|
||||
int ObLobMetaScanIter::get_next_row(ObLobMetaInfo &row)
|
||||
{
|
||||
@ -44,9 +45,13 @@ int ObLobMetaScanIter::get_next_row(ObLobMetaInfo &row)
|
||||
if (OB_ISNULL(meta_iter_)) {
|
||||
ret = OB_ERR_NULL_VALUE;
|
||||
LOG_WARN("meta_iter is null.", K(ret));
|
||||
} else if (cur_byte_pos_ > param_.byte_size_) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("scan get lob meta byte len is bigger than byte size", K(ret), K(*this), K(param_));
|
||||
} else if (cur_byte_pos_ == param_.byte_size_) {
|
||||
ret = OB_ITER_END;
|
||||
} else {
|
||||
bool has_found = false;
|
||||
uint64_t old_cur_pos = cur_pos_;
|
||||
bool is_char = param_.coll_type_ != common::ObCollationType::CS_TYPE_BINARY;
|
||||
while (OB_SUCC(ret) && !has_found) {
|
||||
common::ObNewRow* new_row = NULL;
|
||||
@ -77,6 +82,7 @@ int ObLobMetaScanIter::get_next_row(ObLobMetaInfo &row)
|
||||
}
|
||||
// update sum(len)
|
||||
cur_pos_ += (is_char) ? row.char_len_ : row.byte_len_;
|
||||
cur_byte_pos_ += row.byte_len_;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -230,6 +236,7 @@ void ObLobMetaScanIter::reset()
|
||||
lob_adatper_ = nullptr;
|
||||
meta_iter_ = nullptr;
|
||||
cur_pos_ = 0;
|
||||
cur_byte_pos_ = 0;
|
||||
}
|
||||
|
||||
// called after
|
||||
|
||||
@ -63,12 +63,13 @@ public:
|
||||
int get_next_row(ObLobMetaInfo &row);
|
||||
int get_next_row(ObLobMetaScanResult &result);
|
||||
uint64_t get_cur_pos() { return cur_pos_; }
|
||||
uint64_t get_cur_byte_pos() { return cur_byte_pos_; }
|
||||
ObLobMetaInfo get_cur_info() { return cur_info_; }
|
||||
void reset();
|
||||
bool is_range_begin(const ObLobMetaInfo& info);
|
||||
bool is_range_end(const ObLobMetaInfo& info);
|
||||
bool is_range_over(const ObLobMetaInfo& info);
|
||||
TO_STRING_KV(K_(cur_pos), K_(cur_info));
|
||||
TO_STRING_KV(K_(cur_pos), K_(cur_byte_pos), K_(cur_info));
|
||||
private:
|
||||
bool is_in_range(const ObLobMetaInfo& info);
|
||||
private:
|
||||
@ -77,6 +78,7 @@ private:
|
||||
ObLobAccessParam param_;
|
||||
ObTableScanParam scan_param_;
|
||||
uint64_t cur_pos_;
|
||||
uint64_t cur_byte_pos_;
|
||||
ObLobMetaInfo cur_info_;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user