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;
}