Псевдо-типы
Система типов 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.