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

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()));
} 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;

View File

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

View File

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

View File

@ -196,6 +196,17 @@ private:
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
{
public:

View File

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

View File

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

View File

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

View File

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