Skip to content

Conversation

@feiniaofeiafei
Copy link
Contributor

@feiniaofeiafei feiniaofeiafei commented Nov 26, 2025

What problem does this PR solve?

Issue Number: close #xxx

Related PR: #41731

Problem Summary:

Release note

The optimizer cannot derive predicates across multiple LEFT JOINs. For example, given a filter on the leftmost table in a chain of LEFT JOINs, the optimizer should be able to derive predicates on the rightmost table, but it currently fails to do so.

create table t1(a int, b int);
create table t2(a int, b int);
create table t3(a int, b int);

insert into t1 values(1,2);
insert into t2 values(1,2);
insert into t3 values(1,2);
insert into t3 values(null,2);

explain logical plan
select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1;

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
     +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )

The optimizer should derive t3.a=1 from t1.a=1 and the join conditions, but it currently doesn't.

The root cause is that the PullUpPredicates rule doesn't properly handle predicate pull-up from the right side of LEFT JOINs. This PR fixes this by generating null-tolerant predicates when pulling up from RIGHT JOIN's right table and strengthening them when possible based on upper-level join conditions.
after this pr:

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
      +--LogicalFilter[107] ( predicates=(a#4 = 1) )
         +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )

None

Check List (For Author)

  • Test

    • Regression test
    • Unit Test
    • Manual test (add detailed scripts or steps below)
    • No need to test or manual test. Explain why:
      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change.
      • No code files have been changed.
      • Other reason
  • Behavior changed:

    • No.
    • Yes.
  • Does this need documentation?

    • No.
    • Yes.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

@hello-stephen
Copy link
Contributor

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?

@feiniaofeiafei
Copy link
Contributor Author

run buildall

@doris-robot
Copy link

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

------ Round 1 ----------------------------------
q1	17667	5106	4951	4951
q2	2350	307	202	202
q3	10325	1266	753	753
q4	10240	954	377	377
q5	7511	2361	2302	2302
q6	185	167	136	136
q7	939	799	645	645
q8	9340	1310	1099	1099
q9	7036	5330	5262	5262
q10	7304	2189	1827	1827
q11	566	305	283	283
q12	383	359	227	227
q13	17812	3674	3035	3035
q14	237	238	218	218
q15	576	532	504	504
q16	1016	1008	957	957
q17	640	877	367	367
q18	7341	7116	7099	7099
q19	1305	957	522	522
q20	345	341	231	231
q21	3754	3202	2312	2312
q22	1043	1017	948	948
Total cold run time: 107915 ms
Total hot run time: 34257 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4994	5053	4952	4952
q2	342	382	312	312
q3	2148	2681	2304	2304
q4	1329	1807	1313	1313
q5	4337	4536	4503	4503
q6	216	179	132	132
q7	2069	2031	1865	1865
q8	2615	2596	2577	2577
q9	7544	7423	7587	7423
q10	3039	3282	2799	2799
q11	575	506	488	488
q12	676	742	615	615
q13	3401	3944	3376	3376
q14	295	345	272	272
q15	557	508	516	508
q16	1119	1111	1063	1063
q17	1156	1531	1414	1414
q18	7835	7735	7651	7651
q19	836	846	886	846
q20	1983	2024	1820	1820
q21	5148	4326	4260	4260
q22	1093	1062	999	999
Total cold run time: 53307 ms
Total hot run time: 51492 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 181245 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 3fdb1c782da005527e30703fcdb1d4592f5bb5a8, data reload: false

query1	1260	396	393	393
query2	6571	1607	1616	1607
query3	6882	232	227	227
query4	25103	22998	22218	22218
query5	4448	634	477	477
query6	355	267	239	239
query7	4681	518	304	304
query8	311	277	251	251
query9	8697	2586	2594	2586
query10	525	354	312	312
query11	15047	14966	14559	14559
query12	173	122	120	120
query13	1703	573	445	445
query14	10760	8858	8908	8858
query15	215	201	187	187
query16	7738	695	538	538
query17	1286	769	655	655
query18	2052	432	341	341
query19	224	214	182	182
query20	176	129	123	123
query21	542	137	120	120
query22	4001	3978	3823	3823
query23	32904	31867	31872	31867
query24	8613	2409	2405	2405
query25	585	527	461	461
query26	1006	280	162	162
query27	2655	498	352	352
query28	4346	2177	2105	2105
query29	744	601	476	476
query30	355	240	216	216
query31	860	704	650	650
query32	84	77	84	77
query33	585	375	325	325
query34	783	884	533	533
query35	801	830	748	748
query36	915	950	852	852
query37	146	112	88	88
query38	3293	3416	3306	3306
query39	1517	1403	1391	1391
query40	239	133	117	117
query41	66	63	61	61
query42	126	113	113	113
query43	469	475	442	442
query44	1229	767	736	736
query45	195	190	185	185
query46	887	990	637	637
query47	1666	1719	1707	1707
query48	394	432	326	326
query49	756	510	431	431
query50	672	686	405	405
query51	3867	3864	3900	3864
query52	111	113	105	105
query53	238	257	188	188
query54	321	297	278	278
query55	86	89	84	84
query56	316	329	326	326
query57	1153	1183	1107	1107
query58	290	270	276	270
query59	2445	2558	2345	2345
query60	340	367	336	336
query61	163	161	162	161
query62	774	716	663	663
query63	234	204	206	204
query64	3772	1168	898	898
query65	4080	3965	3949	3949
query66	949	439	336	336
query67	15075	14872	14780	14780
query68	8291	891	624	624
query69	531	344	307	307
query70	1345	1263	1268	1263
query71	470	344	309	309
query72	5590	2562	5258	2562
query73	769	797	376	376
query74	8753	9009	8262	8262
query75	3860	3383	2849	2849
query76	3467	1134	724	724
query77	813	434	352	352
query78	9517	9774	8920	8920
query79	1684	872	612	612
query80	750	608	518	518
query81	529	276	249	249
query82	214	176	144	144
query83	279	273	261	261
query84	271	127	116	116
query85	951	488	438	438
query86	377	313	283	283
query87	3500	3467	3414	3414
query88	2842	2323	2263	2263
query89	398	321	294	294
query90	1894	222	228	222
query91	187	174	147	147
query92	78	67	67	67
query93	1261	979	666	666
query94	701	451	317	317
query95	495	407	392	392
query96	491	591	286	286
query97	2887	2964	2875	2875
query98	232	214	207	207
query99	1339	1383	1293	1293
Total cold run time: 268621 ms
Total hot run time: 181245 ms

@doris-robot
Copy link

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

query1	0.06	0.06	0.05
query2	0.12	0.05	0.05
query3	0.28	0.08	0.09
query4	1.62	0.11	0.11
query5	0.28	0.25	0.25
query6	1.22	0.64	0.66
query7	0.04	0.03	0.03
query8	0.06	0.04	0.04
query9	0.60	0.54	0.51
query10	0.56	0.57	0.57
query11	0.17	0.12	0.11
query12	0.15	0.12	0.11
query13	0.64	0.61	0.61
query14	1.01	1.01	1.00
query15	0.85	0.83	0.85
query16	0.41	0.40	0.39
query17	1.04	1.02	1.04
query18	0.21	0.21	0.20
query19	1.89	1.87	1.84
query20	0.02	0.02	0.01
query21	15.48	0.18	0.14
query22	5.12	0.06	0.05
query23	15.69	0.26	0.10
query24	4.10	0.60	0.58
query25	0.08	0.06	0.06
query26	0.15	0.14	0.14
query27	0.06	0.06	0.06
query28	5.04	1.15	0.94
query29	12.57	3.98	3.29
query30	0.28	0.14	0.12
query31	2.83	0.59	0.39
query32	3.24	0.55	0.46
query33	3.12	3.03	3.07
query34	15.94	5.19	4.63
query35	4.56	4.60	4.56
query36	0.68	0.52	0.50
query37	0.11	0.07	0.08
query38	0.07	0.04	0.03
query39	0.06	0.03	0.03
query40	0.18	0.14	0.14
query41	0.10	0.03	0.03
query42	0.05	0.03	0.03
query43	0.04	0.04	0.03
Total cold run time: 100.78 s
Total hot run time: 27.86 s

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 89.29% (75/84) 🎉
Increment coverage report
Complete coverage report

@feiniaofeiafei feiniaofeiafei force-pushed the fix_predicate branch 2 times, most recently from a051974 to 7658f89 Compare November 26, 2025 07:15
@feiniaofeiafei
Copy link
Contributor Author

run buildall


// test left join right table predicate pull up
qt_leftjoin_right_pull_up_shape """
explain shape plan select * from extend_infer_t3 t1 left join extend_infer_t4 t2 on t1.a=t2.a left join extend_infer_t5 t3 on t2.a= t3.a where t1.a=1;
Copy link

Choose a reason for hiding this comment

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

add more cases:

  1. more t1 where condition: t1.a is not null, t1.a in (1, 2)
  2. more table join: t1 left join t2 left join t3 left join t4 ... and condition is the middle table where t2.a = 1

@hello-stephen
Copy link
Contributor

FE UT Coverage Report

Increment line coverage 59.52% (50/84) 🎉
Increment coverage report
Complete coverage report

@doris-robot
Copy link

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

------ Round 1 ----------------------------------
q1	17611	5047	4935	4935
q2	2049	311	207	207
q3	10238	1288	721	721
q4	10236	905	373	373
q5	7467	2445	2305	2305
q6	208	174	135	135
q7	940	781	641	641
q8	9362	1351	1109	1109
q9	7152	5372	5279	5279
q10	6909	2268	1795	1795
q11	505	288	286	286
q12	357	371	222	222
q13	17783	3652	3032	3032
q14	230	241	209	209
q15	597	524	520	520
q16	1024	1032	948	948
q17	592	891	366	366
q18	7343	7110	7077	7077
q19	1082	938	559	559
q20	347	332	224	224
q21	4101	3214	2321	2321
q22	1079	994	975	975
Total cold run time: 107212 ms
Total hot run time: 34239 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4984	4948	4953	4948
q2	321	401	314	314
q3	2150	2667	2267	2267
q4	1366	1788	1344	1344
q5	4244	4448	4563	4448
q6	214	169	136	136
q7	2087	1875	1882	1875
q8	2677	2699	2583	2583
q9	7547	7577	7535	7535
q10	3097	3365	2770	2770
q11	593	543	509	509
q12	690	836	607	607
q13	3543	3915	3575	3575
q14	294	302	280	280
q15	551	500	505	500
q16	1096	1127	1035	1035
q17	1162	1588	1454	1454
q18	7916	7708	7564	7564
q19	831	856	1053	856
q20	2081	2011	1925	1925
q21	4878	4497	4311	4311
q22	1096	1089	998	998
Total cold run time: 53418 ms
Total hot run time: 51834 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 183939 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 7658f894cb9c0dc850dd141b9c50e59ea967517c, data reload: false

query1	1034	404	396	396
query2	6569	1630	1620	1620
query3	6758	234	225	225
query4	25831	23145	22438	22438
query5	4424	635	469	469
query6	350	245	240	240
query7	4660	495	316	316
query8	307	282	248	248
query9	8736	2576	2574	2574
query10	537	365	311	311
query11	15496	14680	14456	14456
query12	183	117	112	112
query13	1685	581	475	475
query14	10988	8956	8892	8892
query15	216	205	194	194
query16	7526	713	546	546
query17	1253	787	631	631
query18	2040	461	341	341
query19	222	217	185	185
query20	131	127	122	122
query21	219	138	118	118
query22	3950	3931	3914	3914
query23	32993	31977	32004	31977
query24	8574	2387	2383	2383
query25	591	504	453	453
query26	1232	267	162	162
query27	2739	488	347	347
query28	4404	2135	2113	2113
query29	808	624	484	484
query30	316	243	203	203
query31	868	714	642	642
query32	86	70	70	70
query33	590	367	322	322
query34	800	876	535	535
query35	806	825	799	799
query36	917	963	869	869
query37	124	112	85	85
query38	3351	3380	3294	3294
query39	1461	1406	1419	1406
query40	227	129	118	118
query41	69	64	61	61
query42	126	115	112	112
query43	465	448	444	444
query44	1226	760	762	760
query45	196	190	184	184
query46	877	987	644	644
query47	1661	1730	1621	1621
query48	397	427	324	324
query49	773	479	418	418
query50	655	676	429	429
query51	3841	4024	3897	3897
query52	114	110	106	106
query53	249	265	201	201
query54	299	295	279	279
query55	94	92	91	91
query56	330	316	302	302
query57	1148	1172	1106	1106
query58	282	271	270	270
query59	2501	2548	2372	2372
query60	344	344	337	337
query61	160	155	161	155
query62	789	742	644	644
query63	235	191	191	191
query64	4507	1216	909	909
query65	4089	3994	3982	3982
query66	1128	438	330	330
query67	15118	15287	14723	14723
query68	8228	951	639	639
query69	518	332	294	294
query70	1384	1199	1193	1193
query71	444	333	311	311
query72	5814	4947	4928	4928
query73	639	582	343	343
query74	8771	8743	8622	8622
query75	3559	3293	2816	2816
query76	3424	1117	717	717
query77	761	430	307	307
query78	9490	9566	8977	8977
query79	2897	800	593	593
query80	774	558	496	496
query81	516	271	230	230
query82	457	161	131	131
query83	298	270	251	251
query84	306	125	105	105
query85	935	484	442	442
query86	378	298	286	286
query87	3521	3490	3390	3390
query88	3591	2224	2216	2216
query89	388	322	287	287
query90	1878	223	213	213
query91	174	167	137	137
query92	83	70	65	65
query93	2403	978	656	656
query94	764	458	344	344
query95	494	407	394	394
query96	494	573	277	277
query97	2970	2946	2856	2856
query98	239	209	208	208
query99	1440	1391	1238	1238
Total cold run time: 273707 ms
Total hot run time: 183939 ms

@doris-robot
Copy link

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

query1	0.05	0.04	0.05
query2	0.10	0.05	0.04
query3	0.26	0.08	0.08
query4	1.60	0.10	0.11
query5	0.27	0.25	0.25
query6	1.18	0.65	0.64
query7	0.04	0.03	0.03
query8	0.05	0.04	0.05
query9	0.57	0.53	0.51
query10	0.57	0.56	0.58
query11	0.16	0.11	0.11
query12	0.14	0.11	0.12
query13	0.62	0.60	0.60
query14	1.00	1.00	1.00
query15	0.84	0.81	0.82
query16	0.39	0.39	0.39
query17	1.04	1.06	1.06
query18	0.22	0.22	0.20
query19	1.88	1.80	1.81
query20	0.02	0.01	0.01
query21	15.44	0.18	0.13
query22	5.12	0.07	0.05
query23	15.66	0.25	0.10
query24	2.34	0.94	0.27
query25	0.07	0.07	0.06
query26	0.14	0.13	0.13
query27	0.07	0.06	0.05
query28	3.75	1.15	0.93
query29	12.58	3.90	3.24
query30	0.28	0.14	0.11
query31	2.82	0.59	0.38
query32	3.23	0.55	0.46
query33	3.00	3.05	3.03
query34	15.74	5.11	4.52
query35	4.56	4.56	4.55
query36	0.67	0.50	0.49
query37	0.10	0.07	0.06
query38	0.06	0.04	0.04
query39	0.04	0.03	0.03
query40	0.17	0.14	0.15
query41	0.08	0.04	0.03
query42	0.03	0.03	0.03
query43	0.04	0.03	0.03
Total cold run time: 96.99 s
Total hot run time: 27.24 s

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 89.29% (75/84) 🎉
Increment coverage report
Complete coverage report

@feiniaofeiafei
Copy link
Contributor Author

run buildall

@doris-robot
Copy link

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

------ Round 1 ----------------------------------
q1	17591	4982	4880	4880
q2	2041	323	207	207
q3	10230	1262	702	702
q4	10235	960	379	379
q5	7546	2368	2306	2306
q6	186	169	140	140
q7	930	789	640	640
q8	9356	1317	1085	1085
q9	7039	5230	5282	5230
q10	6883	2220	1777	1777
q11	497	296	280	280
q12	362	369	224	224
q13	18251	3598	3152	3152
q14	253	245	219	219
q15	581	512	530	512
q16	1056	1044	990	990
q17	601	855	376	376
q18	7865	7243	7288	7243
q19	1091	964	552	552
q20	353	347	233	233
q21	3843	2631	2331	2331
q22	1074	1020	1007	1007
Total cold run time: 107864 ms
Total hot run time: 34465 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4985	4910	4997	4910
q2	336	420	305	305
q3	2131	2670	2328	2328
q4	1366	1752	1328	1328
q5	4191	4481	4490	4481
q6	217	171	128	128
q7	2061	1956	1806	1806
q8	2602	2593	2521	2521
q9	7649	7466	7596	7466
q10	2976	3233	2816	2816
q11	603	511	505	505
q12	665	776	625	625
q13	3408	4161	3277	3277
q14	292	327	283	283
q15	561	518	504	504
q16	1072	1132	1088	1088
q17	1158	1604	1347	1347
q18	7975	7672	7632	7632
q19	800	812	974	812
q20	1913	1976	1823	1823
q21	4656	4265	4185	4185
q22	1055	1039	980	980
Total cold run time: 52672 ms
Total hot run time: 51150 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 183958 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 1d1c12bdbdb0f4afb9f39552d6b5919df7db5c2c, data reload: false

query1	1075	421	390	390
query2	6575	1596	1602	1596
query3	6751	223	217	217
query4	25639	22878	22560	22560
query5	4400	618	465	465
query6	338	239	234	234
query7	4643	494	296	296
query8	308	257	232	232
query9	8699	2548	2559	2548
query10	480	355	309	309
query11	14887	14815	14647	14647
query12	176	129	113	113
query13	1704	579	461	461
query14	10164	8823	8887	8823
query15	214	203	188	188
query16	7395	679	531	531
query17	1258	766	652	652
query18	1997	432	336	336
query19	211	203	177	177
query20	131	128	123	123
query21	220	137	117	117
query22	4007	3987	3978	3978
query23	33250	32029	31980	31980
query24	8497	2417	2484	2417
query25	656	566	492	492
query26	1242	280	167	167
query27	2751	509	355	355
query28	4398	2153	2118	2118
query29	865	655	504	504
query30	308	241	209	209
query31	833	713	643	643
query32	82	73	68	68
query33	630	387	336	336
query34	791	887	539	539
query35	866	825	756	756
query36	909	948	866	866
query37	126	121	89	89
query38	3421	3303	3277	3277
query39	1481	1416	1418	1416
query40	216	126	113	113
query41	62	62	58	58
query42	126	113	112	112
query43	450	459	426	426
query44	1215	768	745	745
query45	192	194	182	182
query46	888	991	642	642
query47	1677	1768	1676	1676
query48	386	429	316	316
query49	782	483	405	405
query50	653	682	406	406
query51	3960	3920	3926	3920
query52	106	114	109	109
query53	237	261	194	194
query54	294	284	285	284
query55	92	93	89	89
query56	304	322	316	316
query57	1144	1166	1098	1098
query58	282	274	278	274
query59	2390	2559	2392	2392
query60	339	376	342	342
query61	158	158	154	154
query62	788	702	645	645
query63	227	191	185	185
query64	4556	1169	863	863
query65	4083	3952	3966	3952
query66	1189	430	332	332
query67	15242	15102	14875	14875
query68	8406	891	617	617
query69	505	333	312	312
query70	1301	1181	1230	1181
query71	468	328	306	306
query72	5911	4943	4907	4907
query73	693	571	345	345
query74	8619	8728	8310	8310
query75	4012	3338	2803	2803
query76	3750	1139	723	723
query77	814	387	308	308
query78	9446	9675	8894	8894
query79	2020	846	583	583
query80	690	579	489	489
query81	490	265	235	235
query82	424	170	142	142
query83	281	265	248	248
query84	264	120	101	101
query85	903	502	454	454
query86	339	311	288	288
query87	3489	3520	3441	3441
query88	3051	2243	2254	2243
query89	394	328	284	284
query90	1932	220	217	217
query91	165	164	141	141
query92	90	68	60	60
query93	1161	977	660	660
query94	717	450	328	328
query95	479	397	394	394
query96	492	579	278	278
query97	2930	2980	2859	2859
query98	249	215	209	209
query99	1400	1384	1268	1268
Total cold run time: 270301 ms
Total hot run time: 183958 ms

@doris-robot
Copy link

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

query1	0.05	0.05	0.05
query2	0.09	0.05	0.05
query3	0.26	0.08	0.08
query4	1.61	0.12	0.11
query5	0.26	0.26	0.26
query6	1.18	0.64	0.63
query7	0.03	0.03	0.02
query8	0.06	0.05	0.04
query9	0.58	0.52	0.52
query10	0.58	0.58	0.57
query11	0.16	0.11	0.12
query12	0.15	0.11	0.12
query13	0.62	0.60	0.62
query14	1.00	1.01	1.01
query15	0.85	0.83	0.83
query16	0.38	0.42	0.38
query17	1.06	1.02	1.02
query18	0.21	0.20	0.20
query19	1.82	1.83	1.82
query20	0.02	0.01	0.01
query21	15.45	0.19	0.13
query22	4.97	0.07	0.05
query23	15.66	0.26	0.10
query24	3.00	0.89	0.84
query25	0.08	0.06	0.07
query26	0.14	0.13	0.14
query27	0.06	0.06	0.06
query28	4.90	1.14	0.92
query29	12.58	3.84	3.24
query30	0.28	0.14	0.13
query31	2.82	0.60	0.40
query32	3.22	0.57	0.46
query33	3.02	3.11	3.04
query34	15.90	5.20	4.54
query35	4.55	4.62	4.59
query36	0.66	0.50	0.49
query37	0.10	0.07	0.06
query38	0.06	0.04	0.04
query39	0.03	0.03	0.03
query40	0.18	0.15	0.13
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.04	0.04	0.03
Total cold run time: 98.8 s
Total hot run time: 27.95 s

@feiniaofeiafei
Copy link
Contributor Author

run buildall

@doris-robot
Copy link

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

------ Round 1 ----------------------------------
q1	17592	5321	4871	4871
q2	2037	309	203	203
q3	10238	1288	701	701
q4	10226	908	363	363
q5	7523	2445	2255	2255
q6	179	164	133	133
q7	980	786	638	638
q8	9345	1369	1085	1085
q9	7081	5520	5430	5430
q10	6894	2263	1821	1821
q11	510	301	294	294
q12	346	361	222	222
q13	17781	3687	3027	3027
q14	235	240	215	215
q15	592	511	516	511
q16	893	854	824	824
q17	588	792	485	485
q18	7744	7083	7010	7010
q19	1089	943	552	552
q20	335	339	229	229
q21	2913	3063	2483	2483
q22	1012	991	944	944
Total cold run time: 106133 ms
Total hot run time: 34296 ms

----- Round 2, with runtime_filter_mode=off -----
q1	4927	4896	4893	4893
q2	338	391	326	326
q3	2155	2654	2300	2300
q4	1300	1740	1340	1340
q5	4226	4314	4497	4314
q6	212	178	133	133
q7	2037	1993	1786	1786
q8	2579	2756	2452	2452
q9	7599	7536	7440	7440
q10	3039	3274	2845	2845
q11	600	504	506	504
q12	675	716	609	609
q13	3559	3883	3286	3286
q14	307	324	278	278
q15	547	516	518	516
q16	904	923	892	892
q17	1162	1419	1493	1419
q18	7917	7621	7429	7429
q19	796	736	732	732
q20	1928	1936	1836	1836
q21	4543	4283	4047	4047
q22	1025	1063	983	983
Total cold run time: 52375 ms
Total hot run time: 50360 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 182316 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 20a659f698261d7944e5a7d84639914d2bd2020a, data reload: false

query1	1035	415	425	415
query2	6568	1619	1584	1584
query3	6776	228	223	223
query4	25496	23320	22510	22510
query5	5153	615	470	470
query6	338	237	231	231
query7	4666	505	305	305
query8	321	290	246	246
query9	8723	2574	2596	2574
query10	542	355	325	325
query11	15160	15110	15000	15000
query12	181	130	117	117
query13	1703	570	451	451
query14	9432	5480	5513	5480
query15	221	202	184	184
query16	7666	699	531	531
query17	1230	785	656	656
query18	2054	440	344	344
query19	225	209	186	186
query20	133	133	129	129
query21	219	139	118	118
query22	4106	4224	4055	4055
query23	33348	32083	32029	32029
query24	8597	2440	2416	2416
query25	635	541	497	497
query26	743	279	173	173
query27	2660	510	349	349
query28	4262	2136	2134	2134
query29	742	644	528	528
query30	303	242	220	220
query31	807	720	637	637
query32	88	81	77	77
query33	614	400	352	352
query34	804	893	549	549
query35	808	843	788	788
query36	867	947	825	825
query37	129	121	90	90
query38	3914	3831	3942	3831
query39	1497	1411	1475	1411
query40	219	134	122	122
query41	65	62	62	62
query42	121	119	110	110
query43	442	450	427	427
query44	1331	765	749	749
query45	200	195	181	181
query46	876	1009	646	646
query47	1719	1748	1659	1659
query48	405	435	336	336
query49	709	498	417	417
query50	681	696	418	418
query51	3858	3934	3901	3901
query52	116	111	106	106
query53	235	260	193	193
query54	306	295	277	277
query55	94	101	88	88
query56	318	337	314	314
query57	1151	1186	1113	1113
query58	300	276	279	276
query59	2365	2429	2395	2395
query60	358	355	341	341
query61	162	153	158	153
query62	766	744	653	653
query63	221	187	191	187
query64	3328	1228	905	905
query65	4076	3999	3975	3975
query66	884	441	335	335
query67	15428	14924	15113	14924
query68	8245	982	619	619
query69	525	352	309	309
query70	1095	1000	1057	1000
query71	497	338	312	312
query72	6015	4810	4786	4786
query73	663	564	351	351
query74	8786	8779	8699	8699
query75	3738	3066	2569	2569
query76	3587	1134	712	712
query77	826	399	328	328
query78	9636	9759	9011	9011
query79	2003	853	576	576
query80	638	572	491	491
query81	502	270	241	241
query82	291	137	111	111
query83	270	265	255	255
query84	252	127	95	95
query85	922	493	445	445
query86	341	297	277	277
query87	4058	4106	4042	4042
query88	3996	2295	2273	2273
query89	394	333	290	290
query90	1972	224	219	219
query91	169	169	145	145
query92	79	73	61	61
query93	1688	983	674	674
query94	694	431	354	354
query95	500	410	400	400
query96	513	556	284	284
query97	2608	2711	2592	2592
query98	243	219	215	215
query99	1332	1395	1277	1277
Total cold run time: 270578 ms
Total hot run time: 182316 ms

@doris-robot
Copy link

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

query1	0.06	0.05	0.05
query2	0.10	0.05	0.06
query3	0.26	0.09	0.09
query4	1.60	0.11	0.12
query5	0.28	0.27	0.27
query6	1.17	0.65	0.65
query7	0.03	0.02	0.02
query8	0.08	0.04	0.04
query9	0.56	0.52	0.51
query10	0.55	0.56	0.56
query11	0.15	0.10	0.11
query12	0.15	0.11	0.13
query13	0.62	0.61	0.61
query14	0.99	0.99	0.97
query15	0.81	0.80	0.80
query16	0.40	0.39	0.42
query17	0.98	0.97	1.00
query18	0.23	0.22	0.22
query19	1.83	1.80	1.85
query20	0.02	0.01	0.02
query21	15.47	0.28	0.14
query22	4.68	0.05	0.05
query23	16.05	0.26	0.11
query24	1.86	0.32	0.34
query25	0.08	0.06	0.06
query26	0.13	0.14	0.13
query27	0.06	0.06	0.06
query28	3.55	1.22	1.02
query29	12.58	3.94	3.31
query30	0.28	0.13	0.12
query31	2.82	0.62	0.40
query32	3.24	0.55	0.46
query33	3.06	3.02	3.07
query34	16.81	5.19	4.49
query35	4.57	4.53	4.54
query36	0.66	0.51	0.52
query37	0.11	0.06	0.06
query38	0.06	0.04	0.04
query39	0.05	0.03	0.03
query40	0.16	0.13	0.14
query41	0.08	0.03	0.02
query42	0.04	0.03	0.02
query43	0.04	0.03	0.03
Total cold run time: 97.31 s
Total hot run time: 27.39 s

@hello-stephen
Copy link
Contributor

FE Regression Coverage Report

Increment line coverage 90.72% (88/97) 🎉
Increment coverage report
Complete coverage report

@morrySnow morrySnow added dev/3.1.x dev/4.0.x usercase Important user case type label labels Dec 1, 2025
@github-actions github-actions bot added the approved Indicates a PR has been approved by one committer. label Dec 1, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

PR approved by at least one committer and no changes requested.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

PR approved by anyone and no changes requested.

@morrySnow morrySnow merged commit 94b1a8f into apache:master Dec 1, 2025
30 of 31 checks passed
feiniaofeiafei added a commit to feiniaofeiafei/doris that referenced this pull request Dec 3, 2025
…che#58372)

Related PR: apache#41731

Problem Summary:

The optimizer cannot derive predicates across multiple LEFT JOINs. For
example, given a filter on the leftmost table in a chain of LEFT JOINs,
the optimizer should be able to derive predicates on the rightmost
table, but it currently fails to do so.

create table t1(a int, b int);
create table t2(a int, b int);
create table t3(a int, b int);

insert into t1 values(1,2);
insert into t2 values(1,2);
insert into t3 values(1,2);
insert into t3 values(null,2);

explain logical plan
select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1;

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
     +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )

The optimizer should derive t3.a=1 from t1.a=1 and the join conditions,
but it currently doesn't.

The root cause is that the PullUpPredicates rule doesn't properly handle
predicate pull-up from the right side of LEFT JOINs. This PR fixes this
by generating null-tolerant predicates when pulling up from RIGHT JOIN's
right table and strengthening them when possible based on upper-level
join conditions.
after this pr:

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
      +--LogicalFilter[107] ( predicates=(a#4 = 1) )
         +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )
feiniaofeiafei added a commit to feiniaofeiafei/doris that referenced this pull request Dec 3, 2025
…che#58372)

Related PR: apache#41731

Problem Summary:

The optimizer cannot derive predicates across multiple LEFT JOINs. For
example, given a filter on the leftmost table in a chain of LEFT JOINs,
the optimizer should be able to derive predicates on the rightmost
table, but it currently fails to do so.

create table t1(a int, b int);
create table t2(a int, b int);
create table t3(a int, b int);

insert into t1 values(1,2);
insert into t2 values(1,2);
insert into t3 values(1,2);
insert into t3 values(null,2);

explain logical plan
select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1;

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
     +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )

The optimizer should derive t3.a=1 from t1.a=1 and the join conditions,
but it currently doesn't.

The root cause is that the PullUpPredicates rule doesn't properly handle
predicate pull-up from the right side of LEFT JOINs. This PR fixes this
by generating null-tolerant predicates when pulling up from RIGHT JOIN's
right table and strengthening them when possible based on upper-level
join conditions.
after this pr:

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
      +--LogicalFilter[107] ( predicates=(a#4 = 1) )
         +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )
yiguolei pushed a commit that referenced this pull request Dec 3, 2025
morrySnow pushed a commit that referenced this pull request Dec 4, 2025
nagisa-kunhah pushed a commit to nagisa-kunhah/doris that referenced this pull request Dec 14, 2025
…che#58372)

### What problem does this PR solve?

Related PR: apache#41731

Problem Summary:

The optimizer cannot derive predicates across multiple LEFT JOINs. For
example, given a filter on the leftmost table in a chain of LEFT JOINs,
the optimizer should be able to derive predicates on the rightmost
table, but it currently fails to do so.

create table t1(a int, b int);
create table t2(a int, b int);
create table t3(a int, b int);

insert into t1 values(1,2);
insert into t2 values(1,2);
insert into t3 values(1,2);
insert into t3 values(null,2);

explain logical plan
select * from t1 left join t2 on t1.a=t2.a left join t3 on t2.a=t3.a where t1.a=1;

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
     +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )

The optimizer should derive t3.a=1 from t1.a=1 and the join conditions,
but it currently doesn't.

The root cause is that the PullUpPredicates rule doesn't properly handle
predicate pull-up from the right side of LEFT JOINs. This PR fixes this
by generating null-tolerant predicates when pulling up from RIGHT JOIN's
right table and strengthening them when possible based on upper-level
join conditions.
after this pr:

LogicalResultSink[110] ( outputExprs=[a#0, b#1, a#2, b#3, a#4, b#5] )
+--LogicalProject[109] ( distinct=false, projects=[a#0, b#1, a#2, b#3, a#4, b#5] )
   +--LogicalJoin[108] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#2 = a#4)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |--LogicalProject[105] ( distinct=false, projects=[a#0, b#1, a#2, b#3] )
      |  +--LogicalJoin[104] ( type=LEFT_OUTER_JOIN, markJoinSlotReference=Optional.empty, hashJoinConjuncts=[(a#0 = a#2)], otherJoinConjuncts=[], markJoinConjuncts=[] )
      |     |--LogicalFilter[101] ( predicates=(a#0 = 1) )
      |     |  +--LogicalOlapScan ( qualified=internal.maldb.t1, indexName=<index_not_selected>, selectedIndexId=1764043369852, preAgg=ON, operativeCol=[a#0], virtualColumns=[] )
      |     +--LogicalFilter[103] ( predicates=(a#2 = 1) )
      |        +--LogicalOlapScan ( qualified=internal.maldb.t2, indexName=<index_not_selected>, selectedIndexId=1764043369875, preAgg=ON, operativeCol=[a#2], virtualColumns=[] )
      +--LogicalFilter[107] ( predicates=(a#4 = 1) )
         +--LogicalOlapScan ( qualified=internal.maldb.t3, indexName=<index_not_selected>, selectedIndexId=1764043369898, preAgg=ON, operativeCol=[a#4], virtualColumns=[] )
w41ter pushed a commit to w41ter/incubator-doris that referenced this pull request Dec 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by one committer. dev/3.1.4-merged dev/4.0.2-merged reviewed usercase Important user case type label

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants