mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 17:41:59 +00:00
Better semantic of sharing columns: development [#CLICKHOUSE-2].
This commit is contained in:
parent
a086e3e6d8
commit
96ee187d1a
@ -63,7 +63,7 @@ Block createSampleBlock(const DictionaryStructure & dict_struct)
|
|||||||
auto column = attribute.type->createColumn();
|
auto column = attribute.type->createColumn();
|
||||||
column->insertDefault();
|
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();
|
auto column = attribute.type->createColumn();
|
||||||
column->insert(attribute.null_value);
|
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;
|
return block;
|
||||||
|
@ -33,13 +33,13 @@ void formatKeys(const DictionaryStructure & dict_struct, BlockOutputStreamPtr &
|
|||||||
for (size_t i = 0, size = key_columns.size(); i < size; ++i)
|
for (size_t i = 0, size = key_columns.size(); i < size; ++i)
|
||||||
{
|
{
|
||||||
const ColumnPtr & source_column = key_columns[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());
|
filtered_column->reserve(requested_rows.size());
|
||||||
|
|
||||||
for (size_t idx : requested_rows)
|
for (size_t idx : requested_rows)
|
||||||
filtered_column->insertFrom(*source_column, idx);
|
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();
|
out->writePrefix();
|
||||||
|
@ -283,15 +283,14 @@ std::vector<DictionaryAttribute> DictionaryStructure::getAttributes(
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
ReadBufferFromString null_value_buffer{null_value_string};
|
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);
|
type->deserializeTextEscaped(*column_with_null_value, null_value_buffer);
|
||||||
null_value = (*column_with_null_value)[0];
|
null_value = (*column_with_null_value)[0];
|
||||||
}
|
}
|
||||||
catch (const std::exception & e)
|
catch (Exception & e)
|
||||||
{
|
{
|
||||||
throw Exception{
|
e.addMessage("error parsing null_value");
|
||||||
std::string{"Error parsing null_value: "} + e.what(),
|
throw;
|
||||||
ErrorCodes::BAD_ARGUMENTS};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
if (!data)
|
||||||
return true;
|
return sample_block.cloneEmpty();
|
||||||
|
|
||||||
auto columns_received = static_cast<const ClickHouseLibrary::ColumnsUInt64 *>(data);
|
auto columns_received = static_cast<const ClickHouseLibrary::ColumnsUInt64 *>(data);
|
||||||
std::vector<IColumn *> columns(block.columns());
|
|
||||||
|
MutableColumns columns(sample_block.columns());
|
||||||
for (const auto i : ext::range(0, columns.size()))
|
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)
|
for (size_t col_n = 0; col_n < columns_received->size; ++col_n)
|
||||||
{
|
{
|
||||||
if (columns.size() != columns_received->data[col_n].size)
|
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);
|
ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
|
||||||
|
|
||||||
for (size_t row_n = 0; row_n < columns_received->data[col_n].size; ++row_n)
|
for (size_t row_n = 0; row_n < columns_received->data[col_n].size; ++row_n)
|
||||||
{
|
|
||||||
columns[row_n]->insert(static_cast<UInt64>(columns_received->data[col_n].data[row_n]));
|
columns[row_n]->insert(static_cast<UInt64>(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->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&columns))>("ClickHouseDictionary_v1_loadAll");
|
= library->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&columns))>("ClickHouseDictionary_v1_loadAll");
|
||||||
data_ptr = library->get<void * (*)()>("ClickHouseDictionary_v1_dataAllocate")();
|
data_ptr = library->get<void * (*)()>("ClickHouseDictionary_v1_dataAllocate")();
|
||||||
auto data = fptr(data_ptr, &settings->strings, &columns);
|
auto data = fptr(data_ptr, &settings->strings, &columns);
|
||||||
auto block = description.sample_block.cloneEmpty();
|
auto block = dataToBlock(description.sample_block, data);
|
||||||
dataToBlock(data, block);
|
|
||||||
library->get<void (*)(void *)>("ClickHouseDictionary_v1_dataDelete")(data_ptr);
|
library->get<void (*)(void *)>("ClickHouseDictionary_v1_dataDelete")(data_ptr);
|
||||||
return std::make_shared<OneBlockInputStream>(block);
|
return std::make_shared<OneBlockInputStream>(block);
|
||||||
}
|
}
|
||||||
@ -175,8 +175,7 @@ BlockInputStreamPtr LibraryDictionarySource::loadIds(const std::vector<UInt64> &
|
|||||||
"ClickHouseDictionary_v1_loadIds");
|
"ClickHouseDictionary_v1_loadIds");
|
||||||
data_ptr = library->get<void * (*)()>("ClickHouseDictionary_v1_dataAllocate")();
|
data_ptr = library->get<void * (*)()>("ClickHouseDictionary_v1_dataAllocate")();
|
||||||
auto data = fptr(data_ptr, &settings->strings, &columns_pass, &ids_data);
|
auto data = fptr(data_ptr, &settings->strings, &columns_pass, &ids_data);
|
||||||
auto block = description.sample_block.cloneEmpty();
|
auto block = dataToBlock(description.sample_block, data);
|
||||||
dataToBlock(data, block);
|
|
||||||
library->get<void (*)(void * data_ptr)>("ClickHouseDictionary_v1_dataDelete")(data_ptr);
|
library->get<void (*)(void * data_ptr)>("ClickHouseDictionary_v1_dataDelete")(data_ptr);
|
||||||
return std::make_shared<OneBlockInputStream>(block);
|
return std::make_shared<OneBlockInputStream>(block);
|
||||||
}
|
}
|
||||||
@ -213,8 +212,7 @@ BlockInputStreamPtr LibraryDictionarySource::loadKeys(const Columns & key_column
|
|||||||
"ClickHouseDictionary_v1_loadKeys");
|
"ClickHouseDictionary_v1_loadKeys");
|
||||||
data_ptr = library->get<void * (*)()>("ClickHouseDictionary_v1_dataAllocate")();
|
data_ptr = library->get<void * (*)()>("ClickHouseDictionary_v1_dataAllocate")();
|
||||||
auto data = fptr(data_ptr, &settings->strings, &columns_pass, &requested_rows_c);
|
auto data = fptr(data_ptr, &settings->strings, &columns_pass, &requested_rows_c);
|
||||||
auto block = description.sample_block.cloneEmpty();
|
auto block = dataToBlock(description.sample_block, data);
|
||||||
dataToBlock(data, block);
|
|
||||||
library->get<void (*)(void * data_ptr)>("ClickHouseDictionary_v1_dataDelete")(data_ptr);
|
library->get<void (*)(void * data_ptr)>("ClickHouseDictionary_v1_dataDelete")(data_ptr);
|
||||||
return std::make_shared<OneBlockInputStream>(block);
|
return std::make_shared<OneBlockInputStream>(block);
|
||||||
}
|
}
|
||||||
|
@ -141,14 +141,11 @@ Block MongoDBBlockInputStream::readImpl()
|
|||||||
if (all_read)
|
if (all_read)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
Block block = description.sample_block.cloneEmpty();
|
MutableColumns columns(description.sample_block.columns());
|
||||||
|
|
||||||
/// cache pointers returned by the calls to getByPosition
|
|
||||||
std::vector<IColumn *> columns(block.columns());
|
|
||||||
const size_t size = columns.size();
|
const size_t size = columns.size();
|
||||||
|
|
||||||
for (const auto i : ext::range(0, 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;
|
size_t num_rows = 0;
|
||||||
while (num_rows < max_block_size)
|
while (num_rows < max_block_size)
|
||||||
@ -181,7 +178,7 @@ Block MongoDBBlockInputStream::readImpl()
|
|||||||
if (num_rows == 0)
|
if (num_rows == 0)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
return block;
|
return description.sample_block.cloneWithColumns(std::move(columns));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user