@@ -39,8 +39,8 @@ FilterTransformAction::FilterTransformAction(
3939 // / Determine position of filter column.
4040 expression->execute (header);
4141
42- filter_column = header.getPositionByName (filter_column_name);
43- auto & column_elem = header.safeGetByPosition (filter_column );
42+ filter_column_position = header.getPositionByName (filter_column_name);
43+ auto & column_elem = header.safeGetByPosition (filter_column_position );
4444
4545 // / Isn't the filter already constant?
4646 if (column_elem.column )
@@ -76,9 +76,10 @@ bool FilterTransformAction::transform(Block & block, FilterPtr & res_filter, boo
7676
7777 if (block.getRSResult ().allMatch ())
7878 {
79- block.insert (
80- filter_column,
81- header.safeGetByPosition (filter_column)); // Make some checks on block structure happy.
79+ auto filter_column = header.safeGetByPosition (filter_column_position).cloneEmpty ();
80+ filter_column.column = filter_column.type ->createColumnConst (block.rows (), static_cast <UInt64>(1 ));
81+ // Make some checks on block structure happy.
82+ block.insert (filter_column_position, std::move (filter_column));
8283 if (return_filter)
8384 res_filter = nullptr ;
8485 return true ;
@@ -95,7 +96,7 @@ bool FilterTransformAction::transform(Block & block, FilterPtr & res_filter, boo
9596
9697 size_t columns = block.columns ();
9798 size_t rows = block.rows ();
98- ColumnPtr column_of_filter = block.safeGetByPosition (filter_column ).column ;
99+ ColumnPtr column_of_filter = block.safeGetByPosition (filter_column_position ).column ;
99100
100101 /* * It happens that at the stage of analysis of expressions (in sample_block) the columns-constants have not been calculated yet,
101102 * and now - are calculated. That is, not all cases are covered by the code above.
@@ -139,8 +140,8 @@ bool FilterTransformAction::transform(Block & block, FilterPtr & res_filter, boo
139140 if (filtered_rows == rows)
140141 {
141142 // / Replace the column with the filter by a constant.
142- block.safeGetByPosition (filter_column). column
143- = block. safeGetByPosition ( filter_column) .type ->createColumnConst (filtered_rows, static_cast <UInt64>(1 ));
143+ auto filter_column = block.safeGetByPosition (filter_column_position);
144+ filter_column. column = filter_column.type ->createColumnConst (filtered_rows, static_cast <UInt64>(1 ));
144145 // / No need to touch the rest of the columns.
145146 return true ;
146147 }
@@ -150,7 +151,7 @@ bool FilterTransformAction::transform(Block & block, FilterPtr & res_filter, boo
150151 {
151152 ColumnWithTypeAndName & current_column = block.safeGetByPosition (i);
152153
153- if (i == filter_column )
154+ if (i == filter_column_position )
154155 {
155156 // / The column with filter itself is replaced with a column with a constant `1`, since after filtering, nothing else will remain.
156157 // / NOTE User could pass column with something different than 0 and 1 for filter.
0 commit comments