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
```
static size_t getNumberOfArguments() { return 2; }
    
    static void checkArguments(const DataTypes & arguments)
    {
        SplitByStringImpl::checkArguments(arguments);
    }
    
    void init(const ColumnsWithTypeAndName & arguments)
    {
        const ColumnConst * col = checkAndGetColumnConstStringOrFixedString(arguments[0].column.get());
        if (!col)
            throw Exception("Illegal column " + arguments[0].column->getName()
                            + " of first argument of function " + getName() + ". Must be constant string.",
                            ErrorCodes::ILLEGAL_COLUMN);
        if (!col->getValue<String>().empty())
            re = Regexps::get<false, false>(col->getValue<String>());
    }
    
    size_t getStringsArgumentPosition()
    {
        return 1;
    }
    
    void set(Pos pos_, Pos end_)
    {
        pos = pos_;
        end = end_;
    }
    
    bool get(Pos & token_begin, Pos & token_end)