You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@datafusion.apache.org by "adriangb (via GitHub)" <gi...@apache.org> on 2026/09/17 15:51:59 UTC
[I] Wrong results: leaf expression pushdown removes a computed column that has the same name as its input column [datafusion]
adriangb opened a new issue, #25414:
URL: https://github.com/apache/datafusion/issues/25414
### Describe the bug
DataFusion returns incorrect values when a query reads a struct field from a subquery, and the subquery also computes a column with the same name as a table column. The optimizer removes the computation and keeps the original table column.
This occurs with the default configuration. It is not a planning error: the query completes and shows incorrect data. If the computation changes the data type, the query fails with an internal error.
The setting `datafusion.optimizer.enable_leaf_expression_pushdown` controls the optimizer rules that cause the problem. When you set it to `false`, the results are correct.
### To Reproduce
Use `datafusion-cli` on `main` (22f9a92178):
```sql
create table t(a int, s struct<b varchar>) as values (1, {b: 'x'});
-- 1. Filter in the subquery
select a, s['b'] from (select -a as a, s from t where a > 0);
-- 2. Limit in the subquery
select a, s['b'] from (select -a as a, s from t limit 10);
-- 3. Limit in the subquery, and the computation changes the type (Int32 -> Int64)
select a, s['b'] from (select a * 10 as a, s from t limit 10);
```
| Query | DataFusion | DuckDB 1.5.2 | PostgreSQL 17.6 |
|---|---|---|---|
| 1 | `1, x` | `-1, x` | `-1, x` |
| 2 | `1, x` | `-1, x` | `-1, x` |
| 3 | internal error (see below) | `10, x` | `10, x` |
For PostgreSQL, I used a composite type (`create type st1 as (b text)`) and `(s).b` in place of `s['b']`. The queries are otherwise the same.
With `set datafusion.optimizer.enable_leaf_expression_pushdown = false;`, DataFusion returns `-1, x`, `-1, x` and `10, x`.
The plan of query 1 shows that the negation is not there. The top projection reads `t.a` directly:
```
Projection: t.a AS a, __datafusion_extracted_1 AS t.s[b]
Filter: t.a > Int32(0)
Projection: get_field(t.s, Utf8("b")) AS __datafusion_extracted_1, t.a
TableScan: t projection=[a, s]
```
The plan of query 2 has the same problem:
```
Projection: t.a AS a, __datafusion_extracted_1 AS t.s[b]
Limit: skip=0, fetch=10
Projection: get_field(t.s, Utf8("b")) AS __datafusion_extracted_1, t.a
TableScan: t projection=[a, s], fetch=10
```
Query 3 fails because the schema check after the rule finds the type change:
```
Error: Optimizer rule 'push_down_leaf_projections' failed
caused by
Check optimizer-specific invariants after optimizer rule: push_down_leaf_projections
caused by
Internal error: Assertion failed: compatible: Failed due to a difference in schemas: original schema: DFSchema { inner: Schema { fields: [Field { name: "a", data_type: Int64, ... }, Field { name: "t.s[b]", data_type: Utf8View, ... }] ... }, new schema: DFSchema { inner: Schema { fields: [Field { name: "a", data_type: Int32, ... }, Field { name: "t.s[b]", data_type: Utf8View, ... }] ... }.
```
A larger example with CTEs gives the same incorrect result:
```sql
create table t1(a int, b int, s struct<a int, b varchar>) as values
(0, 1, {a: 1, b: 'x'}), (0, 2, {a: 2, b: 'y'}), (0, 3, {a: 3, b: 'z'}),
(2, 4, {a: 4, b: 'w'}), (2, 5, {a: 5, b: 'v'});
with src as (select a + a as a, b, s from t1),
l as (select a as b, s from (select * from src limit 100))
select b, count(s['b']) from l group by b order by b;
```
DataFusion returns `(0, 3), (2, 2)`. DuckDB and PostgreSQL return `(0, 3), (4, 2)`.
### Expected behavior
DataFusion returns the same results as when `enable_leaf_expression_pushdown` is `false`. The computed column (`-a`, `a * 10`, `a + a`) stays in the plan above the table column.
### Additional context
The rules are `ExtractLeafExpressions` and `PushDownLeafProjections` in `datafusion/optimizer/src/extract_leaf_expressions.rs`. The problem occurs when the extraction projection for `s['b']` moves through a projection that has an output column with the same name as one of its input columns (`-t.a AS a`). I did not find the root cause. Possibly, the rules resolve columns by name, and thus the reference to the computed `a` becomes a reference to the input column `t.a`.
Related, but not the same problem:
- https://github.com/apache/datafusion/pull/25412 fixes a planning error ("ambiguous" schema) in the same merge function. It does not fix this problem. Before that change, some queries of this shape failed with the planning error. With that change, they complete and show this problem.
- https://github.com/apache/datafusion/pull/25388 changes how these rules place `BinaryExpr` and similar expressions. Test this problem again after it merges.
- https://github.com/apache/datafusion/issues/24678 was also a wrong-results problem in these rules (a volatile expression evaluated two times). It is fixed.
A random test of plans and SQL found this problem.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org
Re: [I] Wrong results: leaf expression pushdown removes a computed column that has the same name as its input column [datafusion]
Posted by "adriangb (via GitHub)" <gi...@apache.org>.
adriangb closed issue #25414: Wrong results: leaf expression pushdown removes a computed column that has the same name as its input column
URL: https://github.com/apache/datafusion/issues/25414
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org