**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.
for (T elem_idx = 0, elems = in_data[row_idx]; elem_idx < elems; ++elem_idx)
                    out_data[offset + elem_idx] = static_cast<T>(elem_idx);
                offset += in_data[row_idx];
                out_offsets[row_idx] = offset;
            }
            return ColumnArray::create(std::move(data_col), std::move(offsets_col));
        }
        else
            return nullptr;
    }
    template <typename T>
    ColumnPtr executeConstStartStep(
            const IColumn * end_arg, const T start, const T step, const size_t input_rows_count) const
    {
        auto end_column = checkAndGetColumn<ColumnVector<T>>(end_arg);
        if (!end_column)
            return nullptr;
        const auto & end_data = end_column->getData();
        size_t total_values = 0;
        size_t pre_values = 0;
        PODArray<size_t> row_length(input_rows_count);
        for (size_t row_idx = 0; row_idx < input_rows_count; ++row_idx)
        {
            if (step == 0)
                throw Exception{"A call to function " + getName() + " overflows, the 3rd argument step can't be zero",
                            ErrorCodes::ARGUMENT_OUT_OF_BOUND};
            if (start < end_data[row_idx] && step > 0)
                row_length[row_idx] = (static_cast<__int128_t>(end_data[row_idx]) - static_cast<__int128_t>(start) - 1) / static_cast<__int128_t>(step) + 1;
            else if (start > end_data[row_idx] && step < 0)
                row_length[row_idx] = (static_cast<__int128_t>(end_data[row_idx]) - static_cast<__int128_t>(start) + 1) / static_cast<__int128_t>(step) + 1;