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]

Reply via email to