Перейти к содержимому
Последнее обновление

Преобразование типов

В Doris каждое выражение, например 1, col1 и from_unixtime(col2) в выражении select 1, col1, from_unixtime(col2) from table1, имеет тип. Процесс преобразования выражения из одного типа в другой называется «преобразованием типов».

Преобразование типов бывает двух видов: явное и неявное.

Все преобразования типов выполняются по определённым правилам. Эти правила описаны в зависимости от целевого типа преобразования. Например, преобразование из INT в DOUBLE и преобразование из STRING в DOUBLE описаны в документе Преобразование в FLOAT/DOUBLE.

Возможность преобразования и допустимость NULL в типе результата зависят от того, включён ли строгий режим (переменная сеанса enable_strict_cast). Как правило, при включённом строгом режиме данные, которые не удалось преобразовать, немедленно вызывают ошибку и приводят к сбою выполнения SQL. При отключённом строгом режиме для строк данных, которые не удалось преобразовать, результатом будет NULL.

Правила разбора и миграции приведены в разделе Преобразование UUID. Строки можно преобразовывать в UUID, а UUID можно преобразовывать в строки или VARIANT, но нельзя напрямую преобразовывать в числовые типы, типы даты и времени или IP.

Явное преобразование​

Явное преобразование выполняется с помощью функции CAST, например:

CAST(1.23 as INT) преобразует число 1.23 в тип INT.

CAST(colA as DATETIME(6)) преобразует столбец/выражение colA в тип DATETIME(6) (то есть тип DATETIME с точностью до микросекунд).

Ниже описаны возможности преобразования между различными типами в строгом режиме (enable_strict_cast = true) и нестрогом режиме (enable_strict_cast = false), включая следующие четыре случая:

СимволЗначение
xПреобразование не допускается
PВозвращаемый тип будет Nullable только в том случае, если входной параметр уже имеет тип Nullable, то есть преобразование не будет преобразовывать значения, отличные от Null, в Null
AВозвращаемый тип всегда Nullable. Преобразование может преобразовывать значения, отличные от Null, в Null
OВозвращаемый тип является Nullable, если преобразование из входного типа в выходной может вызвать переполнение. Для входных значений, отличных от Null, результат преобразования может быть Null, если при преобразовании действительно возникает переполнение

Подробные правила преобразования типов и свойства Nullable приведены в документации по преобразованию типов в текущем каталоге.

Строгий режим​

Из\Вbooltinyintsmallintintbigintlargeintfloatdoubledecimaldatedatetimetimestamp_nstimeIPv4IPv6charvarcharstringbitmaphlljsonarraymapstructvariantUUID
boolPPPPPPPPOxxxxxxxxPxxxx
tinyintPPPPPPPPOAAAAxxxxPxxxx
smallintPAPPPPPPOAAAAxxxxPxxxx
intPAAPPPPPOAAAAxxxxPxxxx
bigintPAAAPPPPOAAAAxxxxPxxxx
largeintPAAAAPPPOAAAAxxxxPxxxx
floatPAAAAAPPAAAAAxxxxPxxxx
doublePAAAAAPPAAAAAxxxxPxxxx
decimalPOOOOOPPOAAAAxxxxPxxxx
datexxxPPPxxxPPAxxxxxxxxxx
datetimexxxxPPxxxPAAPxxxxxxxxx
timestamp_nsxxxxPPxxxPPPPxxPPPxxxxxxPx
timexAAAPPxxxPPPAxxxxxxxxx
IPv4xxxxxxxxxxxxxPPxxxxxxx
IPv6xxxxxxxxxxxxxxPxxxxxxx
charAAAAAAAAAAAAAAAxxAAAAA
varcharAAAAAAAAAAAAAAAxxAAAAA
stringAAAAAAAAAAAAAAAxxAAAAA
bitmapxxxxxxxxxxxxxxxxxxPxxxxxx
hllxxxxxxxxxxxxxxxxxxxPxxxxx
jsonAAAAAAAAAxxxxxxAAAxxPAxAx
arrayxxxxxxxxxxxxxxxxxPPxxx
mapxxxxxxxxxxxxxxxxxxxPxx
structxxxxxxxxxxxxxxxxxPxxPx
variantAA
UUIDxxxxxxxxxxxxxxxPPPxxxxxxPP

Нестрогий режим​

Из\Вbooltinyintsmallintintbigintlargeintfloatdoubledecimaldatedatetimetimestamp_nstimeIPv4IPv6charvarcharstringbitmaphlljsonarraymapstructvariantUUID
boolPPPPPPPPOxxxxxxxxPxxxx
tinyintPPPPPPPPOAAAAxxxxPxxxx
smallintPAPPPPPPOAAAAxxxxPxxxx
intPAAPPPPPOAAAAxxxxPxxxx
bigintPAAAPPPPOAAAAxxxxPxxxx
largeintPAAAAPPPOAAAAxxxxPxxxx
floatPAAAAAPPAAAAAxxxxPxxxx
doublePAAAAAPPAAAAAxxxxPxxxx
decimalPOOOOOPPOAAAAxxxxPxxxx
datexxxPPPPPxPPAxxxxxxxxxx
datetimexxxxPPPPxPAAPxxxxxxxxx
timestamp_nsxxxxPPPPxPPPPxxPPPxxxxxxPx
timexAAAPPPPxPPPAxxxxxxxxx
IPv4xxxxxxxxxxxxxPPxxxxxxx
IPv6xxxxxxxxxxxxxxPxxxxxxx
charAAAAAAAAAAAAAAAxxAAAAA
varcharAAAAAAAAAAAAAAAxxAAAAA
stringAAAAAAAAAAAAAAAxxAAAAA
bitmapxxxxxxxxxxxxxxxxxxPxxxxxx
hllxxxxxxxxxxxxxxxxxxxPxxxxx
jsonAAAAAAAAAxxxxxxAAAxxPAxAx
arrayxxxxxxxxxxxxxxxxxPPxxx
mapxxxxxxxxxxxxxxxxxxxPxx
structxxxxxxxxxxxxxxxxxPxxPx
variantAA
UUIDxxxxxxxxxxxxxxxPPPxxxxxxPP

Подробные правила преобразования TIMESTAMP_NS приведены в разделе Преобразование в TIMESTAMP_NS. TIMESTAMPTZ не включён в приведённые выше матрицы; преобразование между TIMESTAMP_NS и TIMESTAMPTZ поддерживается как в строгом, так и в нестрогом режиме.

Неявное преобразование​

Неявное преобразование выполняется в определённых ситуациях, когда оно явно не задано во входном SQL, но Doris автоматически включает выражение CAST в план выполнения. Это происходит главным образом в следующих случаях:

  1. При вызове функции тип фактического параметра не соответствует типу в сигнатуре функции.

  2. Типы операндов в левой и правой частях математического выражения различаются.

и т. д.

Матрица преобразований​

TODO

Общий тип​

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

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