diff --git a/src/Interpreters/sortBlock.cpp b/src/Interpreters/sortBlock.cpp index 7b19d338ee80..2fe303ff4741 100644 --- a/src/Interpreters/sortBlock.cpp +++ b/src/Interpreters/sortBlock.cpp @@ -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()) diff --git a/src/Storages/MergeTree/KeyCondition.cpp b/src/Storages/MergeTree/KeyCondition.cpp index fbc33ec800f6..b3b563dbf11c 100644 --- a/src/Storages/MergeTree/KeyCondition.cpp +++ b/src/Storages/MergeTree/KeyCondition.cpp @@ -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]; @@ -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(set_columns, std::move(indexes_mapping)); /// When not all key columns are used or when there are multiple elements in diff --git a/tests/queries/0_stateless/03635_in_function_different_types_many_columns.reference b/tests/queries/0_stateless/03635_in_function_different_types_many_columns.reference new file mode 100644 index 000000000000..1f8cec584b32 --- /dev/null +++ b/tests/queries/0_stateless/03635_in_function_different_types_many_columns.reference @@ -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 diff --git a/tests/queries/0_stateless/03635_in_function_different_types_many_columns.sql b/tests/queries/0_stateless/03635_in_function_different_types_many_columns.sql new file mode 100644 index 000000000000..1be37f4054f0 --- /dev/null +++ b/tests/queries/0_stateless/03635_in_function_different_types_many_columns.sql @@ -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;