This is an automated email from the ASF dual-hosted git repository.

zhangliang 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 147b22564fd Added support returning for some firebird requests (#34047)
147b22564fd is described below

commit 147b22564fdc81ef642d12fdbc22aa14798bb28c
Author: Maxim Sentyabrskiy <[email protected]>
AuthorDate: Fri Dec 13 18:41:03 2024 +0300

    Added support returning for some firebird requests (#34047)
    
    * Update firebird insert statement to support returning (#33977)
    
    * Refactor RETURNING statement to use projections
    
    * Update firebird update statement to support returning
    
    * Update firebird delete statement to support returning
    
    ---------
    
    Co-authored-by: TedCraft <[email protected]>
---
 .../main/antlr4/imports/firebird/DMLStatement.g4   | 12 +++--
 .../type/FirebirdDMLStatementVisitor.java          | 16 ++++++
 .../core/statement/dml/UpdateStatement.java        | 19 +++++++
 .../firebird/dml/FirebirdDeleteStatement.java      | 12 +++++
 .../firebird/dml/FirebirdInsertStatement.java      | 12 +++++
 .../firebird/dml/FirebirdUpdateStatement.java      | 12 +++++
 .../parser/src/main/resources/case/dml/update.xml  | 59 ++++++++++++++++++++++
 .../main/resources/sql/supported/dml/delete.xml    |  2 +-
 .../main/resources/sql/supported/dml/insert.xml    |  2 +-
 .../main/resources/sql/supported/dml/update.xml    |  1 +
 10 files changed, 141 insertions(+), 6 deletions(-)

diff --git 
a/parser/sql/dialect/firebird/src/main/antlr4/imports/firebird/DMLStatement.g4 
b/parser/sql/dialect/firebird/src/main/antlr4/imports/firebird/DMLStatement.g4
index 3d8067b57ae..91ef07da8a4 100644
--- 
a/parser/sql/dialect/firebird/src/main/antlr4/imports/firebird/DMLStatement.g4
+++ 
b/parser/sql/dialect/firebird/src/main/antlr4/imports/firebird/DMLStatement.g4
@@ -20,7 +20,7 @@ grammar DMLStatement;
 import BaseRule;
 
 insert
-    : INSERT INTO? tableName (insertValuesClause | insertSelectClause)
+    : INSERT INTO? tableName (insertValuesClause | insertSelectClause) 
returningClause?
     ;
 
 insertValuesClause
@@ -31,8 +31,12 @@ insertSelectClause
     : columnNames? select
     ;
 
+returningClause
+    : RETURNING projections
+    ;
+
 update
-    : UPDATE tableReferences setAssignmentsClause whereClause?
+    : UPDATE tableReferences setAssignmentsClause whereClause? returningClause?
     ;
 
 assignment
@@ -57,7 +61,7 @@ blobValue
     ;
 
 delete
-    : DELETE singleTableClause whereClause?
+    : DELETE singleTableClause whereClause? returningClause?
     ;
 
 singleTableClause
@@ -199,4 +203,4 @@ variableList
 
 variableListClause
     : variableList (COMMA_ variableList)*
-    ;
+    ;
\ No newline at end of file
diff --git 
a/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
 
b/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
index c7c69a191b3..52e66721a31 100644
--- 
a/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
+++ 
b/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdDMLStatementVisitor.java
@@ -42,6 +42,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.Orde
 import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.ProjectionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.ProjectionsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.QualifiedShorthandContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.ReturningClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.SelectClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.SelectContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.SelectSpecificationContext;
@@ -55,6 +56,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.Upda
 import 
org.apache.shardingsphere.sql.parser.autogen.FirebirdStatementParser.WhereClauseContext;
 import 
org.apache.shardingsphere.sql.parser.firebird.visitor.statement.FirebirdStatementVisitor;
 import org.apache.shardingsphere.sql.parser.statement.core.enums.JoinType;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.InsertValuesSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
@@ -110,6 +112,9 @@ public final class FirebirdDMLStatementVisitor extends 
FirebirdStatementVisitor
         FirebirdInsertStatement result = (FirebirdInsertStatement) 
visit(ctx.insertValuesClause());
         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         result.addParameterMarkerSegments(getParameterMarkerSegments());
+        if (null != ctx.returningClause()) {
+            result.setReturningSegment((ReturningSegment) 
visit(ctx.returningClause()));
+        }
         return result;
     }
     
@@ -136,6 +141,11 @@ public final class FirebirdDMLStatementVisitor extends 
FirebirdStatementVisitor
         return result;
     }
     
+    @Override
+    public ASTNode visitReturningClause(final ReturningClauseContext ctx) {
+        return new ReturningSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (ProjectionsSegment) visit(ctx.projections()));
+    }
+    
     @Override
     public ASTNode visitUpdate(final UpdateContext ctx) {
         FirebirdUpdateStatement result = new FirebirdUpdateStatement();
@@ -145,6 +155,9 @@ public final class FirebirdDMLStatementVisitor extends 
FirebirdStatementVisitor
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
         }
         result.addParameterMarkerSegments(getParameterMarkerSegments());
