8.21. Псевдо-типы#

8.21. Псевдо-типы

8.21. Псевдо-типы #

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

Таблица 8.27. Псевдо-типы

ИмяОписание
anyУказывает, что функция принимает любой тип входных данных.
anyelementУказывает, что функция принимает любой тип данных (см. Раздел 35.2.5).
anyarrayУказывает, что функция принимает любой тип данных массива (см. Раздел 35.2.5).
anynonarrayУказывает, что функция принимает любой не-массивный тип данных (см. Раздел 35.2.5).
anyenumУказывает, что функция принимает любой перечислимый тип данных (см. Раздел 35.2.5 и Раздел 8.7).
anyrangeУказывает, что функция принимает любой тип данных диапазона (см. Раздел 35.2.5 и Раздел 8.17).
anymultirangeУказывает, что функция принимает любой тип данных мультидиапазона (см. Раздел 35.2.5 и Раздел 8.17).
anycompatibleУказывает, что функция принимает любой тип данных, с автоматическим преобразованием нескольких аргументов в общий тип данных (см. Раздел 35.2.5).
anycompatiblearrayУказывает, что функция принимает любой тип данных массива, с автоматическим преобразованием нескольких аргументов в общий тип данных (см. Раздел 35.2.5).
anycompatiblenonarrayУказывает, что функция принимает любой немассивный тип данных, с автоматическим преобразованием нескольких аргументов в общий тип данных (см. Раздел 35.2.5).
anycompatiblerangeУказывает, что функция принимает любой тип данных диапазона, с автоматическим преобразованием нескольких аргументов в общий тип данных (см. Раздел 35.2.5 и Раздел 8.17).
anycompatiblemultirangeУказывает, что функция принимает любой тип данных мультидиапазона, с автоматическим преобразованием нескольких аргументов в общий тип данных (см. Раздел 35.2.5 и Раздел 8.17).
cstringУказывает, что функция принимает или возвращает нуль-терминированную строку на языке C.
internalУказывает, что функция принимает или возвращает внутренний тип данных сервера.
language_handlerОбъявляется обработчик вызова процедурного языка, возвращающий language_handler.
fdw_handlerОбъявляется обработчик обертки внешних данных, возвращающий fdw_handler.
table_am_handlerОбъявляется обработчик метода доступа к таблице, возвращающий table_am_handler.
index_am_handlerОбработчик метода доступа к индексу объявлен для возврата index_am_handler.
tsm_handlerОбъявляется обработчик метода выборки таблицы, возвращающий tsm_handler.
recordОпределяет функцию, принимающую или возвращающую неопределенный тип строки.
triggerТриггерная функция объявляется с возвращаемым значением триггер.
event_triggerТриггерная функция события объявляется с возвращаемым типом event_trigger.
pg_ddl_commandОпределяет представление команд DDL, доступное для событийных триггеров.
voidУказывает, что функция не возвращает значение.
unknownОпределяет еще не разрешенный тип, например, не декорированной строковой литерал.

Функции, написанные на C (будь то встроенные или динамически загружаемые), могут быть объявлены для принятия или возврата любого из этих псевдо-типов. Задача автора функции - обеспечить безопасное поведение функции при использовании псевдо-типа в качестве типа аргумента.

Все функции, написанные на процедурных языках, могут использовать псевдотипы только в соответствии с правилами своих языков реализации. В настоящее время большинство процедурных языков запрещают использование псевдотипа в качестве типа аргумента и разрешают только типы void и record в качестве типа результата (а также trigger или event_trigger, когда функция используется в качестве триггера или событийного триггера). Некоторые также поддерживают полиморфные функции с использованием полиморфных псевдотипов, которые показаны выше и подробно обсуждаются в разделе Раздел 35.2.5.

Псевдотип internal используется для объявления функций, которые предназначены только для вызова внутри системы базы данных, а не для прямого вызова в запросе SQL. Если функция имеет хотя бы один аргумент типа internal, то ее нельзя вызывать из SQL. Чтобы сохранить типовую безопасность этого ограничения, важно следовать следующему правилу кодирования: не создавайте функцию, которая объявлена возвращать internal, если у нее нет хотя бы одного аргумента типа internal.