Search before asking
Version
4.1.4 (doris-4.1.4-rc04-ad35a140c7f), single FE + single BE
What's Wrong?
CAST(CAST(1e38 AS DOUBLE) AS LARGEINT) folds to 100000000000000000000000000000000000000 in FE and is 99999999999999997748809823456034029568 (the exact value of the double) in BE.
FE folding: 100000000000000000000000000000000000000. BE: 99999999999999997748809823456034029568.
SET enable_sql_cache = false
SELECT CAST(CAST(1e38 AS DOUBLE) AS LARGEINT) AS fe, CAST(d1 AS LARGEINT) AS be FROM t
+-----------------------------------------+----------------------------------------+
| fe | be |
+-----------------------------------------+----------------------------------------+
| 100000000000000000000000000000000000000 | 99999999999999997748809823456034029568 |
+-----------------------------------------+----------------------------------------+
SET debug_skip_fold_constant = true
SELECT CAST(CAST(1e38 AS DOUBLE) AS LARGEINT)
+----------------------------------------+
| CAST(CAST(1e38 AS DOUBLE) AS LARGEINT) |
+----------------------------------------+
| 99999999999999997748809823456034029568 |
+----------------------------------------+
- FE constant folding: all arguments are literals, so Nereids folds the call during planning. Check: EXPLAIN shows the literal in place of the call:
final projections: 100000000000000000000000000000000000000, CAST(d1[#1] AS largeint)
- BE execution: the arguments are columns (or
SET debug_skip_fold_constant = true), so BE computes the call. Check: EXPLAIN keeps the call.
What You Expected?
FE folding and BE give the same value.
How to Reproduce?
Deployment: single FE + single BE, default session variables.
CREATE TABLE t(id INT, d1 DOUBLE)
DISTRIBUTED BY HASH(id) BUCKETS 1 PROPERTIES('replication_num' = '1');
INSERT INTO t VALUES (1, 1e38);
SET enable_sql_cache = false;
SELECT CAST(CAST(1e38 AS DOUBLE) AS LARGEINT) AS fe, CAST(d1 AS LARGEINT) AS be FROM t;
SET debug_skip_fold_constant = true;
SELECT CAST(CAST(1e38 AS DOUBLE) AS LARGEINT);
Anything Else?
FE's FractionalLiteral builds new BigDecimal(value.toString()) from the shortest decimal string; BE truncates the binary value.
Found with AI assistance.
Are you willing to submit PR?
Code of Conduct
Search before asking
Version
4.1.4 (doris-4.1.4-rc04-ad35a140c7f), single FE + single BE
What's Wrong?
CAST(CAST(1e38 AS DOUBLE) AS LARGEINT)folds to 100000000000000000000000000000000000000 in FE and is 99999999999999997748809823456034029568 (the exact value of the double) in BE.FE folding:
100000000000000000000000000000000000000. BE:99999999999999997748809823456034029568.final projections: 100000000000000000000000000000000000000, CAST(d1[#1] AS largeint)SET debug_skip_fold_constant = true), so BE computes the call. Check: EXPLAIN keeps the call.What You Expected?
FE folding and BE give the same value.
How to Reproduce?
Deployment: single FE + single BE, default session variables.
Anything Else?
FE's
FractionalLiteralbuildsnew BigDecimal(value.toString())from the shortest decimal string; BE truncates the binary value.new BigDecimal(value.toString())CastToInt::from_floatFound with AI assistance.
Are you willing to submit PR?
Code of Conduct