Определение интерфейса для табличных методов доступа
В этой главе описывается интерфейс между основной системой QHB и табличными методами доступа, управляющими хранилищем для таблиц. Основная система мало что знает об этих методах доступа помимо того, что описано в этой главе, поэтому можно разработать совершенно новые типы методов доступа, написав дополнительный код.
Каждый табличный метод доступа описывается строкой в системном каталоге pg_am.
Запись в pg_am задает имя и функцию обработки для табличного метода
доступа. Эти записи можно создавать и удалять с помощью команд SQL
CREATE ACCESS METHOD
и DROP ACCESS METHOD
.
Функция обработки табличного метода доступа должна быть объявлена как принимающая один аргумент типа internal и возвращающая псевдотип table_am_handler. Аргумент является фиктивным значением, которое требуется только для предотвращения вызова функции непосредственно из команд SQL. Результатом работы функции должен быть указатель на структуру типа TableAmRoutine, содержащую все, что необходимо коду ядра для использования табличного метода доступа. Возвращаемое значение должно существовать столько же, сколько и сам сервер, для чего его обычно определяют как переменную static const в глобальном контексте. Структура TableAmRoutine, также называемая API-структурой метода доступа, определяет поведение метода доступа с помощью функций обратного вызова. Эти функции являются указателями на обычные функции на C/RUST и не видны и не могут вызываться на уровне SQL. Все функции обратного вызова и их поведение определяются в структуре TableAmRoutine (с комментариями внутри структуры, определяющими требования к ним). Для большинства функций обратного вызова имеются оберточные функции, которые документируются с точки зрения пользователя (а не разработчика) табличного метода доступа.
Для реализации метода доступа (МД) разработчику, как правило, требуется реализовать специфичный для этого МД тип слота таблицы кортежей, позволяющий коду снаружи метода доступа хранить ссылки на кортежи МД и обращаться к столбцам кортежа.
В настоящее время способ, которым МД фактически хранит данные, практически ничем не ограничивается. Например, можно, но не обязательно, использовать кэш разделяемых буферов. В случае его использования, вероятно, имеет смысл использовать стандартную структуру страницы QHB, как описано в разделе Внутренняя структура страницы базы данных.
Единственное довольно серьезное ограничение API табличного метода доступа заключается в том, что в настоящее время если МД хочет поддерживать модификации и/или индексы, то необходимо, чтобы у каждого кортежа был идентификатор кортежа (TID), состоящий из номера блока и номера элемента (см. также раздел Внутренняя структура страницы базы данных). Необязательно, чтобы элементы TID имели то же значение, которое они имеют, например, для метода heap, но если требуется поддержка сканирования по битовой карте (это необязательно), то номер блока должен обеспечивать локальность.
Для восстановления при сбое МД доступа может использовать WAL или нестандартную реализацию журнала. Если выбирается WAL, можно использовать типовые записи WAL или реализовать новый вид записей WAL. Типовые записи WAL просты, но требуют большего объема WAL. Реализация нового вида записи WAL в настоящее время требует внесения изменений в код ядра.
Любой разработчик нового табличного метода доступа может обратиться к существующей реализации heap и почерпнуть дополнительную информацию о реализации этого метода.