diff --git a/src/Core/Block.cpp b/src/Core/Block.cpp index d560cb2c1053..ccab2a468223 100644 --- a/src/Core/Block.cpp +++ b/src/Core/Block.cpp @@ -56,21 +56,27 @@ static ReturnType checkColumnStructure(const ColumnWithTypeAndName & actual, con return ReturnType(true); const IColumn * actual_column = actual.column.get(); + const IColumn * expected_column = expected.column.get(); - /// If we allow to materialize, and expected column is not const or sparse, then unwrap actual column. + /// If we allow to materialize columns, omit Const and Sparse columns. if (allow_materialize) { - if (!isColumnConst(*expected.column)) - if (const auto * column_const = typeid_cast(actual_column)) - actual_column = &column_const->getDataColumn(); + if (const auto * column_const = typeid_cast(actual_column)) + actual_column = &column_const->getDataColumn(); - if (!expected.column->isSparse()) - if (const auto * column_sparse = typeid_cast(actual_column)) - actual_column = &column_sparse->getValuesColumn(); + if (const auto * column_const = typeid_cast(expected_column)) + expected_column = &column_const->getDataColumn(); + + if (const auto * column_sparse = typeid_cast(actual_column)) + actual_column = &column_sparse->getValuesColumn(); + + if (const auto * column_sparse = typeid_cast(expected_column)) + expected_column = &column_sparse->getValuesColumn(); } const auto * actual_column_maybe_agg = typeid_cast(actual_column); - const auto * expected_column_maybe_agg = typeid_cast(expected.column.get()); + const auto * expected_column_maybe_agg = typeid_cast(expected_column); + if (actual_column_maybe_agg && expected_column_maybe_agg) { if (!actual_column_maybe_agg->getAggregateFunction()->haveSameStateRepresentation(*expected_column_maybe_agg->getAggregateFunction())) @@ -80,13 +86,16 @@ static ReturnType checkColumnStructure(const ColumnWithTypeAndName & actual, con actual.dumpStructure(), expected.dumpStructure()); } - else if (actual_column->getName() != expected.column->getName()) + else if (actual_column->getName() != expected_column->getName()) + { return onError(code, "Block structure mismatch in {} stream: different columns:\n{}\n{}", context_description, actual.dumpStructure(), expected.dumpStructure()); + } + if (isColumnConst(*actual.column) && isColumnConst(*expected.column) && !actual.column->empty() && !expected.column->empty()) /// don't check values in empty columns { diff --git a/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.reference b/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.reference index 01c8b1dc904d..1e53502e4ef2 100644 --- a/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.reference +++ b/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.reference @@ -1,2 +1,3 @@ redefined redefined +redefined diff --git a/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.sql b/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.sql index 891eb7aac1c7..bbbdde7f4394 100644 --- a/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.sql +++ b/tests/queries/0_stateless/03121_analyzer_filed_redefenition_in_subquery.sql @@ -28,7 +28,6 @@ FROM ); -- query 3 --- it works with old analyzer SELECT my_field FROM ( @@ -36,4 +35,4 @@ FROM *, 'redefined' AS my_field from (select * from test_subquery) -); -- {serverError AMBIGUOUS_COLUMN_NAME} +); diff --git a/tests/queries/0_stateless/03443_projection_sparse.reference b/tests/queries/0_stateless/03443_projection_sparse.reference new file mode 100644 index 000000000000..0cfbf08886fc --- /dev/null +++ b/tests/queries/0_stateless/03443_projection_sparse.reference @@ -0,0 +1 @@ +2 diff --git a/tests/queries/0_stateless/03443_projection_sparse.sql b/tests/queries/0_stateless/03443_projection_sparse.sql new file mode 100644 index 000000000000..50f257a22f12 --- /dev/null +++ b/tests/queries/0_stateless/03443_projection_sparse.sql @@ -0,0 +1,28 @@ + +DROP TABLE IF EXISTS t_projection_sparse; +CREATE TABLE t_projection_sparse +( + `id` String, + `val` AggregateFunction(sum, UInt64), + PROJECTION projection_traces_by_id + ( + SELECT + id, + finalizeAggregation(val) + ORDER BY finalizeAggregation(val) + ) +) +ENGINE = AggregatingMergeTree +ORDER BY id +SETTINGS deduplicate_merge_projection_mode = 'rebuild', index_granularity = 1; + +INSERT INTO t_projection_sparse VALUES ('aa', initializeAggregation('sumState', 0::UInt64)); +INSERT INTO t_projection_sparse VALUES ('aa', initializeAggregation('sumState', 0::UInt64)); +INSERT INTO t_projection_sparse VALUES ('bb', initializeAggregation('sumState', 0::UInt64)); + +OPTIMIZE TABLE t_projection_sparse FINAL; +OPTIMIZE TABLE t_projection_sparse FINAL; + +SELECT count() FROM t_projection_sparse WHERE finalizeAggregation(val) = 0; + +DROP TABLE t_projection_sparse;