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

yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new aac86b72a2c branch-4.0: [opt](complex type) support prune nested 
column through lateral view (#58776) (#59924)
aac86b72a2c is described below

commit aac86b72a2cbb955631236e491e8e1fe36a15d56
Author: 924060929 <[email protected]>
AuthorDate: Fri Jan 16 14:22:02 2026 +0800

    branch-4.0: [opt](complex type) support prune nested column through lateral 
view (#58776) (#59924)
    
    cherry pick from #58776
---
 .../rewrite/AccessPathExpressionCollector.java     |  17 ++-
 .../rules/rewrite/AccessPathPlanCollector.java     | 152 +++++++++++++++++++++
 .../nereids/rules/rewrite/SlotTypeReplacer.java    |   6 +
 .../expressions/functions/generator/Explode.java   |  11 +-
 .../generator/ExplodeJsonArrayDouble.java          |   3 +-
 .../generator/ExplodeJsonArrayDoubleOuter.java     |   3 +-
 .../functions/generator/ExplodeJsonArrayInt.java   |   3 +-
 .../generator/ExplodeJsonArrayIntOuter.java        |   3 +-
 .../functions/generator/ExplodeJsonArrayJson.java  |   3 +-
 .../generator/ExplodeJsonArrayJsonOuter.java       |   3 +-
 .../generator/ExplodeJsonArrayString.java          |   3 +-
 .../generator/ExplodeJsonArrayStringOuter.java     |   3 +-
 .../functions/generator/ExplodeMap.java            |   6 +-
 .../functions/generator/ExplodeOuter.java          |  10 +-
 .../functions/generator/ExplodeSplit.java          |   3 +-
 .../functions/generator/ExplodeSplitOuter.java     |   3 +-
 .../functions/generator/PosExplode.java            |  13 +-
 .../functions/generator/PosExplodeOuter.java       |  12 +-
 .../trees/expressions/literal/StructLiteral.java   |   3 +-
 .../rules/rewrite/PruneNestedColumnTest.java       | 141 +++++++++++++++++++
 .../functions/generator/ExplodeOuterTest.java      |  14 +-
 .../functions/generator/ExplodeTest.java           |  12 +-
 .../functions/generator/PosExplodeOuterTest.java   |  10 +-
 .../functions/generator/PosExplodeTest.java        |   8 +-
 24 files changed, 378 insertions(+), 67 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
index a46bc67a283..9ff9bfe998e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
@@ -437,9 +437,14 @@ public class AccessPathExpressionCollector extends 
DefaultExpressionVisitor<Void
         public void setType(TAccessPathType type) {
             this.type = type;
         }
+
+        public AccessPathBuilder getAccessPathBuilder() {
+            return accessPathBuilder;
+        }
     }
 
-    private static class AccessPathBuilder {
+    /** AccessPathBuilder */
+    public static class AccessPathBuilder {
         private LinkedList<String> accessPath;
 
         public AccessPathBuilder() {
@@ -451,6 +456,16 @@ public class AccessPathExpressionCollector extends 
DefaultExpressionVisitor<Void
             return this;
         }
 
+        public AccessPathBuilder addSuffix(String suffix) {
+            accessPath.addLast(suffix);
+            return this;
+        }
+
+        public AccessPathBuilder addSuffix(List<String> suffix) {
+            accessPath.addAll(suffix);
+            return this;
+        }
+
         public AccessPathBuilder removePrefix() {
             accessPath.removeFirst();
             return this;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathPlanCollector.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathPlanCollector.java
index ed253167b38..e525774961a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathPlanCollector.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathPlanCollector.java
@@ -17,18 +17,29 @@
 
 package org.apache.doris.nereids.rules.rewrite;
 
+import org.apache.doris.analysis.AccessPathInfo;
 import org.apache.doris.nereids.StatementContext;
 import 
org.apache.doris.nereids.rules.rewrite.AccessPathExpressionCollector.CollectAccessPathResult;
+import 
org.apache.doris.nereids.rules.rewrite.AccessPathExpressionCollector.CollectorContext;
 import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.functions.Function;
+import org.apache.doris.nereids.trees.expressions.functions.generator.Explode;
+import 
org.apache.doris.nereids.trees.expressions.functions.generator.ExplodeMap;
+import 
org.apache.doris.nereids.trees.expressions.functions.generator.ExplodeMapOuter;
+import 
org.apache.doris.nereids.trees.expressions.functions.generator.ExplodeOuter;
+import 
org.apache.doris.nereids.trees.expressions.functions.generator.PosExplode;
+import 
org.apache.doris.nereids.trees.expressions.functions.generator.PosExplodeOuter;
+import org.apache.doris.nereids.trees.expressions.literal.StructLiteral;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalCTEAnchor;
 import org.apache.doris.nereids.trees.plans.logical.LogicalCTEConsumer;
 import org.apache.doris.nereids.trees.plans.logical.LogicalCTEProducer;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFileScan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
+import org.apache.doris.nereids.trees.plans.logical.LogicalGenerate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.trees.plans.logical.LogicalTVFRelation;
@@ -45,6 +56,8 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeSet;
 
 /** AccessPathPlanCollector */
 public class AccessPathPlanCollector extends DefaultPlanVisitor<Void, 
StatementContext> {
@@ -56,6 +69,145 @@ public class AccessPathPlanCollector extends 
DefaultPlanVisitor<Void, StatementC
         return scanSlotToAccessPaths;
     }
 
+    @Override
+    public Void visitLogicalGenerate(LogicalGenerate<? extends Plan> generate, 
StatementContext context) {
+        List<Function> generators = generate.getGenerators();
+        List<Slot> output = generate.getGeneratorOutput();
+
+        AccessPathExpressionCollector exprCollector
+                = new AccessPathExpressionCollector(context, 
allSlotToAccessPaths, false);
+        for (int i = 0; i < output.size(); i++) {
+            Slot generatorOutput = output.get(i);
+            Function function = generators.get(i);
+            Collection<CollectAccessPathResult> accessPaths = 
allSlotToAccessPaths.get(
+                    generatorOutput.getExprId().asInt());
+            if (function instanceof Explode || function instanceof 
ExplodeOuter) {
+                if (accessPaths.isEmpty()) {
+                    // use the whole column
+                    for (Expression child : function.children()) {
+                        exprCollector.collect(child);
+                    }
+                } else {
+                    for (CollectAccessPathResult accessPath : accessPaths) {
+                        List<String> path = accessPath.getPath();
+                        if (function.arity() == 1) {
+                            // $c$1.VALUES.b
+                            CollectorContext argumentContext = new 
CollectorContext(context, false);
+                            argumentContext.setType(accessPath.getType());
+                            argumentContext.getAccessPathBuilder()
+                                    .addSuffix(AccessPathInfo.ACCESS_ALL)
+                                    .addSuffix(path.subList(1, path.size()));
+                            function.child(0).accept(exprCollector, 
argumentContext);
+                            continue;
+                        } else if (path.size() >= 2) {
+                            // $c$1.col1.VALUES.b will be extract 'col1'
+                            String colName = path.get(1);
+                            // extract '1' in 'col1'
+                            int colIndex = 
Integer.parseInt(colName.substring(StructLiteral.COL_PREFIX.length())) - 1;
+                            CollectorContext argumentContext = new 
CollectorContext(context, false);
+                            argumentContext.setType(accessPath.getType());
+                            argumentContext.getAccessPathBuilder()
+                                    .addSuffix(AccessPathInfo.ACCESS_ALL)
+                                    .addSuffix(path.subList(2, path.size()));
+                            function.child(colIndex).accept(exprCollector, 
argumentContext);
+                            continue;
+                        }
+                        // use the whole column
+                        for (Expression child : function.children()) {
+                            exprCollector.collect(child);
+                        }
+                    }
+                }
+            } else if (function instanceof ExplodeMap || function instanceof 
ExplodeMapOuter) {
+                if (accessPaths.isEmpty()) {
+                    // use the whole column
+                    for (Expression child : function.children()) {
+                        exprCollector.collect(child);
+                    }
+                } else {
+                    for (CollectAccessPathResult accessPath : accessPaths) {
+                        List<String> path = accessPath.getPath();
+                        if (path.size() >= 2) {
+                            if 
(path.get(1).equalsIgnoreCase(StructLiteral.COL_PREFIX + "1")) {
+                                // key
+                                for (Expression child : function.children()) {
+                                    CollectorContext argumentContext = new 
CollectorContext(context, false);
+                                    
argumentContext.setType(accessPath.getType());
+                                    argumentContext.getAccessPathBuilder()
+                                            
.addSuffix(AccessPathInfo.ACCESS_MAP_KEYS)
+                                            .addSuffix(path.subList(2, 
path.size()));
+                                    child.accept(exprCollector, 
argumentContext);
+                                }
+                                continue;
+                            } else if 
(path.get(1).equalsIgnoreCase(StructLiteral.COL_PREFIX + "2")) {
+                                // value
+                                for (Expression child : function.children()) {
+                                    CollectorContext argumentContext = new 
CollectorContext(context, false);
+                                    
argumentContext.setType(accessPath.getType());
+                                    argumentContext.getAccessPathBuilder()
+                                            
.addSuffix(AccessPathInfo.ACCESS_MAP_VALUES)
+                                            .addSuffix(path.subList(2, 
path.size()));
+                                    child.accept(exprCollector, 
argumentContext);
+                                }
+                                continue;
+                            }
+                        }
+                        // use the whole column
+                        exprCollector.collect(function.child(0));
+                    }
+                }
+            } else if (function instanceof PosExplode || function instanceof 
PosExplodeOuter) {
+                if (accessPaths.isEmpty()) {
+                    // use the whole column
+                    for (Expression child : function.children()) {
+                        exprCollector.collect(child);
+                    }
+                } else {
+                    boolean useWholeItem = false;
+                    Set<Integer> prunedChildIndex = new TreeSet<>();
+                    for (CollectAccessPathResult accessPath : accessPaths) {
+                        List<String> path = accessPath.getPath();
+                        if (path.size() >= 2) {
+                            // $c$1.col1.VALUES.b will be extract 'col1'
+                            String colName = path.get(1);
+                            if (colName.startsWith(StructLiteral.COL_PREFIX)) {
+                                // $c$1.col1.VALUES.b will be extract 'col1'
+                                // extract '1' in 'col1'
+                                int colIndex
+                                        = 
Integer.parseInt(colName.substring(StructLiteral.COL_PREFIX.length())) - 1;
+                                CollectorContext argumentContext = new 
CollectorContext(context, false);
+                                argumentContext.setType(accessPath.getType());
+                                argumentContext.getAccessPathBuilder()
+                                        .addSuffix(AccessPathInfo.ACCESS_ALL)
+                                        .addSuffix(path.subList(2, 
path.size()));
+                                function.child(colIndex).accept(exprCollector, 
argumentContext);
+                                prunedChildIndex.add(colIndex);
+                            }
+                        } else {
+                            useWholeItem = true;
+                            break;
+                        }
+                    }
+                    if (useWholeItem) {
+                        // use the whole column
+                        for (Expression child : function.children()) {
+                            exprCollector.collect(child);
+                        }
+                    } else {
+                        for (int j = 0; j < function.arity(); j++) {
+                            if (!prunedChildIndex.contains(j)) {
+                                exprCollector.collect(function.child(j));
+                            }
+                        }
+                    }
+                }
+            } else {
+                exprCollector.collect(function);
+            }
+        }
+        return generate.child().accept(this, context);
+    }
+
     @Override
     public Void visitLogicalProject(LogicalProject<? extends Plan> project, 
StatementContext context) {
         AccessPathExpressionCollector exprCollector
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SlotTypeReplacer.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SlotTypeReplacer.java
index 99ccdaf3309..7f34fe90f7e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SlotTypeReplacer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SlotTypeReplacer.java
@@ -325,6 +325,12 @@ public class SlotTypeReplacer extends 
DefaultPlanRewriter<Void> {
 
         Pair<Boolean, List<Function>> replacedGenerators
                 = replaceExpressions(generate.getGenerators(), false, false);
+        for (int i = 0; i < replacedGenerators.second.size(); i++) {
+            DataType dataType = replacedGenerators.second.get(i).getDataType();
+            
replacedDataTypes.put(generate.getGeneratorOutput().get(i).getExprId().asInt(),
+                    new AccessPathInfo(dataType, null, null)
+            );
+        }
         Pair<Boolean, List<Slot>> replacedGeneratorOutput
                 = replaceExpressions(generate.getGeneratorOutput(), false, 
false);
         if (replacedGenerators.first || replacedGeneratorOutput.first) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/Explode.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/Explode.java
index c8e23b2a0b7..c4a9901ed15 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/Explode.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/Explode.java
@@ -23,12 +23,14 @@ import 
org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import org.apache.doris.nereids.trees.expressions.functions.ComputePrecision;
 import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.functions.SearchSignature;
+import org.apache.doris.nereids.trees.expressions.literal.StructLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.NullType;
 import org.apache.doris.nereids.types.StructField;
 import org.apache.doris.nereids.types.StructType;
+import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -42,12 +44,11 @@ import java.util.List;
  * where the first column contains 1, 2, 3, and the second column contains 4, 
5, 6.
  */
 public class Explode extends TableGeneratingFunction implements 
CustomSignature, ComputePrecision, AlwaysNullable {
-
     /**
      * constructor with one or more argument.
      */
-    public Explode(Expression[] args) {
-        super("explode", args);
+    public Explode(Expression arg, Expression... others) {
+        super("explode", ExpressionUtils.mergeArguments(arg, others));
     }
 
     /** constructor for withChildren and reuse signature */
@@ -77,10 +78,10 @@ public class Explode extends TableGeneratingFunction 
implements CustomSignature,
             if (children.get(i).getDataType().isNullType()) {
                 arguments.add(ArrayType.of(NullType.INSTANCE));
                 structFields.add(
-                    new StructField("col" + (i + 1), NullType.INSTANCE, true, 
""));
+                    new StructField(StructLiteral.COL_PREFIX + (i + 1), 
NullType.INSTANCE, true, ""));
             } else if (children.get(i).getDataType().isArrayType()) {
                 structFields.add(
-                    new StructField("col" + (i + 1),
+                    new StructField(StructLiteral.COL_PREFIX + (i + 1),
                         ((ArrayType) 
(children.get(i)).getDataType()).getItemType(), true, ""));
                 arguments.add(children.get(i).getDataType());
             } else {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDouble.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDouble.java
index 6fb6dfb1c4c..8f544dd483e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDouble.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDouble.java
@@ -76,7 +76,6 @@ public class ExplodeJsonArrayDouble extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(DoubleType.INSTANCE))};
-        return new Explode(args);
+        return new Explode(new Cast(children.get(0), 
ArrayType.of(DoubleType.INSTANCE)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDoubleOuter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDoubleOuter.java
index a9246a58b5a..de7c7ac4707 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDoubleOuter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayDoubleOuter.java
@@ -76,7 +76,6 @@ public class ExplodeJsonArrayDoubleOuter extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(DoubleType.INSTANCE))};
-        return new ExplodeOuter(args);
+        return new ExplodeOuter(new Cast(children.get(0), 
ArrayType.of(DoubleType.INSTANCE)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayInt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayInt.java
index 367d3eca568..b19a18ed9a4 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayInt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayInt.java
@@ -76,7 +76,6 @@ public class ExplodeJsonArrayInt extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(BigIntType.INSTANCE))};
-        return new Explode(args);
+        return new Explode(new Cast(children.get(0), 
ArrayType.of(BigIntType.INSTANCE)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayIntOuter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayIntOuter.java
index f31deb98a91..e693114686d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayIntOuter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayIntOuter.java
@@ -76,7 +76,6 @@ public class ExplodeJsonArrayIntOuter extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(BigIntType.INSTANCE))};
-        return new ExplodeOuter(args);
+        return new ExplodeOuter(new Cast(children.get(0), 
ArrayType.of(BigIntType.INSTANCE)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJson.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJson.java
index f7d23f47c92..af94ab7f32b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJson.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJson.java
@@ -75,7 +75,6 @@ public class ExplodeJsonArrayJson extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(JsonType.INSTANCE))};
-        return new Explode(args);
+        return new Explode(new Cast(children.get(0), 
ArrayType.of(JsonType.INSTANCE)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJsonOuter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJsonOuter.java
index 8922ab58282..5985e36c003 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJsonOuter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayJsonOuter.java
@@ -75,7 +75,6 @@ public class ExplodeJsonArrayJsonOuter extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(JsonType.INSTANCE))};
-        return new ExplodeOuter(args);
+        return new ExplodeOuter(new Cast(children.get(0), 
ArrayType.of(JsonType.INSTANCE)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayString.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayString.java
index d5bfc169aa8..77900d6d359 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayString.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayString.java
@@ -76,7 +76,6 @@ public class ExplodeJsonArrayString extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(VarcharType.SYSTEM_DEFAULT))};
-        return new Explode(args);
+        return new Explode(new Cast(children.get(0), 
ArrayType.of(VarcharType.SYSTEM_DEFAULT)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayStringOuter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayStringOuter.java
index b5498212e1d..9728a375428 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayStringOuter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeJsonArrayStringOuter.java
@@ -76,7 +76,6 @@ public class ExplodeJsonArrayStringOuter extends 
TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new Cast(children.get(0), 
ArrayType.of(VarcharType.SYSTEM_DEFAULT))};
-        return new ExplodeOuter(args);
+        return new ExplodeOuter(new Cast(children.get(0), 
ArrayType.of(VarcharType.SYSTEM_DEFAULT)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeMap.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeMap.java
index f8067745404..68d9559e75a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeMap.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeMap.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import org.apache.doris.nereids.trees.expressions.literal.StructLiteral;
 import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.MapType;
@@ -70,10 +71,11 @@ public class ExplodeMap extends TableGeneratingFunction 
implements UnaryExpressi
 
     @Override
     public List<FunctionSignature> getSignatures() {
+        MapType dataType = (MapType) child().getDataType();
         return ImmutableList.of(
                 FunctionSignature.ret(new StructType(ImmutableList.of(
-                                new StructField("col1", ((MapType) 
child().getDataType()).getKeyType(), true, ""),
-                                new StructField("col2", ((MapType) 
child().getDataType()).getValueType(), true, ""))))
+                                new StructField(StructLiteral.COL_PREFIX + 
"1", dataType.getKeyType(), true, ""),
+                                new StructField(StructLiteral.COL_PREFIX + 
"2", dataType.getValueType(), true, ""))))
                         .args(child().getDataType())
         );
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuter.java
index 4a26ea14fb6..f3694c6b0c8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuter.java
@@ -23,12 +23,14 @@ import 
org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import org.apache.doris.nereids.trees.expressions.functions.ComputePrecision;
 import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.functions.SearchSignature;
+import org.apache.doris.nereids.trees.expressions.literal.StructLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.NullType;
 import org.apache.doris.nereids.types.StructField;
 import org.apache.doris.nereids.types.StructType;
+import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -46,8 +48,8 @@ public class ExplodeOuter extends TableGeneratingFunction 
implements CustomSigna
     /**
      * constructor with one or more argument.
      */
-    public ExplodeOuter(Expression[] args) {
-        super("explode_outer", args);
+    public ExplodeOuter(Expression arg, Expression... others) {
+        super("explode_outer", ExpressionUtils.mergeArguments(arg, others));
     }
 
     /** constructor for withChildren and reuse signature */
@@ -77,10 +79,10 @@ public class ExplodeOuter extends TableGeneratingFunction 
implements CustomSigna
             if (children.get(i).getDataType().isNullType()) {
                 arguments.add(ArrayType.of(NullType.INSTANCE));
                 structFields.add(
-                    new StructField("col" + (i + 1), NullType.INSTANCE, true, 
""));
+                    new StructField(StructLiteral.COL_PREFIX + (i + 1), 
NullType.INSTANCE, true, ""));
             } else if (children.get(i).getDataType().isArrayType()) {
                 structFields.add(
-                    new StructField("col" + (i + 1),
+                    new StructField(StructLiteral.COL_PREFIX + (i + 1),
                         ((ArrayType) 
(children.get(i)).getDataType()).getItemType(), true, ""));
                 arguments.add(children.get(i).getDataType());
             } else {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplit.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplit.java
index 87caf0f78f1..2c0cd5b20ad 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplit.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplit.java
@@ -75,7 +75,6 @@ public class ExplodeSplit extends TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new SplitByString(children.get(0), 
children.get(1))};
-        return new Explode(args);
+        return new Explode(new SplitByString(children.get(0), 
children.get(1)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplitOuter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplitOuter.java
index 7ecc54ca9ab..a3066227ddf 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplitOuter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeSplitOuter.java
@@ -75,7 +75,6 @@ public class ExplodeSplitOuter extends TableGeneratingFunction
 
     @Override
     public Expression rewriteWhenAnalyze() {
-        Expression[] args = {new SplitByString(children.get(0), 
children.get(1))};
-        return new ExplodeOuter(args);
+        return new ExplodeOuter(new SplitByString(children.get(0), 
children.get(1)));
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplode.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplode.java
index 8ff2de6f7bf..b5091c09f1d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplode.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplode.java
@@ -24,12 +24,14 @@ import 
org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import org.apache.doris.nereids.trees.expressions.functions.ComputePrecision;
 import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.functions.SearchSignature;
+import org.apache.doris.nereids.trees.expressions.literal.StructLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.nereids.types.StructField;
 import org.apache.doris.nereids.types.StructType;
+import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -43,12 +45,13 @@ import java.util.List;
  * value column: 'a', 'b', 'c'
  */
 public class PosExplode extends TableGeneratingFunction implements 
CustomSignature, ComputePrecision, AlwaysNullable {
+    public static final String POS_COLUMN = "pos";
 
     /**
      * constructor with one or more arguments.
      */
-    public PosExplode(Expression[] args) {
-        super("posexplode", args);
+    public PosExplode(Expression arg, Expression... others) {
+        super("posexplode", ExpressionUtils.mergeArguments(arg, others));
     }
 
     /** constructor for withChildren and reuse signature */
@@ -61,7 +64,7 @@ public class PosExplode extends TableGeneratingFunction 
implements CustomSignatu
      */
     @Override
     public PosExplode withChildren(List<Expression> children) {
-        Preconditions.checkArgument(children.size() == 1);
+        Preconditions.checkArgument(!children.isEmpty());
         return new PosExplode(getFunctionParams(children));
     }
 
@@ -84,11 +87,11 @@ public class PosExplode extends TableGeneratingFunction 
implements CustomSignatu
     public FunctionSignature customSignature() {
         List<DataType> arguments = new ArrayList<>();
         ImmutableList.Builder<StructField> structFields = 
ImmutableList.builder();
-        structFields.add(new StructField("pos", IntegerType.INSTANCE, false, 
""));
+        structFields.add(new StructField(POS_COLUMN, IntegerType.INSTANCE, 
false, ""));
         for (int i = 0; i < children.size(); i++) {
             if (children.get(i).getDataType().isArrayType()) {
                 structFields.add(
-                    new StructField("col" + (i + 1),
+                    new StructField(StructLiteral.COL_PREFIX + (i + 1),
                         ((ArrayType) 
(children.get(i)).getDataType()).getItemType(), true, ""));
                 arguments.add(children.get(i).getDataType());
             } else {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuter.java
index c6e0deeef5f..c071f702f45 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuter.java
@@ -24,12 +24,14 @@ import 
org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import org.apache.doris.nereids.trees.expressions.functions.ComputePrecision;
 import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
 import org.apache.doris.nereids.trees.expressions.functions.SearchSignature;
+import org.apache.doris.nereids.trees.expressions.literal.StructLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.nereids.types.StructField;
 import org.apache.doris.nereids.types.StructType;
+import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -48,8 +50,8 @@ public class PosExplodeOuter extends TableGeneratingFunction 
implements
     /**
      * constructor with one or more arguments.
      */
-    public PosExplodeOuter(Expression[] args) {
-        super("posexplode_outer", args);
+    public PosExplodeOuter(Expression arg, Expression... others) {
+        super("posexplode_outer", ExpressionUtils.mergeArguments(arg, others));
     }
 
     /** constructor for withChildren and reuse signature */
@@ -62,7 +64,7 @@ public class PosExplodeOuter extends TableGeneratingFunction 
implements
      */
     @Override
     public PosExplodeOuter withChildren(List<Expression> children) {
-        Preconditions.checkArgument(children.size() == 1);
+        Preconditions.checkArgument(!children.isEmpty());
         return new PosExplodeOuter(getFunctionParams(children));
     }
 
@@ -85,11 +87,11 @@ public class PosExplodeOuter extends 
TableGeneratingFunction implements
     public FunctionSignature customSignature() {
         List<DataType> arguments = new ArrayList<>();
         ImmutableList.Builder<StructField> structFields = 
ImmutableList.builder();
-        structFields.add(new StructField("pos", IntegerType.INSTANCE, false, 
""));
+        structFields.add(new StructField(PosExplode.POS_COLUMN, 
IntegerType.INSTANCE, false, ""));
         for (int i = 0; i < children.size(); i++) {
             if (children.get(i).getDataType().isArrayType()) {
                 structFields.add(
-                    new StructField("col" + (i + 1),
+                    new StructField(StructLiteral.COL_PREFIX + (i + 1),
                         ((ArrayType) 
(children.get(i)).getDataType()).getItemType(), true, ""));
                 arguments.add(children.get(i).getDataType());
             } else {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StructLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StructLiteral.java
index 2fb1f4c753d..0a4821405a7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StructLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StructLiteral.java
@@ -37,6 +37,7 @@ import java.util.stream.Collectors;
  * struct literal
  */
 public class StructLiteral extends Literal {
+    public static final String COL_PREFIX = "col";
 
     private final List<Literal> fields;
 
@@ -147,7 +148,7 @@ public class StructLiteral extends Literal {
     public static StructType constructStructType(List<DataType> fieldTypes) {
         ImmutableList.Builder<StructField> structFields = 
ImmutableList.builder();
         for (int i = 0; i < fieldTypes.size(); i++) {
-            structFields.add(new StructField("col" + (i + 1), 
fieldTypes.get(i), true, ""));
+            structFields.add(new StructField(COL_PREFIX + (i + 1), 
fieldTypes.get(i), true, ""));
         }
         return new StructType(structFields.build());
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java
index 6f987a6648c..4ff8a82cd7c 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java
@@ -384,6 +384,147 @@ public class PruneNestedColumnTest extends 
TestWithFeService implements MemoPatt
         );
     }
 
+    @Test
+    public void testExplode() throws Exception {
+        assertColumn("select 100 from tbl lateral view explode(s.data) t as 
item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item from tbl lateral view explode(s.data) t as 
item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data", "*")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select map_values(item)[1].a from tbl lateral view 
explode(s.data) t as item",
+                "struct<data:array<map<int,struct<a:int>>>>",
+                ImmutableList.of(path("s", "data", "*", "VALUES", "a")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select map_values(item)[1].b from tbl lateral view 
explode(s.data) t as item",
+                "struct<data:array<map<int,struct<b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "VALUES", "b")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select map_keys(item) from tbl lateral view 
explode(s.data) t as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "KEYS")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select map_keys(item), map_values(item)[1].b from tbl 
lateral view explode(s.data) t as item",
+                "struct<data:array<map<int,struct<b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "KEYS"), path("s", 
"data", "*", "VALUES", "b")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select map_values(item1)[1].b, map_values(item2)[1].a 
from tbl lateral view explode(s.data, s.data) t as item1, item2",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "VALUES", "a"), 
path("s", "data", "*", "VALUES", "b")),
+                ImmutableList.of()
+        );
+    }
+
+    @Test
+    public void testExplodeMap() throws Exception {
+        assertColumn("select 100 from tbl lateral view explode_map(s.data[1]) 
t as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data", "*")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item from tbl lateral view explode_map(s.data[1]) 
t as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data", "*")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.col1 from tbl lateral view 
explode_map(s.data[1]) t as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "KEYS")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.col2.a from tbl lateral view 
explode_map(s.data[1]) t as item",
+                "struct<data:array<map<int,struct<a:int>>>>",
+                ImmutableList.of(path("s", "data", "*", "VALUES", "a")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.col2.b from tbl lateral view 
explode_map(s.data[1]) t as item",
+                "struct<data:array<map<int,struct<b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "VALUES", "b")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.col1, item.col2.b from tbl lateral view 
explode_map(s.data[1]) t as item",
+                "struct<data:array<map<int,struct<b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "KEYS"), path("s", 
"data", "*", "VALUES", "b")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select k, v.b from tbl lateral view 
explode_map(s.data[1]) t as k, v",
+                "struct<data:array<map<int,struct<b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "KEYS"), path("s", 
"data", "*", "VALUES", "b")),
+                ImmutableList.of()
+        );
+    }
+
+    @Test
+    public void testPosExplode() throws Exception {
+        assertColumn("select 100 from tbl lateral view posexplode(s.data) t as 
item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item from tbl lateral view posexplode(s.data) t 
as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.col1[1].a from tbl lateral view 
posexplode(s.data) t as item",
+                "struct<data:array<map<int,struct<a:int>>>>",
+                ImmutableList.of(path("s", "data", "*", "*", "a")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item from tbl lateral view posexplode(s.data, 
s.data) t as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.pos from tbl lateral view posexplode(s.data, 
s.data) t as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.pos, item.col1[1].b from tbl lateral view 
posexplode(s.data) t as item",
+                "struct<data:array<map<int,struct<b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "*", "b")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.pos, item.col1[1].b, item.col2[1].b from tbl 
lateral view posexplode(s.data, s.data) t as item",
+                "struct<data:array<map<int,struct<b:double>>>>",
+                ImmutableList.of(path("s", "data", "*", "*", "b")),
+                ImmutableList.of()
+        );
+
+        assertColumn("select item.pos, item.col1[1].b from tbl lateral view 
posexplode(s.data, s.data) t as item",
+                "struct<data:array<map<int,struct<a:int,b:double>>>>",
+                ImmutableList.of(path("s", "data"), path("s", "data", "*", 
"*", "b")),
+                ImmutableList.of()
+        );
+    }
+
     @Test
     public void testUnion() throws Throwable {
         assertColumn("select coalesce(struct_element(s, 'city'), 'abc') from 
(select s from tbl union all select null)a",
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuterTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuterTest.java
index fd381a4e7d4..a4175dd6cd3 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuterTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeOuterTest.java
@@ -41,9 +41,10 @@ public class ExplodeOuterTest {
     @Test
     public void testGetSignatures() {
         // build explode_outer(array<int>, array<str>) expression
-        Expression[] args = {SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE)),
-            SlotReference.of("str", ArrayType.of(StringType.INSTANCE))};
-        ExplodeOuter explode = new ExplodeOuter(args);
+        Expression[] args = {SlotReference.of("str", 
ArrayType.of(StringType.INSTANCE))};
+        ExplodeOuter explode = new ExplodeOuter(
+                SlotReference.of("int", ArrayType.of(IntegerType.INSTANCE)), 
args
+        );
 
         // check signature
         List<FunctionSignature> signatures = explode.getSignatures();
@@ -64,8 +65,8 @@ public class ExplodeOuterTest {
     @Test
     public void testGetSignaturesWithNull() {
         // build explode(null, array<int>) expression
-        Expression[] args = { SlotReference.of("null", NullType.INSTANCE), 
SlotReference.of("int", ArrayType.of(IntegerType.INSTANCE))};
-        ExplodeOuter explode = new ExplodeOuter(args);
+        Expression[] args = { SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE))};
+        ExplodeOuter explode = new ExplodeOuter(SlotReference.of("null", 
NullType.INSTANCE), args);
 
         // check signature
         List<FunctionSignature> signatures = explode.getSignatures();
@@ -86,8 +87,7 @@ public class ExplodeOuterTest {
     @Test
     public void testGetSignaturesWithInvalidArgument() {
         // build explode_outer(int)
-        Expression[] args = { SlotReference.of("int", IntegerType.INSTANCE) };
-        ExplodeOuter explode = new ExplodeOuter(args);
+        ExplodeOuter explode = new ExplodeOuter(SlotReference.of("int", 
IntegerType.INSTANCE));
 
         Assertions.assertThrows(AnalysisException.class, 
explode::getSignatures);
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeTest.java
index 0cb61d6171a..665ea9ad039 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/ExplodeTest.java
@@ -41,9 +41,8 @@ public class ExplodeTest {
     @Test
     public void testGetSignatures() {
         // build explode(array<int>, array<str>) expression
-        Expression[] args = {SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE)),
-            SlotReference.of("str", ArrayType.of(StringType.INSTANCE))};
-        Explode explode = new Explode(args);
+        Expression[] args = {SlotReference.of("str", 
ArrayType.of(StringType.INSTANCE))};
+        Explode explode = new Explode(SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE)), args);
 
         // check signature
         List<FunctionSignature> signatures = explode.getSignatures();
@@ -64,8 +63,8 @@ public class ExplodeTest {
     @Test
     public void testGetSignaturesWithNull() {
         // build explode(null, array<int>) expression
-        Expression[] args = { SlotReference.of("null", NullType.INSTANCE), 
SlotReference.of("int", ArrayType.of(IntegerType.INSTANCE))};
-        Explode explode = new Explode(args);
+        Expression[] args = { SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE))};
+        Explode explode = new Explode(SlotReference.of("null", 
NullType.INSTANCE), args);
 
         // check signature
         List<FunctionSignature> signatures = explode.getSignatures();
@@ -86,8 +85,7 @@ public class ExplodeTest {
     @Test
     public void testGetSignaturesWithInvalidArgument() {
         // build explode(int)
-        Expression[] args = { SlotReference.of("int", IntegerType.INSTANCE) };
-        Explode explode = new Explode(args);
+        Explode explode = new Explode(SlotReference.of("int", 
IntegerType.INSTANCE));
 
         Assertions.assertThrows(AnalysisException.class, 
explode::getSignatures);
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuterTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuterTest.java
index 36447baba6f..94ce3e529ab 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuterTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeOuterTest.java
@@ -40,9 +40,10 @@ public class PosExplodeOuterTest {
     @Test
     public void testGetSignatures() {
         // build posexplode_outer(array<int>, array<str>) expression
-        Expression[] args = {SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE)),
-            SlotReference.of("str", ArrayType.of(StringType.INSTANCE))};
-        PosExplodeOuter explode = new PosExplodeOuter(args);
+        Expression[] args = {SlotReference.of("str", 
ArrayType.of(StringType.INSTANCE))};
+        PosExplodeOuter explode = new PosExplodeOuter(
+                SlotReference.of("int", ArrayType.of(IntegerType.INSTANCE)), 
args
+        );
 
         // check signature
         List<FunctionSignature> signatures = explode.getSignatures();
@@ -64,8 +65,7 @@ public class PosExplodeOuterTest {
     @Test
     public void testGetSignaturesWithInvalidArgument() {
         // build posexplode_outer(int)
-        Expression[] args = { SlotReference.of("int", IntegerType.INSTANCE) };
-        PosExplodeOuter explode = new PosExplodeOuter(args);
+        PosExplodeOuter explode = new PosExplodeOuter(SlotReference.of("int", 
IntegerType.INSTANCE));
 
         Assertions.assertThrows(AnalysisException.class, 
explode::getSignatures);
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeTest.java
index 0009363ba71..183e87e2129 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/generator/PosExplodeTest.java
@@ -40,9 +40,8 @@ public class PosExplodeTest {
     @Test
     public void testGetSignatures() {
         // build posexplode(array<int>, array<str>) expression
-        Expression[] args = {SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE)),
-            SlotReference.of("str", ArrayType.of(StringType.INSTANCE))};
-        PosExplode explode = new PosExplode(args);
+        Expression[] args = {SlotReference.of("str", 
ArrayType.of(StringType.INSTANCE))};
+        PosExplode explode = new PosExplode(SlotReference.of("int", 
ArrayType.of(IntegerType.INSTANCE)), args);
 
         // check signature
         List<FunctionSignature> signatures = explode.getSignatures();
@@ -64,8 +63,7 @@ public class PosExplodeTest {
     @Test
     public void testGetSignaturesWithInvalidArgument() {
         // build posexplode(int)
-        Expression[] args = { SlotReference.of("int", IntegerType.INSTANCE) };
-        PosExplode explode = new PosExplode(args);
+        PosExplode explode = new PosExplode(SlotReference.of("int", 
IntegerType.INSTANCE), new Expression[0]);
 
         Assertions.assertThrows(AnalysisException.class, 
explode::getSignatures);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to