This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new d6f6e3af629 Fix code merge (#17835)
d6f6e3af629 is described below

commit d6f6e3af6296cf91b1122470276b29f487aee91c
Author: Chuxin Chen <chuxinche...@qq.com>
AuthorDate: Fri May 20 19:11:25 2022 +0800

    Fix code merge (#17835)
---
 .../metadata/generator/PipelineDDLGenerator.java   | 121 ++++++++++++---------
 1 file changed, 70 insertions(+), 51 deletions(-)

diff --git 
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
 
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
index ef3342f33bc..cb6426da1b2 100644
--- 
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
+++ 
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
@@ -23,6 +23,7 @@ import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.statement.ddl.AlterTableStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.ddl.CommentStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.ddl.CreateIndexStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.ddl.CreateTableStatementContext;
@@ -49,8 +50,11 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.sql.SQLException;
 import java.util.Collections;
+import java.util.Comparator;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.TreeMap;
 
 /**
  * Pipeline ddl generator.
@@ -60,6 +64,8 @@ public final class PipelineDDLGenerator {
     
     private static final String DELIMITER = ";";
     
+    private static final String SET_SEARCH_PATH_PREFIX = "set search_path";
+    
     private final ContextManager contextManager;
     
     /**
@@ -77,9 +83,8 @@ public final class PipelineDDLGenerator {
         String sql = generateActualDDLSQL(databaseType, schemaName, tableName, 
database);
         StringBuilder result = new StringBuilder();
         for (String each : sql.split(DELIMITER)) {
-            if (!each.trim().isEmpty()) {
-                result.append(decorateActualSQL(each.trim(), database, 
databaseType, databaseName)).append(DELIMITER).append(System.lineSeparator());
-            }
+            Optional<String> logicSQL = decorate(databaseType, databaseName, 
schemaName, database, each);
+            logicSQL.ifPresent(ddlSQL -> 
result.append(ddlSQL).append(DELIMITER).append(System.lineSeparator()));
         }
         return result.toString();
     }
@@ -96,15 +101,30 @@ public final class PipelineDDLGenerator {
     public String replaceTableNameWithPrefix(final String sql, final String 
prefix, final DatabaseType databaseType, final String databaseName) {
         LogicSQL logicSQL = getLogicSQL(sql, databaseType, databaseName);
         SQLStatementContext<?> sqlStatementContext = 
logicSQL.getSqlStatementContext();
-        if (sqlStatementContext instanceof CreateTableStatementContext || 
sqlStatementContext instanceof CommentStatementContext || sqlStatementContext 
instanceof CreateIndexStatementContext) {
+        if (sqlStatementContext instanceof CreateTableStatementContext || 
sqlStatementContext instanceof CommentStatementContext || sqlStatementContext 
instanceof CreateIndexStatementContext
+                || sqlStatementContext instanceof AlterTableStatementContext) {
             if (!sqlStatementContext.getTablesContext().getTables().isEmpty()) 
{
                 TableNameSegment tableNameSegment = 
sqlStatementContext.getTablesContext().getTables().iterator().next().getTableName();
-                return replace(sql, tableNameSegment, prefix + 
tableNameSegment.getIdentifier().getValue());
+                Map<SQLSegment, String> replaceMap = new 
TreeMap<>(Comparator.comparing(SQLSegment::getStartIndex));
+                replaceMap.put(tableNameSegment, prefix + 
tableNameSegment.getIdentifier().getValue());
+                return doDecorateActualTable(replaceMap, sql);
             }
         }
         return sql;
     }
     
+    private Optional<String> decorate(final DatabaseType databaseType, final 
String databaseName, final String schemaName, final ShardingSphereDatabase 
database, final String sql) {
+        if (sql.trim().isEmpty()) {
+            return Optional.empty();
+        }
+        String result = decorateActualSQL(sql.trim(), database, databaseType, 
databaseName);
+        // TODO remove it after set search_path is supported.
+        if ("openGauss".equals(databaseType.getType())) {
+            return decorateOpenGauss(databaseType, databaseName, schemaName, 
result);
+        }
+        return Optional.of(result);
+    }
+    
     private String generateActualDDLSQL(final DatabaseType databaseType, final 
String schemaName, final String tableName, final ShardingSphereDatabase 
database) throws SQLException {
         DataNodes dataNodes = new 
DataNodes(database.getRuleMetaData().getRules());
         Optional<DataNode> optional = 
dataNodes.getDataNodes(tableName).stream()
@@ -120,78 +140,69 @@ public final class PipelineDDLGenerator {
     
     private String decorateActualSQL(final String sql, final 
ShardingSphereDatabase database, final DatabaseType databaseType, final String 
databaseName) {
         LogicSQL logicSQL = getLogicSQL(sql, databaseType, databaseName);
-        String result = logicSQL.getSql();
         SQLStatementContext<?> sqlStatementContext = 
logicSQL.getSqlStatementContext();
+        Map<SQLSegment, String> replaceMap = new 
TreeMap<>(Comparator.comparing(SQLSegment::getStartIndex));
         if (sqlStatementContext instanceof CreateTableStatementContext) {
-            result = decorateIndexAndConstraint(database, result, 
sqlStatementContext);
-            result = decorateTable(database, result, (TableAvailable) 
sqlStatementContext);
+            appendFromIndexAndConstraint(replaceMap, database, 
sqlStatementContext);
+            appendFromTable(replaceMap, database, (TableAvailable) 
sqlStatementContext);
         }
         if (sqlStatementContext instanceof CommentStatementContext) {
-            result = decorateTable(database, result, (TableAvailable) 
sqlStatementContext);
+            appendFromTable(replaceMap, database, (TableAvailable) 
sqlStatementContext);
         }
         if (sqlStatementContext instanceof CreateIndexStatementContext) {
-            result = decorateTable(database, result, (TableAvailable) 
sqlStatementContext);
-            result = decorateIndexAndConstraint(database, result, 
sqlStatementContext);
+            appendFromTable(replaceMap, database, (TableAvailable) 
sqlStatementContext);
+            appendFromIndexAndConstraint(replaceMap, database, 
sqlStatementContext);
         }
-        
-        return result;
-    }
-    
-    private String decorateTable(final ShardingSphereDatabase database, final 
String sql, final TableAvailable sqlStatementContext) {
-        String result = sql;
-        for (SimpleTableSegment each : sqlStatementContext.getAllTables()) {
-            String logicTable = findLogicTable(each.getTableName(), database);
-            if 
(!logicTable.equals(each.getTableName().getIdentifier().getValue())) {
-                result = replace(result, each.getTableName(), logicTable);
-            }
+        if (sqlStatementContext instanceof AlterTableStatementContext) {
+            appendFromIndexAndConstraint(replaceMap, database, 
sqlStatementContext);
+            appendFromTable(replaceMap, database, (TableAvailable) 
sqlStatementContext);
         }
-        return result;
+        return doDecorateActualTable(replaceMap, sql);
     }
     
-    private String decorateIndexAndConstraint(final ShardingSphereDatabase 
database, final String sql, final SQLStatementContext<?> sqlStatementContext) {
+    private void appendFromIndexAndConstraint(final Map<SQLSegment, String> 
replaceMap, final ShardingSphereDatabase database, final SQLStatementContext<?> 
sqlStatementContext) {
         if (!(sqlStatementContext instanceof TableAvailable) || 
((TableAvailable) 
sqlStatementContext).getTablesContext().getTables().isEmpty()) {
-            return sql;
+            return;
         }
-        String result = sql;
         TableNameSegment tableNameSegment = ((TableAvailable) 
sqlStatementContext).getTablesContext().getTables().iterator().next().getTableName();
         String logicTable = findLogicTable(tableNameSegment, database);
         if (!tableNameSegment.getIdentifier().getValue().equals(logicTable)) {
             if (sqlStatementContext instanceof IndexAvailable) {
-                result = decorateIndex((IndexAvailable) sqlStatementContext, 
result, tableNameSegment);
+                for (IndexSegment each : ((IndexAvailable) 
sqlStatementContext).getIndexes()) {
+                    String logicIndexName = 
IndexMetaDataUtil.getLogicIndexName(each.getIndexName().getIdentifier().getValue(),
 tableNameSegment.getIdentifier().getValue());
+                    replaceMap.put(each.getIndexName(), logicIndexName);
+                }
             }
             if (sqlStatementContext instanceof ConstraintAvailable) {
-                result = decorateConstraint((ConstraintAvailable) 
sqlStatementContext, result, tableNameSegment);
+                for (ConstraintSegment each : ((ConstraintAvailable) 
sqlStatementContext).getConstraints()) {
+                    String logicConstraint = 
IndexMetaDataUtil.getLogicIndexName(each.getIdentifier().getValue(), 
tableNameSegment.getIdentifier().getValue());
+                    replaceMap.put(each, logicConstraint);
+                }
             }
         }
-        return result;
     }
     
-    private String decorateIndex(final IndexAvailable indexAvailable, final 
String sql, final TableNameSegment tableNameSegment) {
-        String result = sql;
-        for (IndexSegment each : indexAvailable.getIndexes()) {
-            String logicIndexName = 
IndexMetaDataUtil.getLogicIndexName(each.getIndexName().getIdentifier().getValue(),
 tableNameSegment.getIdentifier().getValue());
-            result = replace(result, each, logicIndexName);
+    private void appendFromTable(final Map<SQLSegment, String> replaceMap, 
final ShardingSphereDatabase database, final TableAvailable 
sqlStatementContext) {
+        for (SimpleTableSegment each : sqlStatementContext.getAllTables()) {
+            String logicTable = findLogicTable(each.getTableName(), database);
+            if 
(!logicTable.equals(each.getTableName().getIdentifier().getValue())) {
+                replaceMap.put(each.getTableName(), logicTable);
+            }
         }
-        return result;
     }
     
-    private String decorateConstraint(final ConstraintAvailable 
constraintAvailable, final String sql, final TableNameSegment tableNameSegment) 
{
-        String result = sql;
-        for (ConstraintSegment each : constraintAvailable.getConstraints()) {
-            String logicConstraint = 
IndexMetaDataUtil.getLogicIndexName(each.getIdentifier().getValue(), 
tableNameSegment.getIdentifier().getValue());
-            result = replace(result, each, logicConstraint);
+    private String doDecorateActualTable(final Map<SQLSegment, String> 
replaceMap, final String sql) {
+        StringBuilder result = new StringBuilder();
+        int lastStopIndex = 0;
+        for (Map.Entry<SQLSegment, String> entry : replaceMap.entrySet()) {
+            result.append(sql, lastStopIndex, entry.getKey().getStartIndex());
+            result.append(entry.getValue());
+            lastStopIndex = entry.getKey().getStopIndex() + 1;
         }
-        return result;
-    }
-    
-    private String replace(final String sql, final SQLSegment sqlSegment, 
final String replaceName) {
-        String result = "";
-        int start = sqlSegment.getStartIndex();
-        int stop = sqlSegment.getStopIndex();
-        result += sql.substring(0, start);
-        result += replaceName;
-        result += sql.substring(stop + 1);
-        return result;
+        if (lastStopIndex < sql.length()) {
+            result.append(sql, lastStopIndex, sql.length());
+        }
+        return result.toString();
     }
     
     private String findLogicTable(final TableNameSegment tableNameSegment, 
final ShardingSphereDatabase database) {
@@ -208,4 +219,12 @@ public final class PipelineDDLGenerator {
                 sqlStatement, databaseName);
         return new LogicSQL(sqlStatementContext, sql, Collections.emptyList());
     }
+    
+    // TODO remove it after set search_path is supported.
+    private Optional<String> decorateOpenGauss(final DatabaseType 
databaseType, final String databaseName, final String schemaName, final String 
logicSQL) {
+        if (logicSQL.toLowerCase().startsWith(SET_SEARCH_PATH_PREFIX)) {
+            return Optional.empty();
+        }
+        return Optional.of(replaceTableNameWithPrefix(logicSQL, schemaName + 
".", databaseType, databaseName));
+    }
 }

Reply via email to