You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2020/09/24 11:30:10 UTC
[shardingsphere] branch master updated: fix NPE when table not
exists (#7586)
This is an automated email from the ASF dual-hosted git repository.
panjuan 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 52b0150 fix NPE when table not exists (#7586)
52b0150 is described below
commit 52b015065be9b33c065eca01faf7a3bcea612240
Author: xbkaishui <xb...@126.com>
AuthorDate: Thu Sep 24 19:29:51 2020 +0800
fix NPE when table not exists (#7586)
---
.../sql/context/ExecutionContextBuilder.java | 11 +++++++--
.../sql/context/ExecutionContextBuilderTest.java | 28 ++++++++++++++++++++++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
index 8b21b8c..6296e4a 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
@@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteUnit;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
@@ -118,7 +119,10 @@ public final class ExecutionContextBuilder {
private static List<PrimaryKeyMetaData> getPrimaryKeyColumns(final ShardingSphereMetaData metaData, final List<String> actualTableNames) {
List<PrimaryKeyMetaData> result = new LinkedList<>();
for (String each: actualTableNames) {
- result.add(new PrimaryKeyMetaData(each, metaData.getRuleSchemaMetaData().getSchemaMetaData().get(each).getPrimaryKeyColumns()));
+ TableMetaData tableMetaData = metaData.getRuleSchemaMetaData().getSchemaMetaData().get(each);
+ if (null != tableMetaData) {
+ result.add(new PrimaryKeyMetaData(each, tableMetaData.getPrimaryKeyColumns()));
+ }
}
return result;
}
@@ -126,7 +130,10 @@ public final class ExecutionContextBuilder {
private static List<PrimaryKeyMetaData> getPrimaryKeyColumns(final ShardingSphereMetaData metaData, final Collection<RouteMapper> tableMappers) {
List<PrimaryKeyMetaData> result = new LinkedList<>();
for (RouteMapper each: tableMappers) {
- result.add(new PrimaryKeyMetaData(each.getLogicName(), metaData.getRuleSchemaMetaData().getSchemaMetaData().get(each.getLogicName()).getPrimaryKeyColumns()));
+ TableMetaData tableMetaData = metaData.getRuleSchemaMetaData().getSchemaMetaData().get(each.getLogicName());
+ if (null != tableMetaData) {
+ result.add(new PrimaryKeyMetaData(each.getLogicName(), tableMetaData.getPrimaryKeyColumns()));
+ }
}
return result;
}
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java
index e6e20b2..0093728 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java
@@ -78,6 +78,34 @@ public final class ExecutionContextBuilderTest {
expected.add(expectedUnit1);
expected.add(expectedUnit2);
assertThat(actual, is(expected));
+ assertThat(actual.iterator().next().getSqlUnit().getSqlRuntimeContext().getPrimaryKeyMetaDatas().size(), is(1));
+ }
+
+ @Test
+ public void assertBuildRouteSQLRewriteResultWithEmptyPrimaryKeyMeta() {
+ RouteUnit routeUnit2 = new RouteUnit(new RouteMapper("logicName2", "actualName2"), Collections.singletonList(new RouteMapper("logicName2", "actualName2")));
+ SQLRewriteUnit sqlRewriteUnit2 = new SQLRewriteUnit("sql2", Collections.singletonList("parameter2"));
+ Map<RouteUnit, SQLRewriteUnit> sqlRewriteUnits = new HashMap<>(2, 1);
+ sqlRewriteUnits.put(routeUnit2, sqlRewriteUnit2);
+ RuleSchemaMetaData ruleSchemaMetaData = buildRuleSchemaMetaDataWithoutPrimaryKey();
+ ShardingSphereMetaData metaData = new ShardingSphereMetaData(mock(DataSourceMetaDatas.class), ruleSchemaMetaData, "sharding_db");
+ Collection<ExecutionUnit> actual = ExecutionContextBuilder.build(metaData, new RouteSQLRewriteResult(sqlRewriteUnits), mock(SQLStatementContext.class));
+ ExecutionUnit expectedUnit2 = new ExecutionUnit("actualName2", new SQLUnit("sql2", Collections.singletonList("parameter2")));
+ Collection<ExecutionUnit> expected = new LinkedHashSet<>(1, 1);
+ expected.add(expectedUnit2);
+ assertThat(actual, is(expected));
+ assertThat(actual.iterator().next().getSqlUnit().getSqlRuntimeContext().getPrimaryKeyMetaDatas().size(), is(0));
+ }
+
+ private RuleSchemaMetaData buildRuleSchemaMetaDataWithoutPrimaryKey() {
+ Map<String, TableMetaData> tableMetaDataMap = new HashMap<>(3, 1);
+ tableMetaDataMap.put("logicName1", new TableMetaData(Arrays.asList(new ColumnMetaData("order_id", Types.INTEGER, "int", true, false, false),
+ new ColumnMetaData("user_id", Types.INTEGER, "int", false, false, false),
+ new ColumnMetaData("status", Types.INTEGER, "int", false, false, false)), Collections.emptySet()));
+ tableMetaDataMap.put("t_other", new TableMetaData(Collections.singletonList(new ColumnMetaData("order_id", Types.INTEGER, "int", true, false, false)), Collections.emptySet()));
+ Map<String, Collection<String>> unconfiguredSchemaMetaDataMap = new HashMap<>(1, 1);
+ unconfiguredSchemaMetaDataMap.put("ds_0", Arrays.asList("t_category"));
+ return new RuleSchemaMetaData(new SchemaMetaData(tableMetaDataMap), unconfiguredSchemaMetaDataMap);
}
private RuleSchemaMetaData buildRuleSchemaMetaData() {