Индекс PostGreSQL GIN для массива uuid

Я хотел бы использовать индекс GIN на uuid[] (чтобы иметь эффективные тесты на членство для массивов uuids). Однако, когда я пытаюсь, PostgreSQL дает мне ошибку:

mydb=> CREATE TABLE foo (val uuid[]);
CREATE TABLE
mydb=> CREATE INDEX foo_idx ON foo USING GIN(val);
ERROR:  data type uuid[] has no default operator class for access method "gin"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

Как я могу добавить необходимый операторский класс, чтобы он работал?

Обратите внимание, что этот является аналогичным вопросом для типа citext, но предоставленный ответ не работает.

Ответ 1

Это можно сделать, используя следующий операторский класс:

CREATE OPERATOR CLASS _uuid_ops DEFAULT 
  FOR TYPE _uuid USING gin AS 
  OPERATOR 1 &&(anyarray, anyarray), 
  OPERATOR 2 @>(anyarray, anyarray), 
  OPERATOR 3 <@(anyarray, anyarray), 
  OPERATOR 4 =(anyarray, anyarray), 
  FUNCTION 1 uuid_cmp(uuid, uuid), 
  FUNCTION 2 ginarrayextract(anyarray, internal, internal), 
  FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal), 
  FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal), 
  STORAGE uuid;

Кредиты this для указания меня в правильном направлении.

Соответствующая документация находится в Здесь описываются взаимосвязи расширений с индексами, в частности там описаны стратегия и номера функций оператора для GIN.