Skip to content
Open
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 @@ -277,6 +277,10 @@ bool isAlreadySortedImpl(size_t rows, Comparator compare)
void sortBlock(Block & block, const SortDescription & description, UInt64 limit)
{
IColumn::Permutation permutation;

#ifndef NDEBUG
block.checkNumberOfRows();
#endif
getBlockSortPermutationImpl(block, description, IColumn::PermutationSortStability::Unstable, limit, permutation);

if (permutation.empty())
Expand Down
19 changes: 13 additions & 6 deletions src/Storages/MergeTree/KeyCondition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,9 @@ bool KeyCondition::tryPrepareSetIndex(
auto set_columns = prepared_set->getSetElements();
assert(set_types_size == set_columns.size());

IColumn::Filter filter(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 @@ -1309,26 +1312,30 @@ bool KeyCondition::tryPrepareSetIndex(
const auto & 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)
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];

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;

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

if (filter_used)
{
for (size_t set_element_index = 0; set_element_index < set_columns.size(); ++set_element_index)
set_columns[set_element_index] = set_columns[set_element_index]->filter(filter, 0);
}
out.set_index = std::make_shared<MergeTreeSetIndex>(set_columns, std::move(indexes_mapping));

/// When not all key columns are used or when there are multiple elements in
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 5-element set)
Parts: 1/1
Granules: 1/1
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 0-element set)
Parts: 0/1
Granules: 0/1
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 5-element set)
Parts: 1/1
Granules: 1/1
CreatingSets
Expression
Filter
ReadFromMergeTree
Indexes:
PrimaryKey
Keys:
value
Condition: (value in 0-element set)
Parts: 0/1
Granules: 0/1
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