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 81b6b361d9d Support parse OpenGauss/PostgreSQL select into segment 
(#29903)
81b6b361d9d is described below

commit 81b6b361d9d8e367424b9bbcaa89683d889a55e5
Author: LotusMoon <[email protected]>
AuthorDate: Tue Jan 30 07:45:29 2024 +0800

    Support parse OpenGauss/PostgreSQL select into segment (#29903)
    
    * Support parsing SQL Server default schema
    
    * Support OpenGauss/PostgreSQL select into segment
    
    * Apply spotless check
---
 .../statement/OpenGaussStatementVisitor.java       |  9 +++
 .../statement/PostgreSQLStatementVisitor.java      |  9 +++
 .../handler/dml/SelectStatementHandler.java        |  8 +++
 .../opengauss/dml/OpenGaussSelectStatement.java    | 12 ++++
 .../postgresql/dml/PostgreSQLSelectStatement.java  | 13 ++++
 .../src/main/resources/case/dml/select-into.xml    | 76 ++++++++++++++++++++++
 .../resources/sql/supported/dml/select-into.xml    |  2 +
 7 files changed, 129 insertions(+)

diff --git 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
index 84884704621..6b31aa95472 100644
--- 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
+++ 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java
@@ -116,6 +116,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.Whe
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.WindowClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.WindowDefinitionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.WindowSpecificationContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.IntoClauseContext;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.CombineType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.JoinType;
@@ -1002,6 +1003,9 @@ public abstract class OpenGaussStatementVisitor extends 
OpenGaussStatementBaseVi
         } else {
             result.setProjections(new ProjectionsSegment(-1, -1));
         }
+        if (null != ctx.intoClause()) {
+            result.setIntoSegment((TableSegment) visit(ctx.intoClause()));
+        }
         if (null != ctx.fromClause()) {
             TableSegment tableSegment = (TableSegment) visit(ctx.fromClause());
             result.setFrom(tableSegment);
@@ -1021,6 +1025,11 @@ public abstract class OpenGaussStatementVisitor extends 
OpenGaussStatementBaseVi
         return result;
     }
     
+    @Override
+    public ASTNode visitIntoClause(final IntoClauseContext ctx) {
+        return visit(ctx.optTempTableName().qualifiedName());
+    }
+    
     @Override
     public ASTNode visitHavingClause(final HavingClauseContext ctx) {
         ExpressionSegment expr = (ExpressionSegment) visit(ctx.aExpr());
diff --git 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
index 90ecc822eb3..549d4c5b67a 100644
--- 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
+++ 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
@@ -110,6 +110,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Wh
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.WindowClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.WindowDefinitionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.WindowSpecificationContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IntoClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParserBaseVisitor;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.CombineType;
@@ -968,6 +969,9 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
             }
             result.setProjections(projects);
         }
+        if (null != ctx.intoClause()) {
+            result.setIntoSegment((TableSegment) visit(ctx.intoClause()));
+        }
         if (null != ctx.fromClause()) {
             TableSegment tableSegment = (TableSegment) visit(ctx.fromClause());
             result.setFrom(tableSegment);
@@ -987,6 +991,11 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         return result;
     }
     
