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:

SymbolC API (1.4.x)?C API (1.5.0+)?C++ API?
duckdb_create_window_functionNoNoYes
duckdb_create_copy_functionNoYesYes
duckdb_create_scalar_functionYesYesYes
duckdb_create_aggregate_functionYesYesYes
duckdb_create_table_functionYesYesYes
duckdb_create_cast_functionYesYesYes

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.

CategoryWrapper typeAvailable
Scalar function executionScalarFunctionInfoAlways
Scalar function bindScalarBindInfoduckdb-1-5
Scalar function initScalarInitInfoduckdb-1-5
Aggregate function callbacksAggregateFunctionInfoAlways
Table function bindBindInfoAlways
Table function initInitInfoAlways
Table function scanFunctionInfoAlways
Cast function callbacksCastFunctionInfoAlways
Copy function bindCopyBindInfoduckdb-1-5
Copy function global initCopyGlobalInitInfoduckdb-1-5
Copy function sinkCopySinkInfoduckdb-1-5
Copy function finalizeCopyFinalizeInfoduckdb-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:

MethodType 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.