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