This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 9d8b0efc9e1 Support explain plan statement. (#27228)
9d8b0efc9e1 is described below

commit 9d8b0efc9e15961a7296d9111d07dd65d906d156
Author: boyjoy1127 <[email protected]>
AuthorDate: Fri Jul 21 11:42:19 2023 +0800

    Support explain plan statement. (#27228)
    
    * feat: support explain plan statement.
    
    * feat: support explain plan statement.
    
    * feat: support explain plan statement.
    
    * refactor: support explain plan statement.
    
    * feat: add explain plan.
---
 .../src/main/antlr4/imports/oracle/DALStatement.g4 |   5 +
 .../sql/parser/autogen/OracleStatement.g4          |   1 +
 .../visitor/statement/OracleStatementVisitor.java  |   2 +-
 .../statement/type/OracleDALStatementVisitor.java  |  21 ++
 .../statement/type/OracleDMLStatementVisitor.java  | 285 +++++++++++----------
 .../oracle/dal/OracleExplainStatement.java}        |  13 +-
 .../parser/src/main/resources/case/dal/explain.xml |  29 +++
 .../main/resources/sql/supported/dal/explain.xml   |   1 +
 8 files changed, 209 insertions(+), 148 deletions(-)

diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4
index 682d7ea1673..69aad1131fa 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4
@@ -18,7 +18,12 @@
 grammar DALStatement;
 
 import BaseRule;
+import DMLStatement;
 
 alterResourceCost
     : ALTER RESOURCE COST ((CPU_PER_SESSION | CONNECT_TIME | 
LOGICAL_READS_PER_SESSION | PRIVATE_SGA) INTEGER_)+
     ;
+
+explain
+    : EXPLAIN PLAN (SET STATEMENT_ID EQ_ stringLiterals)? (INTO (schemaName 
DOT_)? tableName (AT_ dbLink)? )? FOR (insert | delete | update | select)
+    ;
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
 
b/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
index b7875691671..de99ac4766b 100644
--- 
a/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
+++ 
b/parser/sql/dialect/oracle/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/OracleStatement.g4
@@ -124,6 +124,7 @@ execute
     | alterHierarchy
     | alterLockdownProfile
     | alterPluggableDatabase
+    | explain
     | createProcedure
     | dropProcedure
     | alterProcedure
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index d935cb56055..9ee6e6c8925 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -150,7 +150,7 @@ import java.util.stream.Collectors;
 /**
  * Statement visitor for Oracle.
  */
-@Getter(AccessLevel.PROTECTED)
+@Getter
 public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<ASTNode> {
     
     private final Collection<ParameterMarkerSegment> parameterMarkerSegments = 
new LinkedList<>();
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
index 65db99976f4..1b01372814d 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
@@ -20,8 +20,11 @@ package 
org.apache.shardingsphere.sql.parser.oracle.visitor.statement.type;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DALStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterResourceCostContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExplainContext;
 import 
org.apache.shardingsphere.sql.parser.oracle.visitor.statement.OracleStatementVisitor;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dal.OracleAlterResourceCostStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dal.OracleExplainStatement;
 
 /**
  * DAL statement visitor for Oracle.
@@ -32,4 +35,22 @@ public final class OracleDALStatementVisitor extends 
OracleStatementVisitor impl
     public ASTNode visitAlterResourceCost(final AlterResourceCostContext ctx) {
         return new OracleAlterResourceCostStatement();
     }
+    
+    @Override
+    public ASTNode visitExplain(final ExplainContext ctx) {
+        OracleExplainStatement result = new OracleExplainStatement();
+        OracleDMLStatementVisitor visitor = new OracleDMLStatementVisitor();
+        
visitor.getParameterMarkerSegments().addAll(getParameterMarkerSegments());
+        if (null != ctx.insert()) {
+            result.setStatement((SQLStatement) visitor.visit(ctx.insert()));
+        } else if (null != ctx.delete()) {
+            result.setStatement((SQLStatement) visitor.visit(ctx.delete()));
+        } else if (null != ctx.update()) {
+            result.setStatement((SQLStatement) visitor.visit(ctx.update()));
+        } else if (null != ctx.select()) {
+            result.setStatement((SQLStatement) visitor.visit(ctx.select()));
+        }
+        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        return result;
+    }
 }
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
index 74fe5c939fc..1829cfafbca 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
@@ -173,140 +173,6 @@ import java.util.stream.Collectors;
  */
 public final class OracleDMLStatementVisitor extends OracleStatementVisitor 
implements DMLStatementVisitor {
     
-    @Override
-    public ASTNode visitInsert(final InsertContext ctx) {
-        // TODO :FIXME, since there is no segment for insertValuesClause, 
InsertStatement is created by sub rule.
-        return null == ctx.insertSingleTable() ? visit(ctx.insertMultiTable()) 
: visit(ctx.insertSingleTable());
-    }
-    
-    @Override
-    public ASTNode visitInsertSingleTable(final InsertSingleTableContext ctx) {
-        OracleInsertStatement result = (OracleInsertStatement) 
visit(ctx.insertIntoClause());
-        if (null != ctx.insertValuesClause()) {
-            
result.getValues().addAll(createInsertValuesSegments(ctx.insertValuesClause().assignmentValues()));
-        }
-        if (null != ctx.selectSubquery()) {
-            OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.selectSubquery());
-            SubquerySegment subquerySegment = new 
SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), subquery);
-            result.setSelectSubquery(subquerySegment);
-        }
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
-        return result;
-    }
-    
-    private Collection<InsertValuesSegment> createInsertValuesSegments(final 
AssignmentValuesContext ctx) {
-        Collection<InsertValuesSegment> result = new LinkedList<>();
-        result.add((InsertValuesSegment) visit(ctx));
-        return result;
-    }
-    
-    @Override
-    public ASTNode visitInsertMultiTable(final InsertMultiTableContext ctx) {
-        OracleInsertStatement result = new OracleInsertStatement();
-        result.setInsertMultiTableElementSegment(null == 
ctx.conditionalInsertClause()
-                ? createInsertMultiTableElementSegment(ctx.multiTableElement())
-                : (InsertMultiTableElementSegment) 
visit(ctx.conditionalInsertClause()));
-        OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.selectSubquery());
-        SubquerySegment subquerySegment = new 
SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), subquery);
-        result.setSelectSubquery(subquerySegment);
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
-        return result;
-    }
-    
-    private InsertMultiTableElementSegment 
createInsertMultiTableElementSegment(final List<MultiTableElementContext> ctx) {
-        Collection<OracleInsertStatement> insertStatements = new 
LinkedList<>();
-        for (MultiTableElementContext each : ctx) {
-            insertStatements.add((OracleInsertStatement) visit(each));
-        }
-        InsertMultiTableElementSegment result = new 
InsertMultiTableElementSegment(ctx.get(0).getStart().getStartIndex(), 
ctx.get(ctx.size() - 1).getStop().getStopIndex());
-        result.getInsertStatements().addAll(insertStatements);
-        return result;
-    }
-    
-    @Override
-    public ASTNode visitInsertValuesClause(final InsertValuesClauseContext 
ctx) {
-        OracleInsertStatement result = new OracleInsertStatement();
-        
result.getValues().addAll(createInsertValuesSegments(ctx.assignmentValues()));
-        return result;
-    }
-    
-    @SuppressWarnings("unchecked")
-    @Override
-    public ASTNode visitInsertIntoClause(final InsertIntoClauseContext ctx) {
-        OracleInsertStatement result = new OracleInsertStatement();
-        if (null != ctx.dmlTableExprClause().dmlTableClause()) {
-            result.setTable((SimpleTableSegment) 
visit(ctx.dmlTableExprClause().dmlTableClause()));
-        } else if (null != ctx.dmlTableExprClause().dmlSubqueryClause()) {
-            result.setInsertSelect((SubquerySegment) 
visit(ctx.dmlTableExprClause().dmlSubqueryClause()));
-        } else {
-            result.setInsertSelect((SubquerySegment) 
visit(ctx.dmlTableExprClause().tableCollectionExpr()));
-        }
-        if (null != ctx.columnNames()) {
-            ColumnNamesContext columnNames = ctx.columnNames();
-            CollectionValue<ColumnSegment> columnSegments = 
(CollectionValue<ColumnSegment>) visit(columnNames);
-            result.setInsertColumns(new 
InsertColumnsSegment(columnNames.start.getStartIndex(), 
columnNames.stop.getStopIndex(), columnSegments.getValue()));
-        } else {
-            result.setInsertColumns(new 
InsertColumnsSegment(ctx.stop.getStopIndex() + 1, ctx.stop.getStopIndex() + 1, 
Collections.emptyList()));
-        }
-        return result;
-    }
-    
-    @Override
-    public ASTNode visitDmlTableClause(final DmlTableClauseContext ctx) {
-        return visit(ctx.tableName());
-    }
-    
-    @Override
-    public ASTNode visitDmlSubqueryClause(final DmlSubqueryClauseContext ctx) {
-        OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.selectSubquery());
-        return new SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), subquery);
-    }
-    
-    @Override
-    public ASTNode visitTableCollectionExpr(final TableCollectionExprContext 
ctx) {
-        OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.collectionExpr().selectSubquery());
-        return new 
SubquerySegment(ctx.collectionExpr().selectSubquery().start.getStartIndex(), 
ctx.collectionExpr().selectSubquery().stop.getStopIndex(), subquery);
-    }
-    
-    @Override
-    public ASTNode visitConditionalInsertClause(final 
ConditionalInsertClauseContext ctx) {
-        Collection<OracleInsertStatement> insertStatements = new 
LinkedList<>();
-        for (ConditionalInsertWhenPartContext each : 
ctx.conditionalInsertWhenPart()) {
-            
insertStatements.addAll(createInsertStatementsFromConditionalInsertWhen(each));
-        }
-        if (null != ctx.conditionalInsertElsePart()) {
-            
insertStatements.addAll(createInsertStatementsFromConditionalInsertElse(ctx.conditionalInsertElsePart()));
-        }
-        InsertMultiTableElementSegment result = new 
InsertMultiTableElementSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex());
-        result.getInsertStatements().addAll(insertStatements);
-        return result;
-    }
-    
-    private Collection<OracleInsertStatement> 
createInsertStatementsFromConditionalInsertWhen(final 
ConditionalInsertWhenPartContext ctx) {
-        Collection<OracleInsertStatement> result = new LinkedList<>();
-        for (MultiTableElementContext each : ctx.multiTableElement()) {
-            result.add((OracleInsertStatement) visit(each));
-        }
-        return result;
-    }
-    
-    private Collection<OracleInsertStatement> 
createInsertStatementsFromConditionalInsertElse(final 
ConditionalInsertElsePartContext ctx) {
-        Collection<OracleInsertStatement> result = new LinkedList<>();
-        for (MultiTableElementContext each : ctx.multiTableElement()) {
-            result.add((OracleInsertStatement) visit(each));
-        }
-        return result;
-    }
-    
-    @Override
-    public ASTNode visitMultiTableElement(final MultiTableElementContext ctx) {
-        OracleInsertStatement result = (OracleInsertStatement) 
visit(ctx.insertIntoClause());
-        if (null != ctx.insertValuesClause()) {
-            
result.getValues().addAll(createInsertValuesSegments(ctx.insertValuesClause().assignmentValues()));
-        }
-        return result;
-    }
-    
     @Override
     public ASTNode visitUpdate(final UpdateContext ctx) {
         OracleUpdateStatement result = new OracleUpdateStatement();
@@ -407,18 +273,81 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
     }
     
     @Override
