×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

5.1.2. Система Digital Q.DataBase Система типов

5.1.2.1. Базовые типы
5.1.2.2. Контейнерные типы данных
5.1.2.3. domains
5.1.2.4. Псевдотипы
5.1.2.5. Полиморфные типы

Digital Q.DataBase типы данных можно разделить на базовые типы, контейнерные типы, домены и псевдотипы.

5.1.2.1. Базовые типы #

Базовые типы — это такие типы, как integer, которые реализуются на уровне ниже SQL языка (как правило, на языке низкого уровня, таком как C). В целом они соответствуют понятию абстрактных типов данных. Digital Q.DataBase может работать с такими типами только при помощи функций, предоставленных пользователем, и воспринимает поведение таких типов лишь в той мере, в какой его описывает пользователь. Встроенные базовые типы данных описаны в Глава 2.5.

Перечисляемые типы (enum) можно рассматривать как подкатегорию базовых типов данных. Основное отличие состоит в том, что их можно создавать, используя только SQL команды SQL, без программирования на низком уровне. Для получения дополнительных сведений см. Раздел 2.5.7

5.1.2.2. Контейнерные типы данных #

Digital Q.DataBase имеет три вида «контейнер» типов данных, которые способны содержать несколько значений других типов. Это массивы, составные типы и диапазоны.

Массивы могут хранить несколько значений одного и того же типа. Соответствующий тип массива автоматически создается для каждого базового, составного, диапазонного и доменного типа. Однако массивы массивов отсутствуют. С точки зрения системы типов многомерные массивы идентичны одномерным. См. Раздел 2.5.15 для получения дополнительной информации.

Составные типы (типы строк) создаются всякий раз, когда пользователь создает таблицу. Также можно использовать CREATE TYPE для определения «отдельного» составного типа, не связанного с какой-либо таблицей. Составной тип представляет собой просто список типов с соответствующими именами полей. Значение составного типа представляет собой строку или запись значений полей. См. Раздел 2.5.16 для получения дополнительной информации.

Диапазонный тип может содержать два значения одного типа, являющиеся нижней и верхней границами диапазона. Диапазонные типы создаются пользователем, хотя существует и несколько встроенных типов. См. Раздел 2.5.17 для получения дополнительной информации.

5.1.2.3. domains #

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

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

Существует несколько «псевдотипов» для специальных целей. Псевдотипы не могут использоваться в качестве столбцов таблиц или компонентов составных типов, но их можно использовать для объявления типов аргументов и результатов функций. Это обеспечивает механизм внутри системы типов для идентификации специальных классов функций. Таблица 2.5.27 содержит список существующих псевдотипов.

5.1.2.5. Полиморфные типы #

Особый интерес представляют некоторые псевдотипы, а именно полиморфные типы, которые используются для объявления полиморфные функции. Данный мощный функционал позволяет одному определению функции работать со множеством различных типов данных, причем конкретные типы определяются типами данных, фактически переданными при конкретном вызове. Полиморфные типы представлены в Таблица 5.1.1. Некоторые примеры их использования приведены в Раздел 5.1.5.11.

Таблица 5.1.1. Полиморфные типы

ИмяСемействоОписание
anyelementПростойУказывает, что функция принимает любой тип данных
anyarrayПростойУказывает, что функция принимает любой массив
anynonarrayПростойУказывает, что функция принимает любой тип данных, отличный от массива
anyenumПростойУказывает, что функция принимает любой тип данных «перечисление» (см. Раздел 2.5.7)
anyrangeПростойУказывает, что функция принимает любой диапазонный тип данных (см. Раздел 2.5.17)
anymultirangeПростойУказывает, что функция принимает любой мультидиапазонный тип данных (см. Раздел 2.5.17)
anycompatibleОбщиеУказывает, что функция принимает любой тип данных, с автоматическим приведением нескольких аргументов к общему типу данных
anycompatiblearrayОбщиеУказывает, что функция принимает любой массивный тип данных, с автоматическим приведением нескольких аргументов к общему типу данных
anycompatiblenonarrayОбщиеУказывает, что функция принимает любой немассивный тип данных, с автоматическим приведением нескольких аргументов к общему типу данных
anycompatiblerangeОбщиеУказывает, что функция принимает любой диапазонный тип данных, с автоматическим приведением нескольких аргументов к общему типу данных
anycompatiblemultirangeОбщиеУказывает, что функция принимает любой мультидиапазонный тип данных, с автоматическим приведением нескольких аргументов к общему типу данных

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

