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 04f3cb9474f Support postgresql limit and offset as null (#32427)
04f3cb9474f is described below

commit 04f3cb9474f12d26a0ba9ba61cb9239449834ac6
Author: ZhangCheng <[email protected]>
AuthorDate: Thu Aug 8 18:11:12 2024 +0800

    Support postgresql limit and offset as null (#32427)
    
    * Support postgresql limit and offset as null
    
    * Support postgresql limit and offset as null
    
    * Support postgresql limit and offset as null
    
    * Increase maven jvm config
---
 .mvn/jvm.config                                                |  2 +-
 .../sharding/merge/dql/ShardingDQLResultMergerTest.java        | 10 +++++-----
 .../merge/dql/pagination/LimitDecoratorMergedResultTest.java   |  2 +-
 .../pagination/TopAndRowNumberDecoratorMergedResultTest.java   |  2 +-
 .../token/generator/ShardingRowCountTokenGeneratorTest.java    |  4 ++--
 .../context/segment/select/pagination/PaginationContext.java   |  9 ++++++---
 .../pagination/engine/RowNumberPaginationContextEngine.java    |  2 +-
 .../select/pagination/engine/TopPaginationContextEngine.java   |  2 +-
 .../visitor/statement/PostgreSQLStatementVisitor.java          |  9 ++++++---
 .../dml/pagination/NumberLiteralPaginationValueSegment.java    |  2 +-
 .../dml/pagination/limit/NumberLiteralLimitValueSegment.java   |  4 ++--
 .../pagination/rownum/NumberLiteralRowNumberValueSegment.java  |  4 ++--
 .../apache/shardingsphere/test/e2e/cases/value/SQLValue.java   |  3 +++
 .../src/test/resources/cases/dql/e2e-dql-select-pagination.xml |  5 +++++
 14 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/.mvn/jvm.config b/.mvn/jvm.config
index 7a36713456c..298a0335999 100644
--- a/.mvn/jvm.config
+++ b/.mvn/jvm.config
@@ -1 +1 @@
--Xmx2g -XX:MaxMetaspaceSize=512m
+-Xmx4g -XX:MaxMetaspaceSize=512m
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
index 7e59de44d21..2722a32e9a7 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
@@ -130,7 +130,7 @@ class ShardingDQLResultMergerTest {
         WhereSegment whereSegment = mock(WhereSegment.class);
         BinaryOperationExpression binaryOperationExpression = 
mock(BinaryOperationExpression.class);
         when(binaryOperationExpression.getLeft()).thenReturn(new 
ColumnSegment(0, 0, new IdentifierValue("row_id")));
-        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1));
+        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1L));
         when(binaryOperationExpression.getOperator()).thenReturn(">=");
         when(whereSegment.getExpr()).thenReturn(binaryOperationExpression);
         SubqueryTableSegment subqueryTableSegment = 
mock(SubqueryTableSegment.class);
@@ -202,7 +202,7 @@ class ShardingDQLResultMergerTest {
         WhereSegment whereSegment = mock(WhereSegment.class);
         BinaryOperationExpression binaryOperationExpression = 
mock(BinaryOperationExpression.class);
         when(binaryOperationExpression.getLeft()).thenReturn(new 
ColumnSegment(0, 0, new IdentifierValue("row_id")));
-        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1));
+        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1L));
         when(binaryOperationExpression.getOperator()).thenReturn(">=");
         when(whereSegment.getExpr()).thenReturn(binaryOperationExpression);
         SubqueryTableSegment subqueryTableSegment = 
mock(SubqueryTableSegment.class);
@@ -281,7 +281,7 @@ class ShardingDQLResultMergerTest {
         WhereSegment whereSegment = mock(WhereSegment.class);
         BinaryOperationExpression binaryOperationExpression = 
mock(BinaryOperationExpression.class);
         when(binaryOperationExpression.getLeft()).thenReturn(new 
ColumnSegment(0, 0, new IdentifierValue("row_id")));
-        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1));
+        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1L));
         when(binaryOperationExpression.getOperator()).thenReturn(">=");
         when(whereSegment.getExpr()).thenReturn(binaryOperationExpression);
         SubqueryTableSegment subqueryTableSegment = 
