This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 9e2202b fix groovy shell exception when use different case for
shardingColumn (#14168)
9e2202b is described below
commit 9e2202bc845ce6535f4a373b6a97483a178daf48
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Mon Dec 20 13:29:07 2021 +0800
fix groovy shell exception when use different case for shardingColumn
(#14168)
---
.../impl/InsertClauseShardingConditionEngine.java | 4 +--
.../impl/WhereClauseShardingConditionEngine.java | 21 ++++++++-----
.../dml/ShardingDMLStatementValidator.java | 2 +-
.../dml/impl/ShardingInsertStatementValidator.java | 9 ------
.../shardingsphere/sharding/rule/ShardingRule.java | 26 ++++++++++-------
.../dml/ShardingInsertStatementValidatorTest.java | 2 +-
.../dml/ShardingUpdateStatementValidatorTest.java | 3 +-
.../sharding/rule/ShardingRuleTest.java | 34 +++++++++++++++-------
8 files changed, 58 insertions(+), 43 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/InsertClauseShardingConditionEngine.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/InsertClauseShardingConditionEngine.java
index 6ff1819..1f88707 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/InsertClauseShardingConditionEngine.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/InsertClauseShardingConditionEngine.java
@@ -89,7 +89,7 @@ public final class InsertClauseShardingConditionEngine
implements ShardingCondit
DatetimeService datetimeService =
RequiredSPIRegistry.getRegisteredService(DatetimeService.class);
for (ExpressionSegment each :
insertValueContext.getValueExpressions()) {
String columnName = columnNames.next();
- if (shardingRule.isShardingColumn(columnName, tableName)) {
+ if (shardingRule.findShardingColumn(columnName,
tableName).isPresent()) {
if (each instanceof SimpleExpressionSegment) {
result.getValues().add(new
ListShardingConditionValue<>(columnName, tableName,
Collections.singletonList(getShardingValue((SimpleExpressionSegment) each,
parameters))));
} else if (ExpressionConditionUtils.isNowExpression(each)) {
@@ -123,7 +123,7 @@ public final class InsertClauseShardingConditionEngine
implements ShardingCondit
String tableName =
sqlStatementContext.getSqlStatement().getTable().getTableName().getIdentifier().getValue();
if (generatedKey.isPresent() && generatedKey.get().isGenerated() &&
shardingRule.findTableRule(tableName).isPresent()) {
generatedKey.get().getGeneratedValues().addAll(generateKeys(tableName,
sqlStatementContext.getValueListCount()));
- if
(shardingRule.isShardingColumn(generatedKey.get().getColumnName(), tableName)) {
+ if
(shardingRule.findShardingColumn(generatedKey.get().getColumnName(),
tableName).isPresent()) {
appendGeneratedKeyCondition(generatedKey.get(), tableName,
shardingConditions);
}
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
index 2b928fd..6124830 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
@@ -96,16 +96,22 @@ public final class WhereClauseShardingConditionEngine
implements ShardingConditi
private Map<String, String> getColumnTableNames(final
SQLStatementContext<?> sqlStatementContext, final Collection<AndPredicate>
andPredicates) {
Collection<ColumnProjection> result = new LinkedList<>();
for (AndPredicate each : andPredicates) {
- for (ExpressionSegment expressionSegment : each.getPredicates()) {
- for (ColumnSegment columnSegment :
ColumnExtractor.extract(expressionSegment)) {
- ColumnProjection columnProjection =
buildColumnProjection(columnSegment);
- result.add(columnProjection);
- }
+ for (ExpressionSegment expression : each.getPredicates()) {
+ result.addAll(createColumnProjections(expression));
}
}
return sqlStatementContext.getTablesContext().findTableName(result,
schema);
}
+ private Collection<ColumnProjection> createColumnProjections(final
ExpressionSegment expression) {
+ Collection<ColumnProjection> result = new LinkedList<>();
+ for (ColumnSegment each : ColumnExtractor.extract(expression)) {
+ ColumnProjection columnProjection = buildColumnProjection(each);
+ result.add(columnProjection);
+ }
+ return result;
+ }
+
private ColumnProjection buildColumnProjection(final ColumnSegment
segment) {
String owner = segment.getOwner().map(optional ->
optional.getIdentifier().getValue()).orElse(null);
return new ColumnProjection(owner, segment.getIdentifier().getValue(),
null);
@@ -128,10 +134,11 @@ public final class WhereClauseShardingConditionEngine
implements ShardingConditi
for (ColumnSegment columnSegment : ColumnExtractor.extract(each)) {
ColumnProjection projection =
buildColumnProjection(columnSegment);
Optional<String> tableName =
Optional.ofNullable(columnTableNames.get(projection.getExpression()));
- if (!tableName.isPresent() ||
!shardingRule.isShardingColumn(columnSegment.getIdentifier().getValue(),
tableName.get())) {
+ Optional<String> shardingColumn = tableName.flatMap(optional
-> shardingRule.findShardingColumn(columnSegment.getIdentifier().getValue(),
optional));
+ if (!tableName.isPresent() || !shardingColumn.isPresent()) {
continue;
}
- Column column = new Column(projection.getName(),
tableName.get());
+ Column column = new Column(shardingColumn.get(),
tableName.get());
Optional<ShardingConditionValue> shardingConditionValue =
ConditionValueGeneratorFactory.generate(each, column, parameters);
if (!shardingConditionValue.isPresent()) {
continue;
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
index 228ccce..f4a65d8 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingDMLStatementValidator.java
@@ -121,7 +121,7 @@ public abstract class ShardingDMLStatementValidator<T
extends SQLStatement> impl
String tableName =
sqlStatementContext.getTablesContext().getTableNames().iterator().next();
for (AssignmentSegment each : assignments) {
String shardingColumn =
each.getColumns().get(0).getIdentifier().getValue();
- if (shardingRule.isShardingColumn(shardingColumn, tableName)) {
+ if (shardingRule.findShardingColumn(shardingColumn,
tableName).isPresent()) {
Optional<Object> assignmentValue =
getShardingColumnAssignmentValue(each, parameters);
assignmentValue.ifPresent(optional -> values.add(new
ListShardingConditionValue(shardingColumn, tableName,
Collections.singletonList(optional))));
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
index 6e11f78..ca36d7e 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/impl/ShardingInsertStatementValidator.java
@@ -68,15 +68,6 @@ public final class ShardingInsertStatementValidator extends
ShardingDMLStatement
}
}
- private boolean isUpdateShardingKey(final ShardingRule shardingRule, final
OnDuplicateKeyColumnsSegment onDuplicateKeyColumnsSegment, final String
tableName) {
- for (AssignmentSegment each :
onDuplicateKeyColumnsSegment.getColumns()) {
- if
(shardingRule.isShardingColumn(each.getColumns().get(0).getIdentifier().getValue(),
tableName)) {
- return true;
- }
- }
- return false;
- }
-
private boolean isContainsKeyGenerateStrategy(final ShardingRule
shardingRule, final String tableName) {
return shardingRule.findGenerateKeyColumnName(tableName).isPresent();
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index 6f4770c..dcbe5fa 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -393,35 +393,39 @@ public final class ShardingRule implements SchemaRule,
DataNodeContainedRule, Ta
}
/**
- * Judge whether given logic table column is sharding column or not.
+ * Find sharding column.
*
* @param columnName column name
* @param tableName table name
- * @return whether given logic table column is sharding column or not
+ * @return sharding column
*/
- public boolean isShardingColumn(final String columnName, final String
tableName) {
- return
Optional.ofNullable(tableRules.get(tableName.toLowerCase())).filter(each ->
isShardingColumn(each, columnName)).isPresent();
+ public Optional<String> findShardingColumn(final String columnName, final
String tableName) {
+ return
Optional.ofNullable(tableRules.get(tableName.toLowerCase())).flatMap(optional
-> findShardingColumn(optional, columnName));
}
- private boolean isShardingColumn(final TableRule tableRule, final String
columnName) {
- return
isShardingColumn(getDatabaseShardingStrategyConfiguration(tableRule),
columnName) ||
isShardingColumn(getTableShardingStrategyConfiguration(tableRule), columnName);
+ private Optional<String> findShardingColumn(final TableRule tableRule,
final String columnName) {
+ Optional<String> databaseShardingColumn =
findShardingColumn(getDatabaseShardingStrategyConfiguration(tableRule),
columnName);
+ if (databaseShardingColumn.isPresent()) {
+ return databaseShardingColumn;
+ }
+ return
findShardingColumn(getTableShardingStrategyConfiguration(tableRule),
columnName);
}
- private boolean isShardingColumn(final ShardingStrategyConfiguration
shardingStrategyConfig, final String columnName) {
+ private Optional<String> findShardingColumn(final
ShardingStrategyConfiguration shardingStrategyConfig, final String columnName) {
if (shardingStrategyConfig instanceof
StandardShardingStrategyConfiguration) {
String shardingColumn = null ==
((StandardShardingStrategyConfiguration)
shardingStrategyConfig).getShardingColumn()
? defaultShardingColumn :
((StandardShardingStrategyConfiguration)
shardingStrategyConfig).getShardingColumn();
- return shardingColumn.equalsIgnoreCase(columnName);
+ return shardingColumn.equalsIgnoreCase(columnName) ?
Optional.of(shardingColumn) : Optional.empty();
}
if (shardingStrategyConfig instanceof
ComplexShardingStrategyConfiguration) {
List<String> shardingColumns =
Splitter.on(",").trimResults().splitToList(((ComplexShardingStrategyConfiguration)
shardingStrategyConfig).getShardingColumns());
for (String each : shardingColumns) {
if (each.equalsIgnoreCase(columnName)) {
- return true;
+ return Optional.of(each);
}
}
}
- return false;
+ return Optional.empty();
}
/**
@@ -606,7 +610,7 @@ public final class ShardingRule implements SchemaRule,
DataNodeContainedRule, Ta
?
getDatabaseShardingStrategyConfiguration(leftTableRule.get()) :
getTableShardingStrategyConfiguration(leftTableRule.get());
ShardingStrategyConfiguration rightConfiguration =
isDatabaseJoinCondition
?
getDatabaseShardingStrategyConfiguration(rightTableRule.get()) :
getTableShardingStrategyConfiguration(rightTableRule.get());
- if (isShardingColumn(leftConfiguration, leftColumn.getName()) &&
isShardingColumn(rightConfiguration, rightColumn.getName())) {
+ if (findShardingColumn(leftConfiguration,
leftColumn.getName()).isPresent() && findShardingColumn(rightConfiguration,
rightColumn.getName()).isPresent()) {
result.add(columnTableNames.get(leftColumn.getExpression()));
result.add(columnTableNames.get(rightColumn.getExpression()));
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java
index 89a4bd3..647cd3f 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java
@@ -205,7 +205,7 @@ public final class ShardingInsertStatementValidatorTest {
TableRule tableRule = mock(TableRule.class);
when(tableRule.getActualDatasourceNames()).thenReturn(Arrays.asList("ds_0",
"ds_1"));
when(tableRule.getActualTableNames("ds_1")).thenReturn(Collections.singletonList("user"));
- when(shardingRule.isShardingColumn("id", "user")).thenReturn(true);
+ when(shardingRule.findShardingColumn("id",
"user")).thenReturn(Optional.of("id"));
when(shardingRule.getTableRule("user")).thenReturn(tableRule);
StandardShardingStrategyConfiguration databaseStrategyConfiguration =
mock(StandardShardingStrategyConfiguration.class);
when(databaseStrategyConfiguration.getShardingColumn()).thenReturn("id");
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingUpdateStatementValidatorTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingUpdateStatementValidatorTest.java
index 67de0ac..7f8f576 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingUpdateStatementValidatorTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingUpdateStatementValidatorTest.java
@@ -55,6 +55,7 @@ import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Properties;
import static org.mockito.Mockito.mock;
@@ -116,7 +117,7 @@ public final class ShardingUpdateStatementValidatorTest {
TableRule tableRule = mock(TableRule.class);
when(tableRule.getActualDatasourceNames()).thenReturn(Arrays.asList("ds_0",
"ds_1"));
when(tableRule.getActualTableNames("ds_1")).thenReturn(Collections.singletonList("user"));
- when(shardingRule.isShardingColumn("id", "user")).thenReturn(true);
+ when(shardingRule.findShardingColumn("id",
"user")).thenReturn(Optional.of("id"));
when(shardingRule.getTableRule("user")).thenReturn(tableRule);
StandardShardingStrategyConfiguration databaseStrategyConfiguration =
mock(StandardShardingStrategyConfiguration.class);
when(databaseStrategyConfiguration.getShardingColumn()).thenReturn("id");
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
index 7d12bcb..d19b369 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
@@ -50,6 +50,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.Optional;
import java.util.Properties;
import java.util.TreeSet;
@@ -214,44 +215,53 @@ public final class ShardingRuleTest {
}
@Test
- public void assertIsShardingColumnForDefaultDatabaseShardingStrategy() {
+ public void assertFindShardingColumnForDefaultDatabaseShardingStrategy() {
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
shardingRuleConfig.setDefaultDatabaseShardingStrategy(new
StandardShardingStrategyConfiguration("column", "STANDARD_TEST"));
shardingRuleConfig.getShardingAlgorithms().put("standard", new
ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
- assertTrue(new ShardingRule(shardingRuleConfig,
createDataSourceNames()).isShardingColumn("column", "LOGIC_TABLE"));
+ Optional<String> actual = new ShardingRule(shardingRuleConfig,
createDataSourceNames()).findShardingColumn("column", "LOGIC_TABLE");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("column"));
}
@Test
- public void assertIsShardingColumnForDefaultTableShardingStrategy() {
+ public void assertFindShardingColumnForDefaultTableShardingStrategy() {
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
shardingRuleConfig.setDefaultTableShardingStrategy(new
StandardShardingStrategyConfiguration("column", "STANDARD_TEST"));
shardingRuleConfig.getShardingAlgorithms().put("standard", new
ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
- assertTrue(new ShardingRule(shardingRuleConfig,
createDataSourceNames()).isShardingColumn("column", "LOGIC_TABLE"));
+ Optional<String> actual = new ShardingRule(shardingRuleConfig,
createDataSourceNames()).findShardingColumn("column", "LOGIC_TABLE");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("column"));
}
@Test
- public void assertIsShardingColumnForDatabaseShardingStrategy() {
+ public void assertFindShardingColumnForDatabaseShardingStrategy() {
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
shardingRuleConfig.getShardingAlgorithms().put("standard", new
ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
- assertTrue(new ShardingRule(shardingRuleConfig,
createDataSourceNames()).isShardingColumn("column", "logic_Table"));
+ Optional<String> actual = new ShardingRule(shardingRuleConfig,
createDataSourceNames()).findShardingColumn("column", "logic_Table");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("column"));
}
@Test
- public void assertIsShardingColumnForTableShardingStrategy() {
+ public void assertFindShardingColumnForTableShardingStrategy() {
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(createTableRuleConfigWithTableStrategies());
shardingRuleConfig.getShardingAlgorithms().put("standard", new
ShardingSphereAlgorithmConfiguration("STANDARD_TEST", new Properties()));
- assertTrue(new ShardingRule(shardingRuleConfig,
createDataSourceNames()).isShardingColumn("column", "logic_Table"));
+ Optional<String> actual = new ShardingRule(shardingRuleConfig,
createDataSourceNames()).findShardingColumn("column", "logic_Table");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("column"));
}
@Test
public void assertIsNotShardingColumn() {
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(createTableRuleConfigWithAllStrategies());
- assertFalse(new ShardingRule(shardingRuleConfig,
createDataSourceNames()).isShardingColumn("column", "other_Table"));
+ Optional<String> actual = new ShardingRule(shardingRuleConfig,
createDataSourceNames()).findShardingColumn("column", "other_Table");
+ assertFalse(actual.isPresent());
}
@Test
@@ -413,10 +423,12 @@ public final class ShardingRuleTest {
}
@Test
- public void assertIsShardingColumnForComplexShardingStrategy() {
+ public void assertFindShardingColumnForComplexShardingStrategy() {
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(createTableRuleConfigWithComplexStrategies());
- assertTrue(new ShardingRule(shardingRuleConfig,
createDataSourceNames()).isShardingColumn("column1", "LOGIC_TABLE"));
+ Optional<String> actual = new ShardingRule(shardingRuleConfig,
createDataSourceNames()).findShardingColumn("column1", "LOGIC_TABLE");
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("COLUMN1"));
}
@Test