linrrzqqq opened a new pull request, #64907: URL: https://github.com/apache/doris/pull/64907
Problem Summary:
`MAKE_SET` uses `bit &= ~(1 << pos)` for clearing bits at high positions in
the FE constant folding path, which leads to incorrect clearing of high bits
when `pos >= 32` due to integer shift modulo.
For Java `int` shifts, the shift distance is masked with 0x1F, which means
only the low 5 bits are used:
- `pos = 0..31` -> normal
- `pos = 32` -> treated as `0`
- `pos = 33` -> treated as `1`
- `pos = 64` -> treated as `0` again
For inputs like: `MAKE_SET(4294967296, ...)`(4294967296 == 1L << 32)
expect: `bit &= ~(1 << 32)`
got: `bit &= ~(1 << 0)`
That does **not** clear bit 32 at all. So:
- `bit` stays unchanged and `pos` stays 32
- the loop never makes progress
- the same string is appended again and again
- Java throws OutOfMemoryError: Java heap space
before(FE constant folding failed or FE OOM):
```text
Doris> EXPLAIN SELECT MAKE_SET(4294967296,
-> 'a00', 'a01', 'a02', 'a03', 'a04', 'a05', 'a06', 'a07',
-> 'a08', 'a09', 'a10', 'a11', 'a12', 'a13', 'a14', 'a15',
-> 'a16', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23',
-> 'a24', 'a25', 'a26', 'a27', 'a28', 'a29', 'a30', 'a31',
-> 'a32', 'a33') AS ms;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Explain String(Nereids Planner)
|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PLAN FRAGMENT 0
|
| OUTPUT EXPRS:
|
| ms[#0]
|
| PARTITION: UNPARTITIONED
|
|
|
| HAS_COLO_PLAN_NODE: false
|
|
|
| VRESULT SINK
|
| MYSQL_PROTOCOL
|
|
|
| 0:VUNION(11)
|
| constant exprs:
|
| make_set(4294967296, 'a00', 'a01', 'a02', 'a03', 'a04', 'a05',
'a06', 'a07', 'a08', 'a09', 'a10', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16',
'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27',
'a28', 'a29', 'a30', 'a31', 'a32', 'a33') |
|
|
|
|
|
|
| ========== STATISTICS ==========
|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
17 rows in set (28.822 sec)
```
```text
2026-06-26 23:27:50,285 INFO (mysql-nio-pool-0|303)
[StmtExecutor.executeByNereids():821] Command(EXPLAIN SELECT
MAKE_SET(4294967296,
'a00', 'a01', 'a02', 'a03', 'a04', 'a05', 'a06', 'a07', 'a08', 'a09',
'a10', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a17', 'a
18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27',
'a28', 'a29', 'a30', 'a31', 'a32', 'a33') AS ms) process fail
ed.
org.apache.doris.nereids.exceptions.AnalysisException: Nereids cost too much
time (32s > 30s). You should increment timeout by set 'nerei
ds_timeout_second' or disable check timeout by set 'enable_nereids_timeout'
to false. Time consuming details, parse time: 6ms, plan time:
{"plan":-1,"garbage_collect":-1,"lock_tables":0,"analyze":2,"rewrite":-1,"fold_const_by_be":0,"collect_partitions":-1,"optimize":-1,"tra
nslate":-1,"init_scan_node":-1,"finalize_scan_node":-1,"create_scan_range":-1,"distribute":-1}
```
now:
```text
Doris> SET debug_skip_fold_constant = 0;
Doris> EXPLAIN SELECT MAKE_SET(4294967296,
-> 'a00', 'a01', 'a02', 'a03', 'a04', 'a05', 'a06', 'a07',
-> 'a08', 'a09', 'a10', 'a11', 'a12', 'a13', 'a14', 'a15',
-> 'a16', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23',
-> 'a24', 'a25', 'a26', 'a27', 'a28', 'a29', 'a30', 'a31',
-> 'a32', 'a33') AS ms;
+----------------------------------+
| Explain String(Nereids Planner) |
+----------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS: |
| ms[#0] |
| PARTITION: UNPARTITIONED |
| |
| HAS_COLO_PLAN_NODE: false |
| |
| VRESULT SINK |
| MYSQL_PROTOCOL |
| |
| 0:VUNION(12) |
| constant exprs: |
| 'a32' |
| |
| |
| |
| ========== STATISTICS ========== |
+----------------------------------+
```
--
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]
