PostgreSQL известен своей расширяемостью, которая позволяет добавлять новую функциональность без остановки сервера и своими силами, без привлечения разработчиков ядра базы данных. Однако, существующая инфраструктура имеет исторические ограничения, которые проявляются при работе с типами данных, обладающими внутренней структурой, такими как массивы и hstore. В полную силу эти ограничения проявились после появления jsonb. В частности, для эффективного поиска в jsonb документах нам пришлось разработать расширение jsquery, которое позволяло записывать jsonb запросы в каноническом виде "column operator value" и, благодаря этому, использовать индексы. Этот подход ранее был нами опробован в полнотекстовом поиске (tsquery) и популярном расширении для целочисленных массивов intarray (query_int). При всей полезности jsquery, этот язык запросов не расширяем, поэтому мы обратились к идее его реализации на SQL, причем с поддержкой индексов.
Мы предлагаем реализовывать работу со сложными типами данных с помощью подзапросов, которые уже сейчас позволяют реализовывать запросы произвольного уровня сложности на SQL. Например, найти массивы, у которых хотя бы один элемент удовлетворяет сложному условию, сейчас невозможно без использования подзапроса. Мы покажем синтаксическую обертку (syntax sugar) для написания подобных запросов к jsonb, которая разворачивается в комбинацию подзапросов. Конкретный синтаксис сейчас неважен: он требует долгого и терпеливого обсуждения в сообществе, но выразительная мощь языка от этого не измениться. Мы же сфокусируемся на задаче индексной поддержки сложных запросов, включая подзапросы. Эта задача представляет собой реальный вызов и на данном этапе мы покажем прототип новой индексной инфраструктуры и примеры ее использования.