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

Reply via email to