fix case failed cause by information_schema enhance

This commit is contained in:
obdev
2023-02-07 11:52:26 +08:00
committed by ob-robot
parent e9b85c65a0
commit de327e58f9
14 changed files with 119 additions and 40 deletions

View File

@ -177,10 +177,13 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
} else if (OB_ISNULL(select_stmt = view_table_resolver.get_select_stmt())) {
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));
} else if (OB_FAIL(check_view_columns(*select_stmt, view_columns_node,
create_arg.error_info_, is_force_view))) {
LOG_WARN("failed to check view columns", K(ret));
} else if (OB_FAIL(add_column_infos(session_info_->get_effective_tenant_id(), *select_stmt, table_schema))) {
} else if (OB_FAIL(add_column_infos(session_info_->get_effective_tenant_id(), *select_stmt->get_real_stmt(), table_schema, *allocator_, *session_info_))) {
LOG_WARN("failed to add column infos", K(ret));
} else if (OB_FAIL(collect_dependency_infos(params_.query_ctx_, create_arg))) {
LOG_WARN("failed to collect dependency infos", K(ret));
@ -247,7 +250,7 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
ObString expanded_view;
ObArray<ObString> column_list;
//view_columns_node may be NULL
if (OB_FAIL(resolve_column_list(parse_tree.children_[VIEW_COLUMNS_NODE], column_list))) {
if (OB_FAIL(resolve_column_list(parse_tree.children_[VIEW_COLUMNS_NODE], column_list, table_schema))) {
LOG_WARN("fail to resolve view columns", K(ret));
} else if (OB_FAIL(stmt_print(select_stmt, 0 == column_list.count() ? NULL : &column_list,
expanded_view))) {
@ -648,7 +651,8 @@ int ObCreateViewResolver::create_alias_names_auto(
}
int ObCreateViewResolver::resolve_column_list(ParseNode *view_columns_node,
ObIArray<ObString> &column_list)
ObIArray<ObString> &column_list,
ObTableSchema &table_schema)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(allocator_)) {
@ -659,12 +663,18 @@ int ObCreateViewResolver::resolve_column_list(ParseNode *view_columns_node,
if (OB_ISNULL(view_columns_node->children_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("children_ of view_columns_node is NULL", K(ret));
} else if (OB_UNLIKELY(table_schema.get_column_count() != view_columns_node->num_child_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("view column count is not consistent", K(ret), K(table_schema.get_column_count()), K(view_columns_node->num_child_));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < view_columns_node->num_child_; ++i) {
ParseNode *column_node = view_columns_node->children_[i];
if (OB_ISNULL(column_node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("column node should not be NULL", K(ret));
} else if (OB_ISNULL(table_schema.get_column_schema_by_idx(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("column schema should not be NULL", K(ret));
} else {
column.reset();
ObString column_name;
@ -677,6 +687,8 @@ int ObCreateViewResolver::resolve_column_list(ParseNode *view_columns_node,
LOG_WARN("Failed to deep copy column_name", K(column.get_column_name_str()), K(ret));
} else if (OB_FAIL(column_list.push_back(column_name))) {
LOG_WARN("fail to push back column name", K(column_name), K(ret));
} else if (OB_FAIL(table_schema.get_column_schema_by_idx(i)->set_column_name(column_name))) {
LOG_WARN("failed to set column name", K(ret));
} else {}
}
}
@ -722,7 +734,11 @@ int ObCreateViewResolver::collect_dependency_infos(ObQueryCtx *query_ctx,
return ret;
}
int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id, ObSelectStmt &select_stmt, ObTableSchema &table_schema)
int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id,
ObSelectStmt &select_stmt,
ObTableSchema &table_schema,
ObIAllocator &alloc,
ObSQLSessionInfo &session_info)
{
int ret = OB_SUCCESS;
ObIArray<SelectItem> &select_items = select_stmt.get_select_items();
@ -759,6 +775,9 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id, ObSelectStm
column.set_collation_type(expr->get_collation_type());
column.set_accuracy(expr->get_accuracy());
OZ (adjust_string_column_length_within_max(column, lib::is_oracle_mode()));
if (lib::is_mysql_mode()) { // oracle mode has default expr value, not support now
OZ (resolve_column_default_value(&select_stmt, select_item, column, alloc, session_info));
}
if (OB_FAIL(ret)) {
// do nothing.
} else {
@ -799,5 +818,33 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id, ObSelectStm
return ret;
}
int ObCreateViewResolver::resolve_column_default_value(const sql::ObSelectStmt *select_stmt,
const sql::SelectItem &select_item,
ObColumnSchemaV2 &column_schema,
ObIAllocator &alloc,
ObSQLSessionInfo &session_info)
{
int ret = OB_SUCCESS;
ObObj casted_cell;
ObObj &res_obj = column_schema.get_cur_default_value();
res_obj.reset();
UNUSED(session_info);
const ObObj *res_cell = NULL;
ColumnItem column_item;
if (OB_ISNULL(select_stmt)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get select stmt", K(ret));
} else if (OB_FAIL(ObResolverUtils::resolve_default_value_and_expr_from_select_item(select_item, column_item, select_stmt))) {
LOG_WARN("failed to resolve default value", K(ret));
} else if (OB_FAIL(ob_write_obj(alloc, column_item.default_value_, res_obj))) {
LOG_WARN("failed to write obj", K(ret));
} else if (ob_is_enum_or_set_type(column_item.default_value_.get_type())) {
if (OB_FAIL(column_schema.set_extended_type_info(select_item.expr_->get_enum_set_values()))) {
LOG_WARN("failed to set extended type info", K(ret));
}
}
return ret;
}
} // namespace sql
} // namespace oceanbase