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" />