```
create table test_lc(a LowCardinality(String)) Engine = MergeTree order by tuple();

insert into test_lc values ('abcd');

select * from test_lc format Parquet;

Exception on client:
Code: 50. DB::Exception: The type "LowCardinality" of a column "a" is not supported for conversion into a Parquet data format

Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.3.12 revision 54433.
```

Shorter version of the test:
```
select toLowCardinality('abcd') format Parquet;

Exception on client:
Code: 50. DB::Exception: The type "LowCardinality" of a column "toLowCardinality('abcd')" is not supported for conversion into a Parquet data format

Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.3.12 revision 54433.
```

<s>P.S. Insert works ok.</s>
```
# clickhouse-client --query="select 'ab' as a format Parquet" | clickhouse-client --query="insert into test_lc format Parquet"
```

UPD: not ok with `LowCardinality(Nullable(String))` (see comment). 
{
            arrow::BinaryArray & chunk = static_cast<arrow::BinaryArray &>(*(arrow_column->chunk(chunk_i)));
            std::shared_ptr<arrow::Buffer> buffer = chunk.value_data();
            const size_t chunk_length = chunk.length();
            for (size_t offset_i = 0; offset_i != chunk_length; ++offset_i)
            {
                if (!chunk.IsNull(offset_i) && buffer)
                {
                    const auto * raw_data = buffer->data() + chunk.value_offset(offset_i);
                    column_chars_t.insert_assume_reserved(raw_data, raw_data + chunk.value_length(offset_i));
                }
                column_chars_t.emplace_back('\0');
                column_offsets.emplace_back(column_chars_t.size());
            }
        }
    }
    static void fillColumnWithBooleanData(std::shared_ptr<arrow::ChunkedArray> & arrow_column, MutableColumnPtr & internal_column)
    {
        auto & column_data = assert_cast<ColumnVector<UInt8> &>(*internal_column).getData();
        column_data.reserve(arrow_column->length());
        for (size_t chunk_i = 0, num_chunks = static_cast<size_t>(arrow_column->num_chunks()); chunk_i < num_chunks; ++chunk_i)
        {
            arrow::BooleanArray & chunk = static_cast<arrow::BooleanArray &>(*(arrow_column->chunk(chunk_i)));
            
            std::shared_ptr<arrow::Buffer> buffer = chunk.data()->buffers[1];
            for (size_t bool_i = 0; bool_i != static_cast<size_t>(chunk.length()); ++bool_i)
                column_data.emplace_back(chunk.Value(bool_i));
        }
    }
    static void fillColumnWithDate32Data(std::shared_ptr<arrow::ChunkedArray> & arrow_column, MutableColumnPtr & internal_column)