Files
oceanbase/src/share/system_variable/ob_system_variable.h
2023-04-30 04:41:31 +00:00

1082 lines
44 KiB
C++

/**
* 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_