Closed
Labels
bugSomething isn't workingSomething isn't working
Description
Describe the bug
Decimals of different precisions and scales are properly rebased when working with Literal values. Otherwise, they are not rebased, which leads to an error.
To Reproduce
desktop % datafusion-cli
DataFusion CLI v46.0.0
> SELECT 1 * 1.000::DECIMAL(4,3) > 1.2::decimal(2,1);
+--------------------------------------+
| Int64(1) * Float64(1) > Float64(1.2) |
+--------------------------------------+
| false |
+--------------------------------------+
1 row(s) fetched.
Elapsed 0.003 seconds.
> SELECT a * 1.000::DECIMAL(4,3) > 1.2::decimal(2,1) FROM VALUES (1) AS t(a);
Arrow error: Invalid argument error: Invalid comparison operation: Decimal128(20, 0) > Decimal128(25, 3)
>
Expected behavior
No response
Additional context
No response
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Activity
Spaarsh commentedon Mar 12, 2025
From what I've gathered after investigating this, I think the problem lies in how the
sql_expr_to_logical_expris making a plan for evaluating such an expression.sql_expr_to_logical_expr makes a plan:
sql_expr_to_logical_exprbinary_opcalledbinarycalledbinary_numeric_coercioncalleddecimal_coercioncalledget_wider_decimalcalledFor the first case, the multiplication is done first and then the above flow is done. For the second query, the plan is made first, so the plan converts the decimals and then proceeds to multiply the left one which leads to a scale change in the left decimal. Hence the error.
I've deduced this from dry running this. I'll drop a comment once I go through the stack made by
sql_expr_to_logical_expr.