**Describe the issue**
On empty strings, the behaviour of the function `CAST('', 'IPv6')` changed between the versions 21.x and 22.x

**How to reproduce**
On 21.8.14.5:
```
SELECT CAST('', 'IPv6');
Returns: 
	
::
```

On 22.2.2.1:
```
SELECT CAST('', 'IPv6');
Triggers error: 

Code: 441. DB::Exception: Invalid IPv6 value.: While processing CAST('', 'IPv6'). (CANNOT_PARSE_DOMAIN_VALUE_FROM_STRING) (version 22.2.2.1)

```

**Additional context**
This can prevent some users from upgrading to 22.x when the use of this function is spread across a number of table definitions and environments. The following workaround `CAST(toFixedString('', 16), 'IPv6')` works but the manual task of updating all the occurrences is challenging.

{
public:
    using MonotonicityForRange = FunctionCastBase::MonotonicityForRange;
    using Diagnostic = FunctionCastBase::Diagnostic;
    static constexpr auto name = cast_type == CastType::accurate
        ? CastName::accurate_cast_name
        : (cast_type == CastType::accurateOrNull ? CastName::accurate_cast_or_null_name : CastName::cast_name);
    String getName() const override { return name; }
    size_t getNumberOfArguments() const override { return 2; }
    ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; }
    explicit CastOverloadResolverImpl(std::optional<Diagnostic> diagnostic_, bool keep_nullable_, bool cast_ipv4_ipv6_default_on_conversion_error_)
        : diagnostic(std::move(diagnostic_))
        , keep_nullable(keep_nullable_)
        , cast_ipv4_ipv6_default_on_conversion_error(cast_ipv4_ipv6_default_on_conversion_error_)
    {
    }
    static FunctionOverloadResolverPtr create(ContextPtr context)
    {
        const auto & settings_ref = context->getSettingsRef();
        if constexpr (internal)
            return createImpl({}, false , false );
        return createImpl({}, settings_ref.cast_keep_nullable, settings_ref.cast_ipv4_ipv6_default_on_conversion_error);
    }
    static FunctionOverloadResolverPtr createImpl(std::optional<Diagnostic> diagnostic = {}, bool keep_nullable = false, bool cast_ipv4_ipv6_default_on_conversion_error = false)
    {
        assert(!internal || !keep_nullable);
        return std::make_unique<CastOverloadResolverImpl>(std::move(diagnostic), keep_nullable, cast_ipv4_ipv6_default_on_conversion_error);
    }
protected:
    FunctionBasePtr buildImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & return_type) const override