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 <[email protected]>
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) {