Use FieldVisitor to compare offsets in WindowFrame::checkValid

This commit is contained in:
vdimir 2021-07-08 12:24:08 +03:00
parent 39de7f8a2a
commit 71d0682a2b
No known key found for this signature in database
GPG Key ID: F57B3E10A21DBB31
2 changed files with 16 additions and 2 deletions

View File

@ -117,4 +117,16 @@ public:
}
};
class FieldVisitorAccurateLessOrEqual : public StaticVisitor<bool>
{
public:
template <typename T, typename U>
bool operator()(const T & l, const U & r) const
{
auto less_cmp = FieldVisitorAccurateLess();
return !less_cmp(r, l);
}
};
}

View File

@ -1,6 +1,7 @@
#include <Interpreters/WindowDescription.h>
#include <Core/Field.h>
#include <Common/FieldVisitorsAccurateComparison.h>
#include <Common/FieldVisitorToString.h>
#include <IO/Operators.h>
#include <Parsers/ASTFunction.h>
@ -160,7 +161,8 @@ void WindowFrame::checkValid() const
bool begin_less_equal_end;
if (begin_preceding && end_preceding)
{
begin_less_equal_end = begin_offset.get<Int64>() >= end_offset.get<Int64>();
/// we can't compare Fields using operator<= if fields have different types
begin_less_equal_end = applyVisitor(FieldVisitorAccurateLessOrEqual(), end_offset, begin_offset);
}
else if (begin_preceding && !end_preceding)
{
@ -172,7 +174,7 @@ void WindowFrame::checkValid() const
}
else /* if (!begin_preceding && !end_preceding) */
{
begin_less_equal_end = begin_offset.get<Int64>() <= end_offset.get<Int64>();
begin_less_equal_end = applyVisitor(FieldVisitorAccurateLessOrEqual(), begin_offset, end_offset);
}
if (!begin_less_equal_end)