diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SubqueryTableConverter.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SubqueryTableConverter.java index a779a4ea5e0c2..4b13895f860ef 100644 --- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SubqueryTableConverter.java +++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/from/impl/SubqueryTableConverter.java @@ -24,12 +24,16 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment; import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.SQLSegmentConverter; +import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.from.TableConverter; import org.apache.shardingsphere.sqlfederation.optimizer.converter.statement.select.SelectStatementConverter; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.Optional; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Subquery table converter. @@ -42,7 +46,17 @@ public Optional convert(final SubqueryTableSegment segment) { return Optional.empty(); } Collection sqlNodes = new LinkedList<>(); - sqlNodes.add(new SelectStatementConverter().convert(segment.getSubquery().getSelect())); + if (null == segment.getSubquery().getSelect().getProjections()) { + List> operandList = new LinkedList<>(); + operandList.add(new TableConverter().convert(segment.getSubquery().getSelect().getFrom())); + List result = operandList.stream() + .flatMap(optional -> optional.map(Stream::of).orElseGet(Stream::empty)) + .collect(Collectors.toList()); + sqlNodes.add(new SqlBasicCall(SqlStdOperatorTable.EXPLICIT_TABLE, + result, SqlParserPos.ZERO)); + } else { + sqlNodes.add(new SelectStatementConverter().convert(segment.getSubquery().getSelect())); + } segment.getAlias().ifPresent(optional -> sqlNodes.add(new SqlIdentifier(optional, SqlParserPos.ZERO))); return Optional.of(new SqlBasicCall(SqlStdOperatorTable.AS, new ArrayList<>(sqlNodes), SqlParserPos.ZERO)); } diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java index e07a22515c159..adfa5a982fdc5 100644 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java +++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java @@ -761,7 +761,12 @@ public ASTNode visitQuerySpecification(final QuerySpecificationContext ctx) { @Override public ASTNode visitTableStatement(final TableStatementContext ctx) { MySQLSelectStatement result = new MySQLSelectStatement(); - result.setTable((SimpleTableSegment) visit(ctx.tableName())); + if (null != ctx.TABLE()) { + result.setFrom(new SimpleTableSegment(new TableNameSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), + new IdentifierValue(ctx.tableName().getText())))); + } else { + result.setTable((SimpleTableSegment) visit(ctx.tableName())); + } return result; } diff --git a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java index a639e689b3f20..919b55b25ed31 100644 --- a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java +++ b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimizer/converter/SQLNodeConverterEngineIT.java @@ -69,7 +69,7 @@ void assertConvert(final String sqlCaseId, final SQLCaseType sqlCaseType, final return; } String sql = SQL_CASES.getSQL(sqlCaseId, sqlCaseType, SQL_PARSER_TEST_CASES.get(sqlCaseId).getParameters()); - String actual = SQLNodeConverterEngine.convert(parseSQLStatement(databaseType, sql)).toSqlString(SQLDialectFactory.getSQLDialect(databaseType)).getSql().replace("\n", " "); + String actual = SQLNodeConverterEngine.convert(parseSQLStatement(databaseType, sql)).toSqlString(SQLDialectFactory.getSQLDialect(databaseType)).getSql().replace("\n", " ").replace("\r", ""); assertThat(actual, is(expected)); } diff --git a/test/it/optimizer/src/test/resources/converter/select-table.xml b/test/it/optimizer/src/test/resources/converter/select-table.xml new file mode 100644 index 0000000000000..061035103ee9b --- /dev/null +++ b/test/it/optimizer/src/test/resources/converter/select-table.xml @@ -0,0 +1,21 @@ + + + + + + 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 a3c2ffcf9f503..e7267a14bc6a3 100644 --- a/test/it/parser/src/main/resources/case/dal/explain.xml +++ b/test/it/parser/src/main/resources/case/dal/explain.xml @@ -336,7 +336,6 @@ diff --git a/test/it/parser/src/main/resources/case/dml/table.xml b/test/it/parser/src/main/resources/case/dml/table.xml index 82662a28c7cf3..69d94b8518f59 100644 --- a/test/it/parser/src/main/resources/case/dml/table.xml +++ b/test/it/parser/src/main/resources/case/dml/table.xml @@ -18,7 +18,9 @@ @@ -48,7 +56,9 @@