diff --git a/src/Storages/StorageJoin.cpp b/src/Storages/StorageJoin.cpp index 8cf170b04eaef6ac5d6e163367f05fb27c6b3805..636fe44b120bf19f5ad474858296f9037729dfb7 100644 --- a/src/Storages/StorageJoin.cpp +++ b/src/Storages/StorageJoin.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -321,7 +322,7 @@ private: template Chunk createChunk(const Maps & maps) { - MutableColumns columns = restored_block.cloneEmpty().mutateColumns(); + MutableColumns mut_columns = restored_block.cloneEmpty().mutateColumns(); size_t rows_added = 0; @@ -329,7 +330,7 @@ private: { #define M(TYPE) \ case HashJoin::Type::TYPE: \ - rows_added = fillColumns(*maps.TYPE, columns); \ + rows_added = fillColumns(*maps.TYPE, mut_columns); \ break; APPLY_FOR_JOIN_VARIANTS_LIMITED(M) #undef M @@ -342,19 +343,23 @@ private: if (!rows_added) return {}; - /// Correct nullability + Columns columns; + columns.reserve(mut_columns.size()); + for (auto & col : mut_columns) + columns.emplace_back(std::move(col)); + + /// Correct nullability and LowCardinality types for (size_t i = 0; i < columns.size(); ++i) { - bool src_nullable = restored_block.getByPosition(i).type->isNullable(); - bool dst_nullable = sample_block.getByPosition(i).type->isNullable(); + const auto & src = restored_block.getByPosition(i); + const auto & dst = sample_block.getByPosition(i); - if (src_nullable && !dst_nullable) + if (!src.type->equals(*dst.type)) { - auto & nullable_column = assert_cast(*columns[i]); - columns[i] = nullable_column.getNestedColumnPtr()->assumeMutable(); + auto arg = src; + arg.column = std::move(columns[i]); + columns[i] = castColumn(arg, dst.type); } - else if (!src_nullable && dst_nullable) - columns[i] = makeNullable(std::move(columns[i]))->assumeMutable(); } UInt64 num_rows = columns.at(0)->size(); diff --git a/tests/queries/0_stateless/01586_storage_join_low_cardinality_key.reference b/tests/queries/0_stateless/01586_storage_join_low_cardinality_key.reference new file mode 100644 index 0000000000000000000000000000000000000000..e8183f05f5db68b3934e93f4bf6bed2bb664e0b5 --- /dev/null +++ b/tests/queries/0_stateless/01586_storage_join_low_cardinality_key.reference @@ -0,0 +1,3 @@ +1 +1 +1 diff --git a/tests/queries/0_stateless/01586_storage_join_low_cardinality_key.sql b/tests/queries/0_stateless/01586_storage_join_low_cardinality_key.sql new file mode 100644 index 0000000000000000000000000000000000000000..4b613b6d7cebe8b96bcb90f5282d715b1882c73b --- /dev/null +++ b/tests/queries/0_stateless/01586_storage_join_low_cardinality_key.sql @@ -0,0 +1,11 @@ +CREATE TABLE low_card +( + `lc` LowCardinality(String) +) +ENGINE = Join(ANY, LEFT, lc); + +INSERT INTO low_card VALUES ( '1' ); + +SELECT * FROM low_card; +SELECT * FROM low_card WHERE lc = '1'; +SELECT CAST(lc AS String) FROM low_card;