From a399c17f0196c7ae0326676f2a00b0d74cb1a8e4 Mon Sep 17 00:00:00 2001 From: Nikolai Kochetov Date: Tue, 20 Mar 2018 13:58:16 +0300 Subject: [PATCH] && - qualified IColumn::mutate --- dbms/src/Columns/FilterDescription.cpp | 3 ++- dbms/src/Columns/IColumn.h | 4 ++-- dbms/src/Common/COWPtr.h | 18 ++++++++++++++---- dbms/src/Core/Block.cpp | 2 +- dbms/src/Core/Block.h | 2 +- dbms/src/DataStreams/ColumnGathererStream.cpp | 5 ++--- .../MergingSortedBlockInputStream.cpp | 2 +- dbms/src/DataStreams/SquashingTransform.cpp | 2 +- .../ComplexKeyHashedDictionary.cpp | 2 +- .../Dictionaries/ExternalResultDescription.cpp | 2 +- dbms/src/Dictionaries/FlatDictionary.cpp | 2 +- dbms/src/Dictionaries/HashedDictionary.cpp | 2 +- dbms/src/Functions/FunctionsConditional.h | 7 ++++--- dbms/src/Functions/IFunction.cpp | 2 +- dbms/src/Interpreters/NullableUtils.cpp | 2 +- dbms/src/Storages/StorageBuffer.cpp | 4 ++-- 16 files changed, 36 insertions(+), 25 deletions(-) diff --git a/dbms/src/Columns/FilterDescription.cpp b/dbms/src/Columns/FilterDescription.cpp index 1d29cd9743..3d3e3f5ffe 100644 --- a/dbms/src/Columns/FilterDescription.cpp +++ b/dbms/src/Columns/FilterDescription.cpp @@ -57,7 +57,8 @@ FilterDescription::FilterDescription(const IColumn & column) if (const ColumnNullable * nullable_column = typeid_cast(&column)) { - MutableColumnPtr mutable_holder = nullable_column->getNestedColumn().mutate(); + ColumnPtr nested_column = nullable_column->getNestedColumnPtr(); + MutableColumnPtr mutable_holder = (*std::move(nested_column)).mutate(); ColumnUInt8 * concrete_column = typeid_cast(mutable_holder.get()); if (!concrete_column) diff --git a/dbms/src/Columns/IColumn.h b/dbms/src/Columns/IColumn.h index 9fd98e6f70..3a733e4a02 100644 --- a/dbms/src/Columns/IColumn.h +++ b/dbms/src/Columns/IColumn.h @@ -247,10 +247,10 @@ public: virtual void forEachSubcolumn(ColumnCallback) {} - MutablePtr mutate() const + MutablePtr mutate() const && { MutablePtr res = COWPtr::mutate(); - res->forEachSubcolumn([](Ptr & subcolumn) { subcolumn = subcolumn->mutate(); }); + res->forEachSubcolumn([](Ptr & subcolumn) { subcolumn = (*std::move(subcolumn)).mutate(); }); return res; } diff --git a/dbms/src/Common/COWPtr.h b/dbms/src/Common/COWPtr.h index 9f7cf21ad6..39c912f8ab 100644 --- a/dbms/src/Common/COWPtr.h +++ b/dbms/src/Common/COWPtr.h @@ -80,12 +80,22 @@ private: Derived * derived() { return static_cast(this); } const Derived * derived() const { return static_cast(this); } + template + class IntrusivePtr : public boost::intrusive_ptr + { + public: + using boost::intrusive_ptr::intrusive_ptr; + + T & operator*() const & { return boost::intrusive_ptr::operator*(); } + T && operator*() const && { return const_cast::type &&>(*boost::intrusive_ptr::get()); } + }; + protected: template - class mutable_ptr : public boost::intrusive_ptr + class mutable_ptr : public IntrusivePtr { private: - using Base = boost::intrusive_ptr; + using Base = IntrusivePtr; template friend class COWPtr; template friend class COWPtrHelper; @@ -114,10 +124,10 @@ public: protected: template - class immutable_ptr : public boost::intrusive_ptr + class immutable_ptr : public IntrusivePtr { private: - using Base = boost::intrusive_ptr; + using Base = IntrusivePtr; template friend class COWPtr; template friend class COWPtrHelper; diff --git a/dbms/src/Core/Block.cpp b/dbms/src/Core/Block.cpp index c969e3256d..1cae4ba252 100644 --- a/dbms/src/Core/Block.cpp +++ b/dbms/src/Core/Block.cpp @@ -312,7 +312,7 @@ MutableColumns Block::mutateColumns() const size_t num_columns = data.size(); MutableColumns columns(num_columns); for (size_t i = 0; i < num_columns; ++i) - columns[i] = data[i].column ? data[i].column->mutate() : data[i].type->createColumn(); + columns[i] = data[i].column ? (*std::move(data[i].column)).mutate() : data[i].type->createColumn(); return columns; } diff --git a/dbms/src/Core/Block.h b/dbms/src/Core/Block.h index 7c836e4953..ea4a4c00ce 100644 --- a/dbms/src/Core/Block.h +++ b/dbms/src/Core/Block.h @@ -109,7 +109,7 @@ public: /** Get empty columns with the same types as in block. */ MutableColumns cloneEmptyColumns() const; - /** Get columns from block for mutation. */ + /** Get columns from block for mutation. Columns in block will be nullptr. */ MutableColumns mutateColumns() const; /** Replace columns in a block */ diff --git a/dbms/src/DataStreams/ColumnGathererStream.cpp b/dbms/src/DataStreams/ColumnGathererStream.cpp index ba4107f7e8..baa19ae913 100644 --- a/dbms/src/DataStreams/ColumnGathererStream.cpp +++ b/dbms/src/DataStreams/ColumnGathererStream.cpp @@ -76,10 +76,9 @@ Block ColumnGathererStream::readImpl() return Block(); output_block = Block{column.cloneEmpty()}; - MutableColumnPtr output_column = output_block.getByPosition(0).column->mutate(); + MutableColumnPtr output_column = (*std::move(output_block.getByPosition(0).column)).mutate(); output_column->gather(*this); - if (!output_column->empty()) - output_block.getByPosition(0).column = std::move(output_column); + output_block.getByPosition(0).column = std::move(output_column); return output_block; } diff --git a/dbms/src/DataStreams/MergingSortedBlockInputStream.cpp b/dbms/src/DataStreams/MergingSortedBlockInputStream.cpp index f93197ca12..b60cc072b4 100644 --- a/dbms/src/DataStreams/MergingSortedBlockInputStream.cpp +++ b/dbms/src/DataStreams/MergingSortedBlockInputStream.cpp @@ -221,7 +221,7 @@ void MergingSortedBlockInputStream::merge(MutableColumns & merged_columns, std:: throw Exception("Logical error in MergingSortedBlockInputStream", ErrorCodes::LOGICAL_ERROR); for (size_t i = 0; i < num_columns; ++i) - merged_columns[i] = source_blocks[source_num]->getByPosition(i).column->mutate(); + merged_columns[i] = (*std::move(source_blocks[source_num]->getByPosition(i).column)).mutate(); // std::cerr << "copied columns\n"; diff --git a/dbms/src/DataStreams/SquashingTransform.cpp b/dbms/src/DataStreams/SquashingTransform.cpp index 9e8f590f17..d31ff6f806 100644 --- a/dbms/src/DataStreams/SquashingTransform.cpp +++ b/dbms/src/DataStreams/SquashingTransform.cpp @@ -62,7 +62,7 @@ void SquashingTransform::append(Block && block) for (size_t i = 0; i < columns; ++i) { - MutableColumnPtr mutable_column = accumulated_block.getByPosition(i).column->mutate(); + MutableColumnPtr mutable_column = (*std::move(accumulated_block.getByPosition(i).column)).mutate(); mutable_column->insertRangeFrom(*block.getByPosition(i).column, 0, rows); accumulated_block.getByPosition(i).column = std::move(mutable_column); } diff --git a/dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp b/dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp index 0f8c75ebd8..eaaeeab4e0 100644 --- a/dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp +++ b/dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp @@ -289,7 +289,7 @@ void ComplexKeyHashedDictionary::updateData() for (const auto attribute_idx : ext::range(0, keys_size + attributes_size)) { const IColumn & update_column = *block.getByPosition(attribute_idx).column.get(); - MutableColumnPtr saved_column = saved_block->getByPosition(attribute_idx).column->mutate(); + MutableColumnPtr saved_column = saved_block->getByPosition(attribute_idx).column->assumeMutable(); saved_column->insertRangeFrom(update_column, 0, update_column.size()); } } diff --git a/dbms/src/Dictionaries/ExternalResultDescription.cpp b/dbms/src/Dictionaries/ExternalResultDescription.cpp index 4c05fc3255..5eca329e5f 100644 --- a/dbms/src/Dictionaries/ExternalResultDescription.cpp +++ b/dbms/src/Dictionaries/ExternalResultDescription.cpp @@ -66,7 +66,7 @@ void ExternalResultDescription::init(const Block & sample_block_) /// If default value for column was not provided, use default from data type. if (sample_columns.back()->empty()) { - MutableColumnPtr mutable_column = sample_columns.back()->mutate(); + MutableColumnPtr mutable_column = (*std::move(sample_columns.back())).mutate(); column.type->insertDefaultInto(*mutable_column); sample_columns.back() = std::move(mutable_column); } diff --git a/dbms/src/Dictionaries/FlatDictionary.cpp b/dbms/src/Dictionaries/FlatDictionary.cpp index 0fc477725b..e134190764 100644 --- a/dbms/src/Dictionaries/FlatDictionary.cpp +++ b/dbms/src/Dictionaries/FlatDictionary.cpp @@ -316,7 +316,7 @@ void FlatDictionary::updateData() for (const auto attribute_idx : ext::range(0, attributes.size() + 1)) { const IColumn & update_column = *block.getByPosition(attribute_idx).column.get(); - MutableColumnPtr saved_column = saved_block->getByPosition(attribute_idx).column->mutate(); + MutableColumnPtr saved_column = saved_block->getByPosition(attribute_idx).column->assumeMutable(); saved_column->insertRangeFrom(update_column, 0, update_column.size()); } } diff --git a/dbms/src/Dictionaries/HashedDictionary.cpp b/dbms/src/Dictionaries/HashedDictionary.cpp index c0c7f1a8a1..09880cdbeb 100644 --- a/dbms/src/Dictionaries/HashedDictionary.cpp +++ b/dbms/src/Dictionaries/HashedDictionary.cpp @@ -310,7 +310,7 @@ void HashedDictionary::updateData() for (const auto attribute_idx : ext::range(0, attributes.size() + 1)) { const IColumn & update_column = *block.getByPosition(attribute_idx).column.get(); - MutableColumnPtr saved_column = saved_block->getByPosition(attribute_idx).column->mutate(); + MutableColumnPtr saved_column = saved_block->getByPosition(attribute_idx).column->assumeMutable(); saved_column->insertRangeFrom(update_column, 0, update_column.size()); } } diff --git a/dbms/src/Functions/FunctionsConditional.h b/dbms/src/Functions/FunctionsConditional.h index 841295f064..2756723792 100644 --- a/dbms/src/Functions/FunctionsConditional.h +++ b/dbms/src/Functions/FunctionsConditional.h @@ -592,7 +592,7 @@ private: const ColumnPtr & result_column = temporary_block.getByPosition(3).column; if (result_column->isColumnNullable()) { - MutableColumnPtr mutable_result_column = result_column->mutate(); + MutableColumnPtr mutable_result_column = (*std::move(result_column)).mutate(); static_cast(*mutable_result_column).applyNullMap(static_cast(*arg_cond.column)); block.getByPosition(result).column = std::move(mutable_result_column); return true; @@ -744,7 +744,7 @@ private: { if (arg_else.column->isColumnNullable()) { - auto result_column = arg_else.column->mutate(); + auto result_column = (*std::move(arg_else.column)).mutate(); static_cast(*result_column).applyNullMap(static_cast(*arg_cond.column)); block.getByPosition(result).column = std::move(result_column); } @@ -785,7 +785,8 @@ private: if (arg_then.column->isColumnNullable()) { - auto result_column = arg_then.column->mutate(); + auto arg_then_column = arg_then.column; + auto result_column = (*std::move(arg_then_column)).mutate(); static_cast(*result_column).applyNegatedNullMap(static_cast(*arg_cond.column)); block.getByPosition(result).column = std::move(result_column); } diff --git a/dbms/src/Functions/IFunction.cpp b/dbms/src/Functions/IFunction.cpp index ba05bc34e9..12e8dfabbd 100644 --- a/dbms/src/Functions/IFunction.cpp +++ b/dbms/src/Functions/IFunction.cpp @@ -63,7 +63,7 @@ ColumnPtr wrapInNullable(const ColumnPtr & src, Block & block, const ColumnNumbe } else { - MutableColumnPtr mutable_result_null_map_column = result_null_map_column->mutate(); + MutableColumnPtr mutable_result_null_map_column = (*std::move(result_null_map_column)).mutate(); NullMap & result_null_map = static_cast(*mutable_result_null_map_column).getData(); const NullMap & src_null_map = static_cast(*null_map_column).getData(); diff --git a/dbms/src/Interpreters/NullableUtils.cpp b/dbms/src/Interpreters/NullableUtils.cpp index 972c548e67..dcb0657aa9 100644 --- a/dbms/src/Interpreters/NullableUtils.cpp +++ b/dbms/src/Interpreters/NullableUtils.cpp @@ -31,7 +31,7 @@ void extractNestedColumnsAndNullMap(ColumnRawPtrs & key_columns, ColumnPtr & nul } else { - MutableColumnPtr mutable_null_map_holder = null_map_holder->mutate(); + MutableColumnPtr mutable_null_map_holder = (*std::move(null_map_holder)).mutate(); PaddedPODArray & mutable_null_map = static_cast(*mutable_null_map_holder).getData(); const PaddedPODArray & other_null_map = column_nullable.getNullMapData(); diff --git a/dbms/src/Storages/StorageBuffer.cpp b/dbms/src/Storages/StorageBuffer.cpp index 5c59ffa7c4..8688d191b9 100644 --- a/dbms/src/Storages/StorageBuffer.cpp +++ b/dbms/src/Storages/StorageBuffer.cpp @@ -164,7 +164,7 @@ static void appendBlock(const Block & from, Block & to) for (size_t column_no = 0, columns = to.columns(); column_no < columns; ++column_no) { const IColumn & col_from = *from.getByPosition(column_no).column.get(); - MutableColumnPtr col_to = to.getByPosition(column_no).column->mutate(); + MutableColumnPtr col_to = (*std::move(to.getByPosition(column_no).column)).mutate(); col_to->insertRangeFrom(col_from, 0, rows); @@ -183,7 +183,7 @@ static void appendBlock(const Block & from, Block & to) { ColumnPtr & col_to = to.getByPosition(column_no).column; if (col_to->size() != old_rows) - col_to = col_to->mutate()->cut(0, old_rows); + col_to = (*std::move(col_to)).mutate()->cut(0, old_rows); } } catch (...) -- GitLab