[CP] [CP] support desc view with dblink tables

This commit is contained in:
sdc 2023-06-01 11:17:36 +00:00 committed by ob-robot
parent cfb482ba27
commit 8684c5cd8b

View File

@ -907,79 +907,85 @@ int ObTableColumns::resolve_view_definition(
LOG_WARN("parse view definition failed", K(select_sql), K(ret));
} else {
ObSchemaChecker schema_checker;
if (OB_FAIL(schema_checker.init(const_cast<ObSchemaGetterGuard &>(*schema_guard)))) {
LOG_WARN("fail to init schema checker", K(ret));
ObResolverParams resolver_ctx;
resolver_ctx.allocator_ = allocator;
resolver_ctx.schema_checker_ = &schema_checker;
resolver_ctx.session_info_ = const_cast<ObSQLSessionInfo*>(session);
resolver_ctx.expr_factory_ = &expr_factory;
resolver_ctx.stmt_factory_ = &stmt_factory;
resolver_ctx.sql_proxy_ = GCTX.sql_proxy_;
if (OB_ISNULL(resolver_ctx.query_ctx_ = stmt_factory.get_query_ctx())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("create query context failed", K(ret));
} else {
ObResolverParams resolver_ctx;
resolver_ctx.allocator_ = allocator;
resolver_ctx.schema_checker_ = &schema_checker;
resolver_ctx.session_info_ = const_cast<ObSQLSessionInfo*>(session);
resolver_ctx.expr_factory_ = &expr_factory;
resolver_ctx.stmt_factory_ = &stmt_factory;
resolver_ctx.sql_proxy_ = GCTX.sql_proxy_;
if (OB_ISNULL(resolver_ctx.query_ctx_ = stmt_factory.get_query_ctx())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("create query context failed", K(ret));
// set # of question marks
resolver_ctx.query_ctx_->question_marks_count_ = static_cast<int64_t> (parse_result.question_mark_ctx_.count_);
resolver_ctx.query_ctx_->sql_schema_guard_.set_schema_guard(schema_guard);
uint64_t session_id = 0;
if (session->get_session_type() != ObSQLSessionInfo::INNER_SESSION) {
session_id = session->get_sessid_for_table();
} else {
// set # of question marks
resolver_ctx.query_ctx_->question_marks_count_ = static_cast<int64_t> (parse_result.question_mark_ctx_.count_);
session_id = OB_INVALID_ID;
}
if (OB_SUCC(ret)) {
ObSelectResolver select_resolver(resolver_ctx);
ParseNode *select_stmt_node = parse_result.result_tree_->children_[0];
if (OB_UNLIKELY(NULL == select_stmt_node || select_stmt_node->type_ != T_SELECT)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid select_stmt_node", K(ret), K(select_stmt_node),
K(select_stmt_node->type_));
} else if (OB_FAIL(select_resolver.resolve(*select_stmt_node))) {
LOG_WARN("resolve view definition failed", K(ret));
if (can_rewrite_error_code(ret)) {
ret = OB_ERR_VIEW_INVALID;
} else {
LOG_WARN("failed to resolve view", K(ret));
}
if (throw_error) {
LOG_USER_ERROR(OB_ERR_VIEW_INVALID, db_name.length(), db_name.ptr(),
table_name.length(), table_name.ptr());
} else {
LOG_USER_WARN(OB_ERR_VIEW_INVALID, db_name.length(), db_name.ptr(),
table_name.length(), table_name.ptr());
}
} else if (OB_UNLIKELY(NULL == select_resolver.get_basic_stmt())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid stmt", K(ret));
if (OB_FAIL(resolver_ctx.schema_checker_->init(resolver_ctx.query_ctx_->sql_schema_guard_, session_id))) {
LOG_WARN("init schema checker failed", K(ret));
}
}
if (OB_SUCC(ret)) {
ObSelectResolver select_resolver(resolver_ctx);
ParseNode *select_stmt_node = parse_result.result_tree_->children_[0];
if (OB_UNLIKELY(NULL == select_stmt_node || select_stmt_node->type_ != T_SELECT)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid select_stmt_node", K(ret), K(select_stmt_node),
K(select_stmt_node->type_));
} else if (OB_FAIL(select_resolver.resolve(*select_stmt_node))) {
LOG_WARN("resolve view definition failed", K(ret));
if (can_rewrite_error_code(ret)) {
ret = OB_ERR_VIEW_INVALID;
} else {
// 取出视图展开后的stmt
select_stmt = static_cast<ObSelectStmt*>(select_resolver.get_basic_stmt());
TableItem *view_item = NULL;
if (OB_UNLIKELY(select_stmt->get_table_size() != 1)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("table count should equals 1", K(ret));
} else if (OB_ISNULL(view_item = select_stmt->get_table_item(0))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("view item is null");
} else if (OB_UNLIKELY(NULL == (select_stmt = static_cast<ObSelectStmt*>(view_item->ref_query_)))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("select_stmt should not NULL", K(ret));
} else { /*do-nothing*/ }
LOG_WARN("failed to resolve view", K(ret));
}
}
int tmp_ret = OB_SUCCESS;
bool reset_column_infos = (OB_SUCCESS == ret) ? false : (lib::is_oracle_mode() ? true : false);
if (OB_UNLIKELY(OB_SUCCESS != ret && OB_ERR_VIEW_INVALID != ret)) {
LOG_WARN("failed to resolve view", K(ret));
} else if (OB_UNLIKELY(OB_ERR_VIEW_INVALID == ret && lib::is_mysql_mode())) {
// do nothing
} else if (OB_SUCCESS != (tmp_ret = ObSQLUtils::async_recompile_view(table_schema, select_stmt, reset_column_infos, *allocator, *session))) {
LOG_WARN("failed to add recompile view task", K(tmp_ret));
if (OB_ERR_TOO_LONG_COLUMN_LENGTH == tmp_ret) {
tmp_ret = OB_SUCCESS; //ignore
if (throw_error) {
LOG_USER_ERROR(OB_ERR_VIEW_INVALID, db_name.length(), db_name.ptr(),
table_name.length(), table_name.ptr());
} else {
LOG_USER_WARN(OB_ERR_VIEW_INVALID, db_name.length(), db_name.ptr(),
table_name.length(), table_name.ptr());
}
} else if (OB_UNLIKELY(NULL == select_resolver.get_basic_stmt())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid stmt", K(ret));
} else {
// 取出视图展开后的stmt
select_stmt = static_cast<ObSelectStmt*>(select_resolver.get_basic_stmt());
TableItem *view_item = NULL;
if (OB_UNLIKELY(select_stmt->get_table_size() != 1)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("table count should equals 1", K(ret));
} else if (OB_ISNULL(view_item = select_stmt->get_table_item(0))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("view item is null");
} else if (OB_UNLIKELY(NULL == (select_stmt = static_cast<ObSelectStmt*>(view_item->ref_query_)))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("select_stmt should not NULL", K(ret));
} else { /*do-nothing*/ }
}
if (OB_SUCCESS == ret) {
ret = tmp_ret;
}
int tmp_ret = OB_SUCCESS;
bool reset_column_infos = (OB_SUCCESS == ret) ? false : (lib::is_oracle_mode() ? true : false);
if (OB_UNLIKELY(OB_SUCCESS != ret && OB_ERR_VIEW_INVALID != ret)) {
LOG_WARN("failed to resolve view", K(ret));
} else if (OB_UNLIKELY(OB_ERR_VIEW_INVALID == ret && lib::is_mysql_mode())) {
// do nothing
} else if (OB_SUCCESS != (tmp_ret = ObSQLUtils::async_recompile_view(table_schema, select_stmt, reset_column_infos, *allocator, *session))) {
LOG_WARN("failed to add recompile view task", K(tmp_ret));
if (OB_ERR_TOO_LONG_COLUMN_LENGTH == tmp_ret) {
tmp_ret = OB_SUCCESS; //ignore
}
}
if (OB_SUCCESS == ret) {
ret = tmp_ret;
}
}
}
}