mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Merge pull request #68864 from ClickHouse/backport/24.8/68681
Backport #68681 to 24.8: Fix ColumnVariant permutation
This commit is contained in:
commit
3b0c895582
@ -953,7 +953,7 @@ ColumnPtr ColumnVariant::index(const IColumn & indexes, size_t limit) const
|
||||
{
|
||||
/// If we have only NULLs, index will take no effect, just return resized column.
|
||||
if (hasOnlyNulls())
|
||||
return cloneResized(limit);
|
||||
return cloneResized(limit == 0 ? indexes.size(): limit);
|
||||
|
||||
/// Optimization when we have only one non empty variant and no NULLs.
|
||||
/// In this case local_discriminators column is filled with identical values and offsets column
|
||||
@ -1009,8 +1009,16 @@ ColumnPtr ColumnVariant::indexImpl(const PaddedPODArray<Type> & indexes, size_t
|
||||
new_variants.reserve(num_variants);
|
||||
for (size_t i = 0; i != num_variants; ++i)
|
||||
{
|
||||
size_t nested_limit = nested_perms[i].size() == variants[i]->size() ? 0 : nested_perms[i].size();
|
||||
new_variants.emplace_back(variants[i]->permute(nested_perms[i], nested_limit));
|
||||
/// Check if no values from this variant were selected.
|
||||
if (nested_perms[i].empty())
|
||||
{
|
||||
new_variants.emplace_back(variants[i]->cloneEmpty());
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t nested_limit = nested_perms[i].size() == variants[i]->size() ? 0 : nested_perms[i].size();
|
||||
new_variants.emplace_back(variants[i]->permute(nested_perms[i], nested_limit));
|
||||
}
|
||||
}
|
||||
|
||||
/// We cannot use new_offsets column as an offset column, because it became invalid after variants permutation.
|
||||
|
@ -0,0 +1,8 @@
|
||||
2 {"foo2":"bar"} 1
|
||||
3 {"foo2":"bar"} 1
|
||||
2 {"foo2":"baz"} 2
|
||||
3 {"foo2":"bar"} 1
|
||||
2 {"foo2":"bar"} 1
|
||||
3 {"foo2":"bar"} 1
|
||||
2 {"foo2":"baz"} 2
|
||||
3 {"foo2":"bar"} 1
|
@ -0,0 +1,33 @@
|
||||
SET allow_experimental_json_type = 1;
|
||||
|
||||
DROP TABLE IF EXISTS test_new_json_type;
|
||||
CREATE TABLE test_new_json_type(id UInt32, data JSON, version UInt64) ENGINE=ReplacingMergeTree(version) ORDER BY id;
|
||||
INSERT INTO test_new_json_type format JSONEachRow
|
||||
{"id":1,"data":{"foo1":"bar"},"version":1}
|
||||
{"id":2,"data":{"foo2":"bar"},"version":1}
|
||||
{"id":3,"data":{"foo2":"bar"},"version":1}
|
||||
;
|
||||
|
||||
SELECT * FROM test_new_json_type FINAL WHERE data.foo2 is not null ORDER BY id;
|
||||
|
||||
INSERT INTO test_new_json_type SELECT id, '{"foo2":"baz"}' AS _data, version+1 AS _version FROM test_new_json_type where id=2;
|
||||
|
||||
SELECT * FROM test_new_json_type FINAL WHERE data.foo2 is not null ORDER BY id;
|
||||
|
||||
DROP TABLE test_new_json_type;
|
||||
|
||||
CREATE TABLE test_new_json_type(id Nullable(UInt32), data JSON, version UInt64) ENGINE=ReplacingMergeTree(version) ORDER BY id settings allow_nullable_key=1;
|
||||
INSERT INTO test_new_json_type format JSONEachRow
|
||||
{"id":1,"data":{"foo1":"bar"},"version":1}
|
||||
{"id":2,"data":{"foo2":"bar"},"version":1}
|
||||
{"id":3,"data":{"foo2":"bar"},"version":1}
|
||||
;
|
||||
|
||||
SELECT * FROM test_new_json_type FINAL WHERE data.foo2 is not null ORDER BY id;
|
||||
|
||||
INSERT INTO test_new_json_type SELECT id, '{"foo2":"baz"}' AS _data, version+1 AS _version FROM test_new_json_type where id=2;
|
||||
|
||||
SELECT * FROM test_new_json_type FINAL PREWHERE data.foo2 IS NOT NULL WHERE data.foo2 IS NOT NULL ORDER BY id ASC NULLS FIRST;
|
||||
|
||||
DROP TABLE test_new_json_type;
|
||||
|
Loading…
Reference in New Issue
Block a user