From 7b9fe4333537a3f8f1baf532a44f732403dda2a5 Mon Sep 17 00:00:00 2001 From: ls0 Date: Mon, 29 Nov 2021 14:58:10 +0800 Subject: [PATCH] implement expr benchmark in mysql mode --- deps/oblib/src/lib/ob_name_def.h | 2 + src/sql/CMakeLists.txt | 2 + src/sql/engine/expr/ob_expr_benchmark.cpp | 116 ++++++++++++++++++ src/sql/engine/expr/ob_expr_benchmark.h | 34 +++++ .../engine/expr/ob_expr_eval_functions.cpp | 3 +- .../engine/expr/ob_expr_operator_factory.cpp | 2 + src/sql/parser/ob_item_type.h | 1 + 7 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 src/sql/engine/expr/ob_expr_benchmark.cpp create mode 100644 src/sql/engine/expr/ob_expr_benchmark.h diff --git a/deps/oblib/src/lib/ob_name_def.h b/deps/oblib/src/lib/ob_name_def.h index 7d0df2e7b7..c7bb69a50e 100644 --- a/deps/oblib/src/lib/ob_name_def.h +++ b/deps/oblib/src/lib/ob_name_def.h @@ -881,4 +881,6 @@ #define N_MULTI_VALUES_DESC "multi_values_desc" #define N_MULTI_VALUE_VECTORS "multi_value_vectors" #define N_MULTI_INSERT_COL_CONV_FUNCS "multi_insert_col_conv_funcs" +#define N_BENCHMARK "benchmark" + #endif // OCEANBASE_LIB_OB_NAME_DEF_H_ diff --git a/src/sql/CMakeLists.txt b/src/sql/CMakeLists.txt index 7207441254..acce51f992 100644 --- a/src/sql/CMakeLists.txt +++ b/src/sql/CMakeLists.txt @@ -464,6 +464,8 @@ ob_set_subtarget(ob_sql engine engine/expr/ob_expr_calc_urowid.cpp engine/expr/ob_expr_cardinality.cpp engine/expr/ob_expr_coll_pred.cpp + engine/expr/ob_expr_benchmark.cpp + engine/expr/ob_expr_benchmark.h engine/join/ob_basic_nested_loop_join.cpp engine/join/ob_block_based_nested_loop_join.cpp engine/join/ob_hash_join.cpp diff --git a/src/sql/engine/expr/ob_expr_benchmark.cpp b/src/sql/engine/expr/ob_expr_benchmark.cpp new file mode 100644 index 0000000000..1f5bbce12c --- /dev/null +++ b/src/sql/engine/expr/ob_expr_benchmark.cpp @@ -0,0 +1,116 @@ +// (C) Copyright 2013-2016 Alibaba Inc. All Rights Reserved. +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// version 2 as published by the Free Software Foundation. +// Version: $Id$ +// Authors: +// peihan.dph@alibaba-inc.com +// Normalizer: +// peihan.dph@alibaba-inc.com +// This file is for implementation of func expr_benchmark + +#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" + +namespace oceanbase { +using namespace common; + +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 ret = OB_SUCCESS; + UNUSED(type2); + UNUSED(type_ctx); + type.set_int32(); + type1.set_calc_type(ObIntType); + 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 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; + } + return ret; +} + +int ObExprBenchmark::eval_benchmark(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum) +{ + int ret = OB_SUCCESS; + ObDatum *loop_count; + 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) { + expr_datum.set_null(); + if (!loop_count->is_null() && loop_count->get_int() < 0) { + LOG_WARN("Incorrect count value for function benchmark", K(loop_count->get_int())); + } + } else { + ObArray 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 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)); + } + } + expr_datum.set_int32(0); + exprs_to_clear.destroy(); + } + return ret; +} + +int ObExprBenchmark::collect_exprs(common::ObIArray &exprs, const ObExpr &root_expr, ObEvalCtx &ctx) +{ + 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; +} + +void ObExprBenchmark::clear_all_flags(common::ObIArray &exprs, 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(); + } +} + +} // end namespace sql +} // end namespace oceanbase \ No newline at end of file diff --git a/src/sql/engine/expr/ob_expr_benchmark.h b/src/sql/engine/expr/ob_expr_benchmark.h new file mode 100644 index 0000000000..97e7a3141e --- /dev/null +++ b/src/sql/engine/expr/ob_expr_benchmark.h @@ -0,0 +1,34 @@ +// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. +// Author: +// peihan.dph@alibaba-inc.com +// Normalizer: +// peihan.dph@alibaba-inc.com +// +// This file defines implementation for benchmark operator +#ifndef OCEANBASE_SQL_ENGINE_EXPR_OB_EXPR_BENCHMARK_ +#define OCEANBASE_SQL_ENGINE_EXPR_OB_EXPR_BENCHMARK_ + +#include "sql/engine/expr/ob_expr_operator.h" + +namespace oceanbase { +namespace sql { +class ObExprBenchmark : public ObFuncExprOperator { +public: + explicit ObExprBenchmark(common::ObIAllocator &alloc); + virtual ~ObExprBenchmark(){}; + virtual int calc_result_type2( + ObExprResType &type, ObExprResType &type1, ObExprResType &type2, ObExprTypeCtx &type_ctx) const; + virtual int calc_result2(ObObj &res, const ObObj &obj1, const ObObj &obj2, ObExprCtx &expr_ctx) const; + virtual int cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_expr, ObExpr &rt_expr) const; + + static int eval_benchmark(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum); + +private: + static int collect_exprs(common::ObIArray &exprs, const ObExpr &root_expr, ObEvalCtx &ctx); + static void clear_all_flags(common::ObIArray &exprs, ObEvalCtx &ctx); + DISALLOW_COPY_AND_ASSIGN(ObExprBenchmark); +}; + +} // namespace sql +} // namespace oceanbase +#endif /* OCEANBASE_SQL_ENGINE_EXPR_OB_EXPR_BENCHMARK_ */ diff --git a/src/sql/engine/expr/ob_expr_eval_functions.cpp b/src/sql/engine/expr/ob_expr_eval_functions.cpp index 4b94112059..fa411a003e 100644 --- a/src/sql/engine/expr/ob_expr_eval_functions.cpp +++ b/src/sql/engine/expr/ob_expr_eval_functions.cpp @@ -187,6 +187,7 @@ #include "ob_expr_degrees.h" #include "ob_expr_weight_string.h" #include "ob_expr_any_value.h" +#include "ob_expr_benchmark.h" namespace oceanbase { using namespace common; @@ -709,7 +710,7 @@ static ObExpr::EvalFunc g_expr_eval_functions[] = { NULL, /* 446 */ NULL, /* 447 */ NULL, /* 448 */ - NULL, /* 449 */ + ObExprBenchmark::eval_benchmark, /* 449 */ ObExprExportSet::eval_export_set, /* 450 */ ObExprInet6Aton::calc_inet6_aton, /* 451 */ ObExprIsIpv4::calc_is_ipv4, /* 452 */ diff --git a/src/sql/engine/expr/ob_expr_operator_factory.cpp b/src/sql/engine/expr/ob_expr_operator_factory.cpp index 309c68361d..578a33a732 100644 --- a/src/sql/engine/expr/ob_expr_operator_factory.cpp +++ b/src/sql/engine/expr/ob_expr_operator_factory.cpp @@ -271,6 +271,7 @@ #include "sql/engine/expr/ob_expr_degrees.h" #include "sql/engine/expr/ob_expr_weight_string.h" #include "sql/engine/expr/ob_expr_any_value.h" +#include "sql/engine/expr/ob_expr_benchmark.h" using namespace oceanbase::common; namespace oceanbase { @@ -683,6 +684,7 @@ void ObExprOperatorFactory::register_expr_operators() REG_OP(ObExprTimestamp); REG_OP(ObExprDegrees); REG_OP(ObExprWeightString); + REG_OP(ObExprBenchmark); // register oracle system function REG_OP_ORCL(ObExprSysConnectByPath); REG_OP_ORCL(ObExprTimestampNvl); diff --git a/src/sql/parser/ob_item_type.h b/src/sql/parser/ob_item_type.h index 4331c4e784..e9da04f32f 100644 --- a/src/sql/parser/ob_item_type.h +++ b/src/sql/parser/ob_item_type.h @@ -428,6 +428,7 @@ typedef enum ObItemType { T_FUN_SYS_PI = 713, T_FUN_SYS_ANY_VALUE = 714, T_FUN_SYS_DEGREES = 715, + T_FUN_SYS_BENCHMARK = 720, T_FUN_SYS_EXPORT_SET = 721, T_FUN_SYS_INET6NTOA = 722, -- GitLab