patch 4.0

This commit is contained in:
wangzelin.wzl
2022-10-24 10:34:53 +08:00
parent 4ad6e00ec3
commit 93a1074b0c
10533 changed files with 2588271 additions and 2299373 deletions

View File

@ -20,30 +20,34 @@
#include "sql/engine/ob_exec_context.h"
#include "sql/engine/expr/ob_iter_expr_range_param.h"
#include "sql/engine/px/ob_dfo.h"
namespace oceanbase {
namespace oceanbase
{
using namespace common;
using namespace share;
namespace sql {
namespace sql
{
OB_SERIALIZE_MEMBER(ObExprValuesInput, partition_id_values_);
class ObExprValues::ObExprValuesCtx : public ObPhyOperatorCtx {
class ObExprValues::ObExprValuesCtx : public ObPhyOperatorCtx
{
public:
explicit ObExprValuesCtx(ObExecContext& ctx)
: ObPhyOperatorCtx(ctx),
node_idx_(0),
iter_expr_ctx_(ctx, ctx.get_allocator()),
value_count_(0),
switch_value_(false)
{}
~ObExprValuesCtx()
{}
int get_value_count(ObExecContext& ctx, bool is_range_param, int64_t partition_id_values, int64_t origin_value_count,
int64_t col_num);
virtual void destroy()
explicit ObExprValuesCtx(ObExecContext &ctx)
: ObPhyOperatorCtx(ctx),
node_idx_(0),
iter_expr_ctx_(ctx, ctx.get_allocator()),
value_count_(0),
switch_value_(false)
{
ObPhyOperatorCtx::destroy_base();
}
~ObExprValuesCtx()
{
}
int get_value_count(ObExecContext &ctx,
bool is_range_param,
int64_t partition_id_values,
int64_t origin_value_count,
int64_t col_num);
virtual void destroy() { ObPhyOperatorCtx::destroy_base(); }
private:
int64_t node_idx_;
ObIterExprCtx iter_expr_ctx_;
@ -52,13 +56,16 @@ private:
friend class ObExprValues;
};
int ObExprValues::ObExprValuesCtx::get_value_count(
ObExecContext& ctx, bool is_range_param, int64_t partition_id_values, int64_t origin_value_count, int64_t col_num)
int ObExprValues::ObExprValuesCtx::get_value_count(ObExecContext &ctx,
bool is_range_param,
int64_t partition_id_values,
int64_t origin_value_count,
int64_t col_num)
{
int ret = OB_SUCCESS;
if (partition_id_values != 0) {
common::ObIArray<ObPxSqcMeta::PartitionIdValue>* pid_values =
reinterpret_cast<common::ObIArray<ObPxSqcMeta::PartitionIdValue>*>(partition_id_values);
if (partition_id_values!= 0) {
common::ObIArray<ObPxSqcMeta::PartitionIdValue> *pid_values =
reinterpret_cast<common::ObIArray<ObPxSqcMeta::PartitionIdValue> *>(partition_id_values);
int64_t partition_id = ctx.get_expr_partition_id();
bool find = false;
CK(partition_id != OB_INVALID_ID);
@ -69,7 +76,7 @@ int ObExprValues::ObExprValuesCtx::get_value_count(
if (partition_id == pid_values->at(i).partition_id_) {
node_idx_ = pid_values->at(i).value_begin_idx_ * col_num;
value_count_ = node_idx_ + pid_values->at(i).value_count_ * col_num;
if (OB_FAIL(value_count_ > origin_value_count)) {
if (value_count_ > origin_value_count) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected value count", K(ret), K(value_count_), K(origin_value_count));
}
@ -90,18 +97,23 @@ int ObExprValues::ObExprValuesCtx::get_value_count(
return ret;
}
ObExprValues::ObExprValues(ObIAllocator& alloc) : ObNoChildrenPhyOperator(alloc), values_(alloc), range_params_(alloc)
{}
ObExprValues::ObExprValues(ObIAllocator &alloc)
: ObNoChildrenPhyOperator(alloc),
values_(alloc),
range_params_(alloc)
{
}
ObExprValues::~ObExprValues()
{}
{
}
int ObExprValues::init_value_count(int64_t value_cnt)
{
return values_.init(value_cnt);
}
int ObExprValues::add_value(ObSqlExpression* value)
int ObExprValues::add_value(ObSqlExpression *value)
{
return values_.push_back(value);
}
@ -111,15 +123,15 @@ int ObExprValues::init_range_params(int64_t range_param_count)
return range_params_.init(range_param_count);
}
int ObExprValues::add_range_param(ObIterExprRangeParam* range_param_expr)
int ObExprValues::add_range_param(ObIterExprRangeParam *range_param_expr)
{
return range_params_.push_back(range_param_expr);
}
int ObExprValues::init_op_ctx(ObExecContext& ctx) const
int ObExprValues::init_op_ctx(ObExecContext &ctx) const
{
int ret = OB_SUCCESS;
ObExprValuesCtx* op_ctx = NULL;
ObExprValuesCtx *op_ctx = NULL;
if (OB_FAIL(CREATE_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, get_id(), get_type(), op_ctx))) {
LOG_WARN("create physical operator context failed", K(ret));
} else if (OB_ISNULL(op_ctx)) {
@ -133,10 +145,10 @@ int ObExprValues::init_op_ctx(ObExecContext& ctx) const
return ret;
}
int ObExprValues::inner_open(ObExecContext& ctx) const
int ObExprValues::inner_open(ObExecContext &ctx) const
{
int ret = OB_SUCCESS;
ObExprValuesCtx* values_ctx = NULL;
ObExprValuesCtx *values_ctx = NULL;
if (OB_FAIL(init_op_ctx(ctx))) {
LOG_WARN("init operator context failed", K(ret));
@ -151,15 +163,16 @@ int ObExprValues::inner_open(ObExecContext& ctx) const
return ret;
}
int ObExprValues::rescan(ObExecContext& ctx) const
int ObExprValues::rescan(ObExecContext &ctx) const
{
int ret = OB_SUCCESS;
ObExprValuesCtx* values_ctx = NULL;
ObExprValuesInput* op_input = GET_PHY_OP_INPUT(ObExprValuesInput, ctx, get_id());
ObExprValuesCtx *values_ctx = NULL;
ObExprValuesInput *op_input = GET_PHY_OP_INPUT(ObExprValuesInput, ctx, get_id());
if (OB_ISNULL(values_ctx = GET_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, get_id()))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("values_ctx is null");
} else if (OB_NOT_NULL(op_input) && 0 != op_input->partition_id_values_ && ctx.is_gi_restart()) {
} else if (OB_NOT_NULL(op_input) &&
0 != op_input->partition_id_values_ && ctx.is_gi_restart()) {
values_ctx->switch_value_ = true;
} else {
values_ctx->node_idx_ = 0;
@ -168,11 +181,11 @@ int ObExprValues::rescan(ObExecContext& ctx) const
return ret;
}
int ObExprValues::switch_iterator(ObExecContext& ctx) const
int ObExprValues::switch_iterator(ObExecContext &ctx) const
{
int ret = OB_SUCCESS;
ObExprValuesCtx* values_ctx = NULL;
ObPhysicalPlanCtx* plan_ctx = NULL;
ObExprValuesCtx *values_ctx = NULL;
ObPhysicalPlanCtx *plan_ctx = NULL;
if (OB_ISNULL(values_ctx = GET_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, get_id()))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("values_ctx is null");
@ -190,25 +203,26 @@ int ObExprValues::switch_iterator(ObExecContext& ctx) const
return ret;
}
int ObExprValues::inner_close(ObExecContext& ctx) const
int ObExprValues::inner_close(ObExecContext &ctx) const
{
int ret = OB_SUCCESS;
ObExprValuesCtx* values_ctx = NULL;
ObExprValuesCtx *values_ctx = NULL;
if (OB_ISNULL(values_ctx = GET_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, get_id()))) {
LOG_DEBUG("The operator has not been opened.", K(ret), K_(id), "op_type", ob_phy_operator_type_str(get_type()));
LOG_DEBUG("The operator has not been opened.", K(ret), K_(id), "op_type",
ob_phy_operator_type_str(get_type()));
} else {
values_ctx->node_idx_ = 0;
}
return ret;
}
int ObExprValues::inner_get_next_row(ObExecContext& ctx, const ObNewRow*& row) const
int ObExprValues::inner_get_next_row(ObExecContext &ctx, const ObNewRow *&row) const
{
int ret = OB_SUCCESS;
NG_TRACE_TIMES(2, value_start_next_row);
ObPhysicalPlanCtx* plan_ctx = GET_PHY_PLAN_CTX(ctx);
ObExprValuesCtx* values_ctx = GET_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, id_);
ObExprValuesInput* op_input = GET_PHY_OP_INPUT(ObExprValuesInput, ctx, get_id());
ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx);
ObExprValuesCtx *values_ctx = GET_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, id_);
ObExprValuesInput *op_input = GET_PHY_OP_INPUT(ObExprValuesInput, ctx, get_id());
// reset temp auto-increment value before calculate a row
#if !defined(NDEBUG)
if (OB_ISNULL(plan_ctx)) {
@ -223,16 +237,15 @@ int ObExprValues::inner_get_next_row(ObExecContext& ctx, const ObNewRow*& row) c
plan_ctx->set_autoinc_id_tmp(0);
if (get_rows() > 10) {
if (OB_FAIL(THIS_WORKER.check_status())) {
LOG_WARN("check physical plan status failed", K(ret));
LOG_WARN("check physical plan status faild", K(ret));
}
}
}
if (OB_SUCC(ret) && OB_NOT_NULL(op_input)) {
if (values_ctx->switch_value_ && OB_FAIL(values_ctx->get_value_count(ctx,
!range_params_.empty(),
op_input->partition_id_values_,
range_params_.empty() ? values_.count() : range_params_.count(),
get_column_count()))) {
if (values_ctx->switch_value_ && OB_FAIL(values_ctx->get_value_count(
ctx, !range_params_.empty(), op_input->partition_id_values_,
range_params_.empty() ? values_.count() : range_params_.count(),
get_column_count()))) {
LOG_WARN("fail to get value count", K(ret));
}
}
@ -255,45 +268,49 @@ int ObExprValues::inner_get_next_row(ObExecContext& ctx, const ObNewRow*& row) c
return ret;
}
OB_INLINE int ObExprValues::calc_next_row_by_range_param(ObExprValuesCtx& values_ctx, const ObNewRow*& row) const
OB_INLINE int ObExprValues::calc_next_row_by_range_param(ObExprValuesCtx &values_ctx,
const ObNewRow *&row) const
{
int ret = OB_SUCCESS;
ObIterExprRangeParam* iter_range_param = NULL;
if (OB_UNLIKELY(values_ctx.node_idx_ >= values_ctx.value_count_)) {
ret = OB_ITER_END;
LOG_DEBUG("get next row from values iterator end", K(ret), K(values_ctx.node_idx_), K(range_params_.count()));
} else if (OB_ISNULL(iter_range_param = range_params_.at(values_ctx.node_idx_++))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("iter range param is null", K(ret), K(values_ctx.node_idx_), K(range_params_));
} else if (OB_FAIL(iter_range_param->get_next_row(values_ctx.iter_expr_ctx_, row))) {
LOG_WARN("get next row from range params failed", K(ret), KPC(iter_range_param));
} else {
ObIterExprRangeParam *iter_range_param = NULL;
if (OB_UNLIKELY(values_ctx.node_idx_ >= values_ctx.value_count_)) {
ret = OB_ITER_END;
LOG_DEBUG("get next row from values iterator end",
K(ret), K(values_ctx.node_idx_), K(range_params_.count()));
} else if (OB_ISNULL(iter_range_param = range_params_.at(values_ctx.node_idx_++))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("iter range param is null", K(ret), K(values_ctx.node_idx_), K(range_params_));
} else if (OB_FAIL(iter_range_param->get_next_row(values_ctx.iter_expr_ctx_, row))) {
LOG_WARN("get next row from range params failed", K(ret), KPC(iter_range_param));
} else {
LOG_DEBUG("calc next row by range param", KPC(row), KPC(iter_range_param));
}
return ret;
}
OB_INLINE int ObExprValues::calc_next_row(ObExecContext& ctx) const
OB_INLINE int ObExprValues::calc_next_row(ObExecContext &ctx) const
{
int ret = OB_SUCCESS;
ObExprValuesCtx* value_ctx = GET_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, id_);
ObSQLSessionInfo* session = ctx.get_my_session();
ObExprValuesCtx *value_ctx = GET_PHY_OPERATOR_CTX(ObExprValuesCtx, ctx, id_);
ObSQLSessionInfo *session = ctx.get_my_session();
int64_t col_num = get_column_count();
int64_t col_index = 0;
NG_TRACE_TIMES(2, value_start_calc_row);
#if !defined(NDEBUG)
if (OB_UNLIKELY(get_size() <= 0 || get_column_count() <= 0 || get_size() % get_column_count() != 0 ||
OB_ISNULL(my_phy_plan_))) {
if (OB_UNLIKELY(get_size() <= 0
|| get_column_count() <= 0
|| get_size() % get_column_count() != 0
|| OB_ISNULL(my_phy_plan_))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("expr values status is unexpected", K(values_), K(get_column_count()), K_(my_phy_plan));
} else if (OB_ISNULL(value_ctx)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("value_ctx is null");
}
#endif //! NDEBUG
#endif //!NDEBUG
if (OB_SUCC(ret)) {
ObExprCtx& expr_ctx = value_ctx->expr_ctx_;
ObNewRow& cur_row = value_ctx->get_cur_row();
ObExprCtx &expr_ctx = value_ctx->expr_ctx_;
ObNewRow &cur_row = value_ctx->get_cur_row();
if (OB_UNLIKELY(value_ctx->node_idx_ == value_ctx->value_count_)) {
// there is no values any more
ret = OB_ITER_END;
@ -306,12 +323,14 @@ OB_INLINE int ObExprValues::calc_next_row(ObExecContext& ctx) const
if (OB_ISNULL(values_.at(value_ctx->node_idx_))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("value exprs is null", K(values_.at(value_ctx->node_idx_)));
} else if (OB_FAIL(values_.at(value_ctx->node_idx_)->calc(expr_ctx, cur_row, cur_row.cells_[col_index]))) {
} else if (OB_FAIL(values_.at(value_ctx->node_idx_)->calc(expr_ctx,
cur_row,
cur_row.cells_[col_index]))) {
LOG_WARN("failed to calc expr", K(ret));
} else {
++value_ctx->node_idx_;
if (col_index == col_num - 1) {
// last cell values resolved, output row now
//last cell values resolved, output row now
is_break = true;
} else {
col_index = (col_index + 1) % col_num;
@ -324,26 +343,29 @@ OB_INLINE int ObExprValues::calc_next_row(ObExecContext& ctx) const
return ret;
}
int ObExprValues::create_operator_input(ObExecContext& ctx) const
int ObExprValues::create_operator_input(ObExecContext &ctx) const
{
int ret = OB_SUCCESS;
ObIPhyOperatorInput* input = NULL;
if (OB_FAIL(CREATE_PHY_OP_INPUT(ObExprValuesInput, ctx, get_id(), get_type(), input))) {
ObIPhyOperatorInput *input = NULL;
if (OB_FAIL(CREATE_PHY_OP_INPUT(ObExprValuesInput,
ctx,
get_id(),
get_type(),
input))) {
LOG_WARN("failed to create phy op input.", K(ret));
} else { /*do nothing.*/
}
} else { /*do nothing.*/ }
UNUSED(input);
return ret;
}
int64_t ObExprValues::to_string_kv(char* buf, const int64_t buf_len) const
int64_t ObExprValues::to_string_kv(char *buf, const int64_t buf_len) const
{
int64_t pos = 0;
J_KV(K_(values));
return pos;
}
int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSeriCtx& seri_ctx) const
int ObExprValues::serialize(char *buf, int64_t buf_len, int64_t &pos, ObPhyOpSeriCtx &seri_ctx) const
{
int ret = OB_SUCCESS;
int64_t len = get_serialize_size_(seri_ctx);
@ -351,14 +373,15 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
bool use_range_param = !range_params_.empty();
int64_t range_param_count = 0;
int64_t col_num = get_column_count();
const ObIArray<int64_t>* row_id_list = static_cast<const ObIArray<int64_t>*>(seri_ctx.row_id_list_);
const ObIArray<int64_t> *row_id_list = static_cast<const ObIArray<int64_t> *>(seri_ctx.row_id_list_);
if (OB_SUCC(ret)) {
if (use_range_param) {
value_count = 0;
if (row_id_list != NULL) {
range_param_count = row_id_list->count();
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
range_param_count = seri_ctx.exec_ctx_->get_row_id_list_total_count();
} else {
range_param_count = range_params_.count();
@ -367,7 +390,8 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
range_param_count = 0;
if (row_id_list != NULL) {
value_count = col_num * row_id_list->count();
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
value_count = seri_ctx.exec_ctx_->get_row_id_list_total_count() * col_num;
} else {
value_count = values_.count();
@ -379,8 +403,7 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
OB_UNIS_ENCODE(value_count);
if (OB_SUCC(ret) && !use_range_param) {
if (row_id_list != NULL) {
ARRAY_FOREACH(*row_id_list, idx)
{
ARRAY_FOREACH(*row_id_list, idx) {
int64_t start_idx = row_id_list->at(idx) * col_num;
int64_t end_idx = start_idx + col_num;
for (int64_t i = start_idx; OB_SUCC(ret) && i < end_idx; ++i) {
@ -392,16 +415,17 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
}
}
}
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
const ObIArray<int64_t>* new_row_id_list = NULL;
for (int array_idx = 0; OB_SUCC(ret) && array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count();
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
const ObIArray<int64_t> *new_row_id_list = NULL;
for (int array_idx = 0; OB_SUCC(ret) &&
array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count();
++array_idx) {
if (OB_ISNULL(new_row_id_list = seri_ctx.exec_ctx_->get_row_id_list_array().at(array_idx))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("row id list is null", K(ret));
} else {
ARRAY_FOREACH(*new_row_id_list, idx)
{
ARRAY_FOREACH(*new_row_id_list, idx) {
int64_t start_idx = new_row_id_list->at(idx) * col_num;
int64_t end_idx = start_idx + col_num;
for (int64_t i = start_idx; OB_SUCC(ret) && i < end_idx; ++i) {
@ -416,8 +440,7 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
}
}
} else {
ARRAY_FOREACH(values_, i)
{
ARRAY_FOREACH(values_, i) {
if (OB_ISNULL(values_.at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("expr node is null");
@ -435,8 +458,7 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
OB_UNIS_ENCODE(range_param_count);
if (OB_SUCC(ret) && use_range_param) {
if (row_id_list != NULL) {
ARRAY_FOREACH(*row_id_list, idx)
{
ARRAY_FOREACH(*row_id_list, idx) {
int64_t row_index = row_id_list->at(idx);
if (OB_ISNULL(range_params_.at(row_index))) {
ret = OB_ERR_UNEXPECTED;
@ -445,16 +467,17 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
LOG_WARN("serialize range params failed", K(ret), K(row_index));
}
}
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
const ObIArray<int64_t>* new_row_id_list = NULL;
for (int array_idx = 0; OB_SUCC(ret) && array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count();
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
const ObIArray<int64_t> *new_row_id_list = NULL;
for (int array_idx = 0; OB_SUCC(ret) &&
array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count();
++array_idx) {
if (OB_ISNULL(new_row_id_list = seri_ctx.exec_ctx_->get_row_id_list_array().at(array_idx))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("row id list is null", K(ret));
} else {
ARRAY_FOREACH(*new_row_id_list, idx)
{
ARRAY_FOREACH(*new_row_id_list, idx) {
int64_t row_index = new_row_id_list->at(idx);
if (OB_ISNULL(range_params_.at(row_index))) {
ret = OB_ERR_UNEXPECTED;
@ -466,8 +489,7 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
}
}
} else {
ARRAY_FOREACH(range_params_, i)
{
ARRAY_FOREACH(range_params_, i) {
if (OB_ISNULL(range_params_.at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("range param node is null");
@ -480,7 +502,7 @@ int ObExprValues::serialize(char* buf, int64_t buf_len, int64_t& pos, ObPhyOpSer
return ret;
}
int64_t ObExprValues::get_serialize_size(const ObPhyOpSeriCtx& seri_ctx) const
int64_t ObExprValues::get_serialize_size(const ObPhyOpSeriCtx &seri_ctx) const
{
int64_t len = get_serialize_size_(seri_ctx);
OB_UNIS_ADD_LEN(len);
@ -493,7 +515,7 @@ OB_DEF_DESERIALIZE(ObExprValues)
int ret = OB_SUCCESS;
int32_t value_size = 0;
int64_t range_param_count = 0;
ObSqlExpression* expr = NULL;
ObSqlExpression *expr = NULL;
ObExprOperatorFactory expr_factory(my_phy_plan_->get_allocator());
if (OB_ISNULL(my_phy_plan_)) {
ret = OB_NOT_INIT;
@ -527,7 +549,7 @@ OB_DEF_DESERIALIZE(ObExprValues)
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < range_param_count; ++i) {
ObIterExprRangeParam* range_param_expr = NULL;
ObIterExprRangeParam *range_param_expr = NULL;
if (OB_FAIL(expr_factory.alloc(T_OP_RANGE_PARAM, range_param_expr))) {
LOG_WARN("allocate range param expr failed", K(ret));
} else if (OB_FAIL(range_param_expr->deserialize(buf, data_len, pos))) {
@ -539,19 +561,20 @@ OB_DEF_DESERIALIZE(ObExprValues)
return ret;
}
int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx& seri_ctx) const
int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx &seri_ctx) const
{
int64_t len = 0;
int64_t value_count = 0;
bool use_range_param = !range_params_.empty();
int64_t range_param_count = 0;
int64_t col_num = get_column_count();
const ObIArray<int64_t>* row_id_list = static_cast<const ObIArray<int64_t>*>(seri_ctx.row_id_list_);
const ObIArray<int64_t> *row_id_list = static_cast<const ObIArray<int64_t> *>(seri_ctx.row_id_list_);
if (use_range_param) {
value_count = 0;
if (row_id_list != NULL) {
range_param_count = row_id_list->count();
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
range_param_count = seri_ctx.exec_ctx_->get_row_id_list_total_count();
} else {
range_param_count = range_params_.count();
@ -560,7 +583,8 @@ int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx& seri_ctx) const
range_param_count = 0;
if (row_id_list != NULL) {
value_count = col_num * row_id_list->count();
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
value_count = seri_ctx.exec_ctx_->get_row_id_list_total_count() * col_num;
} else {
value_count = values_.count();
@ -569,8 +593,7 @@ int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx& seri_ctx) const
if (!use_range_param) {
if (row_id_list != NULL) {
OB_UNIS_ADD_LEN(value_count);
ARRAY_FOREACH_NORET(*row_id_list, idx)
{
ARRAY_FOREACH_NORET(*row_id_list, idx) {
int64_t start_idx = row_id_list->at(idx) * col_num;
int64_t end_idx = start_idx + col_num;
for (int64_t i = start_idx; i < end_idx; ++i) {
@ -579,11 +602,14 @@ int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx& seri_ctx) const
}
}
}
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
int64_t real_value_count = 0;
len += serialization::encoded_length_i64(real_value_count);
const ObIArray<int64_t>* new_row_id_list = NULL;
for (int array_idx = 0; array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count(); ++array_idx) {
const ObIArray<int64_t> *new_row_id_list = NULL;
for (int array_idx = 0;
array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count();
++array_idx) {
if (OB_ISNULL(new_row_id_list = seri_ctx.exec_ctx_->get_row_id_list_array().at(array_idx))) {
LOG_WARN("row id list is null");
} else {
@ -598,8 +624,7 @@ int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx& seri_ctx) const
}
} else {
OB_UNIS_ADD_LEN(value_count);
ARRAY_FOREACH_NORET(values_, i)
{
ARRAY_FOREACH_NORET(values_, i) {
if (OB_NOT_NULL(values_.at(i))) {
OB_UNIS_ADD_LEN(*values_.at(i));
}
@ -612,21 +637,22 @@ int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx& seri_ctx) const
OB_UNIS_ADD_LEN(range_param_count);
if (use_range_param) {
if (row_id_list != NULL) {
ARRAY_FOREACH_NORET(*row_id_list, idx)
{
ARRAY_FOREACH_NORET(*row_id_list, idx) {
int64_t row_index = row_id_list->at(idx);
if (OB_NOT_NULL(range_params_.at(row_index))) {
OB_UNIS_ADD_LEN(*range_params_.at(row_index));
}
}
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) && !seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
const ObIArray<int64_t>* new_row_id_list = NULL;
for (int array_idx = 0; array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count(); ++array_idx) {
} else if (OB_NOT_NULL(seri_ctx.exec_ctx_) &&
!seri_ctx.exec_ctx_->get_row_id_list_array().empty()) {
const ObIArray<int64_t> *new_row_id_list = NULL;
for (int array_idx = 0;
array_idx < seri_ctx.exec_ctx_->get_row_id_list_array().count();
++array_idx) {
if (OB_ISNULL(new_row_id_list = seri_ctx.exec_ctx_->get_row_id_list_array().at(array_idx))) {
LOG_WARN("row id list is null");
} else {
ARRAY_FOREACH_NORET(*new_row_id_list, idx)
{
ARRAY_FOREACH_NORET(*new_row_id_list, idx) {
int64_t row_index = new_row_id_list->at(idx);
if (OB_ISNULL(range_params_.at(row_index))) {
LOG_WARN("range params is invalid", K(row_index));
@ -637,8 +663,7 @@ int64_t ObExprValues::get_serialize_size_(const ObPhyOpSeriCtx& seri_ctx) const
}
}
} else {
ARRAY_FOREACH_NORET(range_params_, i)
{
ARRAY_FOREACH_NORET(range_params_, i) {
if (OB_NOT_NULL(range_params_.at(i))) {
OB_UNIS_ADD_LEN(*range_params_.at(i));
}