diff --git a/deps/oblib/src/lib/ob_name_def.h b/deps/oblib/src/lib/ob_name_def.h index 5f4773454ff10ec6ce6ece82439aae132c3d0bf5..862d2de24e3fb006998b19a42a0a308151aae5c1 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 9255a4c089c7aa04100bce348336dfef5d75a40d..b43eb69eaebf86ec95e28ab4b0b712b59b8ba8b9 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 aae88e129fee1f43bc14fb4c080e7852d1988a08..dce0669c01ddd7e7424ea448303ccfcebdce9f6a 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 3087eb8c2e04c12397a4fbb66b40fa7543b6b160..4706a66fd1fdb6562909b754481c22d4d5711598 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 0000000000000000000000000000000000000000..02736f081846d9e716e3e971cc142799ec08a78f --- /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 0000000000000000000000000000000000000000..fe6b34e20e601d2ad0f243e634799b7098039068 --- /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 567c6f9423bf1e4c5880585d29f7bec58bf069b3..5f0e21d36058adaab3b8dd84079d893fa43f4943 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 da58bd5229688f30010a2b47a1c9fd2d5f4f4773..a25e2b4a28f2afe6028fc42e7812b533e336ee0d 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 4d71a97fd96c4abb9b5126ac816571fbd899bf5f..6639c6f3d6c5ee33a305cd756bc908b8ce65185b 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)); }