[BUGFIX] read full vector in expr vector

This commit is contained in:
obdev 2024-09-20 07:13:10 +00:00 committed by ob-robot
parent 824a5a85d4
commit 4999023461

View File

@ -90,8 +90,57 @@ int ObExprVecVector::cg_expr(
} else if (OB_ISNULL(datum)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get null datum", K(ret), KPC(raw_ctx.args_[0]));
} else {
} else if (datum->is_null()) {
expr_datum.set_null();
} else if (datum->get_string().length() == 0) {
expr_datum.set_string(datum->get_string());
} else {
// transform outrow vector into inrow vector
ObString vector = datum->get_string();
ObLobLocatorV2 lob(vector, raw_ctx.args_[0]->obj_meta_.has_lob_header());
if (lob.has_inrow_data()) {
// inrow lob do not need to build new result
expr_datum.set_string(datum->get_string());
} else {
ObEvalCtx::TempAllocGuard tmp_alloc_g(eval_ctx);
common::ObArenaAllocator &ctx_allocator = tmp_alloc_g.get_allocator();
ObLobAccessParam param;
ObLobManager* lob_mngr = MTL(ObLobManager*);
int64_t timeout = 0;
int64_t query_st = eval_ctx.exec_ctx_.get_my_session()->get_query_start_time();
if (OB_ISNULL(lob_mngr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get lob manager handle null.", K(ret));
} else if (OB_FAIL(eval_ctx.exec_ctx_.get_my_session()->get_query_timeout(timeout))) {
LOG_WARN("failed to get session query timeout", K(ret));
} else {
timeout += query_st;
param.tx_desc_ = eval_ctx.exec_ctx_.get_my_session()->get_tx_desc();
int64_t lob_len = 0;
ObString vector_buff;
char *vec_buff_ptr = nullptr;
int64_t buff_len = 0;
ObTextStringDatumResult text_result(ObLongTextType, &raw_ctx, &eval_ctx, &expr_datum);
if (OB_FAIL(lob.get_lob_data_byte_len(lob_len))) {
LOG_WARN("fail to get vector byte len", K(ret), K(lob));
} else if (OB_FAIL(text_result.init(lob_len, nullptr))) {
LOG_WARN("init lob result failed");
} else if (OB_FAIL(text_result.get_reserved_buffer(vec_buff_ptr, buff_len))) {
LOG_WARN("fail to get reserved buffer", K(ret));
} else if (FALSE_IT(vector_buff.assign_buffer(vec_buff_ptr, buff_len))) {
} else if (OB_FAIL(lob_mngr->build_lob_param(param, ctx_allocator, CS_TYPE_BINARY, 0, UINT64_MAX, timeout, lob))) {
LOG_WARN("fail to build lob param", K(ret));
} else if (OB_FAIL(lob_mngr->query(param, vector_buff))) {
LOG_WARN("fail to do query vector", K(ret));
} else if (OB_FAIL(text_result.lseek(vector_buff.length(), 0))) {
LOG_WARN("result lseek failed", K(ret));
} else {
ObString res_str;
text_result.get_result_buffer(res_str);
expr_datum.set_string(res_str);
}
}
}
}
return ret;
}