twalthr commented on a change in pull request #15755:
URL: https://github.com/apache/flink/pull/15755#discussion_r620940842



##########
File path: 
flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/utils/OperationConverterUtils.java
##########
@@ -144,6 +149,116 @@ public static Operation convertChangeColumn(
         // TODO: handle watermark and constraints
     }
 
+    public static Operation convertRenameColumn(
+            ObjectIdentifier tableIdentifier,
+            String originColumnName,
+            String newColumnName,
+            CatalogTable catalogTable) {
+
+        Schema modifiedTableSchema = catalogTable.getUnresolvedSchema();
+        validateColumnName(originColumnName, newColumnName, 
modifiedTableSchema);
+
+        Schema.Builder builder = Schema.newBuilder();
+        // build column
+        modifiedTableSchema.getColumns().stream()
+                .forEach(
+                        column -> {
+                            if (StringUtils.equals(column.getName(), 
originColumnName)) {
+                                buildNewColumnFromOriginColumn(builder, 
column, newColumnName);
+                            } else {
+                                buildNewColumnFromOriginColumn(builder, 
column, column.getName());
+                            }
+                        });
+        // build primary key column
+        List<String> originPrimaryKeyNames =
+                modifiedTableSchema
+                        .getPrimaryKey()
+                        .map(Schema.UnresolvedPrimaryKey::getColumnNames)
+                        .orElseGet(Lists::newArrayList);
+
+        List<String> newPrimaryKeyNames =
+                originPrimaryKeyNames.stream()
+                        .map(
+                                pkName ->
+                                        StringUtils.equals(pkName, 
originColumnName)
+                                                ? newColumnName
+                                                : pkName)
+                        .collect(Collectors.toList());
+
+        if (newPrimaryKeyNames.size() > 0) {
+            builder.primaryKey(newPrimaryKeyNames);
+        }
+        // build watermark
+        modifiedTableSchema.getWatermarkSpecs().stream()
+                .forEach(
+                        watermarkSpec -> {
+                            String watermarkRefColumnName = 
watermarkSpec.getColumnName();
+                            Expression watermarkExpression = 
watermarkSpec.getWatermarkExpression();
+                            if (StringUtils.equals(watermarkRefColumnName, 
originColumnName)) {
+                                String newWatermarkExpression =
+                                        ((SqlCallExpression) 
watermarkExpression)
+                                                .getSqlExpression()
+                                                
.replace(watermarkRefColumnName, newColumnName);

Review comment:
       No doubt that string replace is not a good solution. The expression can 
be both Table API or SQL. If we want to replace the column everywhere we would 
need to resolve the schema first and then traverse the nodes.
   
   I would say we don't implement such a logic and fail hard in this case. An 
invalid schema will be detected when resolving the schema. Users can just 
provide a new computed column or watermark expression in the same ALTER 
statement. 




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to