pg.ddx.io  pgsql-ru-general@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Nikita Glukhov <n.gluhov@postgrespro.ru>
To: Dmitry E. Oboukhov <unera@debian.org>
Cc: pgsql-ru-general@lists.postgresql.org <pgsql-ru-general@lists.postgresql.org>
Subject: Re: OPERATOR CLASS
Date: Thu, 11 Apr 2019 13:31:43 +0300
Message-ID: <3b78bd3f-f051-3ff0-97db-e2f4f9a7ab54@postgrespro.ru> (raw)
In-Reply-To: <2084391554950401@myt2-cd7fa496c4f7.qloud-c.yandex.net>
References: <10196171554829471@iva7-6548a8037c6d.qloud-c.yandex.net>
	<e74bf466-c22b-ab29-be29-fa960aeb84d0@postgrespro.ru>
	<2084391554950401@myt2-cd7fa496c4f7.qloud-c.yandex.net>

On 11.04.2019 5:40, Dmitry E. Oboukhov wrote:

> 11.04.2019, 01:58, "Nikita Glukhov" <n.gluhov@postgrespro.ru>:
>>  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;
> А вот по этим функциям где-то можно почитать разъяснения?

В официальной документации вроде бы все достаточно подробно описано:

https://www.postgresql.org/docs/11/gin-extensibility.html (на английском)
https://postgrespro.ru/docs/postgresql/11/gin-extensibility (на русском)

> насколько я понимаю функция 1 - сравнивает именно то, что возвращает 
> функция 2
> функция 3 нужна за тем же зачем и функция 2, но она работает над запросом
> то есть если у нас
> WHERE json_field @> json_query
> то реально получается следующее
> json_field пропускается через функцию 2 при индексировании
> json_query - пропускается через функцию 3 при самом запросе
> функция 1 используется для сравнения двух элементов между собой
>
Да, все правильно. Хочу еще обратить внимание, что запрос может быть 
другого, не jsonb, типа, а функция extractQuery() различает разные типы 
запорсов по их номеру стратегии.

>  а вот функции 4 и 6 - они для чего используются?

В документации про это написано, но если будут вопросы, отвечу на них.

Вот файл, в котором находится реализация этих функций для jsonb:
https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/jsonb_gin.c

> и вот еще вопрос. Некоторые из этих функций принимают internal в виде 
> аргументов, соответственно вызвать их и посмотреть их поведение прямо 
> из SELECT - непонятно как.
> соответственно непонятно - как полностью с нуля написать свой OPERATOR 
> CLASS не используя программирование на C (допустим хотим сделать скетч 
> на SQL, возможно ли это сделать?)


Да, все GIN-функции, за исключением первой compare(), можно написать 
сейчас только на C, и вызывать их из SQL нельзя. Но можно попробовать 
сделать один раз специальный обобщенный OPERATOR CLASS, в котором из 
функциий 2-6, написанных на C, будут вызываться другие функции с 
соответствующими номерами (например, 12-16), в которых уже будут 
использоваться только SQL-типы. Но полностью перенести всю 
функциональность C-функций на уровень SQL будет не так просто, потому 
что многие функции могут возвращать несколько значений сразу, а внутри 
Postgres, по-моему, нет такого удобного способа вызова для функций с 
OUT-параметрами, который есть для обычных функций. Например,

   Datum *extractQuery(Datum query, int32 *nkeys, StrategyNumber n, bool 
**pmatch, Pointer **extra_data, bool **nullFlags, int32 *searchMode)

возвращает массив извлеченных элементов, а также необязательные массив 
флагов pmatch, массив произвольных С-указателй extra_data, массив 
null-флагов nullFlags, и режим поиска searchMode. Если оставить только 
обязательный массив элементов, то сигнатрура SQL-функции extract_query 
будет совсем простой:

    extract_query (query anyelement, strategy int2) RETURNS storage_type[]

но я не уверен, что с anyelement не возникнет каких-либо проблем.

И еще хочу на всякий случай напомнить, что у нас есть еще расширение 
JsQuery (https://github.com/postgrespro/jsquery), которое содержит 
опклассы, позволяющие выполнять по GIN-индексам более широкий ряд 
jsonb-запросов (например, range-запросов, которые реализованы с 
использования partialMatch). Возможно даже, что JsQuery решит Вашу 
задачу. Сейчас мы работает в JsQuery на поддержкой jsonpath, который 
выйдет в PostgreSQL12, а в будущем планируем даже перенести эти 
JsQuery-опклассы в ядро.

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

view thread (6+ messages)  latest in thread

Message-ID: <3b78bd3f-f051-3ff0-97db-e2f4f9a7ab54@postgrespro.ru>
Permalink:  ../3b78bd3f-f051-3ff0-97db-e2f4f9a7ab54@postgrespro.ru/
Also on:    postgresql.org/message-id/3b78bd3f-f051-3ff0-97db-e2f4f9a7ab54@postgrespro.ru

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-ru-general@postgresql.org
  Cc: n.gluhov@postgrespro.ru, unera@debian.org, pgsql-ru-general@lists.postgresql.org
  Subject: Re: OPERATOR CLASS
  In-Reply-To: <3b78bd3f-f051-3ff0-97db-e2f4f9a7ab54@postgrespro.ru>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox