Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand All @@ -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<Object> params) {
if (expressionSegment instanceof BinaryOperationExpression) {
return getValueFromBinaryOperationExpression((BinaryOperationExpression) expressionSegment, params);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
Expand All @@ -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));
Expand Down Expand Up @@ -128,6 +139,10 @@ private List<Object> getParameters() {
return Arrays.asList(30, 20);
}

private List<Object> 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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
}
Expand Down