From fabee6d24cfc2d6a0dfd280d21a625877764f282 Mon Sep 17 00:00:00 2001 From: dylanhz Date: Thu, 26 Mar 2026 16:09:35 +0800 Subject: [PATCH] [FLINK-39188][docs] Documentation for BITMAP type --- .../docs/sql/functions/built-in-functions.md | 6 ++ .../docs/sql/reference/data-types.md | 88 +++++++++++++----- .../docs/sql/functions/built-in-functions.md | 6 ++ docs/content/docs/sql/reference/data-types.md | 90 ++++++++++++++----- 4 files changed, 142 insertions(+), 48 deletions(-) diff --git a/docs/content.zh/docs/sql/functions/built-in-functions.md b/docs/content.zh/docs/sql/functions/built-in-functions.md index f931534ce6e00..4aaf786e860c9 100644 --- a/docs/content.zh/docs/sql/functions/built-in-functions.md +++ b/docs/content.zh/docs/sql/functions/built-in-functions.md @@ -124,6 +124,12 @@ JSON 函数使用符合 ISO/IEC TR 19075-6 SQL标准的 JSON 路径表达式。 ### 位图聚合函数 +**性能建议:** + +- 强烈建议开启 [MiniBatch 聚合]({{< ref "docs/dev/table/tuning" >}})或在[窗口聚合]({{< ref "docs/sql/reference/queries/window-agg" >}})中使用位图聚合函数,以优化状态访问开销、显著提升性能。 +- 位图聚合函数在处理仅追加(Append-Only)输入时性能最佳。处理回撤(Retraction)输入时性能会明显下降,因此应尽量避免对 BITMAP 列进行多级 GROUP BY 聚合。 +- 在仅需要基数统计而不需要中间位图的场景中,建议使用 `BITMAP_XX_CARDINALITY_AGG()` 替代 `BITMAP_CARDINALITY(BITMAP_XX_AGG())`。两者功能一致,但前者避免了中间位图的物化,性能更优。 + {{< sql_functions_zh "bitmapagg" >}} 时间间隔单位和时间点单位标识符 diff --git a/docs/content.zh/docs/sql/reference/data-types.md b/docs/content.zh/docs/sql/reference/data-types.md index c0566b13e5415..1cbc6f8bae63c 100644 --- a/docs/content.zh/docs/sql/reference/data-types.md +++ b/docs/content.zh/docs/sql/reference/data-types.md @@ -210,6 +210,7 @@ The default planner supports the following set of SQL types: | `RAW` | | | Structured types | Only exposed in user-defined functions yet. | | `VARIANT` | | +| `BITMAP` | | ### Character Strings @@ -1544,6 +1545,43 @@ DataTypes.VARIANT() {{< /tabs >}} +#### `BITMAP` + +用于以压缩形式存储 32 位整数的位图数据类型,基于 [RoaringBitmap](https://roaringbitmap.org/) 实现。 + +位图类型适用于高效地表示和查询大量整数集合。它支持多种内置的[标量函数]({{< ref "docs/sql/functions/built-in-functions" >}}#位图函数)和[聚合函数]({{< ref "docs/sql/functions/built-in-functions" >}}#位图聚合函数)。 + +位图类型是对 SQL 标准的扩展。 + +**声明** + +{{< tabs "0b9a98af-2e8d-4839-ba3a-964fa2ec0b97" >}} +{{< tab "SQL" >}} +```text +BITMAP +``` + +位图类型可以通过 `BITMAP_BUILD` 函数从 `ARRAY` 创建。例如: + +```sql +SELECT BITMAP_BUILD(ARRAY[1, 2, 3, 4, 5]) +``` + +{{< /tab >}} +{{< tab "Java/Scala" >}} +```java +DataTypes.BITMAP() +``` + +**桥接到 JVM 类型** + +| Java 类型 | 输入 | 输出 | 备注 | +|:-----------------------------------------------|:----:|:----:|:----------| +| `org.apache.flink.types.bitmap.Bitmap` | X | X | *默认* | + +{{< /tab >}} +{{< /tabs >}} + #### `RAW` Data type of an arbitrary serialized type. This type is a black box within the table ecosystem @@ -1668,30 +1706,31 @@ COALESCE(TRY_CAST('non-number' AS INT), 0) --- 结果返回数字 0 的 INT 格 下表展示了各个类型的转换程度,"Y" 表示支持,"!" 表示转换可能会失败,"N" 表示不支持: -| Input\Target | `CHAR`¹/
`VARCHAR`¹/
`STRING` | `BINARY`¹/
`VARBINARY`¹/
`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` | `SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` | `TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` | `ROW` | `STRUCTURED` | `RAW` | `VARIANT` | -|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:| -| `CHAR`/
`VARCHAR`/
`STRING` | Y | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | N | N | N | N | N | N | N | N | -| `BINARY`/
`VARBINARY`/
`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 | N | -| `DECIMAL` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | -| `TINYINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | -| `SMALLINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | -| `INTEGER` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁵ | N | N | N | N | N | N | N | -| `BIGINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁶ | N | N | N | N | N | N | N | -| `FLOAT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | -| `DOUBLE` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | -| `DATE` | Y | N | N | N | N | N | N | N | N | N | Y | N | Y | Y | N | N | N | N | N | N | 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 | -| `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 | -| `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 | -| `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 | -| `VARIANT` | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | +| Input\Target | `CHAR`¹/
`VARCHAR`¹/
`STRING` | `BINARY`¹/
`VARBINARY`¹/
`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` | `SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` | `TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` | `ROW` | `STRUCTURED` | `RAW` | `VARIANT` | `BITMAP` | +|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:|:--------:| +| `CHAR`/
`VARCHAR`/
`STRING` | Y | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | N | N | N | N | N | N | N | N | N | +| `BINARY`/
`VARBINARY`/
`BYTES` | Y | Y | N | 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 | N | N | +| `DECIMAL` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | +| `TINYINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | N | +| `SMALLINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | N | +| `INTEGER` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁵ | N | N | N | N | N | N | N | N | +| `BIGINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁶ | N | N | N | N | N | N | N | N | +| `FLOAT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | +| `DOUBLE` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | +| `DATE` | Y | N | N | N | N | N | N | N | N | N | Y | N | Y | Y | N | N | N | N | N | N | N | 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 | +| `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 | +| `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 | +| `VARIANT` | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | 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 | 备注: @@ -1701,6 +1740,7 @@ COALESCE(TRY_CAST('non-number' AS INT), 0) --- 结果返回数字 0 的 INT 格 4. 支持转换,当且仅当用使用 `RAW` 的类和类的序列化器一样。 5. 支持转换,当且仅当用使用 `INTERVAL` 做“月”到“年”的转换。 6. 支持转换,当且仅当用使用 `INTERVAL` 做“天”到“时间”的转换。 +7. 仅支持转换到无界的 `VARBINARY`(`BYTES`),因为裁剪或填充会破坏序列化的位图数据。 请注意:无论是 `CAST` 还是 `TRY_CAST`,当输入为 `NULL` ,输出也为 `NULL`。 diff --git a/docs/content/docs/sql/functions/built-in-functions.md b/docs/content/docs/sql/functions/built-in-functions.md index 3ba23b32f3394..42808103674bb 100644 --- a/docs/content/docs/sql/functions/built-in-functions.md +++ b/docs/content/docs/sql/functions/built-in-functions.md @@ -127,6 +127,12 @@ The aggregate functions take an expression across all the rows as the input and ### Bitmap Aggregate Functions +**Performance Tips:** + +- It is strongly recommended to enable [MiniBatch aggregation]({{< ref "docs/dev/table/tuning" >}}) or use bitmap aggregate functions within [window aggregations]({{< ref "docs/sql/reference/queries/window-agg" >}}) to optimize state access overhead and significantly improve performance. +- Bitmap aggregate functions perform best with append-only input. Performance degrades noticeably with retraction input, so avoid multi-level GROUP BY aggregations on BITMAP columns when possible. +- For cardinality-only scenarios where the intermediate bitmap is not needed, prefer `BITMAP_XX_CARDINALITY_AGG()` over `BITMAP_CARDINALITY(BITMAP_XX_AGG())`. They are functionally equivalent, but the former avoids materializing the intermediate bitmap and performs better. + {{< sql_functions "bitmapagg" >}} Time Interval and Point Unit Specifiers diff --git a/docs/content/docs/sql/reference/data-types.md b/docs/content/docs/sql/reference/data-types.md index 56d96e915a6e2..a849ee5dac8de 100644 --- a/docs/content/docs/sql/reference/data-types.md +++ b/docs/content/docs/sql/reference/data-types.md @@ -218,6 +218,7 @@ The default planner supports the following set of SQL types: | `RAW` | | | Structured types | Only exposed in user-defined functions yet. | | `VARIANT` | | +| `BITMAP` | | ### Character Strings @@ -1551,6 +1552,45 @@ DataTypes.VARIANT() {{< /tab >}} {{< /tabs >}} +#### `BITMAP` + +Data type of bitmap data that stores 32-bit integers in a compressed form using [RoaringBitmap](https://roaringbitmap.org/). + +The bitmap type is useful for efficiently representing and querying large sets of integers. It supports +a variety of built-in [scalar functions]({{< ref "docs/sql/functions/built-in-functions" >}}#bitmap-functions) and +[aggregate functions]({{< ref "docs/sql/functions/built-in-functions" >}}#bitmap-aggregate-functions). + +The bitmap type is an extension to the SQL standard. + +**Declaration** + +{{< tabs "c8a3f1e2-7d5b-4a9e-b6c0-1e2f3a4b5c6d" >}} +{{< tab "SQL" >}} +```text +BITMAP +``` + +Bitmap type can be created from an `ARRAY` using the `BITMAP_BUILD` function. For example: + +```sql +SELECT BITMAP_BUILD(ARRAY[1, 2, 3, 4, 5]) +``` + +{{< /tab >}} +{{< tab "Java/Scala" >}} +```java +DataTypes.BITMAP() +``` + +**Bridging to JVM Types** + +| Java Type | Input | Output | Remarks | +|:-----------------------------------------------|:-----:|:------:|:----------| +| `org.apache.flink.types.bitmap.Bitmap` | X | X | *Default* | + +{{< /tab >}} +{{< /tabs >}} + #### `RAW` Data type of an arbitrary serialized type. This type is a black box within the table ecosystem @@ -1675,30 +1715,31 @@ 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`¹/
`VARCHAR`¹/
`STRING` | `BINARY`¹/
`VARBINARY`¹/
`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` | `SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` | `TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` | `ROW` | `STRUCTURED` | `RAW` | `VARIANT` | -|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:| -| `CHAR`/
`VARCHAR`/
`STRING` | Y | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | N | N | N | N | N | N | N | N | -| `BINARY`/
`VARBINARY`/
`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 | N | -| `DECIMAL` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | -| `TINYINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | -| `SMALLINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | -| `INTEGER` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁵ | N | N | N | N | N | N | N | -| `BIGINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁶ | N | N | N | N | N | N | N | -| `FLOAT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | -| `DOUBLE` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | -| `DATE` | Y | N | N | N | N | N | N | N | N | N | Y | N | Y | Y | N | N | N | N | N | N | 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 | -| `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 | -| `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 | -| `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 | -| `VARIANT` | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | +| Input\Target | `CHAR`¹/
`VARCHAR`¹/
`STRING` | `BINARY`¹/
`VARBINARY`¹/
`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` | `SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` | `TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` | `ROW` | `STRUCTURED` | `RAW` | `VARIANT` | `BITMAP` | +|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|:---------:|:--------:| +| `CHAR`/
`VARCHAR`/
`STRING` | Y | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | ! | N | N | N | N | N | N | N | N | N | +| `BINARY`/
`VARBINARY`/
`BYTES` | Y | Y | N | 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 | N | N | +| `DECIMAL` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | +| `TINYINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | N | +| `SMALLINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | N | N | N | N | N | N | N | N | N | +| `INTEGER` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁵ | N | N | N | N | N | N | N | N | +| `BIGINT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N² | N² | Y⁶ | N | N | N | N | N | N | N | N | +| `FLOAT` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | +| `DOUBLE` | Y | N | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | +| `DATE` | Y | N | N | N | N | N | N | N | N | N | Y | N | Y | Y | N | N | N | N | N | N | N | 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 | +| `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 | +| `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 | +| `VARIANT` | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | 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 | Notes: @@ -1708,6 +1749,7 @@ Notes: 4. Supported iff the `RAW` class and serializer are equals. 5. Supported iff `INTERVAL` is a `MONTH TO YEAR` range. 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. Also note that a cast of a `NULL` value will always return `NULL`, regardless of whether the function used is `CAST` or `TRY_CAST`.