Known Limitations
Window functions are not available
DuckDB window functions (OVER (...) clauses) are implemented entirely in
DuckDB's C++ layer and have no counterpart in the public C extension API.
This is not a gap in quack-rs or in libduckdb-sys — the relevant symbol
(duckdb_create_window_function) simply does not exist in the C API:
| Symbol | C API (1.4.x)? | C API (1.5.0+)? | C++ API? |
|---|---|---|---|
duckdb_create_window_function | No | No | Yes |
duckdb_create_copy_function | No | Yes | Yes |
duckdb_create_scalar_function | Yes | Yes | Yes |
duckdb_create_aggregate_function | Yes | Yes | Yes |
duckdb_create_table_function | Yes | Yes | Yes |
duckdb_create_cast_function | Yes | Yes | Yes |
What this means for your extension:
If your extension needs window-function semantics, you can approximate them with aggregate functions in most cases (DuckDB will push down the window logic). True custom window operator registration requires writing a C++ extension.
If DuckDB exposes window registration in a future C API version, quack-rs
will add wrappers in the corresponding release.
COPY functions (resolved in DuckDB 1.5.0)
DuckDB 1.5.0 added duckdb_create_copy_function and related symbols to the public
C extension API. quack-rs wraps these in the copy_function module behind the
duckdb-1-5 feature flag. See CopyFunctionBuilder for usage.
This was previously listed as a known limitation (no C API counterpart prior to 1.5.0).
Callback accessor wrappers (resolved)
quack-rs now wraps all major callback accessor functions — the C API functions used inside your callbacks to retrieve arguments, set errors, access bind data, etc.
| Category | Wrapper type | Available |
|---|---|---|
| Scalar function execution | ScalarFunctionInfo | Always |
| Scalar function bind | ScalarBindInfo | duckdb-1-5 |
| Scalar function init | ScalarInitInfo | duckdb-1-5 |
| Aggregate function callbacks | AggregateFunctionInfo | Always |
| Table function bind | BindInfo | Always |
| Table function init | InitInfo | Always |
| Table function scan | FunctionInfo | Always |
| Cast function callbacks | CastFunctionInfo | Always |
| Copy function bind | CopyBindInfo | duckdb-1-5 |
| Copy function global init | CopyGlobalInitInfo | duckdb-1-5 |
| Copy function sink | CopySinkInfo | duckdb-1-5 |
| Copy function finalize | CopyFinalizeInfo | duckdb-1-5 |
All callback accessor functions are now wrapped, including get_client_context
on all callback types (returns a [ClientContext][crate::client_context::ClientContext]).
Complex type creation (resolved)
LogicalType now provides constructors for all complex parameterized types:
| Method | Type created |
|---|---|
LogicalType::decimal(width, scale) | DECIMAL(p, s) |
LogicalType::enum_type(members) | ENUM('a', 'b', ...) |
LogicalType::array(child, size) | type[N] |
LogicalType::union_type(members) | UNION(a INT, b VARCHAR) |
LogicalType::list(child) | LIST(type) |
LogicalType::struct_type(fields) | STRUCT(...) |
LogicalType::map(key, value) | MAP(K, V) |
All constructors have _from_logical variants for nested complex types.
Introspection methods (get_type_id, list_child_type, struct_child_count,
decimal_width, etc.) are also available.
VARIANT type (Iceberg v3)
DuckDB v1.5.1 introduced the VARIANT type for Iceberg v3 support.
This type is not yet exposed in the DuckDB C Extension API
(DUCKDB_TYPE_VARIANT does not exist in libduckdb-sys 1.10501.0).
quack-rs will add TypeId::Variant when the C API exposes it.