You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2022/01/10 09:32:06 UTC
[shardingsphere] branch master updated: [DistSQL] `create/alter sharding table rule` syntax support complex strategy. (#14565)
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 <52...@users.noreply.github.com>
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" />