From c723a1fa32670430915717a0cd3eb938e3e0c780 Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Tue, 27 Feb 2018 06:18:58 +0100 Subject: [PATCH 1/4] Add support for bool and bit aggregates --- .../distributed/multi_logical_optimizer.h | 3 +- src/test/regress/expected/bool_agg.out | 55 +++++++++++++++++++ src/test/regress/multi_schedule | 5 +- src/test/regress/sql/bool_agg.sql | 21 +++++++ 4 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/test/regress/expected/bool_agg.out create mode 100644 src/test/regress/sql/bool_agg.sql diff --git a/src/include/distributed/multi_logical_optimizer.h b/src/include/distributed/multi_logical_optimizer.h index 1ef477e33..49ba2ae24 100644 --- a/src/include/distributed/multi_logical_optimizer.h +++ b/src/include/distributed/multi_logical_optimizer.h @@ -105,7 +105,8 @@ static const char *const AggregateNames[] = { "invalid", "avg", "min", "max", "sum", "count", "array_agg", "jsonb_agg", "jsonb_object_agg", - "json_agg", "json_object_agg" + "json_agg", "json_object_agg", + "bit_and", "bit_or", "bool_and", "bool_or", "every" }; diff --git a/src/test/regress/expected/bool_agg.out b/src/test/regress/expected/bool_agg.out new file mode 100644 index 000000000..0efad1934 --- /dev/null +++ b/src/test/regress/expected/bool_agg.out @@ -0,0 +1,55 @@ +-- Tests for boolean aggregates in multi-shard queries +CREATE SCHEMA bool_agg; +SET search_path TO bool_agg; +CREATE TABLE bool_test (id int, val int, flag bool, kind int); +SELECT create_distributed_table('bool_agg.bool_test','id'); + create_distributed_table +-------------------------- + +(1 row) + +INSERT INTO bool_test VALUES (1, 1, true, 99), (2, 2, false, 99), (2, 3, true, 88); +-- mix of true and false +SELECT bool_and(flag), bool_or(flag), every(flag) FROM bool_test; + bool_and | bool_or | every +----------+---------+------- + f | t | f +(1 row) + +SELECT kind, bool_and(flag), bool_or(flag), every(flag) FROM bool_test GROUP BY kind ORDER BY kind; + kind | bool_and | bool_or | every +------+----------+---------+------- + 88 | t | t | t + 99 | f | t | f +(2 rows) + +-- expressions in aggregate +SELECT bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test; + bool_or | bool_and +---------+---------- + t | f +(1 row) + +SELECT kind, bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test GROUP BY kind ORDER BY kind; + kind | bool_or | bool_and +------+---------+---------- + 88 | t | f + 99 | t | t +(2 rows) + +-- 1 & 3, 1 | 3 +SELECT bit_and(val), bit_or(val) FROM bool_test WHERE flag; + bit_and | bit_or +---------+-------- + 1 | 3 +(1 row) + +SELECT flag, bit_and(val), bit_or(val) FROM bool_test GROUP BY flag ORDER BY flag; + flag | bit_and | bit_or +------+---------+-------- + f | 2 | 2 + t | 1 | 3 +(2 rows) + +DROP SCHEMA bool_agg CASCADE; +NOTICE: drop cascades to table bool_test diff --git a/src/test/regress/multi_schedule b/src/test/regress/multi_schedule index 19bd3f2ac..2c4a0fdc0 100644 --- a/src/test/regress/multi_schedule +++ b/src/test/regress/multi_schedule @@ -60,10 +60,7 @@ test: multi_agg_distinct multi_agg_approximate_distinct multi_limit_clause_appro test: multi_reference_table test: multi_average_expression multi_working_columns multi_having_pushdown test: multi_array_agg multi_limit_clause multi_orderby_limit_pushdown -test: multi_jsonb_agg -test: multi_jsonb_object_agg -test: multi_json_agg -test: multi_json_object_agg +test: multi_jsonb_agg multi_jsonb_object_agg multi_json_agg multi_json_object_agg bool_agg test: multi_agg_type_conversion multi_count_type_conversion test: multi_partition_pruning test: multi_join_pruning multi_hash_pruning diff --git a/src/test/regress/sql/bool_agg.sql b/src/test/regress/sql/bool_agg.sql new file mode 100644 index 000000000..05bac2742 --- /dev/null +++ b/src/test/regress/sql/bool_agg.sql @@ -0,0 +1,21 @@ +-- Tests for boolean aggregates in multi-shard queries +CREATE SCHEMA bool_agg; +SET search_path TO bool_agg; + +CREATE TABLE bool_test (id int, val int, flag bool, kind int); +SELECT create_distributed_table('bool_agg.bool_test','id'); +INSERT INTO bool_test VALUES (1, 1, true, 99), (2, 2, false, 99), (2, 3, true, 88); + +-- mix of true and false +SELECT bool_and(flag), bool_or(flag), every(flag) FROM bool_test; +SELECT kind, bool_and(flag), bool_or(flag), every(flag) FROM bool_test GROUP BY kind ORDER BY kind; + +-- expressions in aggregate +SELECT bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test; +SELECT kind, bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test GROUP BY kind ORDER BY kind; + +-- 1 & 3, 1 | 3 +SELECT bit_and(val), bit_or(val) FROM bool_test WHERE flag; +SELECT flag, bit_and(val), bit_or(val) FROM bool_test GROUP BY flag ORDER BY flag; + +DROP SCHEMA bool_agg CASCADE; From ef5ff7eb12c973bc28a52232bb4e91e6dbe07de7 Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Tue, 27 Feb 2018 23:43:25 +0100 Subject: [PATCH 2/4] Add bit_ and bool_ aggregates to AggregateType --- src/include/distributed/multi_logical_optimizer.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/include/distributed/multi_logical_optimizer.h b/src/include/distributed/multi_logical_optimizer.h index 49ba2ae24..9cb67461d 100644 --- a/src/include/distributed/multi_logical_optimizer.h +++ b/src/include/distributed/multi_logical_optimizer.h @@ -61,7 +61,12 @@ typedef enum AGGREGATE_JSONB_AGG = 7, AGGREGATE_JSONB_OBJECT_AGG = 8, AGGREGATE_JSON_AGG = 9, - AGGREGATE_JSON_OBJECT_AGG = 10 + AGGREGATE_JSON_OBJECT_AGG = 10, + AGGREGATE_BIT_AND = 11, + AGGREGATE_BIT_OR = 12, + AGGREGATE_BOOL_AND = 13, + AGGREGATE_BOOL_OR = 14, + AGGREGATE_EVERY = 15 } AggregateType; From e79db17b91c5bf4a8c458756bfd7db32a229a537 Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Tue, 27 Feb 2018 23:45:28 +0100 Subject: [PATCH 3/4] Update comment in WorkerAggregateExpressionList --- src/backend/distributed/planner/multi_logical_optimizer.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backend/distributed/planner/multi_logical_optimizer.c b/src/backend/distributed/planner/multi_logical_optimizer.c index d749de1df..10fd0125f 100644 --- a/src/backend/distributed/planner/multi_logical_optimizer.c +++ b/src/backend/distributed/planner/multi_logical_optimizer.c @@ -2351,8 +2351,7 @@ WorkerAggregateExpressionList(Aggref *originalAggregate, else { /* - * All other aggregates are sent as they are to the worker nodes. These - * aggregate functions include sum, count, min, max, and array_agg. + * All other aggregates are sent as they are to the worker nodes. */ Aggref *workerAggregate = copyObject(originalAggregate); workerAggregateList = lappend(workerAggregateList, workerAggregate); From dc7213a11c6a1d7663ff48d1cf7841b5585c6aa1 Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Tue, 27 Feb 2018 23:52:44 +0100 Subject: [PATCH 4/4] Use expressions in the ORDER BY in bool_agg --- src/test/regress/expected/bool_agg.out | 6 +++--- src/test/regress/sql/bool_agg.sql | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/regress/expected/bool_agg.out b/src/test/regress/expected/bool_agg.out index 0efad1934..a8d4316af 100644 --- a/src/test/regress/expected/bool_agg.out +++ b/src/test/regress/expected/bool_agg.out @@ -16,11 +16,11 @@ SELECT bool_and(flag), bool_or(flag), every(flag) FROM bool_test; f | t | f (1 row) -SELECT kind, bool_and(flag), bool_or(flag), every(flag) FROM bool_test GROUP BY kind ORDER BY kind; +SELECT kind, bool_and(flag), bool_or(flag), every(flag) FROM bool_test GROUP BY kind ORDER BY 2; kind | bool_and | bool_or | every ------+----------+---------+------- - 88 | t | t | t 99 | f | t | f + 88 | t | t | t (2 rows) -- expressions in aggregate @@ -30,7 +30,7 @@ SELECT bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test; t | f (1 row) -SELECT kind, bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test GROUP BY kind ORDER BY kind; +SELECT kind, bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test GROUP BY kind ORDER BY 3; kind | bool_or | bool_and ------+---------+---------- 88 | t | f diff --git a/src/test/regress/sql/bool_agg.sql b/src/test/regress/sql/bool_agg.sql index 05bac2742..814724a0a 100644 --- a/src/test/regress/sql/bool_agg.sql +++ b/src/test/regress/sql/bool_agg.sql @@ -8,11 +8,11 @@ INSERT INTO bool_test VALUES (1, 1, true, 99), (2, 2, false, 99), (2, 3, true, 8 -- mix of true and false SELECT bool_and(flag), bool_or(flag), every(flag) FROM bool_test; -SELECT kind, bool_and(flag), bool_or(flag), every(flag) FROM bool_test GROUP BY kind ORDER BY kind; +SELECT kind, bool_and(flag), bool_or(flag), every(flag) FROM bool_test GROUP BY kind ORDER BY 2; -- expressions in aggregate SELECT bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test; -SELECT kind, bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test GROUP BY kind ORDER BY kind; +SELECT kind, bool_or(val > 2 OR id < 2), bool_and(val < 3) FROM bool_test GROUP BY kind ORDER BY 3; -- 1 & 3, 1 | 3 SELECT bit_and(val), bit_or(val) FROM bool_test WHERE flag;