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)); + } }