**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
class StorageJoin;
using StorageJoinPtr = std::shared_ptr<StorageJoin>;
template <bool or_null>
class ExecutableFunctionJoinGet final : public IExecutableFunction
{
public:
    ExecutableFunctionJoinGet(TableLockHolder table_lock_,
                              StorageJoinPtr storage_join_,
                              const DB::Block & result_columns_)
        : table_lock(std::move(table_lock_))
        , storage_join(std::move(storage_join_))
        , result_columns(result_columns_)
    {}
    static constexpr auto name = or_null ? "joinGetOrNull" : "joinGet";
    bool useDefaultImplementationForNulls() const override { return false; }
    bool useDefaultImplementationForLowCardinalityColumns() const override { return true; }
    bool useDefaultImplementationForConstants() const override { return true; }
    ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override;
    String getName() const override { return name; }
private:
    TableLockHolder table_lock;
    StorageJoinPtr storage_join;
    DB::Block result_columns;
};
template <bool or_null>
class FunctionJoinGet final : public IFunctionBase