**Describe the unexpected behaviour**
ClickHouse returns exception if you would try to read polygon dictionary via SELECT query.

**How to reproduce**
ClickHouse version 21.10


```
CREATE DICTIONARY polygon_dict (
    key Array(Array(Array(Array(Float64)))),
    name String,
    value UInt64
)
PRIMARY KEY key
LAYOUT(POLYGON())
SOURCE(CLICKHOUSE(table 'polygon_dict_src'))
LIFETIME(MIN 300 MAX 360);

CREATE TABLE polygon_dict_src
(
    `key` Array(Array(Array(Array(Float64)))),
    `name` String,
    `value` UInt64
)
ENGINE = Log
	
INSERT INTO polygon_dict_src SELECT [[[[1.1,2.1],[5,3],[6,4],[1,4]]]], 'some', 10;


CREATE DICTIONARY polygon_dict (
    key Array(Array(Array(Array(Float64)))),
    name String,
    value UInt64
)
PRIMARY KEY key
LAYOUT(POLYGON())
SOURCE(CLICKHOUSE(table 'polygon_dict_src'))
LIFETIME(MIN 300 MAX 360);

SELECT dictGet(polygon_dict, 'name', (2., 3.)) AS x

┌─x────┐
│ some │
└──────┘

SELECT *
FROM polygon_dict

0 rows in set. Elapsed: 0.008 sec.

Received exception from server (version 21.10.1):
Code: 1. DB::Exception: Received from localhost:9000. DB::Exception: Reading the dictionary is not allowed. (UNSUPPORTED_METHOD)
```


**Expected behavior**
It's allowed to read POLYGON dictionaries via SELECT query.

for (size_t i = 0; i < polygons.size(); ++i)
    {
        auto & polygon = polygons[i];
        bg::correct(polygon);
        areas[i] = bg::area(polygon);
        polygon_ids.emplace_back(polygon, i);
    }
    std::sort(polygon_ids.begin(), polygon_ids.end(), [& areas](const auto & lhs, const auto & rhs)
    {
        return areas[lhs.second] < areas[rhs.second];
    });
    std::vector<size_t> correct_ids;
    correct_ids.reserve(polygon_ids.size());
    for (size_t i = 0; i < polygon_ids.size(); ++i)
    {
        auto & polygon = polygon_ids[i];
        correct_ids.emplace_back(polygon_index_to_attribute_value_index[polygon.second]);
        polygons[i] = polygon.first;
    }
    polygon_index_to_attribute_value_index = std::move(correct_ids);
}
void IPolygonDictionary::calculateBytesAllocated()
{
    
    for (const auto & column : attributes)
        bytes_allocated += column->allocatedBytes();
    for (auto & polygon : polygons)
        bytes_allocated += bg::num_points(polygon) * sizeof(Point);
}
std::vector<IPolygonDictionary::Point> IPolygonDictionary::extractPoints(const Columns & key_columns)