Глава 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.