/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #ifndef OCEANBASE_SQL_SESSION_OB_SYSTEM_VARIABLE_ #define OCEANBASE_SQL_SESSION_OB_SYSTEM_VARIABLE_ #include "lib/timezone/ob_time_convert.h" #include "share/system_variable/ob_system_variable_init.h" #include "storage/tx/ob_trans_define.h" namespace oceanbase { namespace common { class ObMySQLProxy; } namespace sql { class ObExecContext; class ObBasicSessionInfo; } namespace share { class ObSpecialSysVarValues { public: // OB_SV_VERSION_COMMENT const static int64_t VERSION_COMMENT_MAX_LEN = 256; static char version_comment_[VERSION_COMMENT_MAX_LEN]; // OB_SV_VERSION const static int64_t VERSION_MAX_LEN = 256; static char version_[VERSION_MAX_LEN]; // OB_SV_SYSTEM_TIME_ZONE const static int64_t SYSTEM_TIME_ZONE_MAX_LEN = 64; static char system_time_zone_str_[SYSTEM_TIME_ZONE_MAX_LEN]; // charset和collation相关 static const int64_t COLL_INT_STR_MAX_LEN = 64; static char default_coll_int_str_[COLL_INT_STR_MAX_LEN]; //OB_SV_SERVER_UUID:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee const static int64_t SERVER_UUID_MAX_LEN = 37; static char server_uuid_[SERVER_UUID_MAX_LEN]; public: ObSpecialSysVarValues(); }; class ObSetVar { public: enum SetScopeType { /* * most system variables can be set with: * 1. GLOBAL scope * with 'SET GLOBAL xxx=xxx' only in mysql mode. * set with global scope will affect all sessions that created in future, and keep * all exist sessions unchanged. * 2. SESSION scope * with 'SET [SESSION] xxx=xxx' in mysql mode, SESSION is optional. * or 'ALTER SESSION SET xxx=xxx' in oracle mode, * set with session scope will affect all following operations in current session. * 3. NONE scope * with 'SET xxx=xxx' in both mysql and oracle mode. * besides GLOBAL and SESSION scopes, a few variables can be set with NONE scope, * which only affect the NEXT ONE transaction in current session, like tx_isolation. * so I think 'SET_SCOPE_NEXT_TRANS' is better than 'SET_SCOPE_NONE'. */ SET_SCOPE_NEXT_TRANS = 0, SET_SCOPE_GLOBAL, SET_SCOPE_SESSION, }; ObSetVar(const common::ObString &var_name, ObSetVar::SetScopeType set_scope, bool is_set_default, uint64_t actual_tenant_id, common::ObIAllocator &calc_buf, common::ObMySQLProxy &sql_proxy) : var_name_(var_name), set_scope_(set_scope), is_set_default_(is_set_default), actual_tenant_id_(actual_tenant_id), calc_buf_(calc_buf), sql_proxy_(sql_proxy) {} virtual ~ObSetVar() {} common::ObString var_name_; ObSetVar::SetScopeType set_scope_; bool is_set_default_; uint64_t actual_tenant_id_; common::ObIAllocator &calc_buf_; common::ObMySQLProxy &sql_proxy_; TO_STRING_KV(K_(var_name), K_(set_scope), K_(is_set_default), K_(actual_tenant_id)); private: DISALLOW_COPY_AND_ASSIGN(ObSetVar); }; class ObSysVarTypeLib { public: //ObSysVarTypeLib() : count_(0), type_names_(NULL) {} ObSysVarTypeLib(const char **type_names) //传入的char*数组的最后一个元素必须为0 : count_(0), type_names_(NULL) { if (OB_ISNULL(type_names)) { SQL_SESSION_LOG_RET(ERROR, common::OB_ERR_UNEXPECTED, "type names is NULL"); } else { // 这里没法按照编码规范检查下标 for (count_ = 0; 0 != type_names[count_]; count_++); type_names_ = type_names; } } virtual ~ObSysVarTypeLib() {} virtual void reset() { count_ = 0; type_names_ = NULL; } int64_t count_; const char **type_names_; private: DISALLOW_COPY_AND_ASSIGN(ObSysVarTypeLib); }; class ObBasicSysVar { OB_UNIS_VERSION_V(1); public: static const char * EMPTY_STRING; typedef int (*OnCheckAndConvertFunc)(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); typedef int (*OnUpdateFunc)(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &val); typedef int (*ToStrFunc)(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObString &result_str); typedef int (*ToObjFunc)(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObObj &result_obj); typedef common::ObObjType (*GetMetaTypeFunc)(); //非varchar类型的sys variable才可能为NULL static inline bool is_null_value(const common::ObString & value, int64_t flag) { return (flag & ObSysVarFlag::NULLABLE) && (value == common::ObString::make_string(ObBasicSysVar::EMPTY_STRING)); } public: ObBasicSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL, bool is_enum_type = false) : base_version_(common::OB_INVALID_VERSION), base_value_(), inc_value_(), min_val_(), max_val_(), type_(common::ObUnknownType), flags_(ObSysVarFlag::NONE), on_check_and_convert_(on_check_and_convert), on_update_(on_update), to_select_obj_(to_select_obj), to_show_str_(to_show_str), get_meta_type_(get_meta_type), is_enum_type_(is_enum_type) { clean_value(); } virtual ~ObBasicSysVar() {} virtual share::ObSysVarClassType get_type() const = 0; virtual const common::ObObj &get_global_default_value() const = 0; virtual int init(const common::ObObj &value, const common::ObObj &min_val, const common::ObObj &max_val, common::ObObjType type, int64_t flags); virtual void reset(); virtual void clean_value(); virtual void clean_base_value(); virtual void clean_inc_value(); virtual bool is_base_value_empty() const; virtual bool is_inc_value_empty() const; virtual int check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); virtual int session_update(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); virtual int update(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); virtual common::ObObjType inner_get_meta_type() const; // select @@XXX的时候meta data里面的类型 virtual int inner_to_select_obj(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, common::ObObj &select_obj) const; virtual int inner_to_show_str(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, common::ObString &show_str) const; int64_t get_base_version() const; common::ObObjType get_meta_type() const; const common::ObObj &get_value() const; const common::ObObj &get_base_value() const; const common::ObObj &get_inc_value() const; const common::ObObj &get_min_val() const; const common::ObObj &get_max_val() const; void set_value(const common::ObObj &value); common::ObObjType get_data_type() const; void set_data_type(common::ObObjType type); void set_flags(int64_t flags); int to_select_obj(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, common::ObObj &select_obj) const; int to_show_str(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, common::ObString &show_str) const; inline bool is_readonly() const { return 0 != (flags_ & ObSysVarFlag::READONLY); } inline bool is_session_readonly() const { return 0 != (flags_ & ObSysVarFlag::SESSION_READONLY); } inline bool is_invisible() const { return 0 != (flags_ & ObSysVarFlag::INVISIBLE); } inline bool is_global_scope() const { return 0 != (flags_ & ObSysVarFlag::GLOBAL_SCOPE); } inline bool is_session_scope() const { return 0 != (flags_ & ObSysVarFlag::SESSION_SCOPE); } inline bool is_influence_plan() const { return 0 != (flags_ & ObSysVarFlag::INFLUENCE_PLAN); } inline bool is_oracle_only() const { return 0 != (flags_ & ObSysVarFlag::ORACLE_ONLY); } inline bool is_enum_type() const { return is_enum_type_; } inline bool is_mysql_only() const { return 0 != (flags_ & ObSysVarFlag::MYSQL_ONLY); } inline bool is_with_upgrade() const { return 0 != (flags_ & ObSysVarFlag::WITH_UPGRADE); } inline bool is_need_serialize() const { return 0 != (flags_ & ObSysVarFlag::NEED_SERIALIZE); } const common::ObString get_name() const; static int get_charset_var_and_val_by_collation(const common::ObString &coll_var_name, const common::ObString &coll_val, common::ObString &cs_var_name, common::ObString &cs_val, common::ObCollationType &coll_type); static int get_collation_var_and_val_by_charset(const common::ObString &cs_var_name, const common::ObString &cs_val, common::ObString &coll_var_name, common::ObString &coll_val, common::ObCollationType &coll_type); DECLARE_TO_STRING; protected: // 目前base_value和inc_value的设置操作有一个简单原则: // 1. 有且只有base_value会和min_value/max_value一起设置,并且不需要判断base_value是否有效。 // 目前只有init接口。 // 2. 有且只有inc_value会单独设置,并且可能根据min_value/max_value判断inc_value是否有效。 // 目前只有set_value接口。 int64_t base_version_; common::ObObj base_value_; common::ObObj inc_value_; common::ObObj min_val_; common::ObObj max_val_; common::ObObjType type_; int64_t flags_; protected: int log_err_wrong_value_for_var(int error_no, const common::ObObj &val) const; int check_and_convert_int_tc_value(const common::ObObj &value, int64_t invalid_value, int64_t &result_value) const; int check_and_convert_uint_tc_value(const common::ObObj &value, uint64_t invalid_value, uint64_t &result_value) const; private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); OnCheckAndConvertFunc on_check_and_convert_; OnUpdateFunc on_update_; ToObjFunc to_select_obj_; ToStrFunc to_show_str_; GetMetaTypeFunc get_meta_type_; bool is_enum_type_; private: DISALLOW_COPY_AND_ASSIGN(ObBasicSysVar); }; class ObTypeLibSysVar : public ObBasicSysVar { public: ObTypeLibSysVar(const char **type_names, OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL, bool is_enum_type = false) : ObBasicSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type, is_enum_type), type_lib_(type_names) { } virtual ~ObTypeLibSysVar() {} virtual void reset(); virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); virtual int inner_to_show_str(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, common::ObString &show_str) const; int find_type(const common::ObString &type, int64_t &type_index) const; protected: ObSysVarTypeLib type_lib_; private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); private: DISALLOW_COPY_AND_ASSIGN(ObTypeLibSysVar); }; class ObEnumSysVar : public ObTypeLibSysVar { public: ObEnumSysVar(const char **type_names, OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObTypeLibSysVar(type_names, on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type, true/* is_enum_type */) { } virtual ~ObEnumSysVar() {} virtual int inner_to_select_obj(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, common::ObObj &select_obj) const; private: DISALLOW_COPY_AND_ASSIGN(ObEnumSysVar); }; class ObBoolSysVar : public ObTypeLibSysVar { public: const static char *BOOL_TYPE_NAMES[]; public: ObBoolSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObTypeLibSysVar(ObBoolSysVar::BOOL_TYPE_NAMES, on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObBoolSysVar() {} private: DISALLOW_COPY_AND_ASSIGN(ObBoolSysVar); }; ////////////////////////////// class ObSetSysVar : public ObTypeLibSysVar { static const int64_t MAX_STR_BUF_LEN = 512; public: ObSetSysVar(const char **type_names, OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObTypeLibSysVar(type_names, on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObSetSysVar() {} int find_set(const common::ObString &value); private: DISALLOW_COPY_AND_ASSIGN(ObSetSysVar); }; ////////////////////////////// class ObSqlModeVar : public ObSetSysVar { public: const static char* SQL_MODE_NAMES[]; public: ObSqlModeVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObSetSysVar(ObSqlModeVar::SQL_MODE_NAMES, on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObSqlModeVar() {} private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); private: DISALLOW_COPY_AND_ASSIGN(ObSqlModeVar); }; ////////////////////////////// class ObSysVarAccessMode : public ObBoolSysVar { public: ObSysVarAccessMode(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBoolSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObSysVarAccessMode() {} private: DISALLOW_COPY_AND_ASSIGN(ObSysVarAccessMode); }; ///////////////////////////// class ObCharsetSysVar : public ObBasicSysVar { public: ObCharsetSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBasicSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObCharsetSysVar() {} virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); private: DISALLOW_COPY_AND_ASSIGN(ObCharsetSysVar); }; ///////////////////////////// class ObTinyintSysVar : public ObBasicSysVar { public: ObTinyintSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBasicSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObTinyintSysVar() {} virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); private: DISALLOW_COPY_AND_ASSIGN(ObTinyintSysVar); }; class ObIntSysVar : public ObBasicSysVar { public: ObIntSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBasicSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObIntSysVar() {} virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); virtual int do_convert(sql::ObExecContext &ctx, const common::ObObj &in_val, common::ObObj &out_val, bool &is_converted); private: DISALLOW_COPY_AND_ASSIGN(ObIntSysVar); }; // 严格范围的int,这个类遇到set语句的值超出范围的时候会报错,而不是像ObIntSysVar那样截断 class ObStrictRangeIntSysVar : public ObIntSysVar { public: ObStrictRangeIntSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObIntSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObStrictRangeIntSysVar() {} private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); private: DISALLOW_COPY_AND_ASSIGN(ObStrictRangeIntSysVar); }; class ObNumericSysVar : public ObBasicSysVar { public: ObNumericSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBasicSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObNumericSysVar() {} virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); virtual int do_convert(sql::ObExecContext &ctx, const common::ObObj &in_val, common::ObObj &out_val, bool &is_converted); private: DISALLOW_COPY_AND_ASSIGN(ObNumericSysVar); }; class ObVarcharSysVar : public ObBasicSysVar { public: ObVarcharSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBasicSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObVarcharSysVar() {} virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); private: DISALLOW_COPY_AND_ASSIGN(ObVarcharSysVar); }; class ObTimeZoneSysVar : public ObBasicSysVar { public: ObTimeZoneSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBasicSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type) { } virtual ~ObTimeZoneSysVar() {} virtual int check_update_type(const ObSetVar &set_var, const common::ObObj &val); private: virtual int do_check_and_convert(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val, common::ObObj &out_val); int find_pos_time_zone(sql::ObExecContext &ctx, const common::ObString &str_val, const bool is_oracle_compatible); private: DISALLOW_COPY_AND_ASSIGN(ObTimeZoneSysVar); }; class ObSessionSpecialIntSysVar : public ObIntSysVar { public: typedef int (*SessionSpecialUpdateFunc)(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); public: ObSessionSpecialIntSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, SessionSpecialUpdateFunc session_special_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObIntSysVar(on_check_and_convert, NULL, to_select_obj, to_show_str, get_meta_type), session_special_update_(session_special_update) { } virtual ~ObSessionSpecialIntSysVar() {} virtual int session_update(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val) { int ret = common::OB_SUCCESS; if (OB_ISNULL(session_special_update_)) { ret = common::OB_ERR_UNEXPECTED; SQL_SESSION_LOG(ERROR, "function ptr session_special_update_ is NULL", K(ret)); } else if (OB_FAIL(session_special_update_(ctx, set_var, val))) { SQL_SESSION_LOG(WARN, "fail to call session_special_update_", K(ret)); } return ret; } private: SessionSpecialUpdateFunc session_special_update_; private: DISALLOW_COPY_AND_ASSIGN(ObSessionSpecialIntSysVar); }; class ObSessionSpecialVarcharSysVar : public ObVarcharSysVar { public: typedef int (*SessionSpecialUpdateFunc)(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); public: ObSessionSpecialVarcharSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, SessionSpecialUpdateFunc session_special_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObVarcharSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type), session_special_update_(session_special_update) { } virtual ~ObSessionSpecialVarcharSysVar() {} virtual int session_update(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val) { int ret = common::OB_SUCCESS; if (OB_ISNULL(session_special_update_)) { ret = common::OB_ERR_UNEXPECTED; SQL_SESSION_LOG(ERROR, "function ptr session_special_update_ is NULL", K(ret)); } else if (OB_FAIL(session_special_update_(ctx, set_var, val))) { SQL_SESSION_LOG(WARN, "fail to call session_special_update_", K(ret)); } return ret; } private: SessionSpecialUpdateFunc session_special_update_; private: DISALLOW_COPY_AND_ASSIGN(ObSessionSpecialVarcharSysVar); }; class ObSessionSpecialBoolSysVar : public ObBoolSysVar { public: typedef int (*SessionSpecialUpdateFunc)(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); public: ObSessionSpecialBoolSysVar(OnCheckAndConvertFunc on_check_and_convert = NULL, OnUpdateFunc on_update = NULL, SessionSpecialUpdateFunc session_special_update = NULL, ToObjFunc to_select_obj = NULL, ToStrFunc to_show_str = NULL, GetMetaTypeFunc get_meta_type = NULL) : ObBoolSysVar(on_check_and_convert, on_update, to_select_obj, to_show_str, get_meta_type), session_special_update_(session_special_update) { } virtual ~ObSessionSpecialBoolSysVar() {} virtual int session_update(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val) { int ret = common::OB_SUCCESS; if (OB_ISNULL(session_special_update_)) { ret = common::OB_ERR_UNEXPECTED; SQL_SESSION_LOG(ERROR, "function ptr session_special_update_ is NULL", K(ret)); } else if (OB_FAIL(session_special_update_(ctx, set_var, val))) { SQL_SESSION_LOG(WARN, "fail to call session_special_update_", K(ret)); } return ret; } private: SessionSpecialUpdateFunc session_special_update_; private: DISALLOW_COPY_AND_ASSIGN(ObSessionSpecialBoolSysVar); }; class ObSysVarOnCheckFuncs { public: ObSysVarOnCheckFuncs() {} virtual ~ObSysVarOnCheckFuncs() {} public: static int check_and_convert_timestamp_service(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_max_allowed_packet(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_net_buffer_length(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_charset(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_charset_not_null(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_collation_not_null(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_tx_isolation(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_tx_read_only(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_timeout_too_large(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_max_user_connections(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_sql_mode(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_time_zone(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_max_min_timestamp(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_ob_org_cluster_id(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_plsql_warnings(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_plsql_ccflags(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_sql_throttle_queue_time(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_nls_currency_too_long(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_nls_iso_currency_is_valid(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_and_convert_nls_length_semantics_is_valid(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_update_resource_manager_plan(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &val, common::ObObj &out_val); static int check_log_row_value_option_is_valid(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static int check_runtime_filter_type_is_valid(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); private: static int check_session_readonly(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &in_val, common::ObObj &out_val); static bool can_set_trans_var(ObSetVar::SetScopeType scope, sql::ObBasicSessionInfo &session); static int get_string(const common::ObObj &val, common::ObString &str); private: DISALLOW_COPY_AND_ASSIGN(ObSysVarOnCheckFuncs); }; class ObSysVarOnUpdateFuncs { public: ObSysVarOnUpdateFuncs() {} virtual ~ObSysVarOnUpdateFuncs() {} public: static int update_tx_isolation(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &val); static int update_tx_read_only_no_scope(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &val); static int update_sql_mode(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &val); static int update_safe_weak_read_snapshot(sql::ObExecContext &ctx, const ObSetVar &set_var, const ObBasicSysVar &sys_var, const common::ObObj &val); private: // start trans helper use by set transaction charactors static int start_trans_by_set_trans_char_( sql::ObExecContext &ctx); DISALLOW_COPY_AND_ASSIGN(ObSysVarOnUpdateFuncs); }; class ObSysVarToObjFuncs { public: ObSysVarToObjFuncs() {} virtual ~ObSysVarToObjFuncs() {} public: static int to_obj_charset(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObObj &result_obj); static int to_obj_collation(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObObj &result_obj); static int to_obj_sql_mode(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObObj &result_obj); private: DISALLOW_COPY_AND_ASSIGN(ObSysVarToObjFuncs); }; class ObSysVarToStrFuncs { public: ObSysVarToStrFuncs() {} virtual ~ObSysVarToStrFuncs() {} public: static int to_str_charset(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObString &result_str); static int to_str_collation(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObString &result_str); static int to_str_sql_mode(common::ObIAllocator &allocator, const sql::ObBasicSessionInfo &session, const ObBasicSysVar &sys_var, common::ObString &result_str); private: DISALLOW_COPY_AND_ASSIGN(ObSysVarToStrFuncs); }; class ObSysVarGetMetaTypeFuncs { public: ObSysVarGetMetaTypeFuncs() {} virtual ~ObSysVarGetMetaTypeFuncs() {} public: static common::ObObjType get_meta_type_varchar() { return common::ObVarcharType; } private: DISALLOW_COPY_AND_ASSIGN(ObSysVarGetMetaTypeFuncs); }; class ObSysVarSessionSpecialUpdateFuncs { public: ObSysVarSessionSpecialUpdateFuncs() {} virtual ~ObSysVarSessionSpecialUpdateFuncs() {} public: // @@identiy alias to @@last_insert_id static int update_identity(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); static int update_last_insert_id(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); // @@tx_isolation alias to @@transaction_isolation static int update_tx_isolation(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); // @@tx_read_only alias to @@transaction_read_only static int update_tx_read_only(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &val); private: DISALLOW_COPY_AND_ASSIGN(ObSysVarSessionSpecialUpdateFuncs); }; class ObCharsetSysVarPair { public: static const int64_t SYS_CHARSET_SYS_VAR_PAIR_COUNT = 3; static ObCharsetSysVarPair CHARSET_SYS_VAR_PAIRS[SYS_CHARSET_SYS_VAR_PAIR_COUNT]; ObCharsetSysVarPair(const common::ObString &cs_var_name, const common::ObString &coll_var_name) : cs_var_name_(cs_var_name), coll_var_name_(coll_var_name) { } ObCharsetSysVarPair(const char *cs_var_name, const char *coll_var_name) : cs_var_name_(common::ObString(cs_var_name)), coll_var_name_(common::ObString(coll_var_name)) { } virtual ~ObCharsetSysVarPair() {} static int get_charset_var_by_collation_var(const common::ObString &coll_var_name, common::ObString &cs_var_name); static int get_collation_var_by_charset_var(const common::ObString &cs_var_name, common::ObString &coll_var_name); private: common::ObString cs_var_name_; common::ObString coll_var_name_; private: DISALLOW_COPY_AND_ASSIGN(ObCharsetSysVarPair); }; class ObBinlogRowImage { public: enum ImageType { MINIMAL = 0, NOBLOB = 1, FULL = 2, }; ObBinlogRowImage() {} virtual ~ObBinlogRowImage() {} private: DISALLOW_COPY_AND_ASSIGN(ObBinlogRowImage); }; class ObPreProcessSysVars { public: ObPreProcessSysVars() {} virtual ~ObPreProcessSysVars() {} public: static int init_sys_var(); private: static int change_initial_value(); private: DISALLOW_COPY_AND_ASSIGN(ObPreProcessSysVars); }; class ObSysVarUtils { public: static int log_bounds_error_or_warning(sql::ObExecContext &ctx, const ObSetVar &set_var, const common::ObObj &in_val); private: DISALLOW_COPY_AND_ASSIGN(ObSysVarUtils); }; } } #endif //OCEANBASE_SQL_SESSION_OB_SYSTEM_VARIABLE_