Oracle syntax compatibility: alter system kill session

This commit is contained in:
yaojing624
2023-07-13 13:12:20 +00:00
committed by ob-robot
parent 63d1fb2cb8
commit a8b35aca3d
9 changed files with 57 additions and 2 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 &params) : 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:

View File

@ -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;
} }

View File

@ -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

View File

@ -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;

View File

@ -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;
} }