Код для всех

Программа «Код для всех» создана российским IT-сообществом, чтобы поддержать студентов, желающих внести свой вклад в разработку свободно распространяемого программного обеспечения. Подробнее о конкурсе.

Тема 1

Проективное индексирование слабоструктурированных данных в системе управления базами данных PostgreSQL

Описание

Проективное индексирование JSON позволяет пользователям индексировать только необходимые части JSON дерева, хранящиеся в виде столбцов jsonb. Это может значительно уменьшить размер индекса.

Проективное индексирование может быть реализовано путем использования выражений jsonpath в параметрах opclass. Такие выражения могут состоять из одного простого пути, списка простых путей или даже сложных путей с фильтрами. Пути отвечают за фильтрацию частей по структуре, фильтры -- по значению.

Той же цели можно достичь с помощью функциональных индексов, возможно, множественных. Но они требуют включения немодифицированного индексного выражения в каждый запрос, в то время как проективное индексирование позволяет пользователю использовать произвольные операторы на индексированном столбце, а opclass сам определит, какие запросы он поддерживает.

Вот некоторые задачи, которые необходимо решить:

  • Перенести эту функцию в последнюю версию.
  • Корректно реализовать все возможные комбинации lax/strict режимов в запросах и параметрах opclass (прототип поддерживает только строгий режим)
  • Улучшить покрытие тестов
  • Разработать контрольные показатели производительности для сравнения с обычным функциональным/частичным индексированием
  • По возможности добавить поддержку фильтров в индексированных путях (в общем случае это кажется трудновыполнимым, так как требует внедрения полноценного механизма доказательства предикатов)

Результат

Патч к PostgreSQL 15, реализующий параметр класса операций, позволяющий использовать проективное индексирование

Ментор

Малахов Никита, Старший разработчик программного обеспечения Postgres Professional

Тема 2

Мониторинг статуса выполнения запроса: создание инструмента для отслеживания запросов SELECT, INSERT, UPDATE и DELETE в PostgreSQL

Описание

Придумать и реализовать инструмент для отслеживания статуса и степени выполнения запроса SELECT, INSERT, UPDATE или DELETE. Данный способ мониторинга должен удовлетворять следующим условиям:
1) инструмент реализован в ядре PostgreSQL;
2) минимизированы накладные расходы в случаях использования и не использования инструмента;
3) на основе предоставляемой инструментом информации в течение времени могут быть сделаны выводы о целесообразности продолжения/отмены/исправления интересующего запроса.

Результат

патч к PostgreSQL 15, вносящий данную функциональность.

Ментор

Иван Панченко, заместитель генерального директора Postgres Professional

Тема 3

Фильтрация строк таблиц PostgreSQL при выгрузке в pg_dump.

Описание

Придумать и реализовать способ, делающий выгрузку определенных таблиц в pg_dump частичной (не все строки таблицы, а только часть, определяемая условием, формулируемым в виде SQL WHERE-выражения).

Фильтрация строк должна применяться к произвольному количеству таблиц базы, причем выражения фильтров могут быть различными для различных таблиц.

SQL-выражения фильтров могут быть довольно объемными и многочисленными, потому надо иметь возможность задавать их не только через командную строку, но и через файл.

Результат

патч к PostgreSQL 15, вносящий данную функциональность в pg_dump.

Ментор

Дарья Лепихова, разработчик программного обеспечения Postgres Professional

Тема 4

Частичное искажение (обфускация) данных PostgreSQL при выгрузке в pg_dump.

Описание

Придумать и реализовать способ, делающий выгрузку определенных таблиц в pg_dump частичной (не все строки таблицы, а только часть, определяемая условием, формулируемым в виде SQL WHERE-выражения).

Фильтрация строк должна применяться к произвольному количеству таблиц базы, причем выражения фильтров могут быть различными для различных таблиц.

SQL-выражения фильтров могут быть довольно объемными и многочисленными, потому надо иметь возможность задавать их не только через командную строку, но и через файл.

Результат

патч к PostgreSQL 15, вносящий данную функциональность в pg_dump.

Ментор

Дарья Лепихова, разработчик программного обеспечения Postgres Professional

Тема 5

Разбор формата файлов PostgreSQL

Описание

Для работы с бинарными файлами базы Postgres существует инструменты такие как pg_waldump, pg_filedump, pg_pageinspect. Данные инструменты могу работать только с определенной базой данных и имеет ряд своих внутренних ограничений.

С другой стороны, есть инструмент fq (https://github.com/wader/fq), построенный аналогично jq и позволяющий выбирать нужное из бинарных данных с помощью jq запросов. В инструмент уже добавлены популярные форматы файлы, включая архиваторы, видео и аудио кодеки.

Конечная цель задачи - добавить в fq анализатор основных файлов базы Postgres. Главным критерием успешности должно быть работоспособность со всем поддерживаемыми версиями Postgres (с 10 до 15). Минимальным критерием является возможность разбора heap таблиц или индексов.

План: исследовать API инструмента и реализовать разбор формата файлов Postgres.

Результат

патч к fq, позволяющий работать с файлами Postgres

Ментор

Жилин Михаил, руководитель группы производительности PostgresProfessional

Тема 6

Реализовать функцию копирования таблицы из файла, пропускающую строки с ошибками.

Описание

Функционал, реализующий данную фичу - COPY ... FROM ... IGNORE ERRORS, написан:
https://github.com/xhevfx/postgres/commit/a8f4c60034b1595642a7654e2e676a4034948909

Подробнее о нем. Если происходит копирование таблицы из файла /stdin: COPY table FROM intput.txt/stdin IGNORE ERRORS , в которой есть некорректные данные в строках (неверный формат данных, не то количество столбцов и т.д.), то данную строку postgresql не копирует, а пропускает. После обработки всей таблицы, в консоль выводятся номера некорректных строк с описанием ошибок.

Обычный вызов функции COPY FROM сразу после обнаружения неверных данных в таблице, выводил бы ошибку.

Для улучшения производительности функцию необходимо доработать - реализовать ее с помощью блоковых субтранзакций, с размером блока - к примеру, 1000 строк.

Тред: https://www.postgresql.org/message-id/flat/CAFj8pRD9Pi9besMvv0Yo0A4wqQ-D%3DcBXGRQhz_oS%2BBNgv_41_Q%40mail.gmail.com#3c9a58abba5963f75218731c723894e7

Результат

Создать патч для PostgreSQL 15, вносящий данную функциональность.

Ментор

Лепихов Андрей, ведущий разработчик программного обеспечения Postgres Professional