**Describe the bug**

When doing `joinGet(<join table>, <column with LowCardinality(String) type>, <key>)`, ClickHouse returns `Error: Invalid column type for ColumnUnique::insertRangeFrom. Expected String, got ColumnLowCardinality`

**Version**

**21.5.4.6809**

**How to reproduce**

```sql
ClickHouse client version 21.5.4.6809.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.5.4 revision 54448.

x390 :) create table j (a String, b LowCardinality(String), c String) Engine = Join(ANY, LEFT, a)

CREATE TABLE j
(
    `a` String,
    `b` LowCardinality(String),
    `c` String
)
ENGINE = Join(ANY, LEFT, a)

Query id: a373b613-b438-47fe-8fd6-dfabb93f9ed9

Ok.

0 rows in set. Elapsed: 0.005 sec. 

x390 :) insert into j values ('a', 'b', 'c')

INSERT INTO j VALUES

Query id: ce8ba17b-43c7-4992-b901-2eb24d7ac2bb

Ok.

1 rows in set. Elapsed: 0.005 sec. 

x390 :) select joinGet('j', 'b', 'a')

SELECT joinGet('j', 'b', 'a')

Query id: 52fa0fd7-6967-4fbb-9aea-13fd600ecf6b


0 rows in set. Elapsed: 0.005 sec. 

Received exception from server (version 21.5.4):
Code: 44. DB::Exception: Received from localhost:9000. DB::Exception: Invalid column type for ColumnUnique::insertRangeFrom. Expected String, got ColumnLowCardinality: While processing joinGet('j', 'b', 'a'). 

x390 :) select joinGet('j', 'c', 'a')

SELECT joinGet('j', 'c', 'a')

Query id: f125b316-f017-4e6e-9eac-9c5278fda6a9

┌─joinGet('j', 'c', 'a')─┐
│ c                      │
└────────────────────────┘

1 rows in set. Elapsed: 0.005 sec. 
```
**Expected behavior**

```sql

SELECT joinGet('j', 'b', 'a')


┌─joinGet('j', 'b', 'a')─┐
│ b                      │
└────────────────────────┘
```

**Additional context**

Tested with **20.7.2.30** too
{
public:
    static constexpr auto name = or_null ? "joinGetOrNull" : "joinGet";
    FunctionJoinGet(TableLockHolder table_lock_,
                    StorageJoinPtr storage_join_, String attr_name_,
                    DataTypes argument_types_, DataTypePtr return_type_)
        : table_lock(std::move(table_lock_))
        , storage_join(storage_join_)
        , attr_name(std::move(attr_name_))
        , argument_types(std::move(argument_types_))
        , return_type(std::move(return_type_))
    {
    }
    String getName() const override { return name; }
    const DataTypes & getArgumentTypes() const override { return argument_types; }
    const DataTypePtr & getResultType() const override { return return_type; }
    ExecutableFunctionPtr prepare(const ColumnsWithTypeAndName &) const override;
private:
    TableLockHolder table_lock;
    StorageJoinPtr storage_join;
    const String attr_name;
    DataTypes argument_types;
    DataTypePtr return_type;
};
template <bool or_null>
class JoinGetOverloadResolver final : public IFunctionOverloadResolver, WithContext