This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 ad172fc  [DistSQL] `create/alter sharding table rule` syntax support 
complex strategy. (#14565)
ad172fc is described below

commit ad172fcf057f4ffbae6be4795fbf16d007018622
Author: lanchengx <[email protected]>
AuthorDate: Mon Jan 10 17:31:22 2022 +0800

    [DistSQL] `create/alter sharding table rule` syntax support complex 
strategy. (#14565)
    
    * `Create/alter sharding table rule` support complex strategy.
    
    * `Create/alter sharding table rule` support complex strategy.
    
    * Fix #14554: [DistSQL] Inconsistent case causes the default sharding 
database strategy not work. (#14557)
    
    * Remove unused import.
---
 .../checker/ShardingTableRuleStatementChecker.java |  8 +++---
 .../handler/enums/ShardingStrategyType.java        | 30 +++++++++++++++++++++-
 ...terDefaultShardingStrategyStatementUpdater.java |  2 ++
 ...ateDefaultShardingStrategyStatementUpdater.java |  2 ++
 .../checker/ShardingRuleStatementCheckerTest.java  | 16 ++++++++++++
 ...efaultShardingStrategyStatementUpdaterTest.java |  9 +++++++
 ...efaultShardingStrategyStatementUpdaterTest.java |  9 +++++++
 .../src/main/antlr4/imports/sharding/Keyword.g4    |  4 +++
 .../main/antlr4/imports/sharding/RDLStatement.g4   | 12 +++++++--
 .../core/ShardingDistSQLStatementVisitor.java      | 21 ++++++++++-----
 .../src/main/resources/case/rdl/alter.xml          | 20 ++++++++++++++-
 .../src/main/resources/case/rdl/create.xml         | 23 +++++++++++++++++
 .../src/main/resources/sql/supported/rdl/alter.xml |  2 ++
 .../main/resources/sql/supported/rdl/create.xml    |  2 ++
 14 files changed, 146 insertions(+), 14 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
index f7125b7..fc6945a 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
@@ -210,13 +210,15 @@ public final class ShardingTableRuleStatementChecker {
     private static void checkStrategy(final String schemaName, final 
ShardingRuleConfiguration currentRuleConfig, final Collection<TableRuleSegment> 
rules) throws DistSQLException {
         Collection<String> currentAlgorithms = null == currentRuleConfig ? 
Collections.emptySet() : currentRuleConfig.getShardingAlgorithms().keySet();
         Collection<String> invalidAlgorithms = rules.stream().map(each -> 
Arrays.asList(each.getDatabaseStrategySegment(), 
each.getTableStrategySegment()))
-                
.flatMap(Collection::stream).filter(Objects::nonNull).filter(each -> 
isAlgorithmInvalid(currentAlgorithms, each))
+                
.flatMap(Collection::stream).filter(Objects::nonNull).filter(each -> 
isInvalidStrategy(currentAlgorithms, each))
                 
.map(ShardingStrategySegment::getShardingAlgorithmName).collect(Collectors.toCollection(LinkedList::new));
         DistSQLException.predictionThrow(invalidAlgorithms.isEmpty(), new 
InvalidAlgorithmConfigurationException(schemaName, invalidAlgorithms));
     }
     
-    private static boolean isAlgorithmInvalid(final Collection<String> 
currentAlgorithms, final ShardingStrategySegment shardingStrategySegment) {
-        return 
!ShardingStrategyType.contain(shardingStrategySegment.getType()) || 
!isAlgorithmExists(currentAlgorithms, shardingStrategySegment);
+    private static boolean isInvalidStrategy(final Collection<String> 
currentAlgorithms, final ShardingStrategySegment shardingStrategySegment) {
+        return !ShardingStrategyType.contain(shardingStrategySegment.getType())
+                || 
!ShardingStrategyType.getValueOf(shardingStrategySegment.getType()).isValid(shardingStrategySegment.getShardingColumn())
+                || !isAlgorithmExists(currentAlgorithms, 
shardingStrategySegment);
     }
     
     private static boolean isAlgorithmExists(final Collection<String> 
currentAlgorithms, final ShardingStrategySegment shardingStrategySegment) {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/enums/ShardingStrategyType.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/enums/ShardingStrategyType.java
index 8eef5c2..b4fb4e5 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/enums/ShardingStrategyType.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/enums/ShardingStrategyType.java
@@ -47,6 +47,11 @@ public enum ShardingStrategyType {
         public Collection<String> getConfigurationContents(final 
ShardingStrategyConfiguration strategyConfiguration) {
             return Arrays.asList(((StandardShardingStrategyConfiguration) 
strategyConfiguration).getShardingColumn(), 
strategyConfiguration.getShardingAlgorithmName());
         }
+        
+        @Override
+        public boolean isValid(final String shardingColumn) {
+            return null != shardingColumn && !shardingColumn.contains(",");
+        }
     }, NONE {
         @Override
         public ShardingStrategyConfiguration createConfiguration(final String 
shardingAlgorithmName, final String shardingColumn) {
@@ -62,6 +67,11 @@ public enum ShardingStrategyType {
         public Collection<String> getConfigurationContents(final 
ShardingStrategyConfiguration strategyConfiguration) {
             return Arrays.asList("", 
strategyConfiguration.getShardingAlgorithmName());
         }
+        
+        @Override
+        public boolean isValid(final String shardingColumn) {
+            return true;
+        }
     }, HINT {
         @Override
         public ShardingStrategyConfiguration createConfiguration(final String 
shardingAlgorithmName, final String shardingColumn) {
@@ -77,6 +87,11 @@ public enum ShardingStrategyType {
         public Collection<String> getConfigurationContents(final 
ShardingStrategyConfiguration strategyConfiguration) {
             return Arrays.asList("", 
strategyConfiguration.getShardingAlgorithmName());
         }
+        
+        @Override
+        public boolean isValid(final String shardingColumn) {
+            return true;
+        }
     }, COMPLEX {
         @Override
         public ShardingStrategyConfiguration createConfiguration(final String 
shardingAlgorithmName, final String shardingColumn) {
@@ -92,6 +107,11 @@ public enum ShardingStrategyType {
         public Collection<String> getConfigurationContents(final 
ShardingStrategyConfiguration strategyConfiguration) {
             return Arrays.asList(((ComplexShardingStrategyConfiguration) 
strategyConfiguration).getShardingColumns(), 
strategyConfiguration.getShardingAlgorithmName());
         }
+        
+        @Override
+        public boolean isValid(final String shardingColumn) {
+            return null != shardingColumn && shardingColumn.split(",").length 
> 1;
+        }
     };
     
     /**
@@ -112,13 +132,21 @@ public enum ShardingStrategyType {
     
     /**
      * Get the content in the configuration.
+     *
      * @param strategyConfiguration sharding strategy configuration.
-     * 
      * @return Content list
      */
     public abstract Collection<String> 
getConfigurationContents(ShardingStrategyConfiguration strategyConfiguration);
     
     /**
+     * Check whether the configuration is valid.
+     *
+     * @param shardingColumn sharding column
+     * @return valid or invalid
+     */
+    public abstract boolean isValid(String shardingColumn);
+    
+    /**
      * Returns the sharding strategy type.
      *
      * @param name name
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyStatementUpdater.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyStatementUpdater.java
index 0c65a73..b8d86a0 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyStatementUpdater.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyStatementUpdater.java
@@ -55,6 +55,8 @@ public final class 
AlterDefaultShardingStrategyStatementUpdater implements RuleD
     
     private void checkAlgorithm(final String schemaName, final 
ShardingRuleConfiguration currentRuleConfig, final 
AlterDefaultShardingStrategyStatement sqlStatement) throws DistSQLException {
         
DistSQLException.predictionThrow(ShardingStrategyType.contain(sqlStatement.getStrategyType()),
 new InvalidAlgorithmConfigurationException(sqlStatement.getStrategyType()));
+        
DistSQLException.predictionThrow(ShardingStrategyType.getValueOf(sqlStatement.getStrategyType()).isValid(sqlStatement.getShardingColumn()),
+                new 
InvalidAlgorithmConfigurationException(sqlStatement.getStrategyType()));
         
DistSQLException.predictionThrow(isAlgorithmDefinitionExists(sqlStatement), new 
RequiredAlgorithmMissedException());
         if (null == sqlStatement.getShardingAlgorithmName() && null != 
sqlStatement.getAlgorithmSegment()) {
             return;
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
index e1e1acd..aecc355 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
@@ -56,6 +56,8 @@ public final class 
CreateDefaultShardingStrategyStatementUpdater implements Rule
     
     private void checkAlgorithm(final String schemaName, final 
ShardingRuleConfiguration currentRuleConfig, final 
CreateDefaultShardingStrategyStatement sqlStatement) throws DistSQLException {
         
DistSQLException.predictionThrow(ShardingStrategyType.contain(sqlStatement.getStrategyType()),
 new InvalidAlgorithmConfigurationException(sqlStatement.getStrategyType()));
+        
DistSQLException.predictionThrow(ShardingStrategyType.getValueOf(sqlStatement.getStrategyType()).isValid(sqlStatement.getShardingColumn()),
 
+                new 
InvalidAlgorithmConfigurationException(sqlStatement.getStrategyType()));
         
DistSQLException.predictionThrow(isAlgorithmDefinitionExists(sqlStatement), new 
RequiredAlgorithmMissedException());
         if (null == sqlStatement.getShardingAlgorithmName() && null != 
sqlStatement.getAlgorithmSegment()) {
             return;
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
index 4bebe85..3021996 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
@@ -150,6 +150,22 @@ public final class ShardingRuleStatementCheckerTest {
     }
     
     @Test(expected = InvalidAlgorithmConfigurationException.class)
+    public void assertCheckTableWithUnmatchedShardingStrategyType1() throws 
DistSQLException {
+        TableRuleSegment tableRuleSegment = new TableRuleSegment("t_product", 
Arrays.asList("ds_0", "ds_1"));
+        tableRuleSegment.setTableStrategySegment(new 
ShardingStrategySegment("complex", "product_id", "t_order_algorithm", null));
+        List<AbstractTableRuleSegment> rules = Arrays.asList(tableRuleSegment);
+        
ShardingTableRuleStatementChecker.checkCreation(shardingSphereMetaData, rules, 
shardingRuleConfiguration);
+    }
+    
+    @Test(expected = InvalidAlgorithmConfigurationException.class)
+    public void assertCheckTableWithUnmatchedShardingStrategyType2() throws 
DistSQLException {
+        TableRuleSegment tableRuleSegment = new TableRuleSegment("t_product", 
Arrays.asList("ds_0", "ds_1"));
+        tableRuleSegment.setTableStrategySegment(new 
ShardingStrategySegment("standard", "product_id,user_id", "t_order_algorithm", 
null));
+        List<AbstractTableRuleSegment> rules = Arrays.asList(tableRuleSegment);
+        
ShardingTableRuleStatementChecker.checkCreation(shardingSphereMetaData, rules, 
shardingRuleConfiguration);
+    }
+    
+    @Test(expected = InvalidAlgorithmConfigurationException.class)
     public void assertCheckTableWithInvalidAlgorithmName() throws 
DistSQLException {
         TableRuleSegment tableRuleSegment = new TableRuleSegment("t_product", 
Arrays.asList("ds_0", "ds_1"));
         tableRuleSegment.setTableStrategySegment(new 
ShardingStrategySegment("hint", "product_id", "invalid", null));
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyStatementUpdaterTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyStatementUpdaterTest.java
index 02915d1..733735f 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyStatementUpdaterTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyStatementUpdaterTest.java
@@ -72,6 +72,15 @@ public final class 
AlterDefaultShardingStrategyStatementUpdaterTest {
         updater.checkSQLStatement(shardingSphereMetaData, statement, 
currentRuleConfig);
     }
     
+    @Test(expected = InvalidAlgorithmConfigurationException.class)
+    public void assertExecuteWithUnmatchedStrategy() throws DistSQLException {
+        AlterDefaultShardingStrategyStatement statement = new 
AlterDefaultShardingStrategyStatement("TABLE", "standard", "order_id,user_id", 
"order_id_algorithm", null);
+        ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
+        currentRuleConfig.setDefaultTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
+        currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", 
null);
+        updater.checkSQLStatement(shardingSphereMetaData, statement, 
currentRuleConfig);
+    }
+    
     @Test
     public void assertAlterDefaultTableShardingStrategy() throws 
DistSQLException {
         AlterDefaultShardingStrategyStatement statement = new 
AlterDefaultShardingStrategyStatement("TABLE", "standard", "order_id", 
"order_id_algorithm", null);
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
index 60feb77..87a76a2 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
@@ -72,6 +72,15 @@ public final class 
CreateDefaultShardingStrategyStatementUpdaterTest {
         updater.checkSQLStatement(shardingSphereMetaData, statement, 
currentRuleConfig);
     }
     
+    @Test(expected = InvalidAlgorithmConfigurationException.class)
+    public void assertExecuteWithUnmatchedStrategy() throws DistSQLException {
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement("TABLE", "standard", "order_id,user_id", 
"order_id_algorithm", null);
+        ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
+        currentRuleConfig.setDefaultTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
+        currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", 
null);
+        updater.checkSQLStatement(shardingSphereMetaData, statement, 
currentRuleConfig);
+    }
+    
     @Test
     public void assertCreateDefaultTableShardingStrategy() throws 
DistSQLException {
         CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement("TABLE", "standard", "order_id", 
"order_id_algorithm", null);
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/Keyword.g4
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/Keyword.g4
index 8ba5b70..1932453 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/Keyword.g4
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/Keyword.g4
@@ -71,6 +71,10 @@ SHARDING_COLUMN
     : S H A R D I N G UL_ C O L U M N
     ;
 
+SHARDING_COLUMNS
+    : S H A R D I N G UL_ C O L U M N S
+    ;
+
 TYPE
     : T Y P E
     ;
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/RDLStatement.g4
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/RDLStatement.g4
index 9959791..b697817 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/RDLStatement.g4
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-parser/src/main/antlr4/imports/sharding/RDLStatement.g4
@@ -96,7 +96,7 @@ shardingTableRuleDefinition
     ;
 
 shardingAutoTableRule
-    : tableName LP resources COMMA shardingColumn COMMA algorithmDefinition 
(COMMA keyGenerateDeclaration)? RP
+    : tableName LP resources COMMA shardingColumnDefinition COMMA 
algorithmDefinition (COMMA keyGenerateDeclaration)? RP
     ;
 
 shardingTableRule
@@ -127,10 +127,18 @@ dataNode
     : IDENTIFIER | STRING
     ;
 
+shardingColumnDefinition
+    : shardingColumn | shardingColumns
+    ;
+
 shardingColumn
     : SHARDING_COLUMN EQ columnName
     ;
 
+shardingColumns
+    : SHARDING_COLUMNS EQ columnName COMMA columnName (COMMA columnName)*
+    ;
+
 shardingAlgorithm
     : existingAlgorithm | autoCreativeAlgorithm
     ;
@@ -148,7 +156,7 @@ keyGenerator
     ;
 
 shardingStrategy
-    :  TYPE EQ strategyType COMMA shardingColumn COMMA shardingAlgorithm 
+    :  TYPE EQ strategyType COMMA shardingColumnDefinition COMMA 
shardingAlgorithm 
     ;
 
 databaseStrategy
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 f4542fe..1dbf003 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
@@ -53,6 +53,7 @@ import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatement
 import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatementParser.SetShardingHintDatabaseValueContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatementParser.ShardingAlgorithmDefinitionContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatementParser.ShardingAutoTableRuleContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatementParser.ShardingColumnDefinitionContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatementParser.ShardingStrategyContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatementParser.ShardingTableRuleContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.ShardingDistSQLStatementParser.ShardingTableRuleDefinitionContext;
@@ -210,8 +211,8 @@ public final class ShardingDistSQLStatementVisitor extends 
ShardingDistSQLStatem
             algorithmSegment = (AlgorithmSegment) 
visitAlgorithmDefinition(shardingStrategyContext.shardingAlgorithm().autoCreativeAlgorithm().algorithmDefinition());
         }
         String defaultType = new 
IdentifierValue(ctx.type.getText()).getValue();
-        String strategyType = 
getIdentifierValue(shardingStrategyContext.strategyType());
-        String shardingColumn = 
getIdentifierValue(shardingStrategyContext.shardingColumn().columnName());
+        String strategyType = 
getIdentifierValue(shardingStrategyContext.strategyType());        
+        String shardingColumn = 
buildShardingColumn(ctx.shardingStrategy().shardingColumnDefinition());
         return new CreateDefaultShardingStrategyStatement(defaultType, 
strategyType, shardingColumn, shardingAlgorithmName, algorithmSegment);
     }
     
@@ -246,9 +247,9 @@ public final class ShardingDistSQLStatementVisitor extends 
ShardingDistSQLStatem
         if (null != 
shardingStrategyContext.shardingAlgorithm().autoCreativeAlgorithm()) {
             algorithmSegment = (AlgorithmSegment) 
visitAlgorithmDefinition(shardingStrategyContext.shardingAlgorithm().autoCreativeAlgorithm().algorithmDefinition());
         }
-        String defaultType = new 
IdentifierValue(ctx.type.getText()).getValue().toLowerCase();
-        String strategyType = 
getIdentifierValue(shardingStrategyContext.strategyType()).toLowerCase();
-        String shardingColumn = 
getIdentifierValue(shardingStrategyContext.shardingColumn().columnName()).toLowerCase();
+        String defaultType = new 
IdentifierValue(ctx.type.getText()).getValue();
+        String strategyType = 
getIdentifierValue(shardingStrategyContext.strategyType());
+        String shardingColumn = 
buildShardingColumn(ctx.shardingStrategy().shardingColumnDefinition());
         return new AlterDefaultShardingStrategyStatement(defaultType, 
strategyType, shardingColumn, shardingAlgorithmName, algorithmSegment);
     }
     
@@ -319,7 +320,7 @@ public final class ShardingDistSQLStatementVisitor extends 
ShardingDistSQLStatem
         Collection<String> dataSources = getResources(ctx.resources());
         AutoTableRuleSegment result = new AutoTableRuleSegment(tableName, 
dataSources);
         Optional.ofNullable(ctx.keyGenerateDeclaration()).ifPresent(op -> 
result.setKeyGenerateSegment((KeyGenerateSegment) 
visit(ctx.keyGenerateDeclaration())));
-        Optional.ofNullable(ctx.shardingColumn()).ifPresent(op -> 
result.setShardingColumn(getIdentifierValue(ctx.shardingColumn().columnName())));
+        Optional.ofNullable(ctx.shardingColumnDefinition()).ifPresent(op -> 
result.setShardingColumn(buildShardingColumn(ctx.shardingColumnDefinition())));
         Optional.ofNullable(ctx.algorithmDefinition()).ifPresent(op -> 
result.setShardingAlgorithmSegment((AlgorithmSegment) 
visit(ctx.algorithmDefinition())));
         return result;
     }
@@ -353,7 +354,7 @@ public final class ShardingDistSQLStatementVisitor extends 
ShardingDistSQLStatem
         if (null != ctx.shardingAlgorithm().autoCreativeAlgorithm()) {
             algorithmSegment = (AlgorithmSegment) 
visitAlgorithmDefinition(ctx.shardingAlgorithm().autoCreativeAlgorithm().algorithmDefinition());
         }
-        return new 
ShardingStrategySegment(getIdentifierValue(ctx.strategyType()), 
getIdentifierValue(ctx.shardingColumn().columnName()), shardingAlgorithmName, 
algorithmSegment);
+        return new 
ShardingStrategySegment(getIdentifierValue(ctx.strategyType()), 
buildShardingColumn(ctx.shardingColumnDefinition()), shardingAlgorithmName, 
algorithmSegment);
     }
     
     private Collection<String> getResources(final ResourcesContext ctx) {
@@ -451,4 +452,10 @@ public final class ShardingDistSQLStatementVisitor extends 
ShardingDistSQLStatem
     public ASTNode visitShowUnusedShardingAlgorithms(final 
ShowUnusedShardingAlgorithmsContext ctx) {
         return new 
ShowUnusedShardingAlgorithmsStatement(Objects.nonNull(ctx.schemaName()) ? 
(SchemaSegment) visit(ctx.schemaName()) : null);
     }
+    
+    private String buildShardingColumn(final ShardingColumnDefinitionContext 
ctx) {
+        String result = Optional.ofNullable(ctx.shardingColumn()).map(op -> 
getIdentifierValue(op.columnName()))
+                .orElseGet(() -> 
ctx.shardingColumns().columnName().stream().map(this::getIdentifierValue).collect(Collectors.joining(",")));
+        return result.isEmpty() ? null : result;
+    }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
index 2974e62..b28f5d3 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
@@ -108,6 +108,19 @@
             </key-generate-strategy>
         </rule>
     </alter-sharding-table-rule>
+
+    <alter-sharding-table-rule sql-case-id="alter-sharding-table-rule-complex">
+        <rule name="t_order" 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="complex" 
sharding-column="order_id,user_id" 
sharding-algorithm-name="database_inline"></database-strategy>
+            <key-generate-strategy algorithm-name="snowflake">
+                <properties>
+                    <property key="worker-id" value="123"/>
+                </properties>
+            </key-generate-strategy>
+        </rule>
+    </alter-sharding-table-rule>
     
     <alter-sharding-binding-table-rules 
sql-case-id="alter-sharding-binding-table-rules">
         <rule table-groups="t_order,t_order_item"/>
@@ -289,7 +302,12 @@
     <alter-default-single-table sql-case-id="alter-default-single-table" 
default-data-source="ds_0" />
 
     <alter-default-sharding-strategy 
sql-case-id="alter-default-sharding-strategy">
-        <strategy default-type="table" strategy-type="standard" 
sharding-column="order_id" sharding-algorithm-name="algorithms_name">
+        <strategy default-type="TABLE" strategy-type="standard" 
sharding-column="order_id" sharding-algorithm-name="algorithms_name">
+        </strategy>
+    </alter-default-sharding-strategy>
+
+    <alter-default-sharding-strategy 
sql-case-id="alter-default-sharding-strategy-complex">
+        <strategy default-type="TABLE" strategy-type="complex" 
sharding-column="order_id,user_id" sharding-algorithm-name="algorithms_name">
         </strategy>
     </alter-default-sharding-strategy>
 </sql-parser-test-cases>
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 29cce72..a889991 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
@@ -135,6 +135,24 @@
         </rule>
     </create-sharding-table-rule>
 
+    <create-sharding-table-rule 
sql-case-id="create-sharding-table-rule-complex">
+        <rule name="t_order" 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="complex" 
sharding-column="order_id,user_id" 
sharding-algorithm-name="database_inline"></database-strategy>
+            <key-generate-strategy algorithm-name="snowflake">
+                <properties>
+                    <property key="worker-id" value="123"/>
+                </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-table-rule 
sql-case-id="create-sharding-table-rule-with-auto-create-algorithm">
         <rule name="t_order" key-generate-strategy-column="another_id">
             <data-source>ms_group_${0..1}</data-source>
@@ -406,6 +424,11 @@
         </strategy>
     </create-default-sharding-strategy>
 
+    <create-default-sharding-strategy 
sql-case-id="create-default-sharding-strategy-complex">
+        <strategy default-type="TABLE" strategy-type="complex" 
sharding-column="order_id,user_id" sharding-algorithm-name="algorithms_name">
+        </strategy>
+    </create-default-sharding-strategy>
+    
     <create-shadow-algorithm sql-case-id="create-shadow-algorithm">
         <shadow-algorithm algorithm-id="simple_note_algorithm">
             <algorithm algorithm-name="HINT">
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
index a35a68b..6bc15a1 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
@@ -41,8 +41,10 @@
     <distsql-case id="alter-shadow-algorithm" value="ALTER SHADOW ALGORITHM 
(simple_note_algorithm, TYPE(NAME=SIMPLE_NOTE, PROPERTIES('shadow'='true', 
'foo'='bar')))" />
     <distsql-case id="alter-shadow-rule" value="ALTER SHADOW RULE 
shadow_rule(SOURCE=demo_ds,SHADOW=demo_ds_shadow,t_order((TYPE(NAME=COLUMN_REGEX_MATCH,PROPERTIES('operation'='insert','column'='user_id','regex'='[1]'))),(simple_note_algorithm,TYPE(NAME=SIMPLE_NOTE,PROPERTIES('shadow'='true',foo='bar')))))"
 />
     <distsql-case id="alter-sharding-table-rule" value="ALTER 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="alter-sharding-table-rule-complex" value="ALTER SHARDING 
TABLE RULE t_order (DATANODES('ms_group_${0..1}'),DATABASE_STRATEGY( TYPE = 
`complex`,sharding_columns = order_id,user_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="alter-sharding-algorithm" value="ALTER SHARDING 
ALGORITHM algorithm_name(TYPE(NAME=inline,PROPERTIES('algorithm-expression' = 
't_order_${order_id % 2}')))" />
     <distsql-case id="alter-default-single-table" value="ALTER DEFAULT SINGLE 
TABLE RULE RESOURCE = ds_0" />
     <distsql-case id="alter-sharding-key-generator" value="ALTER SHARDING KEY 
GENERATOR uuid_key_generator(TYPE(NAME=uuid,PROPERTIES('worker-id' = '123')))" 
/>
     <distsql-case id="alter-default-sharding-strategy" value="ALTER DEFAULT 
SHARDING TABLE STRATEGY(TYPE=standard, SHARDING_COLUMN=order_id, 
SHARDING_ALGORITHM=algorithms_name)" />
+    <distsql-case id="alter-default-sharding-strategy-complex" value="ALTER 
DEFAULT SHARDING TABLE STRATEGY(TYPE=complex, 
SHARDING_COLUMNS=order_id,user_id, SHARDING_ALGORITHM=algorithms_name)" />
 </sql-cases>
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 876fa5e..b97e79b 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
@@ -43,7 +43,9 @@
     <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-table-strategy-with-lower-case" 
value="create default sharding table strategy(type=standard, 
sharding_column=order_id, sharding_algorithm=algorithms_name)" />
     <distsql-case id="create-default-sharding-database-strategy" value="CREATE 
DEFAULT SHARDING DATABASE STRATEGY(TYPE=STANDARD, SHARDING_COLUMN=ORDER_ID, 
SHARDING_ALGORITHM=algorithms_name)" />
+    <distsql-case id="create-default-sharding-strategy-complex" value="CREATE 
DEFAULT SHARDING TABLE STRATEGY(TYPE=complex, 
SHARDING_COLUMNS=order_id,user_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)))),t_order_item
 (DATANODES('ms_group_${0..1}'),DATABASE_STRATEGY( TYPE = `standard`,sharding_ 
[...]
+    <distsql-case id="create-sharding-table-rule-complex" value="CREATE 
SHARDING TABLE RULE t_order (DATANODES('ms_group_${0..1}'),DATABASE_STRATEGY( 
TYPE = `complex`,sharding_columns = order_id,user_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 = `sta [...]
     <distsql-case id="create-sharding-table-rule-with-auto-create-algorithm" 
value="CREATE SHARDING TABLE RULE t_order 
(DATANODES('ms_group_${0..1}'),DATABASE_STRATEGY( TYPE = 
`standard`,sharding_column = order_id,sharding_algorithm 
(TYPE(NAME=inline,PROPERTIES('algorithm-expression'='ms_group_${order_id% 
2}')))),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-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