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