Add support for bool and bit aggregates

pull/2030/head
Marco Slot 2018-02-27 06:18:58 +01:00
parent e13c5beced
commit c723a1fa32
4 changed files with 79 additions and 5 deletions

View File

@ -105,7 +105,8 @@ static const char *const AggregateNames[] = {
"invalid", "avg", "min", "max", "invalid", "avg", "min", "max",
"sum", "count", "array_agg", "sum", "count", "array_agg",
"jsonb_agg", "jsonb_object_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"
}; };

View File

@ -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

View File

@ -60,10 +60,7 @@ test: multi_agg_distinct multi_agg_approximate_distinct multi_limit_clause_appro
test: multi_reference_table test: multi_reference_table
test: multi_average_expression multi_working_columns multi_having_pushdown test: multi_average_expression multi_working_columns multi_having_pushdown
test: multi_array_agg multi_limit_clause multi_orderby_limit_pushdown test: multi_array_agg multi_limit_clause multi_orderby_limit_pushdown
test: multi_jsonb_agg test: multi_jsonb_agg multi_jsonb_object_agg multi_json_agg multi_json_object_agg bool_agg
test: multi_jsonb_object_agg
test: multi_json_agg
test: multi_json_object_agg
test: multi_agg_type_conversion multi_count_type_conversion test: multi_agg_type_conversion multi_count_type_conversion
test: multi_partition_pruning test: multi_partition_pruning
test: multi_join_pruning multi_hash_pruning test: multi_join_pruning multi_hash_pruning

View File

@ -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;