You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2026/08/11 01:48:02 UTC

(shardingsphere) branch master updated: Fix openGauss LIMIT offset, row-count parameter marker order (#39242)

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 168a565b2ee Fix openGauss LIMIT offset, row-count parameter marker order (#39242)
168a565b2ee is described below

commit 168a565b2ee7e607a38e0f67fe24a9b085a5636a
Author: fudian <fu...@gmail.com>
AuthorDate: Tue Aug 11 09:47:55 2026 +0800

    Fix openGauss LIMIT offset, row-count parameter marker order (#39242)
    
    For LIMIT offset, row-count (e.g. LIMIT ?, ?), the openGauss visitor
    visited selectLimitValue (row-count) before selectOffsetValue (offset).
    Parameter marker indices are assigned in visit order, so this reversed
    the indices: the lexical first ? (offset) got index 1 and the second ?
    (row-count) got index 0. Visit the offset before the row-count so the
    marker indices follow lexical order, matching DorisStatementVisitor.
---
 .../visitor/statement/OpenGaussStatementVisitor.java         |  2 +-
 .../visitor/statement/OpenGaussStatementVisitorTest.java     | 12 ++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitor.java b/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitor.java
index 50adfdecf8d..ebc4fc942fc 100644
--- a/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitor.java
+++ b/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitor.java
@@ -1544,8 +1544,8 @@ public abstract class OpenGaussStatementVisitor extends OpenGaussStatementParser
     private LimitSegment createLimitSegmentWhenRowCountOrOffsetAbsent(final SelectLimitContext ctx) {
         if (null != ctx.limitClause()) {
             if (null != ctx.limitClause().selectOffsetValue()) {
-                LimitValueSegment limit = (LimitValueSegment) visit(ctx.limitClause().selectLimitValue());
                 LimitValueSegment offset = (LimitValueSegment) visit(ctx.limitClause().selectOffsetValue());
+                LimitValueSegment limit = (LimitValueSegment) visit(ctx.limitClause().selectLimitValue());
                 return new LimitSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), offset, limit);
             }
             if (null != ctx.limitClause().selectFetchValue()) {
diff --git a/parser/sql/engine/dialect/opengauss/src/test/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitorTest.java b/parser/sql/engine/dialect/opengauss/src/test/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitorTest.java
index a221d7d2175..9c8179f0ebd 100644
--- a/parser/sql/engine/dialect/opengauss/src/test/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitorTest.java
+++ b/parser/sql/engine/dialect/opengauss/src/test/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitorTest.java
@@ -23,6 +23,8 @@ import org.apache.shardingsphere.sql.parser.engine.api.SQLStatementVisitorEngine
 import org.apache.shardingsphere.sql.parser.engine.core.ParseASTNode;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.LimitSegment;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.ParameterMarkerLimitValueSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.FunctionTableSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
@@ -65,6 +67,16 @@ class OpenGaussStatementVisitorTest {
         assertThat(actualColumns, contains("r"));
     }
     
+    @Test
+    void assertVisitLimitWithOffsetAndRowCountParameterMarkers() {
+        SelectStatement statement = parseSelectStatement("SELECT * FROM t ORDER BY id LIMIT ?, ?");
+        LimitSegment limit = statement.getLimit().get();
+        ParameterMarkerLimitValueSegment offset = (ParameterMarkerLimitValueSegment) limit.getOffset().get();
+        ParameterMarkerLimitValueSegment rowCount = (ParameterMarkerLimitValueSegment) limit.getRowCount().get();
+        assertThat(offset.getParameterIndex(), is(0));
+        assertThat(rowCount.getParameterIndex(), is(1));
+    }
+    
     private SelectStatement parseSelectStatement(final String sql) {
         ParseASTNode parseASTNode = new SQLParserEngine("openGauss", new CacheOption(128, 1024L)).parse(sql, false);
         return (SelectStatement) new SQLStatementVisitorEngine("openGauss").visit(parseASTNode);