2

値が int4range である HSTORE 列 'ext' を持つテーブルがあります。例:

"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));

エラー: データ型 text には、アクセス メソッド "gist" SQL 状態の既定の演算子クラスがありません: 42704 ヒント: インデックスの演算子クラスを指定するか、データ型の既定の演算子クラスを定義する必要があります。

この演算子を作成するにはどうすればよいですか?

ノート

各レコードには、独自の一意のキー セットがある場合があります。各キーは属性を表し、値は値の範囲を表します。したがって、すべてのレコードに「p1」があるわけではありません。これを hstore の EAV モデルと考えてください。

4

1 に答える 1

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」エントリの欠落、不適切な形式の範囲値などを実際の関数で処理する必要があります。

于 2013-07-25T09:12:44.083 に答える