Глава 70. Объявление и начальное содержимое системных каталогов
Содержание
В PostgreSQL используется множество разных системных каталогов для учёта информации о существовании и свойствах объектов базы, например, таблиц и функций. Физически системный каталог не отличается от простой таблицы, но серверный код на C знает структуру и характеристики каждого каталога и может работать с ним на низком уровне. Поэтому, например, не стоит пытаться изменять структуру каталога «на лету»; это нарушит встроенные в код предположения о том, как располагаются строки в каталоге. Однако структура каталога может меняться при переходе с одной основной версии на другую.
Структуры каталогов объявляются в специально оформленных заголовочных файлах C в каталоге src/include/catalog/
дерева исходного кода. В частности, для каждого каталога имеется заголовочный файл, названный по имени каталога (например, pg_class.h
для pg_class
) и определяющий набор столбцов в этом каталоге, а также другие основные свойства, например, его OID. К другим важным файлам, задающим структуру каталога, относится indexing.h
, определяющий, какие индексы присутствуют во всех системных каталогах, и toasting.h
, определяющий таблицы TOAST для каталогов, которым они нужны.
Со многими каталогами связаны исходные данные, которые должны быть загружены в них на стадии «начальной загрузки» initdb, чтобы система оказалась в состоянии, когда она сможет выполнять команды SQL. (Например, pg_class.h
должен содержать запись, ссылающуюся на этот же каталог, и перечисление всех остальных системных каталогов и индексов.) Эти исходные данные задаются в редактируемой форме в файлах, которые также находятся в каталоге src/include/catalog/
. Например, в pg_proc.dat
описываются все исходные строки, которые должны быть вставлены в каталог pg_proc
.
Чтобы создать файлы каталогов и загрузить в них эти исходные данные, серверный процесс, работающий в режиме начальной загрузки, считывает файл BKI (Backend Interface, Серверный интерфейс), содержащий команды и исходные данные. Файл postgres.bki
, используемый в этом режиме, конструируется из вышеупомянутых заголовочных файлов и файлов данных при сборке дистрибутива PostgreSQL Perl-скриптом genbki.pl
. Хотя postgres.bki
привязан к определённому выпуску PostgreSQL, он является платформонезависимым и устанавливается в подкаталог share
дерева инсталляции.
Скрипт genbki.pl
также генерирует производный заголовочный файл для каждого каталога, например pg_class_d.h
для каталога pg_class
. Этот файл содержит автоматически генерируемые макроопределения и может содержать другие макросы, определения перечислений и т. п., которые могут быть полезны для клиентского кода, читающего определённый каталог.
Большинству разработчиков Postgres нет необходимости иметь дело непосредственно с файлом BKI, но для практически любой нетривиальной доработки потребуется модификация заголовочных файлов и/или файлов с исходными данными каталога. В продолжении этой главы рассказывается об этом, а также для полноты описывается формат файла BKI.