You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by gi...@apache.org on 2026/07/24 23:06:50 UTC

(datafusion-comet) branch asf-site updated: Publish built docs triggered by 376676c7abdd6588c5aec640fa06c8f251fbabb6

This is an automated email from the ASF dual-hosted git repository.

github-actions[bot] pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new ba421a58ed Publish built docs triggered by 376676c7abdd6588c5aec640fa06c8f251fbabb6
ba421a58ed is described below

commit ba421a58ed3103d352986c79e6573a6ca8de63f6
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Fri Jul 24 23:06:47 2026 +0000

    Publish built docs triggered by 376676c7abdd6588c5aec640fa06c8f251fbabb6
---
 .../adding_a_new_expression.md.txt                 |  21 +
 _sources/contributor-guide/release_process.md.txt  |   3 +-
 _sources/user-guide/latest/expressions.md.txt      | 981 +++++++++++----------
 contributor-guide/adding_a_new_expression.html     |  16 +
 contributor-guide/release_process.html             |   3 +-
 searchindex.js                                     |   2 +-
 user-guide/latest/expressions.html                 | 491 +++++++++++
 7 files changed, 1030 insertions(+), 487 deletions(-)

diff --git a/_sources/contributor-guide/adding_a_new_expression.md.txt b/_sources/contributor-guide/adding_a_new_expression.md.txt
index dcaf188b55..06454a19b6 100644
--- a/_sources/contributor-guide/adding_a_new_expression.md.txt
+++ b/_sources/contributor-guide/adding_a_new_expression.md.txt
@@ -258,6 +258,8 @@ In addition to `getSupportLevel`, which governs runtime planning decisions, the
 
 These methods do not affect runtime behavior. They are called by `GenerateDocs` (`spark/src/main/scala/org/apache/comet/GenerateDocs.scala`) when building the user-facing Compatibility Guide pages. The Markdown templates live in `docs/source/user-guide/latest/compatibility/expressions/_category_template/` (for example, `math.md`, `datetime.md`, `array.md`, `aggregate.md`, `struct.md`); `docs/build.sh` copies them into per-Spark-version subdirectories (`spark-3.4/`, `spark-3.5/`, `spark-4 [...]
 
+`GenerateDocs` also rewrites the **Implementation** column of every table in [`docs/source/user-guide/latest/expressions.md`](../user-guide/latest/expressions.md) based on the serde's trait mixins: `NativeOptInAvailable` (or its subtype `CodegenDispatchFallback`) is reported as `Hybrid`, a plain `CometCodegenDispatch` is reported as `Codegen dispatch`, and anything else is reported as `Native`. Rows whose function name is not registered in Spark's `FunctionRegistry` (or has no matching s [...]
+
 Key differences from `getSupportLevel`:
 
 - **No expression instance.** Both methods take no arguments, so they describe the expression in general rather than a specific call site. Use `getSupportLevel` for checks that depend on data types, argument values, or other per-instance details.
@@ -308,6 +310,25 @@ override def getUnsupportedReasons(): Seq[String] = Seq(
       .mkString("\n  - ", "\n  - ", ""))
 ```
 
+#### Updating the Supported Expressions Page
+
+The user-facing [Spark Expression Support](../user-guide/latest/expressions.md) page (`docs/source/user-guide/latest/expressions.md`) lists every Spark built-in with its status, implementation kind, and any notes. Unlike the compatibility pages, this file is committed to the repo, so you need to add a row for your new expression and commit it.
+
+Add the row to the correct category table (matching the section header, for example `## math_funcs`). Fill in the Function, Status, and Notes cells and leave the Implementation cell as `—`; the value is regenerated from the serde and does not need to be set by hand:
+
+```markdown
+| `myfunc` | ✅ | — | Some optional note |
+```
+
+To regenerate the Implementation column locally, run the `generate-docs` profile against any supported Spark version:
+
+```shell
+./mvnw -q -pl spark -am -Pspark-3.5 -Pgenerate-docs -DskipTests package \
+  -Dexec.arguments="$(pwd)/docs/source/user-guide/latest/,spark-3.5"
+```
+
+That run rewrites every Implementation cell in place, mapping SQL function names to Catalyst classes via Spark's `FunctionRegistry` and looking each class up in `QueryPlanSerde`. Commit the updated `expressions.md` alongside your serde change. If you forget, a reviewer or a subsequent doc regeneration will fill it in — an `—` in the column for a supported expression usually means the row is aliased or rewritten before Comet sees it (for example `to_date` → `Cast`), not that the row is broken.
+
 #### Adding Spark-side Tests for the New Expression
 
 It is important to verify that the new expression is correctly recognized by the native execution engine and matches the expected Spark behavior. The preferred way to add test coverage is to write a Comet SQL Test. This approach is simpler than writing Comet Scala Tests and makes it easy to cover many input combinations and edge cases.
diff --git a/_sources/contributor-guide/release_process.md.txt b/_sources/contributor-guide/release_process.md.txt
index 63bd77ef22..8de85a6b63 100644
--- a/_sources/contributor-guide/release_process.md.txt
+++ b/_sources/contributor-guide/release_process.md.txt
@@ -128,7 +128,8 @@ All release branches stay protected, including older ones, so released code cann
 
 The docs on `main` contain only template markers; CI fills them at publish time. A release branch instead
 commits the generated content so the archived docs for the release render real tables. Run the script to
-generate the config reference and the per-Spark-version compatibility pages and freeze them onto the branch:
+generate the config reference, refresh the Implementation column of the Spark Expression Support page, and
+produce the per-Spark-version compatibility pages, freezing them onto the branch:
 
 ```shell
 ./dev/generate-release-docs.sh
diff --git a/_sources/user-guide/latest/expressions.md.txt b/_sources/user-guide/latest/expressions.md.txt
index efbd33ba1c..31484d0512 100644
--- a/_sources/user-guide/latest/expressions.md.txt
+++ b/_sources/user-guide/latest/expressions.md.txt
@@ -46,6 +46,19 @@ Most expressions can also be disabled with `spark.comet.expression.EXPRNAME.enab
 | ✅ Supported | Comet produces Spark-compatible results by default. Some inputs or forms may fall back to Spark, and any incompatible behavior is opt-in (off by default). |
 | 🔜 Planned | Intended; tracked by an open issue or pull request. |
 
+## Implementation legend
+
+The **Implementation** column records how Comet executes each expression when it is not falling back to Spark:
+
+| Implementation | Meaning |
+| --- | --- |
+| Native | Comet's Rust engine evaluates the expression end to end. |
+| Codegen dispatch | Spark's own generated JVM code is evaluated inside the Comet pipeline. Used when a byte-exact match to Spark matters more than the native speedup, or when no native path exists. |
+| Hybrid | Both paths exist. Comet picks between them based on input, and the user can override with `spark.comet.expression.EXPRNAME.allowIncompatible=true` — see [Native and codegen-dispatch implementations](compatibility/index.md#native-and-codegen-dispatch-implementations). |
+| — | No direct wire-up: the row is either planned, is rewritten to another expression before Comet sees it (for example `to_date` → `Cast`), or is handled at the operator level rather than the expression level (for example `explode`, window functions). |
+
+The Implementation column is auto-generated from the serde definitions in `QueryPlanSerde`; do not edit it by hand.
+
 ## Not currently planned
 
 Comet focuses acceleration on mainstream relational, string, datetime, math, and collection
@@ -66,147 +79,147 @@ The tables below list every Spark built-in expression with its current status.
 
 ## agg_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `any` | ✅ |  |
-| `any_value` | ✅ |  |
-| `approx_count_distinct` | ✅ |  |
-| `approx_percentile` | ✅ | Byte, short, int, long, float, and double input; other input types fall back to Spark |
-| `array_agg` | ✅ | Alias for `collect_list` |
-| `avg` | ✅ | Interval types fall back |
-| `bit_and` | ✅ |  |
-| `bit_or` | ✅ |  |
-| `bit_xor` | ✅ |  |
-| `bool_and` | ✅ |  |
-| `bool_or` | ✅ |  |
-| `collect_list` | ✅ |  |
-| `collect_set` | ✅ |  |
-| `corr` | ✅ |  |
-| `count` | ✅ |  |
-| `count_if` | ✅ |  |
-| `covar_pop` | ✅ |  |
-| `covar_samp` | ✅ |  |
-| `every` | ✅ |  |
-| `first` | ✅ |  |
-| `first_value` | ✅ |  |
-| `grouping` | ✅ | Grouping indicator for ROLLUP/CUBE/GROUPING SETS |
-| `grouping_id` | ✅ | Grouping indicator for ROLLUP/CUBE/GROUPING SETS |
-| `kurtosis` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `last` | ✅ |  |
-| `last_value` | ✅ |  |
-| `listagg` | 🔜 | String aggregation |
-| `max` | ✅ |  |
-| `max_by` | 🔜 | [#3841](https://github.com/apache/datafusion-comet/issues/3841) |
-| `mean` | ✅ |  |
-| `median` | ✅ | Rewrites to `percentile(col, 0.5)` and runs natively for supported percentile inputs |
-| `min` | ✅ |  |
-| `min_by` | 🔜 | [#3841](https://github.com/apache/datafusion-comet/issues/3841) |
-| `mode` | 🔜 | [#3970](https://github.com/apache/datafusion-comet/issues/3970) |
-| `percentile` | ✅ | Single literal percentage on numeric input runs natively; array of percentages and a frequency argument fall back to Spark |
-| `percentile_cont` | ✅ | Spark 4.0+ `WITHIN GROUP (ORDER BY ...)`; ascending only runs natively, `DESC` falls back to Spark |
-| `percentile_disc` | 🔜 | Percentile aggregate |
-| `regr_avgx` | ✅ | Native: Spark rewrites to `Average` (tests in [#4551](https://github.com/apache/datafusion-comet/issues/4551)) |
-| `regr_avgy` | ✅ | Native: Spark rewrites to `Average` (tests in [#4551](https://github.com/apache/datafusion-comet/issues/4551)) |
-| `regr_count` | ✅ | Native: Spark rewrites to `Count` (tests in [#4551](https://github.com/apache/datafusion-comet/issues/4551)) |
-| `regr_intercept` | 🔜 | Falls back; can reuse `covar_pop`/`var_pop` accumulators ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
-| `regr_r2` | 🔜 | Falls back; can reuse the `corr` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
-| `regr_slope` | 🔜 | Falls back; can reuse `covar_pop`/`var_pop` accumulators ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
-| `regr_sxx` | 🔜 | Falls back; can reuse `var_pop` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
-| `regr_sxy` | 🔜 | Falls back; can reuse `covar_pop` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
-| `regr_syy` | 🔜 | Falls back; can reuse `var_pop` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
-| `skewness` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `some` | ✅ |  |
-| `std` | ✅ |  |
-| `stddev` | ✅ |  |
-| `stddev_pop` | ✅ |  |
-| `stddev_samp` | ✅ |  |
-| `string_agg` | 🔜 | String aggregation (alias of `listagg`) |
-| `sum` | ✅ |  |
-| `try_avg` | ✅ | Interval types fall back |
-| `try_sum` | ✅ |  |
-| `var_pop` | ✅ |  |
-| `var_samp` | ✅ |  |
-| `variance` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `any` | ✅ | — |  |
+| `any_value` | ✅ | — |  |
+| `approx_count_distinct` | ✅ | Native |  |
+| `approx_percentile` | ✅ | Native | Byte, short, int, long, float, and double input; other input types fall back to Spark |
+| `array_agg` | ✅ | Native | Alias for `collect_list` |
+| `avg` | ✅ | Native | Interval types fall back |
+| `bit_and` | ✅ | Native |  |
+| `bit_or` | ✅ | Native |  |
+| `bit_xor` | ✅ | Native |  |
+| `bool_and` | ✅ | — |  |
+| `bool_or` | ✅ | — |  |
+| `collect_list` | ✅ | Native |  |
+| `collect_set` | ✅ | Native |  |
+| `corr` | ✅ | Native |  |
+| `count` | ✅ | Native |  |
+| `count_if` | ✅ | — |  |
+| `covar_pop` | ✅ | Native |  |
+| `covar_samp` | ✅ | Native |  |
+| `every` | ✅ | — |  |
+| `first` | ✅ | Native |  |
+| `first_value` | ✅ | Native |  |
+| `grouping` | ✅ | — | Grouping indicator for ROLLUP/CUBE/GROUPING SETS |
+| `grouping_id` | ✅ | — | Grouping indicator for ROLLUP/CUBE/GROUPING SETS |
+| `kurtosis` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `last` | ✅ | Native |  |
+| `last_value` | ✅ | Native |  |
+| `listagg` | 🔜 | — | String aggregation |
+| `max` | ✅ | Native |  |
+| `max_by` | 🔜 | — | [#3841](https://github.com/apache/datafusion-comet/issues/3841) |
+| `mean` | ✅ | Native |  |
+| `median` | ✅ | — | Rewrites to `percentile(col, 0.5)` and runs natively for supported percentile inputs |
+| `min` | ✅ | Native |  |
+| `min_by` | 🔜 | — | [#3841](https://github.com/apache/datafusion-comet/issues/3841) |
+| `mode` | 🔜 | — | [#3970](https://github.com/apache/datafusion-comet/issues/3970) |
+| `percentile` | ✅ | Native | Single literal percentage on numeric input runs natively; array of percentages and a frequency argument fall back to Spark |
+| `percentile_cont` | ✅ | — | Spark 4.0+ `WITHIN GROUP (ORDER BY ...)`; ascending only runs natively, `DESC` falls back to Spark |
+| `percentile_disc` | 🔜 | — | Percentile aggregate |
+| `regr_avgx` | ✅ | — | Native: Spark rewrites to `Average` (tests in [#4551](https://github.com/apache/datafusion-comet/issues/4551)) |
+| `regr_avgy` | ✅ | — | Native: Spark rewrites to `Average` (tests in [#4551](https://github.com/apache/datafusion-comet/issues/4551)) |
+| `regr_count` | ✅ | — | Native: Spark rewrites to `Count` (tests in [#4551](https://github.com/apache/datafusion-comet/issues/4551)) |
+| `regr_intercept` | 🔜 | — | Falls back; can reuse `covar_pop`/`var_pop` accumulators ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
+| `regr_r2` | 🔜 | — | Falls back; can reuse the `corr` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
+| `regr_slope` | 🔜 | — | Falls back; can reuse `covar_pop`/`var_pop` accumulators ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
+| `regr_sxx` | 🔜 | — | Falls back; can reuse `var_pop` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
+| `regr_sxy` | 🔜 | — | Falls back; can reuse `covar_pop` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
+| `regr_syy` | 🔜 | — | Falls back; can reuse `var_pop` accumulator ([#4552](https://github.com/apache/datafusion-comet/issues/4552)) |
+| `skewness` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `some` | ✅ | — |  |
+| `std` | ✅ | Native |  |
+| `stddev` | ✅ | Native |  |
+| `stddev_pop` | ✅ | Native |  |
+| `stddev_samp` | ✅ | Native |  |
+| `string_agg` | 🔜 | — | String aggregation (alias of `listagg`) |
+| `sum` | ✅ | Native |  |
+| `try_avg` | ✅ | — | Interval types fall back |
+| `try_sum` | ✅ | — |  |
+| `var_pop` | ✅ | Native |  |
+| `var_samp` | ✅ | Native |  |
+| `variance` | ✅ | Native |  |
 
 ---
 
 ## array_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `array` | ✅ |  |
-| `array_append` | ✅ |  |
-| `array_compact` | ✅ |  |
-| `array_contains` | ✅ | NaN/signed-zero handling may differ ([details](compatibility/floating-point.md)) |
-| `array_distinct` | ✅ | NaN/signed-zero handling may differ ([details](compatibility/floating-point.md)) |
-| `array_except` | ✅ | Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible ([details](compatibility/expressions/array.md)) |
-| `array_insert` | ✅ |  |
-| `array_intersect` | ✅ | Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible ([details](compatibility/expressions/array.md)) |
-| `array_join` | ✅ | Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible ([details](compatibility/expressions/array.md)) |
-| `array_max` | ✅ | NaN ordering may differ ([details](compatibility/floating-point.md)) |
-| `array_min` | ✅ | NaN ordering may differ ([details](compatibility/floating-point.md)) |
-| `array_position` | ✅ | Binary/struct/map/null elements fall back |
-| `array_prepend` | ✅ |  |
-| `array_remove` | ✅ |  |
-| `array_repeat` | ✅ |  |
-| `array_union` | ✅ | NaN/signed-zero handling may differ ([details](compatibility/floating-point.md)) |
-| `arrays_overlap` | ✅ |  |
-| `arrays_zip` | ✅ |  |
-| `element_at` | ✅ |  |
-| `flatten` | ✅ | Binary/struct/map elements fall back |
-| `get` | ✅ |  |
-| `sequence` | ✅ |  |
-| `shuffle` | ✅ | Binary/struct/map elements fall back |
-| `slice` | ✅ | Native ([#4149](https://github.com/apache/datafusion-comet/issues/4149)) |
-| `sort_array` | ✅ | Nested struct/null arrays fall back |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `array` | ✅ | Native |  |
+| `array_append` | ✅ | Native |  |
+| `array_compact` | ✅ | — |  |
+| `array_contains` | ✅ | Native | NaN/signed-zero handling may differ ([details](compatibility/floating-point.md)) |
+| `array_distinct` | ✅ | Native | NaN/signed-zero handling may differ ([details](compatibility/floating-point.md)) |
+| `array_except` | ✅ | Hybrid | Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible ([details](compatibility/expressions/array.md)) |
+| `array_insert` | ✅ | Native |  |
+| `array_intersect` | ✅ | Hybrid | Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible ([details](compatibility/expressions/array.md)) |
+| `array_join` | ✅ | Hybrid | Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible ([details](compatibility/expressions/array.md)) |
+| `array_max` | ✅ | Native | NaN ordering may differ ([details](compatibility/floating-point.md)) |
+| `array_min` | ✅ | Native | NaN ordering may differ ([details](compatibility/floating-point.md)) |
+| `array_position` | ✅ | Native | Binary/struct/map/null elements fall back |
+| `array_prepend` | ✅ | — |  |
+| `array_remove` | ✅ | Native |  |
+| `array_repeat` | ✅ | Native |  |
+| `array_union` | ✅ | Native | NaN/signed-zero handling may differ ([details](compatibility/floating-point.md)) |
+| `arrays_overlap` | ✅ | Native |  |
+| `arrays_zip` | ✅ | Native |  |
+| `element_at` | ✅ | Native |  |
+| `flatten` | ✅ | Native | Binary/struct/map elements fall back |
+| `get` | ✅ | — |  |
+| `sequence` | ✅ | Codegen dispatch |  |
+| `shuffle` | ✅ | Native | Binary/struct/map elements fall back |
+| `slice` | ✅ | Native | Native ([#4149](https://github.com/apache/datafusion-comet/issues/4149)) |
+| `sort_array` | ✅ | Hybrid | Nested struct/null arrays fall back |
 
 ---
 
 ## bitwise_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `&` | ✅ |  |
-| `<<` | ✅ |  |
-| `>>` | ✅ |  |
-| `>>>` | ✅ | Operator alias for `shiftrightunsigned` (Spark 4.0+) |
-| `^` | ✅ |  |
-| `bit_count` | ✅ |  |
-| `bit_get` | ✅ |  |
-| `getbit` | ✅ |  |
-| `shiftright` | ✅ |  |
-| `shiftrightunsigned` | ✅ |  |
-| `\|` | ✅ |  |
-| `~` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `&` | ✅ | Native |  |
+| `<<` | ✅ | Native |  |
+| `>>` | ✅ | Native |  |
+| `>>>` | ✅ | Native | Operator alias for `shiftrightunsigned` (Spark 4.0+) |
+| `^` | ✅ | Native |  |
+| `bit_count` | ✅ | Native |  |
+| `bit_get` | ✅ | Native |  |
+| `getbit` | ✅ | Native |  |
+| `shiftright` | ✅ | Native |  |
+| `shiftrightunsigned` | ✅ | Native |  |
+| `\|` | ✅ | Native |  |
+| `~` | ✅ | Native |  |
 
 ---
 
 ## collection_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `array_size` | ✅ |  |
-| `cardinality` | ✅ |  |
-| `concat` | ✅ | Binary/array children fall back |
-| `reverse` | ✅ | Binary-element arrays fall back (Incompatible) ([details](compatibility/expressions/array.md)) |
-| `size` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `array_size` | ✅ | — |  |
+| `cardinality` | ✅ | Native |  |
+| `concat` | ✅ | Hybrid | Binary/array children fall back |
+| `reverse` | ✅ | Hybrid | Binary-element arrays fall back (Incompatible) ([details](compatibility/expressions/array.md)) |
+| `size` | ✅ | Native |  |
 
 ---
 
 ## conditional_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `coalesce` | ✅ |  |
-| `if` | ✅ |  |
-| `ifnull` | ✅ |  |
-| `nanvl` | ✅ |  |
-| `nullif` | ✅ |  |
-| `nullifzero` | ✅ | Lowers to `if`/`=` (Spark 4.0+) |
-| `nvl` | ✅ |  |
-| `nvl2` | ✅ |  |
-| `when` | ✅ |  |
-| `zeroifnull` | ✅ | Lowers to `coalesce` (Spark 4.0+) |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `coalesce` | ✅ | Native |  |
+| `if` | ✅ | Native |  |
+| `ifnull` | ✅ | — |  |
+| `nanvl` | ✅ | Codegen dispatch |  |
+| `nullif` | ✅ | — |  |
+| `nullifzero` | ✅ | — | Lowers to `if`/`=` (Spark 4.0+) |
+| `nvl` | ✅ | — |  |
+| `nvl2` | ✅ | — |  |
+| `when` | ✅ | Native |  |
+| `zeroifnull` | ✅ | — | Lowers to `coalesce` (Spark 4.0+) |
 
 ---
 
@@ -214,99 +227,99 @@ The tables below list every Spark built-in expression with its current status.
 
 The type-name conversion functions (`bigint`, `binary`, `boolean`, `date`, `decimal`, `double`, `float`, `int`, `smallint`, `string`, `timestamp`, `tinyint`) are SQL aliases for `CAST(... AS <type>)` and share the support and caveats of `cast`.
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `cast` | ✅ | Some casts fall back; float-to-decimal is opt-in ([details](compatibility/expressions/cast.md)) |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `cast` | ✅ | Native | Some casts fall back; float-to-decimal is opt-in ([details](compatibility/expressions/cast.md)) |
 
 ---
 
 ## csv_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `from_csv` | ✅ |  |
-| `schema_of_csv` | ✅ |  |
-| `to_csv` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `from_csv` | ✅ | Codegen dispatch |  |
+| `schema_of_csv` | ✅ | Codegen dispatch |  |
+| `to_csv` | ✅ | Native |  |
 
 ---
 
 ## datetime_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `add_months` | ✅ |  |
-| `convert_timezone` | ✅ | Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible ([details](compatibility/expressions/datetime.md)) |
-| `curdate` | ✅ | Constant-folded to a literal (alias of `current_date`) |
-| `current_date` | ✅ | Constant-folded to a literal before Comet sees the plan |
-| `current_time` | 🔜 | Blocked on Spark 4.1 TIME type support ([#4288](https://github.com/apache/datafusion-comet/issues/4288)) |
-| `current_timestamp` | ✅ | Constant-folded to a literal before Comet sees the plan |
-| `current_timezone` | ✅ |  |
-| `date_add` | ✅ |  |
-| `date_diff` | ✅ |  |
-| `date_format` | ✅ |  |
-| `date_from_unix_date` | ✅ |  |
-| `date_part` | ✅ |  |
-| `date_sub` | ✅ |  |
-| `date_trunc` | ✅ |  |
-| `dateadd` | ✅ |  |
-| `datediff` | ✅ |  |
-| `datepart` | ✅ |  |
-| `day` | ✅ |  |
-| `dayname` | ✅ | Abbreviated day name (Spark 4.0+) |
-| `dayofmonth` | ✅ |  |
-| `dayofweek` | ✅ |  |
-| `dayofyear` | ✅ |  |
-| `extract` | ✅ |  |
-| `from_unixtime` | ✅ |  |
-| `from_utc_timestamp` | ✅ | Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible ([details](compatibility/expressions/datetime.md)) |
-| `hour` | ✅ |  |
-| `last_day` | ✅ |  |
-| `localtimestamp` | ✅ |  |
-| `make_date` | ✅ |  |
-| `make_dt_interval` | ✅ |  |
-| `make_interval` | 🔜 | Produces legacy CalendarInterval; tracked by [#4540](https://github.com/apache/datafusion-comet/issues/4540) |
-| `make_time` | 🔜 | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
-| `make_timestamp` | ✅ |  |
-| `make_timestamp_ltz` | ✅ | 2-arg TIME form falls back |
-| `make_timestamp_ntz` | ✅ | 2-arg TIME form falls back |
-| `make_ym_interval` | ✅ |  |
-| `minute` | ✅ |  |
-| `month` | ✅ |  |
-| `monthname` | ✅ | Abbreviated month name (Spark 4.0+) |
-| `months_between` | ✅ |  |
-| `next_day` | ✅ |  |
-| `now` | ✅ | Constant-folded to a literal (alias of `current_timestamp`) |
-| `quarter` | ✅ |  |
-| `second` | ✅ |  |
-| `session_window` | 🔜 | Batch session-window grouping falls back (`UpdatingSessionsExec` is not yet native); tracked by [#4785](https://github.com/apache/datafusion-comet/issues/4785) |
-| `time_diff` | 🔜 | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
-| `time_trunc` | 🔜 | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
-| `timestamp_micros` | ✅ |  |
-| `timestamp_millis` | ✅ |  |
-| `timestamp_seconds` | ✅ |  |
-| `to_date` | ✅ | Rewrites to `Cast` (or `Cast(GetTimestamp)` with a format) before Comet sees the plan |
-| `to_time` | 🔜 | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
-| `to_timestamp` | ✅ | Rewrites to `Cast` (or `GetTimestamp` with a format) before Comet sees the plan |
-| `to_timestamp_ltz` | ✅ | Rewrites to `to_timestamp` (`TimestampType`) |
-| `to_timestamp_ntz` | ✅ | Rewrites to `to_timestamp` (`TimestampNTZType`) |
-| `to_unix_timestamp` | ✅ |  |
-| `to_utc_timestamp` | ✅ | Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible ([details](compatibility/expressions/datetime.md)) |
-| `trunc` | ✅ |  |
-| `try_make_interval` | 🔜 | Produces legacy CalendarInterval; tracked by [#4540](https://github.com/apache/datafusion-comet/issues/4540) |
-| `try_make_timestamp` | ✅ |  |
-| `try_to_date` | ✅ | Rewrites to `Cast`/`GetTimestamp` before Comet sees the plan; same support as `to_date` |
-| `try_to_time` | 🔜 | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
-| `try_to_timestamp` | ✅ | Rewrites to `Cast`/`GetTimestamp` before Comet sees the plan; same support as `to_timestamp` |
-| `unix_date` | ✅ |  |
-| `unix_micros` | ✅ |  |
-| `unix_millis` | ✅ |  |
-| `unix_seconds` | ✅ |  |
-| `unix_timestamp` | ✅ |  |
-| `weekday` | ✅ |  |
-| `weekofyear` | ✅ |  |
-| `window` | ✅ | Batch tumbling and sliding time-window grouping runs natively |
-| `window_time` | ✅ | Batch time-window grouping runs natively |
-| `year` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `add_months` | ✅ | Codegen dispatch |  |
+| `convert_timezone` | ✅ | Hybrid | Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible ([details](compatibility/expressions/datetime.md)) |
+| `curdate` | ✅ | — | Constant-folded to a literal (alias of `current_date`) |
+| `current_date` | ✅ | — | Constant-folded to a literal before Comet sees the plan |
+| `current_time` | 🔜 | — | Blocked on Spark 4.1 TIME type support ([#4288](https://github.com/apache/datafusion-comet/issues/4288)) |
+| `current_timestamp` | ✅ | — | Constant-folded to a literal before Comet sees the plan |
+| `current_timezone` | ✅ | — |  |
+| `date_add` | ✅ | Native |  |
+| `date_diff` | ✅ | Native |  |
+| `date_format` | ✅ | Hybrid |  |
+| `date_from_unix_date` | ✅ | Native |  |
+| `date_part` | ✅ | — |  |
+| `date_sub` | ✅ | Native |  |
+| `date_trunc` | ✅ | Hybrid |  |
+| `dateadd` | ✅ | Native |  |
+| `datediff` | ✅ | Native |  |
+| `datepart` | ✅ | — |  |
+| `day` | ✅ | Native |  |
+| `dayname` | ✅ | — | Abbreviated day name (Spark 4.0+) |
+| `dayofmonth` | ✅ | Native |  |
+| `dayofweek` | ✅ | Native |  |
+| `dayofyear` | ✅ | Native |  |
+| `extract` | ✅ | — |  |
+| `from_unixtime` | ✅ | Hybrid |  |
+| `from_utc_timestamp` | ✅ | Hybrid | Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible ([details](compatibility/expressions/datetime.md)) |
+| `hour` | ✅ | — |  |
+| `last_day` | ✅ | Native |  |
+| `localtimestamp` | ✅ | — |  |
+| `make_date` | ✅ | Native |  |
+| `make_dt_interval` | ✅ | Codegen dispatch |  |
+| `make_interval` | 🔜 | — | Produces legacy CalendarInterval; tracked by [#4540](https://github.com/apache/datafusion-comet/issues/4540) |
+| `make_time` | 🔜 | — | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
+| `make_timestamp` | ✅ | — |  |
+| `make_timestamp_ltz` | ✅ | — | 2-arg TIME form falls back |
+| `make_timestamp_ntz` | ✅ | — | 2-arg TIME form falls back |
+| `make_ym_interval` | ✅ | Codegen dispatch |  |
+| `minute` | ✅ | — |  |
+| `month` | ✅ | Native |  |
+| `monthname` | ✅ | — | Abbreviated month name (Spark 4.0+) |
+| `months_between` | ✅ | Codegen dispatch |  |
+| `next_day` | ✅ | Native |  |
+| `now` | ✅ | — | Constant-folded to a literal (alias of `current_timestamp`) |
+| `quarter` | ✅ | Native |  |
+| `second` | ✅ | — |  |
+| `session_window` | 🔜 | — | Batch session-window grouping falls back (`UpdatingSessionsExec` is not yet native); tracked by [#4785](https://github.com/apache/datafusion-comet/issues/4785) |
+| `time_diff` | 🔜 | — | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
+| `time_trunc` | 🔜 | — | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
+| `timestamp_micros` | ✅ | Codegen dispatch |  |
+| `timestamp_millis` | ✅ | Codegen dispatch |  |
+| `timestamp_seconds` | ✅ | Native |  |
+| `to_date` | ✅ | — | Rewrites to `Cast` (or `Cast(GetTimestamp)` with a format) before Comet sees the plan |
+| `to_time` | 🔜 | — | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
+| `to_timestamp` | ✅ | — | Rewrites to `Cast` (or `GetTimestamp` with a format) before Comet sees the plan |
+| `to_timestamp_ltz` | ✅ | — | Rewrites to `to_timestamp` (`TimestampType`) |
+| `to_timestamp_ntz` | ✅ | — | Rewrites to `to_timestamp` (`TimestampNTZType`) |
+| `to_unix_timestamp` | ✅ | Hybrid |  |
+| `to_utc_timestamp` | ✅ | Hybrid | Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible ([details](compatibility/expressions/datetime.md)) |
+| `trunc` | ✅ | Hybrid |  |
+| `try_make_interval` | 🔜 | — | Produces legacy CalendarInterval; tracked by [#4540](https://github.com/apache/datafusion-comet/issues/4540) |
+| `try_make_timestamp` | ✅ | — |  |
+| `try_to_date` | ✅ | — | Rewrites to `Cast`/`GetTimestamp` before Comet sees the plan; same support as `to_date` |
+| `try_to_time` | 🔜 | — | Spark 4.1 TIME type; tracked by [#4288](https://github.com/apache/datafusion-comet/issues/4288) |
+| `try_to_timestamp` | ✅ | — | Rewrites to `Cast`/`GetTimestamp` before Comet sees the plan; same support as `to_timestamp` |
+| `unix_date` | ✅ | Native |  |
+| `unix_micros` | ✅ | Codegen dispatch |  |
+| `unix_millis` | ✅ | Codegen dispatch |  |
+| `unix_seconds` | ✅ | Codegen dispatch |  |
+| `unix_timestamp` | ✅ | Native |  |
+| `weekday` | ✅ | Native |  |
+| `weekofyear` | ✅ | Native |  |
+| `window` | ✅ | — | Batch tumbling and sliding time-window grouping runs natively |
+| `window_time` | ✅ | — | Batch time-window grouping runs natively |
+| `year` | ✅ | Native |  |
 
 ---
 
@@ -316,311 +329,311 @@ The type-name conversion functions (`bigint`, `binary`, `boolean`, `date`, `deci
 expression-level). The `outer` variants are wired but marked `Incompatible`; they require
 `spark.comet.exec.explode.enabled=true` and `allowIncompatible`.
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `explode` | ✅ | via `CometExplodeExec` |
-| `explode_outer` | ✅ | outer=true falls back (Incompatible) ([audit](../../contributor-guide/expression-audits/generator_funcs.md#explode_outer)) |
-| `inline` | 🔜 | Operator-level generator (like `explode`) |
-| `inline_outer` | 🔜 | Operator-level generator (like `explode`) |
-| `posexplode` | ✅ | via `CometExplodeExec` |
-| `posexplode_outer` | ✅ | outer=true falls back (Incompatible) ([audit](../../contributor-guide/expression-audits/generator_funcs.md#posexplode_outer)) |
-| `stack` | 🔜 | Operator-level generator |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `explode` | ✅ | — | via `CometExplodeExec` |
+| `explode_outer` | ✅ | — | outer=true falls back (Incompatible) ([audit](../../contributor-guide/expression-audits/generator_funcs.md#explode_outer)) |
+| `inline` | 🔜 | — | Operator-level generator (like `explode`) |
+| `inline_outer` | 🔜 | — | Operator-level generator (like `explode`) |
+| `posexplode` | ✅ | — | via `CometExplodeExec` |
+| `posexplode_outer` | ✅ | — | outer=true falls back (Incompatible) ([audit](../../contributor-guide/expression-audits/generator_funcs.md#posexplode_outer)) |
+| `stack` | 🔜 | — | Operator-level generator |
 
 ---
 
 ## hash_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `crc32` | ✅ |  |
-| `hash` | ✅ |  |
-| `md5` | ✅ |  |
-| `sha` | ✅ |  |
-| `sha1` | ✅ |  |
-| `sha2` | ✅ |  |
-| `xxhash64` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `crc32` | ✅ | Native |  |
+| `hash` | ✅ | Native |  |
+| `md5` | ✅ | Native |  |
+| `sha` | ✅ | Native |  |
+| `sha1` | ✅ | Native |  |
+| `sha2` | ✅ | Native |  |
+| `xxhash64` | ✅ | Native |  |
 
 ---
 
 ## json_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `from_json` | ✅ | Falls back by default; opt-in via allowIncompatible ([audit](../../contributor-guide/expression-audits/json_funcs.md#from_json)) |
-| `get_json_object` | ✅ | Some inputs need allowIncompatible ([audit](../../contributor-guide/expression-audits/json_funcs.md#get_json_object)) |
-| `json_array_length` | ✅ | Single-quoted/trailing JSON needs allowIncompatible ([audit](../../contributor-guide/expression-audits/json_funcs.md#json_array_length)) |
-| `json_object_keys` | ✅ |  |
-| `json_tuple` | 🔜 | [#3160](https://github.com/apache/datafusion-comet/issues/3160) |
-| `schema_of_json` | ✅ |  |
-| `to_json` | ✅ | Options and map/array inputs fall back ([audit](../../contributor-guide/expression-audits/json_funcs.md#to_json)) |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `from_json` | ✅ | Hybrid | Falls back by default; opt-in via allowIncompatible ([audit](../../contributor-guide/expression-audits/json_funcs.md#from_json)) |
+| `get_json_object` | ✅ | Hybrid | Some inputs need allowIncompatible ([audit](../../contributor-guide/expression-audits/json_funcs.md#get_json_object)) |
+| `json_array_length` | ✅ | Hybrid | Single-quoted/trailing JSON needs allowIncompatible ([audit](../../contributor-guide/expression-audits/json_funcs.md#json_array_length)) |
+| `json_object_keys` | ✅ | Codegen dispatch |  |
+| `json_tuple` | 🔜 | — | [#3160](https://github.com/apache/datafusion-comet/issues/3160) |
+| `schema_of_json` | ✅ | Codegen dispatch |  |
+| `to_json` | ✅ | Hybrid | Options and map/array inputs fall back ([audit](../../contributor-guide/expression-audits/json_funcs.md#to_json)) |
 
 ---
 
 ## lambda_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `aggregate` | ✅ |  |
-| `array_sort` | ✅ |  |
-| `exists` | ✅ |  |
-| `filter` | ✅ | General lambda routed through the JVM codegen dispatcher; the `array_compact` form runs natively |
-| `forall` | ✅ |  |
-| `map_filter` | ✅ |  |
-| `map_zip_with` | ✅ |  |
-| `reduce` | ✅ |  |
-| `transform` | ✅ |  |
-| `transform_keys` | ✅ |  |
-| `transform_values` | ✅ |  |
-| `zip_with` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `aggregate` | ✅ | Codegen dispatch |  |
+| `array_sort` | ✅ | Codegen dispatch |  |
+| `exists` | ✅ | Codegen dispatch |  |
+| `filter` | ✅ | Native | General lambda routed through the JVM codegen dispatcher; the `array_compact` form runs natively |
+| `forall` | ✅ | Codegen dispatch |  |
+| `map_filter` | ✅ | Codegen dispatch |  |
+| `map_zip_with` | ✅ | Codegen dispatch |  |
+| `reduce` | ✅ | Codegen dispatch |  |
+| `transform` | ✅ | Codegen dispatch |  |
+| `transform_keys` | ✅ | Codegen dispatch |  |
+| `transform_values` | ✅ | Codegen dispatch |  |
+| `zip_with` | ✅ | Codegen dispatch |  |
 
 ---
 
 ## map_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `element_at` | ✅ |  |
-| `map` | ✅ | Routed through the JVM codegen dispatcher |
-| `map_concat` | ✅ |  |
-| `map_contains_key` | ✅ |  |
-| `map_entries` | ✅ |  |
-| `map_from_arrays` | ✅ |  |
-| `map_from_entries` | ✅ | BinaryType key/value falls back (Incompatible) ([details](compatibility/expressions/map.md)) |
-| `map_keys` | ✅ |  |
-| `map_values` | ✅ |  |
-| `str_to_map` | ✅ |  |
-| `try_element_at` | ✅ | Lowers to `element_at` |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `element_at` | ✅ | Native |  |
+| `map` | ✅ | Codegen dispatch | Routed through the JVM codegen dispatcher |
+| `map_concat` | ✅ | Codegen dispatch |  |
+| `map_contains_key` | ✅ | — |  |
+| `map_entries` | ✅ | Native |  |
+| `map_from_arrays` | ✅ | Native |  |
+| `map_from_entries` | ✅ | Hybrid | BinaryType key/value falls back (Incompatible) ([details](compatibility/expressions/map.md)) |
+| `map_keys` | ✅ | Native |  |
+| `map_values` | ✅ | Native |  |
+| `str_to_map` | ✅ | Hybrid |  |
+| `try_element_at` | ✅ | — | Lowers to `element_at` |
 
 ---
 
 ## math_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `%` | ✅ |  |
-| `*` | ✅ | Interval multiplication falls back |
-| `+` | ✅ |  |
-| `-` | ✅ |  |
-| `/` | ✅ |  |
-| `abs` | ✅ | Interval types fall back |
-| `acos` | ✅ |  |
-| `acosh` | ✅ |  |
-| `asin` | ✅ |  |
-| `asinh` | ✅ |  |
-| `atan` | ✅ |  |
-| `atan2` | ✅ |  |
-| `atanh` | ✅ |  |
-| `bin` | ✅ |  |
-| `bround` | ✅ |  |
-| `cbrt` | ✅ |  |
-| `ceil` | ✅ | Two-arg form falls back |
-| `ceiling` | ✅ |  |
-| `conv` | ✅ |  |
-| `cos` | ✅ |  |
-| `cosh` | ✅ |  |
-| `cot` | ✅ |  |
-| `csc` | ✅ |  |
-| `degrees` | ✅ |  |
-| `div` | ✅ |  |
-| `e` | ✅ | Folds to a literal (like `pi`) |
-| `exp` | ✅ |  |
-| `expm1` | ✅ |  |
-| `factorial` | ✅ |  |
-| `floor` | ✅ | Two-arg form falls back |
-| `greatest` | ✅ |  |
-| `hex` | ✅ |  |
-| `hypot` | ✅ |  |
-| `least` | ✅ |  |
-| `ln` | ✅ |  |
-| `log` | ✅ |  |
-| `log10` | ✅ |  |
-| `log1p` | ✅ |  |
-| `log2` | ✅ |  |
-| `mod` | ✅ |  |
-| `negative` | ✅ |  |
-| `pi` | ✅ |  |
-| `pmod` | ✅ |  |
-| `positive` | ✅ |  |
-| `pow` | ✅ |  |
-| `power` | ✅ |  |
-| `radians` | ✅ |  |
-| `rand` | ✅ |  |
-| `randn` | ✅ |  |
-| `random` | ✅ | Alias for `rand` (Spark 4.0+); seed must be a literal |
-| `randstr` | 🔜 | Random string (Spark 4.0+) |
-| `rint` | ✅ |  |
-| `round` | ✅ | Float/double inputs fall back |
-| `sec` | ✅ |  |
-| `shiftleft` | ✅ |  |
-| `sign` | ✅ |  |
-| `signum` | ✅ |  |
-| `sin` | ✅ |  |
-| `sinh` | ✅ |  |
-| `sqrt` | ✅ |  |
-| `tan` | ✅ |  |
-| `tanh` | ✅ |  |
-| `try_add` | ✅ | Datetime/interval form falls back |
-| `try_divide` | ✅ |  |
-| `try_mod` | ✅ |  |
-| `try_multiply` | ✅ |  |
-| `try_subtract` | ✅ |  |
-| `unhex` | ✅ |  |
-| `uniform` | ✅ | Constant-folded; literal arguments only (Spark 4.0+) |
-| `width_bucket` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `%` | ✅ | Native |  |
+| `*` | ✅ | Native | Interval multiplication falls back |
+| `+` | ✅ | Native |  |
+| `-` | ✅ | Native |  |
+| `/` | ✅ | Native |  |
+| `abs` | ✅ | Native | Interval types fall back |
+| `acos` | ✅ | Native |  |
+| `acosh` | ✅ | Native |  |
+| `asin` | ✅ | Native |  |
+| `asinh` | ✅ | Native |  |
+| `atan` | ✅ | Native |  |
+| `atan2` | ✅ | Native |  |
+| `atanh` | ✅ | Native |  |
+| `bin` | ✅ | Native |  |
+| `bround` | ✅ | Codegen dispatch |  |
+| `cbrt` | ✅ | Native |  |
+| `ceil` | ✅ | — | Two-arg form falls back |
+| `ceiling` | ✅ | — |  |
+| `conv` | ✅ | Codegen dispatch |  |
+| `cos` | ✅ | Native |  |
+| `cosh` | ✅ | Native |  |
+| `cot` | ✅ | Native |  |
+| `csc` | ✅ | Native |  |
+| `degrees` | ✅ | Native |  |
+| `div` | ✅ | Native |  |
+| `e` | ✅ | — | Folds to a literal (like `pi`) |
+| `exp` | ✅ | Native |  |
+| `expm1` | ✅ | Native |  |
+| `factorial` | ✅ | Native |  |
+| `floor` | ✅ | — | Two-arg form falls back |
+| `greatest` | ✅ | Native |  |
+| `hex` | ✅ | Native |  |
+| `hypot` | ✅ | Codegen dispatch |  |
+| `least` | ✅ | Native |  |
+| `ln` | ✅ | Native |  |
+| `log` | ✅ | Native |  |
+| `log10` | ✅ | Native |  |
+| `log1p` | ✅ | Codegen dispatch |  |
+| `log2` | ✅ | Native |  |
+| `mod` | ✅ | Native |  |
+| `negative` | ✅ | Native |  |
+| `pi` | ✅ | Native |  |
+| `pmod` | ✅ | Codegen dispatch |  |
+| `positive` | ✅ | Codegen dispatch |  |
+| `pow` | ✅ | Native |  |
+| `power` | ✅ | Native |  |
+| `radians` | ✅ | Native |  |
+| `rand` | ✅ | Native |  |
+| `randn` | ✅ | Native |  |
+| `random` | ✅ | Native | Alias for `rand` (Spark 4.0+); seed must be a literal |
+| `randstr` | 🔜 | — | Random string (Spark 4.0+) |
+| `rint` | ✅ | Native |  |
+| `round` | ✅ | Native | Float/double inputs fall back |
+| `sec` | ✅ | Native |  |
+| `shiftleft` | ✅ | Native |  |
+| `sign` | ✅ | Native |  |
+| `signum` | ✅ | Native |  |
+| `sin` | ✅ | Native |  |
+| `sinh` | ✅ | Native |  |
+| `sqrt` | ✅ | Native |  |
+| `tan` | ✅ | Native |  |
+| `tanh` | ✅ | Native |  |
+| `try_add` | ✅ | — | Datetime/interval form falls back |
+| `try_divide` | ✅ | — |  |
+| `try_mod` | ✅ | — |  |
+| `try_multiply` | ✅ | — |  |
+| `try_subtract` | ✅ | — |  |
+| `unhex` | ✅ | Native |  |
+| `uniform` | ✅ | — | Constant-folded; literal arguments only (Spark 4.0+) |
+| `width_bucket` | ✅ | Codegen dispatch |  |
 
 ---
 
 ## misc_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `aes_decrypt` | ✅ | Routed through the JVM codegen dispatcher |
-| `aes_encrypt` | ✅ | Routed through the JVM codegen dispatcher; nondeterministic IV by default |
-| `assert_true` | 🔜 | Lowers to `RaiseError`, which falls back |
-| `current_catalog` | ✅ | Resolved to a literal by the analyzer (`ReplaceCurrentLike`) |
-| `current_database` | ✅ | Resolved to a literal by the analyzer (`ReplaceCurrentLike`) |
-| `current_schema` | ✅ | Alias of `current_database`; resolved to a literal by the analyzer |
-| `current_user` | ✅ | Resolved to a literal by the analyzer; same as `user` |
-| `equal_null` | ✅ | Lowers to `<=>` (`EqualNullSafe`) |
-| `is_variant_null` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `monotonically_increasing_id` | ✅ |  |
-| `parse_json` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `raise_error` | 🔜 | Raises a runtime error |
-| `rand` | ✅ | Seed must be a literal |
-| `randn` | ✅ | Seed must be a literal |
-| `schema_of_variant` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `schema_of_variant_agg` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `session_user` | ✅ | Alias of `current_user`; resolved to a literal by the analyzer |
-| `spark_partition_id` | ✅ |  |
-| `to_variant_object` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `try_aes_decrypt` | ✅ | Routed through the JVM codegen dispatcher |
-| `try_parse_json` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `try_variant_get` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
-| `typeof` | ✅ | Foldable; resolved to a literal before Comet sees the plan |
-| `user` | ✅ | Resolved to a literal by the Spark analyzer before reaching Comet |
-| `uuid` | 🔜 | Nondeterministic random UUID |
-| `variant_get` | 🔜 | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `aes_decrypt` | ✅ | — | Routed through the JVM codegen dispatcher |
+| `aes_encrypt` | ✅ | — | Routed through the JVM codegen dispatcher; nondeterministic IV by default |
+| `assert_true` | 🔜 | — | Lowers to `RaiseError`, which falls back |
+| `current_catalog` | ✅ | — | Resolved to a literal by the analyzer (`ReplaceCurrentLike`) |
+| `current_database` | ✅ | — | Resolved to a literal by the analyzer (`ReplaceCurrentLike`) |
+| `current_schema` | ✅ | — | Alias of `current_database`; resolved to a literal by the analyzer |
+| `current_user` | ✅ | — | Resolved to a literal by the analyzer; same as `user` |
+| `equal_null` | ✅ | — | Lowers to `<=>` (`EqualNullSafe`) |
+| `is_variant_null` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `monotonically_increasing_id` | ✅ | Native |  |
+| `parse_json` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `raise_error` | 🔜 | — | Raises a runtime error |
+| `rand` | ✅ | Native | Seed must be a literal |
+| `randn` | ✅ | Native | Seed must be a literal |
+| `schema_of_variant` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `schema_of_variant_agg` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `session_user` | ✅ | — | Alias of `current_user`; resolved to a literal by the analyzer |
+| `spark_partition_id` | ✅ | Native |  |
+| `to_variant_object` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `try_aes_decrypt` | ✅ | — | Routed through the JVM codegen dispatcher |
+| `try_parse_json` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `try_variant_get` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
+| `typeof` | ✅ | — | Foldable; resolved to a literal before Comet sees the plan |
+| `user` | ✅ | — | Resolved to a literal by the Spark analyzer before reaching Comet |
+| `uuid` | 🔜 | — | Nondeterministic random UUID |
+| `variant_get` | 🔜 | — | tracking [#4098](https://github.com/apache/datafusion-comet/issues/4098) |
 
 ---
 
 ## predicate_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `!` | ✅ |  |
-| `<` | ✅ |  |
-| `<=` | ✅ |  |
-| `<=>` | ✅ |  |
-| `=` | ✅ |  |
-| `==` | ✅ |  |
-| `>` | ✅ |  |
-| `>=` | ✅ |  |
-| `and` | ✅ |  |
-| `between` | ✅ |  |
-| `ilike` | ✅ |  |
-| `in` | ✅ |  |
-| `isnan` | ✅ |  |
-| `isnotnull` | ✅ |  |
-| `isnull` | ✅ |  |
-| `like` | ✅ |  |
-| `not` | ✅ |  |
-| `or` | ✅ |  |
-| `regexp` | ✅ | Falls back by default; opt-in via allowIncompatible ([details](compatibility/regex.md)) |
-| `regexp_like` | ✅ | Falls back by default; opt-in via allowIncompatible ([details](compatibility/regex.md)) |
-| `rlike` | ✅ | Falls back by default; opt-in via allowIncompatible ([details](compatibility/regex.md)) |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `!` | ✅ | Native |  |
+| `<` | ✅ | Hybrid |  |
+| `<=` | ✅ | Hybrid |  |
+| `<=>` | ✅ | Hybrid |  |
+| `=` | ✅ | Hybrid |  |
+| `==` | ✅ | Hybrid |  |
+| `>` | ✅ | Hybrid |  |
+| `>=` | ✅ | Hybrid |  |
+| `and` | ✅ | Native |  |
+| `between` | ✅ | — |  |
+| `ilike` | ✅ | — |  |
+| `in` | ✅ | Hybrid |  |
+| `isnan` | ✅ | Native |  |
+| `isnotnull` | ✅ | Native |  |
+| `isnull` | ✅ | Native |  |
+| `like` | ✅ | Hybrid |  |
+| `not` | ✅ | Native |  |
+| `or` | ✅ | Native |  |
+| `regexp` | ✅ | Hybrid | Falls back by default; opt-in via allowIncompatible ([details](compatibility/regex.md)) |
+| `regexp_like` | ✅ | Hybrid | Falls back by default; opt-in via allowIncompatible ([details](compatibility/regex.md)) |
+| `rlike` | ✅ | Hybrid | Falls back by default; opt-in via allowIncompatible ([details](compatibility/regex.md)) |
 
 ---
 
 ## string_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `ascii` | ✅ |  |
-| `base64` | ✅ |  |
-| `bit_length` | ✅ |  |
-| `btrim` | ✅ |  |
-| `char` | ✅ |  |
-| `char_length` | ✅ |  |
-| `character_length` | ✅ |  |
-| `chr` | ✅ |  |
-| `collate` | 🔜 | Spark collation (umbrella [#2190](https://github.com/apache/datafusion-comet/issues/2190)) |
-| `collation` | ✅ | Constant-folded to a literal (Spark 4.0+) |
-| `concat_ws` | ✅ |  |
-| `contains` | ✅ |  |
-| `decode` | ✅ |  |
-| `elt` | ✅ |  |
-| `encode` | 🔜 | Lowers to `StaticInvoke(encode)` (not allowlisted); falls back |
-| `endswith` | ✅ |  |
-| `find_in_set` | ✅ |  |
-| `format_number` | ✅ |  |
-| `format_string` | ✅ |  |
-| `initcap` | ✅ |  |
-| `instr` | ✅ |  |
-| `lcase` | ✅ |  |
-| `left` | ✅ |  |
-| `len` | ✅ |  |
-| `length` | ✅ |  |
-| `levenshtein` | ✅ |  |
-| `locate` | ✅ |  |
-| `lower` | ✅ |  |
-| `lpad` | ✅ |  |
-| `ltrim` | ✅ |  |
-| `luhn_check` | ✅ | Native via `StaticInvoke` (tests: luhn_check.sql) |
-| `mask` | ✅ | Routed through the JVM codegen dispatcher |
-| `octet_length` | ✅ |  |
-| `overlay` | ✅ |  |
-| `position` | ✅ |  |
-| `printf` | ✅ |  |
-| `regexp_count` | ✅ | Runs natively (rewrites to `size(regexp_extract_all(...))`) |
-| `regexp_extract` | ✅ |  |
-| `regexp_extract_all` | ✅ |  |
-| `regexp_instr` | ✅ | Routed through the JVM codegen dispatcher |
-| `regexp_replace` | ✅ |  |
-| `regexp_substr` | ✅ | Runs natively (rewrites to `nullif(regexp_extract(...), '')`) |
-| `repeat` | ✅ |  |
-| `replace` | ✅ |  |
-| `right` | ✅ |  |
-| `rpad` | ✅ |  |
-| `rtrim` | ✅ |  |
-| `soundex` | ✅ |  |
-| `space` | ✅ |  |
-| `split` | ✅ |  |
-| `split_part` | ✅ | Spark 4.0+ |
-| `startswith` | ✅ |  |
-| `substr` | ✅ |  |
-| `substring` | ✅ |  |
-| `substring_index` | ✅ |  |
-| `to_binary` | ✅ | Hex form accelerated; other formats fall back |
-| `to_char` | ✅ |  |
-| `to_number` | ✅ |  |
-| `to_varchar` | ✅ |  |
-| `translate` | ✅ | Falls back by default; opt-in via allowIncompatible ([#4463](https://github.com/apache/datafusion-comet/issues/4463)) |
-| `trim` | ✅ |  |
-| `try_to_binary` | ✅ | Runs natively (rewrites to `try_eval(to_binary(...))`) |
-| `try_to_number` | ✅ | Routed through the JVM codegen dispatcher |
-| `ucase` | ✅ |  |
-| `unbase64` | ✅ |  |
-| `upper` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `ascii` | ✅ | Native |  |
+| `base64` | ✅ | Native |  |
+| `bit_length` | ✅ | Native |  |
+| `btrim` | ✅ | — |  |
+| `char` | ✅ | Native |  |
+| `char_length` | ✅ | Native |  |
+| `character_length` | ✅ | Native |  |
+| `chr` | ✅ | Native |  |
+| `collate` | 🔜 | — | Spark collation (umbrella [#2190](https://github.com/apache/datafusion-comet/issues/2190)) |
+| `collation` | ✅ | — | Constant-folded to a literal (Spark 4.0+) |
+| `concat_ws` | ✅ | Native |  |
+| `contains` | ✅ | — |  |
+| `decode` | ✅ | — |  |
+| `elt` | ✅ | Codegen dispatch |  |
+| `encode` | 🔜 | — | Lowers to `StaticInvoke(encode)` (not allowlisted); falls back |
+| `endswith` | ✅ | — |  |
+| `find_in_set` | ✅ | Codegen dispatch |  |
+| `format_number` | ✅ | Codegen dispatch |  |
+| `format_string` | ✅ | Codegen dispatch |  |
+| `initcap` | ✅ | Hybrid |  |
+| `instr` | ✅ | Native |  |
+| `lcase` | ✅ | Hybrid |  |
+| `left` | ✅ | Native |  |
+| `len` | ✅ | Native |  |
+| `length` | ✅ | Native |  |
+| `levenshtein` | ✅ | Native |  |
+| `locate` | ✅ | Codegen dispatch |  |
+| `lower` | ✅ | Hybrid |  |
+| `lpad` | ✅ | — |  |
+| `ltrim` | ✅ | Native |  |
+| `luhn_check` | ✅ | — | Native via `StaticInvoke` (tests: luhn_check.sql) |
+| `mask` | ✅ | — | Routed through the JVM codegen dispatcher |
+| `octet_length` | ✅ | Native |  |
+| `overlay` | ✅ | Codegen dispatch |  |
+| `position` | ✅ | Codegen dispatch |  |
+| `printf` | ✅ | Codegen dispatch |  |
+| `regexp_count` | ✅ | — | Runs natively (rewrites to `size(regexp_extract_all(...))`) |
+| `regexp_extract` | ✅ | Native |  |
+| `regexp_extract_all` | ✅ | Native |  |
+| `regexp_instr` | ✅ | Codegen dispatch | Routed through the JVM codegen dispatcher |
+| `regexp_replace` | ✅ | Hybrid |  |
+| `regexp_substr` | ✅ | — | Runs natively (rewrites to `nullif(regexp_extract(...), '')`) |
+| `repeat` | ✅ | Native |  |
+| `replace` | ✅ | Hybrid |  |
+| `right` | ✅ | Native |  |
+| `rpad` | ✅ | — |  |
+| `rtrim` | ✅ | Native |  |
+| `soundex` | ✅ | Native |  |
+| `space` | ✅ | Native |  |
+| `split` | ✅ | Hybrid |  |
+| `split_part` | ✅ | — | Spark 4.0+ |
+| `startswith` | ✅ | — |  |
+| `substr` | ✅ | Native |  |
+| `substring` | ✅ | Native |  |
+| `substring_index` | ✅ | Native |  |
+| `to_binary` | ✅ | — | Hex form accelerated; other formats fall back |
+| `to_char` | ✅ | — |  |
+| `to_number` | ✅ | Codegen dispatch |  |
+| `to_varchar` | ✅ | — |  |
+| `translate` | ✅ | Native | Falls back by default; opt-in via allowIncompatible ([#4463](https://github.com/apache/datafusion-comet/issues/4463)) |
+| `trim` | ✅ | Native |  |
+| `try_to_binary` | ✅ | — | Runs natively (rewrites to `try_eval(to_binary(...))`) |
+| `try_to_number` | ✅ | Codegen dispatch | Routed through the JVM codegen dispatcher |
+| `ucase` | ✅ | Hybrid |  |
+| `unbase64` | ✅ | Codegen dispatch |  |
+| `upper` | ✅ | Hybrid |  |
 
 ---
 
 ## struct_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `named_struct` | ✅ | Duplicate field names fall back |
-| `struct` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `named_struct` | ✅ | Native | Duplicate field names fall back |
+| `struct` | ✅ | Native |  |
 
 ---
 
 ## url_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `parse_url` | ✅ |  |
-| `try_url_decode` | ✅ |  |
-| `url_decode` | ✅ |  |
-| `url_encode` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `parse_url` | ✅ | Native |  |
+| `try_url_decode` | ✅ | — |  |
+| `url_decode` | ✅ | — |  |
+| `url_encode` | ✅ | — |  |
 
 ---
 
@@ -637,36 +650,36 @@ to Spark when used as window functions. A handful of frame shapes also
 fall back. See [window function compatibility](compatibility/operators.md)
 for the full list of supported functions, frames, and fallback cases.
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `cume_dist` | ✅ | via `CometWindowExec` |
-| `dense_rank` | ✅ | via `CometWindowExec` |
-| `lag` | ✅ | via `CometWindowExec`; non-literal default falls back ([#4268](https://github.com/apache/datafusion-comet/issues/4268)) |
-| `lead` | ✅ | via `CometWindowExec`; non-literal default falls back ([#4268](https://github.com/apache/datafusion-comet/issues/4268)) |
-| `nth_value` | ✅ | via `CometWindowExec` |
-| `ntile` | ✅ | via `CometWindowExec` |
-| `percent_rank` | ✅ | via `CometWindowExec` |
-| `rank` | ✅ | via `CometWindowExec` |
-| `row_number` | ✅ | via `CometWindowExec` |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `cume_dist` | ✅ | — | via `CometWindowExec` |
+| `dense_rank` | ✅ | — | via `CometWindowExec` |
+| `lag` | ✅ | — | via `CometWindowExec`; non-literal default falls back ([#4268](https://github.com/apache/datafusion-comet/issues/4268)) |
+| `lead` | ✅ | — | via `CometWindowExec`; non-literal default falls back ([#4268](https://github.com/apache/datafusion-comet/issues/4268)) |
+| `nth_value` | ✅ | — | via `CometWindowExec` |
+| `ntile` | ✅ | — | via `CometWindowExec` |
+| `percent_rank` | ✅ | — | via `CometWindowExec` |
+| `rank` | ✅ | — | via `CometWindowExec` |
+| `row_number` | ✅ | — | via `CometWindowExec` |
 
 ---
 
 ## xml_funcs
 
-| Function | Status | Notes |
-| --- | --- | --- |
-| `from_xml` | ✅ | Spark 4.0+ |
-| `schema_of_xml` | ✅ | Spark 4.0+ |
-| `to_xml` | ✅ | Spark 4.0+ |
-| `xpath` | ✅ |  |
-| `xpath_boolean` | ✅ |  |
-| `xpath_double` | ✅ |  |
-| `xpath_float` | ✅ |  |
-| `xpath_int` | ✅ |  |
-| `xpath_long` | ✅ |  |
-| `xpath_number` | ✅ | Alias of `xpath_double` |
-| `xpath_short` | ✅ |  |
-| `xpath_string` | ✅ |  |
+| Function | Status | Implementation | Notes |
+| --- | --- | --- | --- |
+| `from_xml` | ✅ | — | Spark 4.0+ |
+| `schema_of_xml` | ✅ | — | Spark 4.0+ |
+| `to_xml` | ✅ | — | Spark 4.0+ |
+| `xpath` | ✅ | Codegen dispatch |  |
+| `xpath_boolean` | ✅ | Codegen dispatch |  |
+| `xpath_double` | ✅ | Codegen dispatch |  |
+| `xpath_float` | ✅ | Codegen dispatch |  |
+| `xpath_int` | ✅ | Codegen dispatch |  |
+| `xpath_long` | ✅ | Codegen dispatch |  |
+| `xpath_number` | ✅ | Codegen dispatch | Alias of `xpath_double` |
+| `xpath_short` | ✅ | Codegen dispatch |  |
+| `xpath_string` | ✅ | Codegen dispatch |  |
 
 ---
 
diff --git a/contributor-guide/adding_a_new_expression.html b/contributor-guide/adding_a_new_expression.html
index 6f69a31bd2..522d6622ed 100644
--- a/contributor-guide/adding_a_new_expression.html
+++ b/contributor-guide/adding_a_new_expression.html
@@ -765,6 +765,7 @@ under the License.
 <li><p><code class="docutils literal notranslate"><span class="pre">getUnsupportedReasons():</span> <span class="pre">Seq[String]</span></code> - Reasons the expression, or certain usages of it, may not be supported by Comet.</p></li>
 </ul>
 <p>These methods do not affect runtime behavior. They are called by <code class="docutils literal notranslate"><span class="pre">GenerateDocs</span></code> (<code class="docutils literal notranslate"><span class="pre">spark/src/main/scala/org/apache/comet/GenerateDocs.scala</span></code>) when building the user-facing Compatibility Guide pages. The Markdown templates live in <code class="docutils literal notranslate"><span class="pre">docs/source/user-guide/latest/compatibility/expressio [...]
+<p><code class="docutils literal notranslate"><span class="pre">GenerateDocs</span></code> also rewrites the <strong>Implementation</strong> column of every table in <a class="reference internal" href="../user-guide/latest/expressions.html"><span class="std std-doc"><code class="docutils literal notranslate"><span class="pre">docs/source/user-guide/latest/expressions.md</span></code></span></a> based on the serde’s trait mixins: <code class="docutils literal notranslate"><span class="pre [...]
 <p>Key differences from <code class="docutils literal notranslate"><span class="pre">getSupportLevel</span></code>:</p>
 <ul class="simple">
 <li><p><strong>No expression instance.</strong> Both methods take no arguments, so they describe the expression in general rather than a specific call site. Use <code class="docutils literal notranslate"><span class="pre">getSupportLevel</span></code> for checks that depend on data types, argument values, or other per-instance details.</p></li>
@@ -815,6 +816,20 @@ under the License.
 </div>
 </section>
 </section>
+<section id="updating-the-supported-expressions-page">
+<h4>Updating the Supported Expressions Page<a class="headerlink" href="#updating-the-supported-expressions-page" title="Link to this heading">#</a></h4>
+<p>The user-facing <a class="reference internal" href="../user-guide/latest/expressions.html"><span class="std std-doc">Spark Expression Support</span></a> page (<code class="docutils literal notranslate"><span class="pre">docs/source/user-guide/latest/expressions.md</span></code>) lists every Spark built-in with its status, implementation kind, and any notes. Unlike the compatibility pages, this file is committed to the repo, so you need to add a row for your new expression and commit it.</p>
+<p>Add the row to the correct category table (matching the section header, for example <code class="docutils literal notranslate"><span class="pre">##</span> <span class="pre">math_funcs</span></code>). Fill in the Function, Status, and Notes cells and leave the Implementation cell as <code class="docutils literal notranslate"><span class="pre">—</span></code>; the value is regenerated from the serde and does not need to be set by hand:</p>
+<div class="highlight-markdown notranslate"><div class="highlight"><pre><span></span>| <span class="sb">`myfunc`</span> | ✅ | — | Some optional note |
+</pre></div>
+</div>
+<p>To regenerate the Implementation column locally, run the <code class="docutils literal notranslate"><span class="pre">generate-docs</span></code> profile against any supported Spark version:</p>
+<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>./mvnw<span class="w"> </span>-q<span class="w"> </span>-pl<span class="w"> </span>spark<span class="w"> </span>-am<span class="w"> </span>-Pspark-3.5<span class="w"> </span>-Pgenerate-docs<span class="w"> </span>-DskipTests<span class="w"> </span>package<span class="w"> </span><span class="se">\</span>
+<span class="w">  </span>-Dexec.arguments<span class="o">=</span><span class="s2">&quot;</span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span><span class="s2">/docs/source/user-guide/latest/,spark-3.5&quot;</span>
+</pre></div>
+</div>
+<p>That run rewrites every Implementation cell in place, mapping SQL function names to Catalyst classes via Spark’s <code class="docutils literal notranslate"><span class="pre">FunctionRegistry</span></code> and looking each class up in <code class="docutils literal notranslate"><span class="pre">QueryPlanSerde</span></code>. Commit the updated <code class="docutils literal notranslate"><span class="pre">expressions.md</span></code> alongside your serde change. If you forget, a reviewer  [...]
+</section>
 <section id="adding-spark-side-tests-for-the-new-expression">
 <h4>Adding Spark-side Tests for the New Expression<a class="headerlink" href="#adding-spark-side-tests-for-the-new-expression" title="Link to this heading">#</a></h4>
 <p>It is important to verify that the new expression is correctly recognized by the native execution engine and matches the expected Spark behavior. The preferred way to add test coverage is to write a Comet SQL Test. This approach is simpler than writing Comet Scala Tests and makes it easy to cover many input combinations and edge cases.</p>
@@ -1104,6 +1119,7 @@ Spark.</p>
 <li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#example-enumerating-supported-values">Example: Enumerating supported values</a></li>
 </ul>
 </li>
+<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#updating-the-supported-expressions-page">Updating the Supported Expressions Page</a></li>
 <li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#adding-spark-side-tests-for-the-new-expression">Adding Spark-side Tests for the New Expression</a><ul class="nav section-nav flex-column">
 <li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#writing-a-comet-sql-test">Writing a Comet SQL Test</a></li>
 <li class="toc-h5 nav-item toc-entry"><a class="reference internal nav-link" href="#tips">Tips</a></li>
diff --git a/contributor-guide/release_process.html b/contributor-guide/release_process.html
index 234d64c964..f995454ab1 100644
--- a/contributor-guide/release_process.html
+++ b/contributor-guide/release_process.html
@@ -651,7 +651,8 @@ to the release branch (documentation, version bump, changelog) go through pull r
 <h3>Generate Release Documentation<a class="headerlink" href="#generate-release-documentation" title="Link to this heading">#</a></h3>
 <p>The docs on <code class="docutils literal notranslate"><span class="pre">main</span></code> contain only template markers; CI fills them at publish time. A release branch instead
 commits the generated content so the archived docs for the release render real tables. Run the script to
-generate the config reference and the per-Spark-version compatibility pages and freeze them onto the branch:</p>
+generate the config reference, refresh the Implementation column of the Spark Expression Support page, and
+produce the per-Spark-version compatibility pages, freezing them onto the branch:</p>
 <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>./dev/generate-release-docs.sh
 git<span class="w"> </span>add<span class="w"> </span>docs/source/user-guide/latest/
 git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;Generate docs for 0.13.0 release&quot;</span>
diff --git a/searchindex.js b/searchindex.js
index 1758e6d69d..9584dc8bd8 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"!": [[53, "id1"]], "%": [[51, "id1"]], "&": [[41, "id1"]], "*": [[51, "id2"]], "+": [[51, "id3"]], "-": [[51, "id4"]], "/": [[51, "id5"]], "1. Format Your Code": [[38, "format-your-code"]], "1. Install Comet": [[59, "install-comet"], [69, "install-comet"]], "1. Native Operators (nativeExecs map)": [[26, "native-operators-nativeexecs-map"]], "2. Build and Verify": [[38, "build-and-verify"]], "2. Clone Iceberg and Apply Diff": [[59, "clone-iceberg-and-apply- [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"!": [[53, "id1"]], "%": [[51, "id1"]], "&": [[41, "id1"]], "*": [[51, "id2"]], "+": [[51, "id3"]], "-": [[51, "id4"]], "/": [[51, "id5"]], "1. Format Your Code": [[38, "format-your-code"]], "1. Install Comet": [[59, "install-comet"], [69, "install-comet"]], "1. Native Operators (nativeExecs map)": [[26, "native-operators-nativeexecs-map"]], "2. Build and Verify": [[38, "build-and-verify"]], "2. Clone Iceberg and Apply Diff": [[59, "clone-iceberg-and-apply- [...]
\ No newline at end of file
diff --git a/user-guide/latest/expressions.html b/user-guide/latest/expressions.html
index 930424337e..a035dc2f78 100644
--- a/user-guide/latest/expressions.html
+++ b/user-guide/latest/expressions.html
@@ -776,6 +776,33 @@ for how Comet chooses.</p>
 </table>
 </div>
 </section>
+<section id="implementation-legend">
+<h2>Implementation legend<a class="headerlink" href="#implementation-legend" title="Link to this heading">#</a></h2>
+<p>The <strong>Implementation</strong> column records how Comet executes each expression when it is not falling back to Spark:</p>
+<div class="pst-scrollable-table-container"><table class="table">
+<thead>
+<tr class="row-odd"><th class="head"><p>Implementation</p></th>
+<th class="head"><p>Meaning</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>Native</p></td>
+<td><p>Comet’s Rust engine evaluates the expression end to end.</p></td>
+</tr>
+<tr class="row-odd"><td><p>Codegen dispatch</p></td>
+<td><p>Spark’s own generated JVM code is evaluated inside the Comet pipeline. Used when a byte-exact match to Spark matters more than the native speedup, or when no native path exists.</p></td>
+</tr>
+<tr class="row-even"><td><p>Hybrid</p></td>
+<td><p>Both paths exist. Comet picks between them based on input, and the user can override with <code class="docutils literal notranslate"><span class="pre">spark.comet.expression.EXPRNAME.allowIncompatible=true</span></code> — see <a class="reference internal" href="compatibility/index.html#native-and-codegen-dispatch-implementations"><span class="std std-ref">Native and codegen-dispatch implementations</span></a>.</p></td>
+</tr>
+<tr class="row-odd"><td><p>—</p></td>
+<td><p>No direct wire-up: the row is either planned, is rewritten to another expression before Comet sees it (for example <code class="docutils literal notranslate"><span class="pre">to_date</span></code> → <code class="docutils literal notranslate"><span class="pre">Cast</span></code>), or is handled at the operator level rather than the expression level (for example <code class="docutils literal notranslate"><span class="pre">explode</span></code>, window functions).</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<p>The Implementation column is auto-generated from the serde definitions in <code class="docutils literal notranslate"><span class="pre">QueryPlanSerde</span></code>; do not edit it by hand.</p>
+</section>
 <section id="not-currently-planned">
 <h2>Not currently planned<a class="headerlink" href="#not-currently-planned" title="Link to this heading">#</a></h2>
 <p>Comet focuses acceleration on mainstream relational, string, datetime, math, and collection
@@ -798,244 +825,304 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">any</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">any_value</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">approx_count_distinct</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">approx_percentile</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Byte, short, int, long, float, and double input; other input types fall back to Spark</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_agg</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Alias for <code class="docutils literal notranslate"><span class="pre">collect_list</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">avg</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Interval types fall back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bit_and</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bit_or</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bit_xor</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool_and</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool_or</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">collect_list</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">collect_set</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">corr</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">count</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">count_if</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">covar_pop</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">covar_samp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">every</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">first</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">first_value</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">grouping</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Grouping indicator for ROLLUP/CUBE/GROUPING SETS</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">grouping_id</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Grouping indicator for ROLLUP/CUBE/GROUPING SETS</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">kurtosis</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">last</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">last_value</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">listagg</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>String aggregation</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">max</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">max_by</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p><a class="reference external" href="https://github.com/apache/datafusion-comet/issues/3841">#3841</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">mean</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">median</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Rewrites to <code class="docutils literal notranslate"><span class="pre">percentile(col,</span> <span class="pre">0.5)</span></code> and runs natively for supported percentile inputs</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">min</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">min_by</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p><a class="reference external" href="https://github.com/apache/datafusion-comet/issues/3841">#3841</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">mode</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p><a class="reference external" href="https://github.com/apache/datafusion-comet/issues/3970">#3970</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">percentile</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Single literal percentage on numeric input runs natively; array of percentages and a frequency argument fall back to Spark</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">percentile_cont</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.0+ <code class="docutils literal notranslate"><span class="pre">WITHIN</span> <span class="pre">GROUP</span> <span class="pre">(ORDER</span> <span class="pre">BY</span> <span class="pre">...)</span></code>; ascending only runs natively, <code class="docutils literal notranslate"><span class="pre">DESC</span></code> falls back to Spark</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">percentile_disc</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Percentile aggregate</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regr_avgx</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Native: Spark rewrites to <code class="docutils literal notranslate"><span class="pre">Average</span></code> (tests in <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4551">#4551</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regr_avgy</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Native: Spark rewrites to <code class="docutils literal notranslate"><span class="pre">Average</span></code> (tests in <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4551">#4551</a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regr_count</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Native: Spark rewrites to <code class="docutils literal notranslate"><span class="pre">Count</span></code> (tests in <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4551">#4551</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regr_intercept</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Falls back; can reuse <code class="docutils literal notranslate"><span class="pre">covar_pop</span></code>/<code class="docutils literal notranslate"><span class="pre">var_pop</span></code> accumulators (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4552">#4552</a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regr_r2</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Falls back; can reuse the <code class="docutils literal notranslate"><span class="pre">corr</span></code> accumulator (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4552">#4552</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regr_slope</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Falls back; can reuse <code class="docutils literal notranslate"><span class="pre">covar_pop</span></code>/<code class="docutils literal notranslate"><span class="pre">var_pop</span></code> accumulators (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4552">#4552</a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regr_sxx</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Falls back; can reuse <code class="docutils literal notranslate"><span class="pre">var_pop</span></code> accumulator (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4552">#4552</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regr_sxy</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Falls back; can reuse <code class="docutils literal notranslate"><span class="pre">covar_pop</span></code> accumulator (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4552">#4552</a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regr_syy</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Falls back; can reuse <code class="docutils literal notranslate"><span class="pre">var_pop</span></code> accumulator (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4552">#4552</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">skewness</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">some</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">std</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">stddev</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">stddev_pop</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">stddev_samp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">string_agg</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>String aggregation (alias of <code class="docutils literal notranslate"><span class="pre">listagg</span></code>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sum</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_avg</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Interval types fall back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_sum</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">var_pop</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">var_samp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">variance</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -1049,108 +1136,134 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_append</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_compact</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_contains</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>NaN/signed-zero handling may differ (<a class="reference internal" href="compatibility/floating-point.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_distinct</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>NaN/signed-zero handling may differ (<a class="reference internal" href="compatibility/floating-point.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_except</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible (<a class="reference internal" href="#compatibility/expressions/array.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_insert</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_intersect</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible (<a class="reference internal" href="#compatibility/expressions/array.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_join</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Routes through the JVM codegen dispatcher by default; the incompatible native path is opt-in via allowIncompatible (<a class="reference internal" href="#compatibility/expressions/array.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_max</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>NaN ordering may differ (<a class="reference internal" href="compatibility/floating-point.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_min</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>NaN ordering may differ (<a class="reference internal" href="compatibility/floating-point.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_position</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Binary/struct/map/null elements fall back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_prepend</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_remove</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_repeat</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_union</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>NaN/signed-zero handling may differ (<a class="reference internal" href="compatibility/floating-point.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">arrays_overlap</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">arrays_zip</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">element_at</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">flatten</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Binary/struct/map elements fall back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">get</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sequence</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">shuffle</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Binary/struct/map elements fall back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">slice</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Native (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4149">#4149</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">sort_array</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Nested struct/null arrays fall back</p></td>
 </tr>
 </tbody>
@@ -1164,56 +1277,69 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">&amp;</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">&lt;&lt;</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">&gt;&gt;</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">&gt;&gt;&gt;</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Operator alias for <code class="docutils literal notranslate"><span class="pre">shiftrightunsigned</span></code> (Spark 4.0+)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">^</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bit_count</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bit_get</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">getbit</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">shiftright</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">shiftrightunsigned</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">|</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">~</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -1227,28 +1353,34 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array_size</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">cardinality</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">concat</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Binary/array children fall back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">reverse</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Binary-element arrays fall back (Incompatible) (<a class="reference internal" href="#compatibility/expressions/array.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">size</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -1262,48 +1394,59 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">coalesce</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">if</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ifnull</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">nanvl</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">nullif</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">nullifzero</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Lowers to <code class="docutils literal notranslate"><span class="pre">if</span></code>/<code class="docutils literal notranslate"><span class="pre">=</span></code> (Spark 4.0+)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">nvl</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">nvl2</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">when</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">zeroifnull</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Lowers to <code class="docutils literal notranslate"><span class="pre">coalesce</span></code> (Spark 4.0+)</p></td>
 </tr>
 </tbody>
@@ -1318,12 +1461,14 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">cast</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Some casts fall back; float-to-decimal is opt-in (<a class="reference internal" href="#compatibility/expressions/cast.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 </tbody>
@@ -1337,20 +1482,24 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">from_csv</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">schema_of_csv</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_csv</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -1364,300 +1513,374 @@ expressions. The following function families are <strong>not currently planned</
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">add_months</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">convert_timezone</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible (<a class="reference internal" href="#compatibility/expressions/datetime.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">curdate</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Constant-folded to a literal (alias of <code class="docutils literal notranslate"><span class="pre">current_date</span></code>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">current_date</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Constant-folded to a literal before Comet sees the plan</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">current_time</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Blocked on Spark 4.1 TIME type support (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4288">#4288</a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">current_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Constant-folded to a literal before Comet sees the plan</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">current_timezone</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">date_add</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">date_diff</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">date_format</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">date_from_unix_date</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">date_part</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">date_sub</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">date_trunc</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">dateadd</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">datediff</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">datepart</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">day</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">dayname</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Abbreviated day name (Spark 4.0+)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">dayofmonth</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">dayofweek</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">dayofyear</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">extract</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">from_unixtime</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">from_utc_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible (<a class="reference internal" href="#compatibility/expressions/datetime.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">hour</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">last_day</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">localtimestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">make_date</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">make_dt_interval</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">make_interval</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Produces legacy CalendarInterval; tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4540">#4540</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">make_time</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.1 TIME type; tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4288">#4288</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">make_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">make_timestamp_ltz</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>2-arg TIME form falls back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">make_timestamp_ntz</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>2-arg TIME form falls back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">make_ym_interval</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">minute</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">month</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">monthname</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Abbreviated month name (Spark 4.0+)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">months_between</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">next_day</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">now</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Constant-folded to a literal (alias of <code class="docutils literal notranslate"><span class="pre">current_timestamp</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">quarter</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">second</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">session_window</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Batch session-window grouping falls back (<code class="docutils literal notranslate"><span class="pre">UpdatingSessionsExec</span></code> is not yet native); tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4785">#4785</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">time_diff</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.1 TIME type; tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4288">#4288</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">time_trunc</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.1 TIME type; tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4288">#4288</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">timestamp_micros</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">timestamp_millis</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">timestamp_seconds</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_date</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Rewrites to <code class="docutils literal notranslate"><span class="pre">Cast</span></code> (or <code class="docutils literal notranslate"><span class="pre">Cast(GetTimestamp)</span></code> with a format) before Comet sees the plan</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">to_time</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.1 TIME type; tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4288">#4288</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Rewrites to <code class="docutils literal notranslate"><span class="pre">Cast</span></code> (or <code class="docutils literal notranslate"><span class="pre">GetTimestamp</span></code> with a format) before Comet sees the plan</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">to_timestamp_ltz</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Rewrites to <code class="docutils literal notranslate"><span class="pre">to_timestamp</span></code> (<code class="docutils literal notranslate"><span class="pre">TimestampType</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_timestamp_ntz</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Rewrites to <code class="docutils literal notranslate"><span class="pre">to_timestamp</span></code> (<code class="docutils literal notranslate"><span class="pre">TimestampNTZType</span></code>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">to_unix_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_utc_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Routes through the JVM codegen dispatcher by default (handles all timezone forms); the native path is opt-in via allowIncompatible (<a class="reference internal" href="#compatibility/expressions/datetime.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">trunc</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_make_interval</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Produces legacy CalendarInterval; tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4540">#4540</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_make_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_to_date</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Rewrites to <code class="docutils literal notranslate"><span class="pre">Cast</span></code>/<code class="docutils literal notranslate"><span class="pre">GetTimestamp</span></code> before Comet sees the plan; same support as <code class="docutils literal notranslate"><span class="pre">to_date</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_to_time</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.1 TIME type; tracked by <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4288">#4288</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_to_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Rewrites to <code class="docutils literal notranslate"><span class="pre">Cast</span></code>/<code class="docutils literal notranslate"><span class="pre">GetTimestamp</span></code> before Comet sees the plan; same support as <code class="docutils literal notranslate"><span class="pre">to_timestamp</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">unix_date</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">unix_micros</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">unix_millis</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">unix_seconds</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">unix_timestamp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">weekday</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">weekofyear</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">window</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Batch tumbling and sliding time-window grouping runs natively</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">window_time</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Batch time-window grouping runs natively</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">year</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -1674,36 +1897,44 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">explode</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometExplodeExec</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">explode_outer</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>outer=true falls back (Incompatible) (<a class="reference internal" href="../../contributor-guide/expression-audits/generator_funcs.html#explode-outer"><span class="std std-ref">audit</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">inline</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Operator-level generator (like <code class="docutils literal notranslate"><span class="pre">explode</span></code>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">inline_outer</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Operator-level generator (like <code class="docutils literal notranslate"><span class="pre">explode</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">posexplode</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometExplodeExec</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">posexplode_outer</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>outer=true falls back (Incompatible) (<a class="reference internal" href="../../contributor-guide/expression-audits/generator_funcs.html#posexplode-outer"><span class="std std-ref">audit</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">stack</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Operator-level generator</p></td>
 </tr>
 </tbody>
@@ -1717,36 +1948,44 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">crc32</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">hash</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">md5</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sha</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">sha1</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sha2</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">xxhash64</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -1760,36 +1999,44 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">from_json</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Falls back by default; opt-in via allowIncompatible (<a class="reference internal" href="../../contributor-guide/expression-audits/json_funcs.html#from-json"><span class="std std-ref">audit</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">get_json_object</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Some inputs need allowIncompatible (<a class="reference internal" href="../../contributor-guide/expression-audits/json_funcs.html#get-json-object"><span class="std std-ref">audit</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">json_array_length</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Single-quoted/trailing JSON needs allowIncompatible (<a class="reference internal" href="../../contributor-guide/expression-audits/json_funcs.html#json-array-length"><span class="std std-ref">audit</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">json_object_keys</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">json_tuple</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p><a class="reference external" href="https://github.com/apache/datafusion-comet/issues/3160">#3160</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">schema_of_json</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_json</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Options and map/array inputs fall back (<a class="reference internal" href="../../contributor-guide/expression-audits/json_funcs.html#to-json"><span class="std std-ref">audit</span></a>)</p></td>
 </tr>
 </tbody>
@@ -1803,56 +2050,69 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">aggregate</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">array_sort</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">exists</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">filter</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>General lambda routed through the JVM codegen dispatcher; the <code class="docutils literal notranslate"><span class="pre">array_compact</span></code> form runs natively</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">forall</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">map_filter</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">map_zip_with</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">reduce</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">transform</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">transform_keys</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">transform_values</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">zip_with</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -1866,52 +2126,64 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">element_at</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">map</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p>Routed through the JVM codegen dispatcher</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">map_concat</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">map_contains_key</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">map_entries</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">map_from_arrays</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">map_from_entries</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>BinaryType key/value falls back (Incompatible) (<a class="reference internal" href="#compatibility/expressions/map.md"><span class="xref myst">details</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">map_keys</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">map_values</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">str_to_map</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_element_at</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Lowers to <code class="docutils literal notranslate"><span class="pre">element_at</span></code></p></td>
 </tr>
 </tbody>
@@ -1925,288 +2197,359 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">%</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">*</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Interval multiplication falls back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">+</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">-</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">/</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">abs</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Interval types fall back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">acos</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">acosh</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">asin</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">asinh</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">atan</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">atan2</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">atanh</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bin</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bround</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">cbrt</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ceil</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Two-arg form falls back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ceiling</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">conv</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">cos</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">cosh</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">cot</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">csc</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">degrees</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">div</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">e</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Folds to a literal (like <code class="docutils literal notranslate"><span class="pre">pi</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">exp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">expm1</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">factorial</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">floor</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Two-arg form falls back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">greatest</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">hex</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">hypot</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">least</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ln</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">log</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">log10</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">log1p</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">log2</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">mod</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">negative</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">pi</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">pmod</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">positive</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">pow</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">power</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">radians</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">rand</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">randn</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">random</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Alias for <code class="docutils literal notranslate"><span class="pre">rand</span></code> (Spark 4.0+); seed must be a literal</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">randstr</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Random string (Spark 4.0+)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">rint</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">round</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Float/double inputs fall back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sec</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">shiftleft</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sign</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">signum</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sin</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">sinh</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">sqrt</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">tan</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">tanh</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_add</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Datetime/interval form falls back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_divide</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_mod</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_multiply</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_subtract</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">unhex</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">uniform</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Constant-folded; literal arguments only (Spark 4.0+)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">width_bucket</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -2220,112 +2563,139 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">aes_decrypt</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Routed through the JVM codegen dispatcher</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">aes_encrypt</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Routed through the JVM codegen dispatcher; nondeterministic IV by default</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">assert_true</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Lowers to <code class="docutils literal notranslate"><span class="pre">RaiseError</span></code>, which falls back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">current_catalog</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Resolved to a literal by the analyzer (<code class="docutils literal notranslate"><span class="pre">ReplaceCurrentLike</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">current_database</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Resolved to a literal by the analyzer (<code class="docutils literal notranslate"><span class="pre">ReplaceCurrentLike</span></code>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">current_schema</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Alias of <code class="docutils literal notranslate"><span class="pre">current_database</span></code>; resolved to a literal by the analyzer</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">current_user</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Resolved to a literal by the analyzer; same as <code class="docutils literal notranslate"><span class="pre">user</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">equal_null</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Lowers to <code class="docutils literal notranslate"><span class="pre">&lt;=&gt;</span></code> (<code class="docutils literal notranslate"><span class="pre">EqualNullSafe</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">is_variant_null</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">monotonically_increasing_id</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">parse_json</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">raise_error</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Raises a runtime error</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">rand</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Seed must be a literal</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">randn</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Seed must be a literal</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">schema_of_variant</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">schema_of_variant_agg</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">session_user</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Alias of <code class="docutils literal notranslate"><span class="pre">current_user</span></code>; resolved to a literal by the analyzer</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">spark_partition_id</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_variant_object</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_aes_decrypt</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Routed through the JVM codegen dispatcher</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_parse_json</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_variant_get</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">typeof</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Foldable; resolved to a literal before Comet sees the plan</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">user</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Resolved to a literal by the Spark analyzer before reaching Comet</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">uuid</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Nondeterministic random UUID</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">variant_get</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>tracking <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4098">#4098</a></p></td>
 </tr>
 </tbody>
@@ -2339,92 +2709,114 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">!</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">&lt;</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">&lt;=</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">&lt;=&gt;</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">=</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">==</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">&gt;</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">&gt;=</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">and</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">between</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ilike</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">in</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">isnan</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">isnotnull</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">isnull</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">like</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">not</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">or</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regexp</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Falls back by default; opt-in via allowIncompatible (<a class="reference internal" href="compatibility/regex.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regexp_like</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Falls back by default; opt-in via allowIncompatible (<a class="reference internal" href="compatibility/regex.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">rlike</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p>Falls back by default; opt-in via allowIncompatible (<a class="reference internal" href="compatibility/regex.html"><span class="std std-doc">details</span></a>)</p></td>
 </tr>
 </tbody>
@@ -2438,272 +2830,339 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ascii</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">base64</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bit_length</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">btrim</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">char</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">char_length</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">character_length</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">chr</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">collate</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Spark collation (umbrella <a class="reference external" href="https://github.com/apache/datafusion-comet/issues/2190">#2190</a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">collation</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Constant-folded to a literal (Spark 4.0+)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">concat_ws</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">contains</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">decode</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">elt</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">encode</span></code></p></td>
 <td><p>🔜</p></td>
+<td><p>—</p></td>
 <td><p>Lowers to <code class="docutils literal notranslate"><span class="pre">StaticInvoke(encode)</span></code> (not allowlisted); falls back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">endswith</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">find_in_set</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">format_number</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">format_string</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">initcap</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">instr</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">lcase</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">left</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">len</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">length</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">levenshtein</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">locate</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">lower</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">lpad</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ltrim</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">luhn_check</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Native via <code class="docutils literal notranslate"><span class="pre">StaticInvoke</span></code> (tests: luhn_check.sql)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">mask</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Routed through the JVM codegen dispatcher</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">octet_length</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">overlay</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">position</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">printf</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regexp_count</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Runs natively (rewrites to <code class="docutils literal notranslate"><span class="pre">size(regexp_extract_all(...))</span></code>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regexp_extract</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regexp_extract_all</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regexp_instr</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p>Routed through the JVM codegen dispatcher</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">regexp_replace</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">regexp_substr</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Runs natively (rewrites to <code class="docutils literal notranslate"><span class="pre">nullif(regexp_extract(...),</span> <span class="pre">'')</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">repeat</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">replace</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">right</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">rpad</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">rtrim</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">soundex</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">space</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">split</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">split_part</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.0+</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">startswith</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">substr</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">substring</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">substring_index</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">to_binary</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Hex form accelerated; other formats fall back</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_char</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">to_number</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_varchar</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">translate</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Falls back by default; opt-in via allowIncompatible (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4463">#4463</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">trim</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_to_binary</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Runs natively (rewrites to <code class="docutils literal notranslate"><span class="pre">try_eval(to_binary(...))</span></code>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">try_to_number</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p>Routed through the JVM codegen dispatcher</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ucase</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">unbase64</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">upper</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Hybrid</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -2717,16 +3176,19 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">named_struct</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p>Duplicate field names fall back</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">struct</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -2740,24 +3202,29 @@ expression-level). The <code class="docutils literal notranslate"><span class="p
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">parse_url</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Native</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">try_url_decode</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">url_decode</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">url_encode</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -2781,44 +3248,54 @@ for the full list of supported functions, frames, and fallback cases.</p>
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">cume_dist</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">dense_rank</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">lag</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code>; non-literal default falls back (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4268">#4268</a>)</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">lead</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code>; non-literal default falls back (<a class="reference external" href="https://github.com/apache/datafusion-comet/issues/4268">#4268</a>)</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">nth_value</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ntile</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">percent_rank</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">rank</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">row_number</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>via <code class="docutils literal notranslate"><span class="pre">CometWindowExec</span></code></p></td>
 </tr>
 </tbody>
@@ -2832,56 +3309,69 @@ for the full list of supported functions, frames, and fallback cases.</p>
 <thead>
 <tr class="row-odd"><th class="head"><p>Function</p></th>
 <th class="head"><p>Status</p></th>
+<th class="head"><p>Implementation</p></th>
 <th class="head"><p>Notes</p></th>
 </tr>
 </thead>
 <tbody>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">from_xml</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.0+</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">schema_of_xml</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.0+</p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">to_xml</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>—</p></td>
 <td><p>Spark 4.0+</p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">xpath</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_boolean</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_double</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_float</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_int</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_long</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_number</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p>Alias of <code class="docutils literal notranslate"><span class="pre">xpath_double</span></code></p></td>
 </tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_short</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">xpath_string</span></code></p></td>
 <td><p>✅</p></td>
+<td><p>Codegen dispatch</p></td>
 <td><p></p></td>
 </tr>
 </tbody>
@@ -2958,6 +3448,7 @@ for the full list of supported functions, frames, and fallback cases.</p>
   <nav class="bd-toc-nav page-toc" aria-labelledby="pst-page-navigation-heading-2">
     <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#status-legend">Status legend</a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#implementation-legend">Implementation legend</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#not-currently-planned">Not currently planned</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#agg-funcs">agg_funcs</a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#array-funcs">array_funcs</a></li>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org