Для «простого» семейства полиморфных типов правила сопоставления и вывода работают следующим образом:

Для каждой позиции (аргумента или возвращаемого значения), объявленной как anyelement допускается любой конкретный фактический тип данных, но в рамках одного вызова все они должны иметь один и тот же фактический тип. Для каждой позиции, объявленной как anyarray допускается любой тип данных «массив», но они также должны быть одного и того же типа. Аналогично, позиции, объявленные как anyrange должны принадлежать к одному и тому же типу диапазона. То же самое справедливо для anymultirange.

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

Аналогично, если в объявлении присутствуют позиции типа anyrange и другие позиции, объявленные как anyelement или anyarray, фактический тип диапазона в anyrange позиции должны представлять собой диапазон, подтип которого совпадает с типом, указанным в anyelement позициях и соответствующим типу элементов anyarray позиций. Если объявлены позиции типа anymultirange, их фактический мультидиапазонный тип должен содержать диапазоны, соответствующие параметрам, объявленным как anyrange и базовые элементы, соответствующие параметрам, объявленным как anyelement и anyarray.

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

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

В большинстве случаев парсер может определить фактический тип данных для полиморфного типа результата на основе аргументов другого полиморфного типа из того же семейства; например, anyarray может быть выведено из anyelement или наоборот. Исключением является то, что полиморфный результат типа anyrange требует наличия аргумента типа anyrange; он не может быть выведен из anyarray или anyelement аргументов. Это связано с тем, что может существовать несколько диапазонных типов с одним и тем же базовым типом.

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

Для «common» семейство полиморфных типов, правила сопоставления и вывода работают примерно так же, как и для «простого» семейства, с одним важным отличием: фактические типы аргументов не обязательно должны быть идентичными, если они могут быть неявно приведены к единому общему типу. Общий тип выбирается в соответствии с теми же правилами, что и для UNION и связанных конструкций (см. Раздел 2.7.5). При выборе общего типа учитываются фактические типы входных данных anycompatible и anycompatiblenonarray входных параметров, типы элементов массива для anycompatiblearray входных параметров, базовые типы диапазонов для anycompatiblerange входных данных, и подтипов мультидиапазонов для anycompatiblemultirange входных данных. Если anycompatiblenonarray указан, то в качестве общего типа должен быть выбран тип, не являющийся массивом. После определения общего типа аргументы в anycompatible и anycompatiblenonarray позициях автоматически приводятся к этому типу, а аргументы в anycompatiblearray позициях автоматически приводятся к соответствующему типу массива.

Поскольку невозможно выбрать тип диапазона, зная только его подтип, использование anycompatiblerange и/или anycompatiblemultirange требует, чтобы все аргументы, объявленные с этим типом, имели один и тот же фактический тип диапазона и/или мультидиапазона, и чтобы подтип этого типа соответствовал выбранному общему типу, так что приведение значений диапазона не требуется. Как и в случае с anyrange и anymultirange, использование anycompatiblerange и anymultirange в качестве типа результата функции требует наличия аргумента anycompatiblerange или anycompatiblemultirange argument.

Обратите внимание, что типа данных anycompatibleenum не существует. Такой тип не был бы полезен, поскольку обычно не существует неявных приведений к перечислимым типам (enum), а это означает, что невозможно было бы определить общий тип для различных входных значений перечислимых типов.

Данные «простого» и «common» полиморфные семейства представляют собой два независимых набора переменных типа. Рассмотрим, например,

CREATE FUNCTION myfunc(a anyelement, b anyelement,
                       c anycompatible, d anycompatible)
RETURNS anycompatible AS ...

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

Функция с переменным числом аргументов (принимающая произвольное количество аргументов, как в Раздел 5.1.5.6) может быть полиморфной: это реализуется путем объявления ее последнего параметра как VARIADIC anyarray или VARIADIC anycompatiblearray. Для сопоставления аргументов и определения фактического типа результата такая функция работает так же, как если бы было указано соответствующее количество anynonarray или anycompatiblenonarray параметры.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению