Thanks Alexander, 'Scalar datatype' - given me a hint...
Looking further in btree_gist source, for inet datatype, which seems a bit complexier then uuid... (char, char, char[16]) structure for inet, compared to jut char[16] for uuid. GiST pattern works with double datatype... and there is method convert_network_to_scalar(Datum, Oid), whick converts an inet value - to scalar value... and then all index compare functions are based on the doubles.... which leads me to conclusion (maybe is wrong) if I can convert UUID value to double it would make a "job" a lot easier... and pretty straight forward... Any suggestion, how to convert UUID (char[16]) to scalar? looking into convert inet to scalar, what confuses me, even there is char[16] for an ip address... code is: if (ip_family <http://doxygen.postgresql.org/network_8c.html#a7dc77a7bc93b675d36eca352d589b314>(ip) == PGSQL_AF_INET <http://doxygen.postgresql.org/utils_2inet_8h.html#a8ba3e5fe500d587d3eb8699968450b18>) len = 4; else len = 5; res = ip_family <http://doxygen.postgresql.org/network_8c.html#a7dc77a7bc93b675d36eca352d589b314>(ip); for (i = 0; i < len; i++) { res *= 256; res += ip_addr <http://doxygen.postgresql.org/network_8c.html#a54558e944989cddebdb93f2f6cd965a4>(ip)[i]; } return res; takes just first 4, or 5 values from ipaddres even there is 16 - (decalred as char[16]) Many thanks, Misa 2011/8/22 Alexander Korotkov <aekorot...@gmail.com> > Hi! > > On Mon, Aug 22, 2011 at 2:54 PM, Misa Simic <misa.si...@gmail.com> wrote: > >> static int >> m4_uuidkey_cmp(const void *a, const void *b) >> { >> uuidKEY *ia = (uuidKEY *) (((Usrt *) a)->t); >> uuidKEY *ib = (uuidKEY *) (((Usrt *) b)->t); >> int res; >> >> res = DatumGetInt32(DirectFunctionCall2(uuid_cmp, >> UUIDPGetDatum(ia->upper), UUIDPGetDatum(ia->upper))); >> if (res == 0) >> return DatumGetInt32(DirectFunctionCall2(uuid_cmp, >> UUIDPGetDatum(ia->upper), UUIDPGetDatum(ib->upper))); >> >> return res; >> } >> >> >> Getting error: aggregate error used where an integer was expected! >> > Seems that you need the address-of operator before ia->upper and ia->lower > (likely one of operands should be "ia->lower"). UUIDPGetDatum except pointer > as an argument, i.e. UUIDPGetDatum(&ia->upper). > > >> It would be a lot appreciated if anyone could help me and suggest the best >> way to make Gist support for UUID datatype... >> > I think you're on the right way. btree_gist is an extension which provides > GiST indexing of scalar datatype. UUID is one of them. So, the module you > are writing should be quite similar. > > ------ > With best regards, > Alexander Korotkov.