pepijnve commented on issue #17158:
URL: https://github.com/apache/datafusion/issues/17158#issuecomment-3265646839
@alamb I had a quick look at the current implementation that handles this. I
believe this case is now handled by `ConstEvaluator`. If I'm reading the code
correctly the implementation currently does not take associativity into
account. You can see the same thing happening with integer addition for
instance:
```
> explain select c1 + 1 + 2 + c2 from t;
+---------------+---------------------------------------------------------------------------------+
| plan_type | plan
|
+---------------+---------------------------------------------------------------------------------+
| logical_plan | Projection: t.c1 + Int64(1) + Int64(2) + t.c2
|
| | TableScan: t projection=[c1, c2]
|
| physical_plan | ProjectionExec: expr=[c1@0 + 1 + 2 + c2@1 as t.c1 +
Int64(1) + Int64(2) + t.c2] |
| | DataSourceExec: partitions=1, partition_sizes=[1]
|
| |
|
+---------------+---------------------------------------------------------------------------------+
```
The current implementation of `ConstEvaluator` sees
```
+
+
+
c1
1
2
c2
```
Since each `BinaryOp` tree contains a column reference the entire tree gets
marked as `can_evaluate: false`.
In our current query engine implementation and optimiser I handled this case
by modelling an associativity property (and commutativity for a similar
canonicalisation rewrite rule) at the binary operator/function level. When
encountering a tree of identical associative operators, the operands of the
tree are collected into a list and then each subsequent pair of operands is
tested for const evaluation.
So for `c1 + 1 + 2 + c2`
```
+
+
+
c1
1
2
c2
```
becomes
```
+
c1, 1, 2, c2
```
which simplifies to
```
+
c1, 6, c2
```
and then gets expanded back to
```
+
+
c1
6
c2
```
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]