This is an automated email from the ASF dual-hosted git repository.

panjuan 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 f0b40ab63de Optimize the definition and parsing of limit clause for 
PG/OG. (#25681)
f0b40ab63de is described below

commit f0b40ab63de94d5ae3b026486ce71d442c97c743
Author: Raigor <[email protected]>
AuthorDate: Mon May 15 21:09:49 2023 +0800

    Optimize the definition and parsing of limit clause for PG/OG. (#25681)
---
 .../main/antlr4/imports/opengauss/DMLStatement.g4  | 26 +++++++++-------------
 .../statement/OpenGaussStatementVisitor.java       | 21 ++++++++---------
 .../main/antlr4/imports/postgresql/DMLStatement.g4 | 26 +++++++++-------------
 .../statement/PostgreSQLStatementVisitor.java      | 21 ++++++++---------
 4 files changed, 40 insertions(+), 54 deletions(-)

diff --git 
a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
 
b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
index f7b546ead80..9440b79816c 100644
--- 
a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
+++ 
b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/DMLStatement.g4
@@ -212,10 +212,8 @@ qualifiedNameList
     ;
 
 selectLimit
-    : limitClause offsetClause
-    | offsetClause limitClause
-    | limitClause
-    | offsetClause
+    : limitClause offsetClause?
+    | offsetClause limitClause?
     ;
 
 valuesClause
@@ -226,30 +224,24 @@ valuesClause
 limitClause
     : LIMIT selectLimitValue
     | LIMIT selectOffsetValue COMMA_ selectLimitValue 
-    | FETCH firstOrNext selectFetchFirstValue rowOrRows ONLY
-    | FETCH firstOrNext selectFetchFirstValue rowOrRows WITH TIES
-    | FETCH firstOrNext rowOrRows ONLY
-    | FETCH firstOrNext rowOrRows WITH TIES
+    | FETCH firstOrNext selectFetchValue? rowOrRows onlyOrWithTies
     ;
 
 offsetClause
-    : OFFSET selectOffsetValue
-    | OFFSET selectOffsetValue rowOrRows
+    : OFFSET selectOffsetValue rowOrRows?
     ;
 
 selectLimitValue
-    : aExpr
+    : cExpr
     | ALL
     ;
 
 selectOffsetValue
-    : aExpr
+    : cExpr
     ;
 
-selectFetchFirstValue
+selectFetchValue
     : cExpr
-    | PLUS_ NUMBER_
-    | MINUS_ NUMBER_
     ;
 
 rowOrRows
@@ -260,6 +252,10 @@ firstOrNext
     : FIRST | NEXT
     ;
 
+onlyOrWithTies
+    : ONLY | WITH TIES
+    ;
+
 targetList
     : targetEl
     | targetList COMMA_ targetEl
diff --git 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
index 1539dd150c6..e137df5302c 100644
--- 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
+++ 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
@@ -82,7 +82,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.Rel
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SchemaNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SelectClauseNContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SelectContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SelectFetchFirstValueContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SelectFetchValueContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SelectLimitContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SelectLimitValueContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.SelectNoParensContext;
@@ -1265,7 +1265,7 @@ public abstract class OpenGaussStatementVisitor extends 
OpenGaussStatementBaseVi
         if (null != ctx.ALL()) {
             return null;
         }
-        ASTNode astNode = visit(ctx.aExpr());
+        ASTNode astNode = visit(ctx.cExpr());
         if (astNode instanceof ParameterMarkerExpressionSegment) {
             return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
@@ -1274,7 +1274,7 @@ public abstract class OpenGaussStatementVisitor extends 
OpenGaussStatementBaseVi
     
     @Override
     public ASTNode visitSelectOffsetValue(final SelectOffsetValueContext ctx) {
-        ASTNode astNode = visit(ctx.aExpr());
+        ASTNode astNode = visit(ctx.cExpr());
         if (astNode instanceof ParameterMarkerExpressionSegment) {
             return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
@@ -1282,15 +1282,12 @@ public abstract class OpenGaussStatementVisitor extends 
OpenGaussStatementBaseVi
     }
     
     @Override
-    public ASTNode visitSelectFetchFirstValue(final 
SelectFetchFirstValueContext ctx) {
+    public ASTNode visitSelectFetchValue(final SelectFetchValueContext ctx) {
         ASTNode astNode = visit(ctx.cExpr());
-        if (null != astNode) {
-            if (astNode instanceof ParameterMarkerLimitValueSegment) {
-                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()));
+        if (astNode instanceof ParameterMarkerExpressionSegment) {
+            return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
-        return visit(ctx.NUMBER_());
+        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
     }
     
     private LimitSegment createLimitSegmentWhenLimitAndOffset(final 
SelectLimitContext ctx) {
@@ -1318,8 +1315,8 @@ public abstract class OpenGaussStatementVisitor extends 
OpenGaussStatementBaseVi
                 LimitValueSegment offset = (LimitValueSegment) 
visit(ctx.limitClause().selectOffsetValue());
                 return new LimitSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), offset, limit);
             }
-            if (null != ctx.limitClause().selectFetchFirstValue()) {
-                LimitValueSegment limit = (LimitValueSegment) 
visit(ctx.limitClause().selectFetchFirstValue());
+            if (null != ctx.limitClause().selectFetchValue()) {
+                LimitValueSegment limit = (LimitValueSegment) 
visit(ctx.limitClause().selectFetchValue());
                 return new LimitSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), null, limit);
             }
             LimitValueSegment limit = (LimitValueSegment) 
visit(ctx.limitClause().selectLimitValue());
diff --git 
a/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
 
b/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
index 9ab4c3769dc..78e9c8620d7 100644
--- 
a/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
+++ 
b/parser/sql/dialect/postgresql/src/main/antlr4/imports/postgresql/DMLStatement.g4
@@ -215,10 +215,8 @@ qualifiedNameList
     ;
 
 selectLimit
-    : limitClause offsetClause
-    | offsetClause limitClause
-    | limitClause
-    | offsetClause
+    : limitClause offsetClause?
+    | offsetClause limitClause?
     ;
 
 valuesClause
@@ -228,30 +226,24 @@ valuesClause
 
 limitClause
     : LIMIT selectLimitValue
-    | FETCH firstOrNext selectFetchFirstValue rowOrRows ONLY
-    | FETCH firstOrNext selectFetchFirstValue rowOrRows WITH TIES
-    | FETCH firstOrNext rowOrRows ONLY
-    | FETCH firstOrNext rowOrRows WITH TIES
+    | FETCH firstOrNext selectFetchValue? rowOrRows onlyOrWithTies
     ;
 
 offsetClause
-    : OFFSET selectOffsetValue
-    | OFFSET selectOffsetValue rowOrRows
+    : OFFSET selectOffsetValue rowOrRows?
     ;
 
 selectLimitValue
-    : aExpr
+    : cExpr
     | ALL
     ;
 
 selectOffsetValue
-    : aExpr
+    : cExpr
     ;
 
-selectFetchFirstValue
+selectFetchValue
     : cExpr
-    | PLUS_ NUMBER_
-    | MINUS_ NUMBER_
     ;
 
 rowOrRows
@@ -262,6 +254,10 @@ firstOrNext
     : FIRST | NEXT
     ;
 
+onlyOrWithTies
+    : ONLY | WITH TIES
+    ;
+
 targetList
     : targetEl
     | targetList COMMA_ targetEl
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 a6408432d1b..54bbc2e28c5 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
@@ -81,7 +81,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Re
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SchemaNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SelectClauseNContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SelectContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SelectFetchFirstValueContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SelectFetchValueContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SelectLimitContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SelectLimitValueContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.SelectNoParensContext;
@@ -1232,7 +1232,7 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         if (null != ctx.ALL()) {
             return null;
         }
-        ASTNode astNode = visit(ctx.aExpr());
+        ASTNode astNode = visit(ctx.cExpr());
         if (astNode instanceof ParameterMarkerExpressionSegment) {
             return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
@@ -1241,7 +1241,7 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
     
     @Override
     public ASTNode visitSelectOffsetValue(final SelectOffsetValueContext ctx) {
-        ASTNode astNode = visit(ctx.aExpr());
+        ASTNode astNode = visit(ctx.cExpr());
         if (astNode instanceof ParameterMarkerExpressionSegment) {
             return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
@@ -1249,15 +1249,12 @@ public abstract class PostgreSQLStatementVisitor 
extends PostgreSQLStatementPars
     }
     
     @Override
-    public ASTNode visitSelectFetchFirstValue(final 
SelectFetchFirstValueContext ctx) {
+    public ASTNode visitSelectFetchValue(final SelectFetchValueContext ctx) {
         ASTNode astNode = visit(ctx.cExpr());
-        if (null != astNode) {
-            if (astNode instanceof ParameterMarkerLimitValueSegment) {
-                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()));
+        if (astNode instanceof ParameterMarkerExpressionSegment) {
+            return new 
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment) 
astNode).getParameterMarkerIndex());
         }
-        return visit(ctx.NUMBER_());
+        return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), Long.parseLong(((LiteralExpressionSegment) 
astNode).getLiterals().toString()));
     }
     
     private LimitSegment createLimitSegmentWhenLimitAndOffset(final 
SelectLimitContext ctx) {
@@ -1280,8 +1277,8 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
     
     private LimitSegment createLimitSegmentWhenRowCountOrOffsetAbsent(final 
SelectLimitContext ctx) {
         if (null != ctx.limitClause()) {
-            if (null != ctx.limitClause().selectFetchFirstValue()) {
-                LimitValueSegment limit = (LimitValueSegment) 
visit(ctx.limitClause().selectFetchFirstValue());
+            if (null != ctx.limitClause().selectFetchValue()) {
+                LimitValueSegment limit = (LimitValueSegment) 
visit(ctx.limitClause().selectFetchValue());
                 return new LimitSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), null, limit);
             }
             LimitValueSegment limit = (LimitValueSegment) 
visit(ctx.limitClause().selectLimitValue());

Reply via email to