Skip to content

[fix](fe) Fold external partition min max aggregate to constant - #67136

Open
felixwluo wants to merge 2 commits into
apache:masterfrom
felixwluo:maxmin-0825
Open

[fix](fe) Fold external partition min max aggregate to constant#67136
felixwluo wants to merge 2 commits into
apache:masterfrom
felixwluo:maxmin-0825

Conversation

@felixwluo

Copy link
Copy Markdown
Member

What problem does this PR solve?

Issue Number: close #xxx

Related PR: #xxx

Problem Summary:
For external Hive tables, queries using predicates like
dt = (select max(dt) from table) could not use partition pruning effectively.

The scalar subquery select max(dt) was planned as a normal file scan. In a
large online cloud-mode cluster, this caused Doris to scan all partitions and
billions of rows only to compute the latest partition value. The outer scan also
kept dt = MAX(dt) as a join condition instead of a literal partition predicate,
so it scanned all dt partitions before filtering rows.

This patch adds a Nereids rewrite rule for external tables. For simple
no-group-by MIN/MAX aggregate queries on a single external list partition
column, Doris now computes the result from partition metadata and rewrites the
aggregate to a one-row constant relation. This allows predicates such as
dt = (select max(dt) ...) to become dt = 'literal' before file-scan partition
pruning, so the outer scan can prune to the target partition.

Explain:
before:

