You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2023/04/28 08:24:29 UTC

[shardingsphere] branch master updated: Refactor kernel logic for pmd suggestion (#25393)

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 <du...@apache.org>
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));