+    @Override
+    public ASTNode visitIntoClause(final IntoClauseContext ctx) {
+        return visit(ctx.optTempTableName().qualifiedName());
+    }
+    
     @Override
     public ASTNode visitHavingClause(final HavingClauseContext ctx) {
         ExpressionSegment expr = (ExpressionSegment) visit(ctx.aExpr());
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/SelectStatementHandler.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/SelectStatementHandler.java
index 0ef8bfd3151..c885cca9c77 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/SelectStatementHandler.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/SelectStatementHandler.java
@@ -242,6 +242,10 @@ public final class SelectStatementHandler implements 
SQLStatementHandler {
     public static Optional<TableSegment> getIntoSegment(final SelectStatement 
selectStatement) {
         if (selectStatement instanceof SQLServerSelectStatement) {
             return ((SQLServerSelectStatement) 
selectStatement).getIntoSegment();
+        } else if (selectStatement instanceof PostgreSQLSelectStatement) {
+            return ((PostgreSQLSelectStatement) 
selectStatement).getIntoSegment();
+        } else if (selectStatement instanceof OpenGaussSelectStatement) {
+            return ((OpenGaussSelectStatement) 
selectStatement).getIntoSegment();
         }
         return Optional.empty();
     }
@@ -255,6 +259,10 @@ public final class SelectStatementHandler implements 
SQLStatementHandler {
     public static void setIntoSegment(final SelectStatement selectStatement, 
final TableSegment intoSegment) {
         if (selectStatement instanceof SQLServerSelectStatement) {
             ((SQLServerSelectStatement) 
selectStatement).setIntoSegment(intoSegment);
+        } else if (selectStatement instanceof PostgreSQLSelectStatement) {
+            ((PostgreSQLSelectStatement) 
selectStatement).setIntoSegment(intoSegment);
+        } else if (selectStatement instanceof OpenGaussSelectStatement) {
+            ((OpenGaussSelectStatement) 
selectStatement).setIntoSegment(intoSegment);
         }
     }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/dml/OpenGaussSelectStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/dml/OpenGaussSelectStatement.java
index 43091885f44..2590e224350 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/dml/OpenGaussSelectStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/opengauss/dml/OpenGaussSelectStatement.java
@@ -21,6 +21,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WindowSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.OpenGaussStatement;
 
@@ -38,6 +39,8 @@ public final class OpenGaussSelectStatement extends 
SelectStatement implements O
     
     private WindowSegment window;
     
+    private TableSegment intoSegment;
+    
     /**
      * Get order by segment.
      *
@@ -64,4 +67,13 @@ public final class OpenGaussSelectStatement extends 
SelectStatement implements O
     public Optional<WindowSegment> getWindow() {
         return Optional.ofNullable(window);
     }
+    
+    /**
+     * Get into segment.
+     *
+     * @return into segment
+     */
+    public Optional<TableSegment> getIntoSegment() {
+        return Optional.ofNullable(intoSegment);
+    }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/dml/PostgreSQLSelectStatement.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/dml/PostgreSQLSelectStatement.java
index 000c04375c9..b928856b4ff 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/dml/PostgreSQLSelectStatement.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/dml/PostgreSQLSelectStatement.java
@@ -21,6 +21,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WindowSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement;
 
@@ -38,6 +39,8 @@ public final class PostgreSQLSelectStatement extends 
SelectStatement implements
     
     private WindowSegment window;
     
+    private TableSegment intoSegment;
+    
     /**
      * Get order by segment.
      *
@@ -64,4 +67,14 @@ public final class PostgreSQLSelectStatement extends 
SelectStatement implements
     public Optional<WindowSegment> getWindow() {
         return Optional.ofNullable(window);
     }
+    
+    /**
+     * Get into segment.
+     *
+     * @return into segment
+     */
+    public Optional<TableSegment> getIntoSegment() {
+        return Optional.ofNullable(intoSegment);
+    }
+    
 }
diff --git a/test/it/parser/src/main/resources/case/dml/select-into.xml 
b/test/it/parser/src/main/resources/case/dml/select-into.xml
index af6b5650eba..77a4076a0a3 100644
--- a/test/it/parser/src/main/resources/case/dml/select-into.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-into.xml
@@ -287,4 +287,80 @@
             </expr>
         </where>
     </select>
+
+    <select sql-case-id="select_into_simple_table">
+        <projections start-index="7" stop-index="33">
+            <column-projection name="film_id" start-index="7" stop-index="13"/>
+            <column-projection name="title" start-index="16" stop-index="20"/>
+            <column-projection name="rental_rate" start-index="23" 
stop-index="33"/>
+        </projections>
+        <from>
+            <simple-table name="film" start-index="58" stop-index="61"/>
+        </from>
+        <into>
+            <simple-table name="film_r" start-index="46" stop-index="51"/>
+        </into>
+        <where start-index="63" stop-index="104">
+            <expr>
+                <binary-operation-expression start-index="69" stop-index="104">
+                    <left>
+                        <binary-operation-expression start-index="69" 
stop-index="80">
+                            <left>
+                                <column name="rating" start-index="69" 
stop-index="74"/>
+                            </left>
+                            <right>
+                                <literal-expression value="R" start-index="78" 
stop-index="80"/>
+                            </right>
+                            <operator>=</operator>
+                        </binary-operation-expression>
+                    </left>
+                    <right>
+                        <binary-operation-expression start-index="86" 
stop-index="104">
+                            <left>
+                                <column name="rental_duration" 
start-index="86" stop-index="100"/>
+                            </left>
+                            <right>
+                                <literal-expression value="5" 
start-index="104" stop-index="104"/>
+                            </right>
+                            <operator>=</operator>
+                        </binary-operation-expression>
+                    </right>
+                    <operator>AND</operator>
+                </binary-operation-expression>
+            </expr>
+        </where>
+        <order-by>
+            <column-item name="title" start-index="115" stop-index="119" 
order-direction="ASC"/>
+        </order-by>
+    </select>
+
+    <select sql-case-id="select_into_temp_table">
+        <projections start-index="7" stop-index="28">
+            <column-projection name="film_id" start-index="7" stop-index="13"/>
+            <column-projection name="title" start-index="16" stop-index="20"/>
+            <column-projection name="length" start-index="23" stop-index="28"/>
+        </projections>
+        <from>
+            <simple-table name="film" start-index="62" stop-index="65"/>
+        </from>
+        <into>
+            <simple-table name="short_film" start-index="46" stop-index="55"/>
+        </into>
+        <where start-index="67" stop-index="83">
+            <expr>
+                <binary-operation-expression start-index="73" stop-index="83">
+                    <left>
+                        <column name="length" start-index="73" 
stop-index="78"/>
+                    </left>
+                    <right>
+                        <literal-expression value="60" start-index="82" 
stop-index="83"/>
+                    </right>
+                    <operator>&lt;</operator>
+                </binary-operation-expression>
+            </expr>
+        </where>
+        <order-by>
+            <column-item name="title" start-index="94" stop-index="98" 
order-direction="ASC"/>
+        </order-by>
+    </select>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/dml/select-into.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/select-into.xml
index ff233be1aac..c03fc5e1fbf 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-into.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-into.xml
@@ -31,4 +31,6 @@
     <sql-case id="select_into_with_variable" value="SELECT select_list INTO 
record_variable_name FROM table_or_view_name" db-types="Oracle" />
     <sql-case id="select_into_table_with_try_cast_function" value="SELECT 
machine.temperature, 
udf.ASAEdgeUDFDemo_Class1_SquareFunction(try_cast(machine.temperature as 
bigint)) INTO Output FROM Input;" db-types="SQLServer"/>
     <sql-case id="select_into_table_before_from" value="SELECT * INTO 
dbo.NewProducts FROM Production.Product WHERE ListPrice &gt; $25 AND ListPrice 
&lt; $100;" db-types="SQLServer"/>
+    <sql-case id="select_into_simple_table" value="SELECT film_id, title, 
rental_rate INTO TABLE film_r FROM film WHERE rating = 'R' AND rental_duration 
= 5 ORDER BY title" db-types="PostgreSQL, openGauss"/>
+    <sql-case id="select_into_temp_table" value="SELECT film_id, title, length 
INTO TEMP TABLE short_film FROM film WHERE length &lt; 60 ORDER BY title" 
db-types="PostgreSQL, openGauss"/>
 </sql-cases>

Reply via email to