**Describe the unexpected behaviour**

If a start value for the Array range() function is specified, the array for subsequent rows doesn't start at the specified value, but instead counts upwards. Example:

```sql
SELECT c1, range(0, c1) AS zero_as_start_val, range(1, c1) AS one_as_start_val, range(c1) AS no_start_val
FROM values(2, 3, 4, 5);
```

| c1 | zero\_as\_start\_val | one\_as\_start\_val | no\_start\_val |
| :--- | :--- | :--- | :--- |
| 2 | \[0, 1\] | \[1\] | \[0, 1\] |
| 3 | \[2, 3, 4\] | \[2, 3\] | \[0, 1, 2\] |
| 4 | \[5, 6, 7, 8\] | \[4, 5, 6\] | \[0, 1, 2, 3\] |
| 5 | \[9, 10, 11, 12, 13\] | \[7, 8, 9, 10\] | \[0, 1, 2, 3, 4\] |


I'm not sure if this is desired behaviour.

**How to reproduce**
* Which ClickHouse server version to use: ClickHouse server version 22.13.1.1133 (official build) (macOS arm64)
* [Clickhouse Playground](https://play.clickhouse.com/play?user=play#U0VMRUNUIGMxLCByYW5nZSgwLCBjMSkgQVMgemVyb19hc19zdGFydF92YWwsIHJhbmdlKDEsIGMxKSBBUyBvbmVfYXNfc3RhcnRfdmFsLCByYW5nZShjMSkgQVMgbm9fc3RhcnRfdmFsCkZST00gdmFsdWVzKDIsIDMsIDQsIDUpOw==)


**Expected behavior**

I'd expect all arrays to start with the specified start value.
row_length[row_idx] = (static_cast<__int128_t>(end_data[row_idx]) - static_cast<__int128_t>(start) - 1) / static_cast<__int128_t>(step_data[row_idx]) + 1;
            else if (start > end_data[row_idx] && step_data[row_idx] < 0)
                row_length[row_idx] = (static_cast<__int128_t>(end_data[row_idx]) - static_cast<__int128_t>(start) + 1) / static_cast<__int128_t>(step_data[row_idx]) + 1;
            else
                row_length[row_idx] = 0;
            pre_values += row_length[row_idx];
            if (pre_values < total_values)
                throw Exception{"A call to function " + getName() + " overflows, investigate the values of arguments you are passing",
                            ErrorCodes::ARGUMENT_OUT_OF_BOUND};
            total_values = pre_values;
            if (total_values > max_elements)
                throw Exception{"A call to function " + getName() + " would produce " + std::to_string(total_values) +
                    " array elements, which is greater than the allowed maximum of " + std::to_string(max_elements),
                    ErrorCodes::ARGUMENT_OUT_OF_BOUND};
        }
        auto data_col = ColumnVector<T>::create(total_values);
        auto offsets_col = ColumnArray::ColumnOffsets::create(end_column->size());
        auto & out_data = data_col->getData();
        auto & out_offsets = offsets_col->getData();
        IColumn::Offset offset{};
        for (size_t row_idx = 0; row_idx < input_rows_count; ++row_idx)
        {
            for (size_t idx = 0; idx < row_length[row_idx]; idx++)
                out_data[offset++] = static_cast<T>(start + offset * step_data[row_idx]);
            out_offsets[row_idx] = offset;
        }
        return ColumnArray::create(std::move(data_col), std::move(offsets_col));
    }
    template <typename T>
    ColumnPtr executeGeneric(