apache/datafusion-python/check-upstream
- community
Checking that the SKILL.md file is still in the repository.
Check if upstream Apache DataFusion features (functions, DataFrame ops, SessionContext methods, FFI types) are exposed in this Python project. Use when adding missing functions, auditing API coverage, or ensuring parity with upstream.
Install
npx vskill@latest install apache/datafusion-python/check-upstreamSKILL.md
Check Upstream DataFusion Feature Coverage
You are auditing the datafusion-python project to find features from the upstream Apache DataFusion Rust library that are not yet exposed in this Python binding project. Your goal is to identify gaps and, if asked, implement the missing bindings.
IMPORTANT: The Python API is the source of truth for coverage. A function or method is considered "exposed" if it exists in the Python API (e.g., python/datafusion/functions.py), even if there is no corresponding entry in the Rust bindings. Many upstream functions are aliases of other functions — the Python layer can expose these aliases by calling a different underlying Rust binding. Do NOT report a function as missing if it appears in the Python __all__ list and has a working implementation, regardless of whether a matching #[pyfunction] exists in Rust.
IMPORTANT: audit the total upstream surface, not the delta since the last pin. Gaps accumulate across syncs. A patch-release bump with a "bug fixes only" changelog does not mean there is nothing to find — pre-existing gaps from earlier majors still need to be surfaced. Always run the full comparison.
Compile-Signal Triggers
If a recent upstream bump required any of the following while fixing compile errors in crates/core/ or the FFI example, treat that as a hard signal that user-facing surface area grew and run this skill before considering the bump done. Each pattern corresponds to a class of gap that frequently shows up in the audit:
| Signal during PR 1 compile fix | Likely gap to check | |
|---|---|---|
New Expr::* variant added to a non-exhaustive match (HigherOrderFunction, Lambda, LambdaVariable, …) | New lambda / higher-order scalar functions (any_match, array_transform, list_transform, …) | |
New ScalarValue::* variant (ListView, LargeListView, …) | New scalar / array functions that consume or produce the type | |
New required trait method on ExecutionPlan / TableProvider / *UDFImpl (apply_expressions, …) | Corresponding capability on the Python wrapper class | |
Renamed or restructured struct field (e.g. Cast.data_type → Cast.field: FieldRef) | Any Python accessor / SKILL.md doc that read the old field | |
Newly deprecated trait method with a _with_args / _with_options replacement | The *_with_options variant frequently warrants a separate Python entry point |
PR 1 of dev/release/upstream-sync.md asks you to log these signals as they appear. When you run this skill, use that log as a checklist: every entry must either show up in the audit output or be explicitly skipped with a reason.
Areas to Check
The user may specify an area via $ARGUMENTS. If no area is specified or "all" is given, check all areas.
1. Scalar Functions
Upstream source of truth:
- Rust docs: https://docs.rs/datafusion/latest/datafusion/functions/index.html
- User docs: https://datafusion.apache.org/user-guide/sql/scalar_functions.html
Where they are exposed in this project:
- Python API:
python/datafusion/functions.py— each function wraps a call todatafusion._internal.functions - Rust bindings:
crates/core/src/functions.rs—#[pyfunction]definitions registered viainit_module()
Evaluated and not requiring separate Python exposure:
get_field_path— already covered byget_field(expr, *names), which takes a
variadic field path and dispatches to the same underlying functions::core::get_field UDF as the upstream get_field_path helper.
How to check:
- Fetch the upstream scalar function documentation page
- Compare against functions listed in
python/datafusion/functions.py(check the__all__list and function definitions) - A function is covered if it exists in the Python API — it does NOT need a dedicated Rust
#[pyfunction]. Many functions are aliases that reuse another function's Rust binding. - Check against the "evaluated and not requiring exposure" list before flagging as a gap
- Only report functions that are missing from the Python
__all__list / function definitions
2. Aggregate Functions
Upstream source of truth:
- Rust docs: https://docs.rs/datafusion/latest/datafusion/functions_aggregate/index.html
- User docs: https://datafusion.apache.org/user-guide/sql/aggregate_functions.html
Where they are exposed in this project:
- Python API:
python/datafusion/functions.py(aggregate functions are mixed in with scalar functions) - Rust bindings:
crates/core/src/functions.rs
Evaluated and not requiring separate Python exposure:
count_distinct— covered bycount(expr, distinct=True). Both forms call
count_udaf with distinct: bool = true and produce the same logical plan.
sum_distinct— covered bysum(expr, distinct=True).avg_distinct— covered byavg(expr, distinct=True).
How to check:
- Fetch the upstream aggregate function documentation page
- Compare against aggregate functions in
python/datafusion/functions.py(check__all__list and function definitions) - A function is covered if it exists in the Python API, even if it aliases another function's Rust binding
- Check against the "evaluated and not requiring exposure" list before flagging as a gap
- Report only functions missing from the Python API
3. Window Functions
Upstream source of truth:
- Rust docs: https://docs.rs/datafusion/latest/datafusion/functions_window/index.html
- User docs: https://datafusion.apache.org/user-guide/sql/window_functions.html
Where they are exposed in this project:
- Python API:
python/datafusion/functions.py(window functions likerank,dense_rank,lag,lead, etc.) - Rust bindings:
crates/core/src/functions.rs
How to check:
- Fetch the upstream window function documentation page
- Compare against window functions in
python/datafusion/functions.py(check__all__list and function definitions) - A function is covered if it exists in the Python API, even if it aliases another function's Rust binding
- Report only functions missing from the Python API
4. Table Functions
Upstream source of truth:
- Rust docs: https://docs.rs/datafusion/latest/datafusion/functions_table/index.html
- User docs: https://datafusion.apache.org/user-guide/sql/table_functions.html (if available)
Where they are exposed in this project:
- Python API:
python/datafusion/functions.pyandpython/datafusion/user_defined.py(TableFunction/udtf) - Rust bindings:
crates/core/src/functions.rsandcrates/core/src/udtf.rs
How to check:
- Fetch the upstream table function documentation
- Compare against what's available in the Python API
- A function is covered if it exists in the Python API, even if it aliases another function's Rust binding
- Report only functions missing from the Python API
5. DataFrame Operations
Upstream source of truth:
- Rust docs: https://docs.rs/datafusion/latest/datafusion/dataframe/struct.DataFrame.html
Where they are exposed in this project:
- Python API:
python/datafusion/dataframe.py— theDataFrameclass - Rust bindings:
crates/core/src/dataframe.rs—PyDataFramewith#[pymethods]
Evaluated and not requiring separate Python exposure:
show_limit— already covered byDataFrame.show(), which provides the same functionality with a simpler APIwith_param_values— already covered by theparam_valuesargument onSessionContext.sql(), which accomplishes the same thing more robustlyunion_by_name_distinct— already covered byDataFrame.union_by_name(distinct=True), which provides a more Pythonic APIto_string—str(df)is the Pythonic way to get a string and already goes through__repr__and the configurable formatter. A separateto_string()would either duplicatestr(df)or render every row through a different path (sessiondatafusion.format.*options, no formatter), giving a third text rendering alongsidereprandshow()
How to check:
- Fetch the upstream DataFrame documentation page listing all methods
- Compare against methods in
python/datafusion/dataframe.py— this is the source of truth for coverage - The Rust bindings (
crates/core/src/dataframe.rs) may be consulted for context, but a method is covered if it exists in the Python API - Check against the "evaluated and not requiring exposure" list before flagging as a gap
- Report only methods missing from the Python API
6. SessionContext Methods
Upstream source of truth:
- Rust docs: https://docs.rs/datafusion/latest/datafusion/execution/context/struct.SessionContext.html
Where they are exposed in this project:
- Python API:
python/datafusion/context.py— theSessionContextclass - Rust bindings:
crates/core/src/context.rs—PySessionContextwith#[pymethods]
How to check:
- Fetch the upstream SessionContext documentation page listing all methods
- Compare against methods in
python/datafusion/context.py— this is the source of truth for coverage - The Rust bindings (
crates/core/src/context.rs) may be consulted for context, but a method is covered if it exists in the Python API - Report only methods missing from the Python API
7. FFI Types (datafusion-ffi)
Upstream source of truth:
- Crate source: https://github.com/apache/datafusion/tree/main/datafusion/ffi/src
- Rust docs: https://docs.rs/datafusion-ffi/latest/datafusion_ffi/
Where they are exposed in this project:
- Rust bindings: various files under
crates/core/src/andcrates/util/src/ - FFI example:
examples/datafusion-ffi-example/src/ - Dependency declared in root
Cargo.tomlandcrates/core/Cargo.toml
Discovering currently supported FFI types: Grep for use datafusion_ffi:: in crates/core/src/ and crates/util/src/ to find all FFI types currently imported and used.
Evaluated and not requiring direct Python exposure: These upstream FFI types have been reviewed and do not need to be independently exposed to end users:
FFI_ExecutionPlan— already used indirectly through table providers; no need for direct exposureFFI_PhysicalExpr/FFI_PhysicalSortExpr— internal physical planning types not expected to be needed by end usersFFI_RecordBatchStream— one level deeper than FFI_ExecutionPlan, used internally when execution plans stream resultsFFI_SessionRef/ForeignSession— session sharing across FFI; Python manages sessions natively via SessionContextFFI_SessionConfig— Python can configure sessions natively without FFIFFI_ConfigOptions/FFI_TableOptions— internal configuration plumbingFFI_PlanProperties/FFI_Boundedness/FFI_EmissionType— read from existing plans, not user-facingFFI_Partitioning— supporting type for physical planning- Supporting/utility types (
FFI_Option,FFI_Result,WrappedSchema,WrappedArray,FFI_ColumnarValue,FFI_Volatility,FFI_InsertOp,FFI_AccumulatorArgs,FFI_Accumulator,FFI_GroupsAccumulator,FFI_EmitTo,FFI_AggregateOrderSensitivity,FFI_PartitionEvaluator,FFI_PartitionEvaluatorArgs,FFI_Range,FFI_SortOptions,FFI_Distribution,FFI_ExprProperties,FFI_SortProperties,FFI_Interval,FFI_TableProviderFilterPushDown,FFI_TableType) — used as building blocks within the types above, not independently exposed
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.ai/skills/check-upstream/SKILL.md
Popularity
- Repository stars
- 594
- Repository forks
- 162
- 7-day trend score
- 32
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/apache/datafusion-python/check-upstream)