diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java index d269e8a849af4..7d304870cc329 100644 --- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java +++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java @@ -31,6 +31,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.LimitValueSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.rownum.ExpressionRowNumberValueSegment; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -64,7 +65,7 @@ private Long getValue(final PaginationValueSegment paginationValueSegment, final if (null == obj) { return null; } - return obj instanceof Long ? (long) obj : (int) obj; + return getLongValue(obj); } if (paginationValueSegment instanceof ExpressionRowNumberValueSegment) { return ((ExpressionRowNumberValueSegment) paginationValueSegment).getValue(params); @@ -76,6 +77,16 @@ private Long getValue(final PaginationValueSegment paginationValueSegment, final return ((NumberLiteralPaginationValueSegment) paginationValueSegment).getValue(); } + private Long getLongValue(final Object value) { + if (value instanceof Number) { + return ((Number) value).longValue(); + } + if (value instanceof byte[]) { + return Long.parseLong(new String((byte[]) value, StandardCharsets.UTF_8)); + } + return Long.parseLong(value.toString()); + } + private Long getValueFromExpression(final ExpressionSegment expressionSegment, final List params) { if (expressionSegment instanceof BinaryOperationExpression) { return getValueFromBinaryOperationExpression((BinaryOperationExpression) expressionSegment, params); diff --git a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContextTest.java b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContextTest.java index bb449308c882d..3675cc315536a 100644 --- a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContextTest.java +++ b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContextTest.java @@ -34,6 +34,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement; import org.junit.jupiter.api.Test; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -77,6 +78,11 @@ void assertGetActualOffsetWithNumberLiteralPaginationValueSegment() { getRowCountSegmentWithNumberLiteralPaginationValueSegment(), getParameters()).getActualOffset(), is(30L)); } + @Test + void assertGetActualOffsetWithByteArrayParameters() { + assertThat(new PaginationContext(getOffsetSegment(), getRowCountSegment(), getByteArrayParameters()).getActualOffset(), is(30L)); + } + @Test void assertGetActualOffsetWithNullOffsetSegment() { assertThat(new PaginationContext(null, getRowCountSegment(), getParameters()).getActualOffset(), is(0L)); @@ -93,6 +99,11 @@ void assertGetActualRowCountWithNumberLiteralPaginationValueSegment() { getRowCountSegmentWithNumberLiteralPaginationValueSegment(), getParameters()).getActualRowCount().orElse(null), is(20L)); } + @Test + void assertGetActualRowCountWithByteArrayParameters() { + assertThat(new PaginationContext(getOffsetSegment(), getRowCountSegment(), getByteArrayParameters()).getActualRowCount().orElse(null), is(20L)); + } + @Test void assertGetActualRowCountWithNullRowCountSegment() { assertNull(new PaginationContext(getOffsetSegment(), null, getParameters()).getActualRowCount().orElse(null)); @@ -128,6 +139,10 @@ private List getParameters() { return Arrays.asList(30, 20); } + private List getByteArrayParameters() { + return Arrays.asList("30".getBytes(StandardCharsets.UTF_8), "20".getBytes(StandardCharsets.UTF_8)); + } + @Test void assertGetRevisedOffset() { assertThat(new PaginationContext(getOffsetSegment(), getRowCountSegment(), getParameters()).getRevisedOffset(), is(0L)); diff --git a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/SelectStatementContextTest.java b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/SelectStatementContextTest.java index dd86923243b72..a27242becfcda 100644 --- a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/SelectStatementContextTest.java +++ b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dml/SelectStatementContextTest.java @@ -67,6 +67,7 @@ import org.apache.shardingsphere.infra.binder.context.segment.select.pagination.PaginationContext; import org.junit.jupiter.api.Test; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.Optional; @@ -364,6 +365,23 @@ void assertBindParametersPopulatePaginationContext() { assertThat(paginationContext.getActualRowCount(), is(Optional.of(5L))); } + @Test + void assertBindParametersPopulatePaginationContextWithByteArrayParameters() { + SelectStatement selectStatement = new SelectStatement(databaseType); + selectStatement.setProjections(new ProjectionsSegment(0, 0)); + LimitSegment limitSegment = new LimitSegment(0, 0, + new ParameterMarkerLimitValueSegment(0, 0, 0), new NumberLiteralLimitValueSegment(1, 1, 5L)); + selectStatement.setLimit(limitSegment); + SelectStatementContext selectStatementContext = createSelectStatementContext(selectStatement); + selectStatementContext.bindParameters(Collections.singletonList("7".getBytes(StandardCharsets.UTF_8))); + PaginationContext paginationContext = selectStatementContext.getPaginationContext(); + assertTrue(paginationContext.getOffsetParameterIndex().isPresent()); + assertThat(paginationContext.getOffsetParameterIndex().get(), is(0)); + assertThat(paginationContext.getActualOffset(), is(7L)); + assertFalse(paginationContext.getRowCountParameterIndex().isPresent()); + assertThat(paginationContext.getActualRowCount(), is(Optional.of(5L))); + } + private ShardingSphereMetaData createShardingSphereMetaData(final ShardingSphereDatabase database) { return new ShardingSphereMetaData(Collections.singleton(database), mock(ResourceMetaData.class), mock(RuleMetaData.class), mock(ConfigurationProperties.class)); }