From a8b35aca3daea5907881ebc5a1ec93dc81c9826f Mon Sep 17 00:00:00 2001 From: yaojing624 Date: Thu, 13 Jul 2023 13:12:20 +0000 Subject: [PATCH] Oracle syntax compatibility: alter system kill session --- src/objit/include/objit/common/ob_item_type.h | 1 + src/sql/engine/cmd/ob_kill_session_arg.cpp | 8 ++++++++ src/sql/privilege_check/ob_ora_priv_check.cpp | 4 ++++ .../resolver/cmd/ob_alter_system_resolver.cpp | 2 ++ .../resolver/cmd/ob_alter_system_resolver.h | 11 ++++++++++ src/sql/resolver/cmd/ob_kill_resolver.cpp | 20 +++++++++++++++++-- src/sql/resolver/cmd/ob_kill_stmt.h | 5 +++++ src/sql/resolver/ob_resolver.cpp | 4 ++++ src/sql/resolver/ob_resolver_utils.cpp | 4 ++++ 9 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/objit/include/objit/common/ob_item_type.h b/src/objit/include/objit/common/ob_item_type.h index 0ef57686dd..808ea2f93a 100755 --- a/src/objit/include/objit/common/ob_item_type.h +++ b/src/objit/include/objit/common/ob_item_type.h @@ -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; diff --git a/src/sql/engine/cmd/ob_kill_session_arg.cpp b/src/sql/engine/cmd/ob_kill_session_arg.cpp index 0a16b6a161..eb1245197e 100644 --- a/src/sql/engine/cmd/ob_kill_session_arg.cpp +++ b/src/sql/engine/cmd/ob_kill_session_arg.cpp @@ -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; diff --git a/src/sql/privilege_check/ob_ora_priv_check.cpp b/src/sql/privilege_check/ob_ora_priv_check.cpp index cef6f8b25f..1d2a47bb27 100644 --- a/src/sql/privilege_check/ob_ora_priv_check.cpp +++ b/src/sql/privilege_check/ob_ora_priv_check.cpp @@ -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; diff --git a/src/sql/resolver/cmd/ob_alter_system_resolver.cpp b/src/sql/resolver/cmd/ob_alter_system_resolver.cpp index a4a768c711..ba2dae1899 100644 --- a/src/sql/resolver/cmd/ob_alter_system_resolver.cpp +++ b/src/sql/resolver/cmd/ob_alter_system_resolver.cpp @@ -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; diff --git a/src/sql/resolver/cmd/ob_alter_system_resolver.h b/src/sql/resolver/cmd/ob_alter_system_resolver.h index b6e98391cf..e571622129 100644 --- a/src/sql/resolver/cmd/ob_alter_system_resolver.h +++ b/src/sql/resolver/cmd/ob_alter_system_resolver.h @@ -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: diff --git a/src/sql/resolver/cmd/ob_kill_resolver.cpp b/src/sql/resolver/cmd/ob_kill_resolver.cpp index 0ea7958b53..11d4b81922 100644 --- a/src/sql/resolver/cmd/ob_kill_resolver.cpp +++ b/src/sql/resolver/cmd/ob_kill_resolver.cpp @@ -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; } diff --git a/src/sql/resolver/cmd/ob_kill_stmt.h b/src/sql/resolver/cmd/ob_kill_stmt.h index 255ad1571f..b97293614f 100644 --- a/src/sql/resolver/cmd/ob_kill_stmt.h +++ b/src/sql/resolver/cmd/ob_kill_stmt.h @@ -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 diff --git a/src/sql/resolver/ob_resolver.cpp b/src/sql/resolver/ob_resolver.cpp index 5d954f8ec6..6af078904c 100644 --- a/src/sql/resolver/ob_resolver.cpp +++ b/src/sql/resolver/ob_resolver.cpp @@ -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; diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index 8dab4a70c8..bf96794cd6 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -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; }