@@ -56,21 +56,27 @@ static ReturnType checkColumnStructure(const ColumnWithTypeAndName & actual, con
5656 return ReturnType (true );
5757
5858 const IColumn * actual_column = actual.column .get ();
59+ const IColumn * expected_column = expected.column .get ();
5960
60- // / If we allow to materialize, and expected column is not const or sparse, then unwrap actual column .
61+ // / If we allow to materialize columns, omit Const and Sparse columns .
6162 if (allow_materialize)
6263 {
63- if (!isColumnConst (*expected.column ))
64- if (const auto * column_const = typeid_cast<const ColumnConst *>(actual_column))
65- actual_column = &column_const->getDataColumn ();
64+ if (const auto * column_const = typeid_cast<const ColumnConst *>(actual_column))
65+ actual_column = &column_const->getDataColumn ();
6666
67- if (!expected.column ->isSparse ())
68- if (const auto * column_sparse = typeid_cast<const ColumnSparse *>(actual_column))
69- actual_column = &column_sparse->getValuesColumn ();
67+ if (const auto * column_const = typeid_cast<const ColumnConst *>(expected_column))
68+ expected_column = &column_const->getDataColumn ();
69+
70+ if (const auto * column_sparse = typeid_cast<const ColumnSparse *>(actual_column))
71+ actual_column = &column_sparse->getValuesColumn ();
72+
73+ if (const auto * column_sparse = typeid_cast<const ColumnSparse *>(expected_column))
74+ expected_column = &column_sparse->getValuesColumn ();
7075 }
7176
7277 const auto * actual_column_maybe_agg = typeid_cast<const ColumnAggregateFunction *>(actual_column);
73- const auto * expected_column_maybe_agg = typeid_cast<const ColumnAggregateFunction *>(expected.column .get ());
78+ const auto * expected_column_maybe_agg = typeid_cast<const ColumnAggregateFunction *>(expected_column);
79+
7480 if (actual_column_maybe_agg && expected_column_maybe_agg)
7581 {
7682 if (!actual_column_maybe_agg->getAggregateFunction ()->haveSameStateRepresentation (*expected_column_maybe_agg->getAggregateFunction ()))
@@ -80,13 +86,16 @@ static ReturnType checkColumnStructure(const ColumnWithTypeAndName & actual, con
8086 actual.dumpStructure (),
8187 expected.dumpStructure ());
8288 }
83- else if (actual_column->getName () != expected.column ->getName ())
89+ else if (actual_column->getName () != expected_column->getName ())
90+ {
8491 return onError<ReturnType>(code,
8592 " Block structure mismatch in {} stream: different columns:\n {}\n {}" ,
8693 context_description,
8794 actual.dumpStructure (),
8895 expected.dumpStructure ());
8996
97+ }
98+
9099 if (isColumnConst (*actual.column ) && isColumnConst (*expected.column )
91100 && !actual.column ->empty () && !expected.column ->empty ()) // / don't check values in empty columns
92101 {
0 commit comments