提交 b7aa3212 编写于 作者: O obdev 提交者: ob-robot

[BUGFIX] fix lob bugs

上级 c9177f74
......@@ -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 &param, 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 &param, 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_;
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册