+        if (null != ctx.returningClause()) {
+            result.setReturningSegment((ReturningSegment) 
visit(ctx.returningClause()));
+        }
         return result;
     }
     
@@ -194,6 +207,9 @@ public final class FirebirdDMLStatementVisitor extends 
FirebirdStatementVisitor
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
         }
         result.addParameterMarkerSegments(getParameterMarkerSegments());
+        if (null != ctx.returningClause()) {
+            result.setReturningSegment((ReturningSegment) 
visit(ctx.returningClause()));
+        }
         return result;
     }
     
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/UpdateStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/UpdateStatement.java
index 58e28a66e18..9fdef461564 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/UpdateStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/UpdateStatement.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml;
 
 import lombok.Getter;
 import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.hint.OptionHintSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.OrderBySegment;
@@ -172,4 +173,22 @@ public abstract class UpdateStatement extends 
AbstractSQLStatement implements DM
      */
     public void setFrom(final TableSegment from) {
     }
+    
+    /**
+     * Get returning segment of update statement.
+     *
+     * @return returning segment
+     */
+    public Optional<ReturningSegment> getReturningSegment() {
+        return Optional.empty();
+    }
+    
+    /**
+     * Set returning segment of update statement.
+     *
+     * @param returningSegment returning segment
+     */
+    public void setReturningSegment(final ReturningSegment returningSegment) {
+    }
+    
 }
diff --git 
a/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdDeleteStatement.java
 
b/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdDeleteStatement.java
index 080f6f1b3ce..e62175c0a4a 100644
--- 
a/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdDeleteStatement.java
+++ 
b/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdDeleteStatement.java
@@ -17,11 +17,23 @@
 
 package org.apache.shardingsphere.sql.parser.statement.firebird.dml;
 
+import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.firebird.FirebirdStatement;
 
+import java.util.Optional;
+
 /**
  * Firebird delete statement.
  */
+@Setter
 public final class FirebirdDeleteStatement extends DeleteStatement implements 
FirebirdStatement {
+    
+    private ReturningSegment returningSegment;
+    
+    @Override
+    public Optional<ReturningSegment> getReturningSegment() {
+        return Optional.ofNullable(returningSegment);
+    }
 }
diff --git 
a/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdInsertStatement.java
 
b/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdInsertStatement.java
index 1f7e92aa366..b899dc92908 100644
--- 
a/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdInsertStatement.java
+++ 
b/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdInsertStatement.java
@@ -17,11 +17,23 @@
 
 package org.apache.shardingsphere.sql.parser.statement.firebird.dml;
 
+import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.firebird.FirebirdStatement;
 
+import java.util.Optional;
+
 /**
  * Firebird insert statement.
  */
+@Setter
 public final class FirebirdInsertStatement extends InsertStatement implements 
FirebirdStatement {
+    
+    private ReturningSegment returningSegment;
+    
+    @Override
+    public Optional<ReturningSegment> getReturningSegment() {
+        return Optional.ofNullable(returningSegment);
+    }
 }
diff --git 
a/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdUpdateStatement.java
 
b/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdUpdateStatement.java
index 3176d5d921b..927ac1bf5e9 100644
--- 
a/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdUpdateStatement.java
+++ 
b/parser/sql/statement/type/firebird/src/main/java/org/apache/shardingsphere/sql/parser/statement/firebird/dml/FirebirdUpdateStatement.java
@@ -17,11 +17,23 @@
 
 package org.apache.shardingsphere.sql.parser.statement.firebird.dml;
 
+import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.firebird.FirebirdStatement;
 
+import java.util.Optional;
+
 /**
  * Firebird update statement.
  */
+@Setter
 public final class FirebirdUpdateStatement extends UpdateStatement implements 
FirebirdStatement {
+    
+    private ReturningSegment returningSegment;
+    
+    @Override
+    public Optional<ReturningSegment> getReturningSegment() {
+        return Optional.ofNullable(returningSegment);
+    }
 }
diff --git a/test/it/parser/src/main/resources/case/dml/update.xml 
b/test/it/parser/src/main/resources/case/dml/update.xml
index a4aded61afd..890e3d01c74 100644
--- a/test/it/parser/src/main/resources/case/dml/update.xml
+++ b/test/it/parser/src/main/resources/case/dml/update.xml
@@ -2337,4 +2337,63 @@
             </expr>
         </where>
     </update>
