mirror of https://github.com/citusdata/citus.git
148 lines
6.8 KiB
Plaintext
148 lines
6.8 KiB
Plaintext
--
|
|
-- MULTI_ARRAY_AGG
|
|
--
|
|
SET citus.next_shard_id TO 520000;
|
|
CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
|
|
RETURNS ANYARRAY LANGUAGE SQL
|
|
AS $$
|
|
SELECT ARRAY(SELECT unnest($1) ORDER BY 1)
|
|
$$;
|
|
-- Check multi_cat_agg() aggregate which is used to implement array_agg()
|
|
SELECT array_cat_agg(i) FROM (VALUES (ARRAY[1,2]), (NULL), (ARRAY[3,4])) AS t(i);
|
|
array_cat_agg
|
|
---------------
|
|
{1,2,3,4}
|
|
(1 row)
|
|
|
|
-- Check that we don't support distinct and order by with array_agg()
|
|
SELECT array_agg(distinct l_orderkey) FROM lineitem;
|
|
ERROR: array_agg (distinct) is unsupported
|
|
SELECT array_agg(l_orderkey ORDER BY l_partkey) FROM lineitem;
|
|
ERROR: array_agg with order by is unsupported
|
|
SELECT array_agg(distinct l_orderkey ORDER BY l_orderkey) FROM lineitem;
|
|
ERROR: array_agg with order by is unsupported
|
|
-- Check array_agg() for different data types and LIMIT clauses
|
|
SELECT array_sort(array_agg(l_partkey)) FROM lineitem GROUP BY l_orderkey
|
|
ORDER BY l_orderkey LIMIT 10;
|
|
array_sort
|
|
--------------------------------------------------
|
|
{2132,15635,24027,63700,67310,155190}
|
|
{106170}
|
|
{4297,19036,29380,62143,128449,183095}
|
|
{88035}
|
|
{37531,108570,123927}
|
|
{139636}
|
|
{79251,94780,145243,151894,157238,163073,182052}
|
|
{2743,11615,44161,82704,85811,197921}
|
|
{33918,60519,61336,137469}
|
|
{88362,89414,169544}
|
|
(10 rows)
|
|
|
|
SELECT array_sort(array_agg(l_extendedprice)) FROM lineitem GROUP BY l_orderkey
|
|
ORDER BY l_orderkey LIMIT 10;
|
|
array_sort
|
|
-----------------------------------------------------------------
|
|
{13309.60,21168.23,22824.48,28955.64,45983.16,49620.16}
|
|
{44694.46}
|
|
{2618.76,28733.64,32986.52,39890.88,46796.47,54058.05}
|
|
{30690.90}
|
|
{23678.55,50723.92,73426.50}
|
|
{61998.31}
|
|
{6476.15,11594.16,13608.60,31809.96,43058.75,73943.82,81639.88}
|
|
{2210.32,6582.96,9159.66,47227.60,64605.44,79059.64}
|
|
{7532.30,40217.23,47344.32,75928.31}
|
|
{9681.24,17554.68,30875.02}
|
|
(10 rows)
|
|
|
|
SELECT array_sort(array_agg(l_shipdate)) FROM lineitem GROUP BY l_orderkey
|
|
ORDER BY l_orderkey LIMIT 10;
|
|
array_sort
|
|
--------------------------------------------------------------------------------
|
|
{01-29-1996,01-30-1996,03-13-1996,03-30-1996,04-12-1996,04-21-1996}
|
|
{01-28-1997}
|
|
{10-29-1993,11-09-1993,12-04-1993,12-14-1993,01-16-1994,02-02-1994}
|
|
{01-10-1996}
|
|
{08-08-1994,10-16-1994,10-31-1994}
|
|
{04-27-1992}
|
|
{01-15-1996,01-16-1996,02-01-1996,02-10-1996,02-11-1996,03-21-1996,05-07-1996}
|
|
{07-21-1995,08-04-1995,08-07-1995,08-14-1995,08-28-1995,10-23-1995}
|
|
{10-29-1993,11-09-1993,12-09-1993,12-09-1993}
|
|
{10-09-1998,10-23-1998,10-30-1998}
|
|
(10 rows)
|
|
|
|
SELECT array_sort(array_agg(l_shipmode)) FROM lineitem GROUP BY l_orderkey
|
|
ORDER BY l_orderkey LIMIT 10;
|
|
array_sort
|
|
----------------------------------------------------------------------------------------------
|
|
{"AIR ","FOB ","MAIL ","MAIL ","REG AIR ","TRUCK "}
|
|
{"RAIL "}
|
|
{"AIR ","FOB ","RAIL ","RAIL ","SHIP ","TRUCK "}
|
|
{"REG AIR "}
|
|
{"AIR ","AIR ","FOB "}
|
|
{"TRUCK "}
|
|
{"FOB ","FOB ","FOB ","FOB ","MAIL ","SHIP ","TRUCK "}
|
|
{"AIR ","AIR ","AIR ","RAIL ","REG AIR ","TRUCK "}
|
|
{"AIR ","MAIL ","MAIL ","TRUCK "}
|
|
{"FOB ","FOB ","REG AIR "}
|
|
(10 rows)
|
|
|
|
-- Check that we can execute array_agg() within other functions
|
|
SELECT array_length(array_agg(l_orderkey), 1) FROM lineitem;
|
|
array_length
|
|
--------------
|
|
12000
|
|
(1 row)
|
|
|
|
-- Check that we can execute array_agg() on select queries that hit multiple
|
|
-- shards and contain different aggregates, filter clauses and other complex
|
|
-- expressions. Note that the l_orderkey ranges are such that the matching rows
|
|
-- lie in different shards.
|
|
SELECT l_quantity, count(*), avg(l_extendedprice), array_sort(array_agg(l_orderkey)) FROM lineitem
|
|
WHERE l_quantity < 5 AND l_orderkey > 5500 AND l_orderkey < 9500
|
|
GROUP BY l_quantity ORDER BY l_quantity;
|
|
l_quantity | count | avg | array_sort
|
|
------------+-------+-----------------------+--------------------------------------------------------------------------------------------------
|
|
1.00 | 17 | 1477.1258823529411765 | {5543,5633,5634,5698,5766,5856,5857,5986,8997,9026,9158,9184,9220,9222,9348,9383,9476}
|
|
2.00 | 19 | 3078.4242105263157895 | {5506,5540,5573,5669,5703,5730,5798,5831,5893,5920,5923,9030,9058,9123,9124,9188,9344,9441,9476}
|
|
3.00 | 14 | 4714.0392857142857143 | {5509,5543,5605,5606,5827,9124,9157,9184,9223,9254,9349,9414,9475,9477}
|
|
4.00 | 19 | 5929.7136842105263158 | {5504,5507,5508,5511,5538,5764,5766,5826,5829,5862,5959,5985,9091,9120,9281,9347,9382,9440,9473}
|
|
(4 rows)
|
|
|
|
SELECT l_quantity, array_sort(array_agg(extract (month FROM o_orderdate))) AS my_month
|
|
FROM lineitem, orders WHERE l_orderkey = o_orderkey AND l_quantity < 5
|
|
AND l_orderkey > 5500 AND l_orderkey < 9500 GROUP BY l_quantity ORDER BY l_quantity;
|
|
l_quantity | my_month
|
|
------------+------------------------------------------------
|
|
1.00 | {2,3,4,4,4,5,5,5,6,7,7,7,7,9,9,11,11}
|
|
2.00 | {1,3,5,5,5,5,6,6,6,7,7,8,10,10,11,11,11,12,12}
|
|
3.00 | {3,4,5,6,7,7,8,8,8,9,9,10,11,11}
|
|
4.00 | {1,1,1,2,2,2,5,5,6,6,6,6,8,9,10,10,11,11,12}
|
|
(4 rows)
|
|
|
|
SELECT l_quantity, array_sort(array_agg(l_orderkey * 2 + 1)) FROM lineitem WHERE l_quantity < 5
|
|
AND octet_length(l_comment) + octet_length('randomtext'::text) > 40
|
|
AND l_orderkey > 5500 AND l_orderkey < 9500 GROUP BY l_quantity ORDER BY l_quantity;
|
|
l_quantity | array_sort
|
|
------------+---------------------------------------------
|
|
1.00 | {11269,11397,11713,11715,11973,18317,18445}
|
|
2.00 | {11847,18061,18247,18953}
|
|
3.00 | {18249,18315,18699,18951,18955}
|
|
4.00 | {11653,11659,18241,18765}
|
|
(4 rows)
|
|
|
|
-- Check that we can execute array_agg() with an expression containing NULL values
|
|
SELECT array_agg(case when l_quantity > 20 then l_quantity else NULL end)
|
|
FROM lineitem WHERE l_orderkey < 10;
|
|
array_agg
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------
|
|
{NULL,36.00,NULL,28.00,24.00,32.00,38.00,45.00,49.00,27.00,NULL,28.00,26.00,30.00,NULL,26.00,50.00,37.00,NULL,NULL,46.00,28.00,38.00,35.00,NULL}
|
|
(1 row)
|
|
|
|
-- Check that we return NULL in case there are no input rows to array_agg()
|
|
SELECT array_agg(l_orderkey) FROM lineitem WHERE l_quantity < 0;
|
|
array_agg
|
|
-----------
|
|
|
|
(1 row)
|
|
|