Псевдо-типы
Система типов QHB содержит ряд записей специального назначения, которые в совокупности называются псевдотипами. Псевдотип нельзя использовать в качестве типа данных столбца, но можно объявить функцию с аргументом или результатом такого типа. Каждый из доступных псевдотипов полезен в ситуациях, когда поведение функции не соответствует простому принятию или возвращению значения определенного типа данных SQL. Все существующие псевдотипы перечислены в таблице 27.
Имя | Описание |
---|---|
any | Указывает, что функция принимает любой тип входных данных. |
anyelement | Указывает, что функция принимает любой тип данных (см. раздел Полиморфные типы). |
anyarray | Указывает, что функция принимает любой тип данных массива (см. раздел Полиморфные типы). |
anynonarray | Указывает, что функция принимает любой тип данных, кроме массива (см. раздел Полиморфные типы). |
anyenum | Указывает, что функция принимает любой перечисляемый тип данных (см. разделы Полиморфные типы и Перечислимые типы). |
anyrange | Указывает, что функция принимает любой диапазонный тип данных (см. разделы Полиморфные типы и Диапазонные типы). |
cstring | Указывает, что функция принимает или возвращает строку в стиле C с NULL в конце. |
internal | Указывает, что функция принимает или возвращает внутренний серверный тип данных. |
language_handler | Обработчик вызова процедурного языка объявляется как возвращающий тип language_handler. |
fdw_handler | Обработчик обертки сторонних данных объявляется как возвращающий тип fdw_handler. |
index_am_handler | Обработчик метода индексного доступа объявляется как возвращающий тип index_am_handler. |
tsm_handler | Обработчик метода выборки из таблицы объявляется как возвращающий тип tsm_handler. |
record | Определяет функцию, принимающую или возвращающую неопределенный тип строки. |
trigger | Триггерная функция объявляется как возвращающая тип trigger. |
event_trigger | Функция событийного триггера объявляется как возвращающая тип event_trigger. |
pg_ddl_command | Определяет представление команд DDL, доступных для триггеров событий. |
void | Указывает, что функция не возвращает значение. |
unknown | Определяет еще не определенный тип, например, недекорированный строковый литерал. |
opaque | Имя устаревшего типа, который раньше применялся для многих из вышеперечисленных целей. |
Функции, написанные на C/Rust (встроенные или динамически загружаемые), могут быть объявлены для принятия или возврата любого из этих псевдотипов. Ответственность за то, что функция будет безопасна с псевдотипом в качестве аргумента, несет разработчик функции.
Функции, написанные на процедурных языках, могут использовать псевдотипы, только если это позволяет их язык реализации. В настоящее время большинство процедурных языков запрещают использование псевдотипа в качестве аргумента, а для результата допускают только типы void и record (и trigger или event_trigger, когда функция реализует триггер или триггер события). Некоторые языки также поддерживают полиморфные функции, использующие типы anyelement, anyarray, anynonarray, anyenum и anyrange.
Псевдотип internal используется для объявления функций, предназначенных только для внутреннего вызова системой базы данных, а не путем прямого вызова в запросе SQL. Если у функции есть хотя бы один аргумент типа internal, ее нельзя вызвать из SQL. Чтобы сохранить типобезопасность данного ограничения, нужно следовать этому правилу кодирования: не создавайте функцию, которая объявляется как возвращающая internal, если у нее нет ни одного аргумента internal.