Oracle syntax compatibility: alter system kill session
This commit is contained in:
@ -2250,6 +2250,7 @@ typedef enum ObItemType
|
||||
T_CONSTR_LOB_META_SIZE,
|
||||
T_LOB_META_SIZE,
|
||||
|
||||
T_ALTER_SYSTEM_KILL, // used to support kill session in oracle
|
||||
T_MAX //Attention: add a new type before T_MAX
|
||||
} ObItemType;
|
||||
|
||||
|
||||
@ -100,6 +100,14 @@ int ObKillSessionArg::calculate_sessid(ObExecContext &ctx, const ObKillStmt &stm
|
||||
LOG_WARN("fail to calc value", K(ret), K(stmt.get_value_expr()));
|
||||
} else {
|
||||
const ObObj *res_obj = NULL;
|
||||
if (stmt.is_alter_system_kill()) {
|
||||
ObString str = value_obj.get_string();
|
||||
const char* index = str.find(',');
|
||||
if (index != NULL) {
|
||||
str = str.split_on(index);
|
||||
}
|
||||
value_obj.set_string(value_obj.get_type(), str);
|
||||
}
|
||||
EXPR_DEFINE_CAST_CTX(expr_ctx, CM_WARN_ON_FAIL);
|
||||
EXPR_CAST_OBJ_V2(ObUInt32Type, value_obj, res_obj);
|
||||
ret = OB_ERR_TRUNCATED_WRONG_VALUE_FOR_FIELD == ret ? OB_SUCCESS : ret;
|
||||
|
||||
@ -2375,6 +2375,10 @@ int ObOraSysChecker::check_ora_ddl_priv(
|
||||
DEFINE_PUB_CHECK_CMD(PRIV_ID_ALTER_SYSTEM);
|
||||
break;
|
||||
}
|
||||
case stmt::T_KILL: {
|
||||
DEFINE_PUB_CHECK_CMD(PRIV_ID_ALTER_SYSTEM);
|
||||
break;
|
||||
}
|
||||
case stmt::T_CREATE_DBLINK: {
|
||||
DEFINE_PUB_CHECK_CMD(PRIV_ID_CREATE_DBLINK);
|
||||
break;
|
||||
|
||||
@ -39,6 +39,7 @@
|
||||
#include "share/backup/ob_backup_config.h"
|
||||
#include "observer/mysql/ob_query_response_time.h"
|
||||
#include "rootserver/ob_rs_job_table_operator.h" //ObRsJobType
|
||||
#include "sql/resolver/cmd/ob_kill_stmt.h"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
@ -3651,6 +3652,7 @@ int ObAlterSystemSetResolver::resolve(const ParseNode &parse_tree)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int ObArchiveLogResolver::resolve(const ParseNode &parse_tree)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
@ -196,6 +196,17 @@ private:
|
||||
const common::ObString &name_node, const common::ObString &value_node);
|
||||
};
|
||||
|
||||
class ObAlterSystemKillResolver : public ObSystemCmdResolver
|
||||
{
|
||||
public:
|
||||
ObAlterSystemKillResolver(ObResolverParams ¶ms) : ObSystemCmdResolver(params) {}
|
||||
virtual ~ObAlterSystemKillResolver() {}
|
||||
virtual int resolve(const ParseNode &parse_tree);
|
||||
private:
|
||||
int check_param_valid(int64_t tenant_id,
|
||||
const common::ObString &name_node, const common::ObString &value_node);
|
||||
};
|
||||
|
||||
class ObSetConfigResolver : public ObSystemCmdResolver
|
||||
{
|
||||
public:
|
||||
|
||||
@ -24,7 +24,7 @@ int ObKillResolver::resolve(const ParseNode &parse_tree)
|
||||
int ret = OB_SUCCESS;
|
||||
ObKillStmt *kill_stmt = NULL;
|
||||
ObRawExpr *tmp_expr = NULL;
|
||||
if (OB_UNLIKELY(parse_tree.type_ != T_KILL
|
||||
if (OB_UNLIKELY(!(parse_tree.type_ == T_KILL || parse_tree.type_ == T_ALTER_SYSTEM_KILL)
|
||||
|| parse_tree.num_child_ != 2
|
||||
|| NULL == parse_tree.children_[0]
|
||||
|| parse_tree.children_[0]->type_ != T_BOOL
|
||||
@ -36,9 +36,25 @@ int ObKillResolver::resolve(const ParseNode &parse_tree)
|
||||
LOG_ERROR("failed to create kill stmt");
|
||||
} else if (OB_FAIL(ObResolverUtils::resolve_const_expr(params_, *(parse_tree.children_[1]), tmp_expr, NULL))) {
|
||||
LOG_WARN("resolve const expr failed", K(ret));
|
||||
} else {
|
||||
} else if (parse_tree.type_ == T_KILL) {
|
||||
kill_stmt->set_is_query(1 == parse_tree.children_[0]->value_);
|
||||
kill_stmt->set_value_expr(tmp_expr);
|
||||
} else if (parse_tree.type_ == T_ALTER_SYSTEM_KILL) {
|
||||
if (1 == parse_tree.children_[0]->value_) {
|
||||
// TO DO.
|
||||
}
|
||||
kill_stmt->set_is_alter_system_kill(true);
|
||||
kill_stmt->set_value_expr(tmp_expr);
|
||||
if (OB_SUCC(ret) && ObSchemaChecker::is_ora_priv_check()) {
|
||||
CK (OB_NOT_NULL(schema_checker_));
|
||||
OZ (schema_checker_->check_ora_ddl_priv(
|
||||
session_info_->get_effective_tenant_id(),
|
||||
session_info_->get_priv_user_id(),
|
||||
ObString(""),
|
||||
stmt::T_KILL,
|
||||
session_info_->get_enable_role_array()),
|
||||
session_info_->get_effective_tenant_id(), session_info_->get_user_id());
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -23,6 +23,7 @@ class ObKillStmt : public ObCMDStmt
|
||||
public:
|
||||
ObKillStmt():ObCMDStmt(stmt::T_KILL),
|
||||
is_query_(false),
|
||||
is_alter_system_kill_(false),
|
||||
value_expr_(NULL)
|
||||
{
|
||||
}
|
||||
@ -31,15 +32,19 @@ public:
|
||||
}
|
||||
|
||||
inline void set_is_query(bool is_query) { is_query_ = is_query; }
|
||||
inline void set_is_alter_system_kill(bool is_alter_system_kill) { is_alter_system_kill_ = is_alter_system_kill; }
|
||||
inline void set_value_expr(ObRawExpr *value_expr) { value_expr_ = value_expr; }
|
||||
inline ObRawExpr *get_value_expr() const { return value_expr_; }
|
||||
inline bool is_query() const { return is_query_; }
|
||||
inline bool is_alter_system_kill() const { return is_alter_system_kill_; }
|
||||
private:
|
||||
bool is_query_;
|
||||
bool is_alter_system_kill_;
|
||||
ObRawExpr *value_expr_;
|
||||
DISALLOW_COPY_AND_ASSIGN(ObKillStmt);
|
||||
};
|
||||
|
||||
|
||||
} // sql
|
||||
} // oceanbase
|
||||
#endif
|
||||
|
||||
@ -744,6 +744,10 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS
|
||||
REGISTER_STMT_RESOLVER(AlterSystemSet);
|
||||
break;
|
||||
}
|
||||
case T_ALTER_SYSTEM_KILL: {
|
||||
REGISTER_STMT_RESOLVER(Kill);
|
||||
break;
|
||||
}
|
||||
case T_ALTER_SESSION_SET: {
|
||||
REGISTER_STMT_RESOLVER(AlterSessionSet);
|
||||
break;
|
||||
|
||||
@ -1895,6 +1895,10 @@ stmt::StmtType ObResolverUtils::get_stmt_type_by_item_type(const ObItemType item
|
||||
type = stmt::T_START_TRANS;
|
||||
}
|
||||
break;
|
||||
case T_ALTER_SYSTEM_KILL: {
|
||||
type = stmt::T_KILL;
|
||||
}
|
||||
break;
|
||||
case T_MULTI_INSERT: {
|
||||
type = stmt::T_INSERT;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user