Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Interpreters/sortBlock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,10 @@ void checkSortedWithPermutation(const Block & block, const SortDescription & des
void sortBlock(Block & block, const SortDescription & description, UInt64 limit, IColumn::PermutationSortStability stability)
{
IColumn::Permutation permutation;

#ifndef NDEBUG
block.checkNumberOfRows();
#endif
getBlockSortPermutationImpl(block, description, stability, limit, permutation);

#ifndef NDEBUG
Expand Down
26 changes: 18 additions & 8 deletions src/Storages/MergeTree/KeyCondition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1422,6 +1422,9 @@ bool KeyCondition::tryPrepareSetIndex(

Columns transformed_set_columns = set_columns;

IColumn::Filter filter(transformed_set_columns.front()->size(), 1);
bool filter_used = false;

for (size_t indexes_mapping_index = 0; indexes_mapping_index < indexes_mapping_size; ++indexes_mapping_index)
{
const auto & key_column_type = data_types[indexes_mapping_index];
Expand Down Expand Up @@ -1493,32 +1496,39 @@ bool KeyCondition::tryPrepareSetIndex(
const NullMap & nullable_set_column_null_map = nullable_set_column_typed->getNullMapData();
size_t nullable_set_column_null_map_size = nullable_set_column_null_map.size();

IColumn::Filter filter(nullable_set_column_null_map_size);

if (set_column_null_map)
{
for (size_t i = 0; i < nullable_set_column_null_map_size; ++i)
{
if (nullable_set_column_null_map_size < set_column_null_map->size())
filter[i] = (*set_column_null_map)[i] || !nullable_set_column_null_map[i];
filter[i] &= (*set_column_null_map)[i] || !nullable_set_column_null_map[i];
else
filter[i] = !nullable_set_column_null_map[i];
filter[i] &= !nullable_set_column_null_map[i];
}

set_column = nullable_set_column_typed->filter(filter, 0);
set_column = nullable_set_column;
}
else
{
for (size_t i = 0; i < nullable_set_column_null_map_size; ++i)
filter[i] = !nullable_set_column_null_map[i];
filter[i] &= !nullable_set_column_null_map[i];

set_column = nullable_set_column_typed->getNestedColumn().filter(filter, 0);
set_column = nullable_set_column_typed->getNestedColumnPtr();
}
filter_used = true;

transformed_set_columns[set_element_index] = std::move(set_column);
}

set_columns = std::move(transformed_set_columns);
if (filter_used)
{
for (size_t set_element_index = 0; set_element_index < transformed_set_columns.size(); ++set_element_index)
set_columns[set_element_index] = transformed_set_columns[set_element_index]->filter(filter, 0);
}
else
{
set_columns = std::move(transformed_set_columns);
}

out.set_index = std::make_shared<MergeTreeSetIndex>(set_columns, std::move(indexes_mapping));

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 5-element set)
Parts: 1/1
Granules: 1/1
Search Algorithm: generic exclusion search
Ranges: 1
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 0-element set)
Parts: 0/1
Granules: 0/1
Search Algorithm: generic exclusion search
Ranges: 0
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 5-element set)
Parts: 1/1
Granules: 1/1
Search Algorithm: generic exclusion search
Ranges: 1
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 0-element set)
Parts: 0/1
Granules: 0/1
Search Algorithm: generic exclusion search
Ranges: 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
-- Tags: no-parallel-replicas, no-random-merge-tree-settings
-- followup to 02882_primary_key_index_in_function_different_types

DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table
(
id UInt64,
value UInt64
) ENGINE=MergeTree ORDER BY (id, value) SETTINGS index_granularity = 8192, index_granularity_bytes = '1Mi';

INSERT INTO test_table SELECT number, number FROM numbers(10);

EXPLAIN indexes = 1, description=0 SELECT id FROM test_table WHERE (id, value) IN (SELECT '5', number FROM numbers(5));
EXPLAIN indexes = 1, description=0 SELECT id FROM test_table WHERE (id, value) IN (SELECT 'not a number', number FROM numbers(5));
EXPLAIN indexes = 1, description=0 SELECT id FROM test_table WHERE (id, value) IN (SELECT 42, 'not a number' UNION ALL SELECT 5, toString(number) FROM numbers(5));
EXPLAIN indexes = 1, description=0 SELECT id FROM test_table WHERE (id, value) IN (SELECT '42', 'not a number' UNION ALL SELECT 'not a number', '42' FROM numbers(5));

DROP TABLE test_table;
Loading