From 1fb3b0e05c78a94a941da18912eb5ddb10469964 Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Wed, 29 Jun 2022 15:16:39 -0700 Subject: [PATCH 1/2] Fix nullability calculation for CASE statements --- datafusion/expr/src/expr_schema.rs | 5 ++++- datafusion/physical-expr/src/expressions/case.rs | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/datafusion/expr/src/expr_schema.rs b/datafusion/expr/src/expr_schema.rs index 2433024e38a..c8945ffed26 100644 --- a/datafusion/expr/src/expr_schema.rs +++ b/datafusion/expr/src/expr_schema.rs @@ -170,7 +170,10 @@ impl ExprSchemable for Expr { } else if let Some(e) = else_expr { e.nullable(input_schema) } else { - Ok(false) + println!("AAL IN none else expr"); + // CASE produces NULL if there is no `else` expr + // (aka when none of the `when_then_exprs` match) + Ok(true) } } Expr::Cast { expr, .. } => expr.nullable(input_schema), diff --git a/datafusion/physical-expr/src/expressions/case.rs b/datafusion/physical-expr/src/expressions/case.rs index d2a0fac9948..7d191967359 100644 --- a/datafusion/physical-expr/src/expressions/case.rs +++ b/datafusion/physical-expr/src/expressions/case.rs @@ -243,7 +243,9 @@ impl PhysicalExpr for CaseExpr { } else if let Some(e) = &self.else_expr { e.nullable(input_schema) } else { - Ok(false) + // CASE produces NULL if there is no `else` expr + // (aka when none of the `when_then_exprs` match) + Ok(true) } } From a7b17d92ce3758970ded328f7f57a98b990c3563 Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Wed, 29 Jun 2022 18:25:10 -0400 Subject: [PATCH 2/2] Remove println --- datafusion/expr/src/expr_schema.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/datafusion/expr/src/expr_schema.rs b/datafusion/expr/src/expr_schema.rs index c8945ffed26..bbb414655c2 100644 --- a/datafusion/expr/src/expr_schema.rs +++ b/datafusion/expr/src/expr_schema.rs @@ -170,7 +170,6 @@ impl ExprSchemable for Expr { } else if let Some(e) = else_expr { e.nullable(input_schema) } else { - println!("AAL IN none else expr"); // CASE produces NULL if there is no `else` expr // (aka when none of the `when_then_exprs` match) Ok(true)