From d2d00574827c8cc8811c412e15122e0281d07d73 Mon Sep 17 00:00:00 2001 From: Alexandr Romanenko Date: Tue, 23 Apr 2024 23:56:58 +0300 Subject: [PATCH] fix: Error in optimization for nested boolean expressions --- datafusion/src/optimizer/simplify_expressions.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/datafusion/src/optimizer/simplify_expressions.rs b/datafusion/src/optimizer/simplify_expressions.rs index f629eaf95b5f..7c71ecde81dd 100644 --- a/datafusion/src/optimizer/simplify_expressions.rs +++ b/datafusion/src/optimizer/simplify_expressions.rs @@ -35,17 +35,27 @@ use crate::{error::Result, logical_plan::Operator}; pub struct SimplifyExpressions {} fn expr_contains(expr: &Expr, needle: &Expr) -> bool { + // We turned off the recursion becouse it lead to wrong optimizations like b > 2 and ((b > 2 and a=1) or (a = 3)) -> b > 2 + // expr == needle match expr { Expr::BinaryExpr { left, op: Operator::And, right, - } => expr_contains(left, needle) || expr_contains(right, needle), + } => { + // We turned off the recursion becouse it lead to wrong optimizations like b > 2 and ((b > 2 and a=1) or (a = 3)) -> b > 2 + left.as_ref() == needle || right.as_ref() == needle + //expr_contains(left, needle) || expr_contains(right, needle) + } Expr::BinaryExpr { left, op: Operator::Or, right, - } => expr_contains(left, needle) || expr_contains(right, needle), + } => { + // We turned off the recursion becouse it lead to wrong optimizations like b > 2 and ((b > 2 and a=1) or (a = 3)) -> b > 2 + left.as_ref() == needle || right.as_ref() == needle + //expr_contains(left, needle) || expr_contains(right, needle) + } _ => expr == needle, } }