This is an automated email from the ASF dual-hosted git repository.
panxiaolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 66d04307561 [Bug](insert) try to fix invalid slot when insert (#30570)
66d04307561 is described below
commit 66d043075612fa30e82d2210592a9ab5f35cbe25
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]