Система типов PostgreSQL

35.2. Система типов PostgreSQL

Типы данных в PostgreSQL делятся на базовые типы, составные типы, домены и псевдотипы.

35.2.1. Базовые типы

Базовые типы — это такие типы как int4, которые реализуются на более низком уровне, чем язык SQL (обычно на языке низкого уровня, таком как Си). Обычно они соответствуют типам, которые известны как абстрактные типы данных. PostgreSQL может работать с такими типами только через функции, предоставляемые пользователем и понимает поведение таких типов только до такой степени, до которой пользователь описывает их. Базовые типы дальше подразделяются на скалярные типы и массивы. Для каждого скалярного типа, автоматически создаётся соответствующий тип массива, который может содержать массивы этого скалярного типа, переменной длины.

35.2.2. Составные типы

Составные типы или строчные типы (имеется в виду строка таблицы - row — прим.пер.) создаются, когда пользователь создаёт какую-либо таблицу. Также, для определения "самостоятельного" (stand-alone) составного типа, неассоциирующегося с таблицей возможно использовать CREATE TYPE. Составной тип — это просто список типов, ассоциированных с именами полей. Значение составного типа — это строка или запись значений полей. Пользователь может получать доступ к полям компонентов из запросов SQL. Больше информации о составных типах можно найти в Section 8.15.

35.2.3. Домены

Домен основывается на отдельном базовом типе и для многих целей является с этим базовым типом взаимозаменяемым. Однако, домен может иметь ограничения, которые ограничивают его допустимые значения неким списком, выходящие за рамки которого значения, разрешены в базовом типе.

Домены могут быть созданы с помощью команды SQL CREATE DOMAIN. Их создание и использование в этой главе не обсуждается.

35.2.4. Псевдотипы

Для специальных целей существует несколько "псевдотипов". Псевдотипы не могут использоваться в колонках таблиц или в качестве атрибутов составных типов, но они могут быть использованы для объявления аргументов и типов, возвращаемых функциями. Это предоставляет механизм внутри системы типов для идентификации специальных классов функций. Table 8-24 перечисляет существующие псевдотипы.

35.2.5. Полимофмический тип

Четыре псевдотипа специального значения — это anyelement и anyarray, anynonarray и anyenum, которые вместе назваются полиморфическими типами. Любая функция, использующая в описании эти типы является полиморфической функцией. Полиморфическая функция может оперировать множеством разных типов данных, включая один или более из этих специальных типов данных, что определяется типами данных, которые фактически передаются этой функции в отдельном вызове.

Когда обрабатывается запрос, вызываемый полиморфической функцией, полиморфические аргументы и результаты связываются друг с другом и преобразовываются в специальный тип данных. Каждый аргумент (или возвращаемое значение) объявляемый как anyelement, позволяет указывать любой специальный фактический тип данных, но во всех вызовах они все должны быть того же самого фактического типа. Для каждого аргумента (или возвращаемого значения), объявляемого как anyarray можно указывать любой тип данных массива, но как и в предыдущем случае, они все должны быть одного и того же типа. Если есть аргументы (или возвращаемое значение), объявляемые как anyarray и другие, объявляемые как anyelement, то фактический тип массива в аргументах (или возвращаемом значении) anyarray должен быть массивом, чьи элементы имеют такой же тип как и аргументы (или возвращамое значение) anyelement. anynonarray трактуется точно также как и anyelement, но добавляет дополнительное ограничение, что фактический тип не может быть типом массива. anyenum трактуется точно также как и anyelement, но добавляет дополнительное ограничение: что фактический тип должен быть типом перечисления.

Таким образом, когда тип более чем одного аргумента объявляется как полиморфический, допускаются только определённые комбинации фактических типов аргументов. Например, функция объявляемая как foo(anyelement, anyelement) будет требовать два входных значения, такой длины, как будто они являются типами данных одного типа.

Когда возвращаемое значение функции объявляется как полиморфический тип, должен быть по крайней мере один аргумент, который также является полиморфическим, а фактический тип данных, который будет использоваться в аргументе, определяет фактический тип результата для этого вызова. Например, если ранее не определялся никакой механизм подписки, то можно объявить некую функцию, которая будет осуществлять подписку: subscript(anyarray, integer) returns anyelement. Такое объявление ограничивает фактический тип первого аргумента типом массива и позволяет анализатору подразумевать правильный тип результата из фактического типа первого аргумента. Другой пример в том, что функция объявленная как f(anyarray) returns anyenum будет принимать только массивы типов перечислений.

Обратите внимание: что anynonarray и anyenum не предоставляют переменных отдельного типа; они имеют тот же самый тип, что и anyelement только с дополнительным ограничением. Например, объявление функции f(anyelement, anyenum) эквивалентно объявлению f(anyenum, anyenum): оба фактических аргумента имют один и тот же самый тип перечисления.

Вариантная функция (работающая с переменным числом аргументов, как описано в Section 35.4.5) может быть полиморфной: это достигается объявлением её последнего параметра как VARIADIC anyarray. Чтобы аргумент совпадал и определялся как фактический тип результата: такая функция ведёт себя также как если бы вы перед этим указали бы соответствующее количество параметров anynonarray.

Back to top

(С) Виктор Вислобоков, 2008-2023