From e28151b107484bd176792673e32adaeb592af48e Mon Sep 17 00:00:00 2001 From: al0 Date: Tue, 30 Nov 2021 11:13:10 +0800 Subject: [PATCH] Support uuid_short in mysql mode. --- deps/oblib/src/lib/ob_name_def.h | 1 + src/sql/CMakeLists.txt | 2 + .../engine/expr/ob_expr_eval_functions.cpp | 3 +- .../engine/expr/ob_expr_operator_factory.cpp | 2 + src/sql/engine/expr/ob_expr_uuid_short.cpp | 78 +++++++++++++++++++ src/sql/engine/expr/ob_expr_uuid_short.h | 51 ++++++++++++ src/sql/parser/ob_item_type.h | 1 + src/sql/resolver/expr/ob_raw_expr.cpp | 3 +- .../expr/ob_raw_expr_info_extractor.cpp | 6 +- 9 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 src/sql/engine/expr/ob_expr_uuid_short.cpp create mode 100644 src/sql/engine/expr/ob_expr_uuid_short.h diff --git a/deps/oblib/src/lib/ob_name_def.h b/deps/oblib/src/lib/ob_name_def.h index 5f4773454f..862d2de24e 100644 --- a/deps/oblib/src/lib/ob_name_def.h +++ b/deps/oblib/src/lib/ob_name_def.h @@ -778,6 +778,7 @@ #define N_YEAR "year" #define N_TIME "time" #define N_UUID "uuid" +#define N_UUID_SHORT "uuid_short" #define N_SYS_GUID "sys_guid" #define N_SET_TO_STR "set_to_str" #define N_ENUM_TO_STR "enum_to_str" diff --git a/src/sql/CMakeLists.txt b/src/sql/CMakeLists.txt index 9255a4c089..b43eb69eae 100644 --- a/src/sql/CMakeLists.txt +++ b/src/sql/CMakeLists.txt @@ -166,6 +166,8 @@ ob_set_subtarget(ob_sql engine engine/expr/ob_expr_user_can_access_obj.cpp engine/expr/ob_expr_any_value.h engine/expr/ob_expr_any_value.cpp + engine/expr/ob_expr_uuid_short.h + engine/expr/ob_expr_uuid_short.cpp engine/pdml/ob_batch_row_cache.cpp engine/pdml/ob_pdml_data_driver.cpp engine/pdml/ob_px_multi_part_modify.cpp diff --git a/src/sql/engine/expr/ob_expr_eval_functions.cpp b/src/sql/engine/expr/ob_expr_eval_functions.cpp index aae88e129f..dce0669c01 100644 --- a/src/sql/engine/expr/ob_expr_eval_functions.cpp +++ b/src/sql/engine/expr/ob_expr_eval_functions.cpp @@ -189,6 +189,7 @@ #include "ob_expr_any_value.h" #include "ob_expr_validate_password_strength.h" #include "ob_expr_benchmark.h" +#include "ob_expr_uuid_short.h" namespace oceanbase { using namespace common; @@ -710,7 +711,7 @@ static ObExpr::EvalFunc g_expr_eval_functions[] = { NULL, /* 445 */ NULL, /* 446 */ NULL, /* 447 */ - NULL, /* 448 */ + ObExprUuidShort::eval_uuid_short, /* 448 */ ObExprBenchmark::eval_benchmark, /* 449 */ ObExprExportSet::eval_export_set, /* 450 */ ObExprInet6Aton::calc_inet6_aton, /* 451 */ diff --git a/src/sql/engine/expr/ob_expr_operator_factory.cpp b/src/sql/engine/expr/ob_expr_operator_factory.cpp index 3087eb8c2e..4706a66fd1 100644 --- a/src/sql/engine/expr/ob_expr_operator_factory.cpp +++ b/src/sql/engine/expr/ob_expr_operator_factory.cpp @@ -273,6 +273,7 @@ #include "sql/engine/expr/ob_expr_any_value.h" #include "sql/engine/expr/ob_expr_validate_password_strength.h" #include "sql/engine/expr/ob_expr_benchmark.h" +#include "sql/engine/expr/ob_expr_uuid_short.h" using namespace oceanbase::common; namespace oceanbase { @@ -614,6 +615,7 @@ void ObExprOperatorFactory::register_expr_operators() REG_OP(ObExprDllUdf); REG_OP(ObExprExp); REG_OP(ObExprAnyValue); + REG_OP(ObExprUuidShort); /* subquery comparison experator */ REG_OP(ObExprSubQueryRef); REG_OP(ObExprSubQueryEqual); diff --git a/src/sql/engine/expr/ob_expr_uuid_short.cpp b/src/sql/engine/expr/ob_expr_uuid_short.cpp new file mode 100644 index 0000000000..02736f0818 --- /dev/null +++ b/src/sql/engine/expr/ob_expr_uuid_short.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2014-2021 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. + * + * ob_expr_uuid_short.cpp is for uuid_short function + * + * Date: 2021/8/20 + * + * Authors: + * ailing.lcq + * + */ +#define USING_LOG_PREFIX SQL_RESV +#include "sql/engine/expr/ob_expr_uuid_short.h" +#include "observer/ob_server_struct.h" +#include "lib/time/ob_time_utility.h" + +using namespace oceanbase::common; + +namespace oceanbase { +namespace sql { + +ObExprUuidShort::ObExprUuidShort(ObIAllocator &alloc) + : ObFuncExprOperator(alloc, T_FUN_SYS_UUID_SHORT, N_UUID_SHORT, 0, NOT_ROW_DIMENSION) +{} + +ObExprUuidShort::~ObExprUuidShort() +{} + +/** + * Note: + * The total number of serverids over(>=) 256 will not guarantee uniqueness, + * but we will not report an error, because this is a undefined behavior in mysql. + * In short, users should need to know this. + */ +uint64_t ObExprUuidShort::generate_uuid_short() +{ + // uuid_short + // | <8> | <32> | <24> + // server_id server_start_time incremented_variable + static volatile uint64_t server_id_and_server_startup_time = ((GCTX.server_id_ & 255) << 56) | + ((static_cast(common::ObTimeUtility::current_time() / 1000000) << 24) & + ((static_cast(1) << 56) - 1)); + uint64_t uuid_short = ATOMIC_AAF(&server_id_and_server_startup_time, 1); + LOG_DEBUG("uuid_short generated.", K(uuid_short)); + return uuid_short; +} + +int ObExprUuidShort::calc_result0(common::ObObj &result, common::ObExprCtx &expr_ctx) const +{ + int ret = OB_SUCCESS; + UNUSED(expr_ctx); + result.set_uint64(generate_uuid_short()); + return ret; +} + +int ObExprUuidShort::cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_expr, ObExpr &rt_expr) const +{ + UNUSED(raw_expr); + UNUSED(expr_cg_ctx); + rt_expr.eval_func_ = ObExprUuidShort::eval_uuid_short; + return OB_SUCCESS; +} + +int ObExprUuidShort::eval_uuid_short(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum) +{ + int ret = OB_SUCCESS; + UNUSED(expr); + UNUSED(ctx); + expr_datum.set_uint(generate_uuid_short()); + return ret; +} + +} // namespace sql +} // namespace oceanbase diff --git a/src/sql/engine/expr/ob_expr_uuid_short.h b/src/sql/engine/expr/ob_expr_uuid_short.h new file mode 100644 index 0000000000..fe6b34e20e --- /dev/null +++ b/src/sql/engine/expr/ob_expr_uuid_short.h @@ -0,0 +1,51 @@ +/* + * Copyright 2014-2021 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. + * + * ob_expr_uuid_short.h is for uuid_short function + * + * Date: 2021/8/20 + * + * Authors: + * ailing.lcq + * + */ +#ifndef _OB_EXPR_UUID_SHORT_H_ +#define _OB_EXPR_UUID_SHORT_H_ + +#include "sql/engine/expr/ob_expr_operator.h" + +namespace oceanbase { +namespace sql { +class ObExprUuidShort : public ObFuncExprOperator { +public: + explicit ObExprUuidShort(common::ObIAllocator &alloc); + virtual ~ObExprUuidShort(); + + virtual int calc_result_type0(ObExprResType &type, common::ObExprTypeCtx &type_ctx) const; + virtual int calc_result0(common::ObObj &result, common::ObExprCtx &expr_ctx) const; + + virtual int cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_expr, ObExpr &rt_expr) const override; + + static int eval_uuid_short(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum); + +private: + static uint64_t generate_uuid_short(); + DISALLOW_COPY_AND_ASSIGN(ObExprUuidShort) const; +}; + +inline int ObExprUuidShort::calc_result_type0(ObExprResType &type, common::ObExprTypeCtx &type_ctx) const +{ + UNUSED(type_ctx); + type.set_uint64(); + return common::OB_SUCCESS; +} + +} // namespace sql +} // namespace oceanbase +#endif /* _OB_EXPR_UUID_SHORT_H_ */ + +// select uuid_short(); \ No newline at end of file diff --git a/src/sql/parser/ob_item_type.h b/src/sql/parser/ob_item_type.h index 567c6f9423..5f0e21d360 100644 --- a/src/sql/parser/ob_item_type.h +++ b/src/sql/parser/ob_item_type.h @@ -429,6 +429,7 @@ typedef enum ObItemType { T_FUN_SYS_ANY_VALUE = 714, T_FUN_SYS_DEGREES = 715, T_FUN_SYS_VALIDATE_PASSWORD_STRENGTH = 716, + T_FUN_SYS_UUID_SHORT = 719, T_FUN_SYS_BENCHMARK = 720, T_FUN_SYS_EXPORT_SET = 721, diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index da58bd5229..a25e2b4a28 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -493,7 +493,8 @@ bool ObRawExpr::is_non_pure_sys_func_expr() const T_FUN_SYS_UNIX_TIMESTAMP == type_ || T_FUN_SYS_UTC_TIMESTAMP == type_ || T_FUN_SYS_RAND == type_ || T_FUN_SYS_UUID == type_ || T_FUN_SYS_SLEEP == type_ || T_FUN_SYS_LAST_INSERT_ID == type_ || T_FUN_SYS_ROW_COUNT == type_ || T_FUN_SYS_FOUND_ROWS == type_ || T_FUN_SYS_REGEXP_INSTR == type_ || - T_FUN_SYS_REGEXP_LIKE == type_ || T_FUN_SYS_REGEXP_REPLACE == type_ || T_FUN_SYS_REGEXP_SUBSTR == type_) { + T_FUN_SYS_REGEXP_LIKE == type_ || T_FUN_SYS_REGEXP_REPLACE == type_ || T_FUN_SYS_REGEXP_SUBSTR == type_ || + T_FUN_SYS_UUID_SHORT == type_) { return true; } } diff --git a/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp b/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp index 4d71a97fd9..6639c6f3d6 100644 --- a/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp @@ -155,7 +155,8 @@ int ObRawExprInfoExtractor::add_const(ObRawExpr& expr) CONST_ACTION(param_expr); } if (is_const_expr && - (T_FUN_SYS_RAND == expr.get_expr_type() || T_FUN_SYS_SEQ_NEXTVAL == expr.get_expr_type() || + (T_FUN_SYS_RAND == expr.get_expr_type() || T_FUN_SYS_UUID == expr.get_expr_type() || + T_FUN_SYS_UUID_SHORT == expr.get_expr_type() || T_FUN_SYS_SEQ_NEXTVAL == expr.get_expr_type() || T_FUN_SYS_AUTOINC_NEXTVAL == expr.get_expr_type() || T_FUN_SYS_ROWNUM == expr.get_expr_type() || T_FUN_SYS_ROWKEY_TO_ROWID == expr.get_expr_type() || T_OP_CONNECT_BY_ROOT == expr.get_expr_type() || T_FUN_SYS_CONNECT_BY_PATH == expr.get_expr_type() || T_FUN_SYS_GUID == expr.get_expr_type() || @@ -502,7 +503,8 @@ int ObRawExprInfoExtractor::visit(ObSysFunRawExpr& expr) if (OB_FAIL(expr.add_flag(IS_RAND_FUNC))) { LOG_WARN("failed to add flag IS_RAND_FUNC", K(ret)); } - } else if (T_FUN_SYS_GUID == expr.get_expr_type() || T_FUN_SYS_UUID == expr.get_expr_type()) { + } else if (T_FUN_SYS_GUID == expr.get_expr_type() || T_FUN_SYS_UUID == expr.get_expr_type() || + T_FUN_SYS_UUID_SHORT == expr.get_expr_type()) { if (OB_FAIL(expr.add_flag(IS_RAND_FUNC))) { LOG_WARN("failed to add flag IS_RAND_FUNC", K(ret)); } -- GitLab