**Describe the bug**

-2147483648 is the minimum integer representable with Int32, but ``toInt32OrNull('-2147483648')`` returns ``NULL``. On the other hand ``toInt32('-2147483648')`` correctly returns ``-2147483648``.

**Does it reproduce on recent release?**

Yes. It happens on 21.7.5.29-stable

**How to reproduce**

```
SELECT
    toInt32('-2147483648'),
    toInt32OrNull('-2147483648')

Query id: 94f4e069-6c0e-44d9-8e94-7ee83b90a529

┌─toInt32('-2147483648')─┬─toInt32OrNull('-2147483648')─┐
│            -2147483648 │                         ᴺᵁᴸᴸ │
└────────────────────────┴──────────────────────────────┘
```

**Expected behavior**

``toInt32('-2147483648')`` and ``toInt32OrNull('-2147483648')`` should both return ``-2147483648``.

{
    readDateTimeTextImpl<void>(datetime64, scale, buf, date_lut);
}
inline bool tryReadDateTimeText(time_t & datetime, ReadBuffer & buf, const DateLUTImpl & time_zone = DateLUT::instance())
{
    return readDateTimeTextImpl<bool>(datetime, buf, time_zone);
}
inline bool tryReadDateTime64Text(DateTime64 & datetime64, UInt32 scale, ReadBuffer & buf, const DateLUTImpl & date_lut = DateLUT::instance())
{
    return readDateTimeTextImpl<bool>(datetime64, scale, buf, date_lut);
}
inline void readDateTimeText(LocalDateTime & datetime, ReadBuffer & buf)
{
    char s[19];
    size_t size = buf.read(s, 19);
    if (19 != size)
    {
        s[size] = 0;
        throw ParsingException(std::string("Cannot parse datetime ") + s, ErrorCodes::CANNOT_PARSE_DATETIME);
    }
    datetime.year((s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0'));
    datetime.month((s[5] - '0') * 10 + (s[6] - '0'));
    datetime.day((s[8] - '0') * 10 + (s[9] - '0'));
    datetime.hour((s[11] - '0') * 10 + (s[12] - '0'));
    datetime.minute((s[14] - '0') * 10 + (s[15] - '0'));
    datetime.second((s[17] - '0') * 10 + (s[18] - '0'));
}
template <typename T>
inline std::enable_if_t<is_arithmetic_v<T>, void>