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

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

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

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

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

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

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

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

6.1.56. CREATE CAST

6.1.56. CREATE CAST

CREATE CAST — создание нового приведения типа

Синтаксис

CREATE CAST (source_type AS target_type)
    WITH FUNCTION function_name [ (argument_type [, ...]) ]
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (source_type AS target_type)
    WITHOUT FUNCTION
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (source_type AS target_type)
    WITH INOUT
    [ AS ASSIGNMENT | AS IMPLICIT ]

Описание

Команда CREATE CAST определяет новое приведение типа. Приведение указывает, как выполнить преобразование между двумя типами данных. Например,

SELECT CAST(42 AS float8);

преобразует целочисленную константу 42 к типу float8, вызывая ранее указанную функцию, в данном случае float8(int4). (Если подходящее приведение не определено, преобразование завершится ошибкой.)

Два типа могут быть двоично приводимыми (binary coercible), что означает, что преобразование может быть выполнено «бесплатно» без вызова какой-либо функции. Для этого требуется, чтобы соответствующие значения использовали одинаковое внутреннее представление. Например, типы text и varchar двоично приводимы в обоих направлениях. Двоичная приводимость не обязательно является симметричным отношением. Например, приведение из типа xml в text может быть выполнено бесплатно в текущей реализации, но обратное направление требует функции, выполняющей как минимум синтаксическую проверку. (Два типа, двоично приводимые в обоих направлениях, также называются двоично совместимыми.)

Вы можете определить приведение как I/O преобразующее приведение (I/O conversion cast), используя синтаксис WITH INOUT. I/O преобразующее приведение выполняется вызовом выходной функции исходного типа данных и передачей полученной строки входной функции целевого типа данных. Во многих распространённых случаях это позволяет избежать необходимости писать отдельную функцию приведения. I/O преобразующее приведение действует так же, как и обычное приведение на основе функции; различается только реализация.

По умолчанию приведение может быть вызвано только явным запросом приведения, то есть конструкциями явного CAST(x AS typename) или x::typename.

Если приведение помечено как AS ASSIGNMENT, то оно может вызываться неявно при присваивании значения столбцу целевого типа данных. Например, предположим, что foo.f1 — это столбец типа text, тогда:

INSERT INTO foo (f1) VALUES (42);

будет разрешено, если приведение из типа integer в text помечено как AS ASSIGNMENT, в противном случае — нет. (Обычно мы используем термин присваивающее приведение (assignment cast) для описания такого вида приведения.)

Если приведение помечено как AS IMPLICIT, то оно может вызываться неявно в любом контексте, будь то присваивание или внутреннее выражение. (Обычно мы используем термин неявное приведение (implicit cast) для описания такого вида приведения.) Например, рассмотрим этот запрос:

SELECT 2 + 4.0;

Парсер изначально помечает константы как имеющие тип integer и numeric соответственно. В системных каталогах нет оператора integer + numeric, но есть оператор numeric + numeric. Таким образом, запрос будет успешным, если приведение из integer в numeric доступно и помечено как AS IMPLICIT — что на самом деле так и есть. Парсер применит неявное приведение и разрешит запрос так, как если бы он был написан

SELECT CAST ( 2 AS numeric ) + 4.0;

Кроме того, в каталогах также есть приведение из numeric в integer. Если бы это приведение было помечено как AS IMPLICIT — а оно не помечено — то парсер оказался бы перед выбором между описанной выше интерпретацией и альтернативой приведения константы numeric к integer и применения оператора integer + integer. Не имея знаний о том, какой выбор предпочесть, он сдался бы и объявил запрос неоднозначным. Тот факт, что только одно из двух приведений является неявным, — это способ указать парсеру, что следует предпочитать разрешение смешанного выражения numeric-и-integer как numeric; никаких встроенных знаний об этом нет.

Следует быть консервативным в отношении пометки приведений как неявных. Избыток путей неявного приведения может заставить Digital Q.DataBase выбирать неожиданные интерпретации команд или не иметь возможности разрешить команды вообще из-за наличия нескольких возможных интерпретаций. Хорошее эмпирическое правило: делать приведение неявно вызываемым только для сохраняющих информацию преобразований между типами в одной общей категории. Например, приведение из int2 в int4 разумно сделать неявным, а приведение из float8 в int4, вероятно, должно быть только присваивающим. Приведения между категориями типов, такие как из text в int4, лучше делать только явными.

Примечание

Иногда по соображениям удобства использования или соответствия стандартам необходимо предоставить несколько неявных приведений среди набора типов, что приводит к неоднозначности, которой нельзя избежать, как описано выше. У парсера есть запасная эвристика, основанная на категориях типов (type categories) и предпочитаемых типах (preferred types), которая может помочь обеспечить желаемое поведение в таких случаях. Подробнее см. CREATE TYPE.

Чтобы иметь возможность создать приведение, вы должны владеть исходным или целевым типом данных и иметь право USAGE на другой тип. Чтобы создать двоично приводимое приведение, вы должны быть суперпользователем. (Это ограничение введено потому, что ошибочное преобразование с двоично приводимым приведением может легко привести к аварийной остановке сервера.)

Параметры

source_type

Имя исходного типа данных для приведения.

target_type

Имя целевого типа данных для приведения.

function_name[(argument_type [, ...])]

