Doris-Breakwater commented on issue #68719: URL: https://github.com/apache/doris/issues/68719#issuecomment-5978346755
Breakwater-GitHub-Analysis-Slot: slot_f96fff56a738 **Assessment:** This is a credible, source-supported FE constant-folding inconsistency for `DOUBLE` signed zero. The supplied SQL results show `signbit(ceil(-0.5))` changing with the execution path. I reviewed the reported 4.1.4 source, but did not run a Doris cluster. **Mechanism verified in source:** Nereids evaluates `ceil(DoubleLiteral)` and `round(DoubleLiteral)` by converting the input to `BigDecimal`/`DecimalV3Literal`, rounding there, and converting the result back to `double` ([FE implementation](https://github.com/apache/doris/blob/4.1.4/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/NumericArithmetic.java#L363-L410), [decimal conversion](https://github.com/apache/doris/blob/4.1.4/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java#L88-L113)). That path loses the negative sign when the rounded value is zero. The FE `signbit` fold checks the double's raw sign bit ([source](https://github.com/apache/doris/blob/4.1.4/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/NumericArithmetic.java#L729-L734)), so it then returns false. For `DOUBLE`, BE dispatches `ceil` and `round` to floating-point math functions ([source ](https://github.com/apache/doris/blob/4.1.4/be/src/exprs/function/round.h#L245-L260)), which preserve `-0.0` for these inputs; BE `signbit` uses `std::signbit` ([source](https://github.com/apache/doris/blob/4.1.4/be/src/exprs/function/math.cpp#L784-L794)). A standalone Java `BigDecimal` check and local C `libm` check produced the corresponding opposite zero signs. `debug_skip_fold_constant` disables both FE and BE fold rules ([FE](https://github.com/apache/doris/blob/4.1.4/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java#L845-L852), [BE](https://github.com/apache/doris/blob/4.1.4/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java#L128-L140)), consistent with the reported comparison. **Suggested next step:** Align FE folding of `DOUBLE` rounding functions with BE signed-zero semantics, then add a regression that compares folded and unfolded `signbit(ceil(CAST(-0.5 AS DOUBLE)))` and `signbit(round(CAST(-0.4 AS DOUBLE)))`. Cover `-0.0`, positive zero, boundary values, and two-argument overloads where applicable, while keeping `DECIMAL` behavior separate. The existing `signbit` negative-zero regression covers direct literals, but not zero produced by rounding. **Missing information:** No logs or profile are needed to investigate this specific discrepancy. For release tracking, please confirm the exact FE/BE binary build: the reported `rc04` label is paired with commit `ad35a140c7f`, which corresponds to the local `4.1.4` tag; the relevant source files are identical between local `4.1.4-rc04` and `4.1.4` tags. -- 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]
