strongduanmu commented on code in PR #37962:
URL: https://github.com/apache/shardingsphere/pull/37962#discussion_r2767595904
##########
parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitor.java:
##########
@@ -1393,29 +1394,37 @@ public ASTNode visitSelectLimitValue(final
SelectLimitValueContext ctx) {
if (null != ctx.ALL()) {
return null;
}
- ASTNode astNode = visit(ctx.cExpr());
- 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(((ExpressionSegment)
astNode).getText()));
+ return toLimitValueSegment(ctx, (ExpressionSegment)
visit(ctx.aExpr()));
}
@Override
public ASTNode visitSelectOffsetValue(final SelectOffsetValueContext ctx) {
- ASTNode astNode = visit(ctx.cExpr());
- 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(((ExpressionSegment)
astNode).getText()));
+ return toLimitValueSegment(ctx, (ExpressionSegment)
visit(ctx.aExpr()));
}
@Override
public ASTNode visitSelectFetchValue(final SelectFetchValueContext ctx) {
- ASTNode astNode = visit(ctx.cExpr());
- if (astNode instanceof ParameterMarkerExpressionSegment) {
- return new
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment)
astNode).getParameterMarkerIndex());
+ return toLimitValueSegment(ctx, (ExpressionSegment)
visit(ctx.aExpr()));
+ }
+
+ private LimitValueSegment toLimitValueSegment(final ParserRuleContext ctx,
final ExpressionSegment segment) {
+ if (segment instanceof ParameterMarkerExpressionSegment) {
+ return new
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(),
+ ((ParameterMarkerExpressionSegment)
segment).getParameterMarkerIndex());
+ }
+ if (segment instanceof TypeCastExpression) {
+ return toLimitValueSegment(ctx, ((TypeCastExpression)
segment).getExpression());
+ }
+ if (segment instanceof LiteralExpressionSegment) {
+ Object literals = ((LiteralExpressionSegment)
segment).getLiterals();
+ if (null == literals) {
+ return ctx instanceof SelectOffsetValueContext
+ ? new
NumberLiteralLimitValueSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), 0L)
+ : null;
+ }
+ return new
NumberLiteralLimitValueSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), Long.parseLong(literals.toString()));
}
- return new NumberLiteralLimitValueSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), Long.parseLong(((ExpressionSegment)
astNode).getText()));
+ throw new SQLParsingException("Unsupported LIMIT expression: " +
segment.getText());
Review Comment:
Why add this check? openGauss does not support limit segment?
##########
parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitor.java:
##########
@@ -1393,29 +1394,37 @@ public ASTNode visitSelectLimitValue(final
SelectLimitValueContext ctx) {
if (null != ctx.ALL()) {
return null;
}
- ASTNode astNode = visit(ctx.cExpr());
- 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(((ExpressionSegment)
astNode).getText()));
+ return toLimitValueSegment(ctx, (ExpressionSegment)
visit(ctx.aExpr()));
}
@Override
public ASTNode visitSelectOffsetValue(final SelectOffsetValueContext ctx) {
- ASTNode astNode = visit(ctx.cExpr());
- 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(((ExpressionSegment)
astNode).getText()));
+ return toLimitValueSegment(ctx, (ExpressionSegment)
visit(ctx.aExpr()));
}
@Override
public ASTNode visitSelectFetchValue(final SelectFetchValueContext ctx) {
- ASTNode astNode = visit(ctx.cExpr());
- if (astNode instanceof ParameterMarkerExpressionSegment) {
- return new
ParameterMarkerLimitValueSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ((ParameterMarkerExpressionSegment)
astNode).getParameterMarkerIndex());
+ return toLimitValueSegment(ctx, (ExpressionSegment)
visit(ctx.aExpr()));
+ }
+
+ private LimitValueSegment toLimitValueSegment(final ParserRuleContext ctx,
final ExpressionSegment segment) {
Review Comment:
Do you think createLimitValueSegment is better?
##########
parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/OpenGaussStatementVisitor.java:
##########
@@ -1393,29 +1394,37 @@ public ASTNode visitSelectLimitValue(final
SelectLimitValueContext ctx) {
if (null != ctx.ALL()) {
return null;
}
- ASTNode astNode = visit(ctx.cExpr());
- 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(((ExpressionSegment)
astNode).getText()));
+ return toLimitValueSegment(ctx, (ExpressionSegment)
visit(ctx.aExpr()));
Review Comment:
Do you think createLimitValueSegment is better?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]