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));