diff --git a/dbms/src/Dictionaries/DictionarySourceFactory.cpp b/dbms/src/Dictionaries/DictionarySourceFactory.cpp index 55f32e62045..2cffe5df00b 100644 --- a/dbms/src/Dictionaries/DictionarySourceFactory.cpp +++ b/dbms/src/Dictionaries/DictionarySourceFactory.cpp @@ -63,7 +63,7 @@ Block createSampleBlock(const DictionaryStructure & dict_struct) auto column = attribute.type->createColumn(); column->insertDefault(); - block.insert(ColumnWithTypeAndName{column, attribute.type, attribute.name}); + block.insert(ColumnWithTypeAndName{std::move(column), attribute.type, attribute.name}); } } @@ -77,7 +77,7 @@ Block createSampleBlock(const DictionaryStructure & dict_struct) auto column = attribute.type->createColumn(); column->insert(attribute.null_value); - block.insert(ColumnWithTypeAndName{column, attribute.type, attribute.name}); + block.insert(ColumnWithTypeAndName{std::move(column), attribute.type, attribute.name}); } return block; diff --git a/dbms/src/Dictionaries/DictionarySourceHelpers.cpp b/dbms/src/Dictionaries/DictionarySourceHelpers.cpp index cc15da3b1ce..73bc6486e7a 100644 --- a/dbms/src/Dictionaries/DictionarySourceHelpers.cpp +++ b/dbms/src/Dictionaries/DictionarySourceHelpers.cpp @@ -33,13 +33,13 @@ void formatKeys(const DictionaryStructure & dict_struct, BlockOutputStreamPtr & for (size_t i = 0, size = key_columns.size(); i < size; ++i) { const ColumnPtr & source_column = key_columns[i]; - ColumnPtr filtered_column = source_column->cloneEmpty(); + auto filtered_column = source_column->cloneEmpty(); filtered_column->reserve(requested_rows.size()); for (size_t idx : requested_rows) filtered_column->insertFrom(*source_column, idx); - block.insert({ filtered_column, (*dict_struct.key)[i].type, toString(i) }); + block.insert({ std::move(filtered_column), (*dict_struct.key)[i].type, toString(i) }); } out->writePrefix(); diff --git a/dbms/src/Dictionaries/DictionaryStructure.cpp b/dbms/src/Dictionaries/DictionaryStructure.cpp index 6059cb0c64d..e1e11f2ce43 100644 --- a/dbms/src/Dictionaries/DictionaryStructure.cpp +++ b/dbms/src/Dictionaries/DictionaryStructure.cpp @@ -283,15 +283,14 @@ std::vector DictionaryStructure::getAttributes( try { ReadBufferFromString null_value_buffer{null_value_string}; - ColumnPtr column_with_null_value = type->createColumn(); + auto column_with_null_value = type->createColumn(); type->deserializeTextEscaped(*column_with_null_value, null_value_buffer); null_value = (*column_with_null_value)[0]; } - catch (const std::exception & e) + catch (Exception & e) { - throw Exception{ - std::string{"Error parsing null_value: "} + e.what(), - ErrorCodes::BAD_ARGUMENTS}; + e.addMessage("error parsing null_value"); + throw; } } diff --git a/dbms/src/Dictionaries/LibraryDictionarySource.cpp b/dbms/src/Dictionaries/LibraryDictionarySource.cpp index c0d7a016b2a..9b5ec87e6f3 100644 --- a/dbms/src/Dictionaries/LibraryDictionarySource.cpp +++ b/dbms/src/Dictionaries/LibraryDictionarySource.cpp @@ -69,15 +69,17 @@ CStringsHolder getLibSettings(const Poco::Util::AbstractConfiguration & config, } -bool dataToBlock(const void * data, Block & block) +Block dataToBlock(const Block & sample_block, const void * data) { if (!data) - return true; + return sample_block.cloneEmpty(); auto columns_received = static_cast(data); - std::vector columns(block.columns()); + + MutableColumns columns(sample_block.columns()); for (const auto i : ext::range(0, columns.size())) - columns[i] = block.getByPosition(i).column.get(); + columns[i] = sample_block.getByPosition(i).column->cloneEmpty(); + for (size_t col_n = 0; col_n < columns_received->size; ++col_n) { if (columns.size() != columns_received->data[col_n].size) @@ -86,11 +88,10 @@ bool dataToBlock(const void * data, Block & block) ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH); for (size_t row_n = 0; row_n < columns_received->data[col_n].size; ++row_n) - { columns[row_n]->insert(static_cast(columns_received->data[col_n].data[row_n])); - } } - return false; + + return sample_block.cloneWithColumns(std::move(columns)); } } @@ -148,8 +149,7 @@ BlockInputStreamPtr LibraryDictionarySource::loadAll() = library->getstrings), decltype(&columns))>("ClickHouseDictionary_v1_loadAll"); data_ptr = library->get("ClickHouseDictionary_v1_dataAllocate")(); auto data = fptr(data_ptr, &settings->strings, &columns); - auto block = description.sample_block.cloneEmpty(); - dataToBlock(data, block); + auto block = dataToBlock(description.sample_block, data); library->get("ClickHouseDictionary_v1_dataDelete")(data_ptr); return std::make_shared(block); } @@ -175,8 +175,7 @@ BlockInputStreamPtr LibraryDictionarySource::loadIds(const std::vector & "ClickHouseDictionary_v1_loadIds"); data_ptr = library->get("ClickHouseDictionary_v1_dataAllocate")(); auto data = fptr(data_ptr, &settings->strings, &columns_pass, &ids_data); - auto block = description.sample_block.cloneEmpty(); - dataToBlock(data, block); + auto block = dataToBlock(description.sample_block, data); library->get("ClickHouseDictionary_v1_dataDelete")(data_ptr); return std::make_shared(block); } @@ -213,8 +212,7 @@ BlockInputStreamPtr LibraryDictionarySource::loadKeys(const Columns & key_column "ClickHouseDictionary_v1_loadKeys"); data_ptr = library->get("ClickHouseDictionary_v1_dataAllocate")(); auto data = fptr(data_ptr, &settings->strings, &columns_pass, &requested_rows_c); - auto block = description.sample_block.cloneEmpty(); - dataToBlock(data, block); + auto block = dataToBlock(description.sample_block, data); library->get("ClickHouseDictionary_v1_dataDelete")(data_ptr); return std::make_shared(block); } diff --git a/dbms/src/Dictionaries/MongoDBBlockInputStream.cpp b/dbms/src/Dictionaries/MongoDBBlockInputStream.cpp index 2d4f4b843d1..574b26736a5 100644 --- a/dbms/src/Dictionaries/MongoDBBlockInputStream.cpp +++ b/dbms/src/Dictionaries/MongoDBBlockInputStream.cpp @@ -141,14 +141,11 @@ Block MongoDBBlockInputStream::readImpl() if (all_read) return {}; - Block block = description.sample_block.cloneEmpty(); - - /// cache pointers returned by the calls to getByPosition - std::vector columns(block.columns()); + MutableColumns columns(description.sample_block.columns()); const size_t size = columns.size(); for (const auto i : ext::range(0, size)) - columns[i] = block.getByPosition(i).column.get(); + columns[i] = description.sample_block.getByPosition(i).column->cloneEmpty(); size_t num_rows = 0; while (num_rows < max_block_size) @@ -181,7 +178,7 @@ Block MongoDBBlockInputStream::readImpl() if (num_rows == 0) return {}; - return block; + return description.sample_block.cloneWithColumns(std::move(columns)); } }