[FEAT MERGE] patch 423 sql compatible features to 432
Co-authored-by: akaError <lzg020616@163.com> Co-authored-by: JinmaoLi <ljm.csmaster@gmail.com> Co-authored-by: qingzhu521 <q15000557748@gmail.com>
This commit is contained in:
@ -23,6 +23,10 @@
|
||||
#include "sql/resolver/ddl/ob_drop_mlog_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_create_database_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_alter_table_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_sequence_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_create_outline_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_alter_outline_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_drop_outline_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_drop_database_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_drop_index_stmt.h"
|
||||
#include "sql/resolver/ddl/ob_lock_tenant_stmt.h"
|
||||
@ -584,7 +588,7 @@ int set_privs_by_table_item_recursively(
|
||||
bool need_check = true;
|
||||
if (is_sys_view(table_item->ref_id_)) {
|
||||
/* oracle的字典视图(dba_*)需要做检查,其他系统视图(all_*, user_*, 性能视图(v$)不做权限检查 */
|
||||
need_check = table_item->is_oracle_dba_sys_view();
|
||||
need_check = table_item->is_oracle_dba_sys_view() || (OB_PROXY_USERS_TID == table_item->ref_id_);
|
||||
} else {
|
||||
need_check = true;
|
||||
}
|
||||
@ -1416,6 +1420,197 @@ int get_drop_table_stmt_need_privs(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_create_sequence_stmt_need_privs(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
ObIArray<ObNeedPriv> &need_privs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObNeedPriv need_priv;
|
||||
bool need_check = false;
|
||||
if (OB_ISNULL(basic_stmt)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Basic stmt should be not be NULL", K(ret));
|
||||
} else if (OB_UNLIKELY(stmt::T_CREATE_SEQUENCE != basic_stmt->get_stmt_type())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Stmt type should be T_CREATE_SEQUENCE", K(ret), "stmt type", basic_stmt->get_stmt_type());
|
||||
} else if (OB_FAIL(ObPrivilegeCheck::get_priv_need_check(session_priv,
|
||||
ObCompatFeatureType::MYSQL_PRIV_ENHANCE, need_check))) {
|
||||
LOG_WARN("failed to get priv need check", K(ret));
|
||||
} else if (lib::is_mysql_mode() && need_check) {
|
||||
const ObCreateSequenceStmt *stmt = static_cast<const ObCreateSequenceStmt*>(basic_stmt);
|
||||
if (OB_FAIL(ObPrivilegeCheck::can_do_operation_on_db(session_priv,
|
||||
stmt->get_arg().get_database_name()))) {
|
||||
LOG_WARN("Can not create sequence in current database", K(session_priv), K(ret));
|
||||
} else {
|
||||
need_priv.db_ = stmt->get_arg().get_database_name();
|
||||
need_priv.priv_set_ = OB_PRIV_CREATE;
|
||||
need_priv.priv_level_ = OB_PRIV_DB_LEVEL;
|
||||
ADD_NEED_PRIV(need_priv);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_alter_sequence_stmt_need_privs(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
ObIArray<ObNeedPriv> &need_privs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObNeedPriv need_priv;
|
||||
bool need_check = false;
|
||||
if (OB_ISNULL(basic_stmt)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Basic stmt should be not be NULL", K(ret));
|
||||
} else if (OB_UNLIKELY(stmt::T_ALTER_SEQUENCE != basic_stmt->get_stmt_type())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Stmt type should be T_ALTER_SEQUENCE", K(ret), "stmt type", basic_stmt->get_stmt_type());
|
||||
} else if (OB_FAIL(ObPrivilegeCheck::get_priv_need_check(session_priv,
|
||||
ObCompatFeatureType::MYSQL_PRIV_ENHANCE, need_check))) {
|
||||
LOG_WARN("failed to get priv need check", K(ret));
|
||||
} else if (lib::is_mysql_mode() && need_check) {
|
||||
const ObAlterSequenceStmt *stmt = static_cast<const ObAlterSequenceStmt*>(basic_stmt);
|
||||
if (OB_FAIL(ObPrivilegeCheck::can_do_operation_on_db(session_priv,
|
||||
stmt->get_arg().get_database_name()))) {
|
||||
LOG_WARN("Can not alter sequence in current database", K(session_priv), K(ret));
|
||||
} else {
|
||||
need_priv.db_ = stmt->get_arg().get_database_name();
|
||||
need_priv.priv_set_ = OB_PRIV_ALTER;
|
||||
need_priv.priv_level_ = OB_PRIV_DB_LEVEL;
|
||||
ADD_NEED_PRIV(need_priv);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_drop_sequence_stmt_need_privs(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
ObIArray<ObNeedPriv> &need_privs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObNeedPriv need_priv;
|
||||
bool need_check = false;
|
||||
if (OB_ISNULL(basic_stmt)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Basic stmt should be not be NULL", K(ret));
|
||||
} else if (OB_UNLIKELY(stmt::T_DROP_SEQUENCE != basic_stmt->get_stmt_type())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Stmt type should be T_DROP_SEQUENCE", K(ret), "stmt type", basic_stmt->get_stmt_type());
|
||||
} else if (OB_FAIL(ObPrivilegeCheck::get_priv_need_check(session_priv,
|
||||
ObCompatFeatureType::MYSQL_PRIV_ENHANCE, need_check))) {
|
||||
LOG_WARN("failed to get priv need check", K(ret));
|
||||
} else if (lib::is_mysql_mode() && need_check) {
|
||||
const ObDropSequenceStmt *stmt = static_cast<const ObDropSequenceStmt*>(basic_stmt);
|
||||
if (OB_FAIL(ObPrivilegeCheck::can_do_operation_on_db(session_priv,
|
||||
stmt->get_arg().get_database_name()))) {
|
||||
LOG_WARN("Can not drop sequence in current database", K(session_priv), K(ret));
|
||||
} else {
|
||||
need_priv.db_ = stmt->get_arg().get_database_name();
|
||||
need_priv.priv_set_ = OB_PRIV_DROP;
|
||||
need_priv.priv_level_ = OB_PRIV_DB_LEVEL;
|
||||
ADD_NEED_PRIV(need_priv);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_create_outline_stmt_need_privs(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
ObIArray<ObNeedPriv> &need_privs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObNeedPriv need_priv;
|
||||
bool need_check = false;
|
||||
if (OB_ISNULL(basic_stmt)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Basic stmt should be not be NULL", K(ret));
|
||||
} else if (OB_UNLIKELY(stmt::T_CREATE_OUTLINE != basic_stmt->get_stmt_type())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Stmt type should be T_CREATE_OUTLINE", K(ret), "stmt type", basic_stmt->get_stmt_type());
|
||||
} else if (OB_FAIL(ObPrivilegeCheck::get_priv_need_check(session_priv,
|
||||
ObCompatFeatureType::MYSQL_PRIV_ENHANCE, need_check))) {
|
||||
LOG_WARN("failed to get priv need check", K(ret));
|
||||
} else if (lib::is_mysql_mode() && need_check) {
|
||||
const ObCreateOutlineStmt *stmt = static_cast<const ObCreateOutlineStmt*>(basic_stmt);
|
||||
if (OB_FAIL(ObPrivilegeCheck::can_do_operation_on_db(session_priv,
|
||||
stmt->get_create_outline_arg().db_name_))) {
|
||||
LOG_WARN("Can not create outline in current database", K(session_priv), K(ret));
|
||||
} else {
|
||||
need_priv.db_ = stmt->get_create_outline_arg().db_name_;
|
||||
need_priv.priv_set_ = OB_PRIV_CREATE;
|
||||
need_priv.priv_level_ = OB_PRIV_DB_LEVEL;
|
||||
ADD_NEED_PRIV(need_priv);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_alter_outline_stmt_need_privs(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
ObIArray<ObNeedPriv> &need_privs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObNeedPriv need_priv;
|
||||
bool need_check = false;
|
||||
if (OB_ISNULL(basic_stmt)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Basic stmt should be not be NULL", K(ret));
|
||||
} else if (OB_UNLIKELY(stmt::T_ALTER_OUTLINE != basic_stmt->get_stmt_type())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Stmt type should be T_ALTER_OUTLINE", K(ret), "stmt type", basic_stmt->get_stmt_type());
|
||||
} else if (OB_FAIL(ObPrivilegeCheck::get_priv_need_check(session_priv,
|
||||
ObCompatFeatureType::MYSQL_PRIV_ENHANCE, need_check))) {
|
||||
LOG_WARN("failed to get priv need check", K(ret));
|
||||
} else if (lib::is_mysql_mode() && need_check) {
|
||||
const ObAlterOutlineStmt *stmt = static_cast<const ObAlterOutlineStmt*>(basic_stmt);
|
||||
if (OB_FAIL(ObPrivilegeCheck::can_do_operation_on_db(session_priv,
|
||||
stmt->get_alter_outline_arg().db_name_))) {
|
||||
LOG_WARN("Can not alter outline in current database", K(session_priv), K(ret));
|
||||
} else {
|
||||
need_priv.db_ = stmt->get_alter_outline_arg().db_name_;
|
||||
need_priv.priv_set_ = OB_PRIV_ALTER;
|
||||
need_priv.priv_level_ = OB_PRIV_DB_LEVEL;
|
||||
ADD_NEED_PRIV(need_priv);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_drop_outline_stmt_need_privs(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
ObIArray<ObNeedPriv> &need_privs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObNeedPriv need_priv;
|
||||
bool need_check = false;
|
||||
if (OB_ISNULL(basic_stmt)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Basic stmt should be not be NULL", K(ret));
|
||||
} else if (OB_UNLIKELY(stmt::T_DROP_OUTLINE != basic_stmt->get_stmt_type())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Stmt type should be T_DROP_OUTLINE", K(ret), "stmt type", basic_stmt->get_stmt_type());
|
||||
} else if (OB_FAIL(ObPrivilegeCheck::get_priv_need_check(session_priv,
|
||||
ObCompatFeatureType::MYSQL_PRIV_ENHANCE, need_check))) {
|
||||
LOG_WARN("failed to get priv need check", K(ret));
|
||||
} else if (lib::is_mysql_mode() && need_check) {
|
||||
const ObDropOutlineStmt *stmt = static_cast<const ObDropOutlineStmt*>(basic_stmt);
|
||||
if (OB_FAIL(ObPrivilegeCheck::can_do_operation_on_db(session_priv,
|
||||
stmt->get_drop_outline_arg().db_name_))) {
|
||||
LOG_WARN("Can not drop outline in current database", K(session_priv), K(ret));
|
||||
} else {
|
||||
need_priv.db_ = stmt->get_drop_outline_arg().db_name_;
|
||||
need_priv.priv_set_ = OB_PRIV_DROP;
|
||||
need_priv.priv_level_ = OB_PRIV_DB_LEVEL;
|
||||
ADD_NEED_PRIV(need_priv);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_create_synonym_priv(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
@ -1442,6 +1637,33 @@ int get_create_synonym_priv(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_create_tablespace_priv(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
ObIArray<ObNeedPriv> &need_privs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObNeedPriv need_priv;
|
||||
bool need_check = false;
|
||||
if (OB_ISNULL(basic_stmt)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Basic stmt should be not be NULL", K(ret));
|
||||
} else if (OB_UNLIKELY(stmt::T_CREATE_TABLESPACE != basic_stmt->get_stmt_type()
|
||||
&& stmt::T_DROP_TABLESPACE != basic_stmt->get_stmt_type()
|
||||
&& stmt::T_ALTER_TABLESPACE != basic_stmt->get_stmt_type())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected stmt type", K(basic_stmt->get_stmt_type()), K(ret));
|
||||
} else if (OB_FAIL(ObPrivilegeCheck::get_priv_need_check(session_priv,
|
||||
ObCompatFeatureType::MYSQL_PRIV_ENHANCE, need_check))) {
|
||||
LOG_WARN("failed to get priv need check", K(ret));
|
||||
} else if (lib::is_mysql_mode() && need_check) {
|
||||
need_priv.priv_set_ = OB_PRIV_CREATE_TABLESPACE;
|
||||
need_priv.priv_level_ = OB_PRIV_USER_LEVEL;
|
||||
ADD_NEED_PRIV(need_priv);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_create_dblink_priv(
|
||||
const ObSessionPrivInfo &session_priv,
|
||||
const ObStmt *basic_stmt,
|
||||
@ -1806,6 +2028,7 @@ int get_create_user_privs(
|
||||
switch (stmt_type) {//TODO deleted switch
|
||||
case stmt::T_LOCK_USER :
|
||||
case stmt::T_ALTER_USER_PROFILE :
|
||||
case stmt::T_ALTER_USER_PROXY :
|
||||
case stmt::T_ALTER_USER_PRIMARY_ZONE:
|
||||
case stmt::T_ALTER_USER:
|
||||
case stmt::T_SET_PASSWORD :
|
||||
@ -2761,8 +2984,8 @@ int ObPrivilegeCheck::check_privilege_new(
|
||||
common::ObSEArray<ObNeedPriv, 4> tmp_need_privs;
|
||||
common::ObSEArray<ObOraNeedPriv, 4> tmp_ora_need_privs;
|
||||
ObSessionPrivInfo session_priv;
|
||||
ctx.session_info_->get_session_priv_info(session_priv);
|
||||
session_priv.set_effective_tenant_id(ctx.session_info_->get_effective_tenant_id());
|
||||
OZ (ctx.session_info_->get_session_priv_info(session_priv));
|
||||
OX (session_priv.set_effective_tenant_id(ctx.session_info_->get_effective_tenant_id()));
|
||||
OZ (get_stmt_need_privs(session_priv, basic_stmt, tmp_need_privs));
|
||||
OZ (stmt_need_privs.need_privs_.assign(tmp_need_privs));
|
||||
/* set user id=-1, means: use current user executing sql and can change
|
||||
@ -2853,9 +3076,11 @@ int ObPrivilegeCheck::check_privilege(
|
||||
if (OB_SUCC(ret)) {
|
||||
common::ObSEArray<ObNeedPriv, 4> tmp_need_privs;
|
||||
ObSessionPrivInfo session_priv;
|
||||
ctx.session_info_->get_session_priv_info(session_priv);
|
||||
session_priv.set_effective_tenant_id(ctx.session_info_->get_effective_tenant_id());
|
||||
if (OB_FAIL(get_stmt_need_privs(session_priv, basic_stmt, tmp_need_privs))) {
|
||||
if (OB_FAIL(ctx.session_info_->get_session_priv_info(session_priv))) {
|
||||
LOG_WARN("fail to get session priv info", K(ret));
|
||||
} else if (FALSE_IT(session_priv.set_effective_tenant_id(
|
||||
ctx.session_info_->get_effective_tenant_id()))) {
|
||||
} else if (OB_FAIL(get_stmt_need_privs(session_priv, basic_stmt, tmp_need_privs))) {
|
||||
LOG_WARN("Get stmt need privs error", K(ret));
|
||||
} else if (OB_FAIL(stmt_need_privs.need_privs_.assign(tmp_need_privs))) {
|
||||
LOG_WARN("fail to assign need_privs", K(ret));
|
||||
@ -2908,8 +3133,9 @@ int ObPrivilegeCheck::check_privilege(
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("Session is NULL");
|
||||
} else {
|
||||
ctx.session_info_->get_session_priv_info(session_priv);
|
||||
if (ctx.session_info_->get_user_id() != ctx.session_info_->get_priv_user_id()
|
||||
if (OB_FAIL(ctx.session_info_->get_session_priv_info(session_priv))) {
|
||||
LOG_WARN("fail to get session priv info", K(ret));
|
||||
} else if (ctx.session_info_->get_user_id() != ctx.session_info_->get_priv_user_id()
|
||||
&& OB_FAIL(adjust_session_priv(*ctx.schema_guard_, session_priv))) {
|
||||
LOG_WARN("fail to assign enable role id array", K(ret));
|
||||
} else if (OB_UNLIKELY(!session_priv.is_valid())) {
|
||||
@ -3799,6 +4025,17 @@ int ObPrivilegeCheck::check_priv_in_roles(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObPrivilegeCheck::get_priv_need_check(const ObSessionPrivInfo &session_priv,
|
||||
const ObCompatFeatureType feature_type,
|
||||
bool &need_check)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_FAIL(ObCompatControl::check_feature_enable(session_priv.security_version_,
|
||||
feature_type, need_check))) {
|
||||
LOG_WARN("failed to check feature enable", K(ret), K(feature_type));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#undef ADD_NEED_PRIV
|
||||
|
||||
|
||||
Reference in New Issue
Block a user