This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 8d906c48e86352fbb351d72c476c164e82553456 Author: Pxl <[email protected]> AuthorDate: Thu Feb 1 10:39:02 2024 +0800 [Bug](insert) try to fix invalid slot when insert (#30570) try to fix invalid slot when insert --- fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java | 11 +++++++++++ .../main/java/org/apache/doris/analysis/FunctionCallExpr.java | 8 ++++++-- .../main/java/org/apache/doris/planner/OriginalPlanner.java | 10 ++-------- .../src/test/java/org/apache/doris/planner/QueryPlanTest.java | 4 ++-- .../datatype_p0/agg_state/max/test_agg_state_max.groovy | 2 +- 5 files changed, 22 insertions(+), 13 deletions(-) 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 c2341b8eead..d1ea7f33e82 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<Expr> implements ParseNode, Cloneabl if (this.type.isAggStateType()) { List<Type> subTypes = ((AggStateType) targetType).getSubTypes(); + List<Boolean> subNullables = ((AggStateType) targetType).getSubTypeNullables(); if (this instanceof FunctionCallExpr) { if (subTypes.size() != getChildren().size()) { @@ -1549,6 +1550,16 @@ public abstract class Expr extends TreeNode<Expr> 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 6d20717f63f..4273b4b56e9 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 4e8fb7a4ead..3f79ae6cba2 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<Expr> exprs = statement.getResultExprs(); - if (analyzer.getContext().getConnectionId() == 0) { - // stream load tvf - rootFragment.setOutputExprs(exprs); - } else { - List<Expr> resExprs = Expr.substituteList(exprs, rootFragment.getPlanRoot().getOutputSmap(), analyzer, - true); - rootFragment.setOutputExprs(resExprs); - } + rootFragment.setOutputExprs( + Expr.substituteList(exprs, rootFragment.getPlanRoot().getOutputSmap(), analyzer, true)); } else { List<Expr> 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 c36622268ba..fa7fba57482 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(<slot 4> <slot 2> 3 AS INT)\n" + " CAST(<slot 5> <slot 3> 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 edec5642ae9..45b6e5463e9 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 --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
