From 462336ff78b48a21016b14fc5045f4874b57535d Mon Sep 17 00:00:00 2001 From: Josipmrden Date: Mon, 11 Mar 2024 22:44:15 +0100 Subject: [PATCH] Fix early exit for OR expression (#1738) --- src/query/interpret/eval.hpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/query/interpret/eval.hpp b/src/query/interpret/eval.hpp index fe47a3fcd..2a9fb289f 100644 --- a/src/query/interpret/eval.hpp +++ b/src/query/interpret/eval.hpp @@ -226,7 +226,6 @@ class ExpressionEvaluator : public ExpressionVisitor { } \ } - BINARY_OPERATOR_VISITOR(OrOperator, ||, OR); BINARY_OPERATOR_VISITOR(XorOperator, ^, XOR); BINARY_OPERATOR_VISITOR(AdditionOperator, +, +); BINARY_OPERATOR_VISITOR(SubtractionOperator, -, -); @@ -261,6 +260,20 @@ class ExpressionEvaluator : public ExpressionVisitor { } } + TypedValue Visit(OrOperator &op) override { + auto value1 = op.expression1_->Accept(*this); + if (value1.IsBool() && value1.ValueBool()) { + // If first expression is true, don't evaluate the second one. + return value1; + } + auto value2 = op.expression2_->Accept(*this); + try { + return value1 || value2; + } catch (const TypedValueException &) { + throw QueryRuntimeException("Invalid types: {} and {} for OR.", value1.type(), value2.type()); + } + } + TypedValue Visit(IfOperator &if_operator) override { auto condition = if_operator.condition_->Accept(*this); if (condition.IsNull()) {