implement expr benchmark in mysql mode
This commit is contained in:
2
deps/oblib/src/lib/ob_name_def.h
vendored
2
deps/oblib/src/lib/ob_name_def.h
vendored
@ -881,4 +881,6 @@
|
|||||||
#define N_MULTI_VALUES_DESC "multi_values_desc"
|
#define N_MULTI_VALUES_DESC "multi_values_desc"
|
||||||
#define N_MULTI_VALUE_VECTORS "multi_value_vectors"
|
#define N_MULTI_VALUE_VECTORS "multi_value_vectors"
|
||||||
#define N_MULTI_INSERT_COL_CONV_FUNCS "multi_insert_col_conv_funcs"
|
#define N_MULTI_INSERT_COL_CONV_FUNCS "multi_insert_col_conv_funcs"
|
||||||
|
#define N_BENCHMARK "benchmark"
|
||||||
|
|
||||||
#endif // OCEANBASE_LIB_OB_NAME_DEF_H_
|
#endif // OCEANBASE_LIB_OB_NAME_DEF_H_
|
||||||
|
|||||||
@ -464,6 +464,8 @@ ob_set_subtarget(ob_sql engine
|
|||||||
engine/expr/ob_expr_calc_urowid.cpp
|
engine/expr/ob_expr_calc_urowid.cpp
|
||||||
engine/expr/ob_expr_cardinality.cpp
|
engine/expr/ob_expr_cardinality.cpp
|
||||||
engine/expr/ob_expr_coll_pred.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_basic_nested_loop_join.cpp
|
||||||
engine/join/ob_block_based_nested_loop_join.cpp
|
engine/join/ob_block_based_nested_loop_join.cpp
|
||||||
engine/join/ob_hash_join.cpp
|
engine/join/ob_hash_join.cpp
|
||||||
|
|||||||
116
src/sql/engine/expr/ob_expr_benchmark.cpp
Normal file
116
src/sql/engine/expr/ob_expr_benchmark.cpp
Normal file
@ -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<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 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<ObExpr *> &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<ObExpr *> &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
|
||||||
34
src/sql/engine/expr/ob_expr_benchmark.h
Normal file
34
src/sql/engine/expr/ob_expr_benchmark.h
Normal file
@ -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<ObExpr *> &exprs, const ObExpr &root_expr, ObEvalCtx &ctx);
|
||||||
|
static void clear_all_flags(common::ObIArray<ObExpr *> &exprs, ObEvalCtx &ctx);
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(ObExprBenchmark);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace sql
|
||||||
|
} // namespace oceanbase
|
||||||
|
#endif /* OCEANBASE_SQL_ENGINE_EXPR_OB_EXPR_BENCHMARK_ */
|
||||||
@ -187,6 +187,7 @@
|
|||||||
#include "ob_expr_degrees.h"
|
#include "ob_expr_degrees.h"
|
||||||
#include "ob_expr_weight_string.h"
|
#include "ob_expr_weight_string.h"
|
||||||
#include "ob_expr_any_value.h"
|
#include "ob_expr_any_value.h"
|
||||||
|
#include "ob_expr_benchmark.h"
|
||||||
|
|
||||||
namespace oceanbase {
|
namespace oceanbase {
|
||||||
using namespace common;
|
using namespace common;
|
||||||
@ -709,7 +710,7 @@ static ObExpr::EvalFunc g_expr_eval_functions[] = {
|
|||||||
NULL, /* 446 */
|
NULL, /* 446 */
|
||||||
NULL, /* 447 */
|
NULL, /* 447 */
|
||||||
NULL, /* 448 */
|
NULL, /* 448 */
|
||||||
NULL, /* 449 */
|
ObExprBenchmark::eval_benchmark, /* 449 */
|
||||||
ObExprExportSet::eval_export_set, /* 450 */
|
ObExprExportSet::eval_export_set, /* 450 */
|
||||||
ObExprInet6Aton::calc_inet6_aton, /* 451 */
|
ObExprInet6Aton::calc_inet6_aton, /* 451 */
|
||||||
ObExprIsIpv4::calc_is_ipv4, /* 452 */
|
ObExprIsIpv4::calc_is_ipv4, /* 452 */
|
||||||
|
|||||||
@ -271,6 +271,7 @@
|
|||||||
#include "sql/engine/expr/ob_expr_degrees.h"
|
#include "sql/engine/expr/ob_expr_degrees.h"
|
||||||
#include "sql/engine/expr/ob_expr_weight_string.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_any_value.h"
|
||||||
|
#include "sql/engine/expr/ob_expr_benchmark.h"
|
||||||
|
|
||||||
using namespace oceanbase::common;
|
using namespace oceanbase::common;
|
||||||
namespace oceanbase {
|
namespace oceanbase {
|
||||||
@ -683,6 +684,7 @@ void ObExprOperatorFactory::register_expr_operators()
|
|||||||
REG_OP(ObExprTimestamp);
|
REG_OP(ObExprTimestamp);
|
||||||
REG_OP(ObExprDegrees);
|
REG_OP(ObExprDegrees);
|
||||||
REG_OP(ObExprWeightString);
|
REG_OP(ObExprWeightString);
|
||||||
|
REG_OP(ObExprBenchmark);
|
||||||
// register oracle system function
|
// register oracle system function
|
||||||
REG_OP_ORCL(ObExprSysConnectByPath);
|
REG_OP_ORCL(ObExprSysConnectByPath);
|
||||||
REG_OP_ORCL(ObExprTimestampNvl);
|
REG_OP_ORCL(ObExprTimestampNvl);
|
||||||
|
|||||||
@ -428,6 +428,7 @@ typedef enum ObItemType {
|
|||||||
T_FUN_SYS_PI = 713,
|
T_FUN_SYS_PI = 713,
|
||||||
T_FUN_SYS_ANY_VALUE = 714,
|
T_FUN_SYS_ANY_VALUE = 714,
|
||||||
T_FUN_SYS_DEGREES = 715,
|
T_FUN_SYS_DEGREES = 715,
|
||||||
|
T_FUN_SYS_BENCHMARK = 720,
|
||||||
T_FUN_SYS_EXPORT_SET = 721,
|
T_FUN_SYS_EXPORT_SET = 721,
|
||||||
|
|
||||||
T_FUN_SYS_INET6NTOA = 722,
|
T_FUN_SYS_INET6NTOA = 722,
|
||||||
|
|||||||
Reference in New Issue
Block a user