1289 lines
45 KiB
Plaintext
1289 lines
45 KiB
Plaintext
--
|
|
-- ARRAYS
|
|
--
|
|
CREATE TABLE arrtest (
|
|
a int2[],
|
|
b int4[][][],
|
|
c name[],
|
|
d text[][],
|
|
e float8[],
|
|
f char(5)[],
|
|
g varchar(5)[]
|
|
);
|
|
--
|
|
-- only the 'e' array is 0-based, the others are 1-based.
|
|
--
|
|
INSERT INTO arrtest (a[1:5], b[1:1][1:2][1:2], c, d, f, g)
|
|
VALUES ('{1,2,3,4,5}', '{{{0,0},{1,2}}}', '{}', '{}', '{}', '{}');
|
|
UPDATE arrtest SET e[0] = '1.1';
|
|
UPDATE arrtest SET e[1] = '2.2';
|
|
INSERT INTO arrtest (f)
|
|
VALUES ('{"too long"}');
|
|
ERROR: value too long for type character(5)
|
|
INSERT INTO arrtest (a, b[1:2][1:2], c, d, e, f, g)
|
|
VALUES ('{11,12,23}', '{{3,4},{4,5}}', '{"foobar"}',
|
|
'{{"elt1", "elt2"}}', '{"3.4", "6.7"}',
|
|
'{"abc","abcde"}', '{"abc","abcde"}');
|
|
INSERT INTO arrtest (a, b[1:2], c, d[1:2])
|
|
VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}');
|
|
SELECT * FROM arrtest;
|
|
a | b | c | d | e | f | g
|
|
-------------+-----------------+-----------+---------------+-----------------+-----------------+-------------
|
|
{1,2,3,4,5} | {{{0,0},{1,2}}} | {} | {} | [0:1]={1.1,2.2} | {} | {}
|
|
{11,12,23} | {{3,4},{4,5}} | {foobar} | {{elt1,elt2}} | {3.4,6.7} | {"abc ",abcde} | {abc,abcde}
|
|
{} | {3,4} | {foo,bar} | {bar,foo} | | |
|
|
(3 rows)
|
|
|
|
SELECT arrtest.a[1],
|
|
arrtest.b[1][1][1],
|
|
arrtest.c[1],
|
|
arrtest.d[1][1],
|
|
arrtest.e[0]
|
|
FROM arrtest;
|
|
a | b | c | d | e
|
|
----+---+--------+------+-----
|
|
1 | 0 | | | 1.1
|
|
11 | | foobar | elt1 |
|
|
| | foo | |
|
|
(3 rows)
|
|
|
|
SELECT a[1], b[1][1][1], c[1], d[1][1], e[0]
|
|
FROM arrtest;
|
|
a | b | c | d | e
|
|
----+---+--------+------+-----
|
|
1 | 0 | | | 1.1
|
|
11 | | foobar | elt1 |
|
|
| | foo | |
|
|
(3 rows)
|
|
|
|
SELECT a[1:3],
|
|
b[1:1][1:2][1:2],
|
|
c[1:2],
|
|
d[1:1][1:2]
|
|
FROM arrtest;
|
|
a | b | c | d
|
|
------------+-----------------+-----------+---------------
|
|
{1,2,3} | {{{0,0},{1,2}}} | {} | {}
|
|
{11,12,23} | {} | {foobar} | {{elt1,elt2}}
|
|
{} | {} | {foo,bar} | {}
|
|
(3 rows)
|
|
|
|
SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c
|
|
FROM arrtest;
|
|
a | b | c
|
|
---+---+---
|
|
1 | 3 |
|
|
1 | 2 | 1
|
|
| 1 | 1
|
|
(3 rows)
|
|
|
|
SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c
|
|
FROM arrtest;
|
|
a | b | c
|
|
-------+-----------------+-------
|
|
[1:5] | [1:1][1:2][1:2] |
|
|
[1:3] | [1:2][1:2] | [1:1]
|
|
| [1:2] | [1:2]
|
|
(3 rows)
|
|
|
|
-- returns nothing
|
|
SELECT *
|
|
FROM arrtest
|
|
WHERE a[1] < 5 and
|
|
c = '{"foobar"}'::_name;
|
|
a | b | c | d | e | f | g
|
|
---+---+---+---+---+---+---
|
|
(0 rows)
|
|
|
|
UPDATE arrtest
|
|
SET a[1:2] = '{16,25}'
|
|
WHERE NOT a = '{}'::_int2;
|
|
UPDATE arrtest
|
|
SET b[1:1][1:1][1:2] = '{113, 117}',
|
|
b[1:1][1:2][2:2] = '{142, 147}'
|
|
WHERE array_dims(b) = '[1:1][1:2][1:2]';
|
|
UPDATE arrtest
|
|
SET c[2:2] = '{"new_word"}'
|
|
WHERE array_dims(c) is not null;
|
|
SELECT a,b,c FROM arrtest;
|
|
a | b | c
|
|
---------------+-----------------------+-------------------
|
|
{16,25,3,4,5} | {{{113,142},{1,147}}} | {}
|
|
{} | {3,4} | {foo,new_word}
|
|
{16,25,23} | {{3,4},{4,5}} | {foobar,new_word}
|
|
(3 rows)
|
|
|
|
SELECT a[1:3],
|
|
b[1:1][1:2][1:2],
|
|
c[1:2],
|
|
d[1:1][2:2]
|
|
FROM arrtest;
|
|
a | b | c | d
|
|
------------+-----------------------+-------------------+----------
|
|
{16,25,3} | {{{113,142},{1,147}}} | {} | {}
|
|
{} | {} | {foo,new_word} | {}
|
|
{16,25,23} | {} | {foobar,new_word} | {{elt2}}
|
|
(3 rows)
|
|
|
|
INSERT INTO arrtest(a) VALUES('{1,null,3}');
|
|
SELECT a FROM arrtest;
|
|
a
|
|
---------------
|
|
{16,25,3,4,5}
|
|
{}
|
|
{16,25,23}
|
|
{1,NULL,3}
|
|
(4 rows)
|
|
|
|
UPDATE arrtest SET a[4] = NULL WHERE a[2] IS NULL;
|
|
SELECT a FROM arrtest WHERE a[2] IS NULL;
|
|
a
|
|
-----------------
|
|
[4:4]={NULL}
|
|
{1,NULL,3,NULL}
|
|
(2 rows)
|
|
|
|
DELETE FROM arrtest WHERE a[2] IS NULL AND b IS NULL;
|
|
SELECT a,b,c FROM arrtest;
|
|
a | b | c
|
|
---------------+-----------------------+-------------------
|
|
{16,25,3,4,5} | {{{113,142},{1,147}}} | {}
|
|
{16,25,23} | {{3,4},{4,5}} | {foobar,new_word}
|
|
[4:4]={NULL} | {3,4} | {foo,new_word}
|
|
(3 rows)
|
|
|
|
--
|
|
-- test array extension
|
|
--
|
|
CREATE TEMP TABLE arrtest1 (i int[], t text[]);
|
|
insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']);
|
|
select * from arrtest1;
|
|
i | t
|
|
--------------+---------------------
|
|
{1,2,NULL,4} | {one,two,NULL,four}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[2] = 22, t[2] = 'twenty-two';
|
|
select * from arrtest1;
|
|
i | t
|
|
---------------+----------------------------
|
|
{1,22,NULL,4} | {one,twenty-two,NULL,four}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[5] = 5, t[5] = 'five';
|
|
select * from arrtest1;
|
|
i | t
|
|
-----------------+---------------------------------
|
|
{1,22,NULL,4,5} | {one,twenty-two,NULL,four,five}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[8] = 8, t[8] = 'eight';
|
|
select * from arrtest1;
|
|
i | t
|
|
-----------------------------+-------------------------------------------------
|
|
{1,22,NULL,4,5,NULL,NULL,8} | {one,twenty-two,NULL,four,five,NULL,NULL,eight}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[0] = 0, t[0] = 'zero';
|
|
select * from arrtest1;
|
|
i | t
|
|
-------------------------------------+------------------------------------------------------------
|
|
[0:8]={0,1,22,NULL,4,5,NULL,NULL,8} | [0:8]={zero,one,twenty-two,NULL,four,five,NULL,NULL,eight}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[-3] = -3, t[-3] = 'minus-three';
|
|
select * from arrtest1;
|
|
i | t
|
|
---------------------------------------------------+-----------------------------------------------------------------------------------
|
|
[-3:8]={-3,NULL,NULL,0,1,22,NULL,4,5,NULL,NULL,8} | [-3:8]={minus-three,NULL,NULL,zero,one,twenty-two,NULL,four,five,NULL,NULL,eight}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[0:2] = array[10,11,12], t[0:2] = array['ten','eleven','twelve'];
|
|
select * from arrtest1;
|
|
i | t
|
|
-----------------------------------------------------+---------------------------------------------------------------------------------
|
|
[-3:8]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,8} | [-3:8]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,eight}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[8:10] = array[18,null,20], t[8:10] = array['p18',null,'p20'];
|
|
select * from arrtest1;
|
|
i | t
|
|
---------------------------------------------------------------+-----------------------------------------------------------------------------------------
|
|
[-3:10]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20} | [-3:10]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[11:12] = array[null,22], t[11:12] = array[null,'p22'];
|
|
select * from arrtest1;
|
|
i | t
|
|
-----------------------------------------------------------------------+--------------------------------------------------------------------------------------------------
|
|
[-3:12]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22} | [-3:12]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[15:16] = array[null,26], t[15:16] = array[null,'p26'];
|
|
select * from arrtest1;
|
|
i | t
|
|
-----------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------
|
|
[-3:16]={-3,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-3:16]={minus-three,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[-5:-3] = array[-15,-14,-13], t[-5:-3] = array['m15','m14','m13'];
|
|
select * from arrtest1;
|
|
i | t
|
|
--------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------
|
|
[-5:16]={-15,-14,-13,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-5:16]={m15,m14,m13,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[-7:-6] = array[-17,null], t[-7:-6] = array['m17',null];
|
|
select * from arrtest1;
|
|
i | t
|
|
-----------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------
|
|
[-7:16]={-17,NULL,-15,-14,-13,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-7:16]={m17,NULL,m15,m14,m13,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[-12:-10] = array[-22,null,-20], t[-12:-10] = array['m22',null,'m20'];
|
|
select * from arrtest1;
|
|
i | t
|
|
-----------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
[-12:16]={-22,NULL,-20,NULL,NULL,-17,NULL,-15,-14,-13,NULL,NULL,10,11,12,NULL,4,5,NULL,NULL,18,NULL,20,NULL,22,NULL,NULL,NULL,26} | [-12:16]={m22,NULL,m20,NULL,NULL,m17,NULL,m15,m14,m13,NULL,NULL,ten,eleven,twelve,NULL,four,five,NULL,NULL,p18,NULL,p20,NULL,p22,NULL,NULL,NULL,p26}
|
|
(1 row)
|
|
|
|
delete from arrtest1;
|
|
insert into arrtest1 values(array[1,2,null,4], array['one','two',null,'four']);
|
|
select * from arrtest1;
|
|
i | t
|
|
--------------+---------------------
|
|
{1,2,NULL,4} | {one,two,NULL,four}
|
|
(1 row)
|
|
|
|
update arrtest1 set i[0:5] = array[0,1,2,null,4,5], t[0:5] = array['z','p1','p2',null,'p4','p5'];
|
|
select * from arrtest1;
|
|
i | t
|
|
------------------------+----------------------------
|
|
[0:5]={0,1,2,NULL,4,5} | [0:5]={z,p1,p2,NULL,p4,p5}
|
|
(1 row)
|
|
|
|
--
|
|
-- array expressions and operators
|
|
--
|
|
-- table creation and INSERTs
|
|
CREATE TEMP TABLE arrtest2 (i integer ARRAY[4], f float8[], n numeric[], t text[], d timestamp[]);
|
|
INSERT INTO arrtest2 VALUES(
|
|
ARRAY[[[113,142],[1,147]]],
|
|
ARRAY[1.1,1.2,1.3]::float8[],
|
|
ARRAY[1.1,1.2,1.3],
|
|
ARRAY[[['aaa','aab'],['aba','abb'],['aca','acb']],[['baa','bab'],['bba','bbb'],['bca','bcb']]],
|
|
ARRAY['19620326','19931223','19970117']::timestamp[]
|
|
);
|
|
-- some more test data
|
|
CREATE TEMP TABLE arrtest_f (f0 int, f1 text, f2 float8);
|
|
insert into arrtest_f values(1,'cat1',1.21);
|
|
insert into arrtest_f values(2,'cat1',1.24);
|
|
insert into arrtest_f values(3,'cat1',1.18);
|
|
insert into arrtest_f values(4,'cat1',1.26);
|
|
insert into arrtest_f values(5,'cat1',1.15);
|
|
insert into arrtest_f values(6,'cat2',1.15);
|
|
insert into arrtest_f values(7,'cat2',1.26);
|
|
insert into arrtest_f values(8,'cat2',1.32);
|
|
insert into arrtest_f values(9,'cat2',1.30);
|
|
CREATE TEMP TABLE arrtest_i (f0 int, f1 text, f2 int);
|
|
insert into arrtest_i values(1,'cat1',21);
|
|
insert into arrtest_i values(2,'cat1',24);
|
|
insert into arrtest_i values(3,'cat1',18);
|
|
insert into arrtest_i values(4,'cat1',26);
|
|
insert into arrtest_i values(5,'cat1',15);
|
|
insert into arrtest_i values(6,'cat2',15);
|
|
insert into arrtest_i values(7,'cat2',26);
|
|
insert into arrtest_i values(8,'cat2',32);
|
|
insert into arrtest_i values(9,'cat2',30);
|
|
-- expressions
|
|
SELECT t.f[1][3][1] AS "131", t.f[2][2][1] AS "221" FROM (
|
|
SELECT ARRAY[[[111,112],[121,122],[131,132]],[[211,212],[221,122],[231,232]]] AS f
|
|
) AS t;
|
|
131 | 221
|
|
-----+-----
|
|
131 | 221
|
|
(1 row)
|
|
|
|
SELECT ARRAY[[[[[['hello'],['world']]]]]];
|
|
array
|
|
---------------------------
|
|
{{{{{{hello},{world}}}}}}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[ARRAY['hello'],ARRAY['world']];
|
|
array
|
|
-------------------
|
|
{{hello},{world}}
|
|
(1 row)
|
|
|
|
SELECT ARRAY(select f2 from arrtest_f order by f2) AS "ARRAY";
|
|
ARRAY
|
|
-----------------------------------------------
|
|
{1.15,1.15,1.18,1.21,1.24,1.26,1.26,1.3,1.32}
|
|
(1 row)
|
|
|
|
-- with nulls
|
|
SELECT '{1,null,3}'::int[];
|
|
int4
|
|
------------
|
|
{1,NULL,3}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[1,NULL,3];
|
|
array
|
|
------------
|
|
{1,NULL,3}
|
|
(1 row)
|
|
|
|
-- functions
|
|
SELECT array_append(array[42], 6) AS "{42,6}";
|
|
{42,6}
|
|
--------
|
|
{42,6}
|
|
(1 row)
|
|
|
|
SELECT array_prepend(6, array[42]) AS "{6,42}";
|
|
{6,42}
|
|
--------
|
|
{6,42}
|
|
(1 row)
|
|
|
|
SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}";
|
|
{1,2,3,4}
|
|
-----------
|
|
{1,2,3,4}
|
|
(1 row)
|
|
|
|
SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}";
|
|
{{1,2},{3,4},{5,6}}
|
|
---------------------
|
|
{{1,2},{3,4},{5,6}}
|
|
(1 row)
|
|
|
|
SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}";
|
|
{{3,4},{5,6},{1,2}}
|
|
---------------------
|
|
{{3,4},{5,6},{1,2}}
|
|
(1 row)
|
|
|
|
-- operators
|
|
SELECT a FROM arrtest WHERE b = ARRAY[[[113,142],[1,147]]];
|
|
a
|
|
---------------
|
|
{16,25,3,4,5}
|
|
(1 row)
|
|
|
|
SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE";
|
|
FALSE
|
|
-------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT ARRAY[1,2] || 3 AS "{1,2,3}";
|
|
{1,2,3}
|
|
---------
|
|
{1,2,3}
|
|
(1 row)
|
|
|
|
SELECT 0 || ARRAY[1,2] AS "{0,1,2}";
|
|
{0,1,2}
|
|
---------
|
|
{0,1,2}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}";
|
|
{1,2,3,4}
|
|
-----------
|
|
{1,2,3,4}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY";
|
|
ARRAY
|
|
--------------------------------------
|
|
{{{hello,world}},{{happy,birthday}}}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}";
|
|
{{1,2},{3,4},{5,6}}
|
|
---------------------
|
|
{{1,2},{3,4},{5,6}}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
|
|
{0,0,1,1,2,2}
|
|
---------------
|
|
{0,0,1,1,2,2}
|
|
(1 row)
|
|
|
|
SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
|
|
{0,1,2,3}
|
|
-----------
|
|
{0,1,2,3}
|
|
(1 row)
|
|
|
|
SELECT * FROM array_op_test WHERE i @> '{32}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
|
|
6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
|
|
74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
|
|
77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
|
|
89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
|
|
98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
|
|
100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
|
|
(6 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE i && '{32}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
|
|
6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
|
|
74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
|
|
77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
|
|
89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
|
|
98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
|
|
100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
|
|
(6 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE i @> '{17}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
|
|
6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
|
|
12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
|
|
15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
|
|
19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
|
|
53 | {38,17} | {AAAAAAAAAAA21658}
|
|
65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
|
|
77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
|
|
89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
|
|
(8 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE i && '{17}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
|
|
6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
|
|
12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
|
|
15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
|
|
19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
|
|
53 | {38,17} | {AAAAAAAAAAA21658}
|
|
65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
|
|
77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
|
|
89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
|
|
(8 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE i @> '{32,17}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
|
|
6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
|
|
77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
|
|
89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
|
|
(3 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE i && '{32,17}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------
|
|
6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657}
|
|
12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576}
|
|
15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
|
|
19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938}
|
|
53 | {38,17} | {AAAAAAAAAAA21658}
|
|
65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012}
|
|
74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
|
|
77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066}
|
|
89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673}
|
|
98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
|
|
100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523}
|
|
(11 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+---------------+----------------------------------------------------------------------------------------------------------------------------
|
|
40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623}
|
|
74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956}
|
|
98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845}
|
|
(3 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
|
|
22 | {11,6,56,62,53,30} | {AAAAAAAA72908}
|
|
45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
|
|
72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
|
|
79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
|
|
(4 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
|
|
22 | {11,6,56,62,53,30} | {AAAAAAAA72908}
|
|
45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
|
|
72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
|
|
79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
|
|
(4 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+------------------+--------------------------------------------------------------------
|
|
15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
|
|
79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
|
|
96 | {23,97,43} | {AAAAAAAAAA646,A87088}
|
|
(3 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+------------------+--------------------------------------------------------------------
|
|
15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
|
|
79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
|
|
96 | {23,97,43} | {AAAAAAAAAA646,A87088}
|
|
(3 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+------+--------------------------------------------------------------------
|
|
79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
|
|
(1 row)
|
|
|
|
SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------
|
|
15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309}
|
|
22 | {11,6,56,62,53,30} | {AAAAAAAA72908}
|
|
45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
|
|
72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407}
|
|
79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908}
|
|
96 | {23,97,43} | {AAAAAAAAAA646,A87088}
|
|
(6 rows)
|
|
|
|
SELECT * FROM array_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno;
|
|
seqno | i | t
|
|
-------+--------------------+-----------------------------------------------------------------------------------------------------------
|
|
22 | {11,6,56,62,53,30} | {AAAAAAAA72908}
|
|
45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}
|
|
(2 rows)
|
|
|
|
-- array casts
|
|
SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}";
|
|
{1,2,3}
|
|
---------
|
|
{1,2,3}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[1,2,3]::text[]::int[]::float8[] is of (float8[]) as "TRUE";
|
|
TRUE
|
|
------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[] AS "{{a,bc},{def,hijk}}";
|
|
{{a,bc},{def,hijk}}
|
|
---------------------
|
|
{{a,bc},{def,hijk}}
|
|
(1 row)
|
|
|
|
SELECT ARRAY[['a','bc'],['def','hijk']]::text[]::varchar[] is of (varchar[]) as "TRUE";
|
|
TRUE
|
|
------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT CAST(ARRAY[[[[[['a','bb','ccc']]]]]] as text[]) as "{{{{{{a,bb,ccc}}}}}}";
|
|
{{{{{{a,bb,ccc}}}}}}
|
|
----------------------
|
|
{{{{{{a,bb,ccc}}}}}}
|
|
(1 row)
|
|
|
|
-- scalar op any/all (array)
|
|
select 33 = any ('{1,2,3}');
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select 33 = any ('{1,2,33}');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select 33 = all ('{1,2,33}');
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select 33 >= all ('{1,2,33}');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
-- boundary cases
|
|
select null::int >= all ('{1,2,33}');
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select null::int >= all ('{}');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select null::int >= any ('{}');
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
-- cross-datatype
|
|
select 33.4 = any (array[1,2,3]);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select 33.4 > all (array[1,2,3]);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
-- errors
|
|
select 33 * any ('{1,2,3}');
|
|
ERROR: op ANY/ALL (array) requires operator to yield boolean
|
|
LINE 1: select 33 * any ('{1,2,3}');
|
|
^
|
|
select 33 * any (44);
|
|
ERROR: op ANY/ALL (array) requires array on right side
|
|
LINE 1: select 33 * any (44);
|
|
^
|
|
-- nulls
|
|
select 33 = any (null::int[]);
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select null::int = any ('{1,2,3}');
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select 33 = any ('{1,null,3}');
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select 33 = any ('{1,null,33}');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select 33 = all (null::int[]);
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select null::int = all ('{1,2,3}');
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select 33 = all ('{1,null,3}');
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select 33 = all ('{33,null,33}');
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
-- test indexes on arrays
|
|
create temp table arr_tbl (f1 int[] unique);
|
|
NOTICE: CREATE TABLE / UNIQUE will create implicit index "arr_tbl_f1_key" for table "arr_tbl"
|
|
insert into arr_tbl values ('{1,2,3}');
|
|
insert into arr_tbl values ('{1,2}');
|
|
-- failure expected:
|
|
insert into arr_tbl values ('{1,2,3}');
|
|
ERROR: duplicate key value violates unique constraint "arr_tbl_f1_key"
|
|
DETAIL: Key (f1)=({1,2,3}) already exists.
|
|
insert into arr_tbl values ('{2,3,4}');
|
|
insert into arr_tbl values ('{1,5,3}');
|
|
insert into arr_tbl values ('{1,2,10}');
|
|
set enable_seqscan to off;
|
|
set enable_bitmapscan to off;
|
|
select * from arr_tbl where f1 > '{1,2,3}' and f1 <= '{1,5,3}';
|
|
f1
|
|
----------
|
|
{1,2,10}
|
|
{1,5,3}
|
|
(2 rows)
|
|
|
|
select * from arr_tbl where f1 >= '{1,2,3}' and f1 < '{1,5,3}';
|
|
f1
|
|
----------
|
|
{1,2,3}
|
|
{1,2,10}
|
|
(2 rows)
|
|
|
|
-- note: if above selects don't produce the expected tuple order,
|
|
-- then you didn't get an indexscan plan, and something is busted.
|
|
reset enable_seqscan;
|
|
reset enable_bitmapscan;
|
|
-- test [not] (like|ilike) (any|all) (...)
|
|
select 'foo' like any (array['%a', '%o']); -- t
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select 'foo' like any (array['%a', '%b']); -- f
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select 'foo' like all (array['f%', '%o']); -- t
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select 'foo' like all (array['f%', '%b']); -- f
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select 'foo' not like any (array['%a', '%b']); -- t
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select 'foo' not like all (array['%a', '%o']); -- f
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select 'foo' ilike any (array['%A', '%O']); -- t
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select 'foo' ilike all (array['F%', '%O']); -- t
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
--
|
|
-- General array parser tests
|
|
--
|
|
-- none of the following should be accepted
|
|
select '{{1,{2}},{2,3}}'::text[];
|
|
ERROR: malformed array literal: "{{1,{2}},{2,3}}"
|
|
LINE 1: select '{{1,{2}},{2,3}}'::text[];
|
|
^
|
|
select '{{},{}}'::text[];
|
|
ERROR: malformed array literal: "{{},{}}"
|
|
LINE 1: select '{{},{}}'::text[];
|
|
^
|
|
select E'{{1,2},\\{2,3}}'::text[];
|
|
ERROR: malformed array literal: "{{1,2},\{2,3}}"
|
|
LINE 1: select E'{{1,2},\\{2,3}}'::text[];
|
|
^
|
|
select '{{"1 2" x},{3}}'::text[];
|
|
ERROR: malformed array literal: "{{"1 2" x},{3}}"
|
|
LINE 1: select '{{"1 2" x},{3}}'::text[];
|
|
^
|
|
select '{}}'::text[];
|
|
ERROR: malformed array literal: "{}}"
|
|
LINE 1: select '{}}'::text[];
|
|
^
|
|
select '{ }}'::text[];
|
|
ERROR: malformed array literal: "{ }}"
|
|
LINE 1: select '{ }}'::text[];
|
|
^
|
|
select array[];
|
|
ERROR: cannot determine type of empty array
|
|
LINE 1: select array[];
|
|
^
|
|
HINT: Explicitly cast to the desired type, for example ARRAY[]::integer[].
|
|
-- none of the above should be accepted
|
|
-- all of the following should be accepted
|
|
select '{}'::text[];
|
|
text
|
|
------
|
|
{}
|
|
(1 row)
|
|
|
|
select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[];
|
|
text
|
|
-----------------------------------------------
|
|
{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}
|
|
(1 row)
|
|
|
|
select '{0 second ,0 second}'::interval[];
|
|
interval
|
|
---------------
|
|
{"@ 0","@ 0"}
|
|
(1 row)
|
|
|
|
select '{ { "," } , { 3 } }'::text[];
|
|
text
|
|
-------------
|
|
{{","},{3}}
|
|
(1 row)
|
|
|
|
select ' { { " 0 second " , 0 second } }'::text[];
|
|
text
|
|
-------------------------------
|
|
{{" 0 second ","0 second"}}
|
|
(1 row)
|
|
|
|
select '{
|
|
0 second,
|
|
@ 1 hour @ 42 minutes @ 20 seconds
|
|
}'::interval[];
|
|
interval
|
|
------------------------------------
|
|
{"@ 0","@ 1 hour 42 mins 20 secs"}
|
|
(1 row)
|
|
|
|
select array[]::text[];
|
|
array
|
|
-------
|
|
{}
|
|
(1 row)
|
|
|
|
select '[0:1]={1.1,2.2}'::float8[];
|
|
float8
|
|
-----------------
|
|
[0:1]={1.1,2.2}
|
|
(1 row)
|
|
|
|
-- all of the above should be accepted
|
|
-- tests for array aggregates
|
|
CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]);
|
|
INSERT INTO arraggtest (f1, f2, f3) VALUES
|
|
('{1,2,3,4}','{{grey,red},{blue,blue}}','{1.6, 0.0}');
|
|
INSERT INTO arraggtest (f1, f2, f3) VALUES
|
|
('{1,2,3}','{{grey,red},{grey,blue}}','{1.6}');
|
|
SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
|
|
max | min | max | min | max | min
|
|
-----------+---------+--------------------------+--------------------------+---------+-------
|
|
{1,2,3,4} | {1,2,3} | {{grey,red},{grey,blue}} | {{grey,red},{blue,blue}} | {1.6,0} | {1.6}
|
|
(1 row)
|
|
|
|
INSERT INTO arraggtest (f1, f2, f3) VALUES
|
|
('{3,3,2,4,5,6}','{{white,yellow},{pink,orange}}','{2.1,3.3,1.8,1.7,1.6}');
|
|
SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
|
|
max | min | max | min | max | min
|
|
---------------+---------+--------------------------------+--------------------------+-----------------------+-------
|
|
{3,3,2,4,5,6} | {1,2,3} | {{white,yellow},{pink,orange}} | {{grey,red},{blue,blue}} | {2.1,3.3,1.8,1.7,1.6} | {1.6}
|
|
(1 row)
|
|
|
|
INSERT INTO arraggtest (f1, f2, f3) VALUES
|
|
('{2}','{{black,red},{green,orange}}','{1.6,2.2,2.6,0.4}');
|
|
SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
|
|
max | min | max | min | max | min
|
|
---------------+---------+--------------------------------+------------------------------+-----------------------+-------
|
|
{3,3,2,4,5,6} | {1,2,3} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6}
|
|
(1 row)
|
|
|
|
INSERT INTO arraggtest (f1, f2, f3) VALUES
|
|
('{4,2,6,7,8,1}','{{red},{black},{purple},{blue},{blue}}',NULL);
|
|
SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
|
|
max | min | max | min | max | min
|
|
---------------+---------+--------------------------------+------------------------------+-----------------------+-------
|
|
{4,2,6,7,8,1} | {1,2,3} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6}
|
|
(1 row)
|
|
|
|
INSERT INTO arraggtest (f1, f2, f3) VALUES
|
|
('{}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}');
|
|
SELECT max(f1), min(f1), max(f2), min(f2), max(f3), min(f3) FROM arraggtest;
|
|
max | min | max | min | max | min
|
|
---------------+-----+--------------------------------+------------------------------+-----------------------+-------
|
|
{4,2,6,7,8,1} | {} | {{white,yellow},{pink,orange}} | {{black,red},{green,orange}} | {2.1,3.3,1.8,1.7,1.6} | {1.6}
|
|
(1 row)
|
|
|
|
-- A few simple tests for arrays of composite types
|
|
create type comptype as (f1 int, f2 text);
|
|
create table comptable (c1 comptype, c2 comptype[]);
|
|
-- XXX would like to not have to specify row() construct types here ...
|
|
insert into comptable
|
|
values (row(1,'foo'), array[row(2,'bar')::comptype, row(3,'baz')::comptype]);
|
|
-- check that implicitly named array type _comptype isn't a problem
|
|
create type _comptype as enum('fooey');
|
|
select * from comptable;
|
|
c1 | c2
|
|
---------+-----------------------
|
|
(1,foo) | {"(2,bar)","(3,baz)"}
|
|
(1 row)
|
|
|
|
select c2[2].f2 from comptable;
|
|
f2
|
|
-----
|
|
baz
|
|
(1 row)
|
|
|
|
drop type _comptype;
|
|
drop table comptable;
|
|
drop type comptype;
|
|
create or replace function unnest1(anyarray)
|
|
returns setof anyelement as $$
|
|
select $1[s] from generate_subscripts($1,1) g(s);
|
|
$$ language sql immutable;
|
|
create or replace function unnest2(anyarray)
|
|
returns setof anyelement as $$
|
|
select $1[s1][s2] from generate_subscripts($1,1) g1(s1),
|
|
generate_subscripts($1,2) g2(s2);
|
|
$$ language sql immutable;
|
|
select * from unnest1(array[1,2,3]);
|
|
unnest1
|
|
---------
|
|
1
|
|
2
|
|
3
|
|
(3 rows)
|
|
|
|
select * from unnest2(array[[1,2,3],[4,5,6]]);
|
|
unnest2
|
|
---------
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
(6 rows)
|
|
|
|
drop function unnest1(anyarray);
|
|
drop function unnest2(anyarray);
|
|
select array_fill(null::integer, array[3,3],array[2,2]);
|
|
array_fill
|
|
-----------------------------------------------------------------
|
|
[2:4][2:4]={{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
|
|
(1 row)
|
|
|
|
select array_fill(null::integer, array[3,3]);
|
|
array_fill
|
|
------------------------------------------------------
|
|
{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
|
|
(1 row)
|
|
|
|
select array_fill(null::text, array[3,3],array[2,2]);
|
|
array_fill
|
|
-----------------------------------------------------------------
|
|
[2:4][2:4]={{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
|
|
(1 row)
|
|
|
|
select array_fill(null::text, array[3,3]);
|
|
array_fill
|
|
------------------------------------------------------
|
|
{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}
|
|
(1 row)
|
|
|
|
select array_fill(7, array[3,3],array[2,2]);
|
|
array_fill
|
|
--------------------------------------
|
|
[2:4][2:4]={{7,7,7},{7,7,7},{7,7,7}}
|
|
(1 row)
|
|
|
|
select array_fill(7, array[3,3]);
|
|
array_fill
|
|
---------------------------
|
|
{{7,7,7},{7,7,7},{7,7,7}}
|
|
(1 row)
|
|
|
|
select array_fill('juhu'::text, array[3,3],array[2,2]);
|
|
array_fill
|
|
-----------------------------------------------------------------
|
|
[2:4][2:4]={{juhu,juhu,juhu},{juhu,juhu,juhu},{juhu,juhu,juhu}}
|
|
(1 row)
|
|
|
|
select array_fill('juhu'::text, array[3,3]);
|
|
array_fill
|
|
------------------------------------------------------
|
|
{{juhu,juhu,juhu},{juhu,juhu,juhu},{juhu,juhu,juhu}}
|
|
(1 row)
|
|
|
|
-- raise exception
|
|
select array_fill(1, null, array[2,2]);
|
|
ERROR: dimension array or low bound array cannot be NULL
|
|
select array_fill(1, array[2,2], null);
|
|
ERROR: dimension array or low bound array cannot be NULL
|
|
select array_fill(1, array[3,3], array[1,1,1]);
|
|
ERROR: wrong number of array subscripts
|
|
DETAIL: Low bound array has different size than dimensions array.
|
|
select array_fill(1, array[1,2,null]);
|
|
ERROR: dimension values cannot be null
|
|
select string_to_array('1|2|3', '|');
|
|
string_to_array
|
|
-----------------
|
|
{1,2,3}
|
|
(1 row)
|
|
|
|
select string_to_array('1|2|3|', '|');
|
|
string_to_array
|
|
-----------------
|
|
{1,2,3,""}
|
|
(1 row)
|
|
|
|
select string_to_array('1||2|3||', '||');
|
|
string_to_array
|
|
-----------------
|
|
{1,2|3,""}
|
|
(1 row)
|
|
|
|
select string_to_array('1|2|3', '');
|
|
string_to_array
|
|
-----------------
|
|
{1|2|3}
|
|
(1 row)
|
|
|
|
select string_to_array('', '|');
|
|
string_to_array
|
|
-----------------
|
|
{}
|
|
(1 row)
|
|
|
|
select string_to_array('1|2|3', NULL);
|
|
string_to_array
|
|
-----------------
|
|
{1,|,2,|,3}
|
|
(1 row)
|
|
|
|
select string_to_array(NULL, '|') IS NULL;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select string_to_array('abc', '');
|
|
string_to_array
|
|
-----------------
|
|
{abc}
|
|
(1 row)
|
|
|
|
select string_to_array('abc', '', 'abc');
|
|
string_to_array
|
|
-----------------
|
|
{NULL}
|
|
(1 row)
|
|
|
|
select string_to_array('abc', ',');
|
|
string_to_array
|
|
-----------------
|
|
{abc}
|
|
(1 row)
|
|
|
|
select string_to_array('abc', ',', 'abc');
|
|
string_to_array
|
|
-----------------
|
|
{NULL}
|
|
(1 row)
|
|
|
|
select string_to_array('1,2,3,4,,6', ',');
|
|
string_to_array
|
|
-----------------
|
|
{1,2,3,4,"",6}
|
|
(1 row)
|
|
|
|
select string_to_array('1,2,3,4,,6', ',', '');
|
|
string_to_array
|
|
------------------
|
|
{1,2,3,4,NULL,6}
|
|
(1 row)
|
|
|
|
select string_to_array('1,2,3,4,*,6', ',', '*');
|
|
string_to_array
|
|
------------------
|
|
{1,2,3,4,NULL,6}
|
|
(1 row)
|
|
|
|
select array_to_string(NULL::int4[], ',') IS NULL;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select array_to_string('{}'::int4[], ',');
|
|
array_to_string
|
|
-----------------
|
|
|
|
(1 row)
|
|
|
|
select array_to_string(array[1,2,3,4,NULL,6], ',');
|
|
array_to_string
|
|
-----------------
|
|
1,2,3,4,6
|
|
(1 row)
|
|
|
|
select array_to_string(array[1,2,3,4,NULL,6], ',', '*');
|
|
array_to_string
|
|
-----------------
|
|
1,2,3,4,*,6
|
|
(1 row)
|
|
|
|
select array_to_string(array[1,2,3,4,NULL,6], NULL);
|
|
array_to_string
|
|
-----------------
|
|
|
|
(1 row)
|
|
|
|
select array_to_string(array[1,2,3,4,NULL,6], ',', NULL);
|
|
array_to_string
|
|
-----------------
|
|
1,2,3,4,6
|
|
(1 row)
|
|
|
|
select array_to_string(string_to_array('1|2|3', '|'), '|');
|
|
array_to_string
|
|
-----------------
|
|
1|2|3
|
|
(1 row)
|
|
|
|
select array_length(array[1,2,3], 1);
|
|
array_length
|
|
--------------
|
|
3
|
|
(1 row)
|
|
|
|
select array_length(array[[1,2,3], [4,5,6]], 0);
|
|
array_length
|
|
--------------
|
|
|
|
(1 row)
|
|
|
|
select array_length(array[[1,2,3], [4,5,6]], 1);
|
|
array_length
|
|
--------------
|
|
2
|
|
(1 row)
|
|
|
|
select array_length(array[[1,2,3], [4,5,6]], 2);
|
|
array_length
|
|
--------------
|
|
3
|
|
(1 row)
|
|
|
|
select array_length(array[[1,2,3], [4,5,6]], 3);
|
|
array_length
|
|
--------------
|
|
|
|
(1 row)
|
|
|
|
select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss;
|
|
array_agg
|
|
--------------------------------------
|
|
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}
|
|
(1 row)
|
|
|
|
select array_agg(ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;
|
|
array_agg
|
|
---------------------------------
|
|
{0,1,2,3,4,5,6,7,8,9,0,1,2,3,4}
|
|
(1 row)
|
|
|
|
select array_agg(nullif(ten, 4)) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;
|
|
array_agg
|
|
---------------------------------------
|
|
{0,1,2,3,NULL,5,6,7,8,9,0,1,2,3,NULL}
|
|
(1 row)
|
|
|
|
select array_agg(unique1) from tenk1 where unique1 < -15;
|
|
array_agg
|
|
-----------
|
|
|
|
(1 row)
|
|
|
|
select unnest(array[1,2,3]);
|
|
unnest
|
|
--------
|
|
1
|
|
2
|
|
3
|
|
(3 rows)
|
|
|
|
select * from unnest(array[1,2,3]);
|
|
unnest
|
|
--------
|
|
1
|
|
2
|
|
3
|
|
(3 rows)
|
|
|
|
select unnest(array[1,2,3,4.5]::float8[]);
|
|
unnest
|
|
--------
|
|
1
|
|
2
|
|
3
|
|
4.5
|
|
(4 rows)
|
|
|
|
select unnest(array[1,2,3,4.5]::numeric[]);
|
|
unnest
|
|
--------
|
|
1
|
|
2
|
|
3
|
|
4.5
|
|
(4 rows)
|
|
|
|
select unnest(array[1,2,3,null,4,null,null,5,6]);
|
|
unnest
|
|
--------
|
|
1
|
|
2
|
|
3
|
|
|
|
4
|
|
|
|
|
|
5
|
|
6
|
|
(9 rows)
|
|
|
|
select unnest(array[1,2,3,null,4,null,null,5,6]::text[]);
|
|
unnest
|
|
--------
|
|
1
|
|
2
|
|
3
|
|
|
|
4
|
|
|
|
|
|
5
|
|
6
|
|
(9 rows)
|
|
|
|
-- Insert/update on a column that is array of composite
|
|
create temp table t1 (f1 int8_tbl[]);
|
|
insert into t1 (f1[5].q1) values(42);
|
|
select * from t1;
|
|
f1
|
|
-----------------
|
|
[5:5]={"(42,)"}
|
|
(1 row)
|
|
|
|
update t1 set f1[5].q2 = 43;
|
|
select * from t1;
|
|
f1
|
|
-------------------
|
|
[5:5]={"(42,43)"}
|
|
(1 row)
|
|
|