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

@ -10,24 +10,30 @@
* See the Mulan PubL v2 for more details.
*/
#define USING_LOG_PREFIX SQL_ENG
#define USING_LOG_PREFIX SQL_ENG
#include "sql/engine/expr/ob_expr_benchmark.h"
#include "sql/engine/ob_exec_context.h"
#include "sql/session/ob_sql_session_info.h"
#include "common/ob_smart_call.h"
#include "sql/engine/expr/ob_expr_subquery_ref.h"
namespace oceanbase {
namespace oceanbase
{
using namespace common;
namespace sql {
namespace sql
{
ObExprBenchmark::ObExprBenchmark(ObIAllocator &alloc)
: ObFuncExprOperator(alloc, T_FUN_SYS_BENCHMARK, N_BENCHMARK, 2, NOT_ROW_DIMENSION)
{}
{
}
int ObExprBenchmark::calc_result_type2(
ObExprResType &type, ObExprResType &type1, ObExprResType &type2, ObExprTypeCtx &type_ctx) const
int ObExprBenchmark::calc_result_type2(ObExprResType &type,
ObExprResType &type1,
ObExprResType &type2,
ObExprTypeCtx &type_ctx) const
{
int ret = OB_SUCCESS;
UNUSED(type2);
@ -37,33 +43,23 @@ int ObExprBenchmark::calc_result_type2(
return ret;
}
int ObExprBenchmark::calc_result2(ObObj &res, const ObObj &obj1, const ObObj &obj2, ObExprCtx &expr_ctx) const
{
UNUSED(res);
UNUSED(obj1);
UNUSED(obj2);
UNUSED(expr_ctx);
int ret = OB_NOT_SUPPORTED;
LOG_WARN("expr benchmark is not implemented in old engine", K(ret));
return ret;
}
int ObExprBenchmark::cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_expr, ObExpr &rt_expr) const
int ObExprBenchmark::cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_expr,
ObExpr &rt_expr) const
{
int ret = OB_SUCCESS;
UNUSED(raw_expr);
UNUSED(expr_cg_ctx);
CK(2 == rt_expr.arg_cnt_);
if (GET_MIN_CLUSTER_VERSION() < CLUSTER_VERSION_3100) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("expr benchmark is not implemented", K(ret));
} else {
rt_expr.eval_func_ = ObExprBenchmark::eval_benchmark;
CK (2 == rt_expr.arg_cnt_);
rt_expr.eval_func_ = ObExprBenchmark::eval_benchmark;
if (!rt_expr.args_[0]->is_batch_result()) {
rt_expr.eval_batch_func_ = eval_benchmark_batch;
}
return ret;
}
int ObExprBenchmark::eval_benchmark(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum)
int ObExprBenchmark::eval_benchmark(const ObExpr &expr,
ObEvalCtx &ctx,
ObDatum &expr_datum)
{
int ret = OB_SUCCESS;
ObDatum *loop_count;
@ -82,8 +78,8 @@ int ObExprBenchmark::eval_benchmark(const ObExpr &expr, ObEvalCtx &ctx, ObDatum
LOG_WARN("failed to collect expr", K(ret));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < loops && OB_SUCC(THIS_WORKER.check_status()); ++i) {
clear_all_flags(exprs_to_clear, ctx);
OZ(expr.args_[1]->eval(ctx, tmp_datum));
OZ (clear_all_flags(exprs_to_clear, ctx));
OZ (expr.args_[1]->eval(ctx, tmp_datum));
}
}
expr_datum.set_int32(0);
@ -92,26 +88,79 @@ int ObExprBenchmark::eval_benchmark(const ObExpr &expr, ObEvalCtx &ctx, ObDatum
return ret;
}
int ObExprBenchmark::collect_exprs(common::ObIArray<ObExpr *> &exprs, const ObExpr &root_expr, ObEvalCtx &ctx)
int ObExprBenchmark::eval_benchmark_batch(const ObExpr &expr,
ObEvalCtx &ctx,
const ObBitVector &skip,
const int64_t batch_size)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < root_expr.arg_cnt_; ++i) {
ObEvalInfo &eval_flag = root_expr.args_[i]->get_eval_info(ctx);
if (!eval_flag.evaluated_) {
OZ(exprs.push_back(root_expr.args_[i]));
OZ(SMART_CALL(collect_exprs(exprs, *root_expr.args_[i], ctx)));
ObDatum *loop_count;
ObDatum *result = expr.locate_batch_datums(ctx);
ObBitVector &eval_flags = expr.get_evaluated_flags(ctx);
if (OB_FAIL(expr.args_[0]->eval(ctx, loop_count))) {
LOG_WARN("failed to eval loop count", K(ret));
} else if (loop_count->is_null() || loop_count->get_int() < 0) {
for (int64_t j = 0; j < batch_size; ++j) {
if (skip.at(j) || eval_flags.at(j)) {
continue;
}
eval_flags.set(j);
result[j].set_null();
}
if (!loop_count->is_null() && loop_count->get_int() < 0) {
// compat with mysql, only throw a warning
LOG_WARN("Incorrect count value for function benchmark", K(loop_count->get_int()));
}
} else {
ObArray<ObExpr *> exprs_to_clear;
int64_t loops = loop_count->get_int();
ObDatum *tmp_datum = nullptr;
if (OB_FAIL(collect_exprs(exprs_to_clear, expr, ctx))) {
LOG_WARN("failed to collect expr", K(ret));
} else {
for (int64_t j = 0; OB_SUCC(ret) && j < batch_size; ++j) {
if (skip.at(j) || eval_flags.at(j)) {
continue;
}
for (int64_t i = 0; OB_SUCC(ret) && i < loops && OB_SUCC(THIS_WORKER.check_status()); ++i) {
OZ (clear_all_flags(exprs_to_clear, ctx));
OZ (expr.args_[1]->eval_batch(ctx, skip, batch_size));
}
OX (eval_flags.set(j));
OX (result[j].set_int32(0));
}
}
}
return ret;
}
void ObExprBenchmark::clear_all_flags(common::ObIArray<ObExpr *> &exprs, ObEvalCtx &ctx)
int ObExprBenchmark::collect_exprs(common::ObIArray<ObExpr *> &exprs,
const ObExpr &root_expr,
ObEvalCtx &ctx)
{
for (int64_t i = 0; i < exprs.count(); ++i) {
ObEvalInfo &eval_flag = exprs.at(i)->get_eval_info(ctx);
eval_flag.clear_evaluated_flag();
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < root_expr.arg_cnt_; ++i) {
ObEvalInfo &eval_flag = root_expr.args_[i]->get_eval_info(ctx);
if (!eval_flag.evaluated_) {
OZ (exprs.push_back(root_expr.args_[i]));
OZ (SMART_CALL(collect_exprs(exprs, *root_expr.args_[i], ctx)));
}
}
return ret;
}
} // end namespace sql
} // end namespace oceanbase
int ObExprBenchmark::clear_all_flags(common::ObIArray<ObExpr *> &exprs, ObEvalCtx &ctx)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < exprs.count(); ++i) {
ObEvalInfo &eval_flag = exprs.at(i)->get_eval_info(ctx);
eval_flag.clear_evaluated_flag();
if (T_REF_QUERY == exprs.at(i)->type_) {
OZ (ObExprSubQueryRef::reset_onetime_expr(*exprs.at(i), ctx));
}
}
return ret;
}
}//end namespace sql
}//end namespace oceanbase