Re: UUID datatype GiST index support

Поиск
Список
Период
Сортировка
От Misa Simic
Тема Re: UUID datatype GiST index support
Дата
Msg-id CAH3i69kKeQjp0jNKvpOC0f4=jkm1NEYOWnYnKq_j64Afxbvn-w@mail.gmail.com
обсуждение исходный текст
Ответ на Re: UUID datatype GiST index support  (Alexander Korotkov <aekorotkov@gmail.com>)
Список pgsql-hackers
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(ip) == PGSQL_AF_INET)                    len = 4;                else                    len = 5;
                res = ip_family(ip);                for (i = 0; i < len; i++)                {                    res *= 256;                    res += ip_addr(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 <aekorotkov@gmail.com>
Hi!

On Mon, Aug 22, 2011 at 2:54 PM, Misa Simic <misa.simic@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.

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Alexander Korotkov
Дата:
Сообщение: Re: UUID datatype GiST index support
Следующее
От: Robert Haas
Дата:
Сообщение: Re: Rethinking sinval callback hook API