From c7654f6a37792ab9525ff98b710c23b27c7868a5 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 6 Apr 2020 22:22:13 -0400 Subject: Fix representation of SORT_TYPE_STILL_IN_PROGRESS. It turns out that the code did indeed rely on a zeroed TuplesortInstrumentation.sortMethod field to indicate "this worker never did anything", although it seems the issue only comes up during certain race-condition-y cases. Hence, rearrange the TuplesortMethod enum to restore SORT_TYPE_STILL_IN_PROGRESS to having the value zero, and add some comments reinforcing that that isn't optional. Also future-proof a loop over the possible values of the enum. sizeof(bits32) happened to be the correct limit value, but only by purest coincidence. Per buildfarm and local investigation. Discussion: https://postgr.es/m/12222.1586223974@sss.pgh.pa.us --- src/backend/commands/explain.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/backend/commands/explain.c') diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index cad10662bb0..baaa5817af7 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -2762,14 +2762,14 @@ show_incremental_sort_group_info(IncrementalSortGroupInfo *groupInfo, List *methodNames = NIL; /* Generate a list of sort methods used across all groups. */ - for (int bit = 0; bit < sizeof(bits32); ++bit) + for (int bit = 0; bit < NUM_TUPLESORTMETHODS; bit++) { - if (groupInfo->sortMethods & (1 << bit)) + TuplesortMethod sortMethod = (1 << bit); + + if (groupInfo->sortMethods & sortMethod) { - TuplesortMethod sortMethod = (1 << bit); - const char *methodName; + const char *methodName = tuplesort_method_name(sortMethod); - methodName = tuplesort_method_name(sortMethod); methodNames = lappend(methodNames, unconstify(char *, methodName)); } } -- cgit v1.2.3