**Use case**
I'm using `ip_trie` on maxmind geoip databases. Given an IP address I want to find out what key was used (ie what network the IP comes under). But it seems it is not possible to look up the key field when using `dictGet`?

```
        <layout>
            <ip_trie/>
        </layout>
        <structure>
            <key>
                <attribute>
                    <name>network</name>
                    <type>String</type>
                </attribute>
            </key>
            <attribute>
                <name>geoname_id</name>
                <type>UInt32</type>
                <null_value>0</null_value>
            </attribute>
...
```

```
clickhouse :) select dictGet('geoip_city_blocks_ipv4', 'geoname_id', tuple(toUInt32(toIPv4('1.1.1.1')))) ;

┌─dictGet('geoip_city_blocks_ipv4', 'geoname_id', tuple(toUInt32(toIPv4('1.1.1.1'))))─┐
│                                                                             2077456 │
└─────────────────────────────────────────────────────────────────────────────────────┘

clickhouse :) select dictGet('geoip_city_blocks_ipv4', 'network', tuple(toUInt32(toIPv4('1.1.1.1')))) ;

Received exception from server (version 20.11.3):
Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: No such attribute 'network': While processing dictGet('geoip_city_blocks_ipv4', 'network', tuple(toUInt32(toIPv4('1.1.1.1')))). 
```

{
public:
    IPAddressDictionary(
        const StorageID & dict_id_,
        const DictionaryStructure & dict_struct_,
        DictionarySourcePtr source_ptr_,
        const DictionaryLifetime dict_lifetime_,
        bool require_nonempty_);
    std::string getKeyDescription() const { return key_description; }
    std::string getTypeName() const override { return "Trie"; }
    size_t getBytesAllocated() const override { return bytes_allocated; }
    size_t getQueryCount() const override { return query_count.load(std::memory_order_relaxed); }
    double getHitRate() const override { return 1.0; }
    size_t getElementCount() const override { return element_count; }
    double getLoadFactor() const override { return static_cast<double>(element_count) / bucket_count; }
    std::shared_ptr<const IExternalLoadable> clone() const override
    {
        return std::make_shared<IPAddressDictionary>(getDictionaryID(), dict_struct, source_ptr->clone(), dict_lifetime, require_nonempty);
    }
    const IDictionarySource * getSource() const override { return source_ptr.get(); }
    const DictionaryLifetime & getLifetime() const override { return dict_lifetime; }
    const DictionaryStructure & getStructure() const override { return dict_struct; }
    bool isInjective(const std::string & attribute_name) const override
    {