aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeRecursiveunion.c
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2019-02-09 00:35:57 -0800
committerAndres Freund <andres@anarazel.de>2019-02-09 01:05:49 -0800
commit356687bd825e5ca7230d43c1bffe7a59ad2e77bd (patch)
treebe80a6148a4164edae691341e586a604b39775d9 /src/backend/executor/nodeRecursiveunion.c
parent317ffdfeaac12e434b2befa24993dc1b52a140fd (diff)
downloadpostgresql-356687bd825e5ca7230d43c1bffe7a59ad2e77bd.tar.gz
postgresql-356687bd825e5ca7230d43c1bffe7a59ad2e77bd.zip
Reset, not recreate, execGrouping.c style hashtables.
This uses the facility added in the preceding commit to fix performance issues caused by rebuilding the hashtable (with its comparator expression being the most expensive bit), after every reset. That's especially important when the comparator is JIT compiled. Bug: #15592 #15486 Reported-By: Jakub Janeček, Dmitry Marakasov Author: Andres Freund Discussion: https://postgr.es/m/15486-05850f065da42931@postgresql.org https://postgr.es/m/20190114180423.ywhdg2iagzvh43we@alap3.anarazel.de Backpatch: 11, where I broke this in bf6c614a2f2c5
Diffstat (limited to 'src/backend/executor/nodeRecursiveunion.c')
-rw-r--r--src/backend/executor/nodeRecursiveunion.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/src/backend/executor/nodeRecursiveunion.c b/src/backend/executor/nodeRecursiveunion.c
index d2488ad988e..9b74ed3208c 100644
--- a/src/backend/executor/nodeRecursiveunion.c
+++ b/src/backend/executor/nodeRecursiveunion.c
@@ -37,17 +37,18 @@ build_hash_table(RecursiveUnionState *rustate)
Assert(node->numCols > 0);
Assert(node->numGroups > 0);
- rustate->hashtable = BuildTupleHashTable(&rustate->ps,
- desc,
- node->numCols,
- node->dupColIdx,
- rustate->eqfuncoids,
- rustate->hashfunctions,
- node->numGroups,
- 0,
- rustate->tableContext,
- rustate->tempContext,
- false);
+ rustate->hashtable = BuildTupleHashTableExt(&rustate->ps,
+ desc,
+ node->numCols,
+ node->dupColIdx,
+ rustate->eqfuncoids,
+ rustate->hashfunctions,
+ node->numGroups,
+ 0,
+ rustate->ps.state->es_query_cxt,
+ rustate->tableContext,
+ rustate->tempContext,
+ false);
}
@@ -317,9 +318,9 @@ ExecReScanRecursiveUnion(RecursiveUnionState *node)
if (node->tableContext)
MemoryContextResetAndDeleteChildren(node->tableContext);
- /* And rebuild empty hashtable if needed */
+ /* Empty hashtable if needed */
if (plan->numCols > 0)
- build_hash_table(node);
+ ResetTupleHashTable(node->hashtable);
/* reset processing state */
node->recursing = false;