ClickHouse server version 20.8.9 revision 54438

Let's imagine some simple table structure:

```
CREATE TABLE users (
    `user_id` Int32
)
```

Modulo operator on **Int32** field with **150** argument returns negative result. This could have happened due to wrong type casting - result should be casted to **Int16** or **UInt8** instead of **Int8**.

```
SELECT 
    user_id % 150, 
    441746 % 150,
    toTypeName(user_id % 150),
    toTypeName(441746 % 150)
FROM users 
WHERE user_id = 441746
LIMIT 1
```

```
┌─modulo(user_id, 150)─┬─modulo(441746, 150)─┬─toTypeName(modulo(user_id, 150))─┬─toTypeName(modulo(441746, 150))─┐
│                -110  │                 146 │ Int8                             │ UInt8                           │
└──────────────────────┴─────────────────────┴──────────────────────────────────┴─────────────────────────────────┘
```
#include <gtest/gtest.h>
#include <iostream>
#include <map>
#include <DataTypes/NumberTraits.h>
#pragma GCC diagnostic ignored "-Wframe-larger-than="
static const std::map<std::pair<std::string, std::string>, std::string> answer =
{
    {{"UInt8", "UInt8"}, "UInt8"},
    {{"UInt8", "UInt16"}, "UInt16"},
    {{"UInt8", "UInt32"}, "UInt32"},
    {{"UInt8", "UInt64"}, "UInt64"},
    {{"UInt8", "UInt256"}, "UInt256"},
    {{"UInt8", "Int8"}, "Int16"},
    {{"UInt8", "Int16"}, "Int16"},
    {{"UInt8", "Int32"}, "Int32"},
    {{"UInt8", "Int64"}, "Int64"},
    {{"UInt8", "Int128"}, "Int128"},
    {{"UInt8", "Int256"}, "Int256"},
    {{"UInt8", "Float32"}, "Float32"},
    {{"UInt8", "Float64"}, "Float64"},
    {{"UInt16", "UInt8"}, "UInt16"},
    {{"UInt16", "UInt16"}, "UInt16"},
    {{"UInt16", "UInt32"}, "UInt32"},
    {{"UInt16", "UInt64"}, "UInt64"},
    {{"UInt16", "UInt256"}, "UInt256"},
    {{"UInt16", "Int8"}, "Int32"},
    {{"UInt16", "Int16"}, "Int32"},
    {{"UInt16", "Int32"}, "Int32"},