https://github.com/ClickHouse/ClickHouse/blob/9a48cf0da8badfc5f3da08611eb44961aa28e3f6/src/Functions/FunctionsHashing.h#L669-L671

There's a call to `blake3_free_char_pointer` that passes ownership of the pointer back to Rust (which then frees the memory), then there's a call to `std::string`'s constructor that accepts that now-freed pointer.
{
        
        if (size > 0 && (data[size - 1] == '/' || data[size - 1] == '?' || data[size - 1] == '#'))
            return CityHash_v1_0_2::CityHash64(data, size - 1);
        return CityHash_v1_0_2::CityHash64(data, size);
    }
};
struct URLHierarchyHashImpl
{
    static size_t findLevelLength(const UInt64 level, const char * begin, const char * end)
    {
        const auto * pos = begin;
        
        
        while (pos < end && ((*pos > 'a' && *pos < 'z') || (*pos > '0' && *pos < '9')))
            ++pos;
        /** We will calculate the hierarchy only for URLs in which there is a protocol, and after it there are two slashes.
        *    (http, file - fit, mailto, magnet - do not fit), and after two slashes there is still something
        *    For the rest, simply return the full URL as the only element of the hierarchy.
        */
        if (pos == begin || pos == end || !(*pos++ == ':' && pos < end && *pos++ == '/' && pos < end && *pos++ == '/' && pos < end))
        {
            pos = end;
            return 0 == level ? pos - begin : 0;