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_CONSTR_LOB_META_SIZE,
|
||||||
T_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
|
T_MAX //Attention: add a new type before T_MAX
|
||||||
} ObItemType;
|
} 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()));
|
LOG_WARN("fail to calc value", K(ret), K(stmt.get_value_expr()));
|
||||||
} else {
|
} else {
|
||||||
const ObObj *res_obj = NULL;
|
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_DEFINE_CAST_CTX(expr_ctx, CM_WARN_ON_FAIL);
|
||||||
EXPR_CAST_OBJ_V2(ObUInt32Type, value_obj, res_obj);
|
EXPR_CAST_OBJ_V2(ObUInt32Type, value_obj, res_obj);
|
||||||
ret = OB_ERR_TRUNCATED_WRONG_VALUE_FOR_FIELD == ret ? OB_SUCCESS : ret;
|
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);
|
DEFINE_PUB_CHECK_CMD(PRIV_ID_ALTER_SYSTEM);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case stmt::T_KILL: {
|
||||||
|
DEFINE_PUB_CHECK_CMD(PRIV_ID_ALTER_SYSTEM);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case stmt::T_CREATE_DBLINK: {
|
case stmt::T_CREATE_DBLINK: {
|
||||||
DEFINE_PUB_CHECK_CMD(PRIV_ID_CREATE_DBLINK);
|
DEFINE_PUB_CHECK_CMD(PRIV_ID_CREATE_DBLINK);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -39,6 +39,7 @@
|
|||||||
#include "share/backup/ob_backup_config.h"
|
#include "share/backup/ob_backup_config.h"
|
||||||
#include "observer/mysql/ob_query_response_time.h"
|
#include "observer/mysql/ob_query_response_time.h"
|
||||||
#include "rootserver/ob_rs_job_table_operator.h" //ObRsJobType
|
#include "rootserver/ob_rs_job_table_operator.h" //ObRsJobType
|
||||||
|
#include "sql/resolver/cmd/ob_kill_stmt.h"
|
||||||
|
|
||||||
namespace oceanbase
|
namespace oceanbase
|
||||||
{
|
{
|
||||||
@ -3651,6 +3652,7 @@ int ObAlterSystemSetResolver::resolve(const ParseNode &parse_tree)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ObArchiveLogResolver::resolve(const ParseNode &parse_tree)
|
int ObArchiveLogResolver::resolve(const ParseNode &parse_tree)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
|
|||||||
@ -196,6 +196,17 @@ private:
|
|||||||
const common::ObString &name_node, const common::ObString &value_node);
|
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
|
class ObSetConfigResolver : public ObSystemCmdResolver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@ -24,7 +24,7 @@ int ObKillResolver::resolve(const ParseNode &parse_tree)
|
|||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
ObKillStmt *kill_stmt = NULL;
|
ObKillStmt *kill_stmt = NULL;
|
||||||
ObRawExpr *tmp_expr = 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
|
|| parse_tree.num_child_ != 2
|
||||||
|| NULL == parse_tree.children_[0]
|
|| NULL == parse_tree.children_[0]
|
||||||
|| parse_tree.children_[0]->type_ != T_BOOL
|
|| 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");
|
LOG_ERROR("failed to create kill stmt");
|
||||||
} else if (OB_FAIL(ObResolverUtils::resolve_const_expr(params_, *(parse_tree.children_[1]), tmp_expr, NULL))) {
|
} else if (OB_FAIL(ObResolverUtils::resolve_const_expr(params_, *(parse_tree.children_[1]), tmp_expr, NULL))) {
|
||||||
LOG_WARN("resolve const expr failed", K(ret));
|
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_is_query(1 == parse_tree.children_[0]->value_);
|
||||||
kill_stmt->set_value_expr(tmp_expr);
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,6 +23,7 @@ class ObKillStmt : public ObCMDStmt
|
|||||||
public:
|
public:
|
||||||
ObKillStmt():ObCMDStmt(stmt::T_KILL),
|
ObKillStmt():ObCMDStmt(stmt::T_KILL),
|
||||||
is_query_(false),
|
is_query_(false),
|
||||||
|
is_alter_system_kill_(false),
|
||||||
value_expr_(NULL)
|
value_expr_(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -31,15 +32,19 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline void set_is_query(bool is_query) { is_query_ = is_query; }
|
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 void set_value_expr(ObRawExpr *value_expr) { value_expr_ = value_expr; }
|
||||||
inline ObRawExpr *get_value_expr() const { return value_expr_; }
|
inline ObRawExpr *get_value_expr() const { return value_expr_; }
|
||||||
inline bool is_query() const { return is_query_; }
|
inline bool is_query() const { return is_query_; }
|
||||||
|
inline bool is_alter_system_kill() const { return is_alter_system_kill_; }
|
||||||
private:
|
private:
|
||||||
bool is_query_;
|
bool is_query_;
|
||||||
|
bool is_alter_system_kill_;
|
||||||
ObRawExpr *value_expr_;
|
ObRawExpr *value_expr_;
|
||||||
DISALLOW_COPY_AND_ASSIGN(ObKillStmt);
|
DISALLOW_COPY_AND_ASSIGN(ObKillStmt);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // sql
|
} // sql
|
||||||
} // oceanbase
|
} // oceanbase
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -744,6 +744,10 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS
|
|||||||
REGISTER_STMT_RESOLVER(AlterSystemSet);
|
REGISTER_STMT_RESOLVER(AlterSystemSet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case T_ALTER_SYSTEM_KILL: {
|
||||||
|
REGISTER_STMT_RESOLVER(Kill);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case T_ALTER_SESSION_SET: {
|
case T_ALTER_SESSION_SET: {
|
||||||
REGISTER_STMT_RESOLVER(AlterSessionSet);
|
REGISTER_STMT_RESOLVER(AlterSessionSet);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -1895,6 +1895,10 @@ stmt::StmtType ObResolverUtils::get_stmt_type_by_item_type(const ObItemType item
|
|||||||
type = stmt::T_START_TRANS;
|
type = stmt::T_START_TRANS;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case T_ALTER_SYSTEM_KILL: {
|
||||||
|
type = stmt::T_KILL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case T_MULTI_INSERT: {
|
case T_MULTI_INSERT: {
|
||||||
type = stmt::T_INSERT;
|
type = stmt::T_INSERT;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user