11.04.2019, 01:58, "Nikita Glukhov" <n.gluhov@postgrespro.ru>:

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

> 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:


шикарно! будем ждать патча в релизе, а пока будем делать селекты :)
спасибо!
 
 
 

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

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


:)
я пока погрепал по исходникам и нашел структуру - сделал то же самое.
 
спасибо за более простой способ
 
 
 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;
 
А вот по этим функциям где-то можно почитать разъяснения?
 
насколько я понимаю функция 1 - сравнивает именно то, что возвращает функция 2
функция 3 нужна за тем же зачем и функция 2, но она работает над запросом
 
 
то есть если у нас
 
WHERE json_field @> json_query
 
то реально получается следующее
 
json_field пропускается через функцию 2 при индексировании
json_query - пропускается через функцию 3 при самом запросе
функция 1 используется для сравнения двух элементов между собой
 
а вот функции 4 и 6 - они для чего используются?
 
и вот еще вопрос. Некоторые из этих функций принимают internal в виде аргументов, соответственно вызвать их и посмотреть их поведение прямо из SELECT - непонятно как.
 
соответственно непонятно - как полностью с нуля написать свой OPERATOR CLASS не используя программирование на C (допустим хотим сделать скетч на SQL, возможно ли это сделать?)