From 76b3ae430122749f9d5e831cb799af4e48eecb37 Mon Sep 17 00:00:00 2001 From: Pavel Kruglov Date: Mon, 7 Jun 2021 17:09:05 +0300 Subject: [PATCH] Fix tests --- src/Columns/MaskOperations.cpp | 2 +- src/Interpreters/ExpressionActions.cpp | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Columns/MaskOperations.cpp b/src/Columns/MaskOperations.cpp index 630357c655a..780895714c4 100644 --- a/src/Columns/MaskOperations.cpp +++ b/src/Columns/MaskOperations.cpp @@ -136,7 +136,7 @@ MaskInfo getMaskFromColumn( bool use_value_from_expanding_mask = mask_used_in_expanding && (!(*mask_used_in_expanding)[i] ^ inverted_mask_used_in_expanding); if (use_value_from_expanding_mask) value = inverted ? !default_value_in_expanding : default_value_in_expanding; - else if (only_null || (null_bytemap && (*null_bytemap)[i])) + else if (only_null || (null_bytemap && (*null_bytemap)[column_index])) { value = inverted ? !null_value : null_value; if (nulls) diff --git a/src/Interpreters/ExpressionActions.cpp b/src/Interpreters/ExpressionActions.cpp index 004b075a342..6c5ad392ad1 100644 --- a/src/Interpreters/ExpressionActions.cpp +++ b/src/Interpreters/ExpressionActions.cpp @@ -129,12 +129,8 @@ void ExpressionActions::rewriteArgumentsForShortCircuitFunctions( size_t i = short_circuit_settings.enable_lazy_execution_for_first_argument ? 0 : 1; for (; i < node.children.size(); ++i) { - /// Prevent multiple execution in cases like (expr AND expr AND expr) - if (short_circuit_settings.enable_lazy_execution_for_first_argument || node.children[i] != node.children[0]) - { - queue.push_back(node.children[i]); - argument_ancestor[node.children[i]] = i; - } + queue.push_back(node.children[i]); + argument_ancestor[node.children[i]] = i; } need_outside[&node] = false; @@ -143,6 +139,12 @@ void ExpressionActions::rewriteArgumentsForShortCircuitFunctions( const ActionsDAG::Node * cur = queue.front(); queue.pop_front(); + /// If lazy execution is disabled for the first argument, we should check case + /// when the other arguments use it. + /// Examples: and(expr, expr), and(expr, expr1(..., expr, ...)) + if (!short_circuit_settings.enable_lazy_execution_for_first_argument && cur == node.children[0]) + continue; + bool is_need_outside = false; /// If action is used in result, we can't enable lazy execution. if (data[reverse_index.at(cur)].used_in_result)