-    public ASTNode visitAssignmentValues(final AssignmentValuesContext ctx) {
-        List<ExpressionSegment> segments = new LinkedList<>();
-        for (AssignmentValueContext each : ctx.assignmentValue()) {
-            segments.add((ExpressionSegment) visit(each));
+    public ASTNode visitInsert(final InsertContext ctx) {
+        // TODO :FIXME, since there is no segment for insertValuesClause, 
InsertStatement is created by sub rule.
+        return null == ctx.insertSingleTable() ? visit(ctx.insertMultiTable()) 
: visit(ctx.insertSingleTable());
+    }
+    
+    @Override
+    public ASTNode visitInsertSingleTable(final InsertSingleTableContext ctx) {
+        OracleInsertStatement result = (OracleInsertStatement) 
visit(ctx.insertIntoClause());
+        if (null != ctx.insertValuesClause()) {
+            
result.getValues().addAll(createInsertValuesSegments(ctx.insertValuesClause().assignmentValues()));
         }
-        return new InsertValuesSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), segments);
+        if (null != ctx.selectSubquery()) {
+            OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.selectSubquery());
+            SubquerySegment subquerySegment = new 
SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), subquery);
+            result.setSelectSubquery(subquerySegment);
+        }
+        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        return result;
+    }
+    
+    private Collection<InsertValuesSegment> createInsertValuesSegments(final 
AssignmentValuesContext ctx) {
+        Collection<InsertValuesSegment> result = new LinkedList<>();
+        result.add((InsertValuesSegment) visit(ctx));
+        return result;
     }
     
     @Override