mock(SubqueryTableSegment.class);
@@ -360,7 +360,7 @@ class ShardingDQLResultMergerTest {
         WhereSegment whereSegment = mock(WhereSegment.class);
         BinaryOperationExpression binaryOperationExpression = 
mock(BinaryOperationExpression.class);
         when(binaryOperationExpression.getLeft()).thenReturn(new 
ColumnSegment(0, 0, new IdentifierValue("row_id")));
-        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1));
+        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1L));
         when(binaryOperationExpression.getOperator()).thenReturn(">=");
         when(whereSegment.getExpr()).thenReturn(binaryOperationExpression);
         SubqueryTableSegment subqueryTableSegment = 
mock(SubqueryTableSegment.class);
@@ -442,7 +442,7 @@ class ShardingDQLResultMergerTest {
         WhereSegment whereSegment = mock(WhereSegment.class);
         BinaryOperationExpression binaryOperationExpression = 
mock(BinaryOperationExpression.class);
         when(binaryOperationExpression.getLeft()).thenReturn(new 
ColumnSegment(0, 0, new IdentifierValue("row_id")));
-        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1));
+        when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, 1L));
         when(binaryOperationExpression.getOperator()).thenReturn(">=");
         when(whereSegment.getExpr()).thenReturn(binaryOperationExpression);
         SubqueryTableSegment subqueryTableSegment = 
mock(SubqueryTableSegment.class);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/LimitDecoratorMergedResultTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/LimitDecoratorMergedResultTest.java
index ca8a5b5e4d7..746ad5f37b5 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/LimitDecoratorMergedResultTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/LimitDecoratorMergedResultTest.java
@@ -53,7 +53,7 @@ class LimitDecoratorMergedResultTest {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         MySQLSelectStatement selectStatement = new MySQLSelectStatement();
         selectStatement.setProjections(new ProjectionsSegment(0, 0));
-        selectStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralLimitValueSegment(0, 0, Integer.MAX_VALUE), null));
+        selectStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralLimitValueSegment(0, 0, Long.MAX_VALUE), null));
         SelectStatementContext selectStatementContext =
                 new 
SelectStatementContext(createShardingSphereMetaData(database), 
Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME, 
Collections.emptyList());
         when(database.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/TopAndRowNumberDecoratorMergedResultTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/TopAndRowNumberDecoratorMergedResultTest.java
index 8348a2a03bf..9f3de6d04ba 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/TopAndRowNumberDecoratorMergedResultTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/pagination/TopAndRowNumberDecoratorMergedResultTest.java
@@ -64,7 +64,7 @@ class TopAndRowNumberDecoratorMergedResultTest {
         
when(database.getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
         SQLServerSelectStatement sqlStatement = new SQLServerSelectStatement();
         sqlStatement.setProjections(new ProjectionsSegment(0, 0));
-        sqlStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralRowNumberValueSegment(0, 0, Integer.MAX_VALUE, true), null));
+        sqlStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralRowNumberValueSegment(0, 0, Long.MAX_VALUE, true), null));
         SelectStatementContext selectStatementContext =
                 new 
SelectStatementContext(createShardingSphereMetaData(database), 
Collections.emptyList(), sqlStatement, DefaultDatabase.LOGIC_NAME, 
Collections.emptyList());
         ShardingDQLResultMerger resultMerger = new 
