Skip to content

Commit ea0fb6a

Browse files
committed
examples calling __datafusion_table_provider__
1 parent 269d9bb commit ea0fb6a

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

examples/python-udtf-table-capsule-regression.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,23 @@ def main() -> None:
1010
"""Demonstrate current failure modes around table provider capsules."""
1111

1212
ctx = SessionContext()
13+
capsule_source = Table(ctx.sql("SELECT 1 AS value"))
1314

1415
@udtf("table_from_sql")
1516
def table_from_sql_udtf() -> Table:
1617
"""Return a DataFusion Table constructed from a SQL query."""
1718

18-
return Table(ctx.sql("SELECT 1 AS value"))
19+
return capsule_source
1920

2021
ctx.register_udtf(table_from_sql_udtf)
2122

2223
try:
23-
ctx.sql("SELECT * FROM table(table_from_sql())").collect()
24+
ctx.sql("SELECT * FROM table_from_sql()").collect()
2425
except NotImplementedError as err:
25-
print("Collecting from table_from_sql() failed:", err)
26+
print(
27+
"Collecting from table_from_sql() failed because the table provider capsule is missing:",
28+
err,
29+
)
2630

2731
ctx.register_table("numbers", Table(ctx.sql("SELECT 1 AS value")))
2832

@@ -31,7 +35,10 @@ def table_from_sql_udtf() -> Table:
3135
try:
3236
getattr(numbers, "__datafusion_table_provider__")
3337
except AttributeError as err:
34-
print("Accessing __datafusion_table_provider__ on catalog table failed:", err)
38+
print(
39+
"Accessing __datafusion_table_provider__ on catalog table failed because the capsule attribute is missing:",
40+
err,
41+
)
3542

3643

3744
if __name__ == "__main__":

examples/table_capsule_failure.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
55
This example mirrors how advanced integrations unwrap ``Table`` instances via the
66
``__datafusion_table_provider__`` PyCapsule. The refactor that removed this method
7-
means user-defined table functions returning ``Table`` now raise ``NotImplementedError``.
7+
means user-defined table functions returning ``Table`` now raise ``NotImplementedError``
8+
and the script prints the resulting error message instead of crashing.
89
"""
910

1011
from __future__ import annotations
@@ -16,6 +17,7 @@ def main() -> None:
1617
"""Register a Python table UDTF that returns a ``Table`` and trigger it."""
1718

1819
ctx = SessionContext()
20+
failing_table = Table(ctx.sql("SELECT 1 AS value"))
1921

2022
@udtf("capsule_dependent")
2123
def capsule_dependent_udtf() -> Table:
@@ -24,13 +26,22 @@ def capsule_dependent_udtf() -> Table:
2426
# Prior to the refactor the wrapper exposed ``__datafusion_table_provider__``
2527
# so this conversion succeeded. Without it the runtime raises a
2628
# ``NotImplementedError`` complaining about the missing attribute.
27-
return Table(ctx.sql("SELECT 1 AS value"))
29+
return failing_table
2830

2931
ctx.register_udtf(capsule_dependent_udtf)
3032

3133
# Executing the UDTF now fails because ``Table`` no longer exposes the
3234
# ``__datafusion_table_provider__`` helper that PyTableFunction expects.
33-
ctx.sql("SELECT * FROM capsule_dependent()").collect()
35+
try:
36+
ctx.sql("SELECT * FROM capsule_dependent()").collect()
37+
print("capsule_dependent() works")
38+
except NotImplementedError as err:
39+
# Document the regression by surfacing the missing capsule attribute
40+
# instead of crashing with a panic inside the execution engine.
41+
print(
42+
"capsule_dependent() failed due to missing __datafusion_table_provider__: "
43+
f"{err}"
44+
)
3445

3546

3647
if __name__ == "__main__":

0 commit comments

Comments
 (0)