You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by lu...@apache.org on 2021/11/12 01:57:48 UTC
[shardingsphere] branch master updated: Add SQLServer EXPLAIN
statement (#13546)
This is an automated email from the ASF dual-hosted git repository.
lujingshang 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 78251ee Add SQLServer EXPLAIN statement (#13546)
78251ee is described below
commit 78251eeb8aef9a40b55be6e7e73674ba6572b887
Author: Thanoshan MV <48...@users.noreply.github.com>
AuthorDate: Fri Nov 12 07:27:08 2021 +0530
Add SQLServer EXPLAIN statement (#13546)
* Add SQLServer EXPLAIN statement
* simplifyed–explainableStatement and modified the SQL for test
---
.../imports/sqlserver/DALStatement.g4} | 23 +-
.../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 8 +
.../sql/parser/autogen/SQLServerStatement.g4 | 3 +-
.../impl/SQLServerDALStatementSQLVisitor.java | 25 ++
.../impl/SQLServerDMLStatementSQLVisitor.java | 475 ---------------------
.../impl/SQLServerStatementSQLVisitor.java | 448 ++++++++++++++++++-
.../sqlserver/dal/SQLServerExplainStatement.java} | 18 +-
.../src/main/resources/case/dal/explain.xml | 35 ++
.../main/resources/sql/supported/dal/explain.xml | 9 +-
9 files changed, 534 insertions(+), 510 deletions(-)
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DALStatement.g4
similarity index 56%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DALStatement.g4
index a6796fa..9046037 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DALStatement.g4
@@ -15,21 +15,14 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.impl;
+grammar DALStatement;
-import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
-import org.apache.shardingsphere.sql.parser.api.visitor.type.DALSQLVisitor;
+import SQLServerKeyword, DMLStatement;
-import java.util.Properties;
+explain
+ : EXPLAIN WITH_RECOMMENDATIONS? explainableStatement
+ ;
-/**
- * DAL Statement SQL visitor for SQLServer.
- */
-@NoArgsConstructor
-public final class SQLServerDALStatementSQLVisitor extends SQLServerStatementSQLVisitor implements DALSQLVisitor, SQLStatementVisitor {
-
- public SQLServerDALStatementSQLVisitor(final Properties props) {
- super(props);
- }
-}
+explainableStatement
+ : select | insert | update | delete
+ ;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4 b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
index 5b86ae1..59ebbb4 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
@@ -1742,3 +1742,11 @@ AUTHORIZATION
TRANSFER
: T R A N S F E R
;
+
+EXPLAIN
+ : E X P L A I N
+ ;
+
+WITH_RECOMMENDATIONS
+ : W I T H UL_ R E C O M M E N D A T I O N S
+ ;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4 b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4
index 70ceebe..fda898f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/SQLServerStatement.g4
@@ -17,7 +17,7 @@
grammar SQLServerStatement;
-import Symbol, Comments, DMLStatement, DDLStatement, TCLStatement, DCLStatement, StoreProcedure;
+import Symbol, Comments, DMLStatement, DDLStatement, TCLStatement, DCLStatement, StoreProcedure, DALStatement;
execute
: (select
@@ -74,5 +74,6 @@ execute
| dropLogin
| alterLogin
| call
+ | explain
) SEMI_?
;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java
index a6796fa..569924f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java
@@ -18,8 +18,13 @@
package org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.impl;
import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
import org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
import org.apache.shardingsphere.sql.parser.api.visitor.type.DALSQLVisitor;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ExplainContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ExplainableStatementContext;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dal.SQLServerExplainStatement;
import java.util.Properties;
@@ -32,4 +37,24 @@ public final class SQLServerDALStatementSQLVisitor extends SQLServerStatementSQL
public SQLServerDALStatementSQLVisitor(final Properties props) {
super(props);
}
+
+ @Override
+ public ASTNode visitExplain(final ExplainContext ctx) {
+ SQLServerExplainStatement result = new SQLServerExplainStatement();
+ result.setStatement((SQLStatement) visit(ctx.explainableStatement()));
+ return result;
+ }
+
+ @Override
+ public ASTNode visitExplainableStatement(final ExplainableStatementContext ctx) {
+ if (null != ctx.select()) {
+ return visit(ctx.select());
+ } else if (null != ctx.insert()) {
+ return visit(ctx.insert());
+ } else if (null != ctx.update()) {
+ return visit(ctx.update());
+ } else {
+ return visit(ctx.delete());
+ }
+ }
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java
index d925a5f..6eba377 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDMLStatementSQLVisitor.java
@@ -18,92 +18,9 @@
package org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.impl;
import lombok.NoArgsConstructor;
-import org.antlr.v4.runtime.misc.Interval;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
import org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
import org.apache.shardingsphere.sql.parser.api.visitor.type.DMLSQLVisitor;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AliasContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentValueContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentValuesContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNameContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNamesContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CteClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DeleteContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DuplicateSpecificationContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ExprContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.FromClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertDefaultValueContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertSelectClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertValuesClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.JoinSpecificationContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.JoinedTableContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.MultipleTableNamesContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.MultipleTablesClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputTableNameContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputWithColumnContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputWithColumnsContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ProjectionContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.QualifiedShorthandContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SetAssignmentsClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SingleTableClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SubqueryContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableFactorContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableNameContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableReferenceContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TopContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.UpdateContext;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WithClauseContext;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.ColumnAssignmentSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.InsertValuesSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.InsertColumnsSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonTableExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.RowNumberValueSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
-import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
-import org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.BooleanLiteralValue;
-import org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.NumberLiteralValue;
-import org.apache.shardingsphere.sql.parser.sql.common.value.parametermarker.ParameterMarkerValue;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerDeleteStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerInsertStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerSelectStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerUpdateStatement;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
import java.util.Properties;
/**
@@ -115,396 +32,4 @@ public final class SQLServerDMLStatementSQLVisitor extends SQLServerStatementSQL
public SQLServerDMLStatementSQLVisitor(final Properties props) {
super(props);
}
-
- @Override
- public ASTNode visitInsert(final InsertContext ctx) {
- SQLServerInsertStatement result;
- if (null != ctx.insertDefaultValue()) {
- result = (SQLServerInsertStatement) visit(ctx.insertDefaultValue());
- } else if (null != ctx.insertValuesClause()) {
- result = (SQLServerInsertStatement) visit(ctx.insertValuesClause());
- } else {
- result = (SQLServerInsertStatement) visit(ctx.insertSelectClause());
- }
- if (null != ctx.withClause()) {
- result.setWithSegment((WithSegment) visit(ctx.withClause()));
- }
- result.setTable((SimpleTableSegment) visit(ctx.tableName()));
- result.setParameterCount(getCurrentParameterIndex());
- return result;
- }
-
- @Override
- public ASTNode visitInsertDefaultValue(final InsertDefaultValueContext ctx) {
- SQLServerInsertStatement result = new SQLServerInsertStatement();
- result.setInsertColumns(createInsertColumns(ctx.columnNames(), ctx.start.getStartIndex()));
- if (null != ctx.outputClause()) {
- result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
- }
- return result;
- }
-
- @Override
- public ASTNode visitOutputClause(final OutputClauseContext ctx) {
- OutputSegment result = new OutputSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
- if (null != ctx.outputWithColumns()) {
- OutputWithColumnsContext outputWithColumnsContext = ctx.outputWithColumns();
- List<OutputWithColumnContext> outputWithColumnContexts = outputWithColumnsContext.outputWithColumn();
- Collection<ColumnProjectionSegment> outputColumns = new LinkedList<>();
- for (OutputWithColumnContext each : outputWithColumnContexts) {
- ColumnSegment column = new ColumnSegment(each.start.getStartIndex(), each.stop.getStopIndex(), new IdentifierValue(each.name().getText()));
- ColumnProjectionSegment outputColumn = new ColumnProjectionSegment(column);
- if (null != each.alias()) {
- outputColumn.setAlias(new AliasSegment(each.alias().start.getStartIndex(), each.alias().stop.getStopIndex(), new IdentifierValue(each.name().getText())));
- }
- outputColumns.add(outputColumn);
- }
- result.getOutputColumns().addAll(outputColumns);
- }
- if (null != ctx.outputTableName()) {
- OutputTableNameContext outputTableNameContext = ctx.outputTableName();
- TableNameSegment tableName = new TableNameSegment(outputTableNameContext.start.getStartIndex(),
- outputTableNameContext.stop.getStopIndex(), new IdentifierValue(outputTableNameContext.getText()));
- result.setTableName(tableName);
- if (null != ctx.columnNames()) {
- ColumnNamesContext columnNames = ctx.columnNames();
- CollectionValue<ColumnSegment> columns = (CollectionValue<ColumnSegment>) visit(columnNames);
- result.getTableColumns().addAll(columns.getValue());
- }
- }
- return result;
- }
-
- @Override
- public ASTNode visitInsertValuesClause(final InsertValuesClauseContext ctx) {
- SQLServerInsertStatement result = new SQLServerInsertStatement();
- result.setInsertColumns(createInsertColumns(ctx.columnNames(), ctx.start.getStartIndex()));
- result.getValues().addAll(createInsertValuesSegments(ctx.assignmentValues()));
- if (null != ctx.outputClause()) {
- result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
- }
- return result;
- }
-
- private Collection<InsertValuesSegment> createInsertValuesSegments(final Collection<AssignmentValuesContext> assignmentValuesContexts) {
- Collection<InsertValuesSegment> result = new LinkedList<>();
- for (AssignmentValuesContext each : assignmentValuesContexts) {
- result.add((InsertValuesSegment) visit(each));
- }
- return result;
- }
-
- @Override
- public ASTNode visitInsertSelectClause(final InsertSelectClauseContext ctx) {
- SQLServerInsertStatement result = new SQLServerInsertStatement();
- result.setInsertColumns(createInsertColumns(ctx.columnNames(), ctx.start.getStartIndex()));
- result.setInsertSelect(createInsertSelectSegment(ctx));
- if (null != ctx.outputClause()) {
- result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
- }
- return result;
- }
-
- @SuppressWarnings("unchecked")
- private InsertColumnsSegment createInsertColumns(final ColumnNamesContext columnNames, final int startIndex) {
- if (null != columnNames) {
- CollectionValue<ColumnSegment> columnSegments = (CollectionValue<ColumnSegment>) visit(columnNames);
- return new InsertColumnsSegment(columnNames.start.getStartIndex(), columnNames.stop.getStopIndex(), columnSegments.getValue());
- } else {
- return new InsertColumnsSegment(startIndex - 1, startIndex - 1, Collections.emptyList());
- }
- }
-
- private SubquerySegment createInsertSelectSegment(final InsertSelectClauseContext ctx) {
- SQLServerSelectStatement selectStatement = (SQLServerSelectStatement) visit(ctx.select());
- return new SubquerySegment(ctx.select().start.getStartIndex(), ctx.select().stop.getStopIndex(), selectStatement);
- }
-
- @Override
- public ASTNode visitWithClause(final WithClauseContext ctx) {
- List<CteClauseContext> cteClauses = ctx.cteClause();
- Collection<CommonTableExpressionSegment> commonTableExpressions = new LinkedList<>();
- for (CteClauseContext cte : cteClauses) {
- SubquerySegment subquery = new SubquerySegment(cte.subquery().start.getStartIndex(), cte.subquery().stop.getStopIndex(), (SQLServerSelectStatement) visit(cte.subquery()));
- IdentifierValue identifier = (IdentifierValue) visit(cte.identifier());
- CommonTableExpressionSegment commonTableExpression = new CommonTableExpressionSegment(cte.start.getStartIndex(), cte.stop.getStopIndex(), identifier, subquery);
- if (null != cte.columnNames()) {
- ColumnNamesContext columnNames = cte.columnNames();
- CollectionValue<ColumnSegment> columns = (CollectionValue<ColumnSegment>) visit(columnNames);
- commonTableExpression.getColumns().addAll(columns.getValue());
- }
- commonTableExpressions.add(commonTableExpression);
- }
- return new WithSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), commonTableExpressions);
- }
-
- @Override
- public ASTNode visitUpdate(final UpdateContext ctx) {
- SQLServerUpdateStatement result = new SQLServerUpdateStatement();
- if (null != ctx.withClause()) {
- result.setWithSegment((WithSegment) visit(ctx.withClause()));
- }
- result.setTableSegment((TableSegment) visit(ctx.tableReferences()));
- result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
- if (null != ctx.whereClause()) {
- result.setWhere((WhereSegment) visit(ctx.whereClause()));
- }
- result.setParameterCount(getCurrentParameterIndex());
- return result;
- }
-
- @Override
- public ASTNode visitSetAssignmentsClause(final SetAssignmentsClauseContext ctx) {
- Collection<AssignmentSegment> assignments = new LinkedList<>();
- for (AssignmentContext each : ctx.assignment()) {
- assignments.add((AssignmentSegment) visit(each));
- }
- return new SetAssignmentSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), assignments);
- }
-
- @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 visitAssignment(final AssignmentContext ctx) {
- ColumnSegment column = (ColumnSegment) visitColumnName(ctx.columnName());
- List<ColumnSegment> columnSegments = new LinkedList<>();
- columnSegments.add(column);
- ExpressionSegment value = (ExpressionSegment) visit(ctx.assignmentValue());
- AssignmentSegment result = new ColumnAssignmentSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnSegments, value);
- result.getColumns().add(column);
- return result;
- }
-
- @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());
- }
-
- @Override
- public ASTNode visitDelete(final DeleteContext ctx) {
- SQLServerDeleteStatement result = new SQLServerDeleteStatement();
- if (null != ctx.withClause()) {
- result.setWithSegment((WithSegment) visit(ctx.withClause()));
- }
- if (null != ctx.multipleTablesClause()) {
- result.setTableSegment((TableSegment) visit(ctx.multipleTablesClause()));
- } else {
- result.setTableSegment((TableSegment) visit(ctx.singleTableClause()));
- }
- if (null != ctx.outputClause()) {
- result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
- }
- if (null != ctx.whereClause()) {
- result.setWhere((WhereSegment) visit(ctx.whereClause()));
- }
- result.setParameterCount(getCurrentParameterIndex());
- return result;
- }
-
- @Override
- public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
- SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
- if (null != ctx.alias()) {
- result.setAlias((AliasSegment) visit(ctx.alias()));
- }
- return result;
- }
-
- @Override
- public ASTNode visitMultipleTablesClause(final MultipleTablesClauseContext ctx) {
- DeleteMultiTableSegment result = new DeleteMultiTableSegment();
- TableSegment relateTableSource = (TableSegment) visit(ctx.tableReferences());
- result.setRelationTable(relateTableSource);
- result.setActualDeleteTables(generateTablesFromTableMultipleTableNames(ctx.multipleTableNames()));
- return result;
- }
-
- private List<SimpleTableSegment> generateTablesFromTableMultipleTableNames(final MultipleTableNamesContext ctx) {
- List<SimpleTableSegment> result = new LinkedList<>();
- for (TableNameContext each : ctx.tableName()) {
- result.add((SimpleTableSegment) visit(each));
- }
- return result;
- }
-
- @Override
- public ASTNode visitDuplicateSpecification(final DuplicateSpecificationContext ctx) {
- return new BooleanLiteralValue(null != ctx.DISTINCT());
- }
-
- @Override
- public ASTNode visitProjection(final ProjectionContext ctx) {
- // FIXME :The stop index of project is the stop index of projection, instead of alias.
- if (null != ctx.qualifiedShorthand()) {
- QualifiedShorthandContext shorthand = ctx.qualifiedShorthand();
- ShorthandProjectionSegment result = new ShorthandProjectionSegment(shorthand.getStart().getStartIndex(), shorthand.getStop().getStopIndex());
- IdentifierValue identifier = new IdentifierValue(shorthand.identifier().getText());
- result.setOwner(new OwnerSegment(shorthand.identifier().getStart().getStartIndex(), shorthand.identifier().getStop().getStopIndex(), identifier));
- return result;
- }
- AliasSegment alias = null == ctx.alias() ? null : (AliasSegment) visit(ctx.alias());
- if (null != ctx.top()) {
- RowNumberValueSegment rowNumber = (RowNumberValueSegment) visit(ctx.top());
- return new TopProjectionSegment(ctx.top().getStart().getStartIndex(), ctx.top().getStop().getStopIndex(), rowNumber,
- alias == null ? null : alias.getIdentifier().getValue());
- }
- if (null != ctx.columnName()) {
- ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
- ColumnProjectionSegment result = new ColumnProjectionSegment(column);
- result.setAlias(alias);
- return result;
- }
- return createProjection(ctx, alias);
- }
-
- @Override
- public ASTNode visitTop(final TopContext ctx) {
- int startIndex = ctx.topNum().getStart().getStartIndex();
- int stopIndex = ctx.topNum().getStop().getStopIndex();
- ASTNode topNum = visit(ctx.topNum());
- if (topNum instanceof NumberLiteralValue) {
- return new NumberLiteralRowNumberValueSegment(startIndex, stopIndex, ((NumberLiteralValue) topNum).getValue().longValue(), false);
- }
- return new ParameterMarkerRowNumberValueSegment(startIndex, stopIndex, ((ParameterMarkerValue) topNum).getValue(), false);
- }
-
- @Override
- public ASTNode visitAlias(final AliasContext ctx) {
- if (null != ctx.identifier()) {
- return new AliasSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
- }
- return new AliasSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), new IdentifierValue(ctx.STRING_().getText()));
- }
-
- 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 CommonExpressionSegment) {
- CommonExpressionSegment segment = (CommonExpressionSegment) projection;
- ExpressionProjectionSegment result = new ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getText());
- result.setAlias(alias);
- return result;
- }
- // FIXME :For DISTINCT()
- if (projection instanceof ColumnSegment) {
- ColumnProjectionSegment result = new ColumnProjectionSegment((ColumnSegment) projection);
- result.setAlias(alias);
- return result;
- }
- 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);
- result.setAlias(alias);
- return result;
- }
- if (projection instanceof BinaryOperationExpression) {
- int startIndex = ((BinaryOperationExpression) projection).getStartIndex();
- int stopIndex = null != alias ? alias.getStopIndex() : ((BinaryOperationExpression) projection).getStopIndex();
- ExpressionProjectionSegment result = new ExpressionProjectionSegment(startIndex, stopIndex, ((BinaryOperationExpression) projection).getText());
- result.setAlias(alias);
- return result;
- }
- if (projection instanceof ParameterMarkerExpressionSegment) {
- ParameterMarkerExpressionSegment result = (ParameterMarkerExpressionSegment) projection;
- result.setAlias(alias);
- return projection;
- }
- LiteralExpressionSegment column = (LiteralExpressionSegment) projection;
- ExpressionProjectionSegment result = null == alias ? new ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(), String.valueOf(column.getLiterals()))
- : new ExpressionProjectionSegment(column.getStartIndex(), ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()));
- result.setAlias(alias);
- return result;
- }
-
- @Override
- public ASTNode visitFromClause(final FromClauseContext ctx) {
- return visit(ctx.tableReferences());
- }
-
- @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);
- }
- }
- result = left;
- return result;
- }
-
- @Override
- public ASTNode visitTableFactor(final TableFactorContext ctx) {
- if (null != ctx.subquery()) {
- SQLServerSelectStatement subquery = (SQLServerSelectStatement) visit(ctx.subquery());
- SubquerySegment subquerySegment = new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), subquery);
- SubqueryTableSegment result = new SubqueryTableSegment(subquerySegment);
- if (null != ctx.alias()) {
- result.setAlias((AliasSegment) visit(ctx.alias()));
- }
- return result;
- }
- if (null != ctx.tableName()) {
- SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
- if (null != ctx.alias()) {
- result.setAlias((AliasSegment) visit(ctx.alias()));
- }
- return result;
- }
- 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);
- if (null != ctx.joinSpecification()) {
- result = visitJoinSpecification(ctx.joinSpecification(), result);
- }
- return result;
- }
-
- private JoinTableSegment visitJoinSpecification(final JoinSpecificationContext ctx, final JoinTableSegment joinTableSource) {
- if (null != ctx.expr()) {
- ExpressionSegment condition = (ExpressionSegment) visit(ctx.expr());
- joinTableSource.setCondition(condition);
- }
- if (null != ctx.USING()) {
- List<ColumnSegment> columnSegmentList = new LinkedList<>();
- for (ColumnNameContext cname : ctx.columnNames().columnName()) {
- columnSegmentList.add((ColumnSegment) visit(cname));
- }
- joinTableSource.setUsing(columnSegmentList);
- }
- return joinTableSource;
- }
-
- @Override
- public ASTNode visitSubquery(final SubqueryContext ctx) {
- return visit(ctx.aggregationClause());
- }
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
index 27409bf..9049a0d 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
@@ -27,6 +27,10 @@ import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementBaseVisitor;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AggregationFunctionContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AliasContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentValueContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AssignmentValuesContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.BitExprContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.BitValueLiteralsContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.BooleanLiteralsContext;
@@ -38,35 +42,68 @@ import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Col
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNamesContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNamesWithSortContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ConstraintNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CteClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DataTypeContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DataTypeLengthContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DataTypeNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DeleteContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DuplicateSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ExprContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.FromClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.FunctionCallContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GroupByClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.HexadecimalLiteralsContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.IdentifierContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.IndexNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertDefaultValueContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertSelectClauseContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.InsertValuesClauseContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.JoinSpecificationContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.JoinedTableContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.LiteralsContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.MultipleTableNamesContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.MultipleTablesClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.NullValueLiteralsContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.NumberLiteralsContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OrderByItemContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputClauseContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputTableNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputWithColumnContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OutputWithColumnsContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OwnerContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ParameterMarkerContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.PredicateContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ProjectionContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.QualifiedShorthandContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.RegularFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SchemaNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SetAssignmentsClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SimpleExprContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SingleTableClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SpecialFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.StringLiteralsContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SubqueryContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableFactorContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableNameContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableNamesContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableReferenceContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TopContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.UnreservedWordContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.UpdateContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ViewNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WhereClauseContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.WithClauseContext;
import org.apache.shardingsphere.sql.parser.sql.common.constant.AggregationType;
import org.apache.shardingsphere.sql.parser.sql.common.constant.OrderDirection;
import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.ColumnAssignmentSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.InsertValuesSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.InsertColumnsSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
@@ -74,16 +111,19 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpres
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonTableExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubqueryExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationDistinctProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.GroupBySegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.OrderBySegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.ColumnOrderByItemSegment;
@@ -94,13 +134,22 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.Pa
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.NumberLiteralLimitValueSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.ParameterMarkerLimitValueSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.NumberLiteralRowNumberValueSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.ParameterMarkerRowNumberValueSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.rownum.RowNumberValueSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.top.TopProjectionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.HavingSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeLengthSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
@@ -112,7 +161,10 @@ import org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.Number
import org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.OtherLiteralValue;
import org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.StringLiteralValue;
import org.apache.shardingsphere.sql.parser.sql.common.value.parametermarker.ParameterMarkerValue;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerDeleteStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerInsertStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerSelectStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerUpdateStatement;
import java.util.Collection;
import java.util.Collections;
@@ -693,12 +745,12 @@ public abstract class SQLServerStatementSQLVisitor extends SQLServerStatementBas
}
@Override
- public ASTNode visitWhereClause(final SQLServerStatementParser.WhereClauseContext ctx) {
+ public ASTNode visitWhereClause(final WhereClauseContext ctx) {
return new WhereSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()));
}
@Override
- public ASTNode visitGroupByClause(final SQLServerStatementParser.GroupByClauseContext ctx) {
+ public ASTNode visitGroupByClause(final GroupByClauseContext ctx) {
Collection<OrderByItemSegment> items = new LinkedList<>();
for (OrderByItemContext each : ctx.orderByItem()) {
items.add((OrderByItemSegment) visit(each));
@@ -715,4 +767,396 @@ public abstract class SQLServerStatementSQLVisitor extends SQLServerStatementBas
protected String getOriginalText(final ParserRuleContext ctx) {
return ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
}
+
+ @Override
+ public ASTNode visitInsert(final InsertContext ctx) {
+ SQLServerInsertStatement result;
+ if (null != ctx.insertDefaultValue()) {
+ result = (SQLServerInsertStatement) visit(ctx.insertDefaultValue());
+ } else if (null != ctx.insertValuesClause()) {
+ result = (SQLServerInsertStatement) visit(ctx.insertValuesClause());
+ } else {
+ result = (SQLServerInsertStatement) visit(ctx.insertSelectClause());
+ }
+ if (null != ctx.withClause()) {
+ result.setWithSegment((WithSegment) visit(ctx.withClause()));
+ }
+ result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+ result.setParameterCount(getCurrentParameterIndex());
+ return result;
+ }
+
+ @Override
+ public ASTNode visitInsertDefaultValue(final InsertDefaultValueContext ctx) {
+ SQLServerInsertStatement result = new SQLServerInsertStatement();
+ result.setInsertColumns(createInsertColumns(ctx.columnNames(), ctx.start.getStartIndex()));
+ if (null != ctx.outputClause()) {
+ result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
+ }
+ return result;
+ }
+
+ @Override
+ public ASTNode visitOutputClause(final OutputClauseContext ctx) {
+ OutputSegment result = new OutputSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
+ if (null != ctx.outputWithColumns()) {
+ OutputWithColumnsContext outputWithColumnsContext = ctx.outputWithColumns();
+ List<OutputWithColumnContext> outputWithColumnContexts = outputWithColumnsContext.outputWithColumn();
+ Collection<ColumnProjectionSegment> outputColumns = new LinkedList<>();
+ for (OutputWithColumnContext each : outputWithColumnContexts) {
+ ColumnSegment column = new ColumnSegment(each.start.getStartIndex(), each.stop.getStopIndex(), new IdentifierValue(each.name().getText()));
+ ColumnProjectionSegment outputColumn = new ColumnProjectionSegment(column);
+ if (null != each.alias()) {
+ outputColumn.setAlias(new AliasSegment(each.alias().start.getStartIndex(), each.alias().stop.getStopIndex(), new IdentifierValue(each.name().getText())));
+ }
+ outputColumns.add(outputColumn);
+ }
+ result.getOutputColumns().addAll(outputColumns);
+ }
+ if (null != ctx.outputTableName()) {
+ OutputTableNameContext outputTableNameContext = ctx.outputTableName();
+ TableNameSegment tableName = new TableNameSegment(outputTableNameContext.start.getStartIndex(),
+ outputTableNameContext.stop.getStopIndex(), new IdentifierValue(outputTableNameContext.getText()));
+ result.setTableName(tableName);
+ if (null != ctx.columnNames()) {
+ ColumnNamesContext columnNames = ctx.columnNames();
+ CollectionValue<ColumnSegment> columns = (CollectionValue<ColumnSegment>) visit(columnNames);
+ result.getTableColumns().addAll(columns.getValue());
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public ASTNode visitInsertValuesClause(final InsertValuesClauseContext ctx) {
+ SQLServerInsertStatement result = new SQLServerInsertStatement();
+ result.setInsertColumns(createInsertColumns(ctx.columnNames(), ctx.start.getStartIndex()));
+ result.getValues().addAll(createInsertValuesSegments(ctx.assignmentValues()));
+ if (null != ctx.outputClause()) {
+ result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
+ }
+ return result;
+ }
+
+ private Collection<InsertValuesSegment> createInsertValuesSegments(final Collection<AssignmentValuesContext> assignmentValuesContexts) {
+ Collection<InsertValuesSegment> result = new LinkedList<>();
+ for (AssignmentValuesContext each : assignmentValuesContexts) {
+ result.add((InsertValuesSegment) visit(each));
+ }
+ return result;
+ }
+
+ @Override
+ public ASTNode visitInsertSelectClause(final InsertSelectClauseContext ctx) {
+ SQLServerInsertStatement result = new SQLServerInsertStatement();
+ result.setInsertColumns(createInsertColumns(ctx.columnNames(), ctx.start.getStartIndex()));
+ result.setInsertSelect(createInsertSelectSegment(ctx));
+ if (null != ctx.outputClause()) {
+ result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
+ }
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ private InsertColumnsSegment createInsertColumns(final ColumnNamesContext columnNames, final int startIndex) {
+ if (null != columnNames) {
+ CollectionValue<ColumnSegment> columnSegments = (CollectionValue<ColumnSegment>) visit(columnNames);
+ return new InsertColumnsSegment(columnNames.start.getStartIndex(), columnNames.stop.getStopIndex(), columnSegments.getValue());
+ } else {
+ return new InsertColumnsSegment(startIndex - 1, startIndex - 1, Collections.emptyList());
+ }
+ }
+
+ private SubquerySegment createInsertSelectSegment(final InsertSelectClauseContext ctx) {
+ SQLServerSelectStatement selectStatement = (SQLServerSelectStatement) visit(ctx.select());
+ return new SubquerySegment(ctx.select().start.getStartIndex(), ctx.select().stop.getStopIndex(), selectStatement);
+ }
+
+ @Override
+ public ASTNode visitWithClause(final WithClauseContext ctx) {
+ List<CteClauseContext> cteClauses = ctx.cteClause();
+ Collection<CommonTableExpressionSegment> commonTableExpressions = new LinkedList<>();
+ for (CteClauseContext cte : cteClauses) {
+ SubquerySegment subquery = new SubquerySegment(cte.subquery().start.getStartIndex(), cte.subquery().stop.getStopIndex(), (SQLServerSelectStatement) visit(cte.subquery()));
+ IdentifierValue identifier = (IdentifierValue) visit(cte.identifier());
+ CommonTableExpressionSegment commonTableExpression = new CommonTableExpressionSegment(cte.start.getStartIndex(), cte.stop.getStopIndex(), identifier, subquery);
+ if (null != cte.columnNames()) {
+ ColumnNamesContext columnNames = cte.columnNames();
+ CollectionValue<ColumnSegment> columns = (CollectionValue<ColumnSegment>) visit(columnNames);
+ commonTableExpression.getColumns().addAll(columns.getValue());
+ }
+ commonTableExpressions.add(commonTableExpression);
+ }
+ return new WithSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), commonTableExpressions);
+ }
+
+ @Override
+ public ASTNode visitUpdate(final UpdateContext ctx) {
+ SQLServerUpdateStatement result = new SQLServerUpdateStatement();
+ if (null != ctx.withClause()) {
+ result.setWithSegment((WithSegment) visit(ctx.withClause()));
+ }
+ result.setTableSegment((TableSegment) visit(ctx.tableReferences()));
+ result.setSetAssignment((SetAssignmentSegment) visit(ctx.setAssignmentsClause()));
+ if (null != ctx.whereClause()) {
+ result.setWhere((WhereSegment) visit(ctx.whereClause()));
+ }
+ result.setParameterCount(getCurrentParameterIndex());
+ return result;
+ }
+
+ @Override
+ public ASTNode visitSetAssignmentsClause(final SetAssignmentsClauseContext ctx) {
+ Collection<AssignmentSegment> assignments = new LinkedList<>();
+ for (AssignmentContext each : ctx.assignment()) {
+ assignments.add((AssignmentSegment) visit(each));
+ }
+ return new SetAssignmentSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), assignments);
+ }
+
+ @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 visitAssignment(final AssignmentContext ctx) {
+ ColumnSegment column = (ColumnSegment) visitColumnName(ctx.columnName());
+ List<ColumnSegment> columnSegments = new LinkedList<>();
+ columnSegments.add(column);
+ ExpressionSegment value = (ExpressionSegment) visit(ctx.assignmentValue());
+ AssignmentSegment result = new ColumnAssignmentSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnSegments, value);
+ result.getColumns().add(column);
+ return result;
+ }
+
+ @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());
+ }
+
+ @Override
+ public ASTNode visitDelete(final DeleteContext ctx) {
+ SQLServerDeleteStatement result = new SQLServerDeleteStatement();
+ if (null != ctx.withClause()) {
+ result.setWithSegment((WithSegment) visit(ctx.withClause()));
+ }
+ if (null != ctx.multipleTablesClause()) {
+ result.setTableSegment((TableSegment) visit(ctx.multipleTablesClause()));
+ } else {
+ result.setTableSegment((TableSegment) visit(ctx.singleTableClause()));
+ }
+ if (null != ctx.outputClause()) {
+ result.setOutputSegment((OutputSegment) visit(ctx.outputClause()));
+ }
+ if (null != ctx.whereClause()) {
+ result.setWhere((WhereSegment) visit(ctx.whereClause()));
+ }
+ result.setParameterCount(getCurrentParameterIndex());
+ return result;
+ }
+
+ @Override
+ public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
+ SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
+ if (null != ctx.alias()) {
+ result.setAlias((AliasSegment) visit(ctx.alias()));
+ }
+ return result;
+ }
+
+ @Override
+ public ASTNode visitMultipleTablesClause(final MultipleTablesClauseContext ctx) {
+ DeleteMultiTableSegment result = new DeleteMultiTableSegment();
+ TableSegment relateTableSource = (TableSegment) visit(ctx.tableReferences());
+ result.setRelationTable(relateTableSource);
+ result.setActualDeleteTables(generateTablesFromTableMultipleTableNames(ctx.multipleTableNames()));
+ return result;
+ }
+
+ private List<SimpleTableSegment> generateTablesFromTableMultipleTableNames(final MultipleTableNamesContext ctx) {
+ List<SimpleTableSegment> result = new LinkedList<>();
+ for (TableNameContext each : ctx.tableName()) {
+ result.add((SimpleTableSegment) visit(each));
+ }
+ return result;
+ }
+
+ @Override
+ public ASTNode visitDuplicateSpecification(final DuplicateSpecificationContext ctx) {
+ return new BooleanLiteralValue(null != ctx.DISTINCT());
+ }
+
+ @Override
+ public ASTNode visitProjection(final ProjectionContext ctx) {
+ // FIXME :The stop index of project is the stop index of projection, instead of alias.
+ if (null != ctx.qualifiedShorthand()) {
+ QualifiedShorthandContext shorthand = ctx.qualifiedShorthand();
+ ShorthandProjectionSegment result = new ShorthandProjectionSegment(shorthand.getStart().getStartIndex(), shorthand.getStop().getStopIndex());
+ IdentifierValue identifier = new IdentifierValue(shorthand.identifier().getText());
+ result.setOwner(new OwnerSegment(shorthand.identifier().getStart().getStartIndex(), shorthand.identifier().getStop().getStopIndex(), identifier));
+ return result;
+ }
+ AliasSegment alias = null == ctx.alias() ? null : (AliasSegment) visit(ctx.alias());
+ if (null != ctx.top()) {
+ RowNumberValueSegment rowNumber = (RowNumberValueSegment) visit(ctx.top());
+ return new TopProjectionSegment(ctx.top().getStart().getStartIndex(), ctx.top().getStop().getStopIndex(), rowNumber,
+ alias == null ? null : alias.getIdentifier().getValue());
+ }
+ if (null != ctx.columnName()) {
+ ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
+ ColumnProjectionSegment result = new ColumnProjectionSegment(column);
+ result.setAlias(alias);
+ return result;
+ }
+ return createProjection(ctx, alias);
+ }
+
+ @Override
+ public ASTNode visitTop(final TopContext ctx) {
+ int startIndex = ctx.topNum().getStart().getStartIndex();
+ int stopIndex = ctx.topNum().getStop().getStopIndex();
+ ASTNode topNum = visit(ctx.topNum());
+ if (topNum instanceof NumberLiteralValue) {
+ return new NumberLiteralRowNumberValueSegment(startIndex, stopIndex, ((NumberLiteralValue) topNum).getValue().longValue(), false);
+ }
+ return new ParameterMarkerRowNumberValueSegment(startIndex, stopIndex, ((ParameterMarkerValue) topNum).getValue(), false);
+ }
+
+ @Override
+ public ASTNode visitAlias(final AliasContext ctx) {
+ if (null != ctx.identifier()) {
+ return new AliasSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
+ }
+ return new AliasSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), new IdentifierValue(ctx.STRING_().getText()));
+ }
+
+ 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 CommonExpressionSegment) {
+ CommonExpressionSegment segment = (CommonExpressionSegment) projection;
+ ExpressionProjectionSegment result = new ExpressionProjectionSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getText());
+ result.setAlias(alias);
+ return result;
+ }
+ // FIXME :For DISTINCT()
+ if (projection instanceof ColumnSegment) {
+ ColumnProjectionSegment result = new ColumnProjectionSegment((ColumnSegment) projection);
+ result.setAlias(alias);
+ return result;
+ }
+ 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);
+ result.setAlias(alias);
+ return result;
+ }
+ if (projection instanceof BinaryOperationExpression) {
+ int startIndex = ((BinaryOperationExpression) projection).getStartIndex();
+ int stopIndex = null != alias ? alias.getStopIndex() : ((BinaryOperationExpression) projection).getStopIndex();
+ ExpressionProjectionSegment result = new ExpressionProjectionSegment(startIndex, stopIndex, ((BinaryOperationExpression) projection).getText());
+ result.setAlias(alias);
+ return result;
+ }
+ if (projection instanceof ParameterMarkerExpressionSegment) {
+ ParameterMarkerExpressionSegment result = (ParameterMarkerExpressionSegment) projection;
+ result.setAlias(alias);
+ return projection;
+ }
+ LiteralExpressionSegment column = (LiteralExpressionSegment) projection;
+ ExpressionProjectionSegment result = null == alias ? new ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(), String.valueOf(column.getLiterals()))
+ : new ExpressionProjectionSegment(column.getStartIndex(), ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()));
+ result.setAlias(alias);
+ return result;
+ }
+
+ @Override
+ public ASTNode visitFromClause(final FromClauseContext ctx) {
+ return visit(ctx.tableReferences());
+ }
+
+ @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);
+ }
+ }
+ result = left;
+ return result;
+ }
+
+ @Override
+ public ASTNode visitTableFactor(final TableFactorContext ctx) {
+ if (null != ctx.subquery()) {
+ SQLServerSelectStatement subquery = (SQLServerSelectStatement) visit(ctx.subquery());
+ SubquerySegment subquerySegment = new SubquerySegment(ctx.subquery().start.getStartIndex(), ctx.subquery().stop.getStopIndex(), subquery);
+ SubqueryTableSegment result = new SubqueryTableSegment(subquerySegment);
+ if (null != ctx.alias()) {
+ result.setAlias((AliasSegment) visit(ctx.alias()));
+ }
+ return result;
+ }
+ if (null != ctx.tableName()) {
+ SimpleTableSegment result = (SimpleTableSegment) visit(ctx.tableName());
+ if (null != ctx.alias()) {
+ result.setAlias((AliasSegment) visit(ctx.alias()));
+ }
+ return result;
+ }
+ 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);
+ if (null != ctx.joinSpecification()) {
+ result = visitJoinSpecification(ctx.joinSpecification(), result);
+ }
+ return result;
+ }
+
+ private JoinTableSegment visitJoinSpecification(final JoinSpecificationContext ctx, final JoinTableSegment joinTableSource) {
+ if (null != ctx.expr()) {
+ ExpressionSegment condition = (ExpressionSegment) visit(ctx.expr());
+ joinTableSource.setCondition(condition);
+ }
+ if (null != ctx.USING()) {
+ List<ColumnSegment> columnSegmentList = new LinkedList<>();
+ for (ColumnNameContext cname : ctx.columnNames().columnName()) {
+ columnSegmentList.add((ColumnSegment) visit(cname));
+ }
+ joinTableSource.setUsing(columnSegmentList);
+ }
+ return joinTableSource;
+ }
+
+ @Override
+ public ASTNode visitSubquery(final SubqueryContext ctx) {
+ return visit(ctx.aggregationClause());
+ }
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dal/SQLServerExplainStatement.java
similarity index 57%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dal/SQLServerExplainStatement.java
index a6796fa..0dae4c6 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDALStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dal/SQLServerExplainStatement.java
@@ -15,21 +15,13 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.impl;
+package org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dal;
-import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.sql.parser.api.visitor.operation.SQLStatementVisitor;
-import org.apache.shardingsphere.sql.parser.api.visitor.type.DALSQLVisitor;
-
-import java.util.Properties;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.ExplainStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.SQLServerStatement;
/**
- * DAL Statement SQL visitor for SQLServer.
+ * SQLServer explain statement.
*/
-@NoArgsConstructor
-public final class SQLServerDALStatementSQLVisitor extends SQLServerStatementSQLVisitor implements DALSQLVisitor, SQLStatementVisitor {
-
- public SQLServerDALStatementSQLVisitor(final Properties props) {
- super(props);
- }
+public final class SQLServerExplainStatement extends ExplainStatement implements SQLServerStatement {
}
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml
index d0cde0f..fdc6234 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dal/explain.xml
@@ -88,4 +88,39 @@
</delete>
</describe>
+ <describe sql-case-id="explain_select_with_binding_tables">
+ <select>
+ <from>
+ <join-table>
+ <left>
+ <simple-table name="t_order" alias="o" start-index="24" stop-index="32" />
+ </left>
+ <right>
+ <simple-table name="t_order_item" alias="i" start-index="39" stop-index="52" />
+ </right>
+ <using-columns name="order_id" start-index="60" stop-index="67" />
+ </join-table>
+ </from>
+ <projections start-index="15" stop-index="17">
+ <shorthand-projection start-index="15" stop-index="17">
+ <owner name="i" start-index="15" stop-index="15" />
+ </shorthand-projection>
+ </projections>
+ <where start-index="70" stop-index="90">
+ <expr>
+ <binary-operation-expression start-index="76" stop-index="90">
+ <left>
+ <column name="order_id" start-index="76" stop-index="85">
+ <owner name="o" start-index="76" stop-index="76" />
+ </column>
+ </left>
+ <operator>=</operator>
+ <right>
+ <literal-expression value="10" start-index="89" stop-index="90" />
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ </select>
+ </describe>
</sql-parser-test-cases>
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml
index b333889..91f0442 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dal/explain.xml
@@ -17,8 +17,9 @@
-->
<sql-cases>
- <sql-case id="explain_select_constant_without_table" value="EXPLAIN SELECT 1 as a" db-types="PostgreSQL,openGauss, MySQL" />
- <sql-case id="explain_update_without_condition" value="EXPLAIN UPDATE t_order SET status = 'finished'" db-types="PostgreSQL,openGauss, MySQL" />
- <sql-case id="explain_insert_without_parameters" value="EXPLAIN INSERT INTO t_order (order_id, user_id, status) VALUES (1, 1, 'insert')" db-types="PostgreSQL,openGauss, MySQL" />
- <sql-case id="explain_delete_without_sharding_value" value="EXPLAIN DELETE FROM t_order WHERE status='init'" db-types="PostgreSQL,openGauss, MySQL" />
+ <sql-case id="explain_select_constant_without_table" value="EXPLAIN SELECT 1 as a" db-types="PostgreSQL, openGauss, MySQL, SQLServer" />
+ <sql-case id="explain_update_without_condition" value="EXPLAIN UPDATE t_order SET status = 'finished'" db-types="PostgreSQL, openGauss, MySQL, SQLServer" />
+ <sql-case id="explain_insert_without_parameters" value="EXPLAIN INSERT INTO t_order (order_id, user_id, status) VALUES (1, 1, 'insert')" db-types="PostgreSQL, openGauss, MySQL, SQLServer" />
+ <sql-case id="explain_delete_without_sharding_value" value="EXPLAIN DELETE FROM t_order WHERE status='init'" db-types="PostgreSQL, openGauss, MySQL, SQLServer" />
+ <sql-case id="explain_select_with_binding_tables" value="EXPLAIN SELECT i.* FROM t_order o JOIN t_order_item i USING(order_id) WHERE o.order_id = 10" db-types="SQLServer" />
</sql-cases>