diff --git a/datafusion/physical-expr/src/planner.rs b/datafusion/physical-expr/src/planner.rs index 010b61a9b3124..4226364c946be 100644 --- a/datafusion/physical-expr/src/planner.rs +++ b/datafusion/physical-expr/src/planner.rs @@ -29,7 +29,7 @@ use crate::{ use arrow::datatypes::{DataType, Schema}; use datafusion_common::{DFSchema, DataFusionError, Result, ScalarValue}; use datafusion_expr::binary_rule::comparison_coercion; -use datafusion_expr::{Expr, Operator}; +use datafusion_expr::{binary_expr, Expr, Operator}; use std::sync::Arc; /// Create a physical expression from a logical expression ([Expr]). @@ -83,6 +83,84 @@ pub fn create_physical_expr( } } } + Expr::IsTrue(expr) => { + let binary_op = binary_expr( + expr.as_ref().clone(), + Operator::IsNotDistinctFrom, + Expr::Literal(ScalarValue::Boolean(Some(true))), + ); + create_physical_expr( + &binary_op, + input_dfschema, + input_schema, + execution_props, + ) + } + Expr::IsNotTrue(expr) => { + let binary_op = binary_expr( + expr.as_ref().clone(), + Operator::IsDistinctFrom, + Expr::Literal(ScalarValue::Boolean(Some(true))), + ); + create_physical_expr( + &binary_op, + input_dfschema, + input_schema, + execution_props, + ) + } + Expr::IsFalse(expr) => { + let binary_op = binary_expr( + expr.as_ref().clone(), + Operator::IsNotDistinctFrom, + Expr::Literal(ScalarValue::Boolean(Some(false))), + ); + create_physical_expr( + &binary_op, + input_dfschema, + input_schema, + execution_props, + ) + } + Expr::IsNotFalse(expr) => { + let binary_op = binary_expr( + expr.as_ref().clone(), + Operator::IsDistinctFrom, + Expr::Literal(ScalarValue::Boolean(Some(false))), + ); + create_physical_expr( + &binary_op, + input_dfschema, + input_schema, + execution_props, + ) + } + Expr::IsUnknown(expr) => { + let binary_op = binary_expr( + expr.as_ref().clone(), + Operator::IsNotDistinctFrom, + Expr::Literal(ScalarValue::Boolean(None)), + ); + create_physical_expr( + &binary_op, + input_dfschema, + input_schema, + execution_props, + ) + } + Expr::IsNotUnknown(expr) => { + let binary_op = binary_expr( + expr.as_ref().clone(), + Operator::IsDistinctFrom, + Expr::Literal(ScalarValue::Boolean(None)), + ); + create_physical_expr( + &binary_op, + input_dfschema, + input_schema, + execution_props, + ) + } Expr::BinaryExpr { left, op, right } => { let lhs = create_physical_expr( left, diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs index 4a3b049b64e11..65e38973ee456 100644 --- a/datafusion/sql/src/planner.rs +++ b/datafusion/sql/src/planner.rs @@ -1945,41 +1945,17 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { right: Box::new(self.sql_expr_to_logical_expr(*right, schema, ctes)?), }), - SQLExpr::IsTrue(expr) => Ok(Expr::BinaryExpr { - left: Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?), - op: Operator::IsNotDistinctFrom, - right: Box::new(lit(true)), - }), + SQLExpr::IsTrue(expr) => Ok(Expr::IsTrue(Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?))), - SQLExpr::IsFalse(expr) => Ok(Expr::BinaryExpr { - left: Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?), - op: Operator::IsNotDistinctFrom, - right: Box::new(lit(false)), - }), + SQLExpr::IsFalse(expr) => Ok(Expr::IsFalse(Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?))), - SQLExpr::IsNotTrue(expr) => Ok(Expr::BinaryExpr { - left: Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?), - op: Operator::IsDistinctFrom, - right: Box::new(lit(true)), - }), + SQLExpr::IsNotTrue(expr) => Ok(Expr::IsNotTrue(Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?))), - SQLExpr::IsNotFalse(expr) => Ok(Expr::BinaryExpr { - left: Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?), - op: Operator::IsDistinctFrom, - right: Box::new(lit(false)), - }), + SQLExpr::IsNotFalse(expr) => Ok(Expr::IsNotFalse(Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?))), - SQLExpr::IsUnknown(expr) => Ok(Expr::BinaryExpr { - left: Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?), - op: Operator::IsNotDistinctFrom, - right: Box::new(lit(ScalarValue::Boolean(None))), - }), + SQLExpr::IsUnknown(expr) => Ok(Expr::IsUnknown(Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?))), - SQLExpr::IsNotUnknown(expr) => Ok(Expr::BinaryExpr { - left: Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?), - op: Operator::IsDistinctFrom, - right: Box::new(lit(ScalarValue::Boolean(None))), - }), + SQLExpr::IsNotUnknown(expr) => Ok(Expr::IsNotUnknown(Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?))), SQLExpr::UnaryOp { op, expr } => self.parse_sql_unary_op(op, *expr, schema, ctes),