From b6bc286d888f4aa64b80aca431b3d812874f1280 Mon Sep 17 00:00:00 2001 From: Andrew Stitcher Date: Fri, 15 Mar 2013 18:44:29 +0000 Subject: QPID-4623: Fixed unknown semantics of "between" comparison git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1457058 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/qpid/broker/SelectorExpression.cpp | 40 +++++++++---------------- qpid/cpp/src/tests/Selector.cpp | 5 ++++ 2 files changed, 19 insertions(+), 26 deletions(-) (limited to 'qpid/cpp') diff --git a/qpid/cpp/src/qpid/broker/SelectorExpression.cpp b/qpid/cpp/src/qpid/broker/SelectorExpression.cpp index 62de067396..8c6d82cc6f 100644 --- a/qpid/cpp/src/qpid/broker/SelectorExpression.cpp +++ b/qpid/cpp/src/qpid/broker/SelectorExpression.cpp @@ -184,17 +184,11 @@ public: BoolOrNone eval_bool(const SelectorEnv& env) const { BoolOrNone bn1(e1->eval_bool(env)); - if (bn1==BN_TRUE) { - return BN_TRUE; - } else { - BoolOrNone bn2(e2->eval_bool(env)); - if (bn2==BN_TRUE) { - return BN_TRUE; - } else { - if (bn1==BN_FALSE && bn2==BN_FALSE) return BN_FALSE; - else return BN_UNKNOWN; - } - } + if (bn1==BN_TRUE) return BN_TRUE; + BoolOrNone bn2(e2->eval_bool(env)); + if (bn2==BN_TRUE) return BN_TRUE; + if (bn1==BN_FALSE && bn2==BN_FALSE) return BN_FALSE; + else return BN_UNKNOWN; } }; @@ -214,17 +208,11 @@ public: BoolOrNone eval_bool(const SelectorEnv& env) const { BoolOrNone bn1(e1->eval_bool(env)); - if (bn1==BN_FALSE) { - return BN_FALSE; - } else { - BoolOrNone bn2(e2->eval_bool(env)); - if (bn2==BN_FALSE) { - return BN_FALSE; - } else { - if (bn1==BN_TRUE && bn2==BN_TRUE) return BN_TRUE; - else return BN_UNKNOWN; - } - } + if (bn1==BN_FALSE) return BN_FALSE; + BoolOrNone bn2(e2->eval_bool(env)); + if (bn2==BN_FALSE) return BN_FALSE; + if (bn1==BN_TRUE && bn2==BN_TRUE) return BN_TRUE; + else return BN_UNKNOWN; } }; @@ -340,11 +328,11 @@ public: Value ve(e->eval(env)); if (unknown(ve)) return BN_UNKNOWN; Value vl(l->eval(env)); - if (unknown(vl)) return BN_UNKNOWN; - if (veeval(env)); - if (unknown(vu)) return BN_UNKNOWN; - return BoolOrNone(ve<=vu); + if (!unknown(vu) && ve>vu) return BN_FALSE; + if (unknown(vl) || unknown(vu)) return BN_UNKNOWN; + return BN_TRUE; } }; diff --git a/qpid/cpp/src/tests/Selector.cpp b/qpid/cpp/src/tests/Selector.cpp index 1b0eea3d7e..288d8ee6c3 100644 --- a/qpid/cpp/src/tests/Selector.cpp +++ b/qpid/cpp/src/tests/Selector.cpp @@ -298,6 +298,11 @@ QPID_AUTO_TEST_CASE(numericEval) BOOST_CHECK(!qb::Selector("A<>17 and B=5.6e17").eval(env)); BOOST_CHECK(qb::Selector("A BETWEEN B and 98.5").eval(env)); BOOST_CHECK(!qb::Selector("B NOT BETWEEN 35 AND 100").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN B and 40").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN C and 40").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN 45 and C").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN 40 and C AND A NOT BETWEEN 40 and C").eval(env)); + BOOST_CHECK(!qb::Selector("A BETWEEN C and 45 AND A NOT BETWEEN C and 45").eval(env)); } QPID_AUTO_TEST_CASE(comparisonEval) -- cgit v1.2.1