For example Null can be represented as empty string

```sql
select arrayStringConcat(['x',Null], ';');

┌─arrayStringConcat(['x', Null], ';')─┐
│ x;                                  │
└─────────────────────────────────────┘
```

But mostly it for avoiding a cast in case of Nullable Strings
```
SELECT arrayStringConcat(col0, ';')
FROM
(
    SELECT [toNullable('x')] AS col0
) AS t
```

Also I think arrayStringConcat can support any types not only Strings, it allows to avoid explicit casts.

```
SELECT arrayStringConcat(col0, ';')
FROM
(
    SELECT [1, 2, 3] AS col0
) AS t
```
ColumnArray::Offset current_src_array_offset = 0;
        ColumnString::Offset current_dst_string_offset = 0;
        
        for (size_t i = 0; i < size; ++i)
        {
            bool first_non_null = true;
            
            for (auto next_src_array_offset = src_array_offsets[i]; current_src_array_offset < next_src_array_offset; ++current_src_array_offset)
            {
                if (unlikely(null_map && null_map[current_src_array_offset]))
                    continue;
                if (!first_non_null)
                {
                    memcpy(&dst_chars[current_dst_string_offset], delimiter, delimiter_size);
                    current_dst_string_offset += delimiter_size;
                }
                first_non_null = false;
                const auto current_src_string_offset = current_src_array_offset ? src_string_offsets[current_src_array_offset - 1] : 0;
                size_t bytes_to_copy = src_string_offsets[current_src_array_offset] - current_src_string_offset - 1;
                memcpySmallAllowReadWriteOverflow15(
                    &dst_chars[current_dst_string_offset], &src_chars[current_src_string_offset], bytes_to_copy);
                current_dst_string_offset += bytes_to_copy;
            }
            dst_chars[current_dst_string_offset] = 0;
            ++current_dst_string_offset;
            dst_string_offsets[i] = current_dst_string_offset;
        }
        dst_chars.resize(dst_string_offsets.back());
    }
    static void executeInternal(