Why it is not possible to create custom AM which behaves similar to btree?

Поиск
Список
Период
Сортировка
От Konstantin Knizhnik
Тема Why it is not possible to create custom AM which behaves similar to btree?
Дата
Msg-id 1f623e94-1041-ca95-b355-a6afa89141c3@postgrespro.ru
обсуждение исходный текст
Ответы Re: Why it is not possible to create custom AM which behaves similar to btree?  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
Hi hackers.

I tried to create LSM AM which can be used instead of nbtree.
I looked at contrib/btree/gin, contrib/isn and try to do the following:

CREATE OPERATOR FAMILY lsm3_float_ops USING lsm3;

CREATE OPERATOR CLASS float4_ops DEFAULT
     FOR TYPE float4 USING lsm3 FAMILY lsm3_float_ops AS
     OPERATOR 1  <,
     OPERATOR 2  <=,
     OPERATOR 3  =,
     OPERATOR 4  >=,
     OPERATOR 5  >,
     FUNCTION 1  btfloat4cmp(float4,float4);

CREATE OPERATOR CLASS float8_ops DEFAULT
     FOR TYPE float8 USING lsm3 FAMILY lsm3_float_ops AS
     OPERATOR 1  <,
     OPERATOR 2  <=,
     OPERATOR 3  =,
     OPERATOR 4  >=,
     OPERATOR 5  >,
     FUNCTION 1  btfloat8cmp(float8,float8);


ALTER OPERATOR FAMILY lsm3_float_ops USING lsm3 ADD
     OPERATOR 1  < (float4,float8),
     OPERATOR 1  < (float8,float4),

     OPERATOR 2  <= (float4,float8),
     OPERATOR 2  <= (float8,float4),

     OPERATOR 3  = (float4,float8),
     OPERATOR 3  = (float8,float4),

     OPERATOR 4  >= (float4,float8),
     OPERATOR 4  >= (float8,float4),

     OPERATOR 5  > (float4,float8),
     OPERATOR 5  > (float8,float4),

     FUNCTION 1  btfloat48cmp(float4,float8),
     FUNCTION 1  btfloat84cmp(float8,float4);


But then I get error for btfloat48cmp and btfloat84cmp functions:

ERROR:  associated data types must be specified for index support function

If I replace lsm3 with btree in ALTER FAMILY, then there is no error.
I wonder if it is possible in Postgres to define custom index, which can 
handle comparison of different types, i.e.

create table t(pk bigint);
create index on t using lsm3(pk);
select * from t where pk=1;

I failed to make Postgres use index in this case. Index is used only if 
I rewrite this query in this way:
select * from t where pk=1::bigint;

Thanks in advance,
Konstantin








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

Предыдущее
От: SATYANARAYANA NARLAPURAM
Дата:
Сообщение: Re: [Patch] ALTER SYSTEM READ ONLY
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Infinities in type numeric