diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp index 5364c88465..12c254c950 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp @@ -347,6 +347,11 @@ int ObAlterTableResolver::resolve(const ParseNode &parse_tree) LOG_WARN("resolve hints failed", K(ret)); } } + if (OB_SUCC(ret)){ + if (OB_FAIL(deep_copy_string_in_part_expr(get_alter_table_stmt()))) { + LOG_WARN("failed to deep copy string in part expr"); + } + } } DEBUG_SYNC(HANG_BEFORE_RESOLVER_FINISH); return ret; diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.cpp b/src/sql/resolver/ddl/ob_create_table_resolver.cpp index 486c06d9fb..f836e8aa62 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_table_resolver.cpp @@ -808,6 +808,11 @@ int ObCreateTableResolver::resolve(const ParseNode &parse_tree) SQL_RESV_LOG(WARN, "uk and pk is duplicate", K(ret)); } } + if (OB_SUCC(ret)){ + if (OB_FAIL(deep_copy_string_in_part_expr(create_table_stmt))) { + LOG_WARN("failed to deep copy string in part expr"); + } + } } return ret; } diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index d342a2260d..dbd21aee81 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -10700,5 +10700,46 @@ int ObDDLResolver::resolve_hints(const ParseNode *node, ObDDLStmt &stmt, const O return ret; } +int ObDDLResolver::deep_copy_string_in_part_expr(ObPartitionedStmt* stmt) +{ + int ret = OB_SUCCESS; + ObSEArray exprs; + if (OB_ISNULL(stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null stmt"); + } else if (OB_FAIL(append(exprs, stmt->get_part_fun_exprs()))) { + LOG_WARN("failed to append part fun exprs", K(ret)); + } else if (OB_FAIL(append(exprs, stmt->get_subpart_fun_exprs()))) { + LOG_WARN("failed to append subpart fun exprs", K(ret)); + } else if (exprs.count() > 0 && OB_FAIL(deep_copy_column_expr_name(*allocator_, exprs))) { + LOG_WARN("failed to deep copy column expr name"); + } + return ret; +} + +int ObDDLResolver::deep_copy_column_expr_name(common::ObIAllocator &allocator, + ObIArray &exprs) +{ + int ret = OB_SUCCESS; + ObSEArray column_exprs; + if (OB_FAIL(ObRawExprUtils::extract_column_exprs(exprs, column_exprs))) { + LOG_WARN("failed to extract column exprs", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < column_exprs.count(); ++i) { + ObColumnRefRawExpr* column_expr = NULL; + if (OB_ISNULL(column_exprs.at(i)) || !column_exprs.at(i)->is_column_ref_expr()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected expr", K(i), K(column_exprs)); + } else if (OB_FALSE_IT(column_expr = static_cast(column_exprs.at(i)))) { + } else if (OB_FAIL(ob_write_string(allocator, column_expr->get_column_name(), column_expr->get_column_name()))) { + LOG_WARN("failed to write string"); + } else if (OB_FAIL(ob_write_string(allocator, column_expr->get_database_name(), column_expr->get_database_name()))) { + LOG_WARN("failed to write string"); + } + } + } + return ret; +} + } // namespace sql } // namespace oceanbase diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.h b/src/sql/resolver/ddl/ob_ddl_resolver.h index 99a2b59fb6..32ffa84c66 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.h +++ b/src/sql/resolver/ddl/ob_ddl_resolver.h @@ -835,6 +835,8 @@ protected: int check_format_valid(const ObExternalFileFormat &format, bool &is_valid); + int deep_copy_string_in_part_expr(ObPartitionedStmt* stmt); + int deep_copy_column_expr_name(common::ObIAllocator &allocator, ObIArray &exprs); void reset(); int64_t block_size_; int64_t consistency_level_;