You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/02/22 03:41:10 UTC
[shardingsphere] branch master updated: Support inserting data into varbinary sharding column table with hash_mod sharding algorithm (#24285)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 c42e1a33f7d Support inserting data into varbinary sharding column table with hash_mod sharding algorithm (#24285)
c42e1a33f7d is described below
commit c42e1a33f7d7718ade1aaa6391ab6ff3b94146c0
Author: Hongsheng Zhong <zh...@apache.org>
AuthorDate: Wed Feb 22 11:41:02 2023 +0800
Support inserting data into varbinary sharding column table with hash_mod sharding algorithm (#24285)
* Add unit test: insert data into varbinary column table
* Update IndexesMigrationE2EIT to test varbinary sharding column
* Support varbinary sharding column insert
* Fix unit test
---
.../api/sharding/standard/PreciseShardingValue.java | 4 ++--
.../sharding/mod/HashModShardingAlgorithm.java | 2 +-
.../engine/InsertClauseShardingConditionEngine.java | 9 ++-------
.../condition/value/ListShardingConditionValue.java | 2 +-
.../type/standard/StandardShardingStrategy.java | 2 +-
.../checker/ShardingRouteCacheableChecker.java | 2 +-
.../driver/ShardingSphereDriverTest.java | 21 +++++++++++++++++++++
.../driver/ShardingSphereDriverURLManagerTest.java | 2 +-
.../resources/config/driver/foo-driver-fixture.yaml | 4 ++--
.../migration/primarykey/IndexesMigrationE2EIT.java | 19 +++++++++++++------
10 files changed, 45 insertions(+), 22 deletions(-)
diff --git a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/sharding/standard/PreciseShardingValue.java b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/sharding/standard/PreciseShardingValue.java
index ded73bd01c3..50524ff2ab0 100644
--- a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/sharding/standard/PreciseShardingValue.java
+++ b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/sharding/standard/PreciseShardingValue.java
@@ -20,8 +20,8 @@ package org.apache.shardingsphere.sharding.api.sharding.standard;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
-import org.apache.shardingsphere.sharding.api.sharding.ShardingValue;
import org.apache.shardingsphere.infra.datanode.DataNodeInfo;
+import org.apache.shardingsphere.sharding.api.sharding.ShardingValue;
/**
* Sharding value for precise.
@@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.datanode.DataNodeInfo;
@RequiredArgsConstructor
@Getter
@ToString
-public final class PreciseShardingValue<T extends Comparable<?>> implements ShardingValue {
+public final class PreciseShardingValue<T> implements ShardingValue {
private final String logicTableName;
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java
index 13c37f29a31..aa0440fce3d 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java
@@ -58,7 +58,7 @@ public final class HashModShardingAlgorithm implements StandardShardingAlgorithm
return availableTargetNames;
}
- private long hashShardingValue(final Comparable<?> shardingValue) {
+ private long hashShardingValue(final Object shardingValue) {
return Math.abs((long) shardingValue.hashCode());
}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
index 64cf075b446..ff40f233113 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
@@ -24,8 +24,6 @@ import org.apache.shardingsphere.infra.binder.segment.insert.values.InsertValueC
import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
-import org.apache.shardingsphere.sharding.exception.data.NotImplementComparableValueException;
import org.apache.shardingsphere.sharding.exception.data.NullShardingValueException;
import org.apache.shardingsphere.sharding.route.engine.condition.ExpressionConditionUtils;
import org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
@@ -134,13 +132,10 @@ public final class InsertClauseShardingConditionEngine {
}
}
- @SuppressWarnings("rawtypes")
- private Comparable<?> getShardingValue(final SimpleExpressionSegment expressionSegment, final List<Object> params) {
- Object result = expressionSegment instanceof ParameterMarkerExpressionSegment
+ private Object getShardingValue(final SimpleExpressionSegment expressionSegment, final List<Object> params) {
+ return expressionSegment instanceof ParameterMarkerExpressionSegment
? params.get(((ParameterMarkerExpressionSegment) expressionSegment).getParameterMarkerIndex())
: ((LiteralExpressionSegment) expressionSegment).getLiterals();
- ShardingSpherePreconditions.checkState(result instanceof Comparable, () -> new NotImplementComparableValueException("Sharding", result));
- return (Comparable) result;
}
private List<ShardingCondition> createShardingConditionsWithInsertSelect(final InsertStatementContext sqlStatementContext, final List<Object> params) {
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java
index 583d1f0c699..522b626714d 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/value/ListShardingConditionValue.java
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
*/
@RequiredArgsConstructor
@Getter
-public final class ListShardingConditionValue<T extends Comparable<?>> implements ShardingConditionValue {
+public final class ListShardingConditionValue<T> implements ShardingConditionValue {
private final String columnName;
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/strategy/type/standard/StandardShardingStrategy.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/strategy/type/standard/StandardShardingStrategy.java
index 74c778ad0f6..073d2e2e137 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/strategy/type/standard/StandardShardingStrategy.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/strategy/type/standard/StandardShardingStrategy.java
@@ -71,7 +71,7 @@ public final class StandardShardingStrategy implements ShardingStrategy {
@SuppressWarnings({"unchecked", "rawtypes"})
private Collection<String> doSharding(final Collection<String> availableTargetNames, final ListShardingConditionValue<?> shardingValue, final DataNodeInfo dataNodeInfo) {
Collection<String> result = new LinkedList<>();
- for (Comparable<?> each : shardingValue.getValues()) {
+ for (Object each : shardingValue.getValues()) {
String target = shardingAlgorithm.doSharding(availableTargetNames,
new PreciseShardingValue(shardingValue.getTableName(), shardingValue.getColumnName(), dataNodeInfo, each));
if (null != target && availableTargetNames.contains(target)) {
diff --git a/features/sharding/plugin/cache/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java b/features/sharding/plugin/cache/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java
index cbdb8f299bc..4bf437f52fd 100644
--- a/features/sharding/plugin/cache/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java
+++ b/features/sharding/plugin/cache/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java
@@ -186,7 +186,7 @@ public final class ShardingRouteCacheableChecker {
private static boolean isConditionTypeCacheable(final ShardingConditionValue conditionValue) {
if (conditionValue instanceof ListShardingConditionValue<?>) {
- for (Comparable<?> eachValue : ((ListShardingConditionValue<?>) conditionValue).getValues()) {
+ for (Object eachValue : ((ListShardingConditionValue<?>) conditionValue).getValues()) {
if (!(eachValue instanceof Number)) {
return false;
}
diff --git a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/ShardingSphereDriverTest.java b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/ShardingSphereDriverTest.java
index b5b1b36b58f..04e3d1bc77c 100644
--- a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/ShardingSphereDriverTest.java
+++ b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/ShardingSphereDriverTest.java
@@ -22,6 +22,7 @@ import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
+import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@@ -53,4 +54,24 @@ public final class ShardingSphereDriverTest {
}
}
}
+
+ @Test
+ public void assertVarbinaryColumnWorks() throws SQLException {
+ try (
+ Connection connection = DriverManager.getConnection("jdbc:shardingsphere:classpath:config/driver/foo-driver-fixture.yaml");
+ Statement statement = connection.createStatement()) {
+ assertThat(connection, instanceOf(ShardingSphereConnection.class));
+ statement.execute("DROP TABLE IF EXISTS t_order");
+ statement.execute("CREATE TABLE t_order (order_id VARBINARY(64) PRIMARY KEY, user_id INT)");
+ PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO t_order (order_id, user_id) VALUES (?, ?)");
+ preparedStatement.setBytes(1, new byte[]{-1, 0, 1});
+ preparedStatement.setInt(2, 101);
+ int updatedCount = preparedStatement.executeUpdate();
+ assertThat(updatedCount, is(1));
+ try (ResultSet resultSet = statement.executeQuery("SELECT COUNT(1) FROM t_order")) {
+ assertTrue(resultSet.next());
+ assertThat(resultSet.getInt(1), is(1));
+ }
+ }
+ }
}
diff --git a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/driver/ShardingSphereDriverURLManagerTest.java b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/driver/ShardingSphereDriverURLManagerTest.java
index 04d93523ae7..85c49641bca 100644
--- a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/driver/ShardingSphereDriverURLManagerTest.java
+++ b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/driver/ShardingSphereDriverURLManagerTest.java
@@ -27,7 +27,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
public final class ShardingSphereDriverURLManagerTest {
- private final int fooDriverConfigLength = 995;
+ private final int fooDriverConfigLength = 999;
@Test(expected = DriverURLProviderNotFoundException.class)
public void assertNewConstructorWithEmptyURL() {
diff --git a/jdbc/core/src/test/resources/config/driver/foo-driver-fixture.yaml b/jdbc/core/src/test/resources/config/driver/foo-driver-fixture.yaml
index 98e72e43eb7..1942b9272c0 100644
--- a/jdbc/core/src/test/resources/config/driver/foo-driver-fixture.yaml
+++ b/jdbc/core/src/test/resources/config/driver/foo-driver-fixture.yaml
@@ -41,11 +41,11 @@ rules:
shardingColumn: order_id
shardingAlgorithmName: auto-mod
keyGenerateStrategy:
- column: order_id
+ column: user_id
keyGeneratorName: snowflake
shardingAlgorithms:
auto-mod:
- type: MOD
+ type: HASH_MOD
props:
sharding-count: 2
diff --git a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java
index 9750328847a..4254a4e9409 100644
--- a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java
+++ b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java
@@ -52,6 +52,12 @@ import static org.hamcrest.Matchers.is;
@Slf4j
public final class IndexesMigrationE2EIT extends AbstractMigrationE2EIT {
+ private static final String ORDER_TABLE_SHARDING_RULE_FORMAT = "CREATE SHARDING TABLE RULE t_order(\n"
+ + "STORAGE_UNITS(ds_2,ds_3,ds_4),\n"
+ + "SHARDING_COLUMN=%s,\n"
+ + "TYPE(NAME=\"hash_mod\",PROPERTIES(\"sharding-count\"=\"6\"))\n"
+ + ");";
+
public IndexesMigrationE2EIT(final PipelineTestParameter testParam) {
super(testParam);
}
@@ -86,7 +92,7 @@ public final class IndexesMigrationE2EIT extends AbstractMigrationE2EIT {
} else {
return;
}
- assertMigrationSuccess(sql, new UUIDKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
+ assertMigrationSuccess(sql, "user_id", new UUIDKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
}
@Test
@@ -99,7 +105,7 @@ public final class IndexesMigrationE2EIT extends AbstractMigrationE2EIT {
} else {
return;
}
- assertMigrationSuccess(sql, new UUIDKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
+ assertMigrationSuccess(sql, "user_id", new UUIDKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
}
@Test
@@ -112,7 +118,7 @@ public final class IndexesMigrationE2EIT extends AbstractMigrationE2EIT {
} else {
return;
}
- assertMigrationSuccess(sql, new SnowflakeKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
+ assertMigrationSuccess(sql, "user_id", new SnowflakeKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
}
@Test
@@ -126,10 +132,11 @@ public final class IndexesMigrationE2EIT extends AbstractMigrationE2EIT {
} else {
return;
}
- assertMigrationSuccess(sql, new UUIDKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
+ assertMigrationSuccess(sql, "order_id", new UUIDKeyGenerateAlgorithm(), consistencyCheckAlgorithmType);
}
- private void assertMigrationSuccess(final String sqlPattern, final KeyGenerateAlgorithm generateAlgorithm, final String consistencyCheckAlgorithmType) throws SQLException, InterruptedException {
+ private void assertMigrationSuccess(final String sqlPattern, final String shardingColumn, final KeyGenerateAlgorithm generateAlgorithm,
+ final String consistencyCheckAlgorithmType) throws SQLException, InterruptedException {
initEnvironment(getDatabaseType(), new MigrationJobType());
sourceExecuteWithLog(String.format(sqlPattern, getSourceTableOrderName()));
try (Connection connection = getSourceDataSource().getConnection()) {
@@ -138,7 +145,7 @@ public final class IndexesMigrationE2EIT extends AbstractMigrationE2EIT {
addMigrationProcessConfig();
addMigrationSourceResource();
addMigrationTargetResource();
- createTargetOrderTableRule();
+ proxyExecuteWithLog(String.format(ORDER_TABLE_SHARDING_RULE_FORMAT, shardingColumn), 2);
startMigration(getSourceTableOrderName(), getTargetTableOrderName());
String jobId = listJobId().get(0);
waitJobPrepareSuccess(String.format("SHOW MIGRATION STATUS '%s'", jobId));