-
Notifications
You must be signed in to change notification settings - Fork 5.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
*: only add default value for final aggregation to fix the aggregate push down (partition) union case #35443
Conversation
…push down (partition) union case
[REVIEW NOTIFICATION] This pull request has been approved by:
To complete the pull request process, please ask the reviewers in the list to review by filling The full list of commands accepted by this bot can be found here. Reviewer can indicate their review by submitting an approval review. |
/run-unit-test |
1 similar comment
/run-unit-test |
Code Coverage Details: https://codecov.io/github/pingcap/tidb/commit/e799be1077d7efc8c499f0315159a4f81eb06bf7 |
@@ -123,8 +123,6 @@ func (a *AggFuncDesc) Split(ordinal []int) (partialAggDesc, finalAggDesc *AggFun | |||
partialAggDesc.Mode = Partial1Mode | |||
} else if a.Mode == FinalMode { | |||
partialAggDesc.Mode = Partial2Mode | |||
} else { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why remove this check?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the previous assumption, there will be no partial mode agg before coprocessor push down...
But now I change the logical plan aggregation to partial, so in the coprocessor push down here, this line may meet partial mode agg.
@@ -1417,7 +1421,11 @@ func BuildFinalModeAggregation( | |||
} | |||
} | |||
|
|||
finalAggFunc.Mode = aggregation.FinalMode | |||
if aggFunc.Mode == aggregation.CompleteMode { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do not understand what does this code block mean
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the old assumption, before the coprocessor push down, the agg mode is either Complete or Final. So after the push down, the parent agg become Final mode.
But in the new assumption, before the coprocessor push down, the agg mode can be partial. So here the parent agg mode is set to different value accordingly.
For final before, we set it to final.
For partial, it's set to partial2
@@ -1417,7 +1421,11 @@ func BuildFinalModeAggregation( | |||
} | |||
} | |||
|
|||
finalAggFunc.Mode = aggregation.FinalMode | |||
if aggFunc.Mode == aggregation.CompleteMode { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you mean that when we are in the partition union mode. The Agg->PartitionUnion->TableReader may become Agg->PartitionUnion->Agg->TableReader, then we do the push down. So we need to add a new if-condition check.
You can add some comments here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agg1->PartitionUnion->Agg2->TableReader
In coprocessor push down, Agg2->TableReader become Agg3(root)->TableReader->Agg4(cop)->TableScan(cop), and the final plan become Agg1->PartitionUnion->Agg3(root)->TableReader->Agg4(cop)->TableScan(cop)
In the past, Agg2 is always Complete or Final, but in this PR here Agg2 could be Partial
So BuildFinalModeAggregation
need to consider the difference here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I add some comment in the code so the reviewer know what happen.
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-4.0 in PR #35765 |
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-5.0 in PR #35766 |
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-5.1 in PR #35767 |
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-5.2 in PR #35768 |
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-5.3 in PR #35769 |
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-5.4 in PR #35770 |
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-6.0 in PR #35771 |
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>
cherry pick to release-6.1 in PR #35772 |
TiDB MergeCI notify🔴 Bad News! [1] CI still failing after this pr merged.
|
* upstream/master: (57 commits) types: fix incompatible implementation of jsonpath extraction (pingcap#35320) planner: fix TRACE PLAN TARGET = 'estimation' panic when meeting partition table (pingcap#35743) *: Add `testfork.RunTest` to run multiple tests in one function (pingcap#35746) sessionctx/variable: add tests to ensure skipInit can be removed (pingcap#35703) helper: request another PD if one of them is unavailable (pingcap#35750) metrics: add cached table related metrics to grafana panel (pingcap#34718) expression: use cloned RetType at `evaluateExprWithNull` when it may be changed. (pingcap#35759) executor: fix left join on partition table generate invalid lock key (pingcap#35732) readme: remove adopters (pingcap/docs#8725) (pingcap#35124) *: only add default value for final aggregation to fix the aggregate push down (partition) union case (pingcap#35443) planner: fix the wrong cost formula of MPPExchanger on cost model ver2 (pingcap#35718) sessionctx: support encoding and decoding statement context (pingcap#35688) txn: refactor ts acquisition within build and execute phases (pingcap#35376) ddl: for schema-level DDL method parameter is now XXXStmt (pingcap#35722) *: enable gofmt (pingcap#35721) planner: disable collate clause support for enum or set column (pingcap#35684) *: Provide a util to "pause" session in uint test (pingcap#35529) ddl: implement the core for multi-schema change (pingcap#35429) parser: XXXDatabaseStmt now use CIStr for DB name (pingcap#35668) *: remove real tikv test on github actions (pingcap#35710) ...
What problem does this PR solve?
Issue Number: close #35295
Problem Summary:
When table
t
is empty, this get empty result:While this get
NULL
:We add
NULL
(default value) to the empty result here:tidb/executor/aggregate.go
Lines 1368 to 1379 in 2de01b4
Whether or not add the
NULL
row depends on some conditions.Note, for this case, the added
NULL
row make the final result wrong:What is changed and how it works?
Only add
NULL
for final aggregation.Otherwise the add
NULL
row operation would be done several times and send a wrongNULL
row to the final aggregation.Check List
Tests
Side effects
Documentation
Release note
Please refer to Release Notes Language Style Guide to write a quality release note.