On Sun, Jan 13, 2019 at 9:30 AM Tom Lane <t...@sss.pgh.pa.us> wrote: > I suppose what you're doing is returning a pointer to a GraphBLAS object > as a Datum (or part of a pass-by-ref Datum)? If so, that's not going > to work terribly well, because it ignores the problem that datatype- > independent code is going to assume it can copy Datum values using > datumCopy() or equivalent logic. More often than not, such copying > is done to move the value into a different memory context in preparation > for freeing the original context. If you delete the GraphBLAS object > when the original context is deleted, you now have a dangling pointer > in the copy. > > We did invent some infrastructure awhile ago that could potentially > handle this sort of situation: it's the "expanded datum" stuff. > The idea here would be that your representation involving a GraphBLAS > pointer would be an efficient-to-operate-on expanded object. You > would need to be able to serialize and deserialize that representation > into plain self-contained Datums (probably varlena blobs), but hopefully > GraphBLAS is capable of going along with that. You'd still need a > memory context reset callback attached to each expanded object, to > free the associated GraphBLAS object --- but expanded objects are > explicitly aware of which context they're in, so at least in principle > that should work. (I'm not sure anyone's actually tried to build > an expanded-object representation that has external resources, so > we might find there are some bugs to fix there.) > > Take a look at > > src/include/utils/expandeddatum.h > src/backend/utils/adt/expandeddatum.c > src/backend/utils/adt/array_expanded.c > src/backend/utils/adt/expandedrecord.c > > Ah I see, the water is much deeper here. Thanks for the detailed explanation, expandeddatum.h was very helpful and I see now how array_expanded works. If I run into any problems registering my callback in the expanded context I'll repost back.
Thanks Tom! -Michel > regards, tom lane >