This is an automated email from the ASF dual-hosted git repository.
zhaojinchao95 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 6d761e53884 Add extract column logic for window function in
ColumnExtractor (#38681)
6d761e53884 is described below
commit 6d761e53884e37bff7af1d2047221088565bbbdc
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sat May 9 18:03:17 2026 +0800
Add extract column logic for window function in ColumnExtractor (#38681)
---
.../statement/core/extractor/ColumnExtractor.java | 28 ++++++++++++++++
.../core/extractor/ColumnExtractorTest.java | 39 +++++++++++++++++++++-
2 files changed, 66 insertions(+), 1 deletion(-)
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java
index f6e927238fa..e5cbb6b067c 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractor.java
@@ -46,6 +46,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.ite
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.OrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.HavingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.CollectionTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment;
@@ -193,6 +194,7 @@ public final class ColumnExtractor {
result.addAll(extract(each));
}
}
+ expression.getWindow().ifPresent(optional ->
extractColumnsInWindowItemSegment(optional, result));
}
private static void extractColumnsInFunctionSegment(final FunctionSegment
expression, final Collection<ColumnSegment> result) {
@@ -203,6 +205,32 @@ public final class ColumnExtractor {
result.addAll(extract(each));
}
}
+ expression.getWindow().ifPresent(optional ->
extractColumnsInWindowItemSegment(optional, result));
+ }
+
+ private static void extractColumnsInWindowItemSegment(final
WindowItemSegment windowItemSegment, final Collection<ColumnSegment> result) {
+ if (null != windowItemSegment.getPartitionListSegments()) {
+ for (ExpressionSegment each :
windowItemSegment.getPartitionListSegments()) {
+ result.addAll(extract(each));
+ }
+ }
+ if (null != windowItemSegment.getOrderBySegment()) {
+
extractColumnsInOrderBySegment(windowItemSegment.getOrderBySegment(), result);
+ }
+ if (null != windowItemSegment.getFrameClause()) {
+ result.addAll(extract(windowItemSegment.getFrameClause()));
+ }
+ }
+
+ private static void extractColumnsInOrderBySegment(final OrderBySegment
orderBySegment, final Collection<ColumnSegment> result) {
+ for (OrderByItemSegment each : orderBySegment.getOrderByItems()) {
+ if (each instanceof ColumnOrderByItemSegment) {
+ result.add(((ColumnOrderByItemSegment) each).getColumn());
+ }
+ if (each instanceof ExpressionOrderByItemSegment) {
+ result.addAll(extract(((ExpressionOrderByItemSegment)
each).getExpr()));
+ }
+ }
}
/**
diff --git
a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java
b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java
index 58f0f0039db..80f6b9cd234 100644
---
a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java
+++
b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ColumnExtractorTest.java
@@ -49,6 +49,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.ite
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.HavingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.CollectionTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment;
@@ -143,8 +144,14 @@ class ColumnExtractorTest {
Arrays.asList("foo_between_function_column",
"foo_between_binary_left", "bar_between_binary_right")),
Arguments.of("AggregationProjectionWithFunctionParameters",
createAggregationProjectionExpression(),
Arrays.asList("foo_agg_direct", "foo_agg_func_direct",
"foo_agg_func_binary_left", "bar_agg_func_binary_right")),
+ Arguments.of("AggregationProjectionWithWindow",
createAggregationProjectionWithWindow(),
+ Arrays.asList("foo_agg_window_param",
"foo_agg_window_partition", "bar_agg_window_partition_func",
+ "foo_agg_window_order_column",
"foo_agg_window_order_expr_left", "bar_agg_window_order_expr_right",
"foo_agg_window_frame_column")),
Arguments.of("FunctionSegmentWithNestedBinary",
createFunctionWithColumnAndBinaryParameter(),
- Arrays.asList("foo_function_direct",
"foo_function_binary_left", "bar_function_binary_right")));
+ Arrays.asList("foo_function_direct",
"foo_function_binary_left", "bar_function_binary_right")),
+ Arguments.of("FunctionSegmentWithWindow",
createFunctionWithWindow(),
+ Arrays.asList("foo_function_param",
"foo_window_partition", "bar_window_partition_func",
+ "foo_window_order_column",
"foo_window_order_expr_left", "bar_window_order_expr_right",
"foo_window_frame_column")));
}
private static Collection<WhereSegment> createWhereSegments() {
@@ -265,6 +272,13 @@ class ColumnExtractorTest {
return result;
}
+ private static AggregationProjectionSegment
createAggregationProjectionWithWindow() {
+ AggregationProjectionSegment result = new
AggregationProjectionSegment(0, 0, AggregationType.SUM, "SUM(expr) OVER
window");
+
result.getParameters().add(createColumnSegment("foo_agg_window_param"));
+ result.setWindow(createWindowItemSegment("agg_window"));
+ return result;
+ }
+
private static FunctionSegment
createFunctionWithSingleColumnParameter(final String columnName) {
FunctionSegment result = new FunctionSegment(0, 0, "FUNC", "func");
result.getParameters().add(createColumnSegment(columnName));
@@ -278,6 +292,29 @@ class ColumnExtractorTest {
return result;
}
+ private static FunctionSegment createFunctionWithWindow() {
+ FunctionSegment result = new FunctionSegment(0, 0, "RANK", "RANK()
OVER window");
+ result.getParameters().add(createColumnSegment("foo_function_param"));
+ result.setWindow(createWindowItemSegment("window"));
+ return result;
+ }
+
+ private static WindowItemSegment createWindowItemSegment(final String
name) {
+ WindowItemSegment result = new WindowItemSegment(0, 0);
+
result.setPartitionListSegments(Arrays.asList(createColumnSegment("foo_" + name
+ "_partition"), createFunctionWithSingleColumnParameter("bar_" + name +
"_partition_func")));
+ result.setOrderBySegment(createWindowOrderBySegment(name));
+ result.setFrameClause(createFunctionWithSingleColumnParameter("foo_" +
name + "_frame_column"));
+ return result;
+ }
+
+ private static OrderBySegment createWindowOrderBySegment(final String
name) {
+ Collection<OrderByItemSegment> orderByItems = new LinkedList<>();
+ orderByItems.add(new
ColumnOrderByItemSegment(createColumnSegment("foo_" + name + "_order_column"),
OrderDirection.ASC, NullsOrderType.FIRST));
+ orderByItems.add(new ExpressionOrderByItemSegment(0, 0,
"order_by_expr", OrderDirection.ASC, NullsOrderType.FIRST,
+ createBinaryOperation("foo_" + name + "_order_expr_left",
"bar_" + name + "_order_expr_right")));
+ return new OrderBySegment(0, 0, orderByItems);
+ }
+
private static ColumnSegment createColumnSegment(final String columnName) {
return new ColumnSegment(0, 0, new IdentifierValue(columnName));
}