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>