Как создать оператор в PostgreSQL для типа hstore со значением int4range

У меня есть таблица со столбцом HSTORE «ext», где значение - int4range. Пример:

"p1"=>"[10, 18]", "p2"=>"[24, 32]", "p3"=>"[29, 32]", "p4"=>"[18, 19]"

Однако когда я пытаюсь создать индекс выражения для этого, я получаю сообщение об ошибке:

CREATE INDEX ix_test3_p1
ON test3
USING gist
(((ext -> 'p1'::text)::int4range));

ОШИБКА: текст типа данных не имеет класса оператора по умолчанию для метода доступа "gist" Состояние SQL: 42704 Подсказка: необходимо указать класс оператора для индекса или определить класс оператора по умолчанию для типа данных.

Как мне создать для этого оператора?

ПРИМЕЧАНИЕ

Каждая запись может иметь свой уникальный набор ключей. Каждый ключ представляет атрибут, а значения - диапазон значений. Таким образом, не все записи будут иметь «p1». Считайте это моделью EAV в hstore.


person IamIC    schedule 25.07.2013    source источник


Ответы (1)


Я не получаю эту ошибку - я получаю «функции в индексном выражении должны быть помечены как IMMUTABLE»

CREATE TABLE ht (ext hstore);
INSERT INTO ht VALUES ('p1=>"[10,18]"'), ('p1=>"[99,99]"');
CREATE INDEX ht_test_idx ON ht USING GIST ( ((ext->'p1'::text)::int4range) );
ERROR:  functions in index expression must be marked IMMUTABLE

CREATE FUNCTION foo(hstore) RETURNS int4range LANGUAGE SQL AS $$ SELECT ($1->'p1')::int4range; $$ IMMUTABLE;
CREATE INDEX ht_test_idx ON ht USING GIST ( foo(ext) );
SET enable_seq_scan=false;
EXPLAIN SELECT * FROM ht WHERE foo(ext) = '[10,19)';
                              QUERY PLAN                               
-----------------------------------------------------------------------
 Index Scan using ht_test_idx on ht  (cost=0.25..8.52 rows=1 width=32)
   Index Cond: (foo(ext) = '[10,19)'::int4range)

Я предполагаю, что приведение не является неизменным, потому что вы можете изменить формат диапазона по умолчанию с включающего ... исключительного «[...)» на что-то другое. Но вы, вероятно, этого не сделаете.

Очевидно, вы захотите, чтобы ваша настоящая функция имела дело с такими вещами, как пропущенные записи «p1», неправильно сформированные значения диапазона и т. Д.

person Richard Huxton    schedule 25.07.2013
comment
У меня возникла ошибка IMMUTABLE, когда я попытался добавить индекс btree. Мои запросы будут по ключу __, где значение [,]. Я не понимаю, что то, что вы написали, будет функционировать как индекс выражения для ключей. - person IamIC; 25.07.2013
comment
Или мне нужно создать функцию для каждой клавиши? В этом нет смысла. Обычно в некоторых записях будет 'p1, а в других - нет. Считайте это моделью EAV в hstore. - person IamIC; 25.07.2013
comment
ОК - закройте этот вопрос (не знаю, как это сделать) и опубликуйте еще один. Объясните, чего вы на самом деле пытаетесь достичь, потому что из этого не ясно. Я не совсем понимаю, для чего предназначена структура данных или как вы собираетесь ее использовать. - person Richard Huxton; 25.07.2013
comment
Спасибо. См. stackoverflow.com/questions/17856503/ Я закрою это, как только вы увидите новый вопрос. - person IamIC; 25.07.2013