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.
else if (which.isUInt16()) executeIntType<UInt16, first>(icolumn, vec_to);
        else if (which.isUInt32()) executeIntType<UInt32, first>(icolumn, vec_to);
        else if (which.isUInt64()) executeIntType<UInt64, first>(icolumn, vec_to);
        else if (which.isUInt128()) executeBigIntType<UInt128, first>(icolumn, vec_to);
        else if (which.isUInt256()) executeBigIntType<UInt256, first>(icolumn, vec_to);
        else if (which.isInt8()) executeIntType<Int8, first>(icolumn, vec_to);
        else if (which.isInt16()) executeIntType<Int16, first>(icolumn, vec_to);
        else if (which.isInt32()) executeIntType<Int32, first>(icolumn, vec_to);
        else if (which.isInt64()) executeIntType<Int64, first>(icolumn, vec_to);
        else if (which.isInt128()) executeBigIntType<Int128, first>(icolumn, vec_to);
        else if (which.isInt256()) executeBigIntType<Int256, first>(icolumn, vec_to);
        else if (which.isUUID()) executeBigIntType<UUID, first>(icolumn, vec_to);
        else if (which.isEnum8()) executeIntType<Int8, first>(icolumn, vec_to);
        else if (which.isEnum16()) executeIntType<Int16, first>(icolumn, vec_to);
        else if (which.isDate()) executeIntType<UInt16, first>(icolumn, vec_to);
        else if (which.isDate32()) executeIntType<Int32, first>(icolumn, vec_to);
        else if (which.isDateTime()) executeIntType<UInt32, first>(icolumn, vec_to);
        
        else if (which.isDecimal32()) executeBigIntType<Decimal32, first>(icolumn, vec_to);
        else if (which.isDecimal64()) executeBigIntType<Decimal64, first>(icolumn, vec_to);
        else if (which.isDecimal128()) executeBigIntType<Decimal128, first>(icolumn, vec_to);
        else if (which.isDecimal256()) executeBigIntType<Decimal256, first>(icolumn, vec_to);
        else if (which.isFloat32()) executeIntType<Float32, first>(icolumn, vec_to);
        else if (which.isFloat64()) executeIntType<Float64, first>(icolumn, vec_to);
        else if (which.isString()) executeString<first>(icolumn, vec_to);
        else if (which.isFixedString()) executeString<first>(icolumn, vec_to);
        else if (which.isArray()) executeArray<first>(from_type, icolumn, vec_to);
        else executeGeneric<first>(icolumn, vec_to);
    }
    void executeForArgument(const IDataType * type, const IColumn * column, typename ColumnVector<ToType>::Container & vec_to, bool & is_first) const