summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavan Deolasee2016-01-27 11:53:25 +0000
committerPavan Deolasee2016-10-18 09:47:52 +0000
commitddc95c703be878c98e24562365e336f7dbfb466d (patch)
treeb0f37f347eaefc182c45819f2d3fc245973ccafc
parentd30ee6999a54e3c7cc67a792211757d31295f205 (diff)
Fix a bug where a query was getting incorrectly FQSed when the GROUP BY clause
contains only non-distribution keys. Also rerun all the xc_groupby tests with enable_fast_query_shipping ON so that similar issues can be caught more easily
-rw-r--r--src/backend/optimizer/util/pgxcship.c2
-rw-r--r--src/test/regress/expected/xc_groupby.out2882
-rw-r--r--src/test/regress/sql/xc_groupby.sql385
3 files changed, 3268 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/pgxcship.c b/src/backend/optimizer/util/pgxcship.c
index 2197abe7f4..5a90dd11af 100644
--- a/src/backend/optimizer/util/pgxcship.c
+++ b/src/backend/optimizer/util/pgxcship.c
@@ -974,7 +974,7 @@ pgxc_shippability_walker(Node *node, Shippability_context *sc_context)
* participating in the query. All the rows of that relation with
* the same value of distribution column reside on same node.
*/
- if ((query->hasAggs || query->havingQual) &&
+ if ((query->hasAggs || query->havingQual || query->groupClause) &&
!pgxc_query_has_distcolgrouping(query))
pgxc_set_shippability_reason(sc_context, SS_NEED_SINGLENODE);
diff --git a/src/test/regress/expected/xc_groupby.out b/src/test/regress/expected/xc_groupby.out
index 64ce223a5b..6bebddc0b8 100644
--- a/src/test/regress/expected/xc_groupby.out
+++ b/src/test/regress/expected/xc_groupby.out
@@ -2839,3 +2839,2885 @@ drop table xc_groupby_def;
drop table xc_groupby_g;
reset enable_hashagg;
reset enable_fast_query_shipping;
+-- Now repeat all the tests with FQS turned on
+set enable_fast_query_shipping to on;
+-- Combination 1: enable_hashagg on and distributed tables
+set enable_hashagg to on;
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int);
+create table xc_groupby_tab2 (val int, val2 int);
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ count | sum | avg | ?column? | val2
+-------+-----+--------------------+------------------+------
+ 3 | 6 | 2.0000000000000000 | 2 | 1
+ 3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
+ 2 | 8 | 4.0000000000000000 | 4 | 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.count(*), pg_catalog.sum((sum(val))), pg_catalog.avg((avg(val))), ((pg_catalog.sum((sum(val))))::double precision / (pg_catalog.count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: count(*), sum(val), avg(val), val2
+ -> HashAggregate
+ Output: count(*), sum(val), avg(val), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(10 rows)
+
+-- joins and group by
+select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+ count | sum | avg | ?column? | val2 | val2
+-------+-----+---------------------+------------------+------+------
+ 9 | 78 | 8.6666666666666667 | 8.66666666666667 | 1 | 1
+ 6 | 96 | 16.0000000000000000 | 16 | 2 | 2
+ 3 | | | | 3 |
+ 3 | | | | | 4
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.count(*), pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))), pg_catalog.avg((avg((xc_groupby_tab1.val * xc_groupby_tab2.val)))), ((pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))))::double precision / (pg_catalog.count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Remote Subquery Scan on all
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> GroupAggregate
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Merge Full Join
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Distribute results by H: val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ -> Materialize
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Distribute results by H: val2
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val2
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(32 rows)
+
+-- aggregates over aggregates
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+ sum
+-----
+ 17
+ 8
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------
+ HashAggregate
+ Output: sum((pg_catalog.sum((sum(xc_groupby_tab1.val))))), ((xc_groupby_tab1.val2 % 2))
+ Group Key: (xc_groupby_tab1.val2 % 2)
+ -> HashAggregate
+ Output: pg_catalog.sum((sum(xc_groupby_tab1.val))), (xc_groupby_tab1.val2 % 2), xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: sum(xc_groupby_tab1.val), xc_groupby_tab1.val2, xc_groupby_tab1.val2
+ -> HashAggregate
+ Output: sum(xc_groupby_tab1.val), xc_groupby_tab1.val2, xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+(13 rows)
+
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+ val2
+------
+ 1
+ 3
+ 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+------------------------------------------------------
+ HashAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2
+ -> HashAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(10 rows)
+
+select val + val2 from xc_groupby_tab1 group by val + val2;
+ ?column?
+----------
+ 8
+ 4
+ 3
+ 9
+ 2
+ 7
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
+ QUERY PLAN
+-----------------------------------------------------------------------
+ HashAggregate
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (val + val2)
+ -> HashAggregate
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(10 rows)
+
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+ ?column? | val | val2
+----------+-----+------
+ 8 | 6 | 2
+ 4 | 2 | 2
+ 4 | 1 | 3
+ 9 | 6 | 3
+ 3 | 2 | 1
+ 2 | 1 | 1
+ 4 | 3 | 1
+ 7 | 4 | 3
+(8 rows)
+
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab1.val2), xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Remote query: SELECT (val + val2), val, val2 FROM xc_groupby_tab1 GROUP BY val, val2
+ -> HashAggregate
+ Output: (val + val2), val, val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(8 rows)
+
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+ ?column? | val | val2
+----------+-----+------
+ 6 | 2 | 4
+ 2 | 1 | 1
+ 6 | 4 | 2
+ 7 | 3 | 4
+ 5 | 3 | 2
+ 5 | 4 | 1
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Remote query: SELECT (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2 FROM xc_groupby_tab1, xc_groupby_tab2 WHERE (xc_groupby_tab1.val = xc_groupby_tab2.val) GROUP BY xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> HashAggregate
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Merge Join
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(19 rows)
+
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ ?column?
+----------
+ 5
+ 7
+ 2
+ 6
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ HashAggregate
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> HashAggregate
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Merge Join
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(21 rows)
+
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ ?column? | val2
+---------------------+------
+ 11.0000000000000000 | 1
+ 17.6666666666666667 | 3
+ 14.0000000000000000 | 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------
+ HashAggregate
+ Output: (((pg_catalog.count(*) + pg_catalog.sum((sum(val)))))::numeric + pg_catalog.avg((avg(val)))), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: count(*), sum(val), avg(val), val2
+ -> HashAggregate
+ Output: count(*), sum(val), avg(val), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(10 rows)
+
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ sum | avg | ?column?
+-----+--------------------+----------
+ 8 | 4.0000000000000000 | 4
+ 11 | 3.6666666666666667 | 6
+ 6 | 2.0000000000000000 | 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ QUERY PLAN
+--------------------------------------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.sum((sum(val))), pg_catalog.avg((avg(val))), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: sum(val), avg(val), (2 * val2)
+ -> HashAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(10 rows)
+
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25));
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+select a,count(a) from xc_groupby_def group by a order by a;
+ a | count
+----+-------
+ 1 | 1
+ 2 | 2
+ 3 | 1
+ 4 | 1
+ 5 | 1
+ 6 | 1
+ 7 | 1
+ 8 | 1
+ 9 | 1
+ 10 | 1
+ | 0
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: a, count(a)
+ -> Sort
+ Output: a, (count(a))
+ Sort Key: xc_groupby_def.a
+ -> HashAggregate
+ Output: a, count(a)
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+
+ 8.0000000000000000
+ 1.00000000000000000000
+ 5.0000000000000000
+ 9.0000000000000000
+ 6.0000000000000000
+ 2.0000000000000000
+ 4.0000000000000000
+ 3.0000000000000000
+ 10.0000000000000000
+ 7.0000000000000000
+(11 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+
+ 8.0000000000000000
+ 1.00000000000000000000
+ 5.0000000000000000
+ 9.0000000000000000
+ 6.0000000000000000
+ 2.0000000000000000
+ 4.0000000000000000
+ 3.0000000000000000
+ 10.0000000000000000
+ 7.0000000000000000
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+ QUERY PLAN
+-----------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(a), a
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(7 rows)
+
+select avg(a) from xc_groupby_def group by b;
+ avg
+--------------------
+ 4.0000000000000000
+ 4.5000000000000000
+ 6.2000000000000000
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.avg((avg(a))), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: avg(a), b
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
+select sum(a) from xc_groupby_def group by b;
+ sum
+-----
+ 8
+ 18
+ 31
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.sum((sum(a))), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: sum(a), b
+ -> HashAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
+select count(*) from xc_groupby_def group by b;
+ count
+-------
+ 3
+ 4
+ 5
+ 1
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.count(*), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: count(*), b
+ -> HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(10 rows)
+
+select count(*) from xc_groupby_def where a is not null group by a;
+ count
+-------
+ 1
+ 1
+ 1
+ 1
+ 1
+ 2
+ 1
+ 1
+ 1
+ 1
+(10 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+ QUERY PLAN
+------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: count(*), a
+ -> HashAggregate
+ Output: count(*), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+ Filter: (xc_groupby_def.a IS NOT NULL)
+(8 rows)
+
+select * from (select b from xc_groupby_def group by b) q order by q.b;
+ b
+-------
+ One
+ Three
+ Two
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select b from xc_groupby_def group by b) q order by q.b;
+ QUERY PLAN
+----------------------------------------------------------------------
+ Sort
+ Output: xc_groupby_def.b
+ Sort Key: xc_groupby_def.b
+ -> HashAggregate
+ Output: xc_groupby_def.b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_def.b
+ -> HashAggregate
+ Output: xc_groupby_def.b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: xc_groupby_def.a, xc_groupby_def.b
+(13 rows)
+
+select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+ b | count
+-------+-------
+ One | 1
+ Three | 5
+ Two | 4
+ | 0
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+ QUERY PLAN
+-----------------------------------------------------------------------
+ Sort
+ Output: xc_groupby_def.b, (count((count(xc_groupby_def.b))))
+ Sort Key: xc_groupby_def.b
+ -> HashAggregate
+ Output: xc_groupby_def.b, count((count(xc_groupby_def.b)))
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_def.b, count(xc_groupby_def.b)
+ -> HashAggregate
+ Output: xc_groupby_def.b, count(xc_groupby_def.b)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: xc_groupby_def.a, xc_groupby_def.b
+(13 rows)
+
+select count(*) from xc_groupby_def where b is null group by b;
+ count
+-------
+ 3
+(1 row)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+ QUERY PLAN
+--------------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.count(*), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: count(*), b
+ -> HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+ Filter: (xc_groupby_def.b IS NULL)
+(11 rows)
+
+create table xc_groupby_g(a int, b float, c numeric);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+select sum(a) from xc_groupby_g group by a;
+ sum
+-----
+ 2
+ 2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+ QUERY PLAN
+---------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum(a), a
+ -> HashAggregate
+ Output: sum(a), a
+ Group Key: xc_groupby_g.a
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(7 rows)
+
+select sum(b) from xc_groupby_g group by b;
+ sum
+-----
+ 4.2
+ 2.3
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+ QUERY PLAN
+---------------------------------------------------
+ HashAggregate
+ Output: sum((sum(b))), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: sum(b), b
+ -> HashAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
+select sum(c) from xc_groupby_g group by b;
+ sum
+-----
+ 6.4
+ 5.2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+ QUERY PLAN
+---------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.sum((sum(c))), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: sum(c), b
+ -> HashAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
+select avg(a) from xc_groupby_g group by b;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+ QUERY PLAN
+---------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.avg((avg(a))), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: avg(a), b
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
+select avg(b) from xc_groupby_g group by c;
+ avg
+-----
+ 2.3
+ 2.1
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+ QUERY PLAN
+---------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.avg((avg(b))), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
+ Output: avg(b), c
+ -> HashAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
+select avg(c) from xc_groupby_g group by c;
+ avg
+--------------------
+ 5.2000000000000000
+ 3.2000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+ QUERY PLAN
+---------------------------------------------------
+ HashAggregate
+ Output: pg_catalog.avg((avg(c))), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
+ Output: avg(c), c
+ -> HashAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(10 rows)
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+-- Combination 2, enable_hashagg on and replicated tables.
+-- repeat the same tests for replicated tables
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int) distribute by replication;
+create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ count | sum | avg | ?column? | val2
+-------+-----+--------------------+------------------+------
+ 3 | 6 | 2.0000000000000000 | 2 | 1
+ 3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
+ 2 | 8 | 4.0000000000000000 | 4 | 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), sum(xc_groupby_tab1.val), avg(xc_groupby_tab1.val), ((sum(xc_groupby_tab1.val))::double precision / (count(*))::double precision), xc_groupby_tab1.val2
+ Remote query: SELECT count(*) AS count, sum(val) AS sum, avg(val) AS avg, ((sum(val))::double precision / (count(*))::double precision), val2 FROM xc_groupby_tab1 GROUP BY val2
+ -> HashAggregate
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(8 rows)
+
+-- joins and group by
+select * from (select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2 c1, xc_groupby_tab2.val2 c2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2) q order by q.c1, q.c2;
+ count | sum | avg | ?column? | c1 | c2
+-------+-----+---------------------+------------------+----+----
+ 9 | 78 | 8.6666666666666667 | 8.66666666666667 | 1 | 1
+ 6 | 96 | 16.0000000000000000 | 16 | 2 | 2
+ 3 | | | | 3 |
+ 3 | | | | | 4
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2 c1, xc_groupby_tab2.val2 c2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2) q order by q.c1, q.c2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: count, sum, avg, "?column?", c1, c2
+ -> GroupAggregate
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), ((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))::double precision / (count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Merge Full Join
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val2
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(21 rows)
+
+-- aggregates over aggregates
+select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
+ sum
+-----
+ 8
+ 17
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: q.sum
+ -> Sort
+ Output: q.sum
+ Sort Key: q.sum
+ -> Subquery Scan on q
+ Output: q.sum
+ -> HashAggregate
+ Output: sum((sum(xc_groupby_tab1.val))), ((xc_groupby_tab1.val2 % 2))
+ Group Key: (xc_groupby_tab1.val2 % 2)
+ -> HashAggregate
+ Output: sum(xc_groupby_tab1.val), (xc_groupby_tab1.val2 % 2), xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+(15 rows)
+
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+ val2
+------
+ 1
+ 3
+ 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+----------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: xc_groupby_tab1.val2
+ Remote query: SELECT val2 FROM xc_groupby_tab1 GROUP BY val2
+ -> HashAggregate
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(8 rows)
+
+select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
+ sum
+-----
+ 2
+ 3
+ 4
+ 7
+ 8
+ 9
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
+ QUERY PLAN
+--------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> HashAggregate
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+(10 rows)
+
+select * from (select val + val2, val, val2 from xc_groupby_tab1 group by val, val2) q order by q.val, q.val2;
+ ?column? | val | val2
+----------+-----+------
+ 2 | 1 | 1
+ 4 | 1 | 3
+ 3 | 2 | 1
+ 4 | 2 | 2
+ 4 | 3 | 1
+ 7 | 4 | 3
+ 8 | 6 | 2
+ 9 | 6 | 3
+(8 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select val + val2, val, val2 from xc_groupby_tab1 group by val, val2) q order by q.val, q.val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: "?column?", val, val2
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab1.val2)), xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> HashAggregate
+ Output: (xc_groupby_tab1.val + xc_groupby_tab1.val2), xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val, xc_groupby_tab1.val2
+(10 rows)
+
+select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2) q order by q.val, q.val2;
+ ?column? | val | val2
+----------+-----+------
+ 2 | 1 | 1
+ 6 | 2 | 4
+ 5 | 3 | 2
+ 7 | 3 | 4
+ 5 | 4 | 1
+ 6 | 4 | 2
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2) q order by q.val, q.val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: "?column?", val, val2
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2)), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> HashAggregate
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Merge Join
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(21 rows)
+
+select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
+ sum
+-----
+ 2
+ 5
+ 6
+ 7
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ -> HashAggregate
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Merge Join
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(21 rows)
+
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ ?column? | val2
+---------------------+------
+ 11.0000000000000000 | 1
+ 17.6666666666666667 | 3
+ 14.0000000000000000 | 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (((count(*) + sum(xc_groupby_tab1.val)))::numeric + avg(xc_groupby_tab1.val)), xc_groupby_tab1.val2
+ Remote query: SELECT (((count(*) + sum(val)))::numeric + avg(val)), val2 FROM xc_groupby_tab1 GROUP BY val2
+ -> HashAggregate
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(8 rows)
+
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ sum | avg | ?column?
+-----+--------------------+----------
+ 8 | 4.0000000000000000 | 4
+ 11 | 3.6666666666666667 | 6
+ 6 | 2.0000000000000000 | 2
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_tab1.val), avg(xc_groupby_tab1.val), (2 * xc_groupby_tab1.val2)
+ Remote query: SELECT sum(val) AS sum, avg(val) AS avg, (2 * val2) FROM xc_groupby_tab1 GROUP BY (2 * val2)
+ -> HashAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(8 rows)
+
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25)) distribute by replication;
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+select a,count(a) from xc_groupby_def group by a order by a;
+ a | count
+----+-------
+ 1 | 1
+ 2 | 2
+ 3 | 1
+ 4 | 1
+ 5 | 1
+ 6 | 1
+ 7 | 1
+ 8 | 1
+ 9 | 1
+ 10 | 1
+ | 0
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: xc_groupby_def.a, count(xc_groupby_def.a)
+ Remote query: SELECT a, count(a) AS count FROM xc_groupby_def GROUP BY a ORDER BY a
+ -> Sort
+ Output: a, (count(a))
+ Sort Key: xc_groupby_def.a
+ -> HashAggregate
+ Output: a, count(a)
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(11 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+
+ 8.0000000000000000
+ 4.0000000000000000
+ 1.00000000000000000000
+ 5.0000000000000000
+ 3.0000000000000000
+ 10.0000000000000000
+ 9.0000000000000000
+ 6.0000000000000000
+ 2.0000000000000000
+ 7.0000000000000000
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.a
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY a
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(8 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+
+ 8.0000000000000000
+ 4.0000000000000000
+ 1.00000000000000000000
+ 5.0000000000000000
+ 3.0000000000000000
+ 10.0000000000000000
+ 9.0000000000000000
+ 6.0000000000000000
+ 2.0000000000000000
+ 7.0000000000000000
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.a
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY a
+ -> HashAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(8 rows)
+
+select avg(a) from xc_groupby_def group by b;
+ avg
+--------------------
+ 4.0000000000000000
+ 4.5000000000000000
+ 6.2000000000000000
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.b
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY b
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(8 rows)
+
+select sum(a) from xc_groupby_def group by b;
+ sum
+-----
+ 8
+ 18
+ 31
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_def.a), xc_groupby_def.b
+ Remote query: SELECT sum(a) AS sum FROM xc_groupby_def GROUP BY b
+ -> HashAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(8 rows)
+
+select count(*) from xc_groupby_def group by b;
+ count
+-------
+ 3
+ 4
+ 5
+ 1
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+ QUERY PLAN
+-------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.b
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def GROUP BY b
+ -> HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+(8 rows)
+
+select count(*) from xc_groupby_def where a is not null group by a;
+ count
+-------
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 2
+ 1
+(10 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.a
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def WHERE (a IS NOT NULL) GROUP BY a
+ -> HashAggregate
+ Output: count(*), a
+ Group Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+ Filter: (xc_groupby_def.a IS NOT NULL)
+(9 rows)
+
+select * from (select b from xc_groupby_def group by b) q order by q.b;
+ b
+-------
+ One
+ Three
+ Two
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select b from xc_groupby_def group by b) q order by q.b;
+ QUERY PLAN
+----------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: b
+ -> Sort
+ Output: xc_groupby_def.b
+ Sort Key: xc_groupby_def.b
+ -> HashAggregate
+ Output: xc_groupby_def.b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: xc_groupby_def.a, xc_groupby_def.b
+(10 rows)
+
+select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+ b | count
+-------+-------
+ One | 1
+ Three | 5
+ Two | 4
+ | 0
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+ QUERY PLAN
+-----------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: b, count
+ -> Sort
+ Output: xc_groupby_def.b, (count(xc_groupby_def.b))
+ Sort Key: xc_groupby_def.b
+ -> HashAggregate
+ Output: xc_groupby_def.b, count(xc_groupby_def.b)
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: xc_groupby_def.a, xc_groupby_def.b
+(10 rows)
+
+select count(*) from xc_groupby_def where b is null group by b;
+ count
+-------
+ 3
+(1 row)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.b
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def WHERE (b IS NULL) GROUP BY b
+ -> HashAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: a, b
+ Filter: (xc_groupby_def.b IS NULL)
+(9 rows)
+
+create table xc_groupby_g(a int, b float, c numeric) distribute by replication;
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+select sum(a) from xc_groupby_g group by a;
+ sum
+-----
+ 2
+ 2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.a), xc_groupby_g.a
+ Remote query: SELECT sum(a) AS sum FROM xc_groupby_g GROUP BY a
+ -> HashAggregate
+ Output: sum(a), a
+ Group Key: xc_groupby_g.a
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(8 rows)
+
+select sum(b) from xc_groupby_g group by b;
+ sum
+-----
+ 4.2
+ 2.3
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.b), xc_groupby_g.b
+ Remote query: SELECT sum(b) AS sum FROM xc_groupby_g GROUP BY b
+ -> HashAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(8 rows)
+
+select sum(c) from xc_groupby_g group by b;
+ sum
+-----
+ 6.4
+ 5.2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.c), xc_groupby_g.b
+ Remote query: SELECT sum(c) AS sum FROM xc_groupby_g GROUP BY b
+ -> HashAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(8 rows)
+
+select avg(a) from xc_groupby_g group by b;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.a), xc_groupby_g.b
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_g GROUP BY b
+ -> HashAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(8 rows)
+
+select avg(b) from xc_groupby_g group by c;
+ avg
+-----
+ 2.3
+ 2.1
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.b), xc_groupby_g.c
+ Remote query: SELECT avg(b) AS avg FROM xc_groupby_g GROUP BY c
+ -> HashAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(8 rows)
+
+select avg(c) from xc_groupby_g group by c;
+ avg
+--------------------
+ 5.2000000000000000
+ 3.2000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.c), xc_groupby_g.c
+ Remote query: SELECT avg(c) AS avg FROM xc_groupby_g GROUP BY c
+ -> HashAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: a, b, c
+(8 rows)
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+reset enable_hashagg;
+-- Combination 3 enable_hashagg off and distributed tables
+set enable_hashagg to off;
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int);
+create table xc_groupby_tab2 (val int, val2 int);
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ count | sum | avg | ?column? | val2
+-------+-----+--------------------+------------------+------
+ 3 | 6 | 2.0000000000000000 | 2 | 1
+ 2 | 8 | 4.0000000000000000 | 4 | 2
+ 3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.count(*), pg_catalog.sum((sum(val))), pg_catalog.avg((avg(val))), ((pg_catalog.sum((sum(val))))::double precision / (pg_catalog.count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: count(*), sum(val), avg(val), val2
+ -> GroupAggregate
+ Output: count(*), sum(val), avg(val), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2, val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2, val
+(13 rows)
+
+-- joins and group by
+select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+ count | sum | avg | ?column? | val2 | val2
+-------+-----+---------------------+------------------+------+------
+ 9 | 78 | 8.6666666666666667 | 8.66666666666667 | 1 | 1
+ 6 | 96 | 16.0000000000000000 | 16 | 2 | 2
+ 3 | | | | 3 |
+ 3 | | | | | 4
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.count(*), pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))), pg_catalog.avg((avg((xc_groupby_tab1.val * xc_groupby_tab2.val)))), ((pg_catalog.sum((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))))::double precision / (pg_catalog.count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Remote Subquery Scan on all
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> GroupAggregate
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Merge Full Join
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Distribute results by H: val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ -> Materialize
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ -> Remote Subquery Scan on all
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Distribute results by H: val2
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val2
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(32 rows)
+
+-- aggregates over aggregates
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+ sum
+-----
+ 8
+ 17
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------------------
+ GroupAggregate
+ Output: sum(q1.y), q1.x
+ Group Key: q1.x
+ -> Sort
+ Output: q1.x, q1.y
+ Sort Key: q1.x
+ -> Subquery Scan on q1
+ Output: q1.x, q1.y
+ -> GroupAggregate
+ Output: pg_catalog.sum((sum(xc_groupby_tab1.val))), (xc_groupby_tab1.val2 % 2), xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: sum(xc_groupby_tab1.val), xc_groupby_tab1.val2, xc_groupby_tab1.val2
+ -> GroupAggregate
+ Output: sum(xc_groupby_tab1.val), xc_groupby_tab1.val2, xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+(21 rows)
+
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+ val2
+------
+ 1
+ 2
+ 3
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+------------------------------------------------------
+ Group
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: val2
+ -> Sort
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2
+(10 rows)
+
+select val + val2 from xc_groupby_tab1 group by val + val2;
+ ?column?
+----------
+ 2
+ 3
+ 4
+ 7
+ 8
+ 9
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
+ QUERY PLAN
+------------------------------------------------------------------------
+ Group
+ Output: ((val + val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: (val + val2)
+ -> Sort
+ Output: ((val + val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(10 rows)
+
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+ ?column? | val | val2
+----------+-----+------
+ 2 | 1 | 1
+ 4 | 1 | 3
+ 3 | 2 | 1
+ 4 | 2 | 2
+ 8 | 6 | 2
+ 9 | 6 | 3
+ 4 | 3 | 1
+ 7 | 4 | 3
+(8 rows)
+
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab1.val2), xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Remote query: SELECT (val + val2), val, val2 FROM xc_groupby_tab1 GROUP BY val, val2
+ -> Group
+ Output: (val + val2), val, val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Sort
+ Output: val, val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(11 rows)
+
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+ ?column? | val | val2
+----------+-----+------
+ 2 | 1 | 1
+ 6 | 2 | 4
+ 5 | 3 | 2
+ 7 | 3 | 4
+ 5 | 4 | 1
+ 6 | 4 | 2
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Remote query: SELECT (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2 FROM xc_groupby_tab1, xc_groupby_tab2 WHERE (xc_groupby_tab1.val = xc_groupby_tab2.val) GROUP BY xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Group
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Merge Join
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(22 rows)
+
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ ?column?
+----------
+ 2
+ 5
+ 6
+ 7
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------
+ Group
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Remote Subquery Scan on all
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ -> Merge Join
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(21 rows)
+
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ ?column? | val2
+---------------------+------
+ 11.0000000000000000 | 1
+ 14.0000000000000000 | 2
+ 17.6666666666666667 | 3
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------
+ GroupAggregate
+ Output: (((pg_catalog.count(*) + pg_catalog.sum((sum(val)))))::numeric + pg_catalog.avg((avg(val)))), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Remote Subquery Scan on all
+ Output: count(*), sum(val), avg(val), val2
+ -> GroupAggregate
+ Output: count(*), sum(val), avg(val), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2, val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2, val
+(13 rows)
+
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ sum | avg | ?column?
+-----+--------------------+----------
+ 6 | 2.0000000000000000 | 2
+ 8 | 4.0000000000000000 | 4
+ 11 | 3.6666666666666667 | 6
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ QUERY PLAN
+--------------------------------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.sum((sum(val))), pg_catalog.avg((avg(val))), ((2 * val2))
+ Group Key: (2 * xc_groupby_tab1.val2)
+ -> Remote Subquery Scan on all
+ Output: sum(val), avg(val), (2 * val2)
+ -> GroupAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: ((2 * xc_groupby_tab1.val2))
+ -> Sort
+ Output: ((2 * val2)), val
+ Sort Key: ((2 * xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(13 rows)
+
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25));
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+select a,count(a) from xc_groupby_def group by a order by a;
+ a | count
+----+-------
+ 1 | 1
+ 2 | 2
+ 3 | 1
+ 4 | 1
+ 5 | 1
+ 6 | 1
+ 7 | 1
+ 8 | 1
+ 9 | 1
+ 10 | 1
+ | 0
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: a, count(a)
+ -> GroupAggregate
+ Output: a, count(a)
+ Group Key: xc_groupby_def.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a
+(10 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+ 3.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
+ 6.0000000000000000
+ 7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
+(11 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+ 3.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
+ 6.0000000000000000
+ 7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+ QUERY PLAN
+-----------------------------------------------------
+ Remote Subquery Scan on all
+ Output: avg(a), a
+ -> GroupAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a
+(10 rows)
+
+select avg(a) from xc_groupby_def group by b;
+ avg
+--------------------
+
+ 6.2000000000000000
+ 4.5000000000000000
+ 4.0000000000000000
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.avg((avg(a))), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: avg(a), b
+ -> GroupAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b, a
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b, a
+(13 rows)
+
+select sum(a) from xc_groupby_def group by b;
+ sum
+-----
+
+ 31
+ 18
+ 8
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.sum((sum(a))), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: sum(a), b
+ -> GroupAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b, a
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b, a
+(13 rows)
+
+select count(*) from xc_groupby_def group by b;
+ count
+-------
+ 1
+ 5
+ 4
+ 3
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.count(*), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: count(*), b
+ -> GroupAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(13 rows)
+
+select count(*) from xc_groupby_def where a is not null group by a;
+ count
+-------
+ 1
+ 2
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+(10 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+ QUERY PLAN
+------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: count(*), a
+ -> GroupAggregate
+ Output: count(*), a
+ Group Key: xc_groupby_def.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a
+ Filter: (xc_groupby_def.a IS NOT NULL)
+(11 rows)
+
+select b from xc_groupby_def group by b;
+ b
+-------
+ One
+ Three
+ Two
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select b from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------
+ Group
+ Output: b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(10 rows)
+
+select b,count(b) from xc_groupby_def group by b;
+ b | count
+-------+-------
+ One | 1
+ Three | 5
+ Two | 4
+ | 0
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select b,count(b) from xc_groupby_def group by b;
+ QUERY PLAN
+-----------------------------------------------------------
+ GroupAggregate
+ Output: b, count((count(b)))
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: b, count(b)
+ -> GroupAggregate
+ Output: b, count(b)
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(13 rows)
+
+select count(*) from xc_groupby_def where b is null group by b;
+ count
+-------
+ 3
+(1 row)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+ QUERY PLAN
+--------------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.count(*), b
+ Group Key: xc_groupby_def.b
+ -> Remote Subquery Scan on all
+ Output: count(*), b
+ -> GroupAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+ Filter: (xc_groupby_def.b IS NULL)
+(14 rows)
+
+create table xc_groupby_g(a int, b float, c numeric);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+select sum(a) from xc_groupby_g group by a;
+ sum
+-----
+ 2
+ 2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+ QUERY PLAN
+---------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum(a), a
+ -> GroupAggregate
+ Output: sum(a), a
+ Group Key: xc_groupby_g.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_g.a
+ -> Seq Scan on public.xc_groupby_g
+ Output: a
+(10 rows)
+
+select sum(b) from xc_groupby_g group by b;
+ sum
+-----
+ 4.2
+ 2.3
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+ QUERY PLAN
+---------------------------------------------------------
+ GroupAggregate
+ Output: sum((sum(b))), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: sum(b), b
+ -> GroupAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: b
+(13 rows)
+
+select sum(c) from xc_groupby_g group by b;
+ sum
+-----
+ 6.4
+ 5.2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+ QUERY PLAN
+---------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.sum((sum(c))), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: sum(c), b
+ -> GroupAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Sort
+ Output: b, c
+ Sort Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: b, c
+(13 rows)
+
+select avg(a) from xc_groupby_g group by b;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+ QUERY PLAN
+---------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.avg((avg(a))), b
+ Group Key: xc_groupby_g.b
+ -> Remote Subquery Scan on all
+ Output: avg(a), b
+ -> GroupAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Sort
+ Output: b, a
+ Sort Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: b, a
+(13 rows)
+
+select avg(b) from xc_groupby_g group by c;
+ avg
+-----
+ 2.1
+ 2.3
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+ QUERY PLAN
+---------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.avg((avg(b))), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
+ Output: avg(b), c
+ -> GroupAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Sort
+ Output: c, b
+ Sort Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: c, b
+(13 rows)
+
+select avg(c) from xc_groupby_g group by c;
+ avg
+--------------------
+ 3.2000000000000000
+ 5.2000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+ QUERY PLAN
+---------------------------------------------------------
+ GroupAggregate
+ Output: pg_catalog.avg((avg(c))), c
+ Group Key: xc_groupby_g.c
+ -> Remote Subquery Scan on all
+ Output: avg(c), c
+ -> GroupAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Sort
+ Output: c
+ Sort Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: c
+(13 rows)
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+-- Combination 4 enable_hashagg off and replicated tables.
+-- repeat the same tests for replicated tables
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int) distribute by replication;
+create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ count | sum | avg | ?column? | val2
+-------+-----+--------------------+------------------+------
+ 3 | 6 | 2.0000000000000000 | 2 | 1
+ 2 | 8 | 4.0000000000000000 | 4 | 2
+ 3 | 11 | 3.6666666666666667 | 3.66666666666667 | 3
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), sum(xc_groupby_tab1.val), avg(xc_groupby_tab1.val), ((sum(xc_groupby_tab1.val))::double precision / (count(*))::double precision), xc_groupby_tab1.val2
+ Remote query: SELECT count(*) AS count, sum(val) AS sum, avg(val) AS avg, ((sum(val))::double precision / (count(*))::double precision), val2 FROM xc_groupby_tab1 GROUP BY val2
+ -> GroupAggregate
+ Output: count(*), sum(val), avg(val), ((sum(val))::double precision / (count(*))::double precision), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2, val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2, val
+(11 rows)
+
+-- joins and group by
+select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+ count | sum | avg | ?column? | val2 | val2
+-------+-----+---------------------+------------------+------+------
+ 9 | 78 | 8.6666666666666667 | 8.66666666666667 | 1 | 1
+ 6 | 96 | 16.0000000000000000 | 16 | 2 | 2
+ 3 | | | | 3 |
+ 3 | | | | | 4
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), ((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))::double precision / (count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Remote query: SELECT count(*) AS count, sum((xc_groupby_tab1.val * xc_groupby_tab2.val)) AS sum, avg((xc_groupby_tab1.val * xc_groupby_tab2.val)) AS avg, ((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))::double precision / (count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2 FROM (xc_groupby_tab1 FULL JOIN xc_groupby_tab2 ON ((xc_groupby_tab1.val2 = xc_groupby_tab2.val2))) GROUP BY xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> GroupAggregate
+ Output: count(*), sum((xc_groupby_tab1.val * xc_groupby_tab2.val)), avg((xc_groupby_tab1.val * xc_groupby_tab2.val)), ((sum((xc_groupby_tab1.val * xc_groupby_tab2.val)))::double precision / (count(*))::double precision), xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab1.val2, xc_groupby_tab2.val2
+ -> Merge Full Join
+ Output: xc_groupby_tab1.val2, xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val
+ Merge Cond: (xc_groupby_tab1.val2 = xc_groupby_tab2.val2)
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val2
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(22 rows)
+
+-- aggregates over aggregates
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+ sum
+-----
+ 8
+ 17
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------
+ Remote Subquery Scan on all
+ Output: sum(q1.y), q1.x
+ -> GroupAggregate
+ Output: sum(q1.y), q1.x
+ Group Key: q1.x
+ -> Sort
+ Output: q1.x, q1.y
+ Sort Key: q1.x
+ -> Subquery Scan on q1
+ Output: q1.x, q1.y
+ -> GroupAggregate
+ Output: sum(xc_groupby_tab1.val), (xc_groupby_tab1.val2 % 2), xc_groupby_tab1.val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val2, xc_groupby_tab1.val
+(18 rows)
+
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+ val2
+------
+ 1
+ 2
+ 3
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+----------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: xc_groupby_tab1.val2
+ Remote query: SELECT val2 FROM xc_groupby_tab1 GROUP BY val2
+ -> Group
+ Output: val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2
+(11 rows)
+
+select val + val2 from xc_groupby_tab1 group by val + val2;
+ ?column?
+----------
+ 2
+ 3
+ 4
+ 7
+ 8
+ 9
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
+ QUERY PLAN
+--------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab1.val2)
+ Remote query: SELECT (val + val2) FROM xc_groupby_tab1 GROUP BY (val + val2)
+ -> Group
+ Output: ((val + val2))
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Sort
+ Output: ((val + val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (val + val2)
+(11 rows)
+
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+ ?column? | val | val2
+----------+-----+------
+ 2 | 1 | 1
+ 4 | 1 | 3
+ 3 | 2 | 1
+ 4 | 2 | 2
+ 4 | 3 | 1
+ 7 | 4 | 3
+ 8 | 6 | 2
+ 9 | 6 | 3
+(8 rows)
+
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab1.val2), xc_groupby_tab1.val, xc_groupby_tab1.val2
+ Remote query: SELECT (val + val2), val, val2 FROM xc_groupby_tab1 GROUP BY val, val2
+ -> Group
+ Output: (val + val2), val, val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Sort
+ Output: val, val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val, val2
+(11 rows)
+
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+ ?column? | val | val2
+----------+-----+------
+ 2 | 1 | 1
+ 6 | 2 | 4
+ 5 | 3 | 2
+ 7 | 3 | 4
+ 5 | 4 | 1
+ 6 | 4 | 2
+(6 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Remote query: SELECT (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2 FROM xc_groupby_tab1, xc_groupby_tab2 WHERE (xc_groupby_tab1.val = xc_groupby_tab2.val) GROUP BY xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Group
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2), xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Group Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Sort
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Sort Key: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ -> Merge Join
+ Output: xc_groupby_tab1.val, xc_groupby_tab2.val2
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(22 rows)
+
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ ?column?
+----------
+ 2
+ 5
+ 6
+ 7
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Remote query: SELECT (xc_groupby_tab1.val + xc_groupby_tab2.val2) FROM xc_groupby_tab1, xc_groupby_tab2 WHERE (xc_groupby_tab1.val = xc_groupby_tab2.val) GROUP BY (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ -> Group
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Group Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ -> Sort
+ Output: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ Sort Key: ((xc_groupby_tab1.val + xc_groupby_tab2.val2))
+ -> Merge Join
+ Output: (xc_groupby_tab1.val + xc_groupby_tab2.val2)
+ Merge Cond: (xc_groupby_tab1.val = xc_groupby_tab2.val)
+ -> Sort
+ Output: xc_groupby_tab1.val
+ Sort Key: xc_groupby_tab1.val
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: xc_groupby_tab1.val
+ -> Sort
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+ Sort Key: xc_groupby_tab2.val
+ -> Seq Scan on public.xc_groupby_tab2
+ Output: xc_groupby_tab2.val2, xc_groupby_tab2.val
+(22 rows)
+
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ ?column? | val2
+---------------------+------
+ 11.0000000000000000 | 1
+ 14.0000000000000000 | 2
+ 17.6666666666666667 | 3
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: (((count(*) + sum(xc_groupby_tab1.val)))::numeric + avg(xc_groupby_tab1.val)), xc_groupby_tab1.val2
+ Remote query: SELECT (((count(*) + sum(val)))::numeric + avg(val)), val2 FROM xc_groupby_tab1 GROUP BY val2
+ -> GroupAggregate
+ Output: (((count(*) + sum(val)))::numeric + avg(val)), val2
+ Group Key: xc_groupby_tab1.val2
+ -> Sort
+ Output: val2, val
+ Sort Key: xc_groupby_tab1.val2
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: val2, val
+(11 rows)
+
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ sum | avg | ?column?
+-----+--------------------+----------
+ 6 | 2.0000000000000000 | 2
+ 8 | 4.0000000000000000 | 4
+ 11 | 3.6666666666666667 | 6
+(3 rows)
+
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_tab1.val), avg(xc_groupby_tab1.val), (2 * xc_groupby_tab1.val2)
+ Remote query: SELECT sum(val) AS sum, avg(val) AS avg, (2 * val2) FROM xc_groupby_tab1 GROUP BY (2 * val2)
+ -> GroupAggregate
+ Output: sum(val), avg(val), ((2 * val2))
+ Group Key: ((2 * xc_groupby_tab1.val2))
+ -> Sort
+ Output: ((2 * val2)), val
+ Sort Key: ((2 * xc_groupby_tab1.val2))
+ -> Seq Scan on public.xc_groupby_tab1
+ Output: (2 * val2), val
+(11 rows)
+
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25)) distribute by replication;
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+select a,count(a) from xc_groupby_def group by a order by a;
+ a | count
+----+-------
+ 1 | 1
+ 2 | 2
+ 3 | 1
+ 4 | 1
+ 5 | 1
+ 6 | 1
+ 7 | 1
+ 8 | 1
+ 9 | 1
+ 10 | 1
+ | 0
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+ QUERY PLAN
+---------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: xc_groupby_def.a, count(xc_groupby_def.a)
+ Remote query: SELECT a, count(a) AS count FROM xc_groupby_def GROUP BY a ORDER BY a
+ -> GroupAggregate
+ Output: a, count(a)
+ Group Key: xc_groupby_def.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a
+(11 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+ 3.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
+ 6.0000000000000000
+ 7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.a
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY a
+ -> GroupAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a
+(11 rows)
+
+select avg(a) from xc_groupby_def group by a;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+ 3.0000000000000000
+ 4.0000000000000000
+ 5.0000000000000000
+ 6.0000000000000000
+ 7.0000000000000000
+ 8.0000000000000000
+ 9.0000000000000000
+ 10.0000000000000000
+
+(11 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.a
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY a
+ -> GroupAggregate
+ Output: avg(a), a
+ Group Key: xc_groupby_def.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a
+(11 rows)
+
+select avg(a) from xc_groupby_def group by b;
+ avg
+--------------------
+
+ 6.2000000000000000
+ 4.5000000000000000
+ 4.0000000000000000
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_def.a), xc_groupby_def.b
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_def GROUP BY b
+ -> GroupAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b, a
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b, a
+(11 rows)
+
+select sum(a) from xc_groupby_def group by b;
+ sum
+-----
+
+ 31
+ 18
+ 8
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+ QUERY PLAN
+---------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_def.a), xc_groupby_def.b
+ Remote query: SELECT sum(a) AS sum FROM xc_groupby_def GROUP BY b
+ -> GroupAggregate
+ Output: sum(a), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b, a
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b, a
+(11 rows)
+
+select count(*) from xc_groupby_def group by b;
+ count
+-------
+ 1
+ 5
+ 4
+ 3
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+ QUERY PLAN
+-------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.b
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def GROUP BY b
+ -> GroupAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(11 rows)
+
+select count(*) from xc_groupby_def where a is not null group by a;
+ count
+-------
+ 1
+ 2
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+(10 rows)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.a
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def WHERE (a IS NOT NULL) GROUP BY a
+ -> GroupAggregate
+ Output: count(*), a
+ Group Key: xc_groupby_def.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_def.a
+ -> Seq Scan on public.xc_groupby_def
+ Output: a
+ Filter: (xc_groupby_def.a IS NOT NULL)
+(12 rows)
+
+select b from xc_groupby_def group by b;
+ b
+-------
+ One
+ Three
+ Two
+
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select b from xc_groupby_def group by b;
+ QUERY PLAN
+---------------------------------------------------------
+ Remote Fast Query Execution
+ Output: xc_groupby_def.b
+ Remote query: SELECT b FROM xc_groupby_def GROUP BY b
+ -> Group
+ Output: b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(11 rows)
+
+select b,count(b) from xc_groupby_def group by b;
+ b | count
+-------+-------
+ One | 1
+ Three | 5
+ Two | 4
+ | 0
+(4 rows)
+
+explain (verbose true, costs false, nodes false) select b,count(b) from xc_groupby_def group by b;
+ QUERY PLAN
+----------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: xc_groupby_def.b, count(xc_groupby_def.b)
+ Remote query: SELECT b, count(b) AS count FROM xc_groupby_def GROUP BY b
+ -> GroupAggregate
+ Output: b, count(b)
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+(11 rows)
+
+select count(*) from xc_groupby_def where b is null group by b;
+ count
+-------
+ 3
+(1 row)
+
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: count(*), xc_groupby_def.b
+ Remote query: SELECT count(*) AS count FROM xc_groupby_def WHERE (b IS NULL) GROUP BY b
+ -> GroupAggregate
+ Output: count(*), b
+ Group Key: xc_groupby_def.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_def.b
+ -> Seq Scan on public.xc_groupby_def
+ Output: b
+ Filter: (xc_groupby_def.b IS NULL)
+(12 rows)
+
+create table xc_groupby_g(a int, b float, c numeric) distribute by replication;
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+select sum(a) from xc_groupby_g group by a;
+ sum
+-----
+ 2
+ 2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.a), xc_groupby_g.a
+ Remote query: SELECT sum(a) AS sum FROM xc_groupby_g GROUP BY a
+ -> GroupAggregate
+ Output: sum(a), a
+ Group Key: xc_groupby_g.a
+ -> Sort
+ Output: a
+ Sort Key: xc_groupby_g.a
+ -> Seq Scan on public.xc_groupby_g
+ Output: a
+(11 rows)
+
+select sum(b) from xc_groupby_g group by b;
+ sum
+-----
+ 4.2
+ 2.3
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.b), xc_groupby_g.b
+ Remote query: SELECT sum(b) AS sum FROM xc_groupby_g GROUP BY b
+ -> GroupAggregate
+ Output: sum(b), b
+ Group Key: xc_groupby_g.b
+ -> Sort
+ Output: b
+ Sort Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: b
+(11 rows)
+
+select sum(c) from xc_groupby_g group by b;
+ sum
+-----
+ 6.4
+ 5.2
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: sum(xc_groupby_g.c), xc_groupby_g.b
+ Remote query: SELECT sum(c) AS sum FROM xc_groupby_g GROUP BY b
+ -> GroupAggregate
+ Output: sum(c), b
+ Group Key: xc_groupby_g.b
+ -> Sort
+ Output: b, c
+ Sort Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: b, c
+(11 rows)
+
+select avg(a) from xc_groupby_g group by b;
+ avg
+------------------------
+ 1.00000000000000000000
+ 2.0000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.a), xc_groupby_g.b
+ Remote query: SELECT avg(a) AS avg FROM xc_groupby_g GROUP BY b
+ -> GroupAggregate
+ Output: avg(a), b
+ Group Key: xc_groupby_g.b
+ -> Sort
+ Output: b, a
+ Sort Key: xc_groupby_g.b
+ -> Seq Scan on public.xc_groupby_g
+ Output: b, a
+(11 rows)
+
+select avg(b) from xc_groupby_g group by c;
+ avg
+-----
+ 2.1
+ 2.3
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.b), xc_groupby_g.c
+ Remote query: SELECT avg(b) AS avg FROM xc_groupby_g GROUP BY c
+ -> GroupAggregate
+ Output: avg(b), c
+ Group Key: xc_groupby_g.c
+ -> Sort
+ Output: c, b
+ Sort Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: c, b
+(11 rows)
+
+select avg(c) from xc_groupby_g group by c;
+ avg
+--------------------
+ 3.2000000000000000
+ 5.2000000000000000
+(2 rows)
+
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+ QUERY PLAN
+-------------------------------------------------------------------
+ Remote Fast Query Execution
+ Output: avg(xc_groupby_g.c), xc_groupby_g.c
+ Remote query: SELECT avg(c) AS avg FROM xc_groupby_g GROUP BY c
+ -> GroupAggregate
+ Output: avg(c), c
+ Group Key: xc_groupby_g.c
+ -> Sort
+ Output: c
+ Sort Key: xc_groupby_g.c
+ -> Seq Scan on public.xc_groupby_g
+ Output: c
+(11 rows)
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+reset enable_hashagg;
+reset enable_fast_query_shipping;
diff --git a/src/test/regress/sql/xc_groupby.sql b/src/test/regress/sql/xc_groupby.sql
index a51f68b2c5..8c362912c1 100644
--- a/src/test/regress/sql/xc_groupby.sql
+++ b/src/test/regress/sql/xc_groupby.sql
@@ -389,3 +389,388 @@ drop table xc_groupby_g;
reset enable_hashagg;
reset enable_fast_query_shipping;
+
+-- Now repeat all the tests with FQS turned on
+set enable_fast_query_shipping to on;
+
+-- Combination 1: enable_hashagg on and distributed tables
+set enable_hashagg to on;
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int);
+create table xc_groupby_tab2 (val int, val2 int);
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+-- joins and group by
+select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+-- aggregates over aggregates
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+select val + val2 from xc_groupby_tab1 group by val + val2;
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25));
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+
+select a,count(a) from xc_groupby_def group by a order by a;
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def where a is not null group by a;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+
+select * from (select b from xc_groupby_def group by b) q order by q.b;
+explain (verbose true, costs false, nodes false) select * from (select b from xc_groupby_def group by b) q order by q.b;
+select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+explain (verbose true, costs false, nodes false) select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+select count(*) from xc_groupby_def where b is null group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+
+create table xc_groupby_g(a int, b float, c numeric);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+
+select sum(a) from xc_groupby_g group by a;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+select sum(b) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+
+select avg(a) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+select avg(b) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+
+-- Combination 2, enable_hashagg on and replicated tables.
+-- repeat the same tests for replicated tables
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int) distribute by replication;
+create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+-- joins and group by
+select * from (select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2 c1, xc_groupby_tab2.val2 c2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2) q order by q.c1, q.c2;
+explain (verbose true, costs false, nodes false) select * from (select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2 c1, xc_groupby_tab2.val2 c2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2) q order by q.c1, q.c2;
+-- aggregates over aggregates
+select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
+explain (verbose true, costs false, nodes false) select * from (select sum(y) sum from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x) q order by q.sum;
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
+explain (verbose true, costs false, nodes false) select * from (select val + val2 sum from xc_groupby_tab1 group by val + val2) q order by q.sum;
+select * from (select val + val2, val, val2 from xc_groupby_tab1 group by val, val2) q order by q.val, q.val2;
+explain (verbose true, costs false, nodes false) select * from (select val + val2, val, val2 from xc_groupby_tab1 group by val, val2) q order by q.val, q.val2;
+select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2) q order by q.val, q.val2;
+explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2) q order by q.val, q.val2;
+select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
+explain (verbose true, costs false, nodes false) select * from (select xc_groupby_tab1.val + xc_groupby_tab2.val2 sum from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2) q order by q.sum;
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25)) distribute by replication;
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+
+select a,count(a) from xc_groupby_def group by a order by a;
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+select avg(a) from xc_groupby_def group by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def where a is not null group by a;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+
+select * from (select b from xc_groupby_def group by b) q order by q.b;
+explain (verbose true, costs false, nodes false) select * from (select b from xc_groupby_def group by b) q order by q.b;
+select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+explain (verbose true, costs false, nodes false) select * from (select b,count(b) from xc_groupby_def group by b) q order by q.b;
+select count(*) from xc_groupby_def where b is null group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+
+create table xc_groupby_g(a int, b float, c numeric) distribute by replication;
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+
+select sum(a) from xc_groupby_g group by a;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+select sum(b) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+
+select avg(a) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+select avg(b) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+reset enable_hashagg;
+
+-- Combination 3 enable_hashagg off and distributed tables
+set enable_hashagg to off;
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int);
+create table xc_groupby_tab2 (val int, val2 int);
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+-- joins and group by
+select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+-- aggregates over aggregates
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+select val + val2 from xc_groupby_tab1 group by val + val2;
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25));
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+
+select a,count(a) from xc_groupby_def group by a order by a;
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def where a is not null group by a;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+
+select b from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select b from xc_groupby_def group by b;
+select b,count(b) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select b,count(b) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def where b is null group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+
+create table xc_groupby_g(a int, b float, c numeric);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+
+select sum(a) from xc_groupby_g group by a;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+select sum(b) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+
+select avg(a) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+select avg(b) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+
+-- Combination 4 enable_hashagg off and replicated tables.
+-- repeat the same tests for replicated tables
+-- create required tables and fill them with data
+create table xc_groupby_tab1 (val int, val2 int) distribute by replication;
+create table xc_groupby_tab2 (val int, val2 int) distribute by replication;
+insert into xc_groupby_tab1 values (1, 1), (2, 1), (3, 1), (2, 2), (6, 2), (4, 3), (1, 3), (6, 3);
+insert into xc_groupby_tab2 values (1, 1), (4, 1), (8, 1), (2, 4), (9, 4), (3, 4), (4, 2), (5, 2), (3, 2);
+select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*), sum(val), avg(val), sum(val)::float8/count(*), val2 from xc_groupby_tab1 group by val2;
+-- joins and group by
+select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select count(*), sum(xc_groupby_tab1.val * xc_groupby_tab2.val), avg(xc_groupby_tab1.val*xc_groupby_tab2.val), sum(xc_groupby_tab1.val*xc_groupby_tab2.val)::float8/count(*), xc_groupby_tab1.val2, xc_groupby_tab2.val2 from xc_groupby_tab1 full outer join xc_groupby_tab2 on xc_groupby_tab1.val2 = xc_groupby_tab2.val2 group by xc_groupby_tab1.val2, xc_groupby_tab2.val2;
+-- aggregates over aggregates
+select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+explain (verbose true, costs false, nodes false) select sum(y) from (select sum(val) y, val2%2 x from xc_groupby_tab1 group by val2) q1 group by x;
+-- group by without aggregate
+select val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select val2 from xc_groupby_tab1 group by val2;
+select val + val2 from xc_groupby_tab1 group by val + val2;
+explain (verbose true, costs false, nodes false) select val + val2 from xc_groupby_tab1 group by val + val2;
+select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+explain (verbose true, costs false, nodes false) select val + val2, val, val2 from xc_groupby_tab1 group by val, val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2, xc_groupby_tab1.val, xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val, xc_groupby_tab2.val2;
+select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+explain (verbose true, costs false, nodes false) select xc_groupby_tab1.val + xc_groupby_tab2.val2 from xc_groupby_tab1, xc_groupby_tab2 where xc_groupby_tab1.val = xc_groupby_tab2.val group by xc_groupby_tab1.val + xc_groupby_tab2.val2;
+-- group by with aggregates in expression
+select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+explain (verbose true, costs false, nodes false) select count(*) + sum(val) + avg(val), val2 from xc_groupby_tab1 group by val2;
+-- group by with expressions in group by clause
+select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+explain (verbose true, costs false, nodes false) select sum(val), avg(val), 2 * val2 from xc_groupby_tab1 group by 2 * val2;
+drop table xc_groupby_tab1;
+drop table xc_groupby_tab2;
+
+-- some tests involving nulls, characters, float type etc.
+create table xc_groupby_def(a int, b varchar(25)) distribute by replication;
+insert into xc_groupby_def VALUES (NULL, NULL);
+insert into xc_groupby_def VALUES (1, NULL);
+insert into xc_groupby_def VALUES (NULL, 'One');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (2, 'Two');
+insert into xc_groupby_def VALUES (3, 'Three');
+insert into xc_groupby_def VALUES (4, 'Three');
+insert into xc_groupby_def VALUES (5, 'Three');
+insert into xc_groupby_def VALUES (6, 'Two');
+insert into xc_groupby_def VALUES (7, NULL);
+insert into xc_groupby_def VALUES (8, 'Two');
+insert into xc_groupby_def VALUES (9, 'Three');
+insert into xc_groupby_def VALUES (10, 'Three');
+
+select a,count(a) from xc_groupby_def group by a order by a;
+explain (verbose true, costs false, nodes false) select a,count(a) from xc_groupby_def group by a order by a;
+select avg(a) from xc_groupby_def group by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by a;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by a;
+select avg(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_def group by b;
+select sum(a) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def where a is not null group by a;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where a is not null group by a;
+
+select b from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select b from xc_groupby_def group by b;
+select b,count(b) from xc_groupby_def group by b;
+explain (verbose true, costs false, nodes false) select b,count(b) from xc_groupby_def group by b;
+select count(*) from xc_groupby_def where b is null group by b;
+explain (verbose true, costs false, nodes false) select count(*) from xc_groupby_def where b is null group by b;
+
+create table xc_groupby_g(a int, b float, c numeric) distribute by replication;
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(1,2.1,3.2);
+insert into xc_groupby_g values(2,2.3,5.2);
+
+select sum(a) from xc_groupby_g group by a;
+explain (verbose true, costs false, nodes false) select sum(a) from xc_groupby_g group by a;
+select sum(b) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(b) from xc_groupby_g group by b;
+select sum(c) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select sum(c) from xc_groupby_g group by b;
+
+select avg(a) from xc_groupby_g group by b;
+explain (verbose true, costs false, nodes false) select avg(a) from xc_groupby_g group by b;
+select avg(b) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(b) from xc_groupby_g group by c;
+select avg(c) from xc_groupby_g group by c;
+explain (verbose true, costs false, nodes false) select avg(c) from xc_groupby_g group by c;
+
+drop table xc_groupby_def;
+drop table xc_groupby_g;
+
+reset enable_hashagg;
+reset enable_fast_query_shipping;