diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java index c2341b8eea..d1ea7f33e8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java @@ -1542,6 +1542,7 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl if (this.type.isAggStateType()) { List subTypes = ((AggStateType) targetType).getSubTypes(); + List subNullables = ((AggStateType) targetType).getSubTypeNullables(); if (this instanceof FunctionCallExpr) { if (subTypes.size() != getChildren().size()) { @@ -1549,6 +1550,16 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl } for (int i = 0; i < subTypes.size(); i++) { setChild(i, getChild(i).castTo(subTypes.get(i))); + if (getChild(i).isNullable() && !subNullables.get(i)) { + FunctionCallExpr newChild = new FunctionCallExpr("non_nullable", + Lists.newArrayList(getChild(i))); + newChild.analyzeImplForDefaultValue(subTypes.get(i)); + setChild(i, newChild); + } else if (!getChild(i).isNullable() && subNullables.get(i)) { + FunctionCallExpr newChild = new FunctionCallExpr("nullable", Lists.newArrayList(getChild(i))); + newChild.analyzeImplForDefaultValue(subTypes.get(i)); + setChild(i, newChild); + } } type = targetType; } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index 6d20717f63..4273b4b56e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -1361,8 +1361,12 @@ public class FunctionCallExpr extends Expr { * @throws AnalysisException */ public void analyzeImplForDefaultValue(Type type) throws AnalysisException { - fn = new Function(getBuiltinFunction(fnName.getFunction(), new Type[0], - Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF)); + Type[] childTypes = new Type[children.size()]; + for (int i = 0; i < children.size(); i++) { + childTypes[i] = children.get(i).type; + } + fn = new Function( + getBuiltinFunction(fnName.getFunction(), childTypes, Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF)); fn.setReturnType(type); this.type = type; for (int i = 0; i < children.size(); ++i) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java index 4e8fb7a4ea..3f79ae6cba 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java @@ -248,14 +248,8 @@ public class OriginalPlanner extends Planner { rootFragment.setSink(insertStmt.getDataSink()); insertStmt.complete(); List exprs = statement.getResultExprs(); - if (analyzer.getContext().getConnectionId() == 0) { - // stream load tvf - rootFragment.setOutputExprs(exprs); - } else { - List resExprs = Expr.substituteList(exprs, rootFragment.getPlanRoot().getOutputSmap(), analyzer, - true); - rootFragment.setOutputExprs(resExprs); - } + rootFragment.setOutputExprs( + Expr.substituteList(exprs, rootFragment.getPlanRoot().getOutputSmap(), analyzer, true)); } else { List resExprs = Expr.substituteList(queryStmt.getResultExprs(), rootFragment.getPlanRoot().getOutputSmap(), analyzer, false); diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index c36622268b..fa7fba5748 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -2062,8 +2062,8 @@ public class QueryPlanTest extends TestWithFeService { String explainString = getSQLPlanOrErrorMsg(queryStr); Assert.assertFalse(explainString.contains("OUTPUT EXPRS:\n 3\n 4")); System.out.println(explainString); - Assert.assertTrue(explainString, explainString - .contains("OUTPUT EXPRS:\n" + " CAST(`a`.`aid` AS INT)\n" + " CAST(`b`.`bid` AS INT)")); + Assert.assertTrue(explainString.contains( + "OUTPUT EXPRS:\n" + " CAST( 3 AS INT)\n" + " CAST( 4 AS INT)")); } @Test diff --git a/regression-test/suites/datatype_p0/agg_state/max/test_agg_state_max.groovy b/regression-test/suites/datatype_p0/agg_state/max/test_agg_state_max.groovy index edec5642ae..45b6e5463e 100644 --- a/regression-test/suites/datatype_p0/agg_state/max/test_agg_state_max.groovy +++ b/regression-test/suites/datatype_p0/agg_state/max/test_agg_state_max.groovy @@ -30,7 +30,7 @@ suite("test_agg_state_max") { test { sql "insert into a_table values(100,max_state(null));" - exception "State function meet input nullable column" + exception "which is illegal for non_nullable" } sql """insert into a_table