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 59ac3754fb0 Reduce column extractor allocations (#38792)
59ac3754fb0 is described below

commit 59ac3754fb09af71faa128ec0d5c26137945ce91
Author: ZhangCheng <[email protected]>
AuthorDate: Thu Jun 4 10:02:24 2026 +0800

    Reduce column extractor allocations (#38792)
---
 .../statement/core/extractor/ColumnExtractor.java  | 70 ++++++++++++++--------
 1 file changed, 44 insertions(+), 26 deletions(-)

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 afe8e8ab5e3..2ad3cadff93 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
@@ -75,49 +75,66 @@ public final class ColumnExtractor {
      */
     public static Collection<ColumnSegment> extract(final ExpressionSegment 
expression) {
         Collection<ColumnSegment> result = new LinkedHashSet<>();
+        extract(expression, result);
+        return result;
+    }
+    
+    private static void extract(final ExpressionSegment expression, final 
Collection<ColumnSegment> result) {
         if (expression instanceof ColumnSegment) {
             result.add((ColumnSegment) expression);
+            return;
         }
         if (expression instanceof BinaryOperationExpression) {
             
extractColumnsInBinaryOperationExpression((BinaryOperationExpression) 
expression, result);
+            return;
         }
         if (expression instanceof InExpression) {
             extractColumnsInInExpression((InExpression) expression, result);
+            return;
         }
         if (expression instanceof BetweenExpression) {
             extractColumnsInBetweenExpression((BetweenExpression) expression, 
result);
+            return;
         }
         if (expression instanceof AggregationProjectionSegment) {
             
extractColumnsInAggregationProjectionSegment((AggregationProjectionSegment) 
expression, result);
+            return;
         }
         if (expression instanceof FunctionSegment) {
             extractColumnsInFunctionSegment((FunctionSegment) expression, 
result);
+            return;
         }
         if (expression instanceof XmlElementFunctionSegment) {
             
extractColumnsInXmlElementFunctionSegment((XmlElementFunctionSegment) 
expression, result);
+            return;
         }
         if (expression instanceof XmlSerializeFunctionSegment) {
-            result.addAll(extract(((XmlSerializeFunctionSegment) 
expression).getParameter()));
+            extract(((XmlSerializeFunctionSegment) expression).getParameter(), 
result);
+            return;
         }
         if (expression instanceof CaseWhenExpression) {
             extractColumnsInCaseWhenExpression((CaseWhenExpression) 
expression, result);
+            return;
         }
         if (expression instanceof NotExpression) {
-            result.addAll(extract(((NotExpression) 
expression).getExpression()));
+            extract(((NotExpression) expression).getExpression(), result);
+            return;
         }
         if (expression instanceof UnaryOperationExpression) {
-            result.addAll(extract(((UnaryOperationExpression) 
expression).getExpression()));
+            extract(((UnaryOperationExpression) expression).getExpression(), 
result);
+            return;
         }
         if (expression instanceof CollateExpression) {
-            ((CollateExpression) expression).getExpr().ifPresent(optional -> 
result.addAll(extract(optional)));
+            ((CollateExpression) expression).getExpr().ifPresent(optional -> 
extract(optional, result));
+            return;
         }
         if (expression instanceof RowExpression) {
             extractColumnsInRowExpression((RowExpression) expression, result);
+            return;
         }
         if (expression instanceof ListExpression) {
             extractColumnsInListExpression((ListExpression) expression, 
result);
         }
-        return result;
     }
     
     /**
@@ -127,7 +144,7 @@ public final class ColumnExtractor {
      * @return column segments
      */
     public static Collection<ColumnSegment> extractReturnedColumns(final 
ExpressionSegment expression) {
-        Collection<ColumnSegment> result = new LinkedList<>();
+        Collection<ColumnSegment> result = new LinkedHashSet<>();
         if (expression instanceof ExpressionProjectionSegment) {
             
result.addAll(extractReturnedColumns(((ExpressionProjectionSegment) 
expression).getExpr()));
         }
@@ -153,20 +170,20 @@ public final class ColumnExtractor {
     
     private static void extractColumnsInCaseWhenExpression(final 
CaseWhenExpression expression, final Collection<ColumnSegment> result) {
         if (null != expression.getCaseExpr()) {
-            
result.addAll(extractIncludeColumnSegment(expression.getCaseExpr()));
+            extract(expression.getCaseExpr(), result);
         }
         if (null != expression.getWhenExprs()) {
             for (ExpressionSegment each : expression.getWhenExprs()) {
-                result.addAll(extractIncludeColumnSegment(each));
+                extract(each, result);
             }
         }
         if (null != expression.getThenExprs()) {
             for (ExpressionSegment each : expression.getThenExprs()) {
-                result.addAll(extractIncludeColumnSegment(each));
+                extract(each, result);
             }
         }
         if (null != expression.getElseExpr()) {
-            
result.addAll(extractIncludeColumnSegment(expression.getElseExpr()));
+            extract(expression.getElseExpr(), result);
         }
     }
     
@@ -174,8 +191,9 @@ public final class ColumnExtractor {
         Collection<ColumnSegment> result = new LinkedList<>();
         if (expression instanceof ColumnSegment) {
             result.add((ColumnSegment) expression);
+        } else {
+            extract(expression, result);
         }
-        result.addAll(extract(expression));
         return result;
     }
     
@@ -189,7 +207,7 @@ public final class ColumnExtractor {
         if (expression.getLeft() instanceof FunctionSegment) {
             extractColumnsInFunctionSegment((FunctionSegment) 
expression.getLeft(), result);
         }
-        result.addAll(extract(expression.getRight()));
+        extract(expression.getRight(), result);
     }
     
     private static void extractColumnsInBinaryOperationExpression(final 
BinaryOperationExpression expression, final Collection<ColumnSegment> result) {
@@ -205,8 +223,8 @@ public final class ColumnExtractor {
         if (expression.getRight() instanceof OuterJoinExpression) {
             result.add(((OuterJoinExpression) 
expression.getRight()).getColumnName());
         }
-        result.addAll(extract(expression.getLeft()));
-        result.addAll(extract(expression.getRight()));
+        extract(expression.getLeft(), result);
+        extract(expression.getRight(), result);
     }
     
     private static void extractColumnsInBetweenExpression(final 
BetweenExpression expression, final Collection<ColumnSegment> result) {
@@ -219,9 +237,9 @@ public final class ColumnExtractor {
         if (expression.getAndExpr() instanceof ColumnSegment) {
             result.add((ColumnSegment) expression.getAndExpr());
         }
-        result.addAll(extract(expression.getLeft()));
-        result.addAll(extract(expression.getBetweenExpr()));
-        result.addAll(extract(expression.getAndExpr()));
+        extract(expression.getLeft(), result);
+        extract(expression.getBetweenExpr(), result);
+        extract(expression.getAndExpr(), result);
     }
     
     private static void extractColumnsInRowExpression(final RowExpression 
expression, final Collection<ColumnSegment> result) {
@@ -229,7 +247,7 @@ public final class ColumnExtractor {
             if (each instanceof ColumnSegment) {
                 result.add((ColumnSegment) each);
             } else {
-                result.addAll(extract(each));
+                extract(each, result);
             }
         }
     }
@@ -239,7 +257,7 @@ public final class ColumnExtractor {
             if (each instanceof ColumnSegment) {
                 result.add((ColumnSegment) each);
             } else {
-                result.addAll(extract(each));
+                extract(each, result);
             }
         }
     }
@@ -249,7 +267,7 @@ public final class ColumnExtractor {
             if (each instanceof ColumnSegment) {
                 result.add((ColumnSegment) each);
             } else {
-                result.addAll(extract(each));
+                extract(each, result);
             }
         }
         expression.getWindow().ifPresent(optional -> 
extractColumnsInWindowItemSegment(optional, result));
@@ -260,7 +278,7 @@ public final class ColumnExtractor {
             if (each instanceof ColumnSegment) {
                 result.add((ColumnSegment) each);
             } else {
-                result.addAll(extract(each));
+                extract(each, result);
             }
         }
         expression.getWindow().ifPresent(optional -> 
extractColumnsInWindowItemSegment(optional, result));
@@ -269,14 +287,14 @@ public final class ColumnExtractor {
     private static void extractColumnsInWindowItemSegment(final 
WindowItemSegment windowItemSegment, final Collection<ColumnSegment> result) {
         if (null != windowItemSegment.getPartitionListSegments()) {
             for (ExpressionSegment each : 
windowItemSegment.getPartitionListSegments()) {
-                result.addAll(extract(each));
+                extract(each, result);
             }
         }
         if (null != windowItemSegment.getOrderBySegment()) {
             
extractColumnsInOrderBySegment(windowItemSegment.getOrderBySegment(), result);
         }
         if (null != windowItemSegment.getFrameClause()) {
-            result.addAll(extract(windowItemSegment.getFrameClause()));
+            extract(windowItemSegment.getFrameClause(), result);
         }
     }
     
@@ -286,17 +304,17 @@ public final class ColumnExtractor {
                 result.add(((ColumnOrderByItemSegment) each).getColumn());
             }
             if (each instanceof ExpressionOrderByItemSegment) {
-                result.addAll(extract(((ExpressionOrderByItemSegment) 
each).getExpr()));
+                extract(((ExpressionOrderByItemSegment) each).getExpr(), 
result);
             }
         }
     }
     
     private static void extractColumnsInXmlElementFunctionSegment(final 
XmlElementFunctionSegment expression, final Collection<ColumnSegment> result) {
         for (ExpressionSegment each : expression.getParameters()) {
-            result.addAll(extract(each));
+            extract(each, result);
         }
         for (ExpressionSegment each : expression.getXmlAttributes()) {
-            result.addAll(extract(each));
+            extract(each, result);
         }
     }
     

Reply via email to