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());