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 8b2364668795b7..3f9d2e01cd898c 100755 --- 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 @@ -1710,4 +1710,13 @@ public Expr getResultValue() throws AnalysisException { final Expr newExpr = ExpressionFunctions.INSTANCE.evalExpr(this); return newExpr != null ? newExpr : this; } + + /** + * For excute expr the result is nullable + * TODO: Now only SlotRef and LiteralExpr overwrite the method, each child of Expr should + * overwrite this method to plan correct + */ + public boolean isNullable() { + return true; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java index 4e3cb88e6e2c26..a498e36b5e5277 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java @@ -266,9 +266,8 @@ public TupleDescriptor createTupleDescriptor(Analyzer analyzer) throws AnalysisE } columnSet.add(colAlias); - // TODO: inlineView threat all column is nullable to make sure query results are correct - // we should judge column whether is nullable by selectItemExpr in the future - columnList.add(new Column(colAlias, selectItemExpr.getType().getPrimitiveType(), true)); + columnList.add(new Column(colAlias, selectItemExpr.getType().getPrimitiveType(), + selectItemExpr.isNullable())); } InlineView inlineView = (view != null) ? new InlineView(view, columnList) : new InlineView(getExplicitAlias(), columnList); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java index f6ab8f669e0195..40b89b3c14c4ed 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java @@ -194,5 +194,10 @@ public boolean equals(Object obj) { } return this.compareLiteral(((LiteralExpr) obj)) == 0; } + + @Override + public boolean isNullable() { + return this instanceof NullLiteral; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java index 17f1d5a86455d7..a08b9b633c663f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java @@ -218,6 +218,7 @@ public int getSlotOffset() { * Initializes a slot by setting its source expression information */ public void initFromExpr(Expr expr) { + setIsNullable(expr.isNullable()); setLabel(expr.toSql()); Preconditions.checkState(sourceExprs_.isEmpty()); setSourceExpr(expr); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java index cd52ef6de07808..006beffe2d840a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java @@ -401,4 +401,9 @@ public static SlotRef read(DataInput in) throws IOException { slotRef.readFields(in); return slotRef; } + + @Override + public boolean isNullable() { + return desc.getIsNullable(); + } }