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

sunnianjun 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 b318409a59e Refactor kernel logic for pmd suggestion (#25393)
b318409a59e is described below

commit b318409a59e9e1105c94c064013004af44f824c5
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Apr 28 16:24:20 2023 +0800

    Refactor kernel logic for pmd suggestion (#25393)
    
    * Remove useless ModeConfigNotFoundException
    
    * Refactor logic for pmd suggestion
    
    * revert OriginalSQLFederationExecutor
---
 ...OnDuplicateKeyUpdateValueParameterRewriter.java | 44 +++++++++++--------
 .../EncryptPredicateColumnTokenGenerator.java      | 50 +++++++++++-----------
 .../generator/impl/ProjectionsTokenGenerator.java  |  6 +--
 .../token/ProjectionsTokenGeneratorTest.java       |  4 +-
 .../select/projection/engine/ProjectionEngine.java |  2 +-
 .../select/projection/impl/DerivedProjection.java  |  4 +-
 .../schema/loader/common/ColumnMetaDataLoader.java | 10 ++---
 .../dialect/SQLServerSchemaMetaDataLoader.java     |  6 +--
 .../driver/spi/ClasspathDriverURLProvider.java     |  2 +-
 .../exception/job/ModeConfigNotFoundException.java | 33 --------------
 .../route/engine/SingleStandardRouteEngine.java    | 11 ++---
 11 files changed, 74 insertions(+), 98 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter.java
index bf9211e5a16..d1bdba33996 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter.java
@@ -19,13 +19,13 @@ package 
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter;
 
 import com.google.common.base.Preconditions;
 import lombok.Setter;
-import org.apache.shardingsphere.encrypt.spi.LikeEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
+import org.apache.shardingsphere.encrypt.api.context.EncryptContext;
 import org.apache.shardingsphere.encrypt.context.EncryptContextBuilder;
 import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-import org.apache.shardingsphere.encrypt.api.context.EncryptContext;
+import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
+import org.apache.shardingsphere.encrypt.spi.LikeEncryptAlgorithm;
 import 
org.apache.shardingsphere.infra.binder.segment.insert.values.OnDuplicateUpdateContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
@@ -77,22 +77,7 @@ public final class 
EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter imple
             EncryptContext encryptContext = 
EncryptContextBuilder.build(databaseName, schemaName, tableName, 
encryptLogicColumnName);
             Object cipherColumnValue = 
encryptor.get().encrypt(plainColumnValue, encryptContext);
             
groupedParamBuilder.getGenericParameterBuilder().addReplacedParameters(index, 
cipherColumnValue);
-            Collection<Object> addedParams = new LinkedList<>();
-            Optional<EncryptAlgorithm> assistedQueryEncryptor = 
encryptRule.findAssistedQueryEncryptor(tableName, encryptLogicColumnName);
-            if (assistedQueryEncryptor.isPresent()) {
-                Optional<String> assistedColumnName = 
encryptRule.findAssistedQueryColumn(tableName, encryptLogicColumnName);
-                Preconditions.checkArgument(assistedColumnName.isPresent(), 
"Can not find assisted query Column Name");
-                
addedParams.add(assistedQueryEncryptor.get().encrypt(plainColumnValue, 
encryptContext));
-            }
-            Optional<LikeEncryptAlgorithm> likeQueryEncryptor = 
encryptRule.findLikeQueryEncryptor(tableName, encryptLogicColumnName);
-            if (likeQueryEncryptor.isPresent()) {
-                Optional<String> likeColumnName = 
encryptRule.findLikeQueryColumn(tableName, encryptLogicColumnName);
-                Preconditions.checkArgument(likeColumnName.isPresent(), "Can 
not find assisted query Column Name");
-                
addedParams.add(likeQueryEncryptor.get().encrypt(plainColumnValue, 
encryptContext));
-            }
-            if (encryptRule.findPlainColumn(tableName, 
encryptLogicColumnName).isPresent()) {
-                addedParams.add(plainColumnValue);
-            }
+            Collection<Object> addedParams = buildAddedParams(tableName, 
encryptLogicColumnName, plainColumnValue, encryptContext);
             if (!addedParams.isEmpty()) {
                 if 
(!groupedParamBuilder.getGenericParameterBuilder().getAddedIndexAndParameters().containsKey(index))
 {
                     
groupedParamBuilder.getGenericParameterBuilder().getAddedIndexAndParameters().put(index,
 new LinkedList<>());
@@ -101,4 +86,25 @@ public final class 
EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter imple
             }
         }
     }
+    
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private Collection<Object> buildAddedParams(final String tableName, final 
String logicColumnName, final Object plainColumnValue, final EncryptContext 
encryptContext) {
+        Collection<Object> result = new LinkedList<>();
+        Optional<EncryptAlgorithm> assistedQueryEncryptor = 
encryptRule.findAssistedQueryEncryptor(tableName, logicColumnName);
+        if (assistedQueryEncryptor.isPresent()) {
+            Optional<String> assistedColumnName = 
encryptRule.findAssistedQueryColumn(tableName, logicColumnName);
+            Preconditions.checkArgument(assistedColumnName.isPresent(), "Can 
not find assisted query Column Name");
+            result.add(assistedQueryEncryptor.get().encrypt(plainColumnValue, 
encryptContext));
+        }
+        Optional<LikeEncryptAlgorithm> likeQueryEncryptor = 
encryptRule.findLikeQueryEncryptor(tableName, logicColumnName);
+        if (likeQueryEncryptor.isPresent()) {
+            Optional<String> likeColumnName = 
encryptRule.findLikeQueryColumn(tableName, logicColumnName);
+            Preconditions.checkArgument(likeColumnName.isPresent(), "Can not 
find assisted query Column Name");
+            result.add(likeQueryEncryptor.get().encrypt(plainColumnValue, 
encryptContext));
+        }
+        if (encryptRule.findPlainColumn(tableName, 
logicColumnName).isPresent()) {
+            result.add(plainColumnValue);
+        }
+        return result;
+    }
 }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
index adfa3071e2b..4592b6461f3 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
@@ -19,9 +19,9 @@ package 
org.apache.shardingsphere.encrypt.rewrite.token.generator;
 
 import lombok.Setter;
 import 
org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException;
+import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
-import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.WhereAvailable;
@@ -83,32 +83,34 @@ public final class EncryptPredicateColumnTokenGenerator 
implements CollectionSQL
             if (!encryptTable.isPresent() || 
!encryptTable.get().findEncryptColumn(each.getIdentifier().getValue()).isPresent())
 {
                 continue;
             }
-            int startIndex = each.getOwner().isPresent() ? 
each.getOwner().get().getStopIndex() + 2 : each.getStartIndex();
-            int stopIndex = each.getStopIndex();
-            boolean queryWithCipherColumn = 
encryptRule.isQueryWithCipherColumn(tableName, each.getIdentifier().getValue());
-            if (!queryWithCipherColumn) {
-                Optional<String> plainColumn = 
encryptTable.get().findPlainColumn(each.getIdentifier().getValue());
-                if (plainColumn.isPresent()) {
-                    result.add(new SubstitutableColumnNameToken(startIndex, 
stopIndex, createColumnProjections(plainColumn.get())));
-                    continue;
-                }
+            result.add(buildSubstitutableColumnNameToken(each, tableName, 
whereSegments, encryptTable.get()));
+        }
+        return result;
+    }
+    
+    private SubstitutableColumnNameToken 
buildSubstitutableColumnNameToken(final ColumnSegment columnSegment, final 
String tableName, final Collection<WhereSegment> whereSegments,
+                                                                           
final EncryptTable encryptTable) {
+        int startIndex = columnSegment.getOwner().isPresent() ? 
columnSegment.getOwner().get().getStopIndex() + 2 : 
columnSegment.getStartIndex();
+        int stopIndex = columnSegment.getStopIndex();
+        String logicColumn = columnSegment.getIdentifier().getValue();
+        if (!encryptRule.isQueryWithCipherColumn(tableName, logicColumn)) {
+            Optional<String> plainColumn = 
encryptTable.findPlainColumn(logicColumn);
+            if (plainColumn.isPresent()) {
+                return new SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(plainColumn.get()));
             }
-            // TODO remove foreach loop to improve performance
-            if (isColumnSegmentIncludedInLikeExpression(whereSegments, each)) {
-                Optional<String> likeQueryColumn = 
encryptTable.get().findLikeQueryColumn(each.getIdentifier().getValue());
-                if (likeQueryColumn.isPresent()) {
-                    result.add(new SubstitutableColumnNameToken(startIndex, 
stopIndex, createColumnProjections(likeQueryColumn.get())));
-                    continue;
-                } else {
-                    throw new UnsupportedEncryptSQLException("LIKE");
-                }
+        }
+        // TODO remove foreach loop to improve performance
+        if (isColumnSegmentIncludedInLikeExpression(whereSegments, 
columnSegment)) {
+            Optional<String> likeQueryColumn = 
encryptTable.findLikeQueryColumn(logicColumn);
+            if (likeQueryColumn.isPresent()) {
+                return new SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(likeQueryColumn.get()));
+            } else {
+                throw new UnsupportedEncryptSQLException("LIKE");
             }
-            Optional<String> assistedQueryColumn = 
encryptTable.get().findAssistedQueryColumn(each.getIdentifier().getValue());
-            SubstitutableColumnNameToken encryptColumnNameToken = 
assistedQueryColumn.map(columnName -> new 
SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(columnName)))
-                    .orElseGet(() -> new 
SubstitutableColumnNameToken(startIndex, stopIndex, 
createColumnProjections(encryptTable.get().getCipherColumn(each.getIdentifier().getValue()))));
-            result.add(encryptColumnNameToken);
         }
-        return result;
+        Collection<ColumnProjection> columnProjections =
+                
encryptTable.findAssistedQueryColumn(logicColumn).map(this::createColumnProjections).orElseGet(()
 -> createColumnProjections(encryptTable.getCipherColumn(logicColumn)));
+        return new SubstitutableColumnNameToken(startIndex, stopIndex, 
columnProjections);
     }
     
     private boolean isColumnSegmentIncludedInLikeExpression(final 
Collection<WhereSegment> whereSegments, final ColumnSegment 
targetColumnSegment) {
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
index f790de1937a..918fc153650 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
@@ -85,7 +85,7 @@ public final class ProjectionsTokenGenerator implements 
OptionalSQLTokenGenerato
         for (Projection each : 
selectStatementContext.getProjectionsContext().getProjections()) {
             if (each instanceof AggregationProjection && 
!((AggregationProjection) each).getDerivedAggregationProjections().isEmpty()) {
                 result.addAll(((AggregationProjection) 
each).getDerivedAggregationProjections().stream().map(this::getDerivedProjectionText).collect(Collectors.toList()));
-            } else if (each instanceof DerivedProjection && 
((DerivedProjection) each).getDerivedProjection() instanceof 
ColumnOrderByItemSegment) {
+            } else if (each instanceof DerivedProjection && 
((DerivedProjection) each).getDerivedProjectionSegment() instanceof 
ColumnOrderByItemSegment) {
                 TableExtractor tableExtractor = new TableExtractor();
                 
tableExtractor.extractTablesFromSelect(selectStatementContext.getSqlStatement());
                 
result.add(getDerivedProjectionTextFromColumnOrderByItemSegment((DerivedProjection)
 each, tableExtractor, routeUnit, selectStatementContext.getDatabaseType()));
@@ -107,8 +107,8 @@ public final class ProjectionsTokenGenerator implements 
OptionalSQLTokenGenerato
     private String getDerivedProjectionTextFromColumnOrderByItemSegment(final 
DerivedProjection projection, final TableExtractor tableExtractor, final 
RouteUnit routeUnit,
                                                                         final 
DatabaseType databaseType) {
         Preconditions.checkState(projection.getAlias().isPresent());
-        Preconditions.checkState(projection.getDerivedProjection() instanceof 
ColumnOrderByItemSegment);
-        ColumnOrderByItemSegment columnOrderByItemSegment = 
(ColumnOrderByItemSegment) projection.getDerivedProjection();
+        Preconditions.checkState(projection.getDerivedProjectionSegment() 
instanceof ColumnOrderByItemSegment);
+        ColumnOrderByItemSegment columnOrderByItemSegment = 
(ColumnOrderByItemSegment) projection.getDerivedProjectionSegment();
         ColumnOrderByItemSegment newColumnOrderByItem = 
generateNewColumnOrderByItem(columnOrderByItemSegment, routeUnit, 
tableExtractor, databaseType);
         return newColumnOrderByItem.getText() + " AS " + 
projection.getAlias().get() + " ";
     }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
index a9fa8dc86ff..38c52ea51b6 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
@@ -143,13 +143,13 @@ class ProjectionsTokenGeneratorTest {
         
when(oldColumnOrderByItemSegment.getColumn().getIdentifier()).thenReturn(mock(IdentifierValue.class));
         DerivedProjection result = mock(DerivedProjection.class);
         
when(result.getAlias()).thenReturn(Optional.of(TEST_DERIVED_PROJECTION_ALIAS));
-        
when(result.getDerivedProjection()).thenReturn(oldColumnOrderByItemSegment);
+        
when(result.getDerivedProjectionSegment()).thenReturn(oldColumnOrderByItemSegment);
         return result;
     }
     
     private DerivedProjection getOtherDerivedProjection() {
         DerivedProjection result = mock(DerivedProjection.class);
-        when(result.getDerivedProjection()).thenReturn(null);
+        when(result.getDerivedProjectionSegment()).thenReturn(null);
         
when(result.getAlias()).thenReturn(Optional.of(TEST_OTHER_DERIVED_PROJECTION_ALIAS));
         
when(result.getExpression()).thenReturn(TEST_OTHER_DERIVED_PROJECTION_EXPRESSION);
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
index 42a3486691f..aba2fcddbd3 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
@@ -297,7 +297,7 @@ public final class ProjectionEngine {
         Collection<Projection> result = new LinkedList<>();
         for (String each : usingColumnNames) {
             for (Projection projection : actualProjections) {
-                if (each.equals(projection.getColumnLabel().toLowerCase())) {
+                if (each.equalsIgnoreCase(projection.getColumnLabel())) {
                     result.add(projection);
                     break;
                 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
index f6a4e924df6..05d75a2e904 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
@@ -39,7 +39,7 @@ public final class DerivedProjection implements Projection {
     
     private final String alias;
     
-    private final SQLSegment derivedProjection;
+    private final SQLSegment derivedProjectionSegment;
     
     @Override
     public Optional<String> getAlias() {
@@ -53,6 +53,6 @@ public final class DerivedProjection implements Projection {
     
     @Override
     public Projection cloneWithOwner(final String ownerName) {
-        return new DerivedProjection(expression, alias, derivedProjection);
+        return new DerivedProjection(expression, alias, 
derivedProjectionSegment);
     }
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/ColumnMetaDataLoader.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/ColumnMetaDataLoader.java
index 4d8335be2df..8e669257269 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/ColumnMetaDataLoader.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/ColumnMetaDataLoader.java
@@ -60,15 +60,15 @@ public final class ColumnMetaDataLoader {
         Collection<String> primaryKeys = loadPrimaryKeys(connection, 
tableNamePattern);
         List<String> columnNames = new ArrayList<>();
         List<Integer> columnTypes = new ArrayList<>();
-        List<Boolean> isPrimaryKeys = new ArrayList<>();
-        List<Boolean> isCaseSensitives = new ArrayList<>();
+        List<Boolean> primaryKeyFlags = new ArrayList<>();
+        List<Boolean> caseSensitiveFlags = new ArrayList<>();
         try (ResultSet resultSet = 
connection.getMetaData().getColumns(connection.getCatalog(), 
connection.getSchema(), tableNamePattern, "%")) {
             while (resultSet.next()) {
                 String tableName = resultSet.getString(TABLE_NAME);
                 if (Objects.equals(tableNamePattern, tableName)) {
                     String columnName = resultSet.getString(COLUMN_NAME);
                     columnTypes.add(resultSet.getInt(DATA_TYPE));
-                    isPrimaryKeys.add(primaryKeys.contains(columnName));
+                    primaryKeyFlags.add(primaryKeys.contains(columnName));
                     columnNames.add(columnName);
                 }
             }
@@ -76,8 +76,8 @@ public final class ColumnMetaDataLoader {
         try (Statement statement = connection.createStatement(); ResultSet 
resultSet = statement.executeQuery(generateEmptyResultSQL(tableNamePattern, 
columnNames, databaseType))) {
             for (int i = 0; i < columnNames.size(); i++) {
                 boolean generated = resultSet.getMetaData().isAutoIncrement(i 
+ 1);
-                
isCaseSensitives.add(resultSet.getMetaData().isCaseSensitive(resultSet.findColumn(columnNames.get(i))));
-                result.add(new ColumnMetaData(columnNames.get(i), 
columnTypes.get(i), isPrimaryKeys.get(i), generated, isCaseSensitives.get(i), 
true, false));
+                
caseSensitiveFlags.add(resultSet.getMetaData().isCaseSensitive(resultSet.findColumn(columnNames.get(i))));
+                result.add(new ColumnMetaData(columnNames.get(i), 
columnTypes.get(i), primaryKeyFlags.get(i), generated, 
caseSensitiveFlags.get(i), true, false));
             }
         }
         return result;
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/metadata/dialect/SQLServerSchemaMetaDataLoader.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/metadata/dialect/SQLServerSchemaMetaDataLoader.java
index 91deb5b4e34..bfa6071084b 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/metadata/dialect/SQLServerSchemaMetaDataLoader.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/metadata/dialect/SQLServerSchemaMetaDataLoader.java
@@ -112,9 +112,9 @@ public final class SQLServerSchemaMetaDataLoader implements 
DialectSchemaMetaDat
         if (versionContainsHiddenColumn(databaseMetaData)) {
             stringBuilder.append("is_hidden AS IS_HIDDEN,");
         }
-        String isHidden = stringBuilder.toString();
-        return tables.isEmpty() ? String.format(TABLE_META_DATA_SQL, isHidden)
-                : String.format(TABLE_META_DATA_SQL_IN_TABLES, isHidden, 
tables.stream().map(each -> String.format("'%s'", 
each)).collect(Collectors.joining(",")));
+        String hiddenFlag = stringBuilder.toString();
+        return tables.isEmpty() ? String.format(TABLE_META_DATA_SQL, 
hiddenFlag)
+                : String.format(TABLE_META_DATA_SQL_IN_TABLES, hiddenFlag, 
tables.stream().map(each -> String.format("'%s'", 
each)).collect(Collectors.joining(",")));
     }
     
     private boolean versionContainsHiddenColumn(final DatabaseMetaData 
databaseMetaData) throws SQLException {
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/ClasspathDriverURLProvider.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/ClasspathDriverURLProvider.java
index 1f27a8e64d8..64c00abd937 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/ClasspathDriverURLProvider.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/ClasspathDriverURLProvider.java
@@ -73,6 +73,6 @@ public final class ClasspathDriverURLProvider implements 
ShardingSphereDriverURL
                 }
             }
         }
-        throw new NullPointerException(String.format("Can not find 
configuration file `%s`.", resource));
+        throw new IllegalArgumentException(String.format("Can not find 
configuration file `%s`.", resource));
     }
 }
diff --git 
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/exception/job/ModeConfigNotFoundException.java
 
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/exception/job/ModeConfigNotFoundException.java
deleted file mode 100644
index 19c93e35237..00000000000
--- 
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/exception/job/ModeConfigNotFoundException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.data.pipeline.core.exception.job;
-
-import 
org.apache.shardingsphere.data.pipeline.core.exception.PipelineSQLException;
-import 
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
-
-/**
- * Mode config not found exception.
- */
-public final class ModeConfigNotFoundException extends PipelineSQLException {
-    
-    private static final long serialVersionUID = -903289953649758722L;
-    
-    public ModeConfigNotFoundException() {
-        super(XOpenSQLState.CHECK_OPTION_VIOLATION, 3, "Mode configuration 
does not exist.");
-    }
-}
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngine.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngine.java
index 32c85d164c5..a729b2fc566 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngine.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngine.java
@@ -78,14 +78,15 @@ public final class SingleStandardRouteEngine implements 
SingleRouteEngine {
         if (sqlStatement instanceof CreateTableStatement) {
             QualifiedTable table = singleTableNames.iterator().next();
             Optional<DataNode> dataNodeOptional = 
rule.findSingleTableDataNode(table.getSchemaName(), table.getTableName());
-            if (!dataNodeOptional.isPresent()) {
-                String dataSourceName = rule.assignNewDataSourceName();
-                routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper(dataSourceName, dataSourceName), Collections.singleton(new 
RouteMapper(table.getTableName(), table.getTableName()))));
-            } else if 
(CreateTableStatementHandler.ifNotExists((CreateTableStatement) sqlStatement)) {
+            boolean containsIfNotExists = 
CreateTableStatementHandler.ifNotExists((CreateTableStatement) sqlStatement);
+            if (dataNodeOptional.isPresent() && containsIfNotExists) {
                 String dataSourceName = 
dataNodeOptional.map(DataNode::getDataSourceName).orElse(null);
                 routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper(dataSourceName, dataSourceName), Collections.singleton(new 
RouteMapper(table.getTableName(), table.getTableName()))));
-            } else {
+            } else if (dataNodeOptional.isPresent() && !containsIfNotExists) {
                 throw new TableExistsException(table.getTableName());
+            } else {
+                String dataSourceName = rule.assignNewDataSourceName();
+                routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper(dataSourceName, dataSourceName), Collections.singleton(new 
RouteMapper(table.getTableName(), table.getTableName()))));
             }
         } else if (sqlStatement instanceof AlterTableStatement || sqlStatement 
instanceof DropTableStatement || rule.isAllTablesInSameDataSource(routeContext, 
singleTableNames)) {
             fillRouteContext(rule, routeContext, 
rule.getSingleTableNames(singleTableNames));

Reply via email to