Функция, используемая для выполнения приведения. Имя функции может быть указано с схемой. Если нет, функция будет искаться в пути поиска схем. Тип результата функции должен соответствовать целевому типу приведения. Её аргументы обсуждаются ниже. Если список аргументов не указан, имя функции должно быть уникальным в своей схеме.

WITHOUT FUNCTION

Указывает, что исходный тип двоично приводим к целевому типу, поэтому для выполнения приведения функция не требуется.

WITH INOUT

Указывает, что приведение является I/O преобразующим приведением, выполняемым вызовом выходной функции исходного типа данных и передачей полученной строки входной функции целевого типа данных.

AS ASSIGNMENT

Указывает, что приведение может вызываться неявно в контекстах присваивания.

AS IMPLICIT

Указывает, что приведение может вызываться неявно в любом контексте.

Функции реализации приведения могут иметь от одного до трёх аргументов. Тип первого аргумента должен быть идентичен или двоично приводим из исходного типа приведения. Второй аргумент, если присутствует, должен иметь тип integer; он получает модификатор типа, связанный с целевым типом, или -1, если такового нет. Третий аргумент, если присутствует, должен иметь тип boolean; он получает значение true, если приведение является явным, и false в противном случае. (Как ни странно, стандарт SQL требует различного поведения для явных и неявных приведений в некоторых случаях. Этот аргумент предоставляется для функций, которые должны реализовывать такие приведения. Не рекомендуется проектировать собственные типы данных так, чтобы это имело значение.)

Возвращаемый тип функции приведения должен быть идентичен или двоично приводим к целевому типу приведения.

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

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

В настоящее время приведение к типу домена или от него не имеет эффекта. Приведение к домену или от него использует приведения, связанные с его базовым типом.

Примечания

Используйте DROP CAST для удаления пользовательских приведений.

Помните, что если вы хотите иметь возможность преобразовывать типы в обоих направлениях, вам нужно явно объявить приведения в обоих направлениях.

Обычно нет необходимости создавать приведения между пользовательскими типами и стандартными строковыми типами (text, varchar и char(n), а также пользовательскими типами, определёнными как относящиеся к строковой категории). Digital Q.DataBase предоставляет автоматические I/O преобразующие приведения для этого. Автоматические приведения к строковым типам рассматриваются как присваивающие, а автоматические приведения из строковых типов — только как явные. Вы можете переопределить это поведение, объявив собственное приведение для замены автоматического, но обычно единственная причина для этого — сделать преобразование более легко вызываемым, чем стандартные настройки «только присваивание» или «только явное». Другая возможная причина заключается в том, что вы хотите, чтобы преобразование вело себя иначе, чем I/O функция типа; но это настолько неожиданно, что вам следует дважды подумать, хорошая ли это идея. (Небольшое количество встроенных типов действительно имеют различное поведение для преобразований, в основном из-за требований стандарта SQL.)

Хотя это и не обязательно, рекомендуется продолжать следовать старому соглашению об именовании функций реализации приведения по имени целевого типа данных. Многие пользователи привыкли к тому, что можно приводить типы данных, используя функциональную нотацию, то есть typename(x). Эта нотация фактически представляет собой не что иное, как вызов функции реализации приведения; она не обрабатывается особым образом как приведение. Если ваши функции преобразования не названы в соответствии с этим соглашением, вы удивите пользователей. Поскольку Digital Q.DataBase позволяет перегружать одно и то же имя функции с разными типами аргументов, нет никаких сложностей в наличии нескольких функций преобразования из разных типов, которые все используют имя целевого типа.

Примечание

На самом деле предыдущий абзац является упрощением: существует два случая, в которых конструкция вызова функции будет рассматриваться как запрос приведения без сопоставления с фактической функцией. Если вызов функции name(x) не соответствует точно ни одной существующей функции, но name является именем типа данных, а pg_cast предоставляет двоично приводимое приведение к этому типу из типа x, то вызов будет истолкован как двоично приводимое приведение. Это исключение сделано для того, чтобы двоично приводимые приведения могли вызываться с использованием функционального синтаксиса, даже если у них нет функции. Аналогично, если нет записи в pg_cast, но приведение будет к строковому типу или из него, вызов будет истолкован как I/O преобразующее приведение. Это исключение позволяет вызывать I/O преобразующие приведения с использованием функционального синтаксиса.

Примечание

Существует также исключение из исключения: I/O преобразующие приведения из составных типов в строковые типы не могут быть вызваны с использованием функционального синтаксиса, а должны быть записаны в явном синтаксисе приведения (либо CAST, либо нотация ::). Это исключение было добавлено потому, что после введения автоматически предоставляемых I/O преобразующих приведений было обнаружено, что слишком легко случайно вызвать такое приведение, когда предполагалась ссылка на функцию или столбец.

Примеры

Чтобы создать присваивающее приведение из типа bigint в тип int4 с использованием функции int4(bigint):

CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;

(Это приведение уже предопределено в системе.)

Совместимость

Команда CREATE CAST соответствует стандарту SQL, за исключением того, что SQL не предусматривает двоично приводимые типы или дополнительные аргументы для функций реализации. AS IMPLICIT также является расширением Digital Q.DataBase.

Смотрите также

CREATE FUNCTION, CREATE TYPE, DROP CAST

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

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