mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-30 05:30:51 +00:00
Handle correct nullability with low card in HashJoin
This commit is contained in:
parent
9091bba3d6
commit
8dddcebe8c
@ -188,6 +188,7 @@ public:
|
||||
*/
|
||||
bool nestedIsNullable() const { return isColumnNullable(*dictionary.getColumnUnique().getNestedColumn()); }
|
||||
void nestedToNullable() { dictionary.getColumnUnique().nestedToNullable(); }
|
||||
void nestedRemoveNullable() { dictionary.getColumnUnique().nestedRemoveNullable(); }
|
||||
|
||||
const IColumnUnique & getDictionary() const { return dictionary.getColumnUnique(); }
|
||||
const ColumnPtr & getDictionaryPtr() const { return dictionary.getColumnUniquePtr(); }
|
||||
|
@ -51,6 +51,7 @@ public:
|
||||
const ColumnPtr & getNestedNotNullableColumn() const override { return column_holder; }
|
||||
bool nestedColumnIsNullable() const override { return is_nullable; }
|
||||
void nestedToNullable() override;
|
||||
void nestedRemoveNullable() override;
|
||||
|
||||
size_t uniqueInsert(const Field & x) override;
|
||||
size_t uniqueInsertFrom(const IColumn & src, size_t n) override;
|
||||
@ -271,6 +272,14 @@ void ColumnUnique<ColumnType>::nestedToNullable()
|
||||
createNullMask();
|
||||
}
|
||||
|
||||
template <typename ColumnType>
|
||||
void ColumnUnique<ColumnType>::nestedRemoveNullable()
|
||||
{
|
||||
is_nullable = false;
|
||||
nested_null_mask = nullptr;
|
||||
nested_column_nullable = nullptr;
|
||||
}
|
||||
|
||||
template <typename ColumnType>
|
||||
const ColumnPtr & ColumnUnique<ColumnType>::getNestedColumn() const
|
||||
{
|
||||
|
@ -24,6 +24,7 @@ public:
|
||||
|
||||
virtual bool nestedColumnIsNullable() const = 0;
|
||||
virtual void nestedToNullable() = 0;
|
||||
virtual void nestedRemoveNullable() = 0;
|
||||
|
||||
/// Returns array with StringRefHash calculated for each row of getNestedNotNullableColumn() column.
|
||||
/// Returns nullptr if nested column doesn't contain strings. Otherwise calculates hash (if it wasn't).
|
||||
|
@ -160,7 +160,7 @@ static ColumnWithTypeAndName correctNullability(ColumnWithTypeAndName && column,
|
||||
{
|
||||
if (nullable)
|
||||
{
|
||||
JoinCommon::convertColumnToNullable(column, false);
|
||||
JoinCommon::convertColumnToNullable(column);
|
||||
if (column.type->isNullable() && !negative_null_map.empty())
|
||||
{
|
||||
MutableColumnPtr mutable_column = IColumn::mutate(std::move(column.column));
|
||||
@ -1085,7 +1085,8 @@ void HashJoin::joinBlockImpl(
|
||||
ColumnWithTypeAndName right_col(col.column, col.type, right_key.name);
|
||||
if (right_col.type->lowCardinality() != right_key.type->lowCardinality())
|
||||
JoinCommon::changeLowCardinalityInplace(right_col);
|
||||
block.insert(correctNullability(std::move(right_col), is_nullable));
|
||||
right_col = correctNullability(std::move(right_col), is_nullable);
|
||||
block.insert(right_col);
|
||||
}
|
||||
}
|
||||
else if (has_required_right_keys)
|
||||
@ -1114,7 +1115,8 @@ void HashJoin::joinBlockImpl(
|
||||
ColumnWithTypeAndName right_col(thin_column, col.type, right_key.name);
|
||||
if (right_col.type->lowCardinality() != right_key.type->lowCardinality())
|
||||
JoinCommon::changeLowCardinalityInplace(right_col);
|
||||
block.insert(correctNullability(std::move(right_col), is_nullable, null_map_filter));
|
||||
right_col = correctNullability(std::move(right_col), is_nullable, null_map_filter);
|
||||
block.insert(right_col);
|
||||
|
||||
if constexpr (need_replication)
|
||||
right_keys_to_replicate.push_back(block.getPositionByName(right_key.name));
|
||||
|
@ -122,6 +122,20 @@ void convertColumnsToNullable(Block & block, size_t starting_pos)
|
||||
/// @warning It assumes that every NULL has default value in nested column (or it does not matter)
|
||||
void removeColumnNullability(ColumnWithTypeAndName & column)
|
||||
{
|
||||
if (column.type->lowCardinality())
|
||||
{
|
||||
/// LowCardinality(Nullable(T)) case
|
||||
ColumnLowCardinality * col_as_lc = assert_cast<ColumnLowCardinality *>(column.column->assumeMutable().get());
|
||||
if (col_as_lc->nestedIsNullable())
|
||||
{
|
||||
col_as_lc->nestedRemoveNullable();
|
||||
const auto & dict_type = typeid_cast<const DataTypeLowCardinality *>(column.type.get())->getDictionaryType();
|
||||
column.type = std::make_shared<DataTypeLowCardinality>(removeNullable(dict_type));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!column.type->isNullable())
|
||||
return;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user