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/10/22 09:37:44 UTC
(shardingsphere) branch master updated: Simplify parser firebird (#40315)
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 b5a93ec3248 Simplify parser firebird (#40315)
b5a93ec3248 is described below
commit b5a93ec324872954ff4de4f2204baccc58a2eada
Author: Maxim Igoshin <16...@users.noreply.github.com>
AuthorDate: Thu Oct 22 12:37:36 2026 +0300
Simplify parser firebird (#40315)
* Simplify Firebird statement visitor
* Simplify Firebird DML statement visitor
* Simplify Firebird DDL and DCL statement visitors
* Add release note for Firebird parser simplification
* Add PR link to Firebird parser simplification release note
---
RELEASE-NOTES.md | 1 +
.../statement/FirebirdStatementVisitor.java | 143 +++++----------
.../type/FirebirdDCLStatementVisitor.java | 6 +-
.../type/FirebirdDDLStatementVisitor.java | 59 +++---
.../type/FirebirdDMLStatementVisitor.java | 201 +++++++--------------
5 files changed, 145 insertions(+), 265 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index e9b01330ee0..d8f07903d76 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -192,6 +192,7 @@
1. Sharding: Fix HASH_MOD routing mismatch for same negative numeric values across numeric Java types with compatibility switch `normalize-numeric-int-range` - [#38327](https://github.com/apache/shardingsphere/pull/38327)
1. SQL Parser: Support parsing SYSTEM_USER in SQL92 dialect and bind it as a niladic function instead of a column - [#39102](https://github.com/apache/shardingsphere/pull/39102)
1. E2E: Add Firebird to SQL E2E tests through ShardingSphere-Proxy
+1. SQL Parser: Simplify SQL statement visitors in Firebird - [#40315](https://github.com/apache/shardingsphere/pull/40315)
## Release 5.5.3
diff --git a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java
index e952f1cc003..2e6f81391ad 100644
--- a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java
+++ b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java
@@ -58,13 +58,11 @@ import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.Owne
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.ParameterMarkerContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.PredicateContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.RegularFunctionContext;
-import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.SchemaNameContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.SimpleExprContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.SpecialFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.StringLiteralsContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.TableNameContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.TableNamesContext;
-import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.UnreservedWordContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.VariableContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.WithClauseContext;
import org.apache.shardingsphere.sql.parser.statement.core.enums.AggregationType;
@@ -91,7 +89,6 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subq
import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationDistinctProjectionSegment;
import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment;
-import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.OrderBySegment;
import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment;
import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ExpressionOrderByItemSegment;
@@ -198,20 +195,9 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
@Override
public final ASTNode visitIdentifier(final IdentifierContext ctx) {
- UnreservedWordContext unreservedWord = ctx.unreservedWord();
- return null == unreservedWord ? new IdentifierValue(ctx.getText()) : visit(unreservedWord);
- }
-
- @Override
- public final ASTNode visitUnreservedWord(final UnreservedWordContext ctx) {
return new IdentifierValue(ctx.getText());
}
- @Override
- public final ASTNode visitSchemaName(final SchemaNameContext ctx) {
- return visit(ctx.identifier());
- }
-
@Override
public final ASTNode visitTableName(final TableNameContext ctx) {
SimpleTableSegment result = new SimpleTableSegment(new TableNameSegment(ctx.name().getStart().getStartIndex(), ctx.name().getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
@@ -270,8 +256,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
private ASTNode createBinaryOperationExpression(final ExprContext ctx, final String operator) {
ExpressionSegment left = (ExpressionSegment) visit(ctx.expr(0));
ExpressionSegment right = (ExpressionSegment) visit(ctx.expr(1));
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
+ return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, getOriginalText(ctx));
}
@Override
@@ -294,10 +279,8 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
int startIndex = null == operatorToken ? ctx.IS().getSymbol().getStopIndex() + 2 : operatorToken.getStartIndex();
rightText = rightText + ctx.start.getInputStream().getText(new Interval(startIndex, ctx.stop.getStopIndex()));
ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 2, ctx.stop.getStopIndex(), rightText);
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
- String operator = "IS";
- return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
+ return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, "IS", getOriginalText(ctx));
}
if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
return createCompareSegment(ctx);
@@ -307,16 +290,12 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
private ASTNode createCompareSegment(final BooleanPrimaryContext ctx) {
ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
- ExpressionSegment right;
- if (null != ctx.predicate()) {
- right = (ExpressionSegment) visit(ctx.predicate());
- } else {
- right = new SubqueryExpressionSegment(
- new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery()), getOriginalText(ctx.subquery())));
- }
+ ExpressionSegment right = null == ctx.predicate()
+ ? new SubqueryExpressionSegment(new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), (SelectStatement) visit(ctx.subquery()),
+ getOriginalText(ctx.subquery())))
+ : (ExpressionSegment) visit(ctx.predicate());
String operator = null == ctx.SAFE_EQ_() ? ctx.comparisonOperator().getText() : ctx.SAFE_EQ_().getText();
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
+ return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, getOriginalText(ctx));
}
@Override
@@ -336,17 +315,6 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
return visit(ctx.bitExpr(0));
}
- private BinaryOperationExpression createBinaryOperationExpressionFromLike(final PredicateContext ctx) {
- ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
- ListExpression right = new ListExpression(ctx.simpleExpr(0).start.getStartIndex(), ctx.simpleExpr().get(ctx.simpleExpr().size() - 1).stop.getStopIndex());
- for (SimpleExprContext each : ctx.simpleExpr()) {
- right.getItems().add((ExpressionSegment) visit(each));
- }
- String operator = null == ctx.NOT() ? "LIKE" : "NOT LIKE";
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
- }
-
private InExpression createInSegment(final PredicateContext ctx) {
ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
ExpressionSegment right;
@@ -360,23 +328,30 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
}
right = listExpression;
}
- boolean not = null != ctx.NOT();
- return new InExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, not);
+ return new InExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, null != ctx.NOT());
}
private BetweenExpression createBetweenSegment(final PredicateContext ctx) {
ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
ExpressionSegment between = (ExpressionSegment) visit(ctx.bitExpr(1));
ExpressionSegment and = (ExpressionSegment) visit(ctx.predicate());
- boolean not = null != ctx.NOT();
- return new BetweenExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, between, and, not);
+ return new BetweenExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, between, and, null != ctx.NOT());
+ }
+
+ private BinaryOperationExpression createBinaryOperationExpressionFromLike(final PredicateContext ctx) {
+ ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
+ ListExpression right = new ListExpression(ctx.simpleExpr(0).start.getStartIndex(), ctx.simpleExpr().get(ctx.simpleExpr().size() - 1).stop.getStopIndex());
+ for (SimpleExprContext each : ctx.simpleExpr()) {
+ right.getItems().add((ExpressionSegment) visit(each));
+ }
+ String operator = null == ctx.NOT() ? "LIKE" : "NOT LIKE";
+ return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, getOriginalText(ctx));
}
private BinaryOperationExpression createBinaryOperationExpressionFromPredicate(final PredicateContext ctx) {
ExpressionSegment left = (ExpressionSegment) visit(ctx.bitExpr(0));
ExpressionSegment right = null == ctx.ESCAPE() ? (ExpressionSegment) visit(ctx.bitExpr(1)) : createEscapedPattern(ctx);
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, getPredicateOperator(ctx), text);
+ return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, getPredicateOperator(ctx), getOriginalText(ctx));
}
private ListExpression createEscapedPattern(final PredicateContext ctx) {
@@ -404,8 +379,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
ExpressionSegment left = (ExpressionSegment) visit(ctx.getChild(0));
ExpressionSegment right = (ExpressionSegment) visit(ctx.getChild(2));
String operator = ctx.getChild(1).getText();
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
+ return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, getOriginalText(ctx));
}
@Override
@@ -428,13 +402,12 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
return segment;
}
if (null != ctx.literals()) {
- return SQLUtils.createLiteralExpression(visit(ctx.literals()), startIndex, stopIndex, ctx.literals().start.getInputStream().getText(new Interval(startIndex, stopIndex)));
+ return SQLUtils.createLiteralExpression(visit(ctx.literals()), startIndex, stopIndex, getOriginalText(ctx));
}
if (null != ctx.CONCAT_()) {
ExpressionSegment left = (ExpressionSegment) visit(ctx.simpleExpr(0));
ExpressionSegment right = (ExpressionSegment) visit(ctx.simpleExpr(1));
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, ctx.CONCAT_().getText(), text);
+ return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, ctx.CONCAT_().getText(), getOriginalText(ctx));
}
if (null != ctx.intervalExpression()) {
return visit(ctx.intervalExpression());
@@ -462,8 +435,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
@Override
public final ASTNode visitIntervalExpression(final IntervalExpressionContext ctx) {
IntervalUnit intervalUnit = IntervalUnit.valueOf(ctx.intervalUnit().getText().toUpperCase());
- return new IntervalExpression(ctx.INTERVAL().getSymbol().getStartIndex(), ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()), intervalUnit,
- getOriginalText(ctx));
+ return new IntervalExpression(ctx.INTERVAL().getSymbol().getStartIndex(), ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()), intervalUnit, getOriginalText(ctx));
}
@Override
@@ -482,10 +454,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
@Override
public final ASTNode visitAggregationFunction(final AggregationFunctionContext ctx) {
- String aggregationType = ctx.aggregationFunctionName().getText();
- return AggregationType.isAggregationType(aggregationType)
- ? createAggregationSegment(ctx, aggregationType)
- : new ExpressionProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ return createAggregationSegment(ctx, ctx.aggregationFunctionName().getText());
}
private ASTNode createAggregationSegment(final AggregationFunctionContext ctx, final String aggregationType) {
@@ -501,17 +470,6 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
return result;
}
- private Collection<ExpressionSegment> getExpressions(final AggregationFunctionContext ctx) {
- if (null == ctx.expr()) {
- return Collections.emptyList();
- }
- Collection<ExpressionSegment> result = new LinkedList<>();
- for (ExprContext each : ctx.expr()) {
- result.add((ExpressionSegment) visit(each));
- }
- return result;
- }
-
private String getDistinctExpression(final AggregationFunctionContext ctx) {
StringBuilder result = new StringBuilder();
for (int i = 3; i < ctx.getChildCount() - 1; i++) {
@@ -520,6 +478,14 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
return result.toString();
}
+ private Collection<ExpressionSegment> getExpressions(final AggregationFunctionContext ctx) {
+ Collection<ExpressionSegment> result = new LinkedList<>();
+ for (ExprContext each : ctx.expr()) {
+ result.add((ExpressionSegment) visit(each));
+ }
+ return result;
+ }
+
@Override
public final ASTNode visitSpecialFunction(final SpecialFunctionContext ctx) {
if (null != ctx.castFunction()) {
@@ -535,10 +501,8 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
public final ASTNode visitCastFunction(final CastFunctionContext ctx) {
FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.CAST().getText(), getOriginalText(ctx));
ASTNode exprSegment = visit(ctx.expr());
- if (exprSegment instanceof ColumnSegment) {
- result.getParameters().add((ColumnSegment) exprSegment);
- } else if (exprSegment instanceof LiteralExpressionSegment) {
- result.getParameters().add((LiteralExpressionSegment) exprSegment);
+ if (exprSegment instanceof ColumnSegment || exprSegment instanceof LiteralExpressionSegment) {
+ result.getParameters().add((ExpressionSegment) exprSegment);
}
result.getParameters().add((DataTypeSegment) visit(ctx.dataType()));
return result;
@@ -568,8 +532,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
@Override
public ASTNode visitCompleteRegularFunction(final CompleteRegularFunctionContext ctx) {
FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.regularFunctionName().getText(), getOriginalText(ctx));
- Collection<ExpressionSegment> expressionSegments = ctx.expr().stream().map(each -> (ExpressionSegment) visit(each)).collect(Collectors.toList());
- result.getParameters().addAll(expressionSegments);
+ result.getParameters().addAll(ctx.expr().stream().map(each -> (ExpressionSegment) visit(each)).collect(Collectors.toList()));
return result;
}
@@ -581,8 +544,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
@Override
public ASTNode visitContextVariables(final ContextVariablesContext ctx) {
- String text = getOriginalText(ctx);
- return new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getText(), text);
+ return new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getText(), getOriginalText(ctx));
}
@Override
@@ -610,15 +572,13 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
if (null != ctx.numberLiterals()) {
return new IndexOrderByItemSegment(ctx.numberLiterals().getStart().getStartIndex(), ctx.numberLiterals().getStop().getStopIndex(),
SQLUtils.getExactlyNumber(ctx.numberLiterals().getText(), 10).intValue(), orderDirection, nullsOrderType);
- } else {
- ASTNode expr = visitExpr(ctx.expr());
- if (expr instanceof ColumnSegment) {
- return new ColumnOrderByItemSegment((ColumnSegment) expr, orderDirection, nullsOrderType);
- } else {
- return new ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(),
- ctx.expr().getStop().getStopIndex(), getOriginalText(ctx.expr()), orderDirection, nullsOrderType, (ExpressionSegment) expr);
- }
}
+ ASTNode expr = visitExpr(ctx.expr());
+ if (expr instanceof ColumnSegment) {
+ return new ColumnOrderByItemSegment((ColumnSegment) expr, orderDirection, nullsOrderType);
+ }
+ return new ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(), ctx.expr().getStop().getStopIndex(), getOriginalText(ctx.expr()), orderDirection, nullsOrderType,
+ (ExpressionSegment) expr);
}
@Nullable
@@ -639,8 +599,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
result.setStartIndex(ctx.start.getStartIndex());
result.setStopIndex(ctx.stop.getStopIndex());
if (null != ctx.dataTypeLength()) {
- DataTypeLengthSegment dataTypeLengthSegment = (DataTypeLengthSegment) visit(ctx.dataTypeLength());
- result.setDataLength(dataTypeLengthSegment);
+ result.setDataLength((DataTypeLengthSegment) visit(ctx.dataTypeLength()));
}
return result;
}
@@ -660,9 +619,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
appendClause(result, ctx.blobSegmentSizeClause());
appendClause(result, ctx.characterSet());
if (null != ctx.blobAbbreviatedAttributes()) {
- result.append(" (")
- .append(getOriginalText(ctx.blobAbbreviatedAttributes()).trim())
- .append(')');
+ result.append(" (").append(getOriginalText(ctx.blobAbbreviatedAttributes()).trim()).append(')');
}
return result.toString();
}
@@ -679,11 +636,8 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
result.setStartIndex(ctx.start.getStartIndex());
result.setStopIndex(ctx.stop.getStartIndex());
List<TerminalNode> numbers = ctx.NUMBER_();
- if (numbers.size() == 1) {
- result.setPrecision(Integer.parseInt(numbers.get(0).getText()));
- }
- if (numbers.size() == 2) {
- result.setPrecision(Integer.parseInt(numbers.get(0).getText()));
+ result.setPrecision(Integer.parseInt(numbers.get(0).getText()));
+ if (2 == numbers.size()) {
result.setScale(Integer.parseInt(numbers.get(1).getText()));
}
return result;
@@ -704,8 +658,7 @@ public abstract class FirebirdStatementVisitor extends FirebirdStatementBaseVisi
CommonTableExpressionSegment result = new CommonTableExpressionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (AliasSegment) visit(ctx.alias()),
new SubquerySegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (SelectStatement) visit(ctx.subquery()), getOriginalText(ctx.subquery())), null);
if (null != ctx.columnNames()) {
- CollectionValue<ColumnSegment> columns = (CollectionValue<ColumnSegment>) visit(ctx.columnNames());
- result.getColumns().addAll(columns.getValue());
+ result.getColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.columnNames())).getValue());
}
return result;
}
diff --git a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDCLStatementVisitor.java b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDCLStatementVisitor.java
index 9182c552350..1f379c4011c 100644
--- a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDCLStatementVisitor.java
+++ b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDCLStatementVisitor.java
@@ -44,14 +44,12 @@ public final class FirebirdDCLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitGrant(final GrantContext ctx) {
- return new GrantStatement(getDatabaseType(),
- null == ctx.privilegeClause() ? Collections.emptyList() : Collections.singleton((SimpleTableSegment) visit(ctx.privilegeClause().onObjectClause().privilegeLevel().tableName())));
+ return new GrantStatement(getDatabaseType(), Collections.singleton((SimpleTableSegment) visit(ctx.privilegeClause().onObjectClause().privilegeLevel().tableName())));
}
@Override
public ASTNode visitRevoke(final RevokeContext ctx) {
- return new RevokeStatement(getDatabaseType(),
- null == ctx.privilegeClause() ? Collections.emptyList() : Collections.singleton((SimpleTableSegment) visit(ctx.privilegeClause().onObjectClause().privilegeLevel().tableName())));
+ return new RevokeStatement(getDatabaseType(), Collections.singleton((SimpleTableSegment) visit(ctx.privilegeClause().onObjectClause().privilegeLevel().tableName())));
}
@Override
diff --git a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java
index dbd0f6db31a..3e4af20e05e 100644
--- a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java
+++ b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java
@@ -17,8 +17,6 @@
package org.apache.shardingsphere.sql.parser.engine.firebird.visitor.statement.type;
-import org.antlr.v4.runtime.ParserRuleContext;
-import org.antlr.v4.runtime.misc.Interval;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
@@ -104,14 +102,11 @@ public final class FirebirdDDLStatementVisitor extends FirebirdStatementVisitor
public ASTNode visitCreateTable(final CreateTableContext ctx) {
Collection<ColumnDefinitionSegment> columnDefinitions = new LinkedList<>();
Collection<ConstraintDefinitionSegment> constraintDefinitions = new LinkedList<>();
- if (null != ctx.createDefinitionClause()) {
- CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
- for (CreateDefinitionSegment each : createDefinitions.getValue()) {
- if (each instanceof ColumnDefinitionSegment) {
- columnDefinitions.add((ColumnDefinitionSegment) each);
- } else if (each instanceof ConstraintDefinitionSegment) {
- constraintDefinitions.add((ConstraintDefinitionSegment) each);
- }
+ for (CreateDefinitionSegment each : ((CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause())).getValue()) {
+ if (each instanceof ColumnDefinitionSegment) {
+ columnDefinitions.add((ColumnDefinitionSegment) each);
+ } else if (each instanceof ConstraintDefinitionSegment) {
+ constraintDefinitions.add((ConstraintDefinitionSegment) each);
}
}
return CreateTableStatement.builder()
@@ -145,7 +140,7 @@ public final class FirebirdDDLStatementVisitor extends FirebirdStatementVisitor
DataTypeSegment dataType = null == ctx.dataType() ? null : (DataTypeSegment) visit(ctx.dataType());
boolean isPrimaryKey = ctx.dataTypeOption().stream().anyMatch(each -> null != each.primaryKey());
boolean isNotNull = ctx.dataTypeOption().stream().anyMatch(each -> null != each.NOT() && null != each.NULL());
- ColumnDefinitionSegment result = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, isNotNull, getText(ctx));
+ ColumnDefinitionSegment result = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, isNotNull, getOriginalText(ctx));
for (DataTypeOptionContext each : ctx.dataTypeOption()) {
if (null != each.referenceDefinition()) {
result.getReferencedTables().add((SimpleTableSegment) visit(each.referenceDefinition().tableName()));
@@ -154,10 +149,6 @@ public final class FirebirdDDLStatementVisitor extends FirebirdStatementVisitor
return result;
}
- private String getText(final ParserRuleContext ctx) {
- return ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
- }
-
@Override
public ASTNode visitCheckConstraintDefinition(final CheckConstraintDefinitionContext ctx) {
return new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
@@ -198,19 +189,17 @@ public final class FirebirdDDLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitAlterTable(final AlterTableContext ctx) {
AlterTableStatement.AlterTableStatementBuilder result = AlterTableStatement.builder().databaseType(getDatabaseType()).table((SimpleTableSegment) visit(ctx.tableName()));
- if (null != ctx.alterDefinitionClause()) {
- for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
- if (each instanceof AddColumnDefinitionSegment) {
- result.addColumnDefinition((AddColumnDefinitionSegment) each);
- } else if (each instanceof ModifyColumnDefinitionSegment) {
- result.modifyColumnDefinition((ModifyColumnDefinitionSegment) each);
- } else if (each instanceof DropColumnDefinitionSegment) {
- result.dropColumnDefinition((DropColumnDefinitionSegment) each);
- } else if (each instanceof AddConstraintDefinitionSegment) {
- result.addConstraintDefinition((AddConstraintDefinitionSegment) each);
- } else if (each instanceof DropConstraintDefinitionSegment) {
- result.dropConstraintDefinition((DropConstraintDefinitionSegment) each);
- }
+ for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
+ if (each instanceof AddColumnDefinitionSegment) {
+ result.addColumnDefinition((AddColumnDefinitionSegment) each);
+ } else if (each instanceof ModifyColumnDefinitionSegment) {
+ result.modifyColumnDefinition((ModifyColumnDefinitionSegment) each);
+ } else if (each instanceof DropColumnDefinitionSegment) {
+ result.dropColumnDefinition((DropColumnDefinitionSegment) each);
+ } else if (each instanceof AddConstraintDefinitionSegment) {
+ result.addConstraintDefinition((AddConstraintDefinitionSegment) each);
+ } else if (each instanceof DropConstraintDefinitionSegment) {
+ result.dropConstraintDefinition((DropConstraintDefinitionSegment) each);
}
}
return result.build();
@@ -253,7 +242,7 @@ public final class FirebirdDDLStatementVisitor extends FirebirdStatementVisitor
ColumnSegment column = (ColumnSegment) visit(ctx.modifyColumn().columnName());
DataTypeSegment dataType = null == ctx.dataType() ? null : (DataTypeSegment) visit(ctx.dataType());
boolean isNotNull = null != ctx.SET() && null != ctx.NOT() && null != ctx.NULL();
- ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false, isNotNull, getText(ctx));
+ ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false, isNotNull, getOriginalText(ctx));
return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
}
@@ -273,19 +262,19 @@ public final class FirebirdDDLStatementVisitor extends FirebirdStatementVisitor
return new CreateDatabaseStatement(getDatabaseType(), extractDatabaseName(ctx.STRING_().getText()), false);
}
- @Override
- public ASTNode visitDropDatabase(final DropDatabaseContext ctx) {
- return new DropDatabaseStatement(getDatabaseType(), null, false);
- }
-
private String extractDatabaseName(final String filespec) {
String result = filespec.substring(1, filespec.length() - 1);
int separatorIndex = Math.max(Math.max(result.lastIndexOf('/'), result.lastIndexOf('\\')), result.lastIndexOf(':'));
- result = separatorIndex >= 0 ? result.substring(separatorIndex + 1) : result;
+ result = result.substring(separatorIndex + 1);
int extensionIndex = result.lastIndexOf('.');
return extensionIndex > 0 ? result.substring(0, extensionIndex) : result;
}
+ @Override
+ public ASTNode visitDropDatabase(final DropDatabaseContext ctx) {
+ return new DropDatabaseStatement(getDatabaseType(), null, false);
+ }
+
@Override
public ASTNode visitCreateFunction(final CreateFunctionContext ctx) {
return new CreateFunctionStatement(getDatabaseType(), null, null, Collections.emptyList());
diff --git a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
index affb013abed..41b2255afb3 100644
--- a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
+++ b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
@@ -34,7 +34,6 @@ import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.Comb
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.DeleteContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.DuplicateSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.EscapedTableReferenceContext;
-import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.ExprContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.FirstSkipClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.FirstValueContext;
import org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.FromClauseContext;
@@ -138,20 +137,8 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
public ASTNode visitInsert(final InsertContext ctx) {
InsertStatement insertValuesStatement = (InsertStatement) visit(ctx.insertValuesClause());
InsertStatement result = InsertStatement.builder().databaseType(getDatabaseType()).table((SimpleTableSegment) visit(ctx.tableName()))
- .insertColumns(insertValuesStatement.getInsertColumns().orElse(null)).insertSelect(insertValuesStatement.getInsertSelect().orElse(null))
- .setAssignment(insertValuesStatement.getSetAssignment().orElse(null)).onDuplicateKeyColumns(insertValuesStatement.getOnDuplicateKeyColumns().orElse(null))
- .valueReference(insertValuesStatement.getValueReference().orElse(null))
- .returning(null == ctx.returningClause() ? insertValuesStatement.getReturning().orElse(null) : (ReturningSegment) visit(ctx.returningClause()))
- .output(insertValuesStatement.getOutput().orElse(null)).with(insertValuesStatement.getWith().orElse(null))
- .multiTableInsertType(insertValuesStatement.getMultiTableInsertType().orElse(null))
- .multiTableInsertInto(insertValuesStatement.getMultiTableInsertInto().orElse(null))
- .multiTableConditionalInto(insertValuesStatement.getMultiTableConditionalInto().orElse(null)).where(insertValuesStatement.getWhere().orElse(null))
- .exec(insertValuesStatement.getExec().orElse(null)).withTableHint(insertValuesStatement.getWithTableHint().orElse(null))
- .rowSetFunction(insertValuesStatement.getRowSetFunction().orElse(null)).ignore(insertValuesStatement.isIgnore()).replace(insertValuesStatement.isReplace())
- .values(new LinkedList<>(insertValuesStatement.getValues())).derivedInsertColumns(new LinkedList<>(insertValuesStatement.getDerivedInsertColumns())).build();
- result.addParameterMarkers(insertValuesStatement.getParameterMarkers());
- result.getVariableNames().addAll(insertValuesStatement.getVariableNames());
- result.getComments().addAll(insertValuesStatement.getComments());
+ .insertColumns(insertValuesStatement.getInsertColumns().orElse(null)).values(insertValuesStatement.getValues())
+ .returning(null == ctx.returningClause() ? null : (ReturningSegment) visit(ctx.returningClause())).build();
result.addParameterMarkers(getParameterMarkerSegments());
return result;
}
@@ -229,11 +216,7 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitAssignmentValue(final AssignmentValueContext ctx) {
- ExprContext expr = ctx.expr();
- if (null != expr) {
- return visit(expr);
- }
- return new CommonExpressionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getText(), Collections.emptyList());
+ return null == ctx.expr() ? new CommonExpressionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getText(), Collections.emptyList()) : visit(ctx.expr());
}
@Override
@@ -281,8 +264,7 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
for (int i = 1; i < ctx.selectClause().size(); i++) {
SelectClauseContext rightContext = ctx.selectClause(i);
SelectStatement rightSelect = (SelectStatement) visit(rightContext);
- boolean liftTrailingOrderBy = i == ctx.selectClause().size() - 1 && null != rightContext.orderByClause();
- OrderBySegment trailingOrderBy = liftTrailingOrderBy ? rightSelect.getOrderBy().orElse(null) : null;
+ OrderBySegment trailingOrderBy = i == ctx.selectClause().size() - 1 ? rightSelect.getOrderBy().orElse(null) : null;
if (null != trailingOrderBy) {
rightSelect = createSelectStatementBuilder(rightSelect).orderBy(null).build();
}
@@ -296,12 +278,6 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
return result;
}
- private CombineType getCombineType(final CombineClauseContext ctx, final SelectClauseContext rightContext) {
- ParseTree previous = ctx.getChild(ctx.children.indexOf(rightContext) - 1);
- boolean isUnionAll = previous instanceof TerminalNode && FirebirdStatementParser.ALL == ((TerminalNode) previous).getSymbol().getType();
- return isUnionAll ? CombineType.UNION_ALL : CombineType.UNION;
- }
-
private SubquerySegment createCombineRightSubquery(final SelectClauseContext rightContext, final SelectStatement rightSelect, final boolean excludeTrailingOrderBy) {
int stopIndex = excludeTrailingOrderBy ? getStopIndexBefore(rightContext, rightContext.orderByClause()) : rightContext.stop.getStopIndex();
return new SubquerySegment(rightContext.start.getStartIndex(), stopIndex, rightSelect,
@@ -313,6 +289,12 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
return previous instanceof TerminalNode ? ((TerminalNode) previous).getSymbol().getStopIndex() : ((ParserRuleContext) previous).stop.getStopIndex();
}
+ private CombineType getCombineType(final CombineClauseContext ctx, final SelectClauseContext rightContext) {
+ ParseTree previous = ctx.getChild(ctx.children.indexOf(rightContext) - 1);
+ boolean isUnionAll = previous instanceof TerminalNode && FirebirdStatementParser.ALL == ((TerminalNode) previous).getSymbol().getType();
+ return isUnionAll ? CombineType.UNION_ALL : CombineType.UNION;
+ }
+
@Override
public ASTNode visitSelectClause(final SelectClauseContext ctx) {
ProjectionsSegment projections = (ProjectionsSegment) visit(ctx.projections());
@@ -324,8 +306,7 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
projections.setDistinctRow(isDistinct(ctx.selectSpecification().get(0)));
}
if (null != ctx.fromClause()) {
- TableSegment tableSegment = (TableSegment) visit(ctx.fromClause());
- selectStatementBuilder.from(tableSegment);
+ selectStatementBuilder.from((TableSegment) visit(ctx.fromClause()));
}
if (null != ctx.whereClause()) {
selectStatementBuilder.where((WhereSegment) visit(ctx.whereClause()));
@@ -345,18 +326,14 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
return selectStatementBuilder.build();
}
+ private boolean isDistinct(final SelectSpecificationContext ctx) {
+ return ((BooleanLiteralValue) visit(ctx.duplicateSpecification())).getValue();
+ }
+
@Override
public ASTNode visitFirstSkipClause(final FirstSkipClauseContext ctx) {
- PaginationValueSegment rowCount = null;
- PaginationValueSegment offset = null;
- if (null != ctx.FIRST()) {
- rowCount = (PaginationValueSegment) visit(ctx.firstValue());
- if (null != ctx.SKIP_()) {
- offset = (PaginationValueSegment) visit(ctx.skipValue());
- }
- } else if (null != ctx.SKIP_()) {
- offset = (PaginationValueSegment) visit(ctx.skipValue());
- }
+ PaginationValueSegment rowCount = null == ctx.firstValue() ? null : (PaginationValueSegment) visit(ctx.firstValue());
+ PaginationValueSegment offset = null == ctx.skipValue() ? null : (PaginationValueSegment) visit(ctx.skipValue());
return new LimitSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), offset, rowCount);
}
@@ -420,12 +397,7 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitHavingClause(final HavingClauseContext ctx) {
- ExpressionSegment expr = (ExpressionSegment) visit(ctx.expr());
- return new HavingSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), expr);
- }
-
- private boolean isDistinct(final SelectSpecificationContext ctx) {
- return ((BooleanLiteralValue) visit(ctx.duplicateSpecification())).getValue();
+ return new HavingSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()));
}
@Override
@@ -435,15 +407,13 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitProjections(final ProjectionsContext ctx) {
- Collection<ProjectionSegment> projections = new LinkedList<>();
+ ProjectionsSegment result = new ProjectionsSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
if (null != ctx.unqualifiedShorthand()) {
- projections.add(new ShorthandProjectionSegment(ctx.unqualifiedShorthand().getStart().getStartIndex(), ctx.unqualifiedShorthand().getStop().getStopIndex()));
+ result.getProjections().add(new ShorthandProjectionSegment(ctx.unqualifiedShorthand().getStart().getStartIndex(), ctx.unqualifiedShorthand().getStop().getStopIndex()));
}
for (ProjectionContext each : ctx.projection()) {
- projections.add((ProjectionSegment) visit(each));
+ result.getProjections().add((ProjectionSegment) visit(each));
}
- ProjectionsSegment result = new ProjectionsSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
- result.getProjections().addAll(projections);
return result;
}
@@ -467,31 +437,14 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
return createProjection(ctx, alias);
}
- @Override
- public ASTNode visitAlias(final AliasContext ctx) {
- return null == ctx.identifier()
- ? new AliasSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), new IdentifierValue(ctx.STRING_().getText()))
- : new AliasSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
- }
-
private ASTNode createProjection(final ProjectionContext ctx, final AliasSegment alias) {
ASTNode projection = visit(ctx.expr());
if (projection instanceof AggregationProjectionSegment) {
((AggregationProjectionSegment) projection).setAlias(alias);
return projection;
}
- if (projection instanceof ExpressionProjectionSegment) {
- ((ExpressionProjectionSegment) projection).setAlias(alias);
- return projection;
- }
- if (projection instanceof FunctionSegment) {
- FunctionSegment segment = (FunctionSegment) projection;
- ExpressionProjectionSegment result = new ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getText(), segment);
- result.setAlias(alias);
- return result;
- }
- if (projection instanceof CommonExpressionSegment) {
- CommonExpressionSegment segment = (CommonExpressionSegment) projection;
+ if (projection instanceof FunctionSegment || projection instanceof CommonExpressionSegment) {
+ ExpressionSegment segment = (ExpressionSegment) projection;
ExpressionProjectionSegment result = new ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getText(), segment);
result.setAlias(alias);
return result;
@@ -505,7 +458,7 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
if (projection instanceof SubqueryExpressionSegment) {
SubqueryExpressionSegment subqueryExpressionSegment = (SubqueryExpressionSegment) projection;
String text = ctx.start.getInputStream().getText(new Interval(subqueryExpressionSegment.getStartIndex(), subqueryExpressionSegment.getStopIndex()));
- SubqueryProjectionSegment result = new SubqueryProjectionSegment(((SubqueryExpressionSegment) projection).getSubquery(), text);
+ SubqueryProjectionSegment result = new SubqueryProjectionSegment(subqueryExpressionSegment.getSubquery(), text);
result.setAlias(alias);
return result;
}
@@ -518,8 +471,7 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
return result;
}
if (projection instanceof ParameterMarkerExpressionSegment) {
- ParameterMarkerExpressionSegment result = (ParameterMarkerExpressionSegment) projection;
- result.setAlias(alias);
+ ((ParameterMarkerExpressionSegment) projection).setAlias(alias);
return projection;
}
ExpressionSegment column = (ExpressionSegment) projection;
@@ -529,6 +481,11 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
return result;
}
+ @Override
+ public ASTNode visitAlias(final AliasContext ctx) {
+ return new AliasSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), new IdentifierValue(ctx.getText()));
+ }
+
@Override
public ASTNode visitFromClause(final FromClauseContext ctx) {
return visit(ctx.tableReferences());
@@ -537,10 +494,8 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitTableReferences(final TableReferencesContext ctx) {
TableSegment result = (TableSegment) visit(ctx.escapedTableReference(0));
- if (ctx.escapedTableReference().size() > 1) {
- for (int i = 1; i < ctx.escapedTableReference().size(); i++) {
- result = generateJoinTableSourceFromEscapedTableReference(ctx.escapedTableReference(i), result);
- }
+ for (int i = 1; i < ctx.escapedTableReference().size(); i++) {
+ result = generateJoinTableSourceFromEscapedTableReference(ctx.escapedTableReference(i), result);
}
return result;
}
@@ -562,18 +517,45 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitTableReference(final TableReferenceContext ctx) {
- TableSegment result;
- TableSegment left;
- left = (TableSegment) visit(ctx.tableFactor());
- if (!ctx.joinedTable().isEmpty()) {
- for (JoinedTableContext each : ctx.joinedTable()) {
- left = visitJoinedTable(each, left);
- }
+ TableSegment result = (TableSegment) visit(ctx.tableFactor());
+ for (JoinedTableContext each : ctx.joinedTable()) {
+ result = visitJoinedTable(each, result);
+ }
+ return result;
+ }
+
+ private JoinTableSegment visitJoinedTable(final JoinedTableContext ctx, final TableSegment tableSegment) {
+ JoinTableSegment result = new JoinTableSegment();
+ result.setLeft(tableSegment);
+ result.setStartIndex(tableSegment.getStartIndex());
+ result.setStopIndex(ctx.stop.getStopIndex());
+ result.setRight((TableSegment) visit(ctx.tableFactor()));
+ result.setJoinType(getJoinType(ctx));
+ if (null != ctx.joinSpecification()) {
+ visitJoinSpecification(ctx.joinSpecification(), result);
}
- result = left;
return result;
}
+ private String getJoinType(final JoinedTableContext ctx) {
+ if (null != ctx.LEFT()) {
+ return JoinType.LEFT.name();
+ }
+ if (null != ctx.RIGHT()) {
+ return JoinType.RIGHT.name();
+ }
+ return null == ctx.CROSS() ? JoinType.INNER.name() : JoinType.CROSS.name();
+ }
+
+ private void visitJoinSpecification(final JoinSpecificationContext ctx, final JoinTableSegment joinTableSource) {
+ if (null != ctx.expr()) {
+ joinTableSource.setCondition((ExpressionSegment) visit(ctx.expr()));
+ }
+ if (null != ctx.USING()) {
+ joinTableSource.setUsing(ctx.columnNames().columnName().stream().map(each -> (ColumnSegment) visit(each)).collect(Collectors.toList()));
+ }
+ }
+
@Override
public ASTNode visitTableFactor(final TableFactorContext ctx) {
if (null != ctx.subquery()) {
@@ -603,47 +585,9 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
return visit(ctx.tableReferences());
}
- private JoinTableSegment visitJoinedTable(final JoinedTableContext ctx, final TableSegment tableSegment) {
- JoinTableSegment result = new JoinTableSegment();
- result.setLeft(tableSegment);
- result.setStartIndex(tableSegment.getStartIndex());
- result.setStopIndex(ctx.stop.getStopIndex());
- TableSegment right = (TableSegment) visit(ctx.tableFactor());
- result.setRight(right);
- result.setJoinType(getJoinType(ctx));
- if (null != ctx.joinSpecification()) {
- visitJoinSpecification(ctx.joinSpecification(), result);
- }
- return result;
- }
-
- private String getJoinType(final JoinedTableContext ctx) {
- if (null != ctx.LEFT()) {
- return JoinType.LEFT.name();
- } else if (null != ctx.RIGHT()) {
- return JoinType.RIGHT.name();
- } else if (null != ctx.INNER()) {
- return JoinType.INNER.name();
- } else if (null != ctx.CROSS()) {
- return JoinType.CROSS.name();
- }
- return JoinType.INNER.name();
- }
-
- private void visitJoinSpecification(final JoinSpecificationContext ctx, final JoinTableSegment joinTableSource) {
- if (null != ctx.expr()) {
- ExpressionSegment condition = (ExpressionSegment) visit(ctx.expr());
- joinTableSource.setCondition(condition);
- }
- if (null != ctx.USING()) {
- joinTableSource.setUsing(ctx.columnNames().columnName().stream().map(each -> (ColumnSegment) visit(each)).collect(Collectors.toList()));
- }
- }
-
@Override
public ASTNode visitWhereClause(final WhereClauseContext ctx) {
- ExpressionSegment segment = (ExpressionSegment) visit(ctx.expr());
- return new WhereSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), segment);
+ return new WhereSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()));
}
@Override
@@ -667,13 +611,8 @@ public final class FirebirdDMLStatementVisitor extends FirebirdStatementVisitor
@Override
public ASTNode visitMerge(final MergeContext ctx) {
- return MergeStatement.builder()
- .databaseType(getDatabaseType())
- .target((TableSegment) visit(ctx.intoClause()))
- .source((TableSegment) visit(ctx.usingClause()))
- // add mergeWhenNotMatched and mergeWhenMatched part
- // add RETURNING part
- .build();
+ // TODO add mergeWhenNotMatched, mergeWhenMatched and RETURNING part
+ return MergeStatement.builder().databaseType(getDatabaseType()).target((TableSegment) visit(ctx.intoClause())).source((TableSegment) visit(ctx.usingClause())).build();
}
private SelectStatement.SelectStatementBuilder createSelectStatementBuilder(final SelectStatement selectStatement) {