Skip to content

[feature](scan) Add value predicate pushdown control for MOR tables#60513

Open
dataroaring wants to merge 3 commits intomasterfrom
mor_value_predicate_pushdown_control
Open

[feature](scan) Add value predicate pushdown control for MOR tables#60513
dataroaring wants to merge 3 commits intomasterfrom
mor_value_predicate_pushdown_control

Conversation

@dataroaring
Copy link
Contributor

@dataroaring dataroaring commented Feb 4, 2026

Summary

  • Add session variable enable_mor_value_predicate_pushdown_tables to control value column predicate pushdown for MOR (Merge-On-Read) tables
  • FE: session variable with table-list matching (db.table, table, or *), thrift flag on TOlapScanNode, isMorTable() helper on OlapTable
  • BE: propagate flag through scan operator → tablet reader → rowset reader; extend _should_push_down_value_predicates() for all rowsets; skip __DORIS_DELETE_SIGN__ to preserve delete correctness; keep VExpr in conjuncts as post-merge safety net

Motivation

MOR tables with inverted indexes on value columns cannot utilize those indexes for filtering because value predicates are not pushed to the storage layer. This feature enables per-segment value predicate pushdown for dedup-only/insert-only MOR workloads where the same key always carries identical values across rowsets, allowing inverted indexes and zone maps to filter data early.

Design

Two-layer predicate approach:

  1. ColumnPredicate (storage layer): pushed per-segment for early filtering via inverted index, zone map, bloom filter
  2. VExpr (compute layer): retained in _conjuncts as post-merge safety net

Delete sign handling: __DORIS_DELETE_SIGN__ predicate is excluded from per-segment pushdown to prevent delete markers from being filtered before merge, which would cause deleted rows to reappear.

Test plan

  • Test 1: Basic session variable matching (table name, db.table, wildcard, not-in-list)
  • Test 2: Dedup-only pattern with multiple overlapping rowsets
  • Test 3: Dedup + row-level delete via INSERT INTO (..., __DORIS_DELETE_SIGN__) VALUES (..., 1)
  • Test 4: Dedup + delete predicate via DELETE FROM ... WHERE
  • Test 5: Multiple tables in session variable list
  • Test 6: MOW table (unaffected by setting)
  • Test 7: DUP_KEYS table (unaffected by setting)

Copilot AI review requested due to automatic review settings February 4, 2026 17:33
@Thearas
Copy link
Contributor

Thearas commented Feb 4, 2026

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch 2 times, most recently from fffa13a to 94bc596 Compare February 4, 2026 17:43
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a session variable to control value column predicate pushdown for MOR (Merge-On-Read) tables, allowing users to selectively enable this optimization per table or globally.

Changes:

  • Added session variable enable_mor_value_predicate_pushdown_tables for selective table-level control
  • Added isMorTable() helper method to identify MOR tables (UNIQUE_KEYS without merge-on-write)
  • Modified predicate pushdown logic to support value predicates on MOR tables when enabled

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
gensrc/thrift/PlanNodes.thrift Added optional boolean field enable_mor_value_predicate_pushdown to TOlapScanNode struct
fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java Added session variable declaration, getter, and helper method to check if MOR value predicate pushdown is enabled
fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java Added isMorTable() helper method to identify MOR tables
fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java Set thrift flag in toThrift() based on table type and session variable
be/src/pipeline/exec/scan_operator.h Added virtual method _should_push_down_mor_value_predicate() with default false implementation
be/src/pipeline/exec/scan_operator.cpp Modified predicate pushdown condition to include MOR value predicate check
be/src/pipeline/exec/olap_scan_operator.h Declared override for _should_push_down_mor_value_predicate()
be/src/pipeline/exec/olap_scan_operator.cpp Implemented _should_push_down_mor_value_predicate() to read thrift flag

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.


