Skip to content

Commit 7dd83d4

Browse files
committed
Fix order by JSON column with other columns
1 parent 48433c0 commit 7dd83d4

File tree

4 files changed

+73
-8
lines changed

4 files changed

+73
-8
lines changed

src/Columns/ColumnObject.cpp

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,11 +1192,50 @@ MutableColumns ColumnObject::scatter(ColumnIndex num_columns, const Selector & s
11921192
return result_columns;
11931193
}
11941194

1195-
void ColumnObject::getPermutation(PermutationSortDirection, PermutationSortStability, size_t, int, Permutation & res) const
1195+
struct ColumnObject::ComparatorBase
11961196
{
1197-
/// Values in ColumnObject are not comparable.
1198-
res.resize(size());
1199-
iota(res.data(), res.size(), size_t(0));
1197+
const ColumnObject & parent;
1198+
int nan_direction_hint;
1199+
1200+
ComparatorBase(const ColumnObject & parent_, int nan_direction_hint_)
1201+
: parent(parent_), nan_direction_hint(nan_direction_hint_)
1202+
{
1203+
}
1204+
1205+
ALWAYS_INLINE int compare(size_t lhs, size_t rhs) const
1206+
{
1207+
int res = parent.compareAt(lhs, rhs, parent, nan_direction_hint);
1208+
1209+
return res;
1210+
}
1211+
};
1212+
1213+
void ColumnObject::getPermutation(PermutationSortDirection direction, PermutationSortStability stability,
1214+
size_t limit, int nan_direction_hint, Permutation & res) const
1215+
{
1216+
if (direction == IColumn::PermutationSortDirection::Ascending && stability == IColumn::PermutationSortStability::Unstable)
1217+
getPermutationImpl(limit, res, ComparatorAscendingUnstable(*this, nan_direction_hint), DefaultSort(), DefaultPartialSort());
1218+
else if (direction == IColumn::PermutationSortDirection::Ascending && stability == IColumn::PermutationSortStability::Stable)
1219+
getPermutationImpl(limit, res, ComparatorAscendingStable(*this, nan_direction_hint), DefaultSort(), DefaultPartialSort());
1220+
else if (direction == IColumn::PermutationSortDirection::Descending && stability == IColumn::PermutationSortStability::Unstable)
1221+
getPermutationImpl(limit, res, ComparatorDescendingUnstable(*this, nan_direction_hint), DefaultSort(), DefaultPartialSort());
1222+
else if (direction == IColumn::PermutationSortDirection::Descending && stability == IColumn::PermutationSortStability::Stable)
1223+
getPermutationImpl(limit, res, ComparatorDescendingStable(*this, nan_direction_hint), DefaultSort(), DefaultPartialSort());
1224+
}
1225+
1226+
void ColumnObject::updatePermutation(PermutationSortDirection direction, PermutationSortStability stability,
1227+
size_t limit, int nan_direction_hint, Permutation & res, EqualRanges & equal_ranges) const
1228+
{
1229+
auto comparator_equal = ComparatorEqual(*this, nan_direction_hint);
1230+
1231+
if (direction == IColumn::PermutationSortDirection::Ascending && stability == IColumn::PermutationSortStability::Unstable)
1232+
updatePermutationImpl(limit, res, equal_ranges, ComparatorAscendingUnstable(*this, nan_direction_hint), comparator_equal, DefaultSort(), DefaultPartialSort());
1233+
else if (direction == IColumn::PermutationSortDirection::Ascending && stability == IColumn::PermutationSortStability::Stable)
1234+
updatePermutationImpl(limit, res, equal_ranges, ComparatorAscendingStable(*this, nan_direction_hint), comparator_equal, DefaultSort(), DefaultPartialSort());
1235+
else if (direction == IColumn::PermutationSortDirection::Descending && stability == IColumn::PermutationSortStability::Unstable)
1236+
updatePermutationImpl(limit, res, equal_ranges, ComparatorDescendingUnstable(*this, nan_direction_hint), comparator_equal, DefaultSort(), DefaultPartialSort());
1237+
else if (direction == IColumn::PermutationSortDirection::Descending && stability == IColumn::PermutationSortStability::Stable)
1238+
updatePermutationImpl(limit, res, equal_ranges, ComparatorDescendingStable(*this, nan_direction_hint), comparator_equal, DefaultSort(), DefaultPartialSort());
12001239
}
12011240

12021241
void ColumnObject::reserve(size_t n)

src/Columns/ColumnObject.h

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,22 @@ class ColumnObject final : public COWHelper<IColumnHelper<ColumnObject>, ColumnO
4040

4141
using StatisticsPtr = std::shared_ptr<const Statistics>;
4242

43+
struct ComparatorBase;
44+
45+
using ComparatorAscendingUnstable = ComparatorAscendingUnstableImpl<ComparatorBase>;
46+
using ComparatorAscendingStable = ComparatorAscendingStableImpl<ComparatorBase>;
47+
using ComparatorDescendingUnstable = ComparatorDescendingUnstableImpl<ComparatorBase>;
48+
using ComparatorDescendingStable = ComparatorDescendingStableImpl<ComparatorBase>;
49+
using ComparatorEqual = ComparatorEqualImpl<ComparatorBase>;
50+
51+
struct ComparatorCollationBase;
52+
53+
using ComparatorCollationAscendingUnstable = ComparatorAscendingUnstableImpl<ComparatorCollationBase>;
54+
using ComparatorCollationAscendingStable = ComparatorAscendingStableImpl<ComparatorCollationBase>;
55+
using ComparatorCollationDescendingUnstable = ComparatorDescendingUnstableImpl<ComparatorCollationBase>;
56+
using ComparatorCollationDescendingStable = ComparatorDescendingStableImpl<ComparatorCollationBase>;
57+
using ComparatorCollationEqual = ComparatorEqualImpl<ComparatorCollationBase>;
58+
4359
private:
4460
friend class COWHelper<IColumnHelper<ColumnObject>, ColumnObject>;
4561

@@ -142,11 +158,11 @@ class ColumnObject final : public COWHelper<IColumnHelper<ColumnObject>, ColumnO
142158
ColumnPtr replicate(const Offsets & replicate_offsets) const override;
143159
MutableColumns scatter(ColumnIndex num_columns, const Selector & selector) const override;
144160

145-
void getPermutation(PermutationSortDirection, PermutationSortStability, size_t, int, Permutation &) const override;
146-
void updatePermutation(PermutationSortDirection, PermutationSortStability, size_t, int, Permutation &, EqualRanges &) const override {}
161+
void getPermutation(PermutationSortDirection direction, PermutationSortStability stability,
162+
size_t limit, int nan_direction_hint, Permutation & res) const override;
163+
void updatePermutation(PermutationSortDirection direction, PermutationSortStability stability,
164+
size_t limit, int nan_direction_hint, Permutation & res, EqualRanges & equal_ranges) const override;
147165

148-
/// Values of ColumnObject are not comparable for less and greater functions.
149-
/// But we still support equal comparison.
150166
#if !defined(DEBUG_OR_SANITIZER_BUILD)
151167
int compareAt(size_t, size_t, const IColumn &, int nan_direction_hint) const override;
152168
#else
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{"a":"1"}
2+
{"a":"2"}
3+
{"a":"2"}
4+
{"a":"4"}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
drop table if exists test;
2+
create table test (json JSON) engine=Memory;
3+
insert into test values ('{"a" : 1}'), ('{"a" : 2}'), ('{"a" : 2}'), ('{"a" : 4}');
4+
select json, materialize('') from test order by all asc;
5+
drop table test;
6+

0 commit comments

Comments
 (0)