**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')))). 
```

}
            const auto [addr, prefix] = parseIPFromString(std::string_view(key_column_ptr->getDataAt(row)));
            has_ipv6 = has_ipv6 || (addr.family() == Poco::Net::IPAddress::IPv6);
            size_t row_number = ip_records.size();
            ip_records.emplace_back(addr, prefix, row_number);
        }
    }
    stream->readSuffix();
    row_idx.reserve(ip_records.size());
    mask_column.reserve(ip_records.size());
    if (has_ipv6)
    {
        auto deleted_count = sortAndUnique(ip_records,
            [](const auto & record_a, const auto & record_b)
            {
                uint8_t a_buf[IPV6_BINARY_LENGTH];
                uint8_t b_buf[IPV6_BINARY_LENGTH];
                auto cmpres = memcmp16(record_a.asIPv6Binary(a_buf), record_b.asIPv6Binary(b_buf));
                if (cmpres == 0)
                    return compareTo(record_a.prefixIPv6(), record_b.prefixIPv6());
                return cmpres;
            });
        if (deleted_count > 0)
            LOG_WARNING(logger, "removing {} non-unique subnets from input", deleted_count);
        auto & ipv6_col = ip_column.emplace<IPv6Container>();
        ipv6_col.resize_fill(IPV6_BINARY_LENGTH * ip_records.size());
        for (const auto & record : ip_records)
        {
            size_t i = row_idx.size();
            IPv6ToRawBinary(record.addr, reinterpret_cast<char *>(&ipv6_col[i * IPV6_BINARY_LENGTH]));