This is an automated email from the ASF dual-hosted git repository. RocMarshal pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/master by this push:
new 2e89b879f1e [FLINK-40494][docs] Document the UUID type
2e89b879f1e is described below
commit 2e89b879f1e99612c92be845ec53c90efeb77b0d
Author: Ramin Gharib <[email protected]>
AuthorDate: Wed Nov 4 10:00:47 2026 +0100
[FLINK-40494][docs] Document the UUID type
Add a UUID section to the data types page: declaration, JVM bridging, the
literal, the UUID_V4 and UUID_V7 generators, casts, and ordering. Add UUID to
the cast matrix and to the list of data types, in the English and the Chinese
page.
Generated-by: Claude Code 2.1.318 (Claude Opus 5.5)
---
docs/content.zh/docs/sql/reference/data-types.md | 155 +++++++++++++++++++----
docs/content/docs/sql/reference/data-types.md | 155 +++++++++++++++++++----
2 files changed, 260 insertions(+), 50 deletions(-)
diff --git a/docs/content.zh/docs/sql/reference/data-types.md
b/docs/content.zh/docs/sql/reference/data-types.md
index e36eb8d9ea3..fd4a0ede63f 100644
--- a/docs/content.zh/docs/sql/reference/data-types.md
+++ b/docs/content.zh/docs/sql/reference/data-types.md
@@ -211,6 +211,7 @@ The default planner supports the following set of SQL types:
| Structured types | Only exposed in user-defined functions yet. |
| `VARIANT` | |
| `BITMAP` | |
+| `UUID` | |
### Character Strings
@@ -1860,6 +1861,108 @@ DataTypes.BITMAP()
{{< /tab >}}
{{< /tabs >}}
+#### `UUID`
+
+Data type of a universally unique identifier as defined by [RFC
9562](https://www.rfc-editor.org/rfc/rfc9562).
+
+A `UUID` holds 16 bytes. It renders in the canonical lower-case 8-4-4-4-12
hexadecimal form, for
+example `a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11`.
+
+The UUID type is an extension to the SQL standard.
+
+**Declaration**
+
+{{< tabs "627e76b3-765c-4dd5-8cba-2ab210eaeae1" >}}
+{{< tab "SQL" >}}
+```text
+UUID
+```
+
+A `UUID` usually comes from a literal, a cast from a string, or the `UUID_V4`
and `UUID_V7`
+functions. For example:
+
+```sql
+SELECT UUID 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'
+SELECT CAST('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' AS UUID)
+SELECT UUID_V7()
+```
+
+{{< /tab >}}
+{{< tab "Java/Scala" >}}
+```java
+DataTypes.UUID()
+```
+
+**Bridging to JVM Types**
+
+| Java Type | Input | Output | Remarks |
+|:-----------------|:-----:|:------:|:----------------------------------|
+| `java.util.UUID` | X | X | *Default* |
+| `byte[]` | X | X | The 16 bytes in big-endian order. |
+
+In the DataStream API, declare a `java.util.UUID` with `Types.UUID`. Type
extraction treats
+`java.util.UUID` as a generic type, which becomes a `RAW` type in the Table
API.
+
+{{< /tab >}}
+{{< /tabs >}}
+
+A `UUID` literal takes the canonical form with hyphens, in upper or lower
case. Any other form
+fails at validation, so use a cast for it:
+
+```sql
+UUID 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11' --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+UUID 'a0eebc999c0b4ef8bb6d6bb9bd380a11' -- fails at validation
+```
+
+The [arithmetic functions]({{< ref "docs/sql/functions/built-in-functions"
>}}#arithmetic-functions)
+`UUID_V4()` and `UUID_V7()` generate a random and a time-ordered `UUID`.
`UUID()` returns a random
+version 4 UUID as a `CHAR(36)` string instead.
+
+A `UUID` converts to and from other types only with an explicit `CAST` or
`TRY_CAST`. A failing
+`CAST` fails the job, and `TRY_CAST` returns `NULL`.
+
+| Cast | Behavior
|
+|----------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `UUID` to `CHAR`, `VARCHAR`, `STRING` | Renders the
canonical lower-case form.
|
+| `CHAR`, `VARCHAR`, `STRING` to `UUID` | Needs
exactly 32 hexadecimal digits in any case. Braces around the value and a hyphen
after any group of four digits are allowed. Spaces are not trimmed. |
+| `UUID` to `BINARY(16)`, `VARBINARY(n)` with `n >= 16`, `BYTES` | Writes the
16 bytes in big-endian order.
|
+| `BINARY(16)`, `VARBINARY(n)`, `BYTES` to `UUID` | Needs
exactly 16 bytes.
|
+| `UUID` to `VARIANT` and back | Stores the
`UUID` kind, see [`VARIANT`](#variant).
|
+
+Any other `BINARY(n)`, and a `VARBINARY(n)` shorter than 16 bytes, is rejected
at validation.
+
+```sql
+CAST(UUID 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11' AS STRING) --
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'
+CAST('{A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11}' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+CAST('a0eebc999c0b4ef8bb6d6bb9bd380a11' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+CAST('a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+TRY_CAST('a0eebc99' AS UUID) -- NULL
+CAST(UUID 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' AS BYTES) --
x'a0eebc999c0b4ef8bb6d6bb9bd380a11'
+CAST(x'a0eebc999c0b4ef8bb6d6bb9bd380a11' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+```
+
+Comparisons, `ORDER BY`, `GROUP BY`, `DISTINCT`, and join keys accept a
`UUID`. Values sort by their
+16 bytes as unsigned numbers, most significant byte first. This is also the
order of the canonical
+strings:
+
+```sql
+SELECT u FROM (VALUES
+ (UUID 'ffffffff-ffff-ffff-ffff-ffffffffffff'),
+ (UUID '80000000-0000-0000-0000-000000000000'),
+ (UUID '00000000-0000-0000-0000-000000000000')
+ ) AS T(u)
+ORDER BY u
+-- 00000000-0000-0000-0000-000000000000
+-- 80000000-0000-0000-0000-000000000000
+-- ffffffff-ffff-ffff-ffff-ffffffffffff
+```
+
+A `UUID` does not compare with a character string. `u =
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'`
+fails at validation, so cast the string to `UUID` first.
+
+Formats do not read or write `UUID` columns yet. Cast a `UUID` to `STRING` or
`BINARY(16)` before
+you write it to a sink that uses a format.
+
#### `RAW`
Data type of an arbitrary serialized type. This type is a black box within the
table ecosystem
@@ -1984,31 +2087,32 @@ COALESCE(TRY_CAST('non-number' AS INT), 0) --- 结果返回数字 0
的 INT 格
下表展示了各个类型的转换程度,"Y" 表示支持,"!" 表示转换可能会失败,"N" 表示不支持:
-| Input\Target |
`CHAR`¹/<br/>`VARCHAR`¹/<br/>`STRING` |
`BINARY`¹/<br/>`VARBINARY`¹/<br/>`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` |
`SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` |
`TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` |
`ROW` | `STRUCTURED` | `RAW` | `VARIANT` | `BITMAP` |
-|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:|:--------:|
-| `CHAR`/<br/>`VARCHAR`/<br/>`STRING` | Y
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | N | N | N | N
| N | N | ! | N |
-| `BINARY`/<br/>`VARBINARY`/<br/>`BYTES` | Y
| Y | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | ! | N |
-| `BOOLEAN` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `DECIMAL` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `TINYINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N |
-| `SMALLINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N |
-| `INTEGER` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁵ | N | N | N | N
| N | N | Y | N |
-| `BIGINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁶ | N | N | N | N
| N | N | Y | N |
-| `FLOAT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `DOUBLE` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `DATE` | Y
| N | N | N | N
| N | N | N | N | N | Y | N |
Y | Y | N | N | N | N | N
| N | N | Y | N |
-| `TIME` | Y
| N | N | N | N
| N | N | N | N | N | N | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N |
-| `TIMESTAMP` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N |
-| `TIMESTAMP_LTZ` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N |
-| `INTERVAL` | Y
| N | N | N | N
| N | Y⁵ | Y⁶ | N | N | N | N |
N | N | Y | N | N | N | N
| N | N | N | N |
-| `ARRAY` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | !³ | N | N | N
| N | N | !⁸ | N |
-| `MULTISET` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | !³ | N | N
| N | N | N | N |
-| `MAP` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | !³ | N
| N | N | !⁸ | N |
-| `ROW` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | !³
| N | N | !⁸ | N |
-| `STRUCTURED` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| !³ | N | !⁸ | N |
-| `RAW` | Y
| ! | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | Y⁴ | N | N |
-| `VARIANT` | !
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | !³ | N | !³ | !³
| !³ | N | Y | N |
-| `BITMAP` | Y
| Y⁷ | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | N | N |
+| Input\Target |
`CHAR`¹/<br/>`VARCHAR`¹/<br/>`STRING` |
`BINARY`¹/<br/>`VARBINARY`¹/<br/>`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` |
`SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` |
`TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` |
`ROW` | `STRUCTURED` | `RAW` | `VARIANT` | `BITMAP` | `UUID` |
+|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:|:--------:|:------:|
+| `CHAR`/<br/>`VARCHAR`/<br/>`STRING` | Y
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | N | N | N | N
| N | N | ! | N | ! |
+| `BINARY`/<br/>`VARBINARY`/<br/>`BYTES` | Y
| Y | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | ! | N | !⁹ |
+| `BOOLEAN` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `DECIMAL` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `TINYINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N | N |
+| `SMALLINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N | N |
+| `INTEGER` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁵ | N | N | N | N
| N | N | Y | N | N |
+| `BIGINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁶ | N | N | N | N
| N | N | Y | N | N |
+| `FLOAT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `DOUBLE` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `DATE` | Y
| N | N | N | N
| N | N | N | N | N | Y | N |
Y | Y | N | N | N | N | N
| N | N | Y | N | N |
+| `TIME` | Y
| N | N | N | N
| N | N | N | N | N | N | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N | N |
+| `TIMESTAMP` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N | N |
+| `TIMESTAMP_LTZ` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N | N |
+| `INTERVAL` | Y
| N | N | N | N
| N | Y⁵ | Y⁶ | N | N | N | N |
N | N | Y | N | N | N | N
| N | N | N | N | N |
+| `ARRAY` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | !³ | N | N | N
| N | N | !⁸ | N | N |
+| `MULTISET` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | !³ | N | N
| N | N | N | N | N |
+| `MAP` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | !³ | N
| N | N | !⁸ | N | N |
+| `ROW` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | !³
| N | N | !⁸ | N | N |
+| `STRUCTURED` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| !³ | N | !⁸ | N | N |
+| `RAW` | Y
| ! | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | Y⁴ | N | N | N |
+| `VARIANT` | !
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | !³ | N | !³ | !³
| !³ | N | Y | N | ! |
+| `BITMAP` | Y
| Y⁷ | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | N | N | N |
+| `UUID` | Y
| Y⁹ | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | Y |
备注:
@@ -2020,6 +2124,7 @@ COALESCE(TRY_CAST('non-number' AS INT), 0) --- 结果返回数字 0 的
INT 格
6. 支持转换,当且仅当用使用 `INTERVAL` 做“天”到“时间”的转换。
7. 仅支持转换到无界的 `VARBINARY`(`BYTES`),因为裁剪或填充会破坏序列化的位图数据。
8. Supported iff every leaf type casts to `VARIANT` and every `MAP` key is a
character string. Always fallible for `ARRAY` and `MAP`. Fallible for `ROW` and
`STRUCTURED` iff a field is fallible, a field is a `VARIANT`, or the declared
sizes of the fields can exceed the 16 MiB of a `VARIANT`.
+9. Supported iff the binary type holds 16 bytes, which is `BINARY(16)` or
`VARBINARY(n)` with `n` of at least 16. A cast from a `VARBINARY` to `UUID`
fails for any length other than 16.
请注意:无论是 `CAST` 还是 `TRY_CAST`,当输入为 `NULL` ,输出也为 `NULL`。
diff --git a/docs/content/docs/sql/reference/data-types.md
b/docs/content/docs/sql/reference/data-types.md
index d5e3d765d40..c6a65b1294b 100644
--- a/docs/content/docs/sql/reference/data-types.md
+++ b/docs/content/docs/sql/reference/data-types.md
@@ -219,6 +219,7 @@ The default planner supports the following set of SQL types:
| Structured types | Only exposed in user-defined functions yet. |
| `VARIANT` | |
| `BITMAP` | |
+| `UUID` | |
### Character Strings
@@ -1869,6 +1870,108 @@ DataTypes.BITMAP()
{{< /tab >}}
{{< /tabs >}}
+#### `UUID`
+
+Data type of a universally unique identifier as defined by [RFC
9562](https://www.rfc-editor.org/rfc/rfc9562).
+
+A `UUID` holds 16 bytes. It renders in the canonical lower-case 8-4-4-4-12
hexadecimal form, for
+example `a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11`.
+
+The UUID type is an extension to the SQL standard.
+
+**Declaration**
+
+{{< tabs "627e76b3-765c-4dd5-8cba-2ab210eaeae1" >}}
+{{< tab "SQL" >}}
+```text
+UUID
+```
+
+A `UUID` usually comes from a literal, a cast from a string, or the `UUID_V4`
and `UUID_V7`
+functions. For example:
+
+```sql
+SELECT UUID 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'
+SELECT CAST('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' AS UUID)
+SELECT UUID_V7()
+```
+
+{{< /tab >}}
+{{< tab "Java/Scala" >}}
+```java
+DataTypes.UUID()
+```
+
+**Bridging to JVM Types**
+
+| Java Type | Input | Output | Remarks |
+|:-----------------|:-----:|:------:|:----------------------------------|
+| `java.util.UUID` | X | X | *Default* |
+| `byte[]` | X | X | The 16 bytes in big-endian order. |
+
+In the DataStream API, declare a `java.util.UUID` with `Types.UUID`. Type
extraction treats
+`java.util.UUID` as a generic type, which becomes a `RAW` type in the Table
API.
+
+{{< /tab >}}
+{{< /tabs >}}
+
+A `UUID` literal takes the canonical form with hyphens, in upper or lower
case. Any other form
+fails at validation, so use a cast for it:
+
+```sql
+UUID 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11' --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+UUID 'a0eebc999c0b4ef8bb6d6bb9bd380a11' -- fails at validation
+```
+
+The [arithmetic functions]({{< ref "docs/sql/functions/built-in-functions"
>}}#arithmetic-functions)
+`UUID_V4()` and `UUID_V7()` generate a random and a time-ordered `UUID`.
`UUID()` returns a random
+version 4 UUID as a `CHAR(36)` string instead.
+
+A `UUID` converts to and from other types only with an explicit `CAST` or
`TRY_CAST`. A failing
+`CAST` fails the job, and `TRY_CAST` returns `NULL`.
+
+| Cast | Behavior
|
+|----------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `UUID` to `CHAR`, `VARCHAR`, `STRING` | Renders the
canonical lower-case form.
|
+| `CHAR`, `VARCHAR`, `STRING` to `UUID` | Needs
exactly 32 hexadecimal digits in any case. Braces around the value and a hyphen
after any group of four digits are allowed. Spaces are not trimmed. |
+| `UUID` to `BINARY(16)`, `VARBINARY(n)` with `n >= 16`, `BYTES` | Writes the
16 bytes in big-endian order.
|
+| `BINARY(16)`, `VARBINARY(n)`, `BYTES` to `UUID` | Needs
exactly 16 bytes.
|
+| `UUID` to `VARIANT` and back | Stores the
`UUID` kind, see [`VARIANT`](#variant).
|
+
+Any other `BINARY(n)`, and a `VARBINARY(n)` shorter than 16 bytes, is rejected
at validation.
+
+```sql
+CAST(UUID 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11' AS STRING) --
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'
+CAST('{A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11}' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+CAST('a0eebc999c0b4ef8bb6d6bb9bd380a11' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+CAST('a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+TRY_CAST('a0eebc99' AS UUID) -- NULL
+CAST(UUID 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' AS BYTES) --
x'a0eebc999c0b4ef8bb6d6bb9bd380a11'
+CAST(x'a0eebc999c0b4ef8bb6d6bb9bd380a11' AS UUID) --
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+```
+
+Comparisons, `ORDER BY`, `GROUP BY`, `DISTINCT`, and join keys accept a
`UUID`. Values sort by their
+16 bytes as unsigned numbers, most significant byte first. This is also the
order of the canonical
+strings:
+
+```sql
+SELECT u FROM (VALUES
+ (UUID 'ffffffff-ffff-ffff-ffff-ffffffffffff'),
+ (UUID '80000000-0000-0000-0000-000000000000'),
+ (UUID '00000000-0000-0000-0000-000000000000')
+ ) AS T(u)
+ORDER BY u
+-- 00000000-0000-0000-0000-000000000000
+-- 80000000-0000-0000-0000-000000000000
+-- ffffffff-ffff-ffff-ffff-ffffffffffff
+```
+
+A `UUID` does not compare with a character string. `u =
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'`
+fails at validation, so cast the string to `UUID` first.
+
+Formats do not read or write `UUID` columns yet. Cast a `UUID` to `STRING` or
`BINARY(16)` before
+you write it to a sink that uses a format.
+
#### `RAW`
Data type of an arbitrary serialized type. This type is a black box within the
table ecosystem
@@ -1993,31 +2096,32 @@ COALESCE(TRY_CAST('non-number' AS INT), 0) --- returns
0 of type INT NOT NULL
The matrix below describes the supported cast pairs, where "Y" means
supported, "!" means fallible, "N" means unsupported:
-| Input\Target |
`CHAR`¹/<br/>`VARCHAR`¹/<br/>`STRING` |
`BINARY`¹/<br/>`VARBINARY`¹/<br/>`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` |
`SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` |
`TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` |
`ROW` | `STRUCTURED` | `RAW` | `VARIANT` | `BITMAP` |
-|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:|:--------:|
-| `CHAR`/<br/>`VARCHAR`/<br/>`STRING` | Y
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | N | N | N | N
| N | N | ! | N |
-| `BINARY`/<br/>`VARBINARY`/<br/>`BYTES` | Y
| Y | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | ! | N |
-| `BOOLEAN` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `DECIMAL` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `TINYINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N |
-| `SMALLINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N |
-| `INTEGER` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁵ | N | N | N | N
| N | N | Y | N |
-| `BIGINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁶ | N | N | N | N
| N | N | Y | N |
-| `FLOAT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `DOUBLE` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N |
-| `DATE` | Y
| N | N | N | N
| N | N | N | N | N | Y | N |
Y | Y | N | N | N | N | N
| N | N | Y | N |
-| `TIME` | Y
| N | N | N | N
| N | N | N | N | N | N | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N |
-| `TIMESTAMP` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N |
-| `TIMESTAMP_LTZ` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N |
-| `INTERVAL` | Y
| N | N | N | N
| N | Y⁵ | Y⁶ | N | N | N | N |
N | N | Y | N | N | N | N
| N | N | N | N |
-| `ARRAY` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | !³ | N | N | N
| N | N | !⁸ | N |
-| `MULTISET` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | !³ | N | N
| N | N | N | N |
-| `MAP` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | !³ | N
| N | N | !⁸ | N |
-| `ROW` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | !³
| N | N | !⁸ | N |
-| `STRUCTURED` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| !³ | N | !⁸ | N |
-| `RAW` | Y
| ! | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | Y⁴ | N | N |
-| `VARIANT` | !
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | !³ | N | !³ | !³
| !³ | N | Y | N |
-| `BITMAP` | Y
| Y⁷ | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | N | N |
+| Input\Target |
`CHAR`¹/<br/>`VARCHAR`¹/<br/>`STRING` |
`BINARY`¹/<br/>`VARBINARY`¹/<br/>`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` |
`SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` |
`TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` |
`ROW` | `STRUCTURED` | `RAW` | `VARIANT` | `BITMAP` | `UUID` |
+|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:|:--------:|:------:|
+| `CHAR`/<br/>`VARCHAR`/<br/>`STRING` | Y
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | N | N | N | N
| N | N | ! | N | ! |
+| `BINARY`/<br/>`VARBINARY`/<br/>`BYTES` | Y
| Y | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | ! | N | !⁹ |
+| `BOOLEAN` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `DECIMAL` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `TINYINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N | N |
+| `SMALLINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N | Y | N | N |
+| `INTEGER` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁵ | N | N | N | N
| N | N | Y | N | N |
+| `BIGINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁶ | N | N | N | N
| N | N | Y | N | N |
+| `FLOAT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `DOUBLE` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | N |
+| `DATE` | Y
| N | N | N | N
| N | N | N | N | N | Y | N |
Y | Y | N | N | N | N | N
| N | N | Y | N | N |
+| `TIME` | Y
| N | N | N | N
| N | N | N | N | N | N | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N | N |
+| `TIMESTAMP` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N | N |
+| `TIMESTAMP_LTZ` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N | ! | N | N |
+| `INTERVAL` | Y
| N | N | N | N
| N | Y⁵ | Y⁶ | N | N | N | N |
N | N | Y | N | N | N | N
| N | N | N | N | N |
+| `ARRAY` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | !³ | N | N | N
| N | N | !⁸ | N | N |
+| `MULTISET` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | !³ | N | N
| N | N | N | N | N |
+| `MAP` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | !³ | N
| N | N | !⁸ | N | N |
+| `ROW` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | !³
| N | N | !⁸ | N | N |
+| `STRUCTURED` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| !³ | N | !⁸ | N | N |
+| `RAW` | Y
| ! | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | Y⁴ | N | N | N |
+| `VARIANT` | !
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | !³ | N | !³ | !³
| !³ | N | Y | N | ! |
+| `BITMAP` | Y
| Y⁷ | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | N | N | N |
+| `UUID` | Y
| Y⁹ | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N | Y | N | Y |
Notes:
@@ -2029,6 +2133,7 @@ Notes:
6. Supported iff `INTERVAL` is a `DAY TO TIME` range.
7. Supported only for unbounded `VARBINARY` (`BYTES`), because trimming or
padding would corrupt the serialized bitmap data.
8. Supported iff every leaf type casts to `VARIANT` and every `MAP` key is a
character string. Always fallible for `ARRAY` and `MAP`. Fallible for `ROW` and
`STRUCTURED` iff a field is fallible, a field is a `VARIANT`, or the declared
sizes of the fields can exceed the 16 MiB of a `VARIANT`.
+9. Supported iff the binary type holds 16 bytes, which is `BINARY(16)` or
`VARBINARY(n)` with `n` of at least 16. A cast from a `VARBINARY` to `UUID`
fails for any length other than 16.
Also note that a cast of a `NULL` value will always return `NULL`,
regardless of whether the function used is `CAST` or `TRY_CAST`.
