**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``.

{
    readQuoted(x, buf);
}
inline void skipWhitespaceIfAny(ReadBuffer & buf, bool one_line = false)
{
    if (!one_line)
        while (!buf.eof() && isWhitespaceASCII(*buf.position()))
            ++buf.position();
    else
        while (!buf.eof() && isWhitespaceASCIIOneLine(*buf.position()))
            ++buf.position();
}
void skipJSONField(ReadBuffer & buf, const StringRef & name_of_field);
/** Read serialized exception.
  * During serialization/deserialization some information is lost
  * (type is cut to base class, 'message' replaced by 'displayText', and stack trace is appended to 'message')
  * Some additional message could be appended to exception (example: you could add information about from where it was received).
  */
Exception readException(ReadBuffer & buf, const String & additional_message = "", bool remote_exception = false);
void readAndThrowException(ReadBuffer & buf, const String & additional_message = "");
/** Helper function for implementation.
  */
template <ReadIntTextCheckOverflow check_overflow = ReadIntTextCheckOverflow::CHECK_OVERFLOW, typename T>
static inline const char * tryReadIntText(T & x, const char * pos, const char * end)