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 09f5bf5825a Do not throw an exception if the statement contains `if 
not exists` (#22004)
09f5bf5825a is described below

commit 09f5bf5825aec49d96663bf6f80909f56354ef8e
Author: Guocheng Tang <[email protected]>
AuthorDate: Wed Nov 9 12:51:01 2022 +0800

    Do not throw an exception if the statement contains `if not exists` (#22004)
    
    * Remove the mixed examples and use the automatically generated examples.
    
    * merger master
    
    * Do not throw an exception if the statement contains `if not exists`
    
    * add test
    
    * checkstyle
    
    * update code
    
    * update code
    
    * update code
    
    * update code
---
 .../route/engine/SingleTableStandardRouteEngine.java     | 16 +++++++++-------
 .../route/engine/SingleTableStandardRouteEngineTest.java | 12 +++++++++---
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git 
a/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngine.java
 
b/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngine.java
index 9a75ce8881e..888468985a2 100644
--- 
a/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngine.java
+++ 
b/kernel/single-table/core/src/main/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngine.java
@@ -31,6 +31,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableS
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.CreateTableStatementHandler;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -80,21 +81,22 @@ public final class SingleTableStandardRouteEngine 
implements SingleTableRouteEng
     
     private void route0(final RouteContext routeContext, final SingleTableRule 
rule) {
         if (sqlStatement instanceof CreateTableStatement) {
-            String dataSourceName = rule.assignNewDataSourceName();
             QualifiedTable table = singleTableNames.iterator().next();
-            if (isTableExists(table, rule)) {
+            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)) {
+                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 {
                 throw new TableExistsException(table.getTableName());
             }
-            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));
         }
     }
     
-    private boolean isTableExists(final QualifiedTable table, final 
SingleTableRule rule) {
-        return rule.findSingleTableDataNode(table.getSchemaName(), 
table.getTableName()).isPresent();
-    }
-    
     private void fillRouteContext(final SingleTableRule singleTableRule, final 
RouteContext routeContext, final Collection<QualifiedTable> logicTables) {
         for (QualifiedTable each : logicTables) {
             String tableName = each.getTableName();
diff --git 
a/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngineTest.java
 
b/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngineTest.java
index a2775005b6d..d4a4d3ce0e3 100644
--- 
a/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngineTest.java
+++ 
b/kernel/single-table/core/src/test/java/org/apache/shardingsphere/singletable/route/engine/SingleTableStandardRouteEngineTest.java
@@ -128,12 +128,18 @@ public final class SingleTableStandardRouteEngineTest {
     
     @Test(expected = TableExistsException.class)
     public void assertRouteDuplicateSingleTable() {
-        SingleTableStandardRouteEngine engine = new 
SingleTableStandardRouteEngine(Collections.singletonList(new 
QualifiedTable(DefaultDatabase.LOGIC_NAME, "t_order")), mockStatement());
+        SingleTableStandardRouteEngine engine = new 
SingleTableStandardRouteEngine(Collections.singletonList(new 
QualifiedTable(DefaultDatabase.LOGIC_NAME, "t_order")), mockStatement(false));
         engine.route(new RouteContext(), mockSingleTableRule());
     }
     
-    private SQLStatement mockStatement() {
-        MySQLCreateTableStatement result = new 
MySQLCreateTableStatement(false);
+    @Test
+    public void assertRouteIfNotExistsDuplicateSingleTable() {
+        SingleTableStandardRouteEngine engine = new 
SingleTableStandardRouteEngine(Collections.singletonList(new 
QualifiedTable(DefaultDatabase.LOGIC_NAME, "t_order")), mockStatement(true));
+        engine.route(new RouteContext(), mockSingleTableRule());
+    }
+    
+    private SQLStatement mockStatement(final boolean ifNotExists) {
+        MySQLCreateTableStatement result = new 
MySQLCreateTableStatement(ifNotExists);
         result.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))));
         return result;
     }

Reply via email to