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 @@ -833,9 +833,10 @@ private List<ExecuteResponse> executeSQL(SimpleSqlStatement simpleSqlStatement,
String originalSql = simpleSqlStatement.getSql();
long startedAtEpochMs = System.currentTimeMillis();
long startedAtNanos = System.nanoTime();
int pageNo = Optional.ofNullable(param.getPageNo()).orElse(1);
int pageSize = Optional.ofNullable(param.getPageSize()).orElse(IEasyToolsConstant.MAX_PAGE_SIZE);
Integer offset = (pageNo - 1) * pageSize;
PageBounds pageBounds = normalizePageBounds(param.getPageNo(), param.getPageSize());
int pageNo = pageBounds.pageNo();
int pageSize = pageBounds.pageSize();
Integer offset = pageBounds.offset();
Integer count = pageSize;
SqlTypeEnum sqlType = getSqlType(dbType, originalSql);
List<ExecuteResponse> executeResults = new ArrayList<>();
Expand Down Expand Up @@ -910,9 +911,10 @@ private List<ExecuteResponse> executeSQLStreaming(SimpleSqlStatement simpleSqlSt
String originalSql = simpleSqlStatement.getSql();
long startedAtEpochMs = System.currentTimeMillis();
long startedAtNanos = System.nanoTime();
int pageNo = Optional.ofNullable(param.getPageNo()).orElse(1);
int pageSize = Optional.ofNullable(param.getPageSize()).orElse(IEasyToolsConstant.MAX_PAGE_SIZE);
Integer offset = (pageNo - 1) * pageSize;
PageBounds pageBounds = normalizePageBounds(param.getPageNo(), param.getPageSize());
int pageNo = pageBounds.pageNo();
int pageSize = pageBounds.pageSize();
Integer offset = pageBounds.offset();
Integer count = pageSize;
SqlTypeEnum sqlType = getSqlType(dbType, originalSql);
List<ExecuteResponse> executeResults = new ArrayList<>();
Expand Down Expand Up @@ -979,6 +981,27 @@ private List<ExecuteResponse> executeSQLStreaming(SimpleSqlStatement simpleSqlSt
return executeResults;
}

static PageBounds normalizePageBounds(Integer requestedPageNo, Integer requestedPageSize) {
int pageNo = Optional.ofNullable(requestedPageNo).orElse(1);
int pageSize = Optional.ofNullable(requestedPageSize).orElse(IEasyToolsConstant.MAX_PAGE_SIZE);
if (pageNo < 1) {
pageNo = 1;
}
if (pageSize < 1 || pageSize > IEasyToolsConstant.MAX_PAGE_SIZE) {
pageSize = IEasyToolsConstant.MAX_PAGE_SIZE;
}

long maxPageNo = (long) Integer.MAX_VALUE / pageSize + 1L;
if ((long) pageNo > maxPageNo) {
pageNo = (int) maxPageNo;
}
int offset = (int) ((long) (pageNo - 1) * pageSize);
return new PageBounds(pageNo, pageSize, offset);
}

record PageBounds(int pageNo, int pageSize, int offset) {
}

protected List<ExecuteResponse> executeMulti(SimpleSqlStatement simpleSqlStatement, Connection connection,
boolean limitRowSize, Integer offset, Integer count,
Integer resultSetId) throws SQLException {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package ai.chat2db.spi;

import ai.chat2db.community.tools.constant.IEasyToolsConstant;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class DefaultSQLExecutorPageBoundsTest {

@Test
void defaultsAndInvalidValuesUseFirstPageAndMaximumPageSize() {
assertBounds(null, null, 1, IEasyToolsConstant.MAX_PAGE_SIZE, 0);
assertBounds(0, 0, 1, IEasyToolsConstant.MAX_PAGE_SIZE, 0);
assertBounds(-1, IEasyToolsConstant.MAX_PAGE_SIZE + 1,
1, IEasyToolsConstant.MAX_PAGE_SIZE, 0);
}

@Test
void clampsPageNumberWithoutOverflowingOffset() {
int pageSize = 1000;
int maxPageNo = Integer.MAX_VALUE / pageSize + 1;
int maxOffset = (maxPageNo - 1) * pageSize;

assertBounds(Integer.MAX_VALUE, pageSize, maxPageNo, pageSize, maxOffset);
assertBounds(Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 1, Integer.MAX_VALUE - 1);
}

private static void assertBounds(Integer requestedPageNo, Integer requestedPageSize,
int pageNo, int pageSize, int offset) {
DefaultSQLExecutor.PageBounds bounds =
DefaultSQLExecutor.normalizePageBounds(requestedPageNo, requestedPageSize);
assertEquals(pageNo, bounds.pageNo());
assertEquals(pageSize, bounds.pageSize());
assertEquals(offset, bounds.offset());
}
}
Loading