Skip to content
Merged
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
27 changes: 18 additions & 9 deletions src/Core/Block.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const ColumnConst *>(actual_column))
actual_column = &column_const->getDataColumn();
if (const auto * column_const = typeid_cast<const ColumnConst *>(actual_column))
actual_column = &column_const->getDataColumn();

if (!expected.column->isSparse())
if (const auto * column_sparse = typeid_cast<const ColumnSparse *>(actual_column))
actual_column = &column_sparse->getValuesColumn();
if (const auto * column_const = typeid_cast<const ColumnConst *>(expected_column))
expected_column = &column_const->getDataColumn();

if (const auto * column_sparse = typeid_cast<const ColumnSparse *>(actual_column))
actual_column = &column_sparse->getValuesColumn();

if (const auto * column_sparse = typeid_cast<const ColumnSparse *>(expected_column))
expected_column = &column_sparse->getValuesColumn();
}

const auto * actual_column_maybe_agg = typeid_cast<const ColumnAggregateFunction *>(actual_column);
const auto * expected_column_maybe_agg = typeid_cast<const ColumnAggregateFunction *>(expected.column.get());
const auto * expected_column_maybe_agg = typeid_cast<const ColumnAggregateFunction *>(expected_column);

if (actual_column_maybe_agg && expected_column_maybe_agg)
{
if (!actual_column_maybe_agg->getAggregateFunction()->haveSameStateRepresentation(*expected_column_maybe_agg->getAggregateFunction()))
Expand All @@ -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<ReturnType>(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
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
redefined
redefined
redefined
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,11 @@ FROM
);

-- query 3
-- it works with old analyzer
SELECT my_field
FROM
(
SELECT
*,
'redefined' AS my_field
from (select * from test_subquery)
); -- {serverError AMBIGUOUS_COLUMN_NAME}
);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2
28 changes: 28 additions & 0 deletions tests/queries/0_stateless/03443_projection_sparse.sql
Original file line number Diff line number Diff line change
@@ -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;
Loading