From 64f224fd99f83340c54b6912f9c94e308845ef7a Mon Sep 17 00:00:00 2001 From: Charles0429 Date: Fri, 18 Nov 2022 07:40:22 +0000 Subject: [PATCH] fix modify partition column --- .../resolver/ddl/ob_alter_table_resolver.cpp | 45 ++++++++++--------- .../resolver/ddl/ob_alter_table_resolver.h | 4 ++ src/sql/resolver/ob_resolver_utils.cpp | 2 +- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp index 9695925cac..803507699a 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp @@ -4436,6 +4436,29 @@ int ObAlterTableResolver::check_column_in_part_key(const ObTableSchema &table_sc return ret; } +int ObAlterTableResolver::alter_column_expr_in_part_expr( + const ObColumnSchemaV2 &src_col_schema, + const ObColumnSchemaV2 &dst_col_schema, + ObRawExpr *part_expr) +{ + int ret = OB_SUCCESS; + if (part_expr->is_column_ref_expr()) { + ObColumnRefRawExpr *column_ref = static_cast(part_expr); + if (0 == column_ref->get_column_name().case_compare(src_col_schema.get_column_name())) { + column_ref->set_data_type(dst_col_schema.get_data_type()); + column_ref->set_accuracy(dst_col_schema.get_accuracy()); + } + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < part_expr->get_param_count(); ++i) { + ObRawExpr *sub_expr = part_expr->get_param_expr(i); + if (OB_FAIL(alter_column_expr_in_part_expr(src_col_schema, dst_col_schema, sub_expr))) { + LOG_WARN("alter column expr in part expr failed", K(ret)); + } + } + } + return ret; +} + int ObAlterTableResolver::check_alter_part_key_allowed(const ObTableSchema &table_schema, const ObColumnSchemaV2 &src_col_schema, const ObColumnSchemaV2 &dst_col_schema) @@ -4482,26 +4505,8 @@ int ObAlterTableResolver::check_alter_part_key_allowed(const ObTableSchema &tabl if (OB_ISNULL(part_expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get null part expr", K(ret)); - } else if (part_expr->is_column_ref_expr()) { - ObColumnRefRawExpr *column_ref = static_cast(part_expr); - if (0 == column_ref->get_column_name().case_compare(src_col_schema.get_column_name())) { - column_ref->set_data_type(dst_col_schema.get_data_type()); - column_ref->set_accuracy(dst_col_schema.get_accuracy()); - } - } else { - for (int64_t i = 0; OB_SUCC(ret) && i < part_expr->get_param_count(); ++i) { - ObRawExpr *sub_expr = part_expr->get_param_expr(i); - if (OB_ISNULL(sub_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("sub_expr should not be null", K(ret)); - } else if (sub_expr->is_column_ref_expr()) { - ObColumnRefRawExpr *column_ref = static_cast(sub_expr); - if (0 == column_ref->get_column_name().case_compare(src_col_schema.get_column_name())) { - column_ref->set_data_type(dst_col_schema.get_data_type()); - column_ref->set_accuracy(dst_col_schema.get_accuracy()); - } - } - } + } else if (OB_FAIL(alter_column_expr_in_part_expr(src_col_schema, dst_col_schema, part_expr))) { + LOG_WARN("fail to alter column expr in part expr", K(ret), KPC(part_expr)); } OZ (part_expr->formalize(session_info_)); if (PARTITION_FUNC_TYPE_RANGE_COLUMNS == part_type || diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.h b/src/sql/resolver/ddl/ob_alter_table_resolver.h index 506ad7eae1..0043d1dcef 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.h +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.h @@ -156,6 +156,10 @@ private: int check_column_in_part_key(const share::schema::ObTableSchema &table_schema, const share::schema::ObColumnSchemaV2 &src_col_schema, const share::schema::ObColumnSchemaV2 &dst_col_schema); + int alter_column_expr_in_part_expr( + const share::schema::ObColumnSchemaV2 &src_col_schema, + const share::schema::ObColumnSchemaV2 &dst_col_schema, + ObRawExpr *part_expr); int check_alter_part_key_allowed(const share::schema::ObTableSchema &table_schema, const share::schema::ObColumnSchemaV2 &src_col_schema, const share::schema::ObColumnSchemaV2 &dst_col_schema); diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index ef90cc0d38..9f6b0f1b81 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -3482,7 +3482,7 @@ int ObResolverUtils::check_expr_valid_for_partition(ObRawExpr &expr, if (OB_FAIL(part_expr->formalize(&session_info))) { LOG_WARN("part expr formalize failed", K(ret)); } else if (OB_FAIL(part_expr->preorder_accept(part_expr_checker))) { - LOG_WARN("check_part_expr failed", K(ret)); + LOG_WARN("check_part_expr failed", K(ret), KPC(part_expr)); } } }