+
+    <update sql-case-id="update_returning_expressions" parameters="1, 2, 3">
+        <table start-index="7" stop-index="13">
+            <simple-table name="t_order" start-index="7" stop-index="13" />
+        </table>
+        <set start-index="15" stop-index="37" literal-stop-index="37">
+            <assignment start-index="19" stop-index="37" 
literal-stop-index="37">
+                <column name="status" start-index="19" stop-index="24" />
+                <assignment-value>
+                    <binary-operation-expression start-index="28" 
stop-index="37" literal-start-index="28" literal-stop-index="37">
+                        <left>
+                            <column name="status" start-index="28" 
stop-index="33" literal-start-index="28" literal-stop-index="33" />
+                        </left>
+                        <operator>-</operator>
+                        <right>
+                            <literal-expression value="1" start-index="37" 
stop-index="37" />
+                            <parameter-marker-expression parameter-index="0" 
start-index="37" stop-index="37" literal-start-index="37" 
literal-stop-index="37" />
+                        </right>
+                    </binary-operation-expression>
+                </assignment-value>
+            </assignment>
+        </set>
+        <where start-index="39" stop-index="72">
+            <expr>
+                <binary-operation-expression start-index="45" stop-index="72">
+                    <left>
+                        <binary-operation-expression start-index="45" 
stop-index="56">
+                            <left>
+                                <column name="order_id" start-index="45" 
stop-index="52" />
+                            </left>
+                            <operator>=</operator>
+                            <right>
+                                <literal-expression value="2" start-index="56" 
stop-index="56" />
+                                <parameter-marker-expression 
parameter-index="1" start-index="56" stop-index="56" />
+                            </right>
+                        </binary-operation-expression>
+                    </left>
+                    <operator>AND</operator>
+                    <right>
+                        <binary-operation-expression start-index="62" 
stop-index="72">
+                            <left>
+                                <column name="user_id" start-index="62" 
stop-index="68" />
+                            </left>
+                            <operator>=</operator>
+                            <right>
+                                <literal-expression value="3" start-index="72" 
stop-index="72" />
+                                <parameter-marker-expression 
parameter-index="2" start-index="72" stop-index="72" />
+                            </right>
+                        </binary-operation-expression>
+                    </right>
+                </binary-operation-expression>
+            </expr>
+        </where>
+        <returning start-index="74" stop-index="89">
+            <projections start-index="84" stop-index="89">
+                <column-projection name="status" start-index="84" 
stop-index="89" />
+            </projections>
+        </returning>
+    </update>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/delete.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
index 0b1d83d0d78..db5e92fdfe2 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
@@ -44,5 +44,5 @@
     <sql-case id="delete_with_schema" value="DELETE FROM db1.t_order" />
     <sql-case id="delete_with_simple_condition" value="DELETE FROM 
Q1_2000_sales WHERE amount_sold &lt; 0" db-types="Oracle" />
     <sql-case id="delete_with_output_clause_with_compress_function" 
value="DELETE FROM player OUTPUT deleted.id,deleted.name, 
deleted.surname,deleted.datemodifier,COMPRESS(deleted.info) INTO 
dbo.inactivePlayers WHERE datemodified &lt; @startOfYear" db-types="SQLServer" 
/>
-    <sql-case id="delete_returning_expressions" value="DELETE FROM t2 WHERE id 
= 2 RETURNING id,t&amp;t" db-types="MySQL" />
+    <sql-case id="delete_returning_expressions" value="DELETE FROM t2 WHERE id 
= 2 RETURNING id,t&amp;t" db-types="MySQL,Firebird" />
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
index f5f8d8421f0..1ac4e963992 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
@@ -153,6 +153,6 @@
     <sql-case id="insert_on_duplicate_key_with_column_aliases" value="INSERT 
INTO t SET a=9,b=5 AS new(m,n) ON DUPLICATE KEY UPDATE a=m+n" db-types="MySQL"/>
     <sql-case id="insert_with_aes_encrypt" value="INSERT INTO 
t_order_item(item_id,encrypt) VALUES (1,AES_ENCRYPT('text','key_str'))" 
db-types="MySQL" />
     <sql-case id="insert_on_duplicate_key_update_with_values" value="INSERT 
INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE 
c=VALUES(a)+VALUES(b);" db-types="MySQL" />
-    <sql-case id="insert_returning_expressions" value="INSERT INTO t2 (id) 
VALUES (2),(3) RETURNING id,t&amp;t" db-types="MySQL" />
+    <sql-case id="insert_returning_expressions" value="INSERT INTO t2 (id) 
VALUES (2),(3) RETURNING id,t&amp;t" db-types="MySQL,Firebird" />
 
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/update.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
index f8277a410e5..c2f7a228d35 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/update.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
@@ -68,4 +68,5 @@
     <sql-case id="update_with_inner_join" value="UPDATE dbo.Table2 SET 
dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB FROM dbo.Table2 INNER JOIN 
dbo.Table1 ON (dbo.Table2.ColA = dbo.Table1.ColA)" db-types="SQLServer"/>
     <sql-case id="update_with_current_of_abc" value="UPDATE dbo.Table1 SET c2 
= c2 + d2 FROM dbo.Table2 WHERE CURRENT OF abc" db-types="SQLServer"/>
     <sql-case id="update_with_location_setXY" value="UPDATE Cities SET 
Location.SetXY(23.5, 23.5) WHERE Name = 'Anchorage'" db-types="SQLServer"/>
+    <sql-case id="update_returning_expressions" value="UPDATE t_order SET 
status = status - ? WHERE order_id = ? AND user_id = ? RETURNING status" 
db-types="Firebird" />
 </sql-cases>

Reply via email to