[FEAT MERGE]优化器技改patch到432

Co-authored-by: jingtaoye35 <1255153887@qq.com>
Co-authored-by: qingzhu521 <q15000557748@gmail.com>
Co-authored-by: akaError <lzg020616@163.com>
This commit is contained in:
zzg19950727
2024-06-18 02:23:55 +00:00
committed by ob-robot
parent 4d5b5ec653
commit b81b1efd98
117 changed files with 6600 additions and 948 deletions

View File

@ -157,6 +157,8 @@
#ifdef OB_BUILD_TDE_SECURITY
#include "share/ob_master_key_getter.h"
#endif
#include "sql/optimizer/ob_log_values_table_access.h"
#include "sql/engine/basic/ob_values_table_access_op.h"
namespace oceanbase
{
@ -2553,6 +2555,81 @@ int ObStaticEngineCG::generate_spec(ObLogExprValues &op,
return ret;
}
int ObStaticEngineCG::generate_spec(ObLogValuesTableAccess &op,
ObValuesTableAccessSpec &spec,
const bool in_root_job)
{
int ret = OB_SUCCESS;
UNUSED(in_root_job);
const ObValuesTableDef *table_def = NULL;
if (OB_ISNULL(table_def = op.get_values_table_def()) ||
OB_UNLIKELY(op.get_output_exprs().empty())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected param", K(ret), KP(table_def), K(op.get_output_exprs()));
} else {
spec.access_type_ = table_def->access_type_;
spec.start_param_idx_ = table_def->start_param_idx_;
spec.end_param_idx_ = table_def->end_param_idx_;
ObIAllocator &allocator = phy_plan_->get_allocator();
if (OB_FAIL(spec.column_exprs_.prepare_allocate(op.get_column_exprs().count()))) {
LOG_WARN("init fixed array failed", K(ret), K(op.get_column_exprs().count()));
} else if (OB_FAIL(spec.value_exprs_.prepare_allocate(table_def->access_exprs_.count()))) {
LOG_WARN("init fixed array failed", K(ret), K(table_def->access_exprs_.count()));
} else if (OB_FAIL(spec.obj_params_.prepare_allocate(table_def->access_objs_.count()))) {
LOG_WARN("init fixed array failed", K(ret), K(table_def->access_objs_.count()));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < op.get_column_exprs().count(); i++) {
ObColumnRefRawExpr *col_expr = op.get_column_exprs().at(i);
ObExpr *expr = NULL;
if (OB_ISNULL(col_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("raw_expr is null", K(ret), K(i), K(col_expr));
} else if (OB_FAIL(mark_expr_self_produced(col_expr))) {
LOG_WARN("mark expr self produced failed", K(ret), KPC(col_expr));
} else if (OB_FAIL(generate_rt_expr(*col_expr, expr))) {
LOG_WARN("fail to generate_rt_expr", K(ret), K(i), KPC(col_expr));
} else if (OB_ISNULL(expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("value_info.expr_ is null", K(ret), K(i), KPC(expr));
} else {
spec.column_exprs_.at(i) = expr;
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < table_def->access_exprs_.count(); i++) {
ObRawExpr *raw_expr = table_def->access_exprs_.at(i);
ObExpr *expr = NULL;
if (OB_ISNULL(raw_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("raw_expr is null", K(ret), K(i), K(raw_expr));
} else if (OB_FAIL(mark_expr_self_produced(raw_expr))) {
LOG_WARN("mark expr self produced failed", K(ret), KPC(raw_expr));
} else if (OB_FAIL(generate_rt_expr(*raw_expr, expr))) {
LOG_WARN("fail to generate_rt_expr", K(ret), K(i), KPC(raw_expr));
} else if (OB_ISNULL(expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("value_info.expr_ is null", K(ret), K(i), KPC(raw_expr));
} else {
spec.value_exprs_.at(i) = expr;
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < table_def->access_objs_.count(); i++) {
if (OB_FAIL(ob_write_obj(allocator,
table_def->access_objs_.at(i),
spec.obj_params_.at(i)))) {
LOG_WARN("failed to write obj", K(ret));
}
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(mark_expr_self_produced(op.get_output_exprs()))) {
LOG_WARN("mark expr self produced failed", K(ret));
} else {
spec.rows_ = table_def->row_cnt_;
}
}
}
return ret;
}
int ObStaticEngineCG::generate_spec(ObLogMerge &op,
ObTableMergeSpec &spec,
const bool in_root_job)
@ -8632,6 +8709,10 @@ int ObStaticEngineCG::get_phy_op_type(ObLogicalOperator &log_op,
type = PHY_OPTIMIZER_STATS_GATHERING;
break;
}
case log_op_def::LOG_VALUES_TABLE_ACCESS: {
type = PHY_VALUES_TABLE_ACCESS;
break;
}
default:
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unknown logical operator", K(log_op.get_type()), K(lbt()));

View File

@ -131,6 +131,9 @@ struct ObDASScanCtDef;
struct InsertAllTableInfo;
class ObHashDistinctVecSpec;
class ObSortVecSpec;
class ObLogValuesTableAccess;
class ObValuesTableAccessSpec;
typedef common::ObList<uint64_t, common::ObIAllocator> DASTableIdList;
typedef common::ObSEArray<common::ObSEArray<int64_t, 8, common::ModulePageAllocator, true>,
1, common::ModulePageAllocator, true> RowParamMap;
@ -352,6 +355,7 @@ private:
int set_partition_range_info(ObLogTableScan &op, ObTableScanSpec &spec);
int generate_spec(ObLogExprValues &op, ObExprValuesSpec &spec, const bool in_root_job);
int generate_spec(ObLogValuesTableAccess &op, ObValuesTableAccessSpec &spec, const bool in_root_job);
int generate_merge_with_das(ObLogMerge &op, ObTableMergeSpec &spec, const bool in_root_job);