blob: 511564f753c24375b94d6f47e0a92bc46593de92 [file] [log] [blame]
---------------------------------------------------------------------------
-- Rules:
-- ------
-- 1) Any DB objects should be created w/o schema prefix,
-- since this file is executed in a separate schema context.
-- 2) There should be no DROP statements in this script, since
-- all objects created in the default schema will be cleaned-up outside.
---------------------------------------------------------------------------
m4_include(`SQLCommon.m4')
m4_changequote(`<!', `!>')
---------------------------------------------------------------------------
-- Setup:
---------------------------------------------------------------------------
CREATE TABLE data AS
SELECT
'{1,2,3}'::float8[] AS an,
'{4,5,7}'::float8[] AS b;
SELECT array_dot(
array_mult(
array_add(an,b),
array_sub(an,b)),
array_mult(
array_div(an,b),
normalize(an))) AS result1
FROM data;
SELECT array_max(b) FROM data;
SELECT array_min(b) FROM data;
SELECT array_sum(b) FROM data;
SELECT array_sum_big(b) FROM data;
SELECT array_mean(b) FROM data;
SELECT array_stddev(b) FROM data;
SELECT array_max(b)
+ array_min(b)
+ array_sum(b)
+ array_sum_big(b)
+ array_mean(b)
+ array_stddev(b) AS result2
FROM data;
SELECT array_sum(
array_scalar_mult(
array_fill(
array_of_float(20),
234.343::FLOAT8),
3.7::FLOAT8))
FROM data;
-- array_agg
CREATE TABLE test AS SELECT generate_series(1,100) x;
SELECT array_agg(x) FROM test;
-- array_scalar_add
SELECT assert(
relative_error(
array_scalar_add(ARRAY[0.8, 9.5, 2.6]::float8[], 2.2::float8),
ARRAY[3.0, 11.7, 4.8]::float8[]) < 1e-6,
'array_scalar_add: Wrong results');
-- array_square
SELECT assert(
relative_error(
array_square(ARRAY[3, 4, 5]::float8[]),
ARRAY[9.0, 16.0, 25.0]::float8[]) < 1e-6,
'array_square: Wrong results');
SELECT array_filter(ARRAY[0.8, 9.5, 0, 2.6]::float8[]);
SELECT array_filter(ARRAY[0.8, 9.5, 0, 2.6]::float8[], 2.5::float8, '<');
------------------------------------------------------------
-- numeric[]
------------------------------------------------------------
-- (array) -> scalar
SELECT array_sum_big(ARRAY[-1, 1.3, 2.9]);
SELECT array_sum(ARRAY[-1, 1.3, 2.9]);
SELECT array_max(ARRAY[-1, 1.3, 2.9]);
SELECT array_min(ARRAY[-1, 1.3, 2.9]);
SELECT array_stddev(ARRAY[-1, 1.3, 2.9]);
SELECT array_mean(ARRAY[-1, 1.3, 2.9]);
-- (array, array) -> scalar
SELECT array_dot(ARRAY[-1, 1.3, 2.9], ARRAY[1,2,3]::numeric[]);
SELECT array_contains(ARRAY[1., 2.], ARRAY[1., 0]);
-- (array,) -> array
SELECT array_scalar_mult(
ARRAY[1,2,3,4]::numeric[],
(1.0/MADLIB_SCHEMA.array_sum(ARRAY[1.,2,3,4]))
);
--------------------------------------------------------------
-- TESTING array_unnest_2d_to_1d FUNCTION
--------------------------------------------------------------
-- 2-element float8 arrays
DROP TABLE IF EXISTS unnest_2d_tbl01;
CREATE TABLE unnest_2d_tbl01 (id INT, val DOUBLE PRECISION[][]);
INSERT INTO unnest_2d_tbl01 VALUES
(1, ARRAY[[1::float8,2],[3::float8,4],[5::float8,6]]),
(2, ARRAY[[101::float8,202],[303::float8,404],[505::float8,606]])
;
DROP TABLE IF EXISTS unnest_2d_tbl01_groundtruth;
CREATE TABLE unnest_2d_tbl01_groundtruth (
id INT,
unnest_row_id INT,
val DOUBLE PRECISION[]
);
INSERT INTO unnest_2d_tbl01_groundtruth VALUES
(1, 1, ARRAY[1::float8,2]),
(1, 2, ARRAY[3::float8,4]),
(1, 3, ARRAY[5::float8,6]),
(2, 1, ARRAY[101::float8,202]),
(2, 2, ARRAY[303::float8,404]),
(2, 3, ARRAY[505::float8,606])
;
DROP TABLE IF EXISTS unnest_2d_tbl01_out;
CREATE TABLE unnest_2d_tbl01_out AS
SELECT id, (array_unnest_2d_to_1d(val)).* FROM unnest_2d_tbl01;
SELECT assert(
unnest_result = val,
'array_unnest_2d_to_1d: Wrong results for test table "unnest_2d_tbl01"'
)
FROM (
SELECT * FROM
unnest_2d_tbl01_out t1
JOIN
unnest_2d_tbl01_groundtruth t2
USING (id,unnest_row_id)
) t3;
-- 3-element float8 arrays
DROP TABLE IF EXISTS unnest_2d_tbl02;
CREATE TABLE unnest_2d_tbl02 (id INT, val DOUBLE PRECISION[][]);
INSERT INTO unnest_2d_tbl02 VALUES
(1, ARRAY[[1.57::float8,2,3],[4::float8,5,6]]),
(2, ARRAY[[101::float8,202,303],[PI(),505,606]]),
(3, ARRAY[[1011::float8,2022,3033],[4044,5055,60.66]])
;
DROP TABLE IF EXISTS unnest_2d_tbl02_groundtruth;
CREATE TABLE unnest_2d_tbl02_groundtruth (
id INT,
unnest_row_id INT,
val DOUBLE PRECISION[]
);
INSERT INTO unnest_2d_tbl02_groundtruth VALUES
(1, 1, array[1.57::float8,2,3]),
(1, 2, array[4::float8,5,6]),
(2, 1, array[101::float8,202,303]),
(2, 2, array[pi(),505,606]),
(3, 1, array[1011::float8,2022,3033]),
(3, 2, array[4044,5055,60.66])
;
DROP TABLE IF EXISTS unnest_2d_tbl02_out;
CREATE TABLE unnest_2d_tbl02_out AS
SELECT id, (array_unnest_2d_to_1d(val)).* FROM unnest_2d_tbl02;
SELECT assert(
unnest_result = val,
'array_unnest_2d_to_1d: Wrong results for test table "unnest_2d_tbl02"'
)
FROM (
SELECT * FROM
unnest_2d_tbl02_out t1
JOIN
unnest_2d_tbl02_groundtruth t2
USING (id,unnest_row_id)
) t3;
-- 2-element text arrays
DROP TABLE IF EXISTS unnest_2d_tbl03;
CREATE TABLE unnest_2d_tbl03 (id INT, val TEXT[][]);
INSERT INTO unnest_2d_tbl03 VALUES
(1, ARRAY[['a','b'],['c','d'],['e','f']]),
(2, ARRAY[['apple','banana'],['cherries','kiwi'],['lemon','mango']])
;
DROP TABLE IF EXISTS unnest_2d_tbl03_groundtruth;
CREATE TABLE unnest_2d_tbl03_groundtruth (
id INT,
unnest_row_id INT,
val TEXT[]
);
INSERT INTO unnest_2d_tbl03_groundtruth VALUES
(1, 1, ARRAY['a','b']),
(1, 2, ARRAY['c','d']),
(1, 3, ARRAY['e','f']),
(2, 1, ARRAY['apple','banana']),
(2, 2, ARRAY['cherries','kiwi']),
(2, 3, ARRAY['lemon','mango'])
;
DROP TABLE IF EXISTS unnest_2d_tbl03_out;
CREATE TABLE unnest_2d_tbl03_out AS
SELECT id, (array_unnest_2d_to_1d(val)).* FROM unnest_2d_tbl03;
SELECT assert(
unnest_result = val,
'array_unnest_2d_to_1d: Wrong results for test table "unnest_2d_tbl03"'
)
FROM (
SELECT * FROM
unnest_2d_tbl03_out t1
JOIN
unnest_2d_tbl03_groundtruth t2
USING (id,unnest_row_id)
) t3;
-- 3-element float8 arrays with some NULLs
DROP TABLE IF EXISTS unnest_2d_tbl04;
CREATE TABLE unnest_2d_tbl04 (id INT, val DOUBLE PRECISION[][]);
INSERT INTO unnest_2d_tbl04 VALUES
(1, ARRAY[[1::float8,NULL,3],[4.0,5,NULL]]),
(2, ARRAY[[101::float8,NULL,303],
[NULL::float8,NULL,NULL]]::double precision[][]),
(3, ARRAY[[NULL,2022::float8],[4044::float8,NULL]])
;
DROP TABLE IF EXISTS unnest_2d_tbl04_groundtruth;
CREATE TABLE unnest_2d_tbl04_groundtruth (
id INT,
unnest_row_id INT,
val DOUBLE PRECISION[]
);
INSERT INTO unnest_2d_tbl04_groundtruth VALUES
(1, 1, ARRAY[1::float8,NULL,3]),
(1, 2, ARRAY[4.0::float8,5,NULL]),
(2, 1, ARRAY[101::float8,NULL,303]),
(2, 2, ARRAY[NULL::float8,NULL,NULL]),
(3, 1, ARRAY[NULL,2022::float8]),
(3, 2, ARRAY[4044::float8,NULL])
;
DROP TABLE IF EXISTS unnest_2d_tbl04_out;
CREATE TABLE unnest_2d_tbl04_out AS
SELECT id, (array_unnest_2d_to_1d(val)).* FROM unnest_2d_tbl04;
SELECT assert(
unnest_result = val,
'array_unnest_2d_to_1d: Wrong results for test table "unnest_2d_tbl04"'
)
FROM (
SELECT * FROM
unnest_2d_tbl04_out t1
JOIN
unnest_2d_tbl04_groundtruth t2
USING (id,unnest_row_id)
) t3;
-- 3-element timestamp arrays with NULLs
DROP TABLE IF EXISTS unnest_2d_tbl05;
CREATE TABLE unnest_2d_tbl05 (id INT, val TIMESTAMP WITHOUT TIME ZONE[][]);
INSERT INTO unnest_2d_tbl05 VALUES
(1, array[['2017-01-01 11:00:02'::TIMESTAMP WITHOUT TIME ZONE,
'2017-01-01 13:00:05',
'2017-01-02 11:55:00'],
['2016-10-12 12:00:02'::TIMESTAMP WITHOUT TIME ZONE,
'2016-10-12 13:15:22',
NULL]]),
(2, NULL),
(3, array[['2014-02-01 11:00:02'::TIMESTAMP WITHOUT TIME ZONE,
'2014-02-01 13:00:05',
'2014-02-02 11:55:00'],
['2013-07-12 12:00:02'::TIMESTAMP WITHOUT TIME ZONE,
NULL,
'2013-07-12 13:15:22']])
;
DROP TABLE IF EXISTS unnest_2d_tbl05_groundtruth;
CREATE TABLE unnest_2d_tbl05_groundtruth (
id INT,
unnest_row_id INT,
val TIMESTAMP WITHOUT TIME ZONE[]
);
INSERT INTO unnest_2d_tbl05_groundtruth VALUES
(1, 1, ARRAY['2017-01-01 11:00:02'::TIMESTAMP WITHOUT TIME ZONE,
'2017-01-01 13:00:05',
'2017-01-02 11:55:00']),
(1, 2, ARRAY['2016-10-12 12:00:02'::TIMESTAMP WITHOUT TIME ZONE,
'2016-10-12 13:15:22',
NULL]),
(2, NULL, NULL),
(3, 1, ARRAY['2014-02-01 11:00:02'::TIMESTAMP WITHOUT TIME ZONE,
'2014-02-01 13:00:05',
'2014-02-02 11:55:00']),
(3, 2, ARRAY['2013-07-12 12:00:02'::TIMESTAMP WITHOUT TIME ZONE,
NULL,
'2013-07-12 13:15:22'])
;
DROP TABLE IF EXISTS unnest_2d_tbl05_out;
CREATE TABLE unnest_2d_tbl05_out AS
SELECT id, (array_unnest_2d_to_1d(val)).* FROM unnest_2d_tbl05;
SELECT assert(
unnest_result = val,
'array_unnest_2d_to_1d: Wrong results for test table "unnest_2d_tbl05"'
)
FROM (
SELECT * FROM
unnest_2d_tbl05_out t1
JOIN
unnest_2d_tbl05_groundtruth t2
USING (id,unnest_row_id)
) t3;
-- TESTING array_to_bytea() function - skip for gpdb 4.3
m4_ifelse(__PORT__ __DBMS_VERSION_MAJOR__, <!GREENPLUM 4!>,,
<!
-- create input table ( n = 3 x 5 x 7 dim SMALLINT[], r = 2 x 3 x 5 dim REAL[] )
DROP TABLE IF EXISTS array_input_tbl;
CREATE TABLE array_input_tbl (id SMALLINT, n SMALLINT[], r REAL[]);
INSERT INTO array_input_tbl SELECT generate_series(1, 10);
SELECT id, count(*), array_agg(n) from (select id, unnest(n) as n from array_input_tbl) u group by id order by id;
UPDATE array_input_tbl SET
n=array_fill(2*id, ARRAY[3, 5, 7]),
r=array_fill(id + 0.4, array[2, 3, 5]);
-- create flattened input table
DROP TABLE IF EXISTS flat_array_input_tbl;
CREATE TABLE flat_array_input_tbl (id SMALLINT, n SMALLINT[], n_length SMALLINT, r REAL[], r_length SMALLINT);
INSERT INTO flat_array_input_tbl
SELECT n.id, n, n_length, r, r_length
FROM
(
SELECT id, array_agg(n) AS n, 2*COUNT(*) AS n_length
FROM
(
SELECT id, unnest(n) AS n FROM array_input_tbl
) n_values
GROUP BY id
) n
JOIN
(
SELECT id, array_agg(r) AS r, 4*COUNT(*) AS r_length
FROM
(
SELECT id, unnest(r) AS r FROM array_input_tbl
) r_values
GROUP BY id
) r
USING (id);
CREATE TABLE bytea_tbl AS SELECT id, array_to_bytea(n) AS n, array_to_bytea(r) AS r FROM array_input_tbl;
-- verify lengths of BYTEA output is correct for SMALLINT & REAL arrays
SELECT assert(
length(o.n) = i.n_length AND length(o.r) = i.r_length,
'array_to_bytea() returned incorrect lengths:\n' ||
' Expected length(n) = ' || n_length::TEXT || ', got ' || length(o.n) ||
' Expected ' || r_length::TEXT || ', got ' || length(o.r)
)
FROM flat_array_input_tbl i JOIN bytea_tbl o USING (id);
-- convert BYTEA back to flat arrays of SMALLINT's & REAL's
CREATE TABLE array_output_tbl AS
SELECT
id,
convert_bytea_to_smallint_array(n) AS n,
convert_bytea_to_real_array(r) AS r
FROM bytea_tbl;
-- verify that data in above table matches flattened input table exactly
SELECT assert(
i.n = o.n AND i.r = o.r,
'output of array_to_bytea() does not convert back to flattened input'
)
FROM flat_array_input_tbl i JOIN array_output_tbl o USING (id);
!>)
m4_changequote(,)