Skip to content

Commit b536369

Browse files
authored
Merge pull request #65 from citusdata/disable_hashagg
Add support for disabling hash aggregate with hll
2 parents a5d1c4f + 9dc4c91 commit b536369

6 files changed

Lines changed: 1449 additions & 0 deletions

File tree

.travis.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
sudo: required
22
dist: trusty
33
language: c
4+
env:
5+
global:
6+
- PG_PRELOAD=hll
47
matrix:
58
fast_finish: true
69
include:

expected/disable_hashagg.out

Lines changed: 326 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,326 @@
1+
-- ----------------------------------------------------------------
2+
-- Regression tests for disabling hash aggregation
3+
-- ----------------------------------------------------------------
4+
-- Since we get different results for 3 different PG version sets, add following
5+
-- queries to specify version of the output easier.
6+
SHOW server_version \gset
7+
SELECT substring(:'server_version', '\d+\.\d+')::float > 9.5 as version_above_nine_five;
8+
version_above_nine_five
9+
-------------------------
10+
t
11+
(1 row)
12+
13+
SELECT substring(:'server_version', '\d+\.\d+')::float = 9.5 as versiong_nine_five;
14+
versiong_nine_five
15+
--------------------
16+
f
17+
(1 row)
18+
19+
SELECT substring(:'server_version', '\d+\.\d+')::float = 9.4 as versiong_nine_four;
20+
versiong_nine_four
21+
--------------------
22+
f
23+
(1 row)
24+
25+
SELECT hll_set_output_version(1);
26+
hll_set_output_version
27+
------------------------
28+
1
29+
(1 row)
30+
31+
CREATE TABLE tt1(id int, col_1 int, sd hll);
32+
INSERT INTO tt1 values(1,1, hll_empty());
33+
INSERT INTO tt1 values(1,2, hll_empty());
34+
UPDATE tt1 SET sd = hll_add(sd, hll_hash_integer(111)) WHERE id = 1 and col_1 = 1;
35+
UPDATE tt1 SET sd = hll_add(sd, hll_hash_integer(222)) WHERE id = 1 and col_1 = 2;
36+
INSERT INTO tt1 values(2,1, hll_empty());
37+
INSERT INTO tt1 values(2,2, hll_empty());
38+
UPDATE tt1 SET sd = hll_add(sd, hll_hash_integer(333)) WHERE id = 2 and col_1 = 1;
39+
UPDATE tt1 SET sd = hll_add(sd, hll_hash_integer(444)) WHERE id = 2 and col_1 = 2;
40+
-- Test with hll_union_agg
41+
SET hll.force_groupagg to OFF;
42+
EXPLAIN(COSTS OFF)
43+
SELECT
44+
id, hll_union_agg(sd)
45+
FROM
46+
tt1
47+
GROUP BY(id);
48+
QUERY PLAN
49+
-----------------------
50+
HashAggregate
51+
Group Key: id
52+
-> Seq Scan on tt1
53+
(3 rows)
54+
55+
SET hll.force_groupagg to ON;
56+
EXPLAIN(COSTS OFF)
57+
SELECT
58+
id, hll_union_agg(sd)
59+
FROM
60+
tt1
61+
GROUP BY(id);
62+
QUERY PLAN
63+
-----------------------------
64+
GroupAggregate
65+
Group Key: id
66+
-> Sort
67+
Sort Key: id
68+
-> Seq Scan on tt1
69+
(5 rows)
70+
71+
-- Test with operator over aggregate
72+
SET hll.force_groupagg to OFF;
73+
EXPLAIN(COSTS OFF)
74+
SELECT
75+
id, hll_union_agg(sd) || hll_union_agg(sd)
76+
FROM
77+
tt1
78+
GROUP BY(id);
79+
QUERY PLAN
80+
-----------------------
81+
HashAggregate
82+
Group Key: id
83+
-> Seq Scan on tt1
84+
(3 rows)
85+
86+
SET hll.force_groupagg to ON;
87+
EXPLAIN(COSTS OFF)
88+
SELECT
89+
id, hll_union_agg(sd) || hll_union_agg(sd)
90+
FROM
91+
tt1
92+
GROUP BY(id);
93+
QUERY PLAN
94+
-----------------------------
95+
GroupAggregate
96+
Group Key: id
97+
-> Sort
98+
Sort Key: id
99+
-> Seq Scan on tt1
100+
(5 rows)
101+
102+
-- Test with function over aggregate
103+
SET hll.force_groupagg to OFF;
104+
EXPLAIN(COSTS OFF)
105+
SELECT
106+
id, hll_cardinality(hll_union_agg(sd))
107+
FROM
108+
tt1
109+
GROUP BY(id);
110+
QUERY PLAN
111+
-----------------------
112+
HashAggregate
113+
Group Key: id
114+
-> Seq Scan on tt1
115+
(3 rows)
116+
117+
SET hll.force_groupagg to ON;
118+
EXPLAIN(COSTS OFF)
119+
SELECT
120+
id, hll_cardinality(hll_union_agg(sd))
121+
FROM
122+
tt1
123+
GROUP BY(id);
124+
QUERY PLAN
125+
-----------------------------
126+
GroupAggregate
127+
Group Key: id
128+
-> Sort
129+
Sort Key: id
130+
-> Seq Scan on tt1
131+
(5 rows)
132+
133+
-- Test with having clause
134+
SET hll.force_groupagg to OFF;
135+
EXPLAIN(COSTS OFF)
136+
SELECT
137+
id, hll_cardinality(hll_union_agg(sd))
138+
FROM
139+
tt1
140+
GROUP BY(id)
141+
HAVING hll_cardinality(hll_union_agg(sd)) > 1;
142+
QUERY PLAN
143+
------------------------------------------------------------------------
144+
HashAggregate
145+
Group Key: id
146+
Filter: (hll_cardinality(hll_union_agg(sd)) > '1'::double precision)
147+
-> Seq Scan on tt1
148+
(4 rows)
149+
150+
SET hll.force_groupagg to ON;
151+
EXPLAIN(COSTS OFF)
152+
SELECT
153+
id, hll_cardinality(hll_union_agg(sd))
154+
FROM
155+
tt1
156+
GROUP BY(id)
157+
HAVING hll_cardinality(hll_union_agg(sd)) > 1;
158+
QUERY PLAN
159+
------------------------------------------------------------------------
160+
GroupAggregate
161+
Group Key: id
162+
Filter: (hll_cardinality(hll_union_agg(sd)) > '1'::double precision)
163+
-> Sort
164+
Sort Key: id
165+
-> Seq Scan on tt1
166+
(6 rows)
167+
168+
-- Test hll_add_agg, first set work_mem to 256MB in order to use hash aggregate
169+
-- before forcing group aggregate
170+
SET work_mem TO '256MB';
171+
CREATE TABLE add_test_table(c1 bigint, c2 bigint);
172+
INSERT INTO add_test_table SELECT g, g FROM generate_series(1, 1000) AS g;
173+
-- Test with different hll_add_agg signatures
174+
SET hll.force_groupagg TO OFF;
175+
EXPLAIN(COSTS OFF)
176+
SELECT
177+
c1, hll_add_agg(hll_hash_bigint(c2))
178+
FROM
179+
add_test_table
180+
GROUP BY 1;
181+
QUERY PLAN
182+
----------------------------------
183+
HashAggregate
184+
Group Key: c1
185+
-> Seq Scan on add_test_table
186+
(3 rows)
187+
188+
SET hll.force_groupagg TO ON;
189+
EXPLAIN(COSTS OFF)
190+
SELECT
191+
c1, hll_add_agg(hll_hash_bigint(c2))
192+
FROM
193+
add_test_table
194+
GROUP BY 1;
195+
QUERY PLAN
196+
----------------------------------------
197+
GroupAggregate
198+
Group Key: c1
199+
-> Sort
200+
Sort Key: c1
201+
-> Seq Scan on add_test_table
202+
(5 rows)
203+
204+
SET hll.force_groupagg TO OFF;
205+
EXPLAIN(COSTS OFF)
206+
SELECT
207+
c1, hll_add_agg(hll_hash_bigint(c2), 10)
208+
FROM
209+
add_test_table
210+
GROUP BY 1;
211+
QUERY PLAN
212+
----------------------------------
213+
HashAggregate
214+
Group Key: c1
215+
-> Seq Scan on add_test_table
216+
(3 rows)
217+
218+
SET hll.force_groupagg TO ON;
219+
EXPLAIN(COSTS OFF)
220+
SELECT
221+
c1, hll_add_agg(hll_hash_bigint(c2), 10)
222+
FROM
223+
add_test_table
224+
GROUP BY 1;
225+
QUERY PLAN
226+
----------------------------------------
227+
GroupAggregate
228+
Group Key: c1
229+
-> Sort
230+
Sort Key: c1
231+
-> Seq Scan on add_test_table
232+
(5 rows)
233+
234+
SET hll.force_groupagg TO OFF;
235+
EXPLAIN(COSTS OFF)
236+
SELECT
237+
c1, hll_add_agg(hll_hash_bigint(c2), 10, 4)
238+
FROM
239+
add_test_table
240+
GROUP BY 1;
241+
QUERY PLAN
242+
----------------------------------
243+
HashAggregate
244+
Group Key: c1
245+
-> Seq Scan on add_test_table
246+
(3 rows)
247+
248+
SET hll.force_groupagg TO ON;
249+
EXPLAIN(COSTS OFF)
250+
SELECT
251+
c1, hll_add_agg(hll_hash_bigint(c2), 10, 4)
252+
FROM
253+
add_test_table
254+
GROUP BY 1;
255+
QUERY PLAN
256+
----------------------------------------
257+
GroupAggregate
258+
Group Key: c1
259+
-> Sort
260+
Sort Key: c1
261+
-> Seq Scan on add_test_table
262+
(5 rows)
263+
264+
SET hll.force_groupagg TO OFF;
265+
EXPLAIN(COSTS OFF)
266+
SELECT
267+
c1, hll_add_agg(hll_hash_bigint(c2), 10, 4, 512)
268+
FROM
269+
add_test_table
270+
GROUP BY 1;
271+
QUERY PLAN
272+
----------------------------------
273+
HashAggregate
274+
Group Key: c1
275+
-> Seq Scan on add_test_table
276+
(3 rows)
277+
278+
SET hll.force_groupagg TO ON;
279+
EXPLAIN(COSTS OFF)
280+
SELECT
281+
c1, hll_add_agg(hll_hash_bigint(c2), 10, 4, 512)
282+
FROM
283+
add_test_table
284+
GROUP BY 1;
285+
QUERY PLAN
286+
----------------------------------------
287+
GroupAggregate
288+
Group Key: c1
289+
-> Sort
290+
Sort Key: c1
291+
-> Seq Scan on add_test_table
292+
(5 rows)
293+
294+
SET hll.force_groupagg TO OFF;
295+
EXPLAIN(COSTS OFF)
296+
SELECT
297+
c1, hll_add_agg(hll_hash_bigint(c2), 10, 4, 512, 0)
298+
FROM
299+
add_test_table
300+
GROUP BY 1;
301+
QUERY PLAN
302+
----------------------------------
303+
HashAggregate
304+
Group Key: c1
305+
-> Seq Scan on add_test_table
306+
(3 rows)
307+
308+
SET hll.force_groupagg TO ON;
309+
EXPLAIN(COSTS OFF)
310+
SELECT
311+
c1, hll_add_agg(hll_hash_bigint(c2), 10, 4, 512, 0)
312+
FROM
313+
add_test_table
314+
GROUP BY 1;
315+
QUERY PLAN
316+
----------------------------------------
317+
GroupAggregate
318+
Group Key: c1
319+
-> Sort
320+
Sort Key: c1
321+
-> Seq Scan on add_test_table
322+
(5 rows)
323+
324+
RESET work_mem;
325+
DROP TABLE tt1;
326+
DROP TABLE add_test_table;

0 commit comments

Comments
 (0)