aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/execGrouping.c11
-rw-r--r--src/test/regress/expected/groupingsets.out30
-rw-r--r--src/test/regress/sql/groupingsets.sql7
3 files changed, 30 insertions, 18 deletions
diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c
index 058ee688041..8e8dbb1f205 100644
--- a/src/backend/executor/execGrouping.c
+++ b/src/backend/executor/execGrouping.c
@@ -23,6 +23,7 @@
#include "executor/executor.h"
#include "miscadmin.h"
#include "utils/lsyscache.h"
+#include "utils/hashutils.h"
#include "utils/memutils.h"
static uint32 TupleHashTableHash(struct tuplehash_hash *tb, const MinimalTuple tuple);
@@ -326,7 +327,7 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx,
* underestimated.
*/
if (use_variable_hash_iv)
- hashtable->hash_iv = hash_uint32(ParallelWorkerNumber);
+ hashtable->hash_iv = murmurhash32(ParallelWorkerNumber);
else
hashtable->hash_iv = 0;
@@ -510,7 +511,13 @@ TupleHashTableHash(struct tuplehash_hash *tb, const MinimalTuple tuple)
}
}
- return hashkey;
+ /*
+ * The way hashes are combined above, among each other and with the IV,
+ * doesn't lead to good bit perturbation. As the IV's goal is to lead to
+ * achieve that, perform a round of hashing of the combined hash -
+ * resulting in near perfect perturbation.
+ */
+ return murmurhash32(hashkey);
}
/*
diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out
index cbfdbfd8563..d21a494a9dd 100644
--- a/src/test/regress/expected/groupingsets.out
+++ b/src/test/regress/expected/groupingsets.out
@@ -1183,29 +1183,33 @@ explain (costs off)
-- simple rescan tests
select a, b, sum(v.x)
from (values (1),(2)) v(x), gstest_data(v.x)
- group by grouping sets (a,b);
+ group by grouping sets (a,b)
+ order by 1, 2, 3;
a | b | sum
---+---+-----
- 2 | | 6
1 | | 3
+ 2 | | 6
+ | 1 | 3
| 2 | 3
| 3 | 3
- | 1 | 3
(5 rows)
explain (costs off)
select a, b, sum(v.x)
from (values (1),(2)) v(x), gstest_data(v.x)
- group by grouping sets (a,b);
- QUERY PLAN
-------------------------------------------
- HashAggregate
- Hash Key: gstest_data.a
- Hash Key: gstest_data.b
- -> Nested Loop
- -> Values Scan on "*VALUES*"
- -> Function Scan on gstest_data
-(6 rows)
+ group by grouping sets (a,b)
+ order by 3, 1, 2;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Sort
+ Sort Key: (sum("*VALUES*".column1)), gstest_data.a, gstest_data.b
+ -> HashAggregate
+ Hash Key: gstest_data.a
+ Hash Key: gstest_data.b
+ -> Nested Loop
+ -> Values Scan on "*VALUES*"
+ -> Function Scan on gstest_data
+(8 rows)
select *
from (values (1),(2)) v(x),
diff --git a/src/test/regress/sql/groupingsets.sql b/src/test/regress/sql/groupingsets.sql
index b28d8217c12..eb680286030 100644
--- a/src/test/regress/sql/groupingsets.sql
+++ b/src/test/regress/sql/groupingsets.sql
@@ -342,12 +342,13 @@ explain (costs off)
select a, b, sum(v.x)
from (values (1),(2)) v(x), gstest_data(v.x)
- group by grouping sets (a,b);
+ group by grouping sets (a,b)
+ order by 1, 2, 3;
explain (costs off)
select a, b, sum(v.x)
from (values (1),(2)) v(x), gstest_data(v.x)
- group by grouping sets (a,b);
-
+ group by grouping sets (a,b)
+ order by 3, 1, 2;
select *
from (values (1),(2)) v(x),
lateral (select a, b, sum(v.x) from gstest_data(v.x) group by grouping sets (a,b)) s;