From 4999023461723f1b09b5fd1b9622df6473c65cfc Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 20 Sep 2024 07:13:10 +0000 Subject: [PATCH] [BUGFIX] read full vector in expr vector --- src/sql/engine/expr/ob_expr_vec_vector.cpp | 51 +++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/sql/engine/expr/ob_expr_vec_vector.cpp b/src/sql/engine/expr/ob_expr_vec_vector.cpp index 7a76b474e..266fd1070 100644 --- a/src/sql/engine/expr/ob_expr_vec_vector.cpp +++ b/src/sql/engine/expr/ob_expr_vec_vector.cpp @@ -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; }