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 de998e93496 support for TABLE prefix operator (#25921)
de998e93496 is described below

commit de998e93496ae2635735c1bfacc203b54ef51a87
Author: kanha gupta <[email protected]>
AuthorDate: Tue May 30 11:33:14 2023 +0530

    support for TABLE prefix operator (#25921)
    
    * support for TABLE prefix operator
    
    * support for table prefix operator
---
 .../segment/from/impl/SubqueryTableConverter.java   | 16 +++++++++++++++-
 .../visitor/statement/MySQLStatementVisitor.java    |  7 ++++++-
 .../converter/SQLNodeConverterEngineIT.java         |  2 +-
 .../src/test/resources/converter/select-table.xml   | 21 +++++++++++++++++++++
 .../parser/src/main/resources/case/dal/explain.xml  |  4 +++-
 .../it/parser/src/main/resources/case/dml/table.xml | 20 +++++++++++++++-----
 6 files changed, 61 insertions(+), 9 deletions(-)

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 a779a4ea5e0..4b13895f860 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.fun.SqlStdOperatorTable;
 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 final class SubqueryTableConverter implements 
SQLSegmentConverter<Subquer
             return Optional.empty();
         }
         Collection<SqlNode> sqlNodes = new LinkedList<>();
-        sqlNodes.add(new 
SelectStatementConverter().convert(segment.getSubquery().getSelect()));
+        if (null == segment.getSubquery().getSelect().getProjections()) {
+            List<Optional<SqlNode>> operandList = new LinkedList<>();
+            operandList.add(new 
TableConverter().convert(segment.getSubquery().getSelect().getFrom()));
+            List<SqlNode> 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 e07a22515c1..adfa5a982fd 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 abstract class MySQLStatementVisitor extends 
MySQLStatementBaseVisitor<AS
     @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 a639e689b3f..919b55b25ed 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 @@ class SQLNodeConverterEngineIT {
             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 00000000000..061035103ee
--- /dev/null
+++ b/test/it/optimizer/src/test/resources/converter/select-table.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<sql-node-converter-test-cases>
+    <test-cases sql-case-id="select_from_with_table" expected-sql="SELECT * 
FROM (TABLE `t0`) AS `dt`" db-types="MySQL" />
+</sql-node-converter-test-cases>
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 a3c2ffcf9f5..e7267a14bc6 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 @@
     
     <describe sql-case-id="explain_table">
         <select>
-            <simple-table name="t_order" start-index="14" stop-index="20" />
             <order-by>
                 <column-item name="order_id" start-index="31" stop-index="38" 
/>
             </order-by>
@@ -344,6 +343,9 @@
                 <offset value="2" literal-start-index="55" 
literal-stop-index="55" />
                 <row-count value="1" start-index="46" stop-index="46" />
             </limit>
+            <from>
+                <simple-table name="t_order" start-index="8" stop-index="20" />
+            </from>
         </select>
     </describe>
     
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 82662a28c7c..69d94b8518f 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 @@
 
 <sql-parser-test-cases>
     <select sql-case-id="table_with_order_by_limit_offset">
-        <simple-table name="t_order" start-index="6" stop-index="12" />
+        <from>
+            <simple-table name="t_order" start-index="0" stop-index="12" />
+        </from>
         <order-by>
             <column-item name="order_id" start-index="23" stop-index="30" />
         </order-by>
@@ -29,13 +31,19 @@
     </select>
     
     <select sql-case-id="table_union">
-        <simple-table name="T1" start-index="6" stop-index="7" />
+        <from>
+            <simple-table name="T1" start-index="0" stop-index="7" />
+        </from>
         <combine combine-type="UNION" start-index="9" stop-index="22">
             <left>
-                <simple-table name="T1" start-index="6" stop-index="7" />
+                <from>
+                    <simple-table name="T1" start-index="0" stop-index="7" />
+                </from>
             </left>
             <right>
-                <simple-table name="T2" start-index="21" stop-index="22" />
+                <from>
+                    <simple-table name="T2" start-index="15" stop-index="22" />
+                </from>
             </right>
         </combine>
     </select>
@@ -48,7 +56,9 @@
             <subquery-table alias="dt">
                 <subquery>
                     <select>
-                        <simple-table name="t0" start-index="21" 
stop-index="22" />
+                        <from>
+                            <simple-table name="t0" start-index="15" 
stop-index="22" />
+                        </from>
                     </select>
                 </subquery>
             </subquery-table>

Reply via email to