The function `toSting` doesn't work correctly with an argument of the type `Date32` if the value of the argument is outside of the range [1970-01-01, 2149-06-06].

**How to reproduce**

ClickHouse server version 21.11.3 revision 54450.
ClickHouse client version 21.11.3.6 (official build).

Run the query:
```SQL
SELECT T.d date, toString(T.d) dateStr
FROM
(
  SELECT '1925-01-01'::Date32 d
  UNION ALL SELECT '1969-12-31'::Date32
  UNION ALL SELECT '1970-01-01'::Date32
  UNION ALL SELECT '2149-06-06'::Date32
  UNION ALL SELECT '2149-06-07'::Date32
  UNION ALL SELECT '2283-11-11'::Date32
 ) AS T
 ORDER BY T.d
```

Rows returned by the query:
```
┌───────date─┬─dateStr────┐
│ 1925-01-01 │ 2104-06-07 │
│ 1969-12-31 │ 2149-06-06 │
│ 1970-01-01 │ 1970-01-01 │
│ 2149-06-06 │ 2149-06-06 │
│ 2149-06-07 │ 1970-01-01 │
│ 2283-11-11 │ 2104-06-06 │
└────────────┴────────────┘
```

**Expected behavior**

Values in the columns **date** and **dateStr** should be the same.
For example, `toString('1969-12-31'::Date32)` should return the string "1969-12-31", but it returns "2149-06-06".

safe_convert_custom_types = to_type->getCustomName() && from_type_custom_name->getName() == to_type->getCustomName()->getName();
        if (from_type->equals(*to_type) && safe_convert_custom_types)
            return createIdentityWrapper(from_type);
        else if (WhichDataType(from_type).isNothing())
            return createNothingWrapper(to_type.get());
        WrapperType ret;
        auto make_default_wrapper = [&](const auto & types) -> bool
        {
            using Types = std::decay_t<decltype(types)>;
            using ToDataType = typename Types::LeftType;
            if constexpr (
                std::is_same_v<ToDataType, DataTypeUInt16> ||
                std::is_same_v<ToDataType, DataTypeUInt32> ||
                std::is_same_v<ToDataType, DataTypeUInt64> ||
                std::is_same_v<ToDataType, DataTypeUInt128> ||
                std::is_same_v<ToDataType, DataTypeUInt256> ||
                std::is_same_v<ToDataType, DataTypeInt8> ||
                std::is_same_v<ToDataType, DataTypeInt16> ||
                std::is_same_v<ToDataType, DataTypeInt32> ||
                std::is_same_v<ToDataType, DataTypeInt64> ||
                std::is_same_v<ToDataType, DataTypeInt128> ||
                std::is_same_v<ToDataType, DataTypeInt256> ||
                std::is_same_v<ToDataType, DataTypeFloat32> ||
                std::is_same_v<ToDataType, DataTypeFloat64> ||
                std::is_same_v<ToDataType, DataTypeDate> ||
                std::is_same_v<ToDataType, DataTypeDate32> ||
                std::is_same_v<ToDataType, DataTypeDateTime> ||
                std::is_same_v<ToDataType, DataTypeUUID>)
            {
                ret = createWrapper(from_type, checkAndGetDataType<ToDataType>(to_type.get()), requested_result_is_nullable);