// Set MOR value predicate pushdown flag based on session variable
if (olapTable.isMorTable() && ConnectContext.get() != null) {
String dbName = olapTable.getQualifiedDbName();
Copy link

Copilot AI Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Potential null pointer exception. The method getQualifiedDbName() can return null (as seen in Table.java line 367-369). This null value would then be passed to isMorValuePredicatePushdownEnabled() which concatenates it with the table name on line 4691, potentially resulting in "null.tableName". Consider adding a null check for dbName or using an alternative method like getDBName() which handles the null case.

Suggested change
String dbName = olapTable.getQualifiedDbName();
String dbName = olapTable.getQualifiedDbName();
if (dbName == null) {
dbName = olapTable.getDBName();
}

Copilot uses AI. Check for mistakes.
String trimmed = enableMorValuePredicatePushdownTables.trim();
if ("*".equals(trimmed)) {
return true;
}
Copy link

Copilot AI Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The method doesn't handle null dbName parameter. If dbName is null, line 4691 will create "null.tableName" which could lead to unexpected behavior. Consider adding a null check for dbName at the beginning of the method, or using Objects.requireNonNull() to fail fast, or handle the null case explicitly by using only tableName for comparison when dbName is null.

Suggested change
}
}
// When dbName is null, only compare using tableName to avoid creating "null.tableName".
if (dbName == null) {
for (String table : trimmed.split(",")) {
if (table.trim().equalsIgnoreCase(tableName)) {
return true;
}
}
return false;
}

Copilot uses AI. Check for mistakes.
Comment on lines 4682 to 4699
public boolean isMorValuePredicatePushdownEnabled(String dbName, String tableName) {
if (enableMorValuePredicatePushdownTables == null
|| enableMorValuePredicatePushdownTables.isEmpty()) {
return false;
}
String trimmed = enableMorValuePredicatePushdownTables.trim();
if ("*".equals(trimmed)) {
return true;
}
String fullName = dbName + "." + tableName;
for (String table : trimmed.split(",")) {
if (table.trim().equalsIgnoreCase(fullName)
|| table.trim().equalsIgnoreCase(tableName)) {
return true;
}
}
return false;
}
Copy link

Copilot AI Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new session variable and its helper method isMorValuePredicatePushdownEnabled() lack test coverage. Consider adding unit tests in SessionVariablesTest to verify:

  1. Empty string handling (default behavior)
  2. Wildcard '*' behavior
  3. Single table name matching (with and without database prefix)
  4. Multiple table names (comma-separated)
  5. Case-insensitive matching
  6. Whitespace handling in table names
  7. Edge cases like null dbName parameter

