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 <[email protected]>
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() {

Reply via email to