[CP] bugfix: create force view on set query even when resolve failed

This commit is contained in:
dontknow9179 2024-05-23 05:37:18 +00:00 committed by ob-robot
parent 7e0254fd00
commit 80741a994a

View File

@ -291,8 +291,13 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(view_table_resolver.get_select_stmt()));
} else if (OB_ISNULL(select_stmt->get_real_stmt())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get real stmt", K(ret), K(*select_stmt));
if (!resolve_succ) {
//if set query resolve failed, child stmt is null
//do not persist column schema
} else {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get real stmt", K(ret), KPC(select_stmt));
}
} else if (OB_FAIL(check_view_columns(*select_stmt,
view_columns_node,
create_arg.error_info_,
@ -318,6 +323,8 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
table_schema,
column_list))) {
LOG_WARN("failed to add undefined column infos", K(ret));
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(collect_dependency_infos(params_.query_ctx_, create_arg))) {
LOG_WARN("failed to collect dependency infos", K(ret));
} else if (is_force_view && (!resolve_succ || add_undefined_columns)
@ -369,7 +376,7 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
// In mysql mode, only support create view as ... with check option in syntax.
// In oracle mode, support create view v as (select * from (select * from t with check option))
// so we have to check in oracle mode even if check_option of view_schema is NONE.
if ((with_check_option || lib::is_oracle_mode())
if ((with_check_option || lib::is_oracle_mode()) && !(select_stmt == NULL && !resolve_succ)
&& OB_FAIL(ObResolverUtils::view_with_check_option_allowed(select_stmt,
with_check_option))) {
LOG_WARN("view with check option not allowed", K(ret));
@ -441,6 +448,7 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
// 权限添加需要拿到完整stmt信息,慎重调整本段代码位置
if (OB_SUCC(ret) && !(is_sync_ddl_user && session_info_->is_inner())
&& !(select_stmt == NULL && !resolve_succ)
&& OB_FAIL(check_privilege_needed(*stmt, *select_stmt, is_force_view))) {
LOG_WARN("fail to check privilege needed", K(ret));
}