【发布时间】:2013-07-29 06:24:18
【问题描述】:
这是我的桌子:
CREATE TABLE
mytable
(
id INT NOT NULL PRIMARY KEY,
val int4range[]
);
我要索引 val 列:
CREATE INDEX
ix_mytable_val
ON mytable
USING GIN (INT4RANGE(val, '[]')); // error, as is GIN(val)
我想出了以下内容:
CREATE OPERATOR CLASS gin_int4range_ops
DEFAULT FOR TYPE int4range[] USING gin AS
OPERATOR 1 <(anyrange,anyrange),
OPERATOR 2 <=(anyrange,anyrange),
OPERATOR 3 =(anyrange,anyrange),
OPERATOR 4 >=(anyrange,anyrange),
OPERATOR 5 >(anyrange,anyrange),
FUNCTION 1 lower(anyrange),
FUNCTION 2 upper(anyrange),
FUNCTION 3 isempty(anyrange),
FUNCTION 4 lower_inc(anyrange),
FUNCTION 5 upper_inc(anyrange);
但是当我尝试创建索引时,它失败了(下面的错误)。但是,如果我从 DO $$ 块中调用 create,它就会执行。
如果执行创建索引,我会在 INSERT INTO 上收到错误。
“错误:类型 1 的缓存查找失败”
我也试过这个:
OPERATOR 1 &&(anyrange,anyrange),
OPERATOR 2 <@(anyrange,anyrange),
OPERATOR 3 @>(anyrange,anyrange),
OPERATOR 4 =(anyrange,anyrange),
为了尝试解决这个问题,我重新启动了 PG,机器,并清理了 DB。我认为 CREATE OPERATOR 代码中存在错误。
如果我可以索引一个自定义类型 (int, int4range) 的数组,那就更好了。
我花了相当长的时间(一整天)翻阅文档、论坛等,但找不到真正帮助我理解如何解决这个问题的东西(即创建一个有效的自定义操作符类)。
【问题讨论】:
标签: postgresql operators postgresql-9.2 database-indexes