ShardingDQLResultMerger(TypedSPILoader.getService(DatabaseType.class, 
"SQLServer"));
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/ShardingRowCountTokenGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/ShardingRowCountTokenGeneratorTest.java
index e6d029398b5..111657a153e 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/ShardingRowCountTokenGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/ShardingRowCountTokenGeneratorTest.java
@@ -53,9 +53,9 @@ class ShardingRowCountTokenGeneratorTest {
     
     @Test
     void assertGenerateSQLToken() {
-        final int testOffsetSegmentValue = 12;
+        final long testOffsetSegmentValue = 12L;
         NumberLiteralLimitValueSegment offsetSegment = new 
NumberLiteralLimitValueSegment(1, 2, testOffsetSegmentValue);
-        final int testRowCountSegmentValue = 8;
+        final long testRowCountSegmentValue = 8L;
         NumberLiteralLimitValueSegment rowCountSegment = new 
NumberLiteralLimitValueSegment(4, 5, testRowCountSegmentValue);
         PaginationContext paginationContext = new 
PaginationContext(offsetSegment, rowCountSegment, null);
         SelectStatementContext selectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java
index 160702843d4..69876d3c8cf 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/PaginationContext.java
@@ -40,7 +40,7 @@ public final class PaginationContext {
     
     private final PaginationValueSegment rowCountSegment;
     
-    private final long actualOffset;
+    private final Long actualOffset;
     
     private final Long actualRowCount;
     
@@ -48,13 +48,16 @@ public final class PaginationContext {
         hasPagination = null != offsetSegment || null != rowCountSegment;
         this.offsetSegment = offsetSegment;
         this.rowCountSegment = rowCountSegment;
-        actualOffset = null == offsetSegment ? 0L : getValue(offsetSegment, 
params);
+        actualOffset = null == offsetSegment ? Long.valueOf(0L) : 
getValue(offsetSegment, params);
         actualRowCount = null == rowCountSegment ? null : 
getValue(rowCountSegment, params);
     }
     
-    private long getValue(final PaginationValueSegment paginationValueSegment, 
final List<Object> params) {
+    private Long getValue(final PaginationValueSegment paginationValueSegment, 
final List<Object> params) {
         if (paginationValueSegment instanceof 
ParameterMarkerPaginationValueSegment) {
             Object obj = null == params || params.isEmpty() ? 0L : 
params.get(((ParameterMarkerPaginationValueSegment) 
paginationValueSegment).getParameterIndex());
+            if (null == obj) {
+                return null;
+            }
             return obj instanceof Long ? (long) obj : (int) obj;
         }
         if (paginationValueSegment instanceof ExpressionRowNumberValueSegment) 
{
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
index dee7a2fae07..96dd3ae1b8d 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/RowNumberPaginationContextEngine.java
@@ -150,7 +150,7 @@ public final class RowNumberPaginationContextEngine {
         int startIndex = expression.getStartIndex();
         int stopIndex = expression.getStopIndex();
         if (expression instanceof LiteralExpressionSegment) {
-            return new NumberLiteralRowNumberValueSegment(startIndex, 
stopIndex, (int) ((LiteralExpressionSegment) expression).getLiterals(), 
boundOpened);
+            return new NumberLiteralRowNumberValueSegment(startIndex, 
stopIndex, Long.parseLong(((LiteralExpressionSegment) 
expression).getLiterals().toString()), boundOpened);
         }
         if (expression instanceof ParameterMarkerExpressionSegment) {
             return new ParameterMarkerRowNumberValueSegment(startIndex, 
stopIndex, ((ParameterMarkerExpressionSegment) 
expression).getParameterMarkerIndex(), boundOpened);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/TopPaginationContextEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/TopPaginationContextEngine.java
index be9b92c3dd2..eab9fd8fe20 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/TopPaginationContextEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/pagination/engine/TopPaginationContextEngine.java
@@ -103,7 +103,7 @@ public final class TopPaginationContextEngine {
         int startIndex = expression.getStartIndex();
         int stopIndex = expression.getStopIndex();
         return expression instanceof LiteralExpressionSegment
-                ? new NumberLiteralRowNumberValueSegment(startIndex, 
stopIndex, (int) ((LiteralExpressionSegment) expression).getLiterals(), 
boundOpened)
+                ? new NumberLiteralRowNumberValueSegment(startIndex, 
stopIndex, Long.parseLong(((LiteralExpressionSegment) 
expression).getLiterals().toString()), boundOpened)
                 : new ParameterMarkerRowNumberValueSegment(startIndex, 
stopIndex, ((ParameterMarkerExpressionSegment) 
expression).getParameterMarkerIndex(), boundOpened);
     }
 }
diff --git 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
index f518ffa4c7a..7696ef1bd2c 100644
--- 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
+++ 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
@@ -1299,7 +1299,8 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         if (astNode instanceof ParameterMarkerExpressionSegment) {
             return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
-        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
+        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(),
+                (null == ((LiteralExpressionSegment) astNode).getLiterals()) ? 
null : Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
     }
     
     @Override
@@ -1308,7 +1309,8 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         if (astNode instanceof ParameterMarkerExpressionSegment) {
             return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
-        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
+        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(),
+                (null == ((LiteralExpressionSegment) astNode).getLiterals()) ? 
null : Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
     }
     
     @Override
@@ -1317,7 +1319,8 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         if (astNode instanceof ParameterMarkerExpressionSegment) {
             return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
-        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
+        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(),
+                (null == ((LiteralExpressionSegment) astNode).getLiterals()) ? 
null : Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
     }
     
     private LimitSegment createLimitSegmentWhenLimitAndOffset(final 
SelectLimitContext ctx) {
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/NumberLiteralPaginationValueSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/NumberLiteralPaginationValueSegment.java
index 0fdce70978d..1db292b3e64 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/NumberLiteralPaginationValueSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/NumberLiteralPaginationValueSegment.java
@@ -27,5 +27,5 @@ public interface NumberLiteralPaginationValueSegment extends 
PaginationValueSegm
      *
      * @return value
      */
-    long getValue();
+    Long getValue();
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/limit/NumberLiteralLimitValueSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/limit/NumberLiteralLimitValueSegment.java
index 78bc5a9c032..fe2503aa31c 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/limit/NumberLiteralLimitValueSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/limit/NumberLiteralLimitValueSegment.java
@@ -26,9 +26,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.paginatio
 @Getter
 public final class NumberLiteralLimitValueSegment extends LimitValueSegment 
implements NumberLiteralPaginationValueSegment {
     
-    private final long value;
+    private final Long value;
     
-    public NumberLiteralLimitValueSegment(final int startIndex, final int 
stopIndex, final long value) {
+    public NumberLiteralLimitValueSegment(final int startIndex, final int 
stopIndex, final Long value) {
         super(startIndex, stopIndex);
         this.value = value;
     }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/rownum/NumberLiteralRowNumberValueSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/rownum/NumberLiteralRowNumberValueSegment.java
index 4eb83d597de..097d2db9176 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/rownum/NumberLiteralRowNumberValueSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/pagination/rownum/NumberLiteralRowNumberValueSegment.java
@@ -26,9 +26,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.paginatio
 @Getter
 public final class NumberLiteralRowNumberValueSegment extends 
RowNumberValueSegment implements NumberLiteralPaginationValueSegment {
     
-    private final long value;
+    private final Long value;
     
-    public NumberLiteralRowNumberValueSegment(final int startIndex, final int 
stopIndex, final long value, final boolean boundOpened) {
+    public NumberLiteralRowNumberValueSegment(final int startIndex, final int 
stopIndex, final Long value, final boolean boundOpened) {
         super(startIndex, stopIndex, boundOpened);
         this.value = value;
     }
diff --git 
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/cases/value/SQLValue.java
 
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/cases/value/SQLValue.java
index eaa12f815bf..72b9f043139 100644
--- 
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/cases/value/SQLValue.java
+++ 
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/cases/value/SQLValue.java
@@ -117,6 +117,9 @@ public final class SQLValue {
     
     @Override
     public String toString() {
+        if (null == value) {
+            return null;
+        }
         if (value instanceof String) {
             return formatString((String) value);
         }
diff --git 
a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-pagination.xml 
b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-pagination.xml
index 1f046ce0327..b79d07199ed 100644
--- a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-pagination.xml
+++ b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-pagination.xml
@@ -40,4 +40,9 @@
     <!--<test-case sql="SELECT o.*, i.* FROM t_order_federate o, 
t_order_item_federate i WHERE o.order_id = ? AND i.item_id = ? LIMIT ?" 
scenario-types="db,dbtbl_with_readwrite_splitting,dbtbl_with_readwrite_splitting_and_encrypt,sharding_and_encrypt,encrypt_and_readwrite_splitting">
         <assertion parameters="1000:int, 100000:int, 3:int" 
expected-data-source-name="read_dataset" />
     </test-case>-->
+    
+    <test-case sql="SELECT * FROM t_order WHERE order_id = ? ORDER BY order_id 
limit ? offset ?" db-types="PostgreSQL" scenario-types="encrypt"
+               scenario-comments="Test postgresql paging query parameter is 
null scenario">
+        <assertion parameters="1000:int, null:int, null:int" 
expected-data-source-name="read_dataset" />
+    </test-case>
 </e2e-test-cases>

Reply via email to