Copilot uses AI. Check for mistakes.
Comment on lines +4693 to +4694
if (table.trim().equalsIgnoreCase(fullName)
|| table.trim().equalsIgnoreCase(tableName)) {
Copy link

Copilot AI Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The method doesn't handle edge cases well when splitting by comma. If the variable contains only commas or has consecutive commas (e.g., "db.table1,,db.table2"), the split operation will produce empty strings. Calling trim() on empty strings and comparing them could lead to false positives. Consider filtering out empty strings after trimming, or using a more robust parsing approach.

Suggested change
if (table.trim().equalsIgnoreCase(fullName)
|| table.trim().equalsIgnoreCase(tableName)) {
String normalized = table.trim();
if (normalized.isEmpty()) {
continue;
}
if (normalized.equalsIgnoreCase(fullName)
|| normalized.equalsIgnoreCase(tableName)) {

Copilot uses AI. Check for mistakes.
@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch from 94bc596 to 8eadc41 Compare February 4, 2026 17:46
@dataroaring
Copy link
Contributor Author

run buildall

@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch from 8eadc41 to 4a5d300 Compare February 4, 2026 18:17
@dataroaring
Copy link
Contributor Author

run buildall

@hello-stephen
Copy link
Contributor

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.29% (1792/2260)
Line Coverage 64.74% (31826/49158)
Region Coverage 65.42% (15884/24280)
Branch Coverage 55.95% (8436/15078)

@doris-robot
Copy link

TPC-H: Total hot run time: 31991 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 4a5d300b0d5cc30010a29223454252523fcdd336, data reload: false

------ Round 1 ----------------------------------
q1	17641	5168	5056	5056
q2	2008	315	238	238
q3	10189	1317	750	750
q4	10204	825	325	325
q5	7542	2159	1895	1895
q6	195	182	151	151
q7	868	757	597	597
q8	9268	1425	1052	1052
q9	5292	4925	4820	4820
q10	6815	1963	1560	1560
q11	524	289	281	281
q12	368	365	222	222
q13	17791	4077	3239	3239
q14	235	232	215	215
q15	905	837	813	813
q16	676	680	622	622
q17	668	815	430	430
q18	6787	6502	7583	6502
q19	1207	1118	677	677
q20	393	381	251	251
q21	2920	2340	1988	1988
q22	374	325	307	307
Total cold run time: 102870 ms
Total hot run time: 31991 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5678	5528	5456	5456
q2	264	345	277	277
q3	2455	2869	2512	2512
q4	1443	1887	1388	1388
q5	4766	4425	4692	4425
q6	218	188	133	133
q7	2047	1968	1805	1805
q8	2556	2394	2325	2325
q9	7387	7608	7560	7560
q10	2838	3097	2670	2670
q11	557	475	462	462
q12	675	706	548	548
q13	3496	4070	3245	3245
q14	274	288	272	272
q15	839	813	779	779
q16	630	681	633	633
q17	1084	1239	1294	1239
q18	7568	7457	7374	7374
q19	811	816	807	807
q20	1968	2095	1879	1879
q21	4541	4205	4144	4144
q22	586	535	492	492
Total cold run time: 52681 ms
Total hot run time: 50425 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 28.16 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 4a5d300b0d5cc30010a29223454252523fcdd336, data reload: false

query1	0.06	0.04	0.04
query2	0.13	0.07	0.07
query3	0.30	0.07	0.08
query4	1.60	0.10	0.10
query5	0.26	0.25	0.25
query6	1.14	0.65	0.64
query7	0.03	0.03	0.03
query8	0.08	0.06	0.07
query9	0.58	0.50	0.50
query10	0.55	0.54	0.55
query11	0.26	0.14	0.13
query12	0.26	0.13	0.14
query13	0.63	0.61	0.60
query14	0.99	0.99	0.98
query15	0.92	0.83	0.83
query16	0.39	0.38	0.40
query17	1.00	1.00	1.01
query18	0.24	0.23	0.23
query19	1.81	1.87	1.83
query20	0.02	0.02	0.02
query21	15.41	0.33	0.29
query22	4.97	0.13	0.12
query23	15.38	0.44	0.27
query24	2.25	0.57	0.41
query25	0.11	0.11	0.10
query26	0.20	0.18	0.18
query27	0.11	0.10	0.11
query28	3.62	1.15	0.98
query29	12.51	4.04	3.29
query30	0.33	0.13	0.13
query31	2.80	0.68	0.45
query32	3.23	0.64	0.49
query33	3.09	3.05	3.04
query34	16.11	5.06	4.42
query35	4.44	4.47	4.42
query36	0.62	0.51	0.50
query37	0.31	0.09	0.09
query38	0.27	0.06	0.06
query39	0.08	0.05	0.05
query40	0.21	0.16	0.17
query41	0.13	0.08	0.07
query42	0.09	0.05	0.06
query43	0.09	0.07	0.06
Total cold run time: 97.61 s
Total hot run time: 28.16 s

@hello-stephen
Copy link
Contributor

FE UT Coverage Report

Increment line coverage 4.76% (1/21) 🎉
Increment coverage report
Complete coverage report

@hello-stephen
Copy link
Contributor

BE UT Coverage Report

Increment line coverage 25.00% (2/8) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.55% (19369/36856)
Line Coverage 36.04% (179897/499203)
Region Coverage 32.39% (139423/430406)
Branch Coverage 33.40% (60395/180802)

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 87.50% (7/8) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 71.60% (25862/36120)
Line Coverage 54.26% (270210/498008)
Region Coverage 51.85% (225458/434822)
Branch Coverage 53.25% (96668/181532)

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 71.43% (15/21) 🎉
Increment coverage report
Complete coverage report

…own for MOR tables

Add a new session variable `enable_mor_value_predicate_pushdown_tables` to allow
users to selectively enable value column predicate pushdown for MOR (Merge-On-Read)
tables. This can improve query performance by utilizing inverted indexes on value
columns for filtering.

The session variable accepts:
- Comma-separated table names: `db1.tbl1,db2.tbl2`
- Wildcard for all MOR tables: `*`
- Empty string to disable (default)

Changes:
- Add session variable in SessionVariable.java with helper method
- Add isMorTable() helper in OlapTable.java
- Add Thrift field enable_mor_value_predicate_pushdown in TOlapScanNode
- Set flag in OlapScanNode.toThrift() based on session variable
- Add virtual method _should_push_down_mor_value_predicate() in scan_operator
- Implement override in olap_scan_operator to read the flag
- Modify predicate pushdown condition in scan_operator.cpp
@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch from 4a5d300 to a06783e Compare February 5, 2026 00:04
@dataroaring dataroaring changed the title [feature](scan) Add session variable to control value predicate pushdown for MOR tables [feature](scan) Add value predicate pushdown control for MOR tables Feb 5, 2026
@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch 3 times, most recently from a0385a9 to 7d4aa18 Compare February 5, 2026 01:30
@dataroaring
Copy link
Contributor Author

run buildall

@doris-robot
Copy link

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.29% (1792/2260)
Line Coverage 64.74% (31827/49158)
Region Coverage 65.43% (15886/24280)
Branch Coverage 55.94% (8434/15078)

@hello-stephen
Copy link
Contributor

FE UT Coverage Report

Increment line coverage 4.76% (1/21) 🎉
Increment coverage report
Complete coverage report

@doris-robot
Copy link

TPC-H: Total hot run time: 31169 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 7d4aa18ff98daf6854720549735e19260aa7d84d, data reload: false

------ Round 1 ----------------------------------
q1	17639	4609	4340	4340
q2	2058	366	228	228
q3	10457	1369	738	738
q4	10332	841	311	311
q5	9262	2214	1892	1892
q6	204	179	144	144
q7	877	746	600	600
q8	9270	1566	1061	1061
q9	5426	4911	4782	4782
q10	6854	1978	1586	1586
q11	523	296	281	281
q12	382	380	221	221
q13	17800	4075	3275	3275
q14	232	248	218	218
q15	897	825	800	800
q16	695	688	658	658
q17	778	803	485	485
q18	6840	6538	6615	6538
q19	1386	1003	634	634
q20	382	356	249	249
q21	2642	2151	1848	1848
q22	359	311	280	280
Total cold run time: 105295 ms
Total hot run time: 31169 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4458	4339	4372	4339
q2	260	337	245	245
q3	2142	2620	2287	2287
q4	1321	1753	1325	1325
q5	4347	4176	4225	4176
q6	214	178	133	133
q7	1878	2259	1874	1874
q8	2568	2431	2476	2431
q9	7486	7619	7579	7579
q10	2910	3114	2668	2668
q11	533	470	449	449
q12	697	805	687	687
q13	3894	4481	3587	3587
q14	290	322	300	300
q15	894	848	832	832
q16	715	746	679	679
q17	1201	1327	1421	1327
q18	8384	7965	7783	7783
q19	914	864	832	832
q20	2081	2144	2009	2009
q21	4913	4185	4112	4112
q22	601	539	496	496
Total cold run time: 52701 ms
Total hot run time: 50150 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 28.05 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 7d4aa18ff98daf6854720549735e19260aa7d84d, data reload: false

query1	0.06	0.05	0.05
query2	0.13	0.07	0.08
query3	0.31	0.07	0.07
query4	1.60	0.10	0.10
query5	0.25	0.26	0.24
query6	1.14	0.65	0.64
query7	0.03	0.02	0.02
query8	0.08	0.06	0.06
query9	0.58	0.50	0.48
query10	0.55	0.56	0.55
query11	0.27	0.13	0.13
query12	0.26	0.14	0.15
query13	0.63	0.61	0.60
query14	0.98	0.98	0.99
query15	0.91	0.82	0.82
query16	0.39	0.39	0.40
query17	1.06	1.06	1.02
query18	0.25	0.22	0.22
query19	1.96	1.82	1.85
query20	0.02	0.01	0.02
query21	15.39	0.33	0.29
query22	4.97	0.11	0.11
query23	15.38	0.44	0.28
query24	2.39	0.56	0.41
query25	0.12	0.10	0.10
query26	0.20	0.18	0.18
query27	0.10	0.11	0.11
query28	3.69	1.16	0.98
query29	12.53	4.03	3.29
query30	0.32	0.13	0.10
query31	2.81	0.69	0.43
query32	3.23	0.63	0.50
query33	3.07	3.05	3.04
query34	16.42	5.06	4.43
query35	4.44	4.40	4.47
query36	0.60	0.49	0.49
query37	0.30	0.09	0.08
query38	0.28	0.05	0.06
query39	0.08	0.05	0.05
query40	0.20	0.16	0.16
query41	0.14	0.06	0.06
query42	0.09	0.06	0.05
query43	0.06	0.07	0.05
Total cold run time: 98.27 s
Total hot run time: 28.05 s

@hello-stephen
Copy link
Contributor

BE UT Coverage Report

Increment line coverage 30.00% (6/20) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.55% (19369/36860)
Line Coverage 36.03% (179893/499238)
Region Coverage 32.38% (139366/430442)
Branch Coverage 33.40% (60395/180828)

@dataroaring
Copy link
Contributor Author

run buildall

@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch from b0aa80e to 4fbb3a0 Compare February 9, 2026 06:07
@dataroaring
Copy link
Contributor Author

run buildall

@hello-stephen
Copy link
Contributor

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.35% (1795/2262)
Line Coverage 64.84% (31947/49269)
Region Coverage 65.52% (15936/24323)
Branch Coverage 56.04% (8470/15114)

@doris-robot
Copy link

TPC-H: Total hot run time: 30437 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 4fbb3a0b4c48c2f408b54d9b7a1c26e601f0f1c4, data reload: false

------ Round 1 ----------------------------------
q1	17603	4493	4306	4306
q2	2059	350	228	228
q3	10157	1300	720	720
q4	10203	794	309	309
q5	7540	2210	1937	1937
q6	192	178	147	147
q7	883	733	597	597
q8	9284	1388	1183	1183
q9	4851	4687	4657	4657
q10	6824	1965	1557	1557
q11	542	296	299	296
q12	359	378	221	221
q13	17804	4058	3247	3247
q14	237	231	223	223
q15	910	815	803	803
q16	709	674	622	622
q17	715	817	532	532
q18	6955	5869	5697	5697
q19	1239	988	635	635
q20	502	492	389	389
q21	2633	1839	1853	1839
q22	366	332	292	292
Total cold run time: 102567 ms
Total hot run time: 30437 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4372	4397	4380	4380
q2	253	339	254	254
q3	2106	2709	2203	2203
q4	1395	1756	1299	1299
q5	4329	4239	4347	4239
q6	218	173	135	135
q7	1861	1742	1660	1660
q8	2653	2573	2444	2444
q9	7743	7426	7511	7426
q10	2900	3247	2602	2602
q11	569	481	479	479
q12	702	723	607	607
q13	3952	4429	3683	3683
q14	299	310	290	290
q15	882	818	812	812
q16	650	702	673	673
q17	1133	1353	1369	1353
q18	8368	7988	7943	7943
q19	902	939	928	928
q20	2083	2141	2007	2007
q21	4772	4883	4506	4506
q22	609	601	522	522
Total cold run time: 52751 ms
Total hot run time: 50445 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 28.26 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 4fbb3a0b4c48c2f408b54d9b7a1c26e601f0f1c4, data reload: false

query1	0.05	0.05	0.04
query2	0.14	0.07	0.06
query3	0.31	0.07	0.07
query4	1.60	0.10	0.10
query5	0.27	0.24	0.25
query6	1.14	0.65	0.64
query7	0.04	0.03	0.03
query8	0.08	0.06	0.07
query9	0.58	0.51	0.51
query10	0.54	0.54	0.56
query11	0.27	0.13	0.14
query12	0.26	0.14	0.15
query13	0.62	0.61	0.61
query14	0.99	0.97	0.98
query15	0.93	0.84	0.81
query16	0.39	0.38	0.37
query17	1.06	1.02	1.02
query18	0.25	0.23	0.24
query19	1.94	1.85	1.86
query20	0.02	0.02	0.02
query21	15.39	0.35	0.30
query22	4.96	0.12	0.13
query23	15.36	0.45	0.29
query24	2.53	0.58	0.39
query25	0.11	0.11	0.11
query26	0.20	0.18	0.18
query27	0.12	0.11	0.11
query28	3.52	1.16	1.00
query29	12.53	4.10	3.23
query30	0.35	0.14	0.11
query31	2.81	0.72	0.46
query32	3.24	0.63	0.51
query33	3.05	3.03	3.02
query34	16.23	5.07	4.46
query35	4.57	4.50	4.52
query36	0.62	0.50	0.50
query37	0.31	0.09	0.09
query38	0.28	0.05	0.06
query39	0.07	0.05	0.05
query40	0.22	0.18	0.17
query41	0.14	0.07	0.07
query42	0.08	0.04	0.06
query43	0.07	0.06	0.06
Total cold run time: 98.24 s
Total hot run time: 28.26 s

@hello-stephen
Copy link
Contributor

FE UT Coverage Report

Increment line coverage 44.23% (23/52) 🎉
Increment coverage report
Complete coverage report

@doris-robot
Copy link

BE UT Coverage Report

Increment line coverage 25.00% (6/24) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.72% (19445/36881)
Line Coverage 36.21% (181017/499861)
Region Coverage 32.60% (140551/431146)
Branch Coverage 33.62% (60876/181057)

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (24/24) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 71.79% (25942/36137)
Line Coverage 54.37% (271096/498623)
Region Coverage 51.65% (224945/435528)
Branch Coverage 53.22% (96739/181761)

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 75.00% (39/52) 🎉
Increment coverage report
Complete coverage report

@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch 2 times, most recently from 0e91aeb to 12559a6 Compare February 9, 2026 17:20
@dataroaring
Copy link
Contributor Author

run buildall

@hello-stephen
Copy link
Contributor

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.35% (1795/2262)
Line Coverage 64.86% (31955/49269)
Region Coverage 65.56% (15946/24323)
Branch Coverage 56.08% (8476/15114)

@doris-robot
Copy link

TPC-H: Total hot run time: 30303 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 12559a607af30dfe4c4ee2366cfef79a4500b311, data reload: false

------ Round 1 ----------------------------------
q1	17664	4625	4388	4388
q2	2003	352	234	234
q3	10463	1312	735	735
q4	10342	777	308	308
q5	9123	2246	1913	1913
q6	199	179	143	143
q7	886	751	599	599
q8	9263	1456	1104	1104
q9	4895	4621	4619	4619
q10	6865	1962	1562	1562
q11	500	299	296	296
q12	400	382	230	230
q13	17805	4108	3235	3235
q14	234	237	220	220
q15	901	825	803	803
q16	687	686	618	618
q17	700	857	493	493
q18	6517	5748	5821	5748
q19	1145	1006	610	610
q20	498	488	379	379
q21	2578	1848	1782	1782
q22	353	310	284	284
Total cold run time: 104021 ms
Total hot run time: 30303 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4408	4341	4393	4341
q2	268	352	254	254
q3	2097	2723	2228	2228
q4	1364	1735	1328	1328
q5	4316	4200	4283	4200
q6	214	181	136	136
q7	1846	1767	1682	1682
q8	2791	2548	2440	2440
q9	7669	7537	7464	7464
q10	2907	3134	2617	2617
q11	562	472	460	460
q12	685	747	620	620
q13	3813	4527	3637	3637
q14	302	308	292	292
q15	848	827	792	792
q16	680	769	698	698
q17	1235	1405	1424	1405
q18	8332	8061	7677	7677
q19	901	865	834	834
q20	2063	2064	1862	1862
q21	4649	4245	4188	4188
q22	569	544	520	520
Total cold run time: 52519 ms
Total hot run time: 49675 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 28.25 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 12559a607af30dfe4c4ee2366cfef79a4500b311, data reload: false

query1	0.05	0.04	0.04
query2	0.14	0.08	0.07
query3	0.30	0.07	0.08
query4	1.60	0.09	0.10
query5	0.27	0.25	0.24
query6	1.15	0.65	0.65
query7	0.04	0.03	0.02
query8	0.07	0.07	0.07
query9	0.59	0.50	0.50
query10	0.54	0.55	0.55
query11	0.25	0.13	0.14
query12	0.26	0.14	0.14
query13	0.62	0.61	0.61
query14	0.98	0.98	0.99
query15	0.91	0.82	0.81
query16	0.38	0.40	0.43
query17	1.00	1.02	1.01
query18	0.25	0.23	0.23
query19	1.98	1.85	1.85
query20	0.02	0.01	0.02
query21	15.40	0.34	0.30
query22	4.89	0.12	0.13
query23	15.33	0.47	0.29
query24	2.37	0.58	0.38
query25	0.12	0.11	0.11
query26	0.19	0.18	0.18
query27	0.11	0.12	0.10
query28	3.61	1.16	0.98
query29	12.51	4.13	3.27
query30	0.34	0.12	0.12
query31	2.79	0.69	0.45
query32	3.22	0.62	0.50
query33	3.06	3.08	3.11
query34	16.33	5.02	4.45
query35	4.52	4.43	4.43
query36	0.61	0.49	0.48
query37	0.32	0.09	0.09
query38	0.28	0.06	0.06
query39	0.07	0.05	0.05
query40	0.20	0.18	0.17
query41	0.14	0.07	0.07
query42	0.09	0.05	0.05
query43	0.07	0.05	0.05
Total cold run time: 97.97 s
Total hot run time: 28.25 s

@hello-stephen
Copy link
Contributor

BE UT Coverage Report

Increment line coverage 25.00% (6/24) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.75% (19454/36883)
Line Coverage 36.21% (181024/499921)
Region Coverage 32.56% (140404/431191)
Branch Coverage 33.62% (60869/181073)

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 75.00% (18/24) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 57.43% (20754/36139)
Line Coverage 40.36% (201284/498683)
Region Coverage 37.04% (161336/435573)
Branch Coverage 37.80% (68708/181777)

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 88.46% (46/52) 🎉
Increment coverage report
Complete coverage report

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 75.00% (18/24) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 57.43% (20754/36139)
Line Coverage 40.36% (201284/498683)
Region Coverage 37.04% (161336/435573)
Branch Coverage 37.80% (68708/181777)

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 88.46% (46/52) 🎉
Increment coverage report
Complete coverage report

…OR tables without merge

Add a per-table session variable that allows reading MOR (Merge-On-Read)
UNIQUE tables as DUP tables, skipping storage engine merge and delete
sign filter while still honoring delete predicates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@dataroaring dataroaring force-pushed the mor_value_predicate_pushdown_control branch from 12559a6 to dbfbb49 Compare February 10, 2026 03:38
@dataroaring
Copy link
Contributor Author

run buildall

@hello-stephen
Copy link
Contributor

FE UT Coverage Report

Increment line coverage 44.23% (23/52) 🎉
Increment coverage report
Complete coverage report

@doris-robot
Copy link

TPC-H: Total hot run time: 30394 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit dbfbb499d2383bf7f53a1f0ce453857394225ab2, data reload: false

------ Round 1 ----------------------------------
q1	17640	4454	4342	4342
q2	2007	346	234	234
q3	10550	1332	769	769
q4	10323	773	304	304
q5	9636	2241	1928	1928
q6	216	178	144	144
q7	919	762	607	607
q8	9268	1459	1146	1146
q9	4883	4669	4621	4621
q10	6848	1941	1544	1544
q11	522	316	302	302
q12	408	372	221	221
q13	17861	4105	3216	3216
q14	234	230	219	219
q15	884	820	806	806
q16	680	680	606	606
q17	714	809	546	546
q18	6610	6048	5769	5769
q19	1399	994	624	624
q20	507	491	393	393
q21	2563	1837	1770	1770
q22	356	317	283	283
Total cold run time: 105028 ms
Total hot run time: 30394 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4468	4352	4367	4352
q2	267	342	247	247
q3	2108	2710	2224	2224
q4	1346	1760	1305	1305
q5	4287	4189	4255	4189
q6	219	179	136	136
q7	1833	1764	2028	1764
q8	2651	2461	2428	2428
q9	7742	7606	7433	7433
q10	2791	3008	2665	2665
q11	578	473	453	453
q12	646	773	610	610
q13	3861	4573	3712	3712
q14	294	309	275	275
q15	860	812	810	810
q16	680	748	693	693
q17	1151	1419	1448	1419
q18	8309	8142	7848	7848
q19	895	841	860	841
q20	2060	2147	2032	2032
q21	4761	4290	4124	4124
q22	576	549	493	493
Total cold run time: 52383 ms
Total hot run time: 50053 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 28.25 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit dbfbb499d2383bf7f53a1f0ce453857394225ab2, data reload: false

query1	0.06	0.05	0.05
query2	0.13	0.07	0.08
query3	0.32	0.08	0.08
query4	1.61	0.11	0.10
query5	0.26	0.25	0.25
query6	1.14	0.64	0.65
query7	0.03	0.02	0.03
query8	0.08	0.07	0.06
query9	0.60	0.50	0.50
query10	0.56	0.57	0.56
query11	0.26	0.13	0.13
query12	0.27	0.15	0.14
query13	0.63	0.61	0.59
query14	0.99	0.98	0.98
query15	0.92	0.83	0.84
query16	0.39	0.38	0.38
query17	1.07	1.06	1.02
query18	0.24	0.23	0.22
query19	1.95	1.85	1.80
query20	0.03	0.02	0.01
query21	15.40	0.35	0.31
query22	4.92	0.12	0.11
query23	15.32	0.46	0.29
query24	2.28	0.57	0.41
query25	0.12	0.11	0.11
query26	0.19	0.18	0.18
query27	0.10	0.10	0.10
query28	3.52	1.16	0.99
query29	12.50	4.13	3.26
query30	0.32	0.12	0.10
query31	2.80	0.66	0.44
query32	3.23	0.62	0.51
query33	3.10	3.05	3.05
query34	16.37	5.05	4.44
query35	4.45	4.48	4.48
query36	0.62	0.50	0.50
query37	0.31	0.09	0.09
query38	0.28	0.07	0.06
query39	0.08	0.05	0.05
query40	0.21	0.16	0.17
query41	0.13	0.08	0.07
query42	0.09	0.05	0.05
query43	0.07	0.06	0.06
Total cold run time: 97.95 s
Total hot run time: 28.25 s

@doris-robot
Copy link

BE UT Coverage Report

Increment line coverage 25.00% (6/24) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.73% (19455/36895)
Line Coverage 36.24% (181282/500201)
Region Coverage 32.64% (140814/431474)
Branch Coverage 33.64% (60973/181239)

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (24/24) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 71.70% (25922/36151)
Line Coverage 54.32% (271028/498963)
Region Coverage 51.63% (225040/435856)
Branch Coverage 53.18% (96753/181943)

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 44.23% (23/52) 🎉
Increment coverage report
Complete coverage report

@doris-robot
Copy link

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 79.35% (1795/2262)
Line Coverage 64.87% (31961/49269)
Region Coverage 65.57% (15948/24323)
Branch Coverage 56.10% (8479/15114)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants