[BUGFIX]fix process lob default val
This commit is contained in:
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)) {
|
||||||
|
|||||||
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user