This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 5cfc82b43df Address Sonar findings in pipeline modules (#40345)
5cfc82b43df is described below
commit 5cfc82b43df42893e713b0abfcca18ac0a10adb6
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Oct 22 20:30:41 2026 +0800
Address Sonar findings in pipeline modules (#40345)
---
.../column/InventoryColumnValueReaderEngine.java | 26 +++++++------
.../AbstractRecordTableInventoryCalculator.java | 10 +++--
.../metadata/generator/PipelineDDLDecorator.java | 3 +-
.../segment/PipelineSQLSegmentBuilder.java | 4 +-
.../incremental/client/MySQLBinlogClient.java | 12 +++---
.../netty/MySQLBinlogEventPacketDecoder.java | 15 +++-----
.../incremental/dumper/MySQLIncrementalDumper.java | 12 +++---
.../incremental/client/MySQLBinlogClientTest.java | 45 +++++++++++++++++++++-
.../wal/decode/MppdbDecodingPlugin.java | 28 +++-----------
.../dumper/PostgreSQLIncrementalDumper.java | 4 +-
.../ingest/incremental/wal/WALEventConverter.java | 12 +++---
.../incremental/wal/decode/TestDecodingPlugin.java | 3 +-
.../ddl/PostgreSQLDDLTemplateExecutor.java | 7 ++--
.../column/PostgreSQLColumnPropertiesAppender.java | 18 ++++-----
.../PostgreSQLConstraintsPropertiesAppender.java | 13 ++++---
.../ddl/index/PostgreSQLIndexSQLGenerator.java | 3 +-
.../ddl/table/PostgreSQLTablePropertiesLoader.java | 2 +-
.../RecordTableInventoryCheckCalculatorTest.java | 25 ++++++++++++
.../InventoryColumnValueReaderEngineTest.java | 6 +++
19 files changed, 152 insertions(+), 96 deletions(-)
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngine.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngine.java
index 8e67cb02d52..ba2968c7b54 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngine.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngine.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.data.pipeline.core.ingest.dumper.inventory.col
import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import org.jspecify.annotations.Nullable;
import java.math.BigDecimal;
import java.sql.Blob;
@@ -67,28 +68,20 @@ public final class InventoryColumnValueReaderEngine {
case Types.TINYINT:
if (isSigned(metaData, columnIndex)) {
return resultSet.getByte(columnIndex);
- } else {
- return resultSet.getShort(columnIndex);
}
+ return resultSet.getShort(columnIndex);
case Types.SMALLINT:
if (isSigned(metaData, columnIndex)) {
return resultSet.getShort(columnIndex);
- } else {
- return resultSet.getInt(columnIndex);
}
+ return resultSet.getInt(columnIndex);
case Types.INTEGER:
if (isSigned(metaData, columnIndex)) {
return resultSet.getInt(columnIndex);
- } else {
- return resultSet.getLong(columnIndex);
}
+ return resultSet.getLong(columnIndex);
case Types.BIGINT:
- if (isSigned(metaData, columnIndex)) {
- return resultSet.getLong(columnIndex);
- } else {
- BigDecimal decimal = resultSet.getBigDecimal(columnIndex);
- return null == decimal ? null : decimal.toBigInteger();
- }
+ return readBigIntValue(resultSet, metaData, columnIndex);
case Types.NUMERIC:
case Types.DECIMAL:
return resultSet.getBigDecimal(columnIndex);
@@ -133,4 +126,13 @@ public final class InventoryColumnValueReaderEngine {
private boolean isSigned(final ResultSetMetaData metaData, final int
columnIndex) throws SQLException {
return metaData.isSigned(columnIndex);
}
+
+ @Nullable
+ private Object readBigIntValue(final ResultSet resultSet, final
ResultSetMetaData metaData, final int columnIndex) throws SQLException {
+ if (isSigned(metaData, columnIndex)) {
+ return resultSet.getLong(columnIndex);
+ }
+ BigDecimal result = resultSet.getBigDecimal(columnIndex);
+ return null == result ? null : result.toBigInteger();
+ }
}
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/query/calculator/AbstractRecordTableInventoryCalculator.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/query/calculator/AbstractRecordTableInventoryCalculator.java
index 6133e6f4eaa..e2e57bfbf6e 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/query/calculator/AbstractRecordTableInventoryCalculator.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/query/calculator/AbstractRecordTableInventoryCalculator.java
@@ -281,7 +281,7 @@ public abstract class
AbstractRecordTableInventoryCalculator<S, C> extends Abstr
private void setParameters(final PreparedStatement preparedStatement,
final TableInventoryCalculateParameter param) throws SQLException {
QueryType queryType = param.getQueryType();
- if (queryType == QueryType.RANGE_QUERY) {
+ if (QueryType.RANGE_QUERY == queryType) {
Range<?> range = param.getRange();
ShardingSpherePreconditions.checkNotNull(range,
() -> new
PipelineTableDataConsistencyCheckLoadingFailedException(param.getTable(), new
RuntimeException("Unique keys values range is null.")));
@@ -295,7 +295,9 @@ public abstract class
AbstractRecordTableInventoryCalculator<S, C> extends Abstr
if (StreamingRangeType.SMALL == streamingRangeType) {
setParameter(preparedStatement, parameterIndex, chunkSize *
streamingChunkCount);
}
- } else if (queryType == QueryType.POINT_QUERY) {
+ return;
+ }
+ if (QueryType.POINT_QUERY == queryType) {
Collection<Object> uniqueKeysValues = param.getUniqueKeysValues();
ShardingSpherePreconditions.checkNotNull(uniqueKeysValues,
() -> new
PipelineTableDataConsistencyCheckLoadingFailedException(param.getTable(), new
RuntimeException("Unique keys values is null.")));
@@ -311,9 +313,9 @@ public abstract class
AbstractRecordTableInventoryCalculator<S, C> extends Abstr
setParameter(preparedStatement, parameterIndex++, each);
}
}
- } else {
- throw new UnsupportedOperationException("Query type: " +
queryType);
+ return;
}
+ throw new UnsupportedOperationException("Query type: " + queryType);
}
private void setParameter(final PreparedStatement preparedStatement, final
int parameterIndex, final Object value) throws SQLException {
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java
index a5101fdfbfa..fe3c39271d5 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java
@@ -185,8 +185,7 @@ public final class PipelineDDLDecorator {
|| sqlStatement instanceof AlterTableStatement || sqlStatement
instanceof CommentStatement) {
TableExtractor tableExtractor = new TableExtractor();
tableExtractor.extractTablesFromSQLStatement(sqlStatement);
- Optional<SimpleTableSegment> simpleTableSegment =
tableExtractor.getTableContext().stream()
- .filter(each -> each instanceof
SimpleTableSegment).map(each -> (SimpleTableSegment) each).findFirst();
+ Optional<SimpleTableSegment> simpleTableSegment =
tableExtractor.getTableContext().stream().filter(SimpleTableSegment.class::isInstance).map(SimpleTableSegment.class::cast).findFirst();
if (!simpleTableSegment.isPresent()) {
return sql;
}
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/segment/PipelineSQLSegmentBuilder.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/segment/PipelineSQLSegmentBuilder.java
index 86c5364188f..4dd5ab4608a 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/segment/PipelineSQLSegmentBuilder.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/segment/PipelineSQLSegmentBuilder.java
@@ -28,7 +28,7 @@ import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierCon
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.jspecify.annotations.Nullable;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
/**
* Pipeline SQL segment builder.
@@ -131,7 +131,7 @@ public final class PipelineSQLSegmentBuilder {
return buildQualifiedTableName(schemaName, tableName,
this::getEscapedActualIdentifier);
}
- private String buildQualifiedTableName(final String schemaName, final
String tableName, final Function<String, String> identifierEscaper) {
+ private String buildQualifiedTableName(final String schemaName, final
String tableName, final UnaryOperator<String> identifierEscaper) {
StringBuilder result = new StringBuilder();
if (dialectDatabaseMetaData.getSchemaOption().isSchemaAvailable() &&
!Strings.isNullOrEmpty(schemaName)) {
result.append(identifierEscaper.apply(schemaName)).append('.');
diff --git
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClient.java
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClient.java
index ff7dd63f5b7..258fc777da0 100644
---
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClient.java
+++
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClient.java
@@ -33,6 +33,7 @@ import io.netty.util.concurrent.Promise;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ThreadUtils;
import
org.apache.shardingsphere.data.pipeline.core.exception.PipelineInternalException;
import
org.apache.shardingsphere.data.pipeline.mysql.ingest.incremental.binlog.event.MySQLBaseBinlogEvent;
import
org.apache.shardingsphere.data.pipeline.mysql.ingest.incremental.binlog.event.PlaceholderBinlogEvent;
@@ -55,6 +56,7 @@ import org.apache.shardingsphere.infra.util.json.JsonEngine;
import org.apache.shardingsphere.proxy.frontend.netty.ChannelAttrInitializer;
import java.net.InetSocketAddress;
+import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -346,8 +348,8 @@ public final class MySQLBinlogClient {
blockingEventQueue.put(records);
return;
}
- if (msg instanceof MySQLBaseBinlogEvent) {
- lastBinlogEvent.set((MySQLBaseBinlogEvent) msg);
+ if (msg instanceof MySQLBaseBinlogEvent binlogEvent) {
+ lastBinlogEvent.set(binlogEvent);
blockingEventQueue.put(Collections.singletonList(lastBinlogEvent.get()));
}
}
@@ -375,14 +377,14 @@ public final class MySQLBinlogClient {
}
@SneakyThrows(InterruptedException.class)
- private synchronized void reconnect() {
+ private void reconnect() {
log.info("Reconnect failure count: {}",
continuousFailureCount.get());
if (continuousFailureCount.get() >= 5) {
log.error("MySQL binlog client failed permanently,
lastBinlogEvent: {}", JsonEngine.marshal(lastBinlogEvent.get()));
closeChannel(true);
return;
}
- wait(2000L * (continuousFailureCount.get() + 1));
+ ThreadUtils.sleep(Duration.ofMillis(2000L *
(continuousFailureCount.get() + 1)));
try {
reconnectWithRetry();
// CHECKSTYLE:OFF
@@ -407,7 +409,7 @@ public final class MySQLBinlogClient {
if (reconnectTimes > 3) {
throw ex;
}
- wait(1000L << reconnectTimes);
+ ThreadUtils.sleep(Duration.ofMillis(1000L <<
reconnectTimes));
}
}
}
diff --git
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/netty/MySQLBinlogEventPacketDecoder.java
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/netty/MySQLBinlogEventPacketDecoder.java
index e86cf171e28..b52daa5499d 100644
---
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/netty/MySQLBinlogEventPacketDecoder.java
+++
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/netty/MySQLBinlogEventPacketDecoder.java
@@ -120,8 +120,7 @@ public final class MySQLBinlogEventPacketDecoder extends
ByteToMessageDecoder {
}
private void processEventWithTX(final MySQLBaseBinlogEvent binlogEvent,
final List<Object> out) {
- if (binlogEvent instanceof MySQLQueryBinlogEvent) {
- MySQLQueryBinlogEvent queryEvent = (MySQLQueryBinlogEvent)
binlogEvent;
+ if (binlogEvent instanceof MySQLQueryBinlogEvent queryEvent) {
if (TX_BEGIN_SQL.equals(queryEvent.getSql())) {
records = new LinkedList<>();
} else {
@@ -136,8 +135,7 @@ public final class MySQLBinlogEventPacketDecoder extends
ByteToMessageDecoder {
}
private void processEventIgnoreTX(final MySQLBaseBinlogEvent binlogEvent,
final List<Object> out) {
- if (binlogEvent instanceof MySQLQueryBinlogEvent) {
- MySQLQueryBinlogEvent queryEvent = (MySQLQueryBinlogEvent)
binlogEvent;
+ if (binlogEvent instanceof MySQLQueryBinlogEvent queryEvent) {
if (TX_BEGIN_SQL.equals(queryEvent.getSql())) {
return;
}
@@ -156,14 +154,11 @@ public final class MySQLBinlogEventPacketDecoder extends
ByteToMessageDecoder {
case TABLE_MAP_EVENT:
decodeTableMapEvent(binlogEventHeader, payload);
return Optional.empty();
- case WRITE_ROWS_EVENT_V1:
- case WRITE_ROWS_EVENT_V2:
+ case WRITE_ROWS_EVENT_V1, WRITE_ROWS_EVENT_V2:
return Optional.of(decodeWriteRowsEventV2(binlogEventHeader,
payload));
- case UPDATE_ROWS_EVENT_V1:
- case UPDATE_ROWS_EVENT_V2:
+ case UPDATE_ROWS_EVENT_V1, UPDATE_ROWS_EVENT_V2:
return Optional.of(decodeUpdateRowsEventV2(binlogEventHeader,
payload));
- case DELETE_ROWS_EVENT_V1:
- case DELETE_ROWS_EVENT_V2:
+ case DELETE_ROWS_EVENT_V1, DELETE_ROWS_EVENT_V2:
return Optional.of(decodeDeleteRowsEventV2(binlogEventHeader,
payload));
case QUERY_EVENT:
return Optional.of(decodeQueryEvent(binlogEventHeader,
payload));
diff --git
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/dumper/MySQLIncrementalDumper.java
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/dumper/MySQLIncrementalDumper.java
index 27c64213cc2..d07ac20fdd6 100644
---
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/dumper/MySQLIncrementalDumper.java
+++
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/dumper/MySQLIncrementalDumper.java
@@ -126,14 +126,14 @@ public final class MySQLIncrementalDumper extends
AbstractPipelineLifecycleRunna
return Collections.singletonList(createPlaceholderRecord(event));
}
PipelineTableMetaData tableMetaData =
getPipelineTableMetaData(rowsEvent.getTableName());
- if (event instanceof MySQLWriteRowsBinlogEvent) {
- return handleWriteRowsEvent((MySQLWriteRowsBinlogEvent) event,
tableMetaData);
+ if (event instanceof MySQLWriteRowsBinlogEvent writeRowsEvent) {
+ return handleWriteRowsEvent(writeRowsEvent, tableMetaData);
}
- if (event instanceof MySQLUpdateRowsBinlogEvent) {
- return handleUpdateRowsEvent((MySQLUpdateRowsBinlogEvent) event,
tableMetaData);
+ if (event instanceof MySQLUpdateRowsBinlogEvent updateRowsEvent) {
+ return handleUpdateRowsEvent(updateRowsEvent, tableMetaData);
}
- if (event instanceof MySQLDeleteRowsBinlogEvent) {
- return handleDeleteRowsEvent((MySQLDeleteRowsBinlogEvent) event,
tableMetaData);
+ if (event instanceof MySQLDeleteRowsBinlogEvent deleteRowsEvent) {
+ return handleDeleteRowsEvent(deleteRowsEvent, tableMetaData);
}
return Collections.emptyList();
}
diff --git
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClientTest.java
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClientTest.java
index 794dfa1f574..12ce76ef50c 100644
---
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClientTest.java
+++
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/incremental/client/MySQLBinlogClientTest.java
@@ -32,6 +32,7 @@ import io.netty.util.Attribute;
import io.netty.util.concurrent.DefaultPromise;
import io.netty.util.concurrent.Promise;
import lombok.SneakyThrows;
+import org.apache.commons.lang3.ThreadUtils;
import
org.apache.shardingsphere.data.pipeline.core.exception.PipelineInternalException;
import
org.apache.shardingsphere.data.pipeline.mysql.ingest.incremental.binlog.MySQLBinlogContext;
import
org.apache.shardingsphere.data.pipeline.mysql.ingest.incremental.binlog.event.MySQLBaseBinlogEvent;
@@ -48,6 +49,8 @@ import
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperation
import
org.apache.shardingsphere.test.infra.framework.extension.log.LogCaptureAssertion;
import
org.apache.shardingsphere.test.infra.framework.extension.log.LogCaptureExtension;
import
org.apache.shardingsphere.test.infra.framework.extension.log.LogCaptureSettings;
+import
org.apache.shardingsphere.test.infra.framework.extension.mock.AutoMockExtension;
+import
org.apache.shardingsphere.test.infra.framework.extension.mock.StaticMockSettings;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -69,6 +72,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
@@ -88,7 +92,9 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.CALLS_REAL_METHODS;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockConstruction;
import static org.mockito.Mockito.times;
@@ -97,9 +103,10 @@ import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
@SuppressWarnings("ProhibitedExceptionDeclared")
-@ExtendWith({MockitoExtension.class, LogCaptureExtension.class})
+@ExtendWith({MockitoExtension.class, LogCaptureExtension.class,
AutoMockExtension.class})
@LogCaptureSettings(suppressOutput = true)
@MockitoSettings(strictness = Strictness.LENIENT)
+@StaticMockSettings({CompletableFuture.class, ThreadUtils.class})
class MySQLBinlogClientTest {
@Mock
@@ -316,6 +323,42 @@ class MySQLBinlogClientTest {
assertThat(getChecksumLength(decoder), is(0));
}
+ @Test
+ void assertReconnectAfterTransientFailure() throws Exception {
+ client = createClientMock();
+ prepareClientChannel();
+ setServerVersion("5.5.0");
+ doReturn(true).when(client).execute(anyString());
+
when(channel.writeAndFlush(any(MySQLComRegisterSlaveCommandPacket.class))).thenAnswer(invocation
-> {
+ Promise<Object> callback = new
DefaultPromise<>(eventLoopGroup.next());
+ callback.setSuccess(new MySQLOKPacket(0));
+ setResponseCallback(callback);
+ return null;
+ });
+ client.subscribe("binlog-000004", 16L);
+ ArgumentCaptor<ChannelHandler> handlerCaptor =
ArgumentCaptor.forClass(ChannelHandler.class);
+ verify(pipeline, times(2)).addLast(handlerCaptor.capture());
+ ChannelInboundHandlerAdapter handler =
handlerCaptor.getAllValues().stream().filter(each ->
"MySQLBinlogEventHandler".equals(each.getClass().getSimpleName()))
+ .map(each -> (ChannelInboundHandlerAdapter)
each).findFirst().orElseThrow(IllegalStateException::new);
+ ChannelHandlerContext context = mock(ChannelHandlerContext.class);
+ handler.channelRead(context, new
PlaceholderBinlogEvent("binlog-000005", 32L, 1L));
+ doThrow(new PipelineInternalException("connect
failed")).doNothing().when(client).connect();
+ doNothing().when(client).subscribe("binlog-000005", 32L);
+ CompletableFuture<Void> reconnectFuture = new CompletableFuture<>();
+ ArgumentCaptor<Runnable> reconnectCaptor =
ArgumentCaptor.forClass(Runnable.class);
+
when(CompletableFuture.runAsync(reconnectCaptor.capture())).thenReturn(reconnectFuture);
+ handler.channelInactive(context);
+ handler.channelInactive(context);
+ assertThat(reconnectCaptor.getAllValues().size(), is(1));
+ reconnectCaptor.getValue().run();
+ verify(client, times(2)).connect();
+ verify(channel).close();
+ verify(client).subscribe("binlog-000005", 32L);
+ reconnectFuture.complete(null);
+ handler.channelInactive(context);
+ assertThat(reconnectCaptor.getAllValues().size(), is(2));
+ }
+
@Test
void assertPollOnNotRunning() throws ReflectiveOperationException {
Plugins.getMemberAccessor().set(MySQLBinlogClient.class.getDeclaredField("channel"),
client, channel);
diff --git
a/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/ingest/incremental/wal/decode/MppdbDecodingPlugin.java
b/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/ingest/incremental/wal/decode/MppdbDecodingPlugin.java
index e7f70ed29d9..d9456f741c1 100644
---
a/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/ingest/incremental/wal/decode/MppdbDecodingPlugin.java
+++
b/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/ingest/incremental/wal/decode/MppdbDecodingPlugin.java
@@ -192,9 +192,7 @@ public final class MppdbDecodingPlugin implements
DecodingPlugin {
return decodeString(data.substring(1));
}
switch (columnType) {
- case "tinyint":
- case "smallint":
- case "integer":
+ case "tinyint", "smallint", "integer":
return Integer.parseInt(data);
case "bigint":
return Long.parseLong(data);
@@ -204,8 +202,7 @@ public final class MppdbDecodingPlugin implements
DecodingPlugin {
return Double.parseDouble(data);
case "boolean":
return Boolean.parseBoolean(data);
- case "time without time zone":
- case "time with time zone":
+ case "time without time zone", "time with time zone":
try {
return timestampUtils.toTime(null, decodeString(data));
} catch (final SQLException ex) {
@@ -213,35 +210,20 @@ public final class MppdbDecodingPlugin implements
DecodingPlugin {
}
case "date":
return Date.valueOf(decodeString(data));
- case "timestamp without time zone":
- case "timestamp with time zone":
- case "smalldatetime":
+ case "timestamp without time zone", "timestamp with time zone",
"smalldatetime":
try {
return timestampUtils.toTimestamp(null,
decodeString(data));
} catch (final SQLException ex) {
throw new DecodingException(ex);
}
- case "bytea":
- case "blob":
+ case "bytea", "blob":
return decodeBytea(data);
- case "raw":
- case "reltime":
- case "int4range":
- case "int8range":
- case "numrange":
- case "tsrange":
- case "tstzrange":
- case "daterange":
+ case "raw", "reltime", "int4range", "int8range", "numrange",
"tsrange", "tstzrange", "daterange":
return decodePgObject(data, columnType);
case "money":
return decodeMoney(data);
case "interval":
return decodeInterval(data);
- case "character varying":
- case "text":
- case "character":
- case "nvarchar2":
- case "tsquery":
default:
return decodeString(data).replace("''", "'");
}
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/dumper/PostgreSQLIncrementalDumper.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/dumper/PostgreSQLIncrementalDumper.java
index 8ae7fac21ca..375ceccf8ea 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/dumper/PostgreSQLIncrementalDumper.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/dumper/PostgreSQLIncrementalDumper.java
@@ -149,8 +149,8 @@ public final class PostgreSQLIncrementalDumper extends
AbstractPipelineLifecycle
channel.push(records);
return;
}
- if (event instanceof AbstractRowEvent) {
- rowEvents.add((AbstractRowEvent) event);
+ if (event instanceof AbstractRowEvent rowEvent) {
+ rowEvents.add(rowEvent);
}
}
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/WALEventConverter.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/WALEventConverter.java
index 4f7209fa27a..33edff7bd13 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/WALEventConverter.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/WALEventConverter.java
@@ -110,14 +110,14 @@ public final class WALEventConverter {
return createPlaceholderRecord(event);
}
PipelineTableMetaData tableMetaData =
metaDataLoader.getTableMetaData(expectedSchemaName, actualTableName);
- if (event instanceof WriteRowEvent) {
- return handleWriteRowEvent((WriteRowEvent) event, tableMetaData,
logicTableName);
+ if (event instanceof WriteRowEvent writeRowEvent) {
+ return handleWriteRowEvent(writeRowEvent, tableMetaData,
logicTableName);
}
- if (event instanceof UpdateRowEvent) {
- return handleUpdateRowEvent((UpdateRowEvent) event, tableMetaData,
logicTableName);
+ if (event instanceof UpdateRowEvent updateRowEvent) {
+ return handleUpdateRowEvent(updateRowEvent, tableMetaData,
logicTableName);
}
- if (event instanceof DeleteRowEvent) {
- return handleDeleteRowEvent((DeleteRowEvent) event, tableMetaData,
logicTableName);
+ if (event instanceof DeleteRowEvent deleteRowEvent) {
+ return handleDeleteRowEvent(deleteRowEvent, tableMetaData,
logicTableName);
}
throw new UnsupportedSQLOperationException("");
}
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/decode/TestDecodingPlugin.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/decode/TestDecodingPlugin.java
index 0769caaeba0..e687f0496e6 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/decode/TestDecodingPlugin.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/ingest/incremental/wal/decode/TestDecodingPlugin.java
@@ -207,8 +207,7 @@ public final class TestDecodingPlugin implements
DecodingPlugin {
}
case "bytea":
return decodeHex(readNextString(data).substring(2));
- case "json":
- case "jsonb":
+ case "json", "jsonb":
return readNextJson(data);
default:
return readNextString(data);
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/PostgreSQLDDLTemplateExecutor.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/PostgreSQLDDLTemplateExecutor.java
index b5455416df0..de5cc75e29c 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/PostgreSQLDDLTemplateExecutor.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/PostgreSQLDDLTemplateExecutor.java
@@ -33,7 +33,6 @@ import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
-import java.util.stream.Collectors;
/**
* Abstract ddl adapter for PostgreSQL.
@@ -73,7 +72,7 @@ public final class PostgreSQLDDLTemplateExecutor {
Collection<Map<String, Object>> result = new LinkedList<>();
while (resultSet.next()) {
int columnCount = metaData.getColumnCount();
- Map<String, Object> row = new LinkedHashMap<>(columnCount);
+ Map<String, Object> row =
LinkedHashMap.newLinkedHashMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.put(metaData.getColumnName(i), resultSet.getObject(i));
}
@@ -103,7 +102,7 @@ public final class PostgreSQLDDLTemplateExecutor {
private Map<String, Object> getSingleRow(final ResultSet resultSet) throws
SQLException {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
- Map<String, Object> result = new LinkedHashMap<>(columnCount);
+ Map<String, Object> result =
LinkedHashMap.newLinkedHashMap(columnCount);
if (resultSet.next()) {
for (int i = 1; i <= columnCount; i++) {
result.put(metaData.getColumnName(i), resultSet.getObject(i));
@@ -123,7 +122,7 @@ public final class PostgreSQLDDLTemplateExecutor {
return;
}
Collection<Map<String, String>> formatLabels = new LinkedList<>();
- Collection<String> securityLabels = Arrays.stream((String[]) ((Array)
data.get("seclabels")).getArray()).collect(Collectors.toList());
+ Collection<String> securityLabels = Arrays.stream((String[]) ((Array)
data.get("seclabels")).getArray()).toList();
for (String each : securityLabels) {
Map<String, String> securityLabel = new LinkedHashMap<>(2, 1F);
securityLabel.put("provider", each.substring(0,
each.indexOf(SECURITY_LABEL_SPLIT)));
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/column/PostgreSQLColumnPropertiesAppender.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/column/PostgreSQLColumnPropertiesAppender.java
index c2a35b58a0a..1d63edfeb05 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/column/PostgreSQLColumnPropertiesAppender.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/column/PostgreSQLColumnPropertiesAppender.java
@@ -23,6 +23,7 @@ import
org.apache.shardingsphere.data.pipeline.postgresql.sqlbuilder.ddl.Postgre
import java.sql.Array;
import java.sql.Connection;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -50,9 +51,9 @@ public final class PostgreSQLColumnPropertiesAppender {
private static final Pattern BRACKETS_PATTERN =
Pattern.compile("(\\(\\d+\\))");
- private static final Pattern SIGNED_NUMBER_WITH_GROUPING_PATTERN =
Pattern.compile("^([+-])?\\s*[0-9][0-9,\\s]*$");
+ private static final Pattern SIGNED_NUMBER_WITH_GROUPING_PATTERN =
Pattern.compile("^([+-])?\\s*\\d[\\d,\\s]*$");
- private static final Pattern NON_DIGIT_PATTERN = Pattern.compile("[^0-9]");
+ private static final Pattern NON_DIGIT_PATTERN = Pattern.compile("\\D");
private static final String ATT_OPTION_SPLIT = "=";
@@ -106,7 +107,7 @@ public final class PostgreSQLColumnPropertiesAppender {
}
private Collection<String> toCollection(final Array array) throws
SQLException {
- return Arrays.stream((String[])
array.getArray()).collect(Collectors.toList());
+ return Arrays.stream((String[])
array.getArray()).collect(Collectors.toCollection(ArrayList::new));
}
private Collection<Map<String, Object>> getColumnFromInherits(final
Collection<String> collInherits) {
@@ -138,7 +139,7 @@ public final class PostgreSQLColumnPropertiesAppender {
}
private Collection<String> toCollectionAndSort(final Array editTypes)
throws SQLException {
- return Arrays.stream((String[])
editTypes.getArray()).sorted(String::compareTo).collect(Collectors.toList());
+ return Arrays.stream((String[])
editTypes.getArray()).sorted(String::compareTo).collect(Collectors.toCollection(ArrayList::new));
}
private void columnFormatter(final Map<String, Object> column, final
Collection<String> editTypes) throws SQLException {
@@ -148,7 +149,7 @@ public final class PostgreSQLColumnPropertiesAppender {
formatColumnVariables(column);
templateExecutor.formatSecurityLabels(column);
editTypes.add(column.get("cltype").toString());
- column.put("edit_types",
editTypes.stream().sorted().collect(Collectors.toList()));
+ column.put("edit_types",
editTypes.stream().sorted().collect(Collectors.toCollection(ArrayList::new)));
column.put("cltype", parseTypeName(column.get("cltype").toString()));
}
@@ -192,7 +193,7 @@ public final class PostgreSQLColumnPropertiesAppender {
if (null == column.get("attnum") || null == column.get("indkey")) {
return;
}
- if (Arrays.stream(column.get("indkey").toString().split("
")).collect(Collectors.toList()).contains(column.get("attnum").toString())) {
+ if (Arrays.stream(column.get("indkey").toString().split("
")).toList().contains(column.get("attnum").toString())) {
column.put("is_pk", true);
column.put("is_primary_key", true);
} else {
@@ -213,8 +214,7 @@ public final class PostgreSQLColumnPropertiesAppender {
case NUMERIC:
setColumnPrecision(column, fullType);
break;
- case DATE:
- case VARCHAR:
+ case DATE, VARCHAR:
setColumnLength(column, fullType);
break;
default:
@@ -323,7 +323,7 @@ public final class PostgreSQLColumnPropertiesAppender {
return;
}
Collection<Map<String, String>> attOptions = new LinkedList<>();
- Collection<String> columnVariables = Arrays.stream((String[]) ((Array)
column.get("attoptions")).getArray()).collect(Collectors.toList());
+ Collection<String> columnVariables = Arrays.stream((String[]) ((Array)
column.get("attoptions")).getArray()).toList();
for (String each : columnVariables) {
Map<String, String> columnVariable = new LinkedHashMap<>();
columnVariable.put("name", each.substring(0,
each.indexOf(ATT_OPTION_SPLIT)));
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/constraints/PostgreSQLConstraintsPropertiesAppender.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/constraints/PostgreSQLConstraintsPropertiesAppender.java
index 23325e23a87..7295c987972 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/constraints/PostgreSQLConstraintsPropertiesAppender.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/constraints/PostgreSQLConstraintsPropertiesAppender.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.data.pipeline.postgresql.sqlbuilder.ddl.constr
import
org.apache.shardingsphere.data.pipeline.postgresql.sqlbuilder.ddl.PostgreSQLDDLTemplateExecutor;
import java.sql.Connection;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -59,7 +60,7 @@ public final class PostgreSQLConstraintsPropertiesAppender {
private void loadPrimaryOrUniqueConstraint(final Map<String, Object>
context, final String name, final String type) {
Collection<Map<String, Object>> constraintsProps =
fetchConstraintsProperties(context, type);
fetchConstraintsColumns(constraintsProps);
- context.put(name, constraintsProps.stream().filter(each ->
!isPartitionAndConstraintInherited(each,
context)).collect(Collectors.toList()));
+ context.put(name, constraintsProps.stream().filter(each ->
!isPartitionAndConstraintInherited(each,
context)).collect(Collectors.toCollection(ArrayList::new)));
}
private Collection<Map<String, Object>> fetchConstraintsProperties(final
Map<String, Object> context, final String constraintType) {
@@ -73,8 +74,8 @@ public final class PostgreSQLConstraintsPropertiesAppender {
private void fetchConstraintsColumns(final Collection<Map<String, Object>>
constraintsProps) {
for (Map<String, Object> each : constraintsProps) {
- each.put("columns",
- fetchConstraintsCols(each).stream().<Map<String,
Object>>map(col -> Collections.singletonMap("column", stripQuote((String)
col.get("column")))).collect(Collectors.toList()));
+ each.put("columns",
fetchConstraintsCols(each).stream().<Map<String, Object>>map(col ->
Collections.singletonMap("column", stripQuote((String) col.get("column"))))
+ .collect(Collectors.toCollection(ArrayList::new)));
appendConstraintsInclude(each);
}
}
@@ -82,7 +83,7 @@ public final class PostgreSQLConstraintsPropertiesAppender {
private void appendConstraintsInclude(final Map<String, Object>
constraintsProp) {
Collection<Object> includes = templateExecutor.getMajorVersion() >=
PG_CONSTRAINTS_INCLUDE_VERSION
?
templateExecutor.executeByTemplate(Collections.singletonMap("cid",
constraintsProp.get("oid")),
-
"component/index_constraint/%s/get_constraint_include.ftl").stream().map(each
-> each.get("colname")).collect(Collectors.toList())
+
"component/index_constraint/%s/get_constraint_include.ftl").stream().map(each
-> each.get("colname")).collect(Collectors.toCollection(ArrayList::new))
: Collections.emptyList();
constraintsProp.put("include", includes);
}
@@ -106,11 +107,11 @@ public final class
PostgreSQLConstraintsPropertiesAppender {
}
private Collection<Map<String, Object>> fetchForeignKeys(final Map<String,
Object> context) {
- return getForeignKeys((Long) context.get("tid")).stream().filter(each
-> !isPartitionAndConstraintInherited(each,
context)).collect(Collectors.toList());
+ return getForeignKeys((Long) context.get("tid")).stream().filter(each
-> !isPartitionAndConstraintInherited(each,
context)).collect(Collectors.toCollection(ArrayList::new));
}
private Collection<Map<String, Object>> fetchCheckConstraints(final
Map<String, Object> context) {
- return getCheckConstraints((Long)
context.get("tid")).stream().filter(each ->
!isPartitionAndConstraintInherited(each, context)).collect(Collectors.toList());
+ return getCheckConstraints((Long)
context.get("tid")).stream().filter(each ->
!isPartitionAndConstraintInherited(each,
context)).collect(Collectors.toCollection(ArrayList::new));
}
private Collection<Map<String, Object>> getExclusionConstraints(final
Map<String, Object> context) {
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGenerator.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGenerator.java
index c6621285be5..b42492bed17 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGenerator.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGenerator.java
@@ -23,6 +23,7 @@ import org.postgresql.jdbc.PgArray;
import java.sql.Connection;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -69,7 +70,7 @@ public final class PostgreSQLIndexSQLGenerator {
appendColumnDetails(indexData, (Long) indexNode.get("oid"));
if (templateExecutor.getMajorVersion() >= PG_INDEX_INCLUDE_VERSION) {
Collection<Map<String, Object>> includeDetails =
templateExecutor.executeByTemplate(Collections.singletonMap("idx",
indexNode.get("oid")), "component/indexes/%s/include_details.ftl");
- indexData.put("include", includeDetails.stream().map(each ->
each.get("colname")).collect(Collectors.toList()));
+ indexData.put("include", includeDetails.stream().map(each ->
each.get("colname")).collect(Collectors.toCollection(ArrayList::new)));
}
return doGenerateIndexSQL(indexData);
}
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoader.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoader.java
index ea6aeb180a4..255958a1d13 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoader.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoader.java
@@ -118,7 +118,7 @@ public final class PostgreSQLTablePropertiesLoader {
}
private boolean anyIsTrue(final Collection<Object> collection) {
- return collection.stream().anyMatch(each -> each instanceof Boolean &&
(Boolean) each);
+ return collection.stream().anyMatch(each -> each instanceof Boolean
value && value);
}
private void updateRlspolicySupport(final Map<String, Object> context) {
diff --git
a/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordTableInventoryCheckCalculatorTest.java
b/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordTableInventoryCheckCalculatorTest.java
index bc1d20d9ffd..2dd8fe4ba75 100644
---
a/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordTableInventoryCheckCalculatorTest.java
+++
b/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordTableInventoryCheckCalculatorTest.java
@@ -33,6 +33,7 @@ import
org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.infra.util.close.QuietlyCloser;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
@@ -111,6 +112,14 @@ class RecordTableInventoryCheckCalculatorTest {
assertRangeQueryCalculatedResult(calculator, param,
Range.openClosed(4, null), 4, 8);
}
+ @Test
+ void assertCalculateOfRangeQueryWithOnlyUpperBound() {
+ RecordTableInventoryCheckCalculator calculator = new
RecordTableInventoryCheckCalculator(10, 1, StreamingRangeType.SMALL);
+ TableInventoryCalculateParameter param = new
TableInventoryCalculateParameter(dataSource, new QualifiedTable(null,
"t_order"), Collections.emptyList(), buildUserIdUniqueKey(),
+ QueryType.RANGE_QUERY, null);
+ assertRangeQueryCalculatedResult(calculator, param,
Range.openClosed(null, 3), 7, 3);
+ }
+
@ParameterizedTest
@CsvSource({"SMALL", "LARGE"})
void assertCalculateOfRangeQueryWithMultiColumnUniqueKeys(final String
streamingRangeType) {
@@ -359,6 +368,22 @@ class RecordTableInventoryCheckCalculatorTest {
assertThat(actual.getMaxUniqueKeyValue().get(), is(3));
}
+ @Test
+ void assertCalculateOfPointQueryWithShardingColumn() {
+ RecordTableInventoryCheckCalculator calculator = new
RecordTableInventoryCheckCalculator(3, StreamingRangeType.SMALL);
+ TableInventoryCalculateParameter param = new
TableInventoryCalculateParameter(dataSource, new QualifiedTable(null,
"t_order"), Collections.emptyList(), buildUserIdUniqueKey(),
+ QueryType.POINT_QUERY, null);
+ param.setUniqueKeysValues(Collections.singleton(3));
+ param.setShardingColumnsNames(Collections.singletonList("order_id"));
+ param.setShardingColumnsValues(Collections.singletonList(5));
+ Optional<TableInventoryCheckCalculatedResult> actualResult =
calculator.calculateChunk(param);
+ QuietlyCloser.close(param.getCalculationContext());
+ assertTrue(actualResult.isPresent());
+ RecordTableInventoryCheckCalculatedResult actual =
(RecordTableInventoryCheckCalculatedResult) actualResult.get();
+ assertThat(actual.getRecordsCount(), is(1));
+ assertRecord(actual.getRecords().get(0), 3, 5);
+ }
+
@ParameterizedTest
@CsvSource({"SMALL", "LARGE"})
void assertCalculateOfPointRangeQuery(final String streamingRangeType) {
diff --git
a/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngineTest.java
b/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngineTest.java
index 319f0ec7ece..93db895d7d1 100644
---
a/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngineTest.java
+++
b/test/it/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/column/InventoryColumnValueReaderEngineTest.java
@@ -137,6 +137,12 @@ class InventoryColumnValueReaderEngineTest {
assertThat(engine.read(resultSet, metaData, 1), is(new
BigInteger("1")));
}
+ @Test
+ void assertReadWithNullUnsignedBigIntValue() throws SQLException {
+ when(metaData.getColumnType(1)).thenReturn(Types.BIGINT);
+ assertNull(engine.read(resultSet, metaData, 1));
+ }
+
@Test
void assertReadWithNumericValue() throws SQLException {
when(metaData.getColumnType(1)).thenReturn(Types.NUMERIC);