You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/11/09 04:51:10 UTC

[shardingsphere] branch master updated: Do not throw an exception if the statement contains `if not exists` (#22004)

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 <to...@apache.org>
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;
     }