From c723a1fa32670430915717a0cd3eb938e3e0c780 Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Tue, 27 Feb 2018 06:18:58 +0100 Subject: [PATCH] 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;