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());