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) {

Reply via email to