Skip to content

remove type coercion in the binary physical expr - #3396

Merged
alamb merged 17 commits into
apache:masterfrom
liukun4515:remove_phy_coercion_#3387_#3388
Sep 24, 2022
Merged

remove type coercion in the binary physical expr#3396
alamb merged 17 commits into
apache:masterfrom
liukun4515:remove_phy_coercion_#3387_#3388

Conversation

@liukun4515

@liukun4515 liukun4515 commented Sep 8, 2022

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Closes #3388

depend on #3421 #3289 #3459 #3472

fixed the row filter predication for the data type of NULL value #3470

Rationale for this change

What changes are included in this PR?

In order to make the pr review more friendly for reviewer, I will explain what I did in this pr:

  1. remove the type coercion in the creation of the binary physical expr and fix the test case

  2. redo the simplify expression again after the type coercion in the optimizer. This is just an minor fix. If the issue move the type coercion out of the optimizer and refactor the optimizer #3582 done, we can remove the duplicated simplify expression in the optimizer.

  3. try do the type coercion before evaluate the logical expr in the file according to the comments in this issue simplify_expressions don't support different data type for binary #3556 from @alamb . This is just an temporary fix, and it will be remove when do move the type coercion out of the optimizer and refactor the optimizer #3582

  4. remove the between optimization in the simplify expression because of issue simplify between expr should consider the data type #3587, and will recovery when do move the type coercion out of the optimizer and refactor the optimizer #3582

  5. refresh the test cases

cc @alamb @andygrove

Are there any user-facing changes?

@github-actions github-actions Bot added logical-expr Logical plan and expressions physical-expr Changes to the physical-expr crates labels Sep 8, 2022
@liukun4515
liukun4515 force-pushed the remove_phy_coercion_#3387_#3388 branch from c150de1 to c2884f7 Compare September 8, 2022 13:39
Comment thread datafusion/physical-expr/src/expressions/binary.rs Outdated
@liukun4515
liukun4515 force-pushed the remove_phy_coercion_#3387_#3388 branch from 1d7c2a0 to 8c38433 Compare September 13, 2022 10:54
@github-actions github-actions Bot added the optimizer Optimizer rules label Sep 13, 2022
@liukun4515

Copy link
Copy Markdown
Contributor Author

after rebase #3380, the test case evolved_schema_intersection_filter_with_filter_pushdown and evolved_schema_disjoint_schema_filter_with_pushdown failed

@liukun4515

Copy link
Copy Markdown
Contributor Author

this pr depend on the #3470 and #3472

@github-actions github-actions Bot removed the optimizer Optimizer rules label Sep 16, 2022
@liukun4515

Copy link
Copy Markdown
Contributor Author

I meet so many issue when remove the binary type coercion which is caused from these pr #3301 #3246
For example is TRUE, these is a logical expr Expr::IsTrue but convert it to the physical binary op in https://github.com/andygrove/arrow-datafusion/blob/92b1a341aca334c54235ef65737c88037010e30b/datafusion/physical-expr/src/planner.rs#L86

@andygrove why not generate the logical binary op when create the Expr::IsTrue logical expr.

@liukun4515

liukun4515 commented Sep 16, 2022

Copy link
Copy Markdown
Contributor Author

I meet so many issue when remove the binary type coercion which is caused from these pr #3301 #3246 For example is TRUE, these is a logical expr Expr::IsTrue but convert it to the physical binary op in https://github.com/andygrove/arrow-datafusion/blob/92b1a341aca334c54235ef65737c88037010e30b/datafusion/physical-expr/src/planner.rs#L86

@andygrove why not generate the logical binary op when create the Expr::IsTrue logical expr.

cc @alamb

I create the issue #3509 to support other logical expr for the typ coercion.
If we can convert such expr like istrue, isfalse,like to binary op in the logical phase, we don't need to do this by adding more case in the TypeCoercion optimizer rule.
I don't know why we don't do this when implement the is true, is false in the https://github.com/apache/arrow-datafusion/pull/3301/files @andygrove , is there any optimization should be done in the logical phase with the Expr:IsTrue?

@alamb

alamb commented Sep 17, 2022

Copy link
Copy Markdown
Contributor

is there any optimization should be done in the logical phase with the Expr:IsTrue?

I think the only coercion it might need is that its argument is DataType::Boolean

