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 34f0e43  Fix NPE when the key generator is empty (#14080)
34f0e43 is described below

commit 34f0e43aef086c1f1e8d2d1ec84e1013b4511d23
Author: lanchengx <[email protected]>
AuthorDate: Tue Dec 14 19:51:40 2021 +0800

    Fix NPE when the key generator is empty (#14080)
---
 .../distsql/parser/core/ShardingDistSQLStatementVisitor.java       | 2 +-
 .../parameterized/asserts/segment/distsql/TableRuleAssert.java     | 7 ++++---
 .../src/main/resources/case/rdl/create.xml                         | 5 +++++
 .../src/main/resources/sql/supported/rdl/create.xml                | 2 +-
 4 files changed, 11 insertions(+), 5 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
index 3bbeaaf..4c7c7dd 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
@@ -259,7 +259,7 @@ public final class ShardingDistSQLStatementVisitor extends 
ShardingDistSQLStatem
         Collection<String> dataNodes = getDataNodes(ctx.dataNodes());
         ShardingStrategySegment tableStrategy = (ShardingStrategySegment) 
visit(ctx.tableStrategy().shardingStrategy());
         ShardingStrategySegment databaseStrategy = (ShardingStrategySegment) 
visit(ctx.databaseStrategy().shardingStrategy());
-        KeyGenerateSegment keyGenerateSegment = (KeyGenerateSegment) 
visit(ctx.keyGenerateStrategy());
+        KeyGenerateSegment keyGenerateSegment = null != 
ctx.keyGenerateStrategy() ? (KeyGenerateSegment) 
visit(ctx.keyGenerateStrategy()) : null;
         return new TableRuleSegment(tableName, dataNodes, databaseStrategy, 
tableStrategy, keyGenerateSegment);
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/TableRuleAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/TableRuleAssert.java
index 2131a4a..aca829e 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/TableRuleAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/TableRuleAssert.java
@@ -50,9 +50,6 @@ public final class TableRuleAssert {
                     actual.getLogicTable(), is(expected.getName()));
             assertThat(assertContext.getText(String.format("`%s`'s table rule 
segment assertion error: ", actual.getClass().getSimpleName())),
                     actual.getDataSourceNodes(), 
is(expected.getDataSources()));
-            assertNotNull(assertContext.getText("key generate should exist."), 
actual.getKeyGenerateSegment());
-            assertThat(assertContext.getText(String.format("`%s`'s table rule 
segment assertion error: ", actual.getClass().getSimpleName())),
-                    actual.getKeyGenerateSegment().getKeyGenerateColumn(), 
is(expected.getKeyGenerateStrategyColumn()));
             assertThat(assertContext.getText(String.format("`%s`'s table rule 
segment assertion error: ", actual.getClass().getSimpleName())),
                     actual.getTableStrategySegment().getShardingColumn(), 
is(expected.getTableStrategy().getShardingColumn()));
             assertThat(assertContext.getText(String.format("`%s`'s table rule 
segment assertion error: ", actual.getClass().getSimpleName())),
@@ -65,6 +62,10 @@ public final class TableRuleAssert {
                     actual.getDatabaseStrategySegment().getType(), 
is(expected.getDataStrategy().getType()));
             assertThat(assertContext.getText(String.format("`%s`'s table rule 
segment assertion error: ", actual.getClass().getSimpleName())),
                     
actual.getDatabaseStrategySegment().getShardingAlgorithmName(), 
is(expected.getDataStrategy().getShardingAlgorithmName()));
+            if (null != actual.getKeyGenerateSegment()) {
+                assertThat(assertContext.getText(String.format("`%s`'s table 
rule segment assertion error: ", actual.getClass().getSimpleName())),
+                        actual.getKeyGenerateSegment().getKeyGenerateColumn(), 
is(expected.getKeyGenerateStrategyColumn()));
+            }
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
index cbbd42b..c28cc2f 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
@@ -128,6 +128,11 @@
                 </properties>
             </key-generate-strategy>
         </rule>
+        <rule name="t_order_item" key-generate-strategy-column="another_id">
+            <data-source>ms_group_${0..1}</data-source>
+            <table-strategy type="standard" sharding-column="user_id" 
sharding-algorithm-name="table_inline"></table-strategy>
+            <database-strategy type="standard" sharding-column="order_id" 
sharding-algorithm-name="database_inline"></database-strategy>
+        </rule>
     </create-sharding-table-rule>
     
     <create-sharding-binding-table-rule 
sql-case-id="create-sharding-binding-table-rule">
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
index c722f26..002b9db 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
@@ -40,7 +40,7 @@
     <distsql-case id="create-default-shadow-algorithm" value="CREATE DEFAULT 
SHADOW ALGORITHM NAME = simple_hint_algorithm ;" />
     <distsql-case id="create-sharding-algorithm" value="CREATE SHARDING 
ALGORITHM algorithm_name(TYPE(NAME=hash_mod,PROPERTIES('algorithm-expression' = 
't_order_${order_id % 2}')))" />
     <distsql-case id="create-default-sharding-strategy" value="CREATE DEFAULT 
SHARDING TABLE STRATEGY(TYPE=standard, SHARDING_COLUMN=order_id, 
SHARDING_ALGORITHM=algorithms_name)" />
-    <distsql-case id="create-sharding-table-rule" value="CREATE SHARDING TABLE 
RULE t_order (DATANODES('ms_group_${0..1}'),DATABASE_STRATEGY( TYPE = 
`standard`,sharding_column = order_id,sharding_algorithm = 
database_inline),TABLE_STRATEGY(TYPE = `standard`,sharding_column = 
user_id,sharding_algorithm = 
table_inline),GENERATED_KEY(COLUMN=another_id,TYPE(NAME=snowflake,PROPERTIES('worker-id'=123))))"
 />"
+    <distsql-case id="create-sharding-table-rule" value="CREATE SHARDING TABLE 
RULE t_order (DATANODES('ms_group_${0..1}'),DATABASE_STRATEGY( TYPE = 
`standard`,sharding_column = order_id,sharding_algorithm = 
database_inline),TABLE_STRATEGY(TYPE = `standard`,sharding_column = 
user_id,sharding_algorithm = 
table_inline),GENERATED_KEY(COLUMN=another_id,TYPE(NAME=snowflake,PROPERTIES('worker-id'=123)))),t_order_item
 (DATANODES('ms_group_${0..1}'),DATABASE_STRATEGY( TYPE = `standard`,sharding_ 
[...]
     <distsql-case id="create-shadow-algorithm" value="CREATE SHADOW ALGORITHM 
(simple_note_algorithm, TYPE(NAME=HINT, PROPERTIES('shadow'='true', 
'foo'='bar')))" />
     <distsql-case id="create-default-single-table" value="CREATE DEFAULT 
SINGLE TABLE RULE RESOURCE = ds_0" />
 

Reply via email to