Skip to content

Commit d741624

Browse files
authored
Merge pull request ClickHouse#79166 from Avogar/agg-single-value-field
Avoid using Field in aggregation functions for types Dynamic/Variant/JSON
2 parents 97adf86 + 4c9b7a8 commit d741624

12 files changed

+258
-50
lines changed

src/AggregateFunctions/AggregateFunctionAny.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class AggregateFunctionAny final : public IAggregateFunctionDataHelper<Data, Agg
123123

124124
void deserialize(AggregateDataPtr place, ReadBuffer & buf, std::optional<size_t> /* version */, Arena * arena) const override
125125
{
126-
this->data(place).read(buf, *serialization, arena);
126+
this->data(place).read(buf, *serialization, this->result_type, arena);
127127
}
128128

129129
bool allocatesMemoryInArena() const override { return Data::allocatesMemoryInArena(); }
@@ -293,7 +293,7 @@ class AggregateFunctionAnyLast final : public IAggregateFunctionDataHelper<Data,
293293

294294
void deserialize(AggregateDataPtr place, ReadBuffer & buf, std::optional<size_t> /* version */, Arena * arena) const override
295295
{
296-
this->data(place).read(buf, *serialization, arena);
296+
this->data(place).read(buf, *serialization, this->result_type, arena);
297297
}
298298

299299
bool allocatesMemoryInArena() const override { return Data::allocatesMemoryInArena(); }

src/AggregateFunctions/AggregateFunctionAnyHeavy.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct AggregateFunctionAnyHeavyData
3636
throw Exception(ErrorCodes::LOGICAL_ERROR, "AggregateFunctionAnyHeavyData initialized empty");
3737
}
3838

39-
explicit AggregateFunctionAnyHeavyData(TypeIndex value_type) { generateSingleValueFromTypeIndex(value_type, v_data); }
39+
explicit AggregateFunctionAnyHeavyData(const DataTypePtr & value_type) { generateSingleValueFromType(value_type, v_data); }
4040

4141
~AggregateFunctionAnyHeavyData() { data().~SingleValueDataBase(); }
4242

@@ -88,9 +88,9 @@ struct AggregateFunctionAnyHeavyData
8888
writeBinaryLittleEndian(counter, buf);
8989
}
9090

91-
void read(ReadBuffer & buf, const ISerialization & serialization, Arena * arena)
91+
void read(ReadBuffer & buf, const ISerialization & serialization, const DataTypePtr & type, Arena * arena)
9292
{
93-
data().read(buf, serialization, arena);
93+
data().read(buf, serialization, type, arena);
9494
readBinaryLittleEndian(counter, buf);
9595
}
9696

