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

terrymanu 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 15717c38967 Preserve RETURNING clause when binding UPDATE and DELETE 
statements (#40070)
15717c38967 is described below

commit 15717c389679e2dfb725626ac168d7462707ad27
Author: Eunbin Son <[email protected]>
AuthorDate: Sun Oct 11 00:30:23 2026 +0900

    Preserve RETURNING clause when binding UPDATE and DELETE statements (#40070)
---
 RELEASE-NOTES.md                                                      | 1 +
 .../infra/binder/engine/statement/dml/DeleteStatementBinder.java      | 2 +-
 .../infra/binder/engine/statement/dml/UpdateStatementBinder.java      | 2 +-
 .../infra/binder/engine/statement/dml/DeleteStatementBinderTest.java  | 4 ++++
 .../infra/binder/engine/statement/dml/UpdateStatementBinderTest.java  | 4 ++++
 5 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 7c78a023cae..6fba64e9ecb 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -47,6 +47,7 @@
 1. SQL Binder: Fix wrong bind info when order by refer column from with 
temporary table - [#38353](https://github.com/apache/shardingsphere/pull/38353)
 1. SQL Binder: Fix wrong column label case for PostgreSQL and openGauss 
function projections - 
[#39393](https://github.com/apache/shardingsphere/pull/39393)
 1. SQL Binder: Bind PostgreSQL SYSTEM_USER as a niladic function instead of a 
column - [#39385](https://github.com/apache/shardingsphere/pull/39385)
+1. SQL Binder: Preserve RETURNING clause when binding UPDATE and DELETE 
statements - [#40070](https://github.com/apache/shardingsphere/pull/40070)
 1. Metadata: Fix MySQL metadata loading fallback when JDBC catalog is null for 
named tables - [#38855](https://github.com/apache/shardingsphere/pull/38855)
 1. Metadata: Fix Oracle metadata version comparison skipping identity and 
collation columns on 18c and later - 
[#39104](https://github.com/apache/shardingsphere/pull/39104)
 1. Metadata: Fix wrong logic table metadata when config same actual table name 
in different storage unit - 
[#39157](https://github.com/apache/shardingsphere/pull/39157)
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
index 8b32891e069..7948f231fbe 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
@@ -54,7 +54,7 @@ public final class DeleteStatementBinder implements 
SQLStatementBinder<DeleteSta
     private DeleteStatement copy(final DeleteStatement sqlStatement, final 
WithSegment boundWith, final TableSegment boundTable, final WhereSegment 
boundWhere, final OrderBySegment boundOrderBy) {
         DeleteStatement result = 
DeleteStatement.builder().databaseType(sqlStatement.getDatabaseType()).with(boundWith).table(boundTable)
                 
.where(boundWhere).orderBy(boundOrderBy).limit(sqlStatement.getLimit().orElse(null)).errorLogging(sqlStatement.getErrorLogging().orElse(null))
-                .output(sqlStatement.getOutput().orElse(null)).build();
+                
.output(sqlStatement.getOutput().orElse(null)).returning(sqlStatement.getReturning().orElse(null)).build();
         SQLStatementCopyUtils.copyAttributes(sqlStatement, result);
         return result;
     }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
index a81af9e964f..3bc28d5f4c5 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
@@ -67,7 +67,7 @@ public final class UpdateStatementBinder implements 
SQLStatementBinder<UpdateSta
                                  final SetAssignmentSegment 
boundSetAssignment, final WhereSegment boundWhere, final OrderBySegment 
boundOrderBy) {
         UpdateStatement result = 
UpdateStatement.builder().databaseType(sqlStatement.getDatabaseType()).with(boundWith).table(boundTable)
                 
.from(boundFrom).setAssignment(boundSetAssignment).where(boundWhere).orderBy(boundOrderBy).limit(sqlStatement.getLimit().orElse(null))
-                .errorLogging(sqlStatement.getErrorLogging().orElse(null))
+                
.returning(sqlStatement.getReturning().orElse(null)).errorLogging(sqlStatement.getErrorLogging().orElse(null))
                 
.targetTableIsFromAlias(sqlStatement.isTargetTableIsFromAlias()).build();
         SQLStatementCopyUtils.copyAttributes(sqlStatement, result);
         return result;
diff --git 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
index 34e67e2a33c..82293542d0f 100644
--- 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
+++ 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
@@ -67,16 +68,19 @@ class DeleteStatementBinderTest {
     void assertBind() {
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
         ErrorLoggingSegment errorLogging = new ErrorLoggingSegment(0, 0, null, 
null, "UNLIMITED");
+        ReturningSegment returning = new ReturningSegment(0, 0, new 
ProjectionsSegment(0, 0));
         DeleteStatement deleteStatement = DeleteStatement.builder()
                 .databaseType(databaseType)
                 .table(simpleTableSegment)
                 .where(new WhereSegment(0, 0, new BinaryOperationExpression(0, 
0, new ColumnSegment(0, 0, new IdentifierValue("status")),
                         new LiteralExpressionSegment(0, 0, 0), "=", "status = 
1")))
                 .errorLogging(errorLogging)
+                .returning(returning)
                 .build();
         DeleteStatement actual = new 
DeleteStatementBinder().bind(deleteStatement, new 
SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), 
deleteStatement));
         assertThat(actual, not(deleteStatement));
         assertThat(actual.getErrorLogging().get(), is(errorLogging));
+        assertThat(actual.getReturning().get(), is(returning));
         assertThat(actual.getTable(), not(deleteStatement.getTable()));
         assertThat(actual.getTable(), isA(SimpleTableSegment.class));
         assertTrue(actual.getWhere().isPresent());
diff --git 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
index 0fe17a09f8c..b1259c2d54b 100644
--- 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
+++ 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
+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.SetAssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
@@ -70,16 +71,19 @@ class UpdateStatementBinderTest {
     void assertBind() {
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_order")));
         ErrorLoggingSegment errorLogging = new ErrorLoggingSegment(0, 0, null, 
null, "UNLIMITED");
+        ReturningSegment returning = new ReturningSegment(0, 0, new 
ProjectionsSegment(0, 0));
         UpdateStatement updateStatement = UpdateStatement.builder()
                 .databaseType(databaseType)
                 .table(simpleTableSegment)
                 .where(new WhereSegment(0, 0, new BinaryOperationExpression(0, 
0, new ColumnSegment(0, 0, new IdentifierValue("status")),
                         new LiteralExpressionSegment(0, 0, 0), "=", "status = 
1")))
                 .errorLogging(errorLogging)
+                .returning(returning)
                 .build();
         UpdateStatement actual = new 
UpdateStatementBinder().bind(updateStatement, new 
SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), 
updateStatement));
         assertThat(actual, not(updateStatement));
         assertThat(actual.getErrorLogging().get(), is(errorLogging));
+        assertThat(actual.getReturning().get(), is(returning));
         assertThat(actual.getTable(), not(updateStatement.getTable()));
         assertThat(actual.getTable(), isA(SimpleTableSegment.class));
         assertTrue(actual.getWhere().isPresent());

Reply via email to