Re: OPERATOR CLASS - Mailing list pgsql-ru-general

From Nikita Glukhov
Subject Re: OPERATOR CLASS
Date
Msg-id e74bf466-c22b-ab29-be29-fa960aeb84d0@postgrespro.ru
Whole thread Raw
List pgsql-ru-general

> Есть вопросы по сабжу.

> 1. Можно ли как-то их просматривать в консоли (команды \d* не нашел).

У нас есть патч для psql, который реализует требуемые команды для показа информации об опклассах.
(см. тред "Psql patch to show access methods info"  https://www.postgresql.org/message-id/flat/1529675324.14193.5.camel%40postgrespro.ru)
Но он, к сожалению, уже не войдет в PostgreSQL 12.

Пример вывода этих команд для интересующего Вас jsonb_path_ops:

\dAo+ gin jsonb_path_ops                       List operators of family related to access methodAM  | Opfamily Schema | Opfamily Name  |       Operator       | Strategy | Purpose | Sort family 
-----+-----------------+----------------+----------------------+----------+---------+-------------gin | pg_catalog      | jsonb_path_ops | @> (jsonb, jsonb)    |        7 | search  | gin | pg_catalog      | jsonb_path_ops | @? (jsonb, jsonpath) |       15 | search  | gin | pg_catalog      | jsonb_path_ops | @@ (jsonb, jsonpath) |       16 | search  | 


\dAp+ gin jsonb_path_ops                             List of operator family proceduresAM  | Family schema |  Family name   | Left  | Right | Number |          Proc name           
-----+---------------+----------------+-------+-------+--------+------------------------------gin | pg_catalog    | jsonb_path_ops | jsonb | jsonb |      1 | btint4cmpgin | pg_catalog    | jsonb_path_ops | jsonb | jsonb |      2 | gin_extract_jsonb_pathgin | pg_catalog    | jsonb_path_ops | jsonb | jsonb |      3 | gin_extract_jsonb_query_pathgin | pg_catalog    | jsonb_path_ops | jsonb | jsonb |      4 | gin_consistent_jsonb_pathgin | pg_catalog    | jsonb_path_ops | jsonb | jsonb |      6 | gin_triconsistent_jsonb_path
(5 rows)

\dAc gin jsonb*            Operator classes for index AM "gin"Input type | Storage type |    Operator class    | Default? 
------------+--------------+----------------------+----------jsonb      | text         | jsonb_ops            | yesjsonb      | integer      | jsonb_path_ops       | no

Если есть какие-то пожелания, каким хотелось бы видеть вывод этих команд, мы рады будем их выслушать (а сообщение в том треде о полезности этих команд от пользователя-разработчика опклассов, думаю, очень поможет их продвижению в PostgreSQL 13).

> Если нет - в каких-то внутренних схемах?

pg_opclass, pg_opfamily, pg_amop, pg_amproc:

SELECT  amopstrategy AS "Strategy",  amoppurpose AS "Purpose",  oprname AS "Operator",  amoplefttype::regtype AS "Left type",  amoprighttype::regtype AS "Right type" 
FROM  pg_amop amop, pg_opfamily opf, pg_operator opr
WHERE  opfname = 'jsonb_path_ops' AND  amopfamily = opf.oid AND  amopopr = opr.oid;
Strategy | Purpose | Operator | Left type | Right type 
----------+---------+----------+-----------+------------       7 | s       | @>       | jsonb     | jsonb      15 | s       | @?       | jsonb     | jsonpath      16 | s       | @@       | jsonb     | jsonpath
(3 rows)


SELECT  amprocnum AS "Number",  amproc::regproc AS "Function", amproclefttype::regtype AS "Left type", amprocrighttype::regtype AS "Right type"
FROM pg_amproc, pg_opfamily
WHERE opfname = 'jsonb_path_ops' AND amprocfamily = pg_opfamily.oid;
Number |           Function           | Left type | Right type 
--------+------------------------------+-----------+------------     1 | btint4cmp                    | jsonb     | jsonb     2 | gin_extract_jsonb_path       | jsonb     | jsonb     3 | gin_extract_jsonb_query_path | jsonb     | jsonb     4 | gin_consistent_jsonb_path    | jsonb     | jsonb     6 | gin_triconsistent_jsonb_path | jsonb     | jsonb
(5 rows)


> 2. Можно ли как-то определить свой класс операторов по методу "такой же как оператор класс с таким-то именем, но оператор сравнения у него вот такой?"
> 3. Если п.2 нельзя, то можно ли вынуть из сабжа ссылки на его функции/операторы как-то?

Создать новый опкласс на основе имеющегося, переопределяя только лишь некоторые его операторы или функции, к сожалению, невозможно.
Но, используя CREATE OPERATOR CLASS, действительно можно выполнить эту задачу, вручную добавив в него все переиспользумые операторы и функции, помимо своего оператора сравнения. Как получить ссылки на функции/операторы — описано выше.

> Все вопросы про SQL, а не C


> PS: что хочу
> хочу GIN индекс по jsonb со своим оператором сортировки.
> Насколько я понимаю для того что мне хочется нужно проделать следующее:
>  1. Создать свой класс аналогичный jsonb_path_ops у которого будет всё так же как у предка, но моя функция FUNCTION 1 mycompare(jsonb, jsonb)
>  2. Построить индекс по полю jsonb указав этот opclass
>  3. PROFIT

Если переиспользовать jsonb_path_ops, то функция сравнения должна быть не для jsonb, а для int4 — того типа, что используется для хранения внутри (pg_opclass.opckeytype, "Storage type" в \dAc). Функцию mycompare(jsonb, jsonb) вместе со своим оператором сравнения имеет смысл использовать в опклассе для btree, а не для gin.

jsonb_path_ops хранит int4-хеши вида "hash (key1, key2, ..., keyN, value)", где "key1, key2, ..., keyN" — это путь к полю объекта или элемента массива "value", состоящий из названий ключей (массивы не учитываются в путях).

jsonb_ops же хранит text'овые строки вида "Tvalue", где "T" это префикс типа (key, string, number, boolean, null), а "value" это название/значение поля объекта или значение элемента массива в тестовом виде.

Поэтому для нового gin-опкласса, возможно, имеет смысл взять за основу jsonb_ops, а не на jsonb_path_ops. Но вообще, хотелось бы поподробнее узнать об этом новом операторе сравнения, тогда мы сможем лучше Вам помочь.


Вот на всякий случай пример создания копии jsonb_path_ops.

CREATE OPERATOR CLASS my_jsonb_path_ops FOR TYPE jsonb USING gin AS OPERATOR 7  @>, OPERATOR 15 @? (jsonb, jsonpath), OPERATOR 16 @@ (jsonb, jsonpath), FUNCTION 1 btint4cmp, FUNCTION 2 gin_extract_jsonb_path, FUNCTION 3 gin_extract_jsonb_query_path, FUNCTION 4 gin_consistent_jsonb_path, FUNCTION 6 gin_triconsistent_jsonb_path,
STORAGE integer;

--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

pgsql-ru-general by date:

Previous
From: Pavel Luzanov
Date:
Subject: Re: to_char TMmonth
Next
From: Nikita Glukhov
Date:
Subject: Re: OPERATOR CLASS