@@ -158,15 +158,17 @@ namespace clickhouse {
158158ColumnLowCardinality::ColumnLowCardinality (ColumnRef dictionary_column)
159159 : Column(Type::CreateLowCardinality(dictionary_column->Type ())),
160160 dictionary_column_(dictionary_column->CloneEmpty ()), // safe way to get an column of the same type.
161- index_column_(std::make_shared<ColumnUInt32>())
161+ index_column_(std::make_shared<ColumnUInt32>()),
162+ index_type_code_(Type::UInt32)
162163{
163164 Setup (dictionary_column);
164165}
165166
166167ColumnLowCardinality::ColumnLowCardinality (std::shared_ptr<ColumnNullable> dictionary_column)
167168 : Column(Type::CreateLowCardinality(dictionary_column->Type ())),
168169 dictionary_column_(dictionary_column->CloneEmpty ()), // safe way to get an column of the same type.
169- index_column_(std::make_shared<ColumnUInt32>())
170+ index_column_(std::make_shared<ColumnUInt32>()),
171+ index_type_code_(Type::UInt32)
170172{
171173 AppendNullItem ();
172174 Setup (dictionary_column);
@@ -200,22 +202,65 @@ void ColumnLowCardinality::Setup(ColumnRef dictionary_column) {
200202}
201203
202204std::uint64_t ColumnLowCardinality::getDictionaryIndex (std::uint64_t item_index) const {
203- return VisitIndexColumn ([item_index](const auto & arg) -> std::uint64_t {
204- return arg[item_index];
205- }, *index_column_);
205+ switch (index_type_code_) {
206+ case Type::UInt8:
207+ return static_cast <const ColumnUInt8&>(*index_column_)[item_index];
208+ case Type::UInt16:
209+ return static_cast <const ColumnUInt16&>(*index_column_)[item_index];
210+ case Type::UInt32:
211+ return static_cast <const ColumnUInt32&>(*index_column_)[item_index];
212+ case Type::UInt64:
213+ return static_cast <const ColumnUInt64&>(*index_column_)[item_index];
214+ default :
215+ throw ValidationError (" Invalid index column type" );
216+ }
206217}
207218
208219void ColumnLowCardinality::appendIndex (std::uint64_t item_index) {
209220 // TODO (nemkov): handle case when index should go from UInt8 to UInt16, etc.
210- VisitIndexColumn ([item_index](auto & arg) {
211- arg.Append (static_cast <typename std::decay_t <decltype (arg)>::DataType>(item_index));
212- }, *index_column_);
221+ switch (index_type_code_) {
222+ case Type::UInt8:
223+ static_cast <ColumnUInt8&>(*index_column_).Append (static_cast <uint8_t >(item_index));
224+ break ;
225+ case Type::UInt16:
226+ static_cast <ColumnUInt16&>(*index_column_).Append (static_cast <uint16_t >(item_index));
227+ break ;
228+ case Type::UInt32:
229+ static_cast <ColumnUInt32&>(*index_column_).Append (static_cast <uint32_t >(item_index));
230+ break ;
231+ case Type::UInt64:
232+ static_cast <ColumnUInt64&>(*index_column_).Append (static_cast <uint64_t >(item_index));
233+ break ;
234+ default :
235+ throw ValidationError (" Invalid index column type" );
236+ }
213237}
214238
215239void ColumnLowCardinality::removeLastIndex () {
216- VisitIndexColumn ([](auto & arg) {
217- arg.Erase (arg.Size () - 1 );
218- }, *index_column_);
240+ switch (index_type_code_) {
241+ case Type::UInt8: {
242+ auto & col = static_cast <ColumnUInt8&>(*index_column_);
243+ col.Erase (col.Size () - 1 );
244+ break ;
245+ }
246+ case Type::UInt16: {
247+ auto & col = static_cast <ColumnUInt16&>(*index_column_);
248+ col.Erase (col.Size () - 1 );
249+ break ;
250+ }
251+ case Type::UInt32: {
252+ auto & col = static_cast <ColumnUInt32&>(*index_column_);
253+ col.Erase (col.Size () - 1 );
254+ break ;
255+ }
256+ case Type::UInt64: {
257+ auto & col = static_cast <ColumnUInt64&>(*index_column_);
258+ col.Erase (col.Size () - 1 );
259+ break ;
260+ }
261+ default :
262+ throw ValidationError (" Invalid index column type" );
263+ }
219264}
220265
221266details::LowCardinalityHashKey ColumnLowCardinality::computeHashKey (const ItemView & item) {
@@ -337,6 +382,7 @@ bool ColumnLowCardinality::LoadBody(InputStream* input, size_t rows) {
337382 dictionary_column_->Swap (*new_dictionary);
338383 index_column_.swap (new_index);
339384 unique_items_map_.swap (new_unique_items_map);
385+ index_type_code_ = index_column_->Type ()->GetCode ();
340386
341387 return true ;
342388 } catch (...) {
@@ -411,6 +457,7 @@ void ColumnLowCardinality::Swap(Column& other) {
411457
412458 index_column_.swap (col.index_column_ );
413459 unique_items_map_.swap (col.unique_items_map_ );
460+ std::swap (index_type_code_, col.index_type_code_ );
414461}
415462
416463ItemView ColumnLowCardinality::GetItem (size_t index) const {
0 commit comments