[BUGFIX]fix process lob default val

This commit is contained in:
obdev
2023-02-13 03:12:17 +00:00
committed by ob-robot
parent c485d8f458
commit 735665f131
4 changed files with 32 additions and 4 deletions

View File

@ -18,6 +18,7 @@
#include "sql/code_generator/ob_column_index_provider.h" #include "sql/code_generator/ob_column_index_provider.h"
#include "sql/engine/expr/ob_expr_util.h" #include "sql/engine/expr/ob_expr_util.h"
#include "sql/engine/expr/ob_expr_extra_info_factory.h" #include "sql/engine/expr/ob_expr_extra_info_factory.h"
#include "sql/engine/expr/ob_expr_lob_utils.h"
namespace oceanbase namespace oceanbase
{ {
@ -1065,7 +1066,11 @@ int ObStaticEngineExprCG::alloc_const_frame(const ObIArray<ObRawExpr *> &exprs,
if (0 == datum->len_) { if (0 == datum->len_) {
datum->ptr_ = NULL; datum->ptr_ = NULL;
} else { } else {
OB_ASSERT(rt_expr->obj_meta_.has_lob_header() == tmp_obj.has_lob_header()); if (is_lob_storage(tmp_obj.get_type())) {
if (OB_FAIL(ob_adjust_lob_datum(tmp_obj, rt_expr->obj_meta_, allocator_, datum))) {
LOG_WARN("fail to adjust lob datum", K(ret), K(tmp_obj), K(rt_expr->obj_meta_), K(datum));
}
}
} }
} }
} }

View File

@ -826,6 +826,16 @@ int ObPushdownFilterExecutor::init_filter_param(
} else if (!def_cell.is_nop_value()) { } else if (!def_cell.is_nop_value()) {
if (OB_FAIL(default_datum.from_obj(def_cell))) { if (OB_FAIL(default_datum.from_obj(def_cell))) {
LOG_WARN("convert obj to datum failed", K(ret), K(col_params_.count()), K(def_cell)); LOG_WARN("convert obj to datum failed", K(ret), K(col_params_.count()), K(def_cell));
} else {
// def value must have no lob header
// When do lob pushdown, should add lob header for default value
ObString data = default_datum.get_string();
ObString out;
if (OB_FAIL(ObLobManager::fill_lob_header(allocator_, data, out))) {
LOG_WARN("failed to fill lob header for column.", K(idx), K(def_cell), K(data));
} else {
default_datum.set_string(out);
}
} }
} }
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {

View File

@ -155,6 +155,14 @@ int ob_adjust_lob_datum(const ObObj &origin_obj,
const common::ObObjMeta &obj_meta, const common::ObObjMeta &obj_meta,
ObIAllocator &allocator, ObIAllocator &allocator,
ObDatum &out_datum) ObDatum &out_datum)
{
return ob_adjust_lob_datum(origin_obj, obj_meta, allocator, &out_datum);
}
int ob_adjust_lob_datum(const ObObj &origin_obj,
const common::ObObjMeta &obj_meta,
ObIAllocator &allocator,
ObDatum *out_datum)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (!is_lob_storage(origin_obj.get_type())) { // null & nop is not lob if (!is_lob_storage(origin_obj.get_type())) { // null & nop is not lob
@ -167,14 +175,14 @@ int ob_adjust_lob_datum(const ObObj &origin_obj,
if (OB_FAIL(ObTextStringHelper::read_real_string_data(&allocator, origin_obj, full_data))) { if (OB_FAIL(ObTextStringHelper::read_real_string_data(&allocator, origin_obj, full_data))) {
LOG_WARN("Lob: failed to get full data", K(ret)); LOG_WARN("Lob: failed to get full data", K(ret));
} else { } else {
out_datum.set_string(full_data); out_datum->set_string(full_data);
} }
} else { // origin obj does not have lob header, but meta has, build temp lob header } else { // origin obj does not have lob header, but meta has, build temp lob header
// OB_ASSERT(0); // should not come here? // use by not strict default value add lob header
ObObj out_obj(origin_obj); ObObj out_obj(origin_obj);
if (OB_FAIL(ObTextStringResult::ob_convert_obj_temporay_lob(out_obj, allocator))) { if (OB_FAIL(ObTextStringResult::ob_convert_obj_temporay_lob(out_obj, allocator))) {
LOG_WARN("Lob: failed to convert plain lob data to temp lob", K(ret)); LOG_WARN("Lob: failed to convert plain lob data to temp lob", K(ret));
} else if (OB_FAIL(out_datum.from_obj(out_obj))) { } else if (OB_FAIL(out_datum->from_obj(out_obj))) {
LOG_WARN("convert lob obj to datum failed", K(ret), K(out_obj)); LOG_WARN("convert lob obj to datum failed", K(ret), K(out_obj));
} }
} }

View File

@ -241,6 +241,11 @@ int ob_adjust_lob_datum(const ObObj &origin_obj,
ObIAllocator &allocator, ObIAllocator &allocator,
ObDatum &out_datum); ObDatum &out_datum);
int ob_adjust_lob_datum(const ObObj &origin_obj,
const common::ObObjMeta &obj_meta,
ObIAllocator &allocator,
ObDatum *out_datum);
int ob_adjust_lob_datum(ObDatum &datum, int ob_adjust_lob_datum(ObDatum &datum,
const common::ObObjMeta &in_obj_meta, const common::ObObjMeta &in_obj_meta,
const common::ObObjMeta &out_obj_meta, const common::ObObjMeta &out_obj_meta,