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();

Reply via email to