fix create view failed when select item has same alias name
This commit is contained in:
@ -4687,6 +4687,7 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie
|
||||
LOG_WARN("failed to get sql engine", K(ret));
|
||||
} else if ((0 == old_view_schema.get_object_status() || 0 == old_view_schema.get_column_count())) {
|
||||
if (!reset_column_infos) {
|
||||
ObArray<ObString> dummy_column_list;
|
||||
if (OB_ISNULL(select_stmt)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("failed to get select stmt", K(ret));
|
||||
@ -4695,7 +4696,7 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie
|
||||
} else if (OB_ISNULL(select_stmt->get_ref_obj_table())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("ref obj is null", K(ret));
|
||||
} else if (OB_FAIL(ObCreateViewResolver::add_column_infos(old_view_schema.get_tenant_id(), *select_stmt, new_view_schema, alloc, session_info))) {
|
||||
} else if (OB_FAIL(ObCreateViewResolver::add_column_infos(old_view_schema.get_tenant_id(), *select_stmt, new_view_schema, alloc, session_info, dummy_column_list))) {
|
||||
LOG_WARN("failed to update view column info", K(ret));
|
||||
} else if (!new_view_schema.is_view_table() || new_view_schema.get_column_count() <= 0) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
|
@ -91,6 +91,7 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
|
||||
? OB_MAX_USER_TABLE_NAME_LENGTH_ORACLE : OB_MAX_USER_TABLE_NAME_LENGTH_MYSQL;
|
||||
ObNameCaseMode mode = OB_NAME_CASE_INVALID;
|
||||
bool perserve_lettercase = false; // lib::is_oracle_mode() ? true : (mode != OB_LOWERCASE_AND_INSENSITIVE);
|
||||
ObArray<ObString> column_list;
|
||||
if (OB_FAIL(resolve_table_relation_node(parse_tree.children_[VIEW_NODE],
|
||||
view_name, db_name,
|
||||
false, false, &dblink_name_ptr, &dblink_name_len))) {
|
||||
@ -174,6 +175,8 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
|
||||
table_schema.set_table_type(USER_VIEW);
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (!is_force_view && !is_sync_ddl_user && 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_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()));
|
||||
@ -183,7 +186,7 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
|
||||
} 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->get_real_stmt(), table_schema, *allocator_, *session_info_))) {
|
||||
} else if (OB_FAIL(add_column_infos(session_info_->get_effective_tenant_id(), *select_stmt, table_schema, *allocator_, *session_info_, column_list))) {
|
||||
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));
|
||||
@ -248,11 +251,7 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree)
|
||||
// 基线备份时create view必须都用show create view里面的view definition
|
||||
// create force view use origin view_define
|
||||
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, 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,
|
||||
if (OB_FAIL(stmt_print(select_stmt, 0 == column_list.count() ? NULL : &column_list,
|
||||
expanded_view))) {
|
||||
LOG_WARN("fail to expand view definition", K(ret));
|
||||
} else if (OB_FAIL(table_schema.set_view_definition(expanded_view))) {
|
||||
@ -663,18 +662,12 @@ 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;
|
||||
@ -687,8 +680,6 @@ 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 {}
|
||||
}
|
||||
}
|
||||
@ -738,7 +729,8 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id,
|
||||
ObSelectStmt &select_stmt,
|
||||
ObTableSchema &table_schema,
|
||||
ObIAllocator &alloc,
|
||||
ObSQLSessionInfo &session_info)
|
||||
ObSQLSessionInfo &session_info,
|
||||
const ObIArray<ObString> &column_list)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObIArray<SelectItem> &select_items = select_stmt.get_select_items();
|
||||
@ -748,6 +740,10 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id,
|
||||
if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) {
|
||||
LOG_WARN("failed to get data version", K(ret));
|
||||
} else if (data_version >= DATA_VERSION_4_1_0_0) {
|
||||
if (!column_list.empty() && OB_UNLIKELY(column_list.count() != select_items.count())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get wrong column count", K(ret), K(column_list.count()), K(select_items.count()), K(table_schema), K(select_stmt));
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < select_items.count(); ++i) {
|
||||
const SelectItem &select_item = select_items.at(i);
|
||||
const ObRawExpr *expr = select_item.expr_;
|
||||
@ -756,7 +752,9 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id,
|
||||
LOG_WARN("select item expr is null", K(ret), K(i));
|
||||
} else {
|
||||
column.reset();
|
||||
if (!select_item.alias_name_.empty()) {
|
||||
if (!column_list.empty()) {
|
||||
column.set_column_name(column_list.at(i));
|
||||
} else if (!select_item.alias_name_.empty()) {
|
||||
column.set_column_name(select_item.alias_name_);
|
||||
} else {
|
||||
column.set_column_name(select_item.expr_name_);
|
||||
|
@ -51,7 +51,8 @@ public:
|
||||
ObSelectStmt &select_stmt,
|
||||
ObTableSchema &table_schema,
|
||||
common::ObIAllocator &alloc,
|
||||
sql::ObSQLSessionInfo &session_info);
|
||||
sql::ObSQLSessionInfo &session_info,
|
||||
const common::ObIArray<ObString> &column_list);
|
||||
static int resolve_column_default_value(const sql::ObSelectStmt *select_stmt,
|
||||
const sql::SelectItem &select_item,
|
||||
schema::ObColumnSchemaV2 &column_schema,
|
||||
|
Reference in New Issue
Block a user