You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/05/20 11:11:33 UTC
[shardingsphere] branch master updated: Fix code merge (#17835)
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 <ch...@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));
+ }
}