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

strongduanmu 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 6c8f8f6a371 Preserve parameter marker projection metadata in column 
binder (#39709)
6c8f8f6a371 is described below

commit 6c8f8f6a37136ff62a7a2a1cd0284215ca786120
Author: ZhangCheng <[email protected]>
AuthorDate: Thu Sep 3 19:15:37 2026 +0800

    Preserve parameter marker projection metadata in column binder (#39709)
    
    * Preserve parameter marker projection metadata in column binder
    
    * Preserve default metadata for unbound parameter marker projections
---
 .../dml/expression/type/ColumnSegmentBinder.java   | 15 ++++++++--
 .../expression/type/ColumnSegmentBinderTest.java   | 34 ++++++++++++++++++++++
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
index 8ea32aa97b4..d32952f326f 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java
@@ -38,6 +38,7 @@ import 
org.apache.shardingsphere.infra.exception.kernel.syntax.AmbiguousColumnEx
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.TableSourceType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
@@ -308,8 +309,18 @@ public final class ColumnSegmentBinder {
     }
     
     private static ColumnSegment createColumnSegment(final ProjectionSegment 
projectionSegment) {
-        return projectionSegment instanceof ColumnProjectionSegment ? 
((ColumnProjectionSegment) projectionSegment).getColumn()
-                : new ColumnSegment(0, 0, new 
IdentifierValue(projectionSegment.getColumnLabel()));
+        if (projectionSegment instanceof ColumnProjectionSegment) {
+            return ((ColumnProjectionSegment) projectionSegment).getColumn();
+        }
+        if (projectionSegment instanceof ParameterMarkerExpressionSegment) {
+            ParameterMarkerExpressionSegment parameterMarker = 
(ParameterMarkerExpressionSegment) projectionSegment;
+            ColumnSegment result = new ColumnSegment(0, 0, 
parameterMarker.getAlias().orElseGet(() -> new 
IdentifierValue(parameterMarker.getColumnLabel())));
+            if (null != parameterMarker.getBoundInfo()) {
+                result.setColumnBoundInfo(parameterMarker.getBoundInfo());
+            }
+            return result;
+        }
+        return new ColumnSegment(0, 0, new 
IdentifierValue(projectionSegment.getColumnLabel()));
     }
     
     private static Optional<ColumnSegment> 
findInputColumnSegmentFromExternalTables(final ColumnSegment segment,
diff --git 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinderTest.java
 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinderTest.java
index 47ad02b7cab..c0956dbfcc1 100644
--- 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinderTest.java
+++ 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinderTest.java
@@ -32,7 +32,9 @@ import 
org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.TableSourceType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
@@ -107,6 +109,38 @@ class ColumnSegmentBinderTest {
         assertThat(actual.getColumnBoundInfo().getOriginalColumn().getValue(), 
is("status"));
     }
     
+    @Test
+    void assertBindParameterMarkerProjectionFromExternalTable() {
+        IdentifierValue sourceTableName = new IdentifierValue("\"Source\"");
+        IdentifierValue sourceColumnName = new IdentifierValue("\"NewEmail\"");
+        ParameterMarkerExpressionSegment sourceProjection = new 
ParameterMarkerExpressionSegment(0, 11, 0);
+        sourceProjection.setAlias(new AliasSegment(2, 11, sourceColumnName));
+        sourceProjection.setBoundInfo(new ColumnSegmentBoundInfo(new 
TableSegmentBoundInfo(new IdentifierValue(""), new IdentifierValue("")),
+                sourceTableName, sourceColumnName, 
TableSourceType.TEMPORARY_TABLE));
+        SQLStatementBinderContext binderContext = createBinderContext();
+        
binderContext.getExternalTableBinderContexts().put(CaseInsensitiveString.of(sourceTableName.getValue()),
+                new 
SimpleTableSegmentBinderContext(Collections.singleton(sourceProjection), 
TableSourceType.TEMPORARY_TABLE));
+        ColumnSegment actual = ColumnSegmentBinder.bind(new ColumnSegment(20, 
29, sourceColumnName), SegmentType.SET_ASSIGNMENT,
+                binderContext, LinkedHashMultimap.create(), 
LinkedHashMultimap.create());
+        assertThat(actual.getColumnBoundInfo().getOriginalTable(), 
is(sourceTableName));
+        assertThat(actual.getColumnBoundInfo().getOriginalColumn(), 
is(sourceColumnName));
+        assertThat(actual.getColumnBoundInfo().getTableSourceType(), 
is(TableSourceType.TEMPORARY_TABLE));
+    }
+    
+    @Test
+    void 
assertBindParameterMarkerProjectionWithoutBoundInfoFromExternalTable() {
+        IdentifierValue sourceColumnName = new IdentifierValue("\"NewEmail\"");
+        ParameterMarkerExpressionSegment sourceProjection = new 
ParameterMarkerExpressionSegment(0, 11, 0);
+        sourceProjection.setAlias(new AliasSegment(2, 11, sourceColumnName));
+        SQLStatementBinderContext binderContext = createBinderContext();
+        
binderContext.getExternalTableBinderContexts().put(CaseInsensitiveString.of("foo_cte"),
+                new 
SimpleTableSegmentBinderContext(Collections.singleton(sourceProjection), 
TableSourceType.TEMPORARY_TABLE));
+        ColumnSegment actual = ColumnSegmentBinder.bind(new ColumnSegment(20, 
29, sourceColumnName), SegmentType.SET_ASSIGNMENT,
+                binderContext, LinkedHashMultimap.create(), 
LinkedHashMultimap.create());
+        assertNotNull(actual.getColumnBoundInfo());
+        assertThat(actual.getColumnBoundInfo().getOriginalColumn(), 
is(sourceColumnName));
+    }
+    
     @Test
     void assertBindModelColumn() {
         SQLStatementBinderContext binderContext = createBinderContext();

Reply via email to