mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-14 02:12:21 +00:00
Fix bug on DELETE and UPDATE with json subcolumns
This commit is contained in:
parent
8f6cd157b9
commit
cf8c614fed
@ -119,7 +119,11 @@ MergeTreeSequentialSource::MergeTreeSequentialSource(
|
|||||||
addTotalRowsApprox(data_part->rows_count);
|
addTotalRowsApprox(data_part->rows_count);
|
||||||
|
|
||||||
/// Add columns because we don't want to read empty blocks
|
/// Add columns because we don't want to read empty blocks
|
||||||
injectRequiredColumns(LoadedMergeTreeDataPartInfoForReader(data_part, alter_conversions), storage_snapshot, /*with_subcolumns=*/ false, columns_to_read);
|
injectRequiredColumns(
|
||||||
|
LoadedMergeTreeDataPartInfoForReader(data_part, alter_conversions),
|
||||||
|
storage_snapshot,
|
||||||
|
storage.supportsSubcolumns(),
|
||||||
|
columns_to_read);
|
||||||
|
|
||||||
NamesAndTypesList columns_for_reader;
|
NamesAndTypesList columns_for_reader;
|
||||||
if (take_column_types_from_storage)
|
if (take_column_types_from_storage)
|
||||||
@ -127,6 +131,8 @@ MergeTreeSequentialSource::MergeTreeSequentialSource(
|
|||||||
auto options = GetColumnsOptions(GetColumnsOptions::AllPhysical)
|
auto options = GetColumnsOptions(GetColumnsOptions::AllPhysical)
|
||||||
.withExtendedObjects()
|
.withExtendedObjects()
|
||||||
.withSystemColumns();
|
.withSystemColumns();
|
||||||
|
if (storage.supportsSubcolumns())
|
||||||
|
options.withSubcolumns();
|
||||||
columns_for_reader = storage_snapshot->getColumnsByNames(options, columns_to_read);
|
columns_for_reader = storage_snapshot->getColumnsByNames(options, columns_to_read);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -59,6 +59,21 @@ public:
|
|||||||
return std::make_shared<StorageSnapshot>(*this, metadata_snapshot, std::move(object_columns));
|
return std::make_shared<StorageSnapshot>(*this, metadata_snapshot, std::move(object_columns));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StorageSnapshotPtr getStorageSnapshotForQuery(
|
||||||
|
const StorageMetadataPtr & metadata_snapshot, const ASTPtr & /*query*/, ContextPtr /*query_context*/) const override
|
||||||
|
{
|
||||||
|
const auto & storage_columns = metadata_snapshot->getColumns();
|
||||||
|
if (!hasDynamicSubcolumns(storage_columns))
|
||||||
|
return std::make_shared<StorageSnapshot>(*this, metadata_snapshot);
|
||||||
|
|
||||||
|
auto data_parts = storage.getDataPartsVectorForInternalUsage();
|
||||||
|
|
||||||
|
auto object_columns = getConcreteObjectColumns(
|
||||||
|
data_parts.begin(), data_parts.end(), storage_columns, [](const auto & part) -> const auto & { return part->getColumns(); });
|
||||||
|
|
||||||
|
return std::make_shared<StorageSnapshot>(*this, metadata_snapshot, std::move(object_columns));
|
||||||
|
}
|
||||||
|
|
||||||
void read(
|
void read(
|
||||||
QueryPlan & query_plan,
|
QueryPlan & query_plan,
|
||||||
const Names & column_names,
|
const Names & column_names,
|
||||||
@ -89,6 +104,8 @@ public:
|
|||||||
|
|
||||||
bool supportsDynamicSubcolumns() const override { return true; }
|
bool supportsDynamicSubcolumns() const override { return true; }
|
||||||
|
|
||||||
|
bool supportsSubcolumns() const override { return true; }
|
||||||
|
|
||||||
bool mayBenefitFromIndexForIn(
|
bool mayBenefitFromIndexForIn(
|
||||||
const ASTPtr & left_in_operand, ContextPtr query_context, const StorageMetadataPtr & metadata_snapshot) const override
|
const ASTPtr & left_in_operand, ContextPtr query_context, const StorageMetadataPtr & metadata_snapshot) const override
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
6 1
|
||||||
|
5 2
|
||||||
|
4 3
|
||||||
|
3 4
|
||||||
|
4 ttt
|
||||||
|
5 ttt
|
||||||
|
6 ttt
|
||||||
|
{"a":"1","obj":{"k1":1,"k2":0,"k3":0}}
|
||||||
|
{"a":"3","obj":{"k1":0,"k2":0,"k3":1}}
|
||||||
|
{"a":"1","obj":{"k1":1,"k2":0,"k3":0}}
|
51
tests/queries/0_stateless/02874_mutations_subcolumns.sql
Normal file
51
tests/queries/0_stateless/02874_mutations_subcolumns.sql
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
-- Tags: no-replicated-database
|
||||||
|
-- This won't work in case there are misssing subcolumns in different shards
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t_mutations_subcolumns;
|
||||||
|
|
||||||
|
SET allow_experimental_object_type = 1;
|
||||||
|
|
||||||
|
CREATE TABLE t_mutations_subcolumns (id UInt64, n String, obj JSON)
|
||||||
|
ENGINE = MergeTree ORDER BY id;
|
||||||
|
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (1, 'aaa', '{"k1": {"k2": "foo"}, "k3": 5}');
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (2, 'bbb', '{"k1": {"k2": "fee"}, "k3": 4}');
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (3, 'ccc', '{"k1": {"k2": "foo", "k4": "baz"}, "k3": 4}');
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (4, 'ddd', '{"k1": {"k2": "foo"}, "k3": 4}');
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (5, 'eee', '{"k1": {"k2": "foo"}, "k3": 4}');
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (6, 'fff', '{"k1": {"k2": "foo"}, "k3": 4}');
|
||||||
|
|
||||||
|
OPTIMIZE TABLE t_mutations_subcolumns FINAL;
|
||||||
|
|
||||||
|
SELECT count(), min(id) FROM t_mutations_subcolumns;
|
||||||
|
|
||||||
|
SET mutations_sync = 2;
|
||||||
|
|
||||||
|
ALTER TABLE t_mutations_subcolumns DELETE WHERE obj.k3 = 5;
|
||||||
|
SELECT count(), min(id) FROM t_mutations_subcolumns;
|
||||||
|
|
||||||
|
DELETE FROM t_mutations_subcolumns WHERE obj.k1.k2 = 'fee';
|
||||||
|
SELECT count(), min(id) FROM t_mutations_subcolumns;
|
||||||
|
|
||||||
|
ALTER TABLE t_mutations_subcolumns DELETE WHERE obj.k1 = ('foo', 'baz');
|
||||||
|
SELECT count(), min(id) FROM t_mutations_subcolumns;
|
||||||
|
|
||||||
|
ALTER TABLE t_mutations_subcolumns UPDATE n = 'ttt' WHERE obj.k1.k2 = 'foo';
|
||||||
|
SELECT id, n FROM t_mutations_subcolumns;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t_mutations_subcolumns;
|
||||||
|
|
||||||
|
CREATE TABLE t_mutations_subcolumns (a UInt64, obj JSON)
|
||||||
|
ENGINE = MergeTree ORDER BY a PARTITION BY a;
|
||||||
|
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (1, '{"k1": 1}');
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (2, '{"k2": 1}');
|
||||||
|
INSERT INTO t_mutations_subcolumns VALUES (3, '{"k3": 1}');
|
||||||
|
|
||||||
|
ALTER TABLE t_mutations_subcolumns DELETE WHERE obj.k2 = 1;
|
||||||
|
SELECT * FROM t_mutations_subcolumns ORDER BY a FORMAT JSONEachRow;
|
||||||
|
|
||||||
|
ALTER TABLE t_mutations_subcolumns DELETE WHERE obj.k1 = 0;
|
||||||
|
SELECT * FROM t_mutations_subcolumns ORDER BY a FORMAT JSONEachRow;
|
||||||
|
|
||||||
|
DROP TABLE t_mutations_subcolumns;
|
Loading…
Reference in New Issue
Block a user