@@ -102,17 +102,15 @@ class AggregateFunctionAnyHeavy final : public IAggregateFunctionDataHelper<Aggr
102102
{
103103
private:
104104
SerializationPtr serialization;
105-
const TypeIndex value_type_index;
106105

107106
public:
108107
explicit AggregateFunctionAnyHeavy(const DataTypePtr & type)
109108
: IAggregateFunctionDataHelper<AggregateFunctionAnyHeavyData, AggregateFunctionAnyHeavy>({type}, {}, type)
110109
, serialization(type->getDefaultSerialization())
111-
, value_type_index(WhichDataType(type).idx)
112110
{
113111
}
114112

115-
void create(AggregateDataPtr __restrict place) const override { new (place) AggregateFunctionAnyHeavyData(value_type_index); }
113+
void create(AggregateDataPtr __restrict place) const override { new (place) AggregateFunctionAnyHeavyData(result_type); }
116114

117115
String getName() const override { return "anyHeavy"; }
118116

@@ -138,10 +136,10 @@ class AggregateFunctionAnyHeavy final : public IAggregateFunctionDataHelper<Aggr
138136

139137
void deserialize(AggregateDataPtr place, ReadBuffer & buf, std::optional<size_t> /* version */, Arena * arena) const override
140138
{
141-
data(place).read(buf, *serialization, arena);
139+
data(place).read(buf, *serialization, result_type, arena);
142140
}
143141

144-
bool allocatesMemoryInArena() const override { return singleValueTypeAllocatesMemoryInArena(value_type_index); }
142+
bool allocatesMemoryInArena() const override { return singleValueTypeAllocatesMemoryInArena(result_type->getTypeId()); }
145143

146144
void insertResultInto(AggregateDataPtr __restrict place, IColumn & to, Arena *) const override
147145
{

src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ struct AggregateFunctionSingleValueOrNullData
3838
throw Exception(ErrorCodes::LOGICAL_ERROR, "AggregateFunctionSingleValueOrNullData initialized empty");
3939
}
4040

41-
explicit AggregateFunctionSingleValueOrNullData(TypeIndex value_type) { generateSingleValueFromTypeIndex(value_type, v_data); }
41+
explicit AggregateFunctionSingleValueOrNullData(const DataTypePtr & value_type) { generateSingleValueFromType(value_type, v_data); }
4242

4343
~AggregateFunctionSingleValueOrNullData() { data().~SingleValueDataBase(); }
4444

@@ -80,7 +80,7 @@ struct AggregateFunctionSingleValueOrNullData
8080
/// Fixing it requires a breaking change (but it's probably necessary)
8181
void write(WriteBuffer & buf, const ISerialization & serialization) const { data().write(buf, serialization); }
8282

83-
void read(ReadBuffer & buf, const ISerialization & serialization, Arena * arena) { data().read(buf, serialization, arena); }
83+
void read(ReadBuffer & buf, const ISerialization & serialization, const DataTypePtr & data_type, Arena * arena) { data().read(buf, serialization, data_type, arena); }
8484

8585
void insertResultInto(IColumn & to, const DataTypePtr & result_type) const
8686
{
@@ -103,18 +103,18 @@ class AggregateFunctionSingleValueOrNull final
103103
{
104104
private:
105105
SerializationPtr serialization;
106-
const TypeIndex value_type_index;
106+
const DataTypePtr value_type;
107107

108108
public:
109109
explicit AggregateFunctionSingleValueOrNull(const DataTypePtr & type)
110110
: IAggregateFunctionDataHelper<AggregateFunctionSingleValueOrNullData, AggregateFunctionSingleValueOrNull>(
111111
{type}, {}, makeNullable(type))
112112
, serialization(type->getDefaultSerialization())
113-
, value_type_index(WhichDataType(type).idx)
113+
, value_type(type)
114114
{
115115
}
116116

117-
void create(AggregateDataPtr __restrict place) const override { new (place) AggregateFunctionSingleValueOrNullData(value_type_index); }
117+
void create(AggregateDataPtr __restrict place) const override { new (place) AggregateFunctionSingleValueOrNullData(value_type); }
118118

119119
String getName() const override { return "singleValueOrNull"; }
120120

@@ -169,10 +169,10 @@ class AggregateFunctionSingleValueOrNull final
169169

170170
void deserialize(AggregateDataPtr place, ReadBuffer & buf, std::optional<size_t> /* version */, Arena * arena) const override
171171
{
172-
data(place).read(buf, *serialization, arena);
172+
data(place).read(buf, *serialization, result_type, arena);
173173
}
174174

175-
bool allocatesMemoryInArena() const override { return singleValueTypeAllocatesMemoryInArena(value_type_index); }
175+
bool allocatesMemoryInArena() const override { return singleValueTypeAllocatesMemoryInArena(value_type->getTypeId()); }
176176

177177
void insertResultInto(AggregateDataPtr __restrict place, IColumn & to, Arena *) const override
178178
{

src/AggregateFunctions/AggregateFunctionsArgMinArgMax.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct AggregateFunctionArgMinMaxData
3535
const ValueType & value() const { return value_data; }
3636

3737
AggregateFunctionArgMinMaxData() = default;
38-
explicit AggregateFunctionArgMinMaxData(TypeIndex) {}
38+
explicit AggregateFunctionArgMinMaxData(const DataTypePtr &) {}
3939

4040
static bool allocatesMemoryInArena(TypeIndex)
4141
{
@@ -61,9 +61,9 @@ struct AggregateFunctionArgMinMaxDataGeneric
6161
throw Exception(ErrorCodes::LOGICAL_ERROR, "AggregateFunctionArgMinMaxData initialized empty");
6262
}
6363

64-
explicit AggregateFunctionArgMinMaxDataGeneric(TypeIndex result_type) : value_data()
64+
explicit AggregateFunctionArgMinMaxDataGeneric(const DataTypePtr & result_type) : value_data()
6565
{
66-
generateSingleValueFromTypeIndex(result_type, result_data);
66+
generateSingleValueFromType(result_type, result_data);
6767
}
6868

6969
static bool allocatesMemoryInArena(TypeIndex result_type_index)
@@ -85,7 +85,9 @@ class AggregateFunctionArgMinMax final
8585
{
8686
private:
8787
const DataTypePtr & type_val;
88+
const DataTypePtr data_type_res;
8889
const SerializationPtr serialization_res;
90+
const DataTypePtr data_type_val;
8991
const SerializationPtr serialization_val;
9092
const TypeIndex result_type_index;
9193

@@ -96,7 +98,9 @@ class AggregateFunctionArgMinMax final
9698
explicit AggregateFunctionArgMinMax(const DataTypes & argument_types_)
9799
: Base(argument_types_, {}, argument_types_[0])
98100
, type_val(this->argument_types[1])
101+
, data_type_res(this->argument_types[0])
99102
, serialization_res(this->argument_types[0]->getDefaultSerialization())
103+
, data_type_val(this->argument_types[1])
100104
, serialization_val(this->argument_types[1]->getDefaultSerialization())
101105
, result_type_index(WhichDataType(this->argument_types[0]).idx)
102106
{
@@ -118,7 +122,7 @@ class AggregateFunctionArgMinMax final
118122

119123
void create(AggregateDataPtr __restrict place) const override /// NOLINT
120124
{
121-
new (place) Data(result_type_index);
125+
new (place) Data(data_type_res);
122126
}
123127

124128
String getName() const override
@@ -229,8 +233,8 @@ class AggregateFunctionArgMinMax final
229233

230234
void deserialize(AggregateDataPtr __restrict place, ReadBuffer & buf, std::optional<size_t> /* version */, Arena * arena) const override
231235
{
232-
this->data(place).result().read(buf, *serialization_res, arena);
233-
this->data(place).value().read(buf, *serialization_val, arena);
236+
this->data(place).result().read(buf, *serialization_res, data_type_res, arena);
237+
this->data(place).value().read(buf, *serialization_val, data_type_val, arena);
234238
if (unlikely(this->data(place).value().has() != this->data(place).result().has()))
235239
throw Exception(
236240
ErrorCodes::INCORRECT_DATA,
@@ -367,7 +371,9 @@ AggregateFunctionPtr createAggregateFunctionArgMinMax(const std::string & name,
367371
if (which.idx == TypeIndex::String)
368372
return AggregateFunctionPtr(new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxDataGeneric<SingleValueDataString>, isMin>(argument_types));
369373

370-
return AggregateFunctionPtr(new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxDataGeneric<SingleValueDataGeneric>, isMin>(argument_types));
374+
if (canUseFieldForValueData(value_type))
375+
return AggregateFunctionPtr(new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxDataGeneric<SingleValueDataGeneric>, isMin>(argument_types));
376+
return AggregateFunctionPtr(new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxDataGeneric<SingleValueDataGenericWithColumn>, isMin>(argument_types));
371377
}
372378
return result;
373379
}

src/AggregateFunctions/AggregateFunctionsMinMax.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class AggregateFunctionMinMax final : public IAggregateFunctionDataHelper<Data,
132132

133133
void deserialize(AggregateDataPtr place, ReadBuffer & buf, std::optional<size_t> /* version */, Arena * arena) const override
134134
{
135-
this->data(place).read(buf, *serialization, arena);
135+
this->data(place).read(buf, *serialization, this->result_type, arena);
136136
}
137137

138138
bool allocatesMemoryInArena() const override { return Data::allocatesMemoryInArena(); }

src/AggregateFunctions/Combinators/AggregateFunctionCombinatorsArgMinArgMax.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct AggregateFunctionCombinatorArgMinArgMaxData
1919
SingleValueDataBaseMemoryBlock v_data;
2020

2121
public:
22-
explicit AggregateFunctionCombinatorArgMinArgMaxData(TypeIndex value_type) { generateSingleValueFromTypeIndex(value_type, v_data); }
22+
explicit AggregateFunctionCombinatorArgMinArgMaxData(const DataTypePtr & value_type) { generateSingleValueFromType(value_type, v_data); }
2323

2424
~AggregateFunctionCombinatorArgMinArgMaxData() { data().~SingleValueDataBase(); }
2525

@@ -34,10 +34,11 @@ class AggregateFunctionCombinatorArgMinArgMax final : public IAggregateFunctionH
3434

3535
private:
3636
AggregateFunctionPtr nested_function;
37+
DataTypePtr data_type;
3738
SerializationPtr serialization;
3839
const size_t key_col;
3940
const size_t key_offset;
40-
const TypeIndex key_type_index;
41+
const DataTypePtr key_type;
4142

4243
AggregateFunctionCombinatorArgMinArgMaxData & data(AggregateDataPtr __restrict place) const /// NOLINT
4344
{
@@ -52,10 +53,11 @@ class AggregateFunctionCombinatorArgMinArgMax final : public IAggregateFunctionH
5253
AggregateFunctionCombinatorArgMinArgMax(AggregateFunctionPtr nested_function_, const DataTypes & arguments, const Array & params)
5354
: IAggregateFunctionHelper<AggregateFunctionCombinatorArgMinArgMax<isMin>>{arguments, params, nested_function_->getResultType()}
5455
, nested_function{nested_function_}
56+
, data_type(arguments.back())
5557
, serialization(arguments.back()->getDefaultSerialization())
5658
, key_col{arguments.size() - 1}
5759
, key_offset{((nested_function->sizeOfData() + alignof(Key) - 1) / alignof(Key)) * alignof(Key)}
58-
, key_type_index(WhichDataType(arguments[key_col]).idx)
60+
, key_type(arguments[key_col])
5961
{
6062
if (!arguments[key_col]->isComparable())
6163
throw Exception(
@@ -91,7 +93,7 @@ class AggregateFunctionCombinatorArgMinArgMax final : public IAggregateFunctionH
9193

9294
bool allocatesMemoryInArena() const override
9395
{
94-
return nested_function->allocatesMemoryInArena() || singleValueTypeAllocatesMemoryInArena(key_type_index);
96+
return nested_function->allocatesMemoryInArena() || singleValueTypeAllocatesMemoryInArena(key_type->getTypeId());
9597
}
9698

9799
bool hasTrivialDestructor() const override
@@ -106,7 +108,7 @@ class AggregateFunctionCombinatorArgMinArgMax final : public IAggregateFunctionH
106108
void create(AggregateDataPtr __restrict place) const override
107109
{
108110
nested_function->create(place);
109-
new (place + key_offset) Key(key_type_index);
111+
new (place + key_offset) Key(key_type);
110112
}
111113

112114
void destroy(AggregateDataPtr __restrict place) const noexcept override
@@ -160,7 +162,7 @@ class AggregateFunctionCombinatorArgMinArgMax final : public IAggregateFunctionH
160162
void deserialize(AggregateDataPtr __restrict place, ReadBuffer & buf, std::optional<size_t> version, Arena * arena) const override
161163
{
162164
nested_function->deserialize(place, buf, version, arena);
163-
data(place).data().read(buf, *serialization, arena);
165+
data(place).data().read(buf, *serialization, data_type, arena);
164166
}
165167

166168
void insertResultInto(AggregateDataPtr __restrict place, IColumn & to, Arena * arena) const override

0 commit comments

Comments
 (0)