This is an automated email from the ASF dual-hosted git repository.
zhonghongsheng 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 cb69be40251 Fix: fix DDL handling error with semicolon (#32281)
cb69be40251 is described below
commit cb69be4025169ad02caa6e2de709e8c3818d85b7
Author: ivyxjc <[email protected]>
AuthorDate: Mon Jul 29 20:16:47 2024 +0800
Fix: fix DDL handling error with semicolon (#32281)
---
.../core/metadata/generator/PipelineDDLGenerator.java | 19 ++++++++++++-------
.../datasource/PipelineJobDataSourcePreparer.java | 10 +++++-----
2 files changed, 17 insertions(+), 12 deletions(-)
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
index 5b75203e44a..16b27e2929e 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
@@ -43,8 +43,10 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
@@ -56,8 +58,6 @@ import java.util.TreeMap;
@Slf4j
public final class PipelineDDLGenerator {
- private static final String DELIMITER = ";";
-
private static final String SET_SEARCH_PATH_PREFIX = "set search_path";
/**
@@ -72,17 +72,22 @@ public final class PipelineDDLGenerator {
* @return DDL SQL
* @throws SQLException SQL exception
*/
- public String generateLogicDDL(final DatabaseType databaseType, final
DataSource sourceDataSource,
- final String schemaName, final String
sourceTableName, final String targetTableName, final SQLParserEngine
parserEngine) throws SQLException {
+ public List<String> generateLogicDDL(final DatabaseType databaseType,
final DataSource sourceDataSource,
+ final String schemaName, final String
sourceTableName, final String targetTableName, final SQLParserEngine
parserEngine) throws SQLException {
long startTimeMillis = System.currentTimeMillis();
- StringBuilder result = new StringBuilder();
+ List<String> result = new ArrayList<>();
for (String each :
DatabaseTypedSPILoader.getService(DialectPipelineSQLBuilder.class,
databaseType).buildCreateTableSQLs(sourceDataSource, schemaName,
sourceTableName)) {
Optional<String> queryContext = decorate(databaseType,
sourceDataSource, schemaName, targetTableName, parserEngine, each);
- queryContext.ifPresent(optional ->
result.append(optional).append(DELIMITER).append(System.lineSeparator()));
+ queryContext.ifPresent(sql -> {
+ String trimmedSql = sql.trim();
+ if (!Strings.isNullOrEmpty(trimmedSql)) {
+ result.add(trimmedSql);
+ }
+ });
}
log.info("generateLogicDDL, databaseType={}, schemaName={},
sourceTableName={}, targetTableName={}, cost {} ms",
databaseType.getType(), schemaName, sourceTableName,
targetTableName, System.currentTimeMillis() - startTimeMillis);
- return result.toString();
+ return result;
}
private Optional<String> decorate(final DatabaseType databaseType, final
DataSource dataSource, final String schemaName, final String targetTableName,
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java
index 20f71add9c0..efc782591f6 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.data.pipeline.core.preparer.datasource;
-import com.google.common.base.Splitter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import
org.apache.shardingsphere.data.pipeline.api.PipelineDataSourceConfiguration;
@@ -39,6 +38,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.HashSet;
+import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
@@ -107,9 +107,9 @@ public final class PipelineJobDataSourcePreparer {
final long startTimeMillis = System.currentTimeMillis();
PipelineDataSourceManager dataSourceManager =
param.getDataSourceManager();
for (CreateTableConfiguration each :
param.getCreateTableConfigurations()) {
- String createTargetTableSQL = getCreateTargetTableSQL(each,
dataSourceManager, param.getSqlParserEngine());
+ List<String> createTargetTableSQL = getCreateTargetTableSQL(each,
dataSourceManager, param.getSqlParserEngine());
try (Connection targetConnection =
dataSourceManager.getDataSource(each.getTargetDataSourceConfig()).getConnection())
{
- for (String sql :
Splitter.on(";").trimResults().omitEmptyStrings().splitToList(createTargetTableSQL))
{
+ for (String sql : createTargetTableSQL) {
executeTargetTableSQL(targetConnection,
addIfNotExistsForCreateTableSQL(sql));
}
}
@@ -135,8 +135,8 @@ public final class PipelineJobDataSourcePreparer {
return
PATTERN_CREATE_TABLE_IF_NOT_EXISTS.matcher(createTableSQL).find() ?
createTableSQL :
PATTERN_CREATE_TABLE.matcher(createTableSQL).replaceFirst("CREATE TABLE IF NOT
EXISTS ");
}
- private String getCreateTargetTableSQL(final CreateTableConfiguration
createTableConfig,
- final PipelineDataSourceManager
dataSourceManager, final SQLParserEngine sqlParserEngine) throws SQLException {
+ private List<String> getCreateTargetTableSQL(final
CreateTableConfiguration createTableConfig,
+ final
PipelineDataSourceManager dataSourceManager, final SQLParserEngine
sqlParserEngine) throws SQLException {
DatabaseType databaseType =
createTableConfig.getSourceDataSourceConfig().getDatabaseType();
DataSource sourceDataSource =
dataSourceManager.getDataSource(createTableConfig.getSourceDataSourceConfig());
String schemaName =
createTableConfig.getSourceName().getSchemaName().toString();