```
SELECT *
FROM xrollup

Query id: e702f6fe-8595-4a9f-aeff-ea65e2045801

┌─metric─┬──────────b─┬─v─┐
│      2 │ 2018-01-01 │ 1 │
│      2 │ 2018-02-02 │ 1 │
└────────┴────────────┴───┘
┌─metric─┬──────────b─┬─v─┐
│      1 │ 2018-01-01 │ 1 │
│      1 │ 2018-01-02 │ 1 │
│      1 │ 2018-02-01 │ 1 │
│      1 │ 2017-03-01 │ 1 │
└────────┴────────────┴───┘

6 rows in set. Elapsed: 0.004 sec.
```

`WITH TOTALS + WITH FILL:`

```
SELECT
    b,
    sum(v)
FROM xrollup
GROUP BY b
    WITH TOTALS
ORDER BY b DESC WITH FILL
LIMIT 5

Query id: ae21086d-eb89-4b73-b9be-7baa4c0cee27

┌──────────b─┬─sum(v)─┐
│ 2018-02-02 │      1 │
│ 2018-02-01 │      1 │
│ 2018-01-31 │      0 │
│ 2018-01-30 │      0 │
│ 2018-01-29 │      0 │
└────────────┴────────┘

Totals:
┌──────────b─┬─sum(v)─┐
│ 1970-01-01 │      6 │
└────────────┴────────┘

5 rows in set. Elapsed: 0.003 sec.
```

`WITH TOTALS + WITH FILL FROM:`

```
SELECT
    b,
    sum(v)
FROM xrollup
GROUP BY b
    WITH TOTALS
ORDER BY b DESC WITH FILL FROM today()
LIMIT 5

Query id: cbf3d659-cf10-4b3b-800f-a5af11fc9faa

┌──────────b─┬─sum(v)─┐
│ 2021-02-18 │      0 │
│ 2021-02-17 │      0 │
│ 2021-02-16 │      0 │
│ 2021-02-15 │      0 │
│ 2021-02-14 │      0 │
└────────────┴────────┘

Totals:
┌──────────b─┬─sum(v)─┐
│ 2021-02-18 │      0 │
└────────────┴────────┘

5 rows in set. Elapsed: 0.006 sec.
```

return;
    }
    size_t num_rows = chunk.getNumRows();
    auto old_columns = chunk.detachColumns();
    init_columns_by_positions(old_columns, old_fill_columns, res_fill_columns, fill_column_positions);
    init_columns_by_positions(old_columns, old_other_columns, res_other_columns, other_column_positions);
    if (first)
    {
        for (size_t i = 0; i < filling_row.size(); ++i)
        {
            auto current_value = (*old_fill_columns[i])[0];
            const auto & fill_from = filling_row.getFillDescription(i).fill_from;
            if (!fill_from.isNull() && !equals(current_value, fill_from))
            {
                filling_row.initFromDefaults(i);
                if (less(fill_from, current_value, filling_row.getDirection(i)))
                    insertFromFillingRow(res_fill_columns, res_other_columns, filling_row);
                break;
            }
            filling_row[i] = current_value;
        }
        first = false;
    }
    for (size_t row_ind = 0; row_ind < num_rows; ++row_ind)
    {
        should_insert_first = next_row < filling_row;
        for (size_t i = 0; i < filling_row.size(); ++i)
        {
            auto current_value = (*old_fill_columns[i])[row_ind];
            const auto & fill_to = filling_row.getFillDescription(i).fill_to;