MySQL [(none)]> explain select * from hive_catalog.doris_test.orders_source where dt=(select max(dt) from hive_catalog.doris_test.orders);
+---------------------------------------------------------------------------+
| Explain String(Nereids Planner)                                           |
+---------------------------------------------------------------------------+
| PLAN FRAGMENT 0                                                           |
|   OUTPUT EXPRS:                                                           |
|     order_id[#16]                                                         |
|     user_id[#17]                                                          |
|     amount[#18]                                                           |
|     dt[#19]                                                               |
|   PARTITION: RANDOM                                                       |
|                                                                           |
|   HAS_COLO_PLAN_NODE: false                                               |
|                                                                           |
|   VRESULT SINK                                                            |
|      MYSQL_PROTOCOL                                                       |
|                                                                           |
|   6:VHASH JOIN(87)                                                        |
|   |  join op: INNER JOIN(BROADCAST)[]                                     |
|   |  equal join conjunct: (dt[#10] = max(dt)[#6])                         |
|   |  cardinality=33                                                       |
|   |  vec output tuple id: 6                                               |
|   |  output tuple id: 6                                                   |
|   |  vIntermediate tuple ids: 5                                           |
|   |  hash output slot ids: 7 8 9 10                                       |
|   |  final projections: order_id[#11], user_id[#12], amount[#13], dt[#14] |
|   |  final project output tuple id: 6                                     |
|   |  distribute expr lists:                                               |
|   |  distribute expr lists:                                               |
|   |                                                                       |
|   |----4:VEXCHANGE                                                        |
|   |       offset: 0                                                       |
|   |       distribute expr lists:                                          |
|   |                                                                       |
|   5:VPluginDrivenScanNode(60)                                             |
|      TABLE: hive_catalog.doris_test.orders_source                         |
|      CONNECTOR: hms                                                       |
|      inputSplitNum=2, totalFileSize=811, scanRanges=2                     |
|      partition=2/2                                                        |
|      cardinality=33, numNodes=1                                           |
|      pushdown agg=NONE                                                    |
|                                                                           |
| PLAN FRAGMENT 1                                                           |
|                                                                           |
|   PARTITION: UNPARTITIONED                                                |
|                                                                           |
|   HAS_COLO_PLAN_NODE: true                                                |
|                                                                           |
|   STREAM DATA SINK                                                        |
|     EXCHANGE ID: 04                                                       |
|     UNPARTITIONED                                                         |
|                                                                           |
|   3:VAGGREGATE (merge finalize)(85)                                       |
|   |  output: max(partial_max(dt)[#5])[#6]                                 |
|   |  group by:                                                            |
|   |  sortByGroupKey:false                                                 |
|   |  cardinality=1                                                        |
|   |  distribute expr lists:                                               |
|   |                                                                       |
|   2:VEXCHANGE                                                             |
|      offset: 0                                                            |
|      distribute expr lists:                                               |
|                                                                           |
| PLAN FRAGMENT 2                                                           |
|                                                                           |
|   PARTITION: RANDOM                                                       |
|                                                                           |
|   HAS_COLO_PLAN_NODE: false                                               |
|                                                                           |
|   STREAM DATA SINK                                                        |
|     EXCHANGE ID: 02                                                       |
|     UNPARTITIONED                                                         |
|                                                                           |
|   1:VAGGREGATE (update serialize)(83)                                     |
|   |  output: partial_max(dt[#4])[#5]                                      |
|   |  group by:                                                            |
|   |  sortByGroupKey:false                                                 |
|   |  cardinality=1                                                        |
|   |  distribute expr lists:                                               |
|   |                                                                       |
|   0:VPluginDrivenScanNode(72)                                             |
|      TABLE: hive_catalog.doris_test.orders                                |
|      CONNECTOR: hms                                                       |
|      inputSplitNum=2, totalFileSize=1018, scanRanges=2                    |
|      partition=2/2                                                        |
|      cardinality=42, numNodes=1                                           |
|      pushdown agg=NONE                                                    |
|      final projections: dt[#3]                                            |
|      final project output tuple id: 1                                     |
|                                                                           |
|                                                                           |
|                                                                           |
| ========== STATISTICS ==========                                          |
| planned with unknown column statistics                                    |
+---------------------------------------------------------------------------+
90 rows in set (0.93 sec)

now:

MySQL [(none)]> explain select * from hive_catalog.doris_test.orders_source where dt=(select max(dt) from hive_catalog.doris_test.orders)
    -> ;
+-----------------------------------------------------------------------+
| Explain String(Nereids Planner)                                       |
+-----------------------------------------------------------------------+
| PLAN FRAGMENT 0                                                       |
|   OUTPUT EXPRS:                                                       |
|     order_id[#10]                                                     |
|     user_id[#11]                                                      |
|     amount[#12]                                                       |
|     dt[#13]                                                           |
|   PARTITION: RANDOM                                                   |
|                                                                       |
|   HAS_COLO_PLAN_NODE: false                                           |
|                                                                       |
|   VRESULT SINK                                                        |
|      MYSQL_PROTOCOL                                                   |
|                                                                       |
|   3:VNESTED LOOP JOIN(76)                                             |
|   |  join op: INNER JOIN()                                            |
|   |  cardinality=16                                                   |
|   |  vIntermediate tuple ids: 2                                       |
|   |  materialized slot ids: 5 6 7 8                                   |
|   |  final projections: order_id[#5], user_id[#6], amount[#7], dt[#8] |
|   |  final project output tuple id: 3                                 |
|   |  distribute expr lists:                                           |
|   |  distribute expr lists:                                           |
|   |                                                                   |
|   |----1:VEXCHANGE                                                    |
|   |       offset: 0                                                   |
|   |       distribute expr lists:                                      |
|   |                                                                   |
|   2:VPluginDrivenScanNode(62)                                         |
|      TABLE: hive_catalog.doris_test.orders_source                     |
|      CONNECTOR: hms                                                   |
|      PREDICATES: (dt[#4] = '2026-08-26')                              |
|      inputSplitNum=1, totalFileSize=390, scanRanges=1                 |
|      partition=1/2                                                    |
|      cardinality=33, numNodes=1                                       |
|      pushdown agg=NONE                                                |
|                                                                       |
| PLAN FRAGMENT 1                                                       |
|                                                                       |
|   PARTITION: UNPARTITIONED                                            |
|                                                                       |
|   HAS_COLO_PLAN_NODE: false                                           |
|                                                                       |
|   STREAM DATA SINK                                                    |
|     EXCHANGE ID: 01                                                   |
|     UNPARTITIONED                                                     |
|                                                                       |
|   0:VUNION(64)                                                        |
|      constant exprs:                                                  |
|          '2026-08-26'                                                 |
|                                                                       |
|                                                                       |
|                                                                       |
| ========== STATISTICS ==========                                      |
| planned with unknown column statistics                                |
+-----------------------------------------------------------------------+
54 rows in set (0.03 sec)

Release note

Fix slow queries on external Hive partitioned tables when filtering by
partition_col = (select max(partition_col) from table).

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

mrhhsg and others added 2 commits August 25, 2026 20:14
… segments in the rowset reader (apache#35484)

## Proposed changes

pick apache#35432 

## Further comments

If this is a relatively large or complex change, kick off the discussion
at [dev@doris.apache.org](mailto:dev@doris.apache.org) by explaining why
you chose the solution you did and what alternatives you considered,
etc...
@hello-stephen

Copy link
Copy Markdown
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?

@felixwluo

Copy link
Copy Markdown
Member Author

/review

@felixwluo

Copy link
Copy Markdown
Member Author

run buildall

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Requesting changes: the new fold assumes that the selected partition map is an exact, complete, row-bearing view of the relation read by the connector and that a primitive partition type can reproduce the aggregate result type. Those assumptions do not hold across the supported external-table paths, so the rewrite can return wrong constants, return NULL for nonempty data, suppress an expected table-not-found error, or fail planning. Seven blocking correctness/coverage issues and one P2 missed-optimization issue are detailed inline.

Critical checkpoint conclusions:

  • Concurrency and thread safety: No threads, locks, or atomics are added. External metadata mutation exposes a read-generation consistency defect rather than a locking defect: MaxCompute can fold a cached partition generation while the scan reads the current source generation.
  • Error handling: Blocking. An unresolved connector handle can be reduced to an empty map and then NULL, bypassing the table-not-found error that scan creation would raise. Parameterized decimal reconstruction can also introduce a planning exception.
  • Memory safety: No BE/C++ ownership or reservation path is changed; the FE allocations are bounded planner objects and partition-map traversal. No memory-safety issue found.
  • Data correctness: Blocking. The fold admits Iceberg transformed partition values, registered partitions with no visible rows, deferred historical maps, Paimon incremental maps broader than the requested window, and stale MaxCompute listings that differ from scan-all. Primitive-only literal reconstruction additionally loses value and schema fidelity.
  • Observability: No new metric is inherently required for a safe planner rule, but these failures are silent wrong-result paths; EXPLAIN may show scan removal without exposing the invalid metadata assumption. Correct applicability checks are required rather than logging.
  • BE null and nullable handling: BE column handling is not touched. FE aggregate-null semantics were checked: genuine null partition keys are skipped consistently, but empty/deferred maps are incorrectly treated as an empty relation, and both NULL and non-NULL replacements must preserve the normalized aggregate result type.

Supporting review conclusions: The scan-elimination goal is useful, but the implementation is gated by a generic external-table pruning capability that is much broader than an identity, complete, snapshot-consistent extrema contract. Both rewrite registrations share the new RuleType and terminate correctly for supported direct/one-project shapes; however, the operative whole-plan placement precedes project merging and misses an ordinary derived alias. No configuration, persistence/EditLog, FE-BE protocol, storage-format, transaction, or data-write change is involved. The metadata traversal is O(partitions) and intended to save a scan, but correctness blocks rollout and the alias path retains the scan. The authoritative change set contains no FE unit or regression test and no test-result file; repository search found no existing reference to the rule or RuleType. Builds/tests were not run because the review prompt explicitly prohibits them. The user focus file supplied no additional focus points.

Review status: converged after three rounds. The final two normal reviewers and the separate risk challenger all returned NO_NEW_VALUABLE_FINDINGS after rechecking the eight accepted findings. The live PR head/base still match the authoritative bundle, and live PR-scoped review/comment context was empty immediately before submission.

new NormalizeAggregate(),
new CountLiteralRewrite(),
new RewriteSimpleAggToConstantRule(),
new RewritePartitionColumnMinMaxToConstantRule(),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P2] Revisit this rule after project merging. For SELECT max(q) FROM (SELECT p AS q FROM ext) v, NormalizeAggregate first adds its own bottom project, so the operative whole-plan job here sees Aggregate -> Project -> Project -> FileScan; the factory matches at most one project. MergeProjectable runs only in the following traversal, which never reruns this rule, so the intended alias case still scans files. Move/rerun the fold after project merging in both pipelines, or handle the normalized project chain directly.

*/
public class RewritePartitionColumnMinMaxToConstantRule implements RewriteRuleFactory {

@Override

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Add tests before enabling this semantic rewrite. The PR changes only production files, and there is no existing FE or regression reference to this rule or RuleType. Please cover direct and scalar-subquery plans, the normalized alias shape, rule disabling, all applicability gates, null/default/empty partitions, connector transforms and scan selectors, and parameterized output types; assert both result value/type and whether the file scan is removed.


private Plan tryRewrite(LogicalAggregate<?> agg, LogicalFileScan scan,
Optional<LogicalProject<LogicalFileScan>> project, StatementContext statementContext) {
if (scan.getTableSample().isPresent() || !agg.getGroupByExpressions().isEmpty()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Skip this fold for incremental scan params. The Paimon @incr path intentionally freezes the whole latest partition map here, then applies incremental-between* only when planning the connector scan. If the requested window contains only p=2024 while latest also has p=2025, this rule rewrites the window's MAX(p) to 2025. Reject row-set-altering scan params, or derive extrema from metadata scoped to the exact incremental relation.

}

ExternalTable table = scan.getTable();
if (!table.supportInternalPartitionPruned()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Require an exact identity-partition contract here. supportInternalPartitionPruned() is true for every plugin-driven table, including Iceberg specs such as truncate(10, id) and bucket(2, id). Iceberg publishes the source name id, but its partition map stores the transformed value. Thus Aggregate(max(id)) -> FileScan(selected={10,20}) for rows 19 and 22 is rewritten to constant 20 instead of 22. Please gate this on connector metadata proving identity values (or restrict it to a connector with that guarantee), rather than generic pruning support.

return slot.getName().equalsIgnoreCase(partitionColumn.getName());
}

private Optional<Literal> findPartitionMinMaxLiteral(boolean isMin, LogicalFileScan scan, Column partitionColumn) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Do not derive query results from a partition generation that the scan does not use. MaxCompute serves this map from a cross-query cache with a default 600-second TTL, but initSelectedPartitions marks it unpruned; the scan path consequently passes no required partitions and ODPS scans the current source set. If cached p=1,p=9 loses p=9 remotely, this fold returns 9 while the scan returns 1 (and a remote add misses a new extremum). Require metadata pinned to the scan's exact generation/read set, or decline this optimization for cached scan-all listings.


private Optional<Literal> findPartitionMinMaxLiteral(boolean isMin, LogicalFileScan scan, Column partitionColumn) {
PartitionKey selectedKey = null;
for (PartitionItem item : scan.getSelectedPartitions().selectedPartitions.values()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Partition existence is not row-existence evidence. Hive lists every HMS partition name while its ConnectorPartitionInfo row/file counts are explicitly unknown, and an ALTER TABLE ... ADD PARTITION (p=999) may leave an empty directory. With the only row in p=1, SQL MAX(p) is 1 but this loop returns 999; if 999 is the only empty partition, SQL returns NULL while the rewrite still returns 999. Please decline the fold unless the connector supplies a snapshot-consistent guarantee that every considered identity key contributes a visible row.

}
}

if (selectedKey == null) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Do not treat an unenumerated or unresolved partition universe as an empty relation. Explicit FOR VERSION AS OF, @tag, @branch, and snapshot-selecting options intentionally keep partition columns with an empty map because enumeration is deferred; an absent connector handle also returns {} here while scan creation would throw Table '...' does not exist. Both reach selectedKey == null, either corrupting a nonempty historical result or suppressing the expected error. Require an explicitly complete map for the exact read and preserve unresolved-handle failure.

if (selectedKey == null) {
return Optional.of(new NullLiteral(DataType.fromCatalogType(partitionColumn.getType())));
}
Type literalType = Type.fromPrimitiveType(selectedKey.getTypes().get(0));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Preserve the normalized aggregate return type instead of rebuilding it from PrimitiveType. PartitionKey has already discarded scale/precision/length: DATETIMEV2(6) is rebuilt as scale 0 and rounded, DECIMAL(10,2) is rebuilt with scale 0 and can fail literal validation, CHAR/VARCHAR lose their declared length, and DECIMAL256 has no mapping here. This can change MAX(p)'s value or schema, or fail planning. Construct and validate both non-null and typed-NULL replacements against func.getDataType(); MIN/MAX.customSignature() can normalize DecimalV2 to DecimalV3, so the partition-column type alone is not always the result type.

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17578	3153	3137	3137
q2	2295	249	234	234
q3	10039	891	540	540
q4	4676	248	200	200
q5	7675	573	392	392
q6	144	122	94	94
q7	543	498	387	387
q8	9253	926	924	924
q9	3542	2424	2403	2403
q10	6499	852	700	700
q11	396	192	181	181
q12	615	253	198	198
q13	18170	1533	1172	1172
q14	164	152	139	139
q15	q16	450	403	371	371
q17	1466	924	807	807
q18	3133	2251	2237	2237
q19	1291	885	843	843
q20	379	291	202	202
q21	5610	1877	1944	1877
q22	324	273	234	234
Total cold run time: 94242 ms
Total hot run time: 17272 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	3556	3507	3461	3461
q2	515	390	379	379
q3	2218	2317	2174	2174
q4	1219	1182	915	915
q5	2209	2120	2109	2109
q6	180	129	88	88
q7	1066	965	896	896
q8	1656	1453	1456	1453
q9	3206	3167	3147	3147
q10	1889	1790	1615	1615
q11	367	273	259	259
q12	461	442	349	349
q13	1498	1538	1174	1174
q14	169	195	170	170
q15	q16	399	397	354	354
q17	3677	3259	3241	3241
q18	4915	4452	5053	4452
q19	963	874	894	874
q20	1039	976	831	831
q21	3841	3122	3266	3122
q22	399	344	322	322
Total cold run time: 35442 ms
Total hot run time: 31385 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 82832 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 4683176a4408fa6148365d5ef0cb39cf4c2aeeb5, data reload: false

query5	4269	423	335	335
query6	400	136	124	124
query7	4942	405	236	236
query8	296	123	115	115
query9	8680	2951	2928	2928
query10	375	226	185	185
query11	5382	1058	921	921
query12	121	73	73	73
query13	1196	451	343	343
query14	6153	2212	2110	2110
query14_1	1999	2003	1996	1996
query15	175	116	115	115
query16	936	370	355	355
query17	800	451	370	370
query18	2340	330	239	239
query19	168	137	113	113
query20	73	69	69	69
query21	206	100	88	88
query22	5460	5356	5385	5356
query23	6692	6201	6058	6058
query23_1	6057	6248	6002	6002
query24	7353	1102	802	802
query24_1	784	782	786	782
query25	450	323	268	268
query26	1233	240	127	127
query27	2782	435	255	255
query28	4656	1522	1519	1519
query29	948	450	370	370
query30	257	156	135	135
query31	843	408	333	333
query32	123	80	76	76
query33	467	222	185	185
query34	1039	875	491	491
query35	404	409	345	345
query36	587	564	532	532
query37	127	84	73	73
query38	1012	851	821	821
query39	513	475	471	471
query39_1	454	488	457	457
query40	213	94	82	82
query41	59	58	58	58
query42	81	72	77	72
query43	245	245	222	222
query44	1030	548	561	548
query45	117	104	100	100
query46	799	819	540	540
query47	757	753	706	706
query48	317	330	224	224
query49	597	256	188	188
query50	756	267	199	199
query51	8567	8274	8481	8274
query52	68	71	57	57
query53	190	202	143	143
query54	227	175	174	174
query55	81	64	54	54
query56	235	182	167	167
query57	694	665	671	665
query58	198	169	171	169
query59	1250	1248	1108	1108
query60	236	191	169	169
query61	167	117	124	117
query62	389	204	180	180
query63	169	141	141	141
query64	2774	674	605	605
query65	1633	1533	1634	1533
query66	1863	289	224	224
query67	9956	9833	9881	9833
query68	2789	1201	732	732
query69	349	231	196	196
query70	682	612	616	612
query71	247	170	168	168
query72	2379	1745	1551	1551
query73	679	602	349	349
query74	1566	1233	1133	1133
query75	1158	1115	950	950
query76	2294	763	553	553
query77	259	267	216	216
query78	3848	3757	3144	3144
query79	2846	837	595	595
query80	1589	347	263	263
query81	503	153	135	135
query82	674	126	96	96
query83	285	210	192	192
query84	303	108	90	90
query85	819	368	299	299
query86	422	181	181	181
query87	1022	958	914	914
query88	2873	2105	2110	2105
query89	288	198	178	178
query90	1925	124	126	124
query91	136	115	100	100
query92	77	67	69	67
query93	1706	1133	731	731
query94	654	252	214	214
query95	541	253	232	232
query96	787	594	281	281
query97	1074	1089	1017	1017
query98	160	134	130	130
query99	447	361	319	319
Total cold run time: 179297 ms
Total hot run time: 82832 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 14.73 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 4683176a4408fa6148365d5ef0cb39cf4c2aeeb5, data reload: false

query1	0.01	0.00	0.00
query2	0.08	0.04	0.04
query3	0.25	0.09	0.11
query4	1.61	0.10	0.11
query5	0.17	0.16	0.16
query6	1.24	0.71	0.71
query7	0.04	0.01	0.00
query8	0.05	0.03	0.03
query9	0.29	0.22	0.21
query10	0.35	0.34	0.35
query11	0.17	0.12	0.13
query12	0.16	0.13	0.13
query13	0.30	0.30	0.30
query14	0.46	0.45	0.45
query15	0.36	0.36	0.35
query16	0.23	0.23	0.23
query17	0.72	0.67	0.70
query18	0.18	0.16	0.17
query19	1.25	1.20	1.16
query20	0.01	0.01	0.01
query21	15.43	0.16	0.12
query22	5.04	0.04	0.05
query23	16.19	0.25	0.10
query24	3.41	0.34	0.26
query25	0.11	0.05	0.04
query26	0.72	0.16	0.12
query27	0.04	0.03	0.04
query28	3.61	0.52	0.30
query29	12.50	3.20	2.60
query30	0.26	0.11	0.12
query31	2.76	0.40	0.17
query32	3.51	0.33	0.24
query33	1.40	1.38	1.41
query34	15.31	2.20	1.75
query35	1.76	1.76	1.70
query36	0.47	0.30	0.28
query37	0.06	0.04	0.04
query38	0.04	0.04	0.03
query39	0.04	0.02	0.02
query40	0.12	0.08	0.08
query41	0.08	0.02	0.03
query42	0.04	0.02	0.02
query43	0.03	0.02	0.02
Total cold run time: 90.86 s
Total hot run time: 14.73 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 29.89% (26/87) 🎉
Increment coverage report
Complete coverage report

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.

3 participants