@liukun4515
liukun4515 marked this pull request as ready for review September 21, 2022 15:00
@github-actions github-actions Bot added the optimizer Optimizer rules label Sep 21, 2022
@codecov-commenter

codecov-commenter commented Sep 22, 2022

Copy link
Copy Markdown

Codecov Report

Merging #3396 (3062cd5) into master (b54a56f) will increase coverage by 0.05%.
The diff coverage is 98.52%.

@@            Coverage Diff             @@
##           master    #3396      +/-   ##
==========================================
+ Coverage   86.03%   86.08%   +0.05%     
==========================================
  Files         300      300              
  Lines       56253    56313      +60     
==========================================
+ Hits        48395    48477      +82     
+ Misses       7858     7836      -22     
Impacted Files Coverage Δ
datafusion/core/src/physical_plan/planner.rs 78.03% <ø> (+0.56%) ⬆️
datafusion/core/tests/sql/aggregates.rs 99.38% <ø> (+<0.01%) ⬆️
datafusion/core/tests/sql/decimal.rs 100.00% <ø> (ø)
datafusion/optimizer/src/type_coercion.rs 96.01% <92.30%> (+3.61%) ⬆️
datafusion/physical-expr/src/expressions/binary.rs 97.42% <98.33%> (-0.21%) ⬇️
datafusion/core/src/execution/context.rs 79.38% <100.00%> (+0.07%) ⬆️
...ore/src/physical_optimizer/aggregate_statistics.rs 100.00% <100.00%> (ø)
...sion/core/src/physical_plan/file_format/parquet.rs 94.68% <100.00%> (+0.02%) ⬆️
datafusion/core/tests/sql/predicates.rs 100.00% <100.00%> (ø)
datafusion/core/tests/sql/select.rs 99.78% <100.00%> (ø)
... and 28 more

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@liukun4515
liukun4515 marked this pull request as draft September 22, 2022 10:12
@liukun4515
liukun4515 marked this pull request as draft September 22, 2022 10:12
@liukun4515
liukun4515 marked this pull request as ready for review September 22, 2022 14:27
@andygrove

Copy link
Copy Markdown
Member

I've started reviewing this, but there are many changes and referenced issues I need to go read. I will continue with the review tomorrow.

@alamb

alamb commented Sep 23, 2022

Copy link
Copy Markdown
Contributor

I also plan to review this PR, but I may not get to it today

@liukun4515

Copy link
Copy Markdown
Contributor Author

I try to explain what I do and why i do in the description What changes are included in this PR?

I hope this works for your review.

cc @andygrove @alamb

@alamb alamb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a great PR to read @liukun4515 -- really nice.

Thank you for sticking with it.

I think we should merge it asap to minimize conflicts.

rules.push(Arc::new(FilterNullJoinKeys::default()));
}
rules.push(Arc::new(ReduceOuterJoin::new()));
// TODO: https://github.com/apache/arrow-datafusion/issues/3557

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it makes sense to me that we need to simplify expressons after coercion

"+--------------+---------------------------+---------------------------+---------------------------+",
"| 1.5 | 2.5 | 3.5 | 2.5 |",
"+--------------+---------------------------+---------------------------+---------------------------+",
"+--------------+-------------------------+-------------------------+-------------------------+",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Operator::Modulo,
DataType::Decimal128(10, 2)
);
// TODO add other data type

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we should file another ticket to track this gap? Specifically, a "help wanted" ticket that explained what was needed might encourage some additional contributions

Operator::GtEq,
DataType::Decimal128(15, 3)
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed the tests cases in this file carefully. Very nice 👌

DataType::Boolean,
DataType::Boolean,
Operator::Or,
DataType::Boolean

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any other types that are coerced to boolean for logical operations? Or are the tests for boolean just showing that boolean types are not changed when coerced?

Comment thread datafusion/optimizer/src/simplify_expressions.rs
},
);

let mut execution_props = ExecutionProps::new();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice

Comment thread datafusion/optimizer/tests/integration-test.rs

/// return two physical expressions that are optionally coerced to a
/// common type that the binary operator supports.
fn binary_cast(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉

vec![2i32, 4i32]
vec![2i32, 4i32],
);
test_coercion!(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if these tests are doing anything useful anymore now that we are coercing in the logical layer? 🤔 It seems like they are now testing the test code 😆

@alamb

alamb commented Sep 24, 2022

Copy link
Copy Markdown
Contributor

I plan to get this PR ready to merge by: add my suggested comments, fix clippy, and merge to master

@alamb

alamb commented Sep 24, 2022

Copy link
Copy Markdown
Contributor

(since I already have it checked out this will be a simple thing for me)

@alamb
alamb merged commit d7c0e42 into apache:master Sep 24, 2022
@ursabot

ursabot commented Sep 24, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = b625277 and contender = d7c0e42. d7c0e42 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on ec2-t3-xlarge-us-east-2] ec2-t3-xlarge-us-east-2
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on test-mac-arm] test-mac-arm
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on ursa-i9-9960x] ursa-i9-9960x
[Skipped ⚠️ Benchmarking of arrow-datafusion-commits is not supported on ursa-thinkcentre-m75q] ursa-thinkcentre-m75q
Buildkite builds:
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

lyne7-sc pushed a commit to lyne7-sc/datafusion that referenced this pull request Aug 25, 2026
…oup (apache#24650)

Bumps the all-uv-deps group with 1 update:
[pygithub](https://github.com/pygithub/pygithub).

Updates `pygithub` from 2.9.1 to 2.10.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pygithub/pygithub/releases">pygithub's
releases</a>.</em></p>
<blockquote>
<h2>2.10.0</h2>
<h3>Notable changes</h3>
<h4>Drop Python 3.9 support due to End-of-Life</h4>
<p>Python 3.9 reached its end-of-life October 31, 2025. Support has been
removed with this release.</p>
<h3>New Features</h3>
<ul>
<li>Allow to specify the Github API version by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3480">PyGithub/PyGithub#3480</a></li>
<li>Add issue dependency endpoints by <a
href="https://github.com/james-geiger"><code>@​james-geiger</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3477">PyGithub/PyGithub#3477</a></li>
</ul>
<h3>Improvements</h3>
<ul>
<li>Add <code>incomplete_results</code> property to
<code>PaginatedList</code> by <a
href="https://github.com/Felixoid"><code>@​Felixoid</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3396">PyGithub/PyGithub#3396</a></li>
<li>Add <code>WorkflowRun.get_attempt</code> and
<code>Repository.get_workflow_job</code> functions by <a
href="https://github.com/cecheta"><code>@​cecheta</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3401">PyGithub/PyGithub#3401</a></li>
<li>Add support for <code>head_repo</code> when creating pull request by
<a href="https://github.com/shannon"><code>@​shannon</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3479">PyGithub/PyGithub#3479</a></li>
<li>Add <code>max_rate_limit_wait</code> to <code>GithubRetry</code> to
cap rate limit backoff by <a
href="https://github.com/tanistheta"><code>@​tanistheta</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3540">PyGithub/PyGithub#3540</a></li>
<li>Add <code>return_run_details</code> parameter to
<code>Workflow.create_dispatch</code> by <a
href="https://github.com/SebastienSyd"><code>@​SebastienSyd</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3471">PyGithub/PyGithub#3471</a></li>
<li>Update <code>SecurityAndAnalysis</code> by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3503">PyGithub/PyGithub#3503</a></li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fix duplicated URL in <code>OrganizationVariable.edit()</code> and
<code>OrganizationSecret.edit()</code> by <a
href="https://github.com/Krishnachaitanyakc"><code>@​Krishnachaitanyakc</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3472">PyGithub/PyGithub#3472</a></li>
<li>Fix <code>GithubException.__str__</code> decoding bytes data by <a
href="https://github.com/SAY-5"><code>@​SAY-5</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3494">PyGithub/PyGithub#3494</a></li>
<li>Fixing <code>OrganizationVariable.value</code> by properly using
base class by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3507">PyGithub/PyGithub#3507</a></li>
<li>Parse only the query string for
<code>PaginatedList.totalCount</code> by <a
href="https://github.com/Noethix55555"><code>@​Noethix55555</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3518">PyGithub/PyGithub#3518</a></li>
<li>Encode boolean query parameters as lowercase by <a
href="https://github.com/Noethix55555"><code>@​Noethix55555</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3516">PyGithub/PyGithub#3516</a></li>
<li>Fix doubled slash in request path for <code>base_url</code> with
trailing slash by <a
href="https://github.com/Noethix55555"><code>@​Noethix55555</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3537">PyGithub/PyGithub#3537</a></li>
<li>Fix <code>WorkflowRun</code> schema suggestion by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3559">PyGithub/PyGithub#3559</a></li>
<li>Fix OAuth2 authorization <code>state</code> /
<code>code_verifier</code> parameters by <a
href="https://github.com/TheoGoudout"><code>@​TheoGoudout</code></a> in
<a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3440">PyGithub/PyGithub#3440</a></li>
<li>Allow creating custom property with <code>values_editable_by</code>
param by <a
href="https://github.com/chawlajay9"><code>@​chawlajay9</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3548">PyGithub/PyGithub#3548</a></li>
<li>Fix <code>OrganizationSecret.edit()</code> to seal the value and use
<code>PUT</code> by <a
href="https://github.com/Noethix55555"><code>@​Noethix55555</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3529">PyGithub/PyGithub#3529</a></li>
<li>Fix lazy retrieval of latest tag name by <a
href="https://github.com/sathieu"><code>@​sathieu</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3487">PyGithub/PyGithub#3487</a></li>
<li>Fix typing and typos by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3485">PyGithub/PyGithub#3485</a></li>
</ul>
<h3>Maintenance</h3>
<ul>
<li>Add support for Python 3.15 and drop EOL 3.9 by <a
href="https://github.com/hugovk"><code>@​hugovk</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3551">PyGithub/PyGithub#3551</a></li>
<li>Move self-link awareness into <code>CompletableGithubObject</code>
by <a href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in
<a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3432">PyGithub/PyGithub#3432</a></li>
<li>Add documentation for agents, add Claude skills by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3509">PyGithub/PyGithub#3509</a></li>
<li>Add <code>sphinx-copybutton</code> for code blocks by <a
href="https://github.com/DivyanshiGautam31"><code>@​DivyanshiGautam31</code></a>
in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3493">PyGithub/PyGithub#3493</a></li>
<li>Add support to OpenAPI script for applying schema to methods by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3374">PyGithub/PyGithub#3374</a></li>
<li>Improve OpenAPI apply properties and methods by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3495">PyGithub/PyGithub#3495</a></li>
<li>Fix OpenAPI method verb detection by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3496">PyGithub/PyGithub#3496</a></li>
<li>Add OpenAPI script tests by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3489">PyGithub/PyGithub#3489</a></li>
<li>Fix OpenAPI apply method by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3498">PyGithub/PyGithub#3498</a></li>
<li>Reordering OpenAPI test sequence by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3500">PyGithub/PyGithub#3500</a></li>
<li>Apply typing convention by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3504">PyGithub/PyGithub#3504</a></li>
<li>Bump <code>mypy</code> Python version to 3.12 by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3505">PyGithub/PyGithub#3505</a></li>
<li>Use <code>@overload</code> to type <code>get_user</code> by <a
href="https://github.com/xmo-odoo"><code>@​xmo-odoo</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3502">PyGithub/PyGithub#3502</a></li>
<li>Add overload type annotations by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3506">PyGithub/PyGithub#3506</a></li>
<li>Simplify <code>OrganizationVariable</code> by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3508">PyGithub/PyGithub#3508</a></li>
<li>Add OpenAPI script filename option to create class by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3512">PyGithub/PyGithub#3512</a></li>
<li>OpenAPI script improvements by <a
href="https://github.com/EnricoMi"><code>@​EnricoMi</code></a> in <a
href="https://redirect.github.com/PyGithub/PyGithub/pull/3511">PyGithub/PyGithub#3511</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/PyGithub/PyGithub/blob/main/doc/changes.rst">pygithub's
changelog</a>.</em></p>
<blockquote>
<h2>Version 2.10.0 (August 20, 2026)</h2>
<p>Notable changes
^^^^^^^^^^^^^^^</p>
<p>Drop Python 3.9 support due to End-of-Life

&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;
Python 3.9 reached its end-of-life October 31, 2025. Support has been
removed with this release.</p>
<p>New Features
^^^^^^^^^^^^</p>
<ul>
<li>Allow to specify the Github API version
(<code>[apache#3480](PyGithub/PyGithub#3480)
&lt;https://github.com/PyGithub/PyGithub/pull/3480&gt;</code><em>)
(<code>546b0ee7e
&lt;https://github.com/PyGithub/PyGithub/commit/546b0ee7e&gt;</code></em>)</li>
<li>Add issue dependency endpoints
(<code>[apache#3477](PyGithub/PyGithub#3477)
&lt;https://github.com/PyGithub/PyGithub/pull/3477&gt;</code><em>)
(<code>b0ee6e0c7
&lt;https://github.com/PyGithub/PyGithub/commit/b0ee6e0c7&gt;</code></em>)</li>
</ul>
<p>Improvements
^^^^^^^^^^^^</p>
<ul>
<li>Add <code>incomplete_results</code> property to
<code>PaginatedList</code>
(<code>[apache#3396](PyGithub/PyGithub#3396)
&lt;https://github.com/PyGithub/PyGithub/pull/3396&gt;</code><em>)
(<code>7806e7dcc
&lt;https://github.com/PyGithub/PyGithub/commit/7806e7dcc&gt;</code></em>)</li>
<li>Add <code>WorkflowRun.get_attempt</code> and
<code>Repository.get_workflow_job</code> functions
(<code>[apache#3401](PyGithub/PyGithub#3401)
&lt;https://github.com/PyGithub/PyGithub/pull/3401&gt;</code><em>)
(<code>fdf9ed869
&lt;https://github.com/PyGithub/PyGithub/commit/fdf9ed869&gt;</code></em>)</li>
<li>Add support for <code>head_repo</code> when creating pull request
(<code>[apache#3479](PyGithub/PyGithub#3479)
&lt;https://github.com/PyGithub/PyGithub/pull/3479&gt;</code><em>)
(<code>8ddfd6b11
&lt;https://github.com/PyGithub/PyGithub/commit/8ddfd6b11&gt;</code></em>)</li>
<li>Add <code>max_rate_limit_wait</code> to <code>GithubRetry</code> to
cap rate limit backoff
(<code>[apache#3540](PyGithub/PyGithub#3540)
&lt;https://github.com/PyGithub/PyGithub/pull/3540&gt;</code><em>)
(<code>8b50a098f
&lt;https://github.com/PyGithub/PyGithub/commit/8b50a098f&gt;</code></em>)</li>
<li>Add <code>return_run_details</code> parameter to
<code>Workflow.create_dispatch</code>
(<code>[apache#3471](PyGithub/PyGithub#3471)
&lt;https://github.com/PyGithub/PyGithub/pull/3471&gt;</code><em>)
(<code>162ce9d0e
&lt;https://github.com/PyGithub/PyGithub/commit/162ce9d0e&gt;</code></em>)</li>
<li>Update <code>SecurityAndAnalysis</code>
(<code>[apache#3503](PyGithub/PyGithub#3503)
&lt;https://github.com/PyGithub/PyGithub/pull/3503&gt;</code><em>)
(<code>9674c5799
&lt;https://github.com/PyGithub/PyGithub/commit/9674c5799&gt;</code></em>)</li>
</ul>
<p>Bug Fixes
^^^^^^^^^</p>
<ul>
<li>Fix duplicated URL in <code>OrganizationVariable.edit()</code> and
<code>OrganizationSecret.edit()</code>
(<code>[apache#3472](PyGithub/PyGithub#3472)
&lt;https://github.com/PyGithub/PyGithub/pull/3472&gt;</code><em>)
(<code>a2e76eb8e
&lt;https://github.com/PyGithub/PyGithub/commit/a2e76eb8e&gt;</code></em>)</li>
<li>Fix <code>GithubException.__str__</code> decoding bytes data
(<code>[apache#3494](PyGithub/PyGithub#3494)
&lt;https://github.com/PyGithub/PyGithub/pull/3494&gt;</code><em>)
(<code>7a3b22ed6
&lt;https://github.com/PyGithub/PyGithub/commit/7a3b22ed6&gt;</code></em>)</li>
<li>Fixing <code>OrganizationVariable.value</code> by properly using
base class
(<code>[apache#3507](PyGithub/PyGithub#3507)
&lt;https://github.com/PyGithub/PyGithub/pull/3507&gt;</code><em>)
(<code>39a7464ff
&lt;https://github.com/PyGithub/PyGithub/commit/39a7464ff&gt;</code></em>)</li>
<li>Parse only the query string for
<code>PaginatedList.totalCount</code>
(<code>[apache#3518](PyGithub/PyGithub#3518)
&lt;https://github.com/PyGithub/PyGithub/pull/3518&gt;</code><em>)
(<code>645d2a2e8
&lt;https://github.com/PyGithub/PyGithub/commit/645d2a2e8&gt;</code></em>)</li>
<li>Encode boolean query parameters as lowercase
(<code>[apache#3516](PyGithub/PyGithub#3516)
&lt;https://github.com/PyGithub/PyGithub/pull/3516&gt;</code><em>)
(<code>f4e29299e
&lt;https://github.com/PyGithub/PyGithub/commit/f4e29299e&gt;</code></em>)</li>
<li>Fix doubled slash in request path for <code>base_url</code> with
trailing slash
(<code>[apache#3537](PyGithub/PyGithub#3537)
&lt;https://github.com/PyGithub/PyGithub/pull/3537&gt;</code><em>)
(<code>c15572f23
&lt;https://github.com/PyGithub/PyGithub/commit/c15572f23&gt;</code></em>)</li>
<li>Fix <code>WorkflowRun</code> schema suggestion
(<code>[apache#3559](PyGithub/PyGithub#3559)
&lt;https://github.com/PyGithub/PyGithub/pull/3559&gt;</code><em>)
(<code>5f707d64b
&lt;https://github.com/PyGithub/PyGithub/commit/5f707d64b&gt;</code></em>)</li>
<li>Fix OAuth2 authorization <code>state</code> /
<code>code_verifier</code> parameters
(<code>[apache#3440](PyGithub/PyGithub#3440)
&lt;https://github.com/PyGithub/PyGithub/pull/3440&gt;</code><em>)
(<code>4785224bc
&lt;https://github.com/PyGithub/PyGithub/commit/4785224bc&gt;</code></em>)</li>
<li>Allow creating custom property with <code>values_editable_by</code>
param (<code>[apache#3548](PyGithub/PyGithub#3548)
&lt;https://github.com/PyGithub/PyGithub/pull/3548&gt;</code><em>)
(<code>134f38a63
&lt;https://github.com/PyGithub/PyGithub/commit/134f38a63&gt;</code></em>)</li>
<li>Fix <code>OrganizationSecret.edit()</code> to seal the value and use
<code>PUT</code>
(<code>[apache#3529](PyGithub/PyGithub#3529)
&lt;https://github.com/PyGithub/PyGithub/pull/3529&gt;</code><em>)
(<code>4f8674b72
&lt;https://github.com/PyGithub/PyGithub/commit/4f8674b72&gt;</code></em>)</li>
<li>Fix lazy retrieval of latest tag name
(<code>[apache#3487](PyGithub/PyGithub#3487)
&lt;https://github.com/PyGithub/PyGithub/pull/3487&gt;</code><em>)
(<code>33071b35d
&lt;https://github.com/PyGithub/PyGithub/commit/33071b35d&gt;</code></em>)</li>
<li>Fix typing and typos
(<code>[apache#3485](PyGithub/PyGithub#3485)
&lt;https://github.com/PyGithub/PyGithub/pull/3485&gt;</code><em>)
(<code>fd7abf6a7
&lt;https://github.com/PyGithub/PyGithub/commit/fd7abf6a7&gt;</code></em>)</li>
</ul>
<p>Maintenance
^^^^^^^^^^^</p>
<ul>
<li>Add support for Python 3.15 and drop EOL 3.9
(<code>[apache#3551](PyGithub/PyGithub#3551)
&lt;https://github.com/PyGithub/PyGithub/pull/3551&gt;</code><em>)
(<code>5e2de3144
&lt;https://github.com/PyGithub/PyGithub/commit/5e2de3144&gt;</code></em>)</li>
<li>Move self-link awareness into <code>CompletableGithubObject</code>
(<code>[apache#3432](PyGithub/PyGithub#3432)
&lt;https://github.com/PyGithub/PyGithub/pull/3432&gt;</code><em>)
(<code>92ec3fab0
&lt;https://github.com/PyGithub/PyGithub/commit/92ec3fab0&gt;</code></em>)</li>
<li>Add documentation for agents, add Claude skills
(<code>[apache#3509](PyGithub/PyGithub#3509)
&lt;https://github.com/PyGithub/PyGithub/pull/3509&gt;</code><em>)
(<code>28f140d10
&lt;https://github.com/PyGithub/PyGithub/commit/28f140d10&gt;</code></em>)</li>
<li>Add <code>sphinx-copybutton</code> for code blocks
(<code>[apache#3493](PyGithub/PyGithub#3493)
&lt;https://github.com/PyGithub/PyGithub/pull/3493&gt;</code>_)</li>
<li>Add support to OpenAPI script for applying schema to methods
(<code>[apache#3374](PyGithub/PyGithub#3374)
&lt;https://github.com/PyGithub/PyGithub/pull/3374&gt;</code><em>)
(<code>b7a6d2324
&lt;https://github.com/PyGithub/PyGithub/commit/b7a6d2324&gt;</code></em>)</li>
<li>Improve OpenAPI apply properties and methods
(<code>[apache#3495](PyGithub/PyGithub#3495)
&lt;https://github.com/PyGithub/PyGithub/pull/3495&gt;</code>_)</li>
<li>Fix OpenAPI method verb detection
(<code>[apache#3496](PyGithub/PyGithub#3496)
&lt;https://github.com/PyGithub/PyGithub/pull/3496&gt;</code>_)</li>
<li>Add OpenAPI script tests
(<code>[apache#3489](PyGithub/PyGithub#3489)
&lt;https://github.com/PyGithub/PyGithub/pull/3489&gt;</code><em>)
(<code>09242d9b0
&lt;https://github.com/PyGithub/PyGithub/commit/09242d9b0&gt;</code></em>)</li>
<li>Fix OpenAPI apply method
(<code>[apache#3498](PyGithub/PyGithub#3498)
&lt;https://github.com/PyGithub/PyGithub/pull/3498&gt;</code><em>)
(<code>8f8697235
&lt;https://github.com/PyGithub/PyGithub/commit/8f8697235&gt;</code></em>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/5cdf6ab395c52efb652d0bc1f28fdf2e452b1b41"><code>5cdf6ab</code></a>
Release 2.10.0 (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3560">#3560</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/33071b35d01033f5c059c7db02806710a7819330"><code>33071b3</code></a>
Fix lazy retrieval of latest tag name (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3487">#3487</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/4f8674b724f9c0bbeac36a78cbf5f7fc577b9bf2"><code>4f8674b</code></a>
Fix OrganizationSecret.edit() to seal the value and use PUT (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3529">#3529</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/c63d09e261b627b3f8ce6777038ed818a86d73b4"><code>c63d09e</code></a>
docs: add example for uploading multiple files in a single commit (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3545">#3545</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/4785224bc5089d0fd7933367d7f9fc0171d2d8d8"><code>4785224</code></a>
Fix OAuth2 authorization <code>state</code> / <code>code_verifier</code>
parameters (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3440">#3440</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/134f38a63dbcf0161ecd7df30e398f24f14e9fad"><code>134f38a</code></a>
Allow creating custom property with values_editable_by param (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3548">#3548</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/5f707d64b86d63b66820ed3941785fa803476625"><code>5f707d6</code></a>
Fix <code>WorkflowRun</code> schema suggestion (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3559">#3559</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/82809291e065be02354a9673750a8ae35d363bdd"><code>8280929</code></a>
docs: add exception handling example (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3543">#3543</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/c15572f23aa4743efe4b1f88bd26ddfb0c46acf8"><code>c15572f</code></a>
Fix doubled slash in request path for <code>base_url</code> with
trailing slash (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3537">#3537</a>)</li>
<li><a
href="https://github.com/PyGithub/PyGithub/commit/162ce9d0ed69b9e4950c92e1896ab3539a9cba1a"><code>162ce9d</code></a>
Add <code>return_run_details</code> parameter to
<code>Workflow.create_dispatch</code> (<a
href="https://redirect.github.com/pygithub/pygithub/issues/3471">#3471</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pygithub/pygithub/compare/v2.9.1...v2.10.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pygithub&package-manager=uv&previous-version=2.9.1&new-version=2.10.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core Core DataFusion crate logical-expr Logical plan and expressions optimizer Optimizer rules physical-expr Changes to the physical-expr crates

5 participants