**Describe the bug**

A combination of `use_join_nulls=1`, a `Nullable(enum)` column, `OUTER JOIN`, and `toString()` may throw an exception while generating a result.

**Does it reproduce on recent release?**

This happens on 21.6.3 stable.

**How to reproduce**

With the following setup:

```sql
CREATE TABLE a (
  key  String
) ENGINE=MergeTree ORDER BY key;

CREATE TABLE b (
  key  String,
  data Nullable(Enum16('a'=1, 'b'=2))
) ENGINE=MergeTree ORDER BY key;

INSERT INTO a VALUES('x');
INSERT INTO a VALUES('y');

INSERT INTO b VALUES('x', 'a');
```

This query appears to work correctly:
```
SELECT
	key, data
FROM a
ANY LEFT OUTER JOIN b USING (key)
FORMAT JSONCompact
SETTINGS join_use_nulls = 1;
```

```
{
        "meta":
        [
                {
                        "name": "key",
                        "type": "String"
                },
                {
                        "name": "data",
                        "type": "Nullable(Enum16('a' = 1, 'b' = 2))"
                }
        ],
        "data":
        [
                ["y", null],                                                                                                                                                                                                
                ["x", "a"]                                                                                                                                                                                                     
        ],
        "rows": 2,
        "statistics":
        {
                "elapsed": 0.002955967,
                "rows_read": 3,
                "bytes_read": 33
        }
}
```

But it throws an exception when `toString()` is applied to the joined column:

```sql
SELECT
	key, toString(data)
FROM a
LEFT OUTER JOIN b USING (key)
FORMAT JSONCompact
SETTINGS join_use_nulls = 1;
```

```
{
        "meta":
        [
                {
                        "name": "key",
                        "type": "String"
                },
                {
                        "name": "toString(data)",
                        "type": "Nullable(String)"
                }
        ],

        "data":
        [
                ["x", "a"]                                                                                                                                                                                                      Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.)
1 rows in set. Elapsed: 0.003 sec.

Received exception from server (version 21.6.3):
Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Unexpected value 0 in enum: while executing 'FUNCTION toString(data :: 1) -> toString(data) Nullable(String) : 2'.
```

**Expected behavior**

It produces a string `NULL` without throwing an exception.
: DateTimeTransformImpl<DataTypeInt32, DataTypeDateTime64, ToDateTime64TransformSigned<Int32>> {};
template <typename Name> struct ConvertImpl<DataTypeInt64, DataTypeDateTime64, Name>
    : DateTimeTransformImpl<DataTypeInt64, DataTypeDateTime64, ToDateTime64TransformSigned<Int64>> {};
template <typename Name> struct ConvertImpl<DataTypeUInt64, DataTypeDateTime64, Name>
    : DateTimeTransformImpl<DataTypeUInt64, DataTypeDateTime64, ToDateTime64TransformUnsigned<UInt64>> {};
template <typename Name> struct ConvertImpl<DataTypeFloat32, DataTypeDateTime64, Name>
    : DateTimeTransformImpl<DataTypeFloat32, DataTypeDateTime64, ToDateTime64TransformFloat<DataTypeFloat32, Float32>> {};
template <typename Name> struct ConvertImpl<DataTypeFloat64, DataTypeDateTime64, Name>
    : DateTimeTransformImpl<DataTypeFloat64, DataTypeDateTime64, ToDateTime64TransformFloat<DataTypeFloat64, Float64>> {};
/** Conversion of DateTime64 to Date or DateTime: discards fractional part.
 */
template <typename Transform>
struct FromDateTime64Transform
{
    static constexpr auto name = Transform::name;
    const DateTime64::NativeType scale_multiplier = 1;
    FromDateTime64Transform(UInt32 scale)
        : scale_multiplier(DecimalUtils::scaleMultiplier<DateTime64::NativeType>(scale))
    {}
    inline auto execute(DateTime64::NativeType dt, const DateLUTImpl & time_zone) const
    {
        const auto c = DecimalUtils::splitWithScaleMultiplier(DateTime64(dt), scale_multiplier);
        return Transform::execute(static_cast<UInt32>(c.whole), time_zone);
    }
};
/** Conversion of DateTime64 to Date or DateTime: discards fractional part.
 */
template <typename Name> struct ConvertImpl<DataTypeDateTime64, DataTypeDate, Name, ConvertDefaultBehaviorTag>
    : DateTimeTransformImpl<DataTypeDateTime64, DataTypeDate, TransformDateTime64<ToDateImpl>> {};
template <typename Name> struct ConvertImpl<DataTypeDateTime64, DataTypeDateTime, Name, ConvertDefaultBehaviorTag>