Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 6467661

Browse filesBrowse files
committed
Fix bug in HashAgg's selective-column-spilling logic.
Commit 2302302 taught nodeAgg.c that, when spilling tuples from memory in an oversized hash aggregation, it only needed to spill input columns referenced in the node's tlist and quals. Unfortunately, that's wrong: we also have to save the grouping columns. The error is masked in common cases because the grouping columns also appear in the tlist, but that's not necessarily true. The main category of plans where it's not true seem to come from semijoins ("WHERE outercol IN (SELECT innercol FROM innertable)") where the innercol needs an implicit promotion to make it comparable to the outercol. The grouping column will be "innercol::promotedtype", but that expression appears nowhere in the Agg node's own tlist and quals; only the bare "innercol" is found in the tlist. I spent quite a bit of time looking for a suitable regression test case for this, without much success. If the number of distinct values of the innercol is large enough to make spilling happen, the planner tends to prefer a non-HashAgg plan, at least for problem sizes that are reasonable to use in the regression tests. So, no new regression test. However, this patch does demonstrably fix the originally-reported test case. Per report from s.p.e (at) gmx-topmail.de. Backpatch to v13 where the troublesome code came in. Discussion: https://postgr.es/m/trinity-1c565d44-159f-488b-a518-caf13883134f-1611835701633@3c-app-gmx-bap78
1 parent 10fcb83 commit 6467661
Copy full SHA for 6467661

File tree

Expand file treeCollapse file tree

1 file changed

+7
-1
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+7
-1
lines changed

‎src/backend/executor/nodeAgg.c

Copy file name to clipboardExpand all lines: src/backend/executor/nodeAgg.c
+7-1Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1399,7 +1399,7 @@ project_aggregates(AggState *aggstate)
13991399
}
14001400

14011401
/*
1402-
* Walk tlist and qual to find referenced colnos, dividing them into
1402+
* Find input-tuple columns that are needed, dividing them into
14031403
* aggregated and unaggregated sets.
14041404
*/
14051405
static void
@@ -1412,9 +1412,15 @@ find_cols(AggState *aggstate, Bitmapset **aggregated, Bitmapset **unaggregated)
14121412
context.aggregated = NULL;
14131413
context.unaggregated = NULL;
14141414

1415+
/* Examine tlist and quals */
14151416
(void) find_cols_walker((Node *) agg->plan.targetlist, &context);
14161417
(void) find_cols_walker((Node *) agg->plan.qual, &context);
14171418

1419+
/* In some cases, grouping columns will not appear in the tlist */
1420+
for (int i = 0; i < agg->numCols; i++)
1421+
context.unaggregated = bms_add_member(context.unaggregated,
1422+
agg->grpColIdx[i]);
1423+
14181424
*aggregated = context.aggregated;
14191425
*unaggregated = context.unaggregated;
14201426
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.