fix set global variables bug in oracle mode

This commit is contained in:
jingtaoye35
2023-08-02 00:42:19 +00:00
committed by ob-robot
parent 4f9aabfc63
commit 03932bf4ca
2 changed files with 20 additions and 2 deletions

View File

@ -2408,6 +2408,10 @@ int ObOraSysChecker::check_ora_ddl_priv(
DEFINE_PUB_CHECK_CMD(PRIV_ID_DROP_ANY_CONTEXT); DEFINE_PUB_CHECK_CMD(PRIV_ID_DROP_ANY_CONTEXT);
break; break;
} }
case stmt::T_VARIABLE_SET: {
DEFINE_PUB_CHECK_CMD(PRIV_ID_ALTER_SYSTEM);
break;
}
default: { default: {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("stmt type ddl priv undefined", K(stmt_type)); LOG_WARN("stmt type ddl priv undefined", K(stmt_type));

View File

@ -41,9 +41,10 @@ int ObVariableSetResolver::resolve(const ParseNode &parse_tree)
if (OB_UNLIKELY(T_VARIABLE_SET != parse_tree.type_)) { if (OB_UNLIKELY(T_VARIABLE_SET != parse_tree.type_)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("parse_tree.type_ must be T_VARIABLE_SET", K(ret), K(parse_tree.type_)); LOG_WARN("parse_tree.type_ must be T_VARIABLE_SET", K(ret), K(parse_tree.type_));
} else if (OB_ISNULL(session_info_) || OB_ISNULL(allocator_)) { } else if (OB_ISNULL(session_info_) || OB_ISNULL(allocator_) || OB_ISNULL(schema_checker_)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_ERROR("session_info_ or allocator_ is NULL", K(ret), K(session_info_), K(allocator_)); LOG_ERROR("session_info_ or allocator_ is NULL", K(ret), K(session_info_), K(allocator_),
K(schema_checker_));
} else if (OB_ISNULL(variable_set_stmt = create_stmt<ObVariableSetStmt>())) { } else if (OB_ISNULL(variable_set_stmt = create_stmt<ObVariableSetStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED; ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_ERROR("create variable set stmt failed", K(ret)); LOG_ERROR("create variable set stmt failed", K(ret));
@ -185,6 +186,19 @@ int ObVariableSetResolver::resolve(const ParseNode &parse_tree)
} }
} }
} }
/* set global variable need 'alter system' priv*/
if (OB_SUCC(ret) &&
ObSchemaChecker::is_ora_priv_check() && variable_set_stmt->has_global_variable()) {
if (OB_FAIL(schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(),
session_info_->get_priv_user_id(),
ObString(""),
stmt::T_VARIABLE_SET,
session_info_->get_enable_role_array()))) {
LOG_WARN("failed to check privilege", K(session_info_->get_effective_tenant_id()),
K(session_info_->get_priv_user_id()));
}
}
} }
return ret; return ret;
} }