-    public ASTNode visitAssignmentValue(final AssignmentValueContext ctx) {
-        ExprContext expr = ctx.expr();
-        return null == expr ? new 
CommonExpressionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.getText()) : visit(expr);
+    public ASTNode visitInsertMultiTable(final InsertMultiTableContext ctx) {
+        OracleInsertStatement result = new OracleInsertStatement();
+        result.setInsertMultiTableElementSegment(null == 
ctx.conditionalInsertClause()
+                ? createInsertMultiTableElementSegment(ctx.multiTableElement())
+                : (InsertMultiTableElementSegment) 
visit(ctx.conditionalInsertClause()));
+        OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.selectSubquery());
+        SubquerySegment subquerySegment = new 
SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), subquery);
+        result.setSelectSubquery(subquerySegment);
+        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        return result;
+    }
+    
+    private InsertMultiTableElementSegment 
createInsertMultiTableElementSegment(final List<MultiTableElementContext> ctx) {
+        Collection<OracleInsertStatement> insertStatements = new 
LinkedList<>();
+        for (MultiTableElementContext each : ctx) {
+            insertStatements.add((OracleInsertStatement) visit(each));
+        }
+        InsertMultiTableElementSegment result = new 
InsertMultiTableElementSegment(ctx.get(0).getStart().getStartIndex(), 
ctx.get(ctx.size() - 1).getStop().getStopIndex());
+        result.getInsertStatements().addAll(insertStatements);
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitInsertValuesClause(final InsertValuesClauseContext 
ctx) {
+        OracleInsertStatement result = new OracleInsertStatement();
+        
result.getValues().addAll(createInsertValuesSegments(ctx.assignmentValues()));
+        return result;
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Override
+    public ASTNode visitInsertIntoClause(final InsertIntoClauseContext ctx) {
+        OracleInsertStatement result = new OracleInsertStatement();
+        if (null != ctx.dmlTableExprClause().dmlTableClause()) {
+            result.setTable((SimpleTableSegment) 
visit(ctx.dmlTableExprClause().dmlTableClause()));
+        } else if (null != ctx.dmlTableExprClause().dmlSubqueryClause()) {
+            result.setInsertSelect((SubquerySegment) 
visit(ctx.dmlTableExprClause().dmlSubqueryClause()));
+        } else {
+            result.setInsertSelect((SubquerySegment) 
visit(ctx.dmlTableExprClause().tableCollectionExpr()));
+        }
+        if (null != ctx.columnNames()) {
+            ColumnNamesContext columnNames = ctx.columnNames();
+            CollectionValue<ColumnSegment> columnSegments = 
(CollectionValue<ColumnSegment>) visit(columnNames);
+            result.setInsertColumns(new 
InsertColumnsSegment(columnNames.start.getStartIndex(), 
columnNames.stop.getStopIndex(), columnSegments.getValue()));
+        } else {
+            result.setInsertColumns(new 
InsertColumnsSegment(ctx.stop.getStopIndex() + 1, ctx.stop.getStopIndex() + 1, 
Collections.emptyList()));
+        }
+        return result;
     }
     
     @Override
@@ -448,6 +377,15 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
         return new SubqueryTableSegment(subquerySegment);
     }
     
+    @Override
+    public ASTNode visitMultiTableElement(final MultiTableElementContext ctx) {
+        OracleInsertStatement result = (OracleInsertStatement) 
visit(ctx.insertIntoClause());
+        if (null != ctx.insertValuesClause()) {
+            
result.getValues().addAll(createInsertValuesSegments(ctx.insertValuesClause().assignmentValues()));
+        }
+        return result;
+    }
+    
     @Override
     public ASTNode visitSelect(final SelectContext ctx) {
         OracleSelectStatement result = (OracleSelectStatement) 
visit(ctx.selectSubquery());
@@ -458,6 +396,68 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
         return result;
     }
     
+    @Override
+    public ASTNode visitDmlTableClause(final DmlTableClauseContext ctx) {
+        return visit(ctx.tableName());
+    }
+    
+    @Override
+    public ASTNode visitDmlSubqueryClause(final DmlSubqueryClauseContext ctx) {
+        OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.selectSubquery());
+        return new SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), subquery);
+    }
+    
+    @Override
+    public ASTNode visitTableCollectionExpr(final TableCollectionExprContext 
ctx) {
+        OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.collectionExpr().selectSubquery());
+        return new 
SubquerySegment(ctx.collectionExpr().selectSubquery().start.getStartIndex(), 
ctx.collectionExpr().selectSubquery().stop.getStopIndex(), subquery);
+    }
+    
+    @Override
+    public ASTNode visitConditionalInsertClause(final 
ConditionalInsertClauseContext ctx) {
+        Collection<OracleInsertStatement> insertStatements = new 
LinkedList<>();
+        for (ConditionalInsertWhenPartContext each : 
ctx.conditionalInsertWhenPart()) {
+            
insertStatements.addAll(createInsertStatementsFromConditionalInsertWhen(each));
+        }
+        if (null != ctx.conditionalInsertElsePart()) {
+            
insertStatements.addAll(createInsertStatementsFromConditionalInsertElse(ctx.conditionalInsertElsePart()));
+        }
+        InsertMultiTableElementSegment result = new 
InsertMultiTableElementSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex());
+        result.getInsertStatements().addAll(insertStatements);
+        return result;
+    }
+    
+    private Collection<OracleInsertStatement> 
createInsertStatementsFromConditionalInsertWhen(final 
ConditionalInsertWhenPartContext ctx) {
+        Collection<OracleInsertStatement> result = new LinkedList<>();
+        for (MultiTableElementContext each : ctx.multiTableElement()) {
+            result.add((OracleInsertStatement) visit(each));
+        }
+        return result;
+    }
+    
+    private Collection<OracleInsertStatement> 
createInsertStatementsFromConditionalInsertElse(final 
ConditionalInsertElsePartContext ctx) {
+        Collection<OracleInsertStatement> result = new LinkedList<>();
+        for (MultiTableElementContext each : ctx.multiTableElement()) {
+            result.add((OracleInsertStatement) visit(each));
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitAssignmentValues(final AssignmentValuesContext ctx) {
+        List<ExpressionSegment> segments = new LinkedList<>();
+        for (AssignmentValueContext each : ctx.assignmentValue()) {
+            segments.add((ExpressionSegment) visit(each));
+        }
+        return new InsertValuesSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), segments);
+    }
+    
+    @Override
+    public ASTNode visitAssignmentValue(final AssignmentValueContext ctx) {
+        ExprContext expr = ctx.expr();
+        return null == expr ? new 
CommonExpressionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.getText()) : visit(expr);
+    }
+    
     @Override
     public ASTNode visitSelectSubquery(final SelectSubqueryContext ctx) {
         OracleSelectStatement result;
@@ -1155,4 +1155,5 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
     public ASTNode visitLockTable(final LockTableContext ctx) {
         return new OracleLockTableStatement();
     }
+    
 }
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dal/OracleExplainStatement.java
similarity index 67%
copy from 
parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4
copy to 
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dal/OracleExplainStatement.java
index 682d7ea1673..7e3a35e8505 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/DALStatement.g4
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dal/OracleExplainStatement.java
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
-grammar DALStatement;
+package org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dal;
 
