**Describe the unexpected behaviour**
If Null being passed as dictionary key, dictGetOrDefault returns null instead of default value.

**How to reproduce**
Clickhouse version 21.5, 21.1, 20.8

```

CREATE VIEW dict_null_source AS SELECT 1 as key, 1 as val;
CREATE DICTIONARY dict_null (key UInt64, val UInt32) PRIMARY KEY key SOURCE(CLICKHOUSE(host 'localhost' user 'default' table 'dict_null_source' ))LAYOUT(FLAT)LIFETIME(300)


SELECT dictGetOrDefault('default.dict_null', 'val', CAST(NULL, 'Nullable(UInt64)'), 0) AS val

Query id: 79518a8e-b439-4d08-a0b2-85e4b3ef99eb

┌──val─┐
│ ᴺᵁᴸᴸ │
└──────┘
```

**Additional context**
```

SELECT dictGetOrDefault('default.dict_null', 'val', CAST(1, 'UInt64'))

Query id: 71ec76a1-fb61-4641-9145-79c6bfffd490


0 rows in set. Elapsed: 0.001 sec.

Received exception from server (version 21.5.1):
Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Wrong argument count for function dictGetOrDefault: While processing dictGetOrDefault('default.dict_null', 'val', CAST(1, 'UInt64')).

```

Error message in 21.1 was better:  `Number of arguments for function dictGetOrDefault doesn't match: passed 3, should be 4:`

{
        /** We call dictHas function to get which map is key presented in dictionary.
            For key that presented in dictionary dict has result for that key index value will be 1. Otherwise 0.
            We invert result, and then for key that is not presented in dictionary value will be 1. Otherwise 0.
            This inverted result will be used as null column map.
            After that we call dict get function, by contract for key that are not presented in dictionary we
            return default value.
            We create nullable column from dict get result column and null column map.
            2 additional implementation details:
            1. Result from dict get can be tuple if client requested multiple attributes we apply such operation on each result column.
            2. If column is already nullable we merge column null map with null map that we get from dict has.
          */
        auto dict_has_arguments = filterAttributeNameArgumentForDictHas(arguments);
        auto is_key_in_dictionary_column = dictionary_has_func_impl.executeImpl(dict_has_arguments, std::make_shared<DataTypeUInt8>(), input_rows_count);
        auto is_key_in_dictionary_column_mutable = is_key_in_dictionary_column->assumeMutable();
        ColumnVector<UInt8> & is_key_in_dictionary_column_typed = assert_cast<ColumnVector<UInt8> &>(*is_key_in_dictionary_column_mutable);
        PaddedPODArray<UInt8> & is_key_in_dictionary_data = is_key_in_dictionary_column_typed.getData();
        for (auto & key : is_key_in_dictionary_data)
            key = !key;
        auto result_type = dictionary_get_func_impl.getReturnTypeImpl(arguments);
        auto dictionary_get_result_column = dictionary_get_func_impl.executeImpl(arguments, result_type, input_rows_count);
        ColumnPtr result;
        WhichDataType result_data_type(result_type);