-import BaseRule;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.ExplainStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
 
-alterResourceCost
-    : ALTER RESOURCE COST ((CPU_PER_SESSION | CONNECT_TIME | 
LOGICAL_READS_PER_SESSION | PRIVATE_SGA) INTEGER_)+
-    ;
+/**
+ * Oracle explain statement.
+ */
+public final class OracleExplainStatement extends ExplainStatement implements 
OracleStatement {
+}
diff --git a/test/it/parser/src/main/resources/case/dal/explain.xml 
b/test/it/parser/src/main/resources/case/dal/explain.xml
index 7a552bdbec2..260003f9c61 100644
--- a/test/it/parser/src/main/resources/case/dal/explain.xml
+++ b/test/it/parser/src/main/resources/case/dal/explain.xml
@@ -362,4 +362,33 @@
             </projections>
         </select>
     </describe>
+    
+    <describe sql-case-id="explain_select_alias_as_keyword">
+        <select>
+            <from>
+                <simple-table name="t_order_item" alias="length" 
start-index="53" stop-index="71" />
+            </from>
+            <projections start-index="24" stop-index="46">
+                <column-projection name="item_id" alias="password" 
start-index="24" stop-index="46">
+                    <owner name="length" start-index="24" stop-index="29" />
+                </column-projection>>
+            </projections>
+            <where start-index="73" stop-index="96">
+                <expr>
+                    <binary-operation-expression start-index="79" 
stop-index="96">
+                        <left>
+                            <column name="item_id" start-index="79" 
stop-index="92">
+                                <owner name="length" start-index="79" 
stop-index="84" />
+                            </column>
+                        </left>
+                        <operator>=</operator>
+                        <right>
+                            <literal-expression value="1" start-index="96" 
stop-index="96" />
+                        </right>
+                    </binary-operation-expression>
+                </expr>
+            </where>
+        </select>
+    </describe>
+    
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dal/explain.xml 
b/test/it/parser/src/main/resources/sql/supported/dal/explain.xml
index 0bbd1f76a15..045ffb55635 100644
--- a/test/it/parser/src/main/resources/sql/supported/dal/explain.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dal/explain.xml
@@ -43,4 +43,5 @@
     <sql-case id="explain_create_materialized_view_with_data" value="EXPLAIN 
(ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) CREATE MATERIALIZED VIEW 
matview_schema.mv_withdata2 (a) AS SELECT generate_series(1, 10) WITH DATA;" 
db-types="PostgreSQL" />
     <sql-case id="explain_create_materialized_view_with_no_data" 
value="EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) CREATE 
MATERIALIZED VIEW matview_schema.mv_nodata2 (a) AS SELECT generate_series(1, 
10) WITH NO DATA;" db-types="PostgreSQL" />
     <sql-case id="explain_performance" value="EXPLAIN PERFORMANCE SELECT 1" 
db-types="openGauss" />
+    <sql-case id="explain_select_alias_as_keyword" value="EXPLAIN PLAN FOR 
SELECT length.item_id password FROM t_order_item length where length.item_id = 
1;" db-types="Oracle" />
 </sql-cases>

Reply via email to