-- -- 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_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" 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) -- note: if above select doesn'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}}" select '{{},{}}'::text[]; ERROR: malformed array literal: "{{},{}}" select E'{{1,2},\\{2,3}}'::text[]; ERROR: malformed array literal: "{{1,2},\{2,3}}" select '{{"1 2" x},{3}}'::text[]; ERROR: malformed array literal: "{{"1 2" x},{3}}" select '{}}'::text[]; ERROR: malformed array literal: "{}}" select '{ }}'::text[]; ERROR: malformed array literal: "{ }}" select array[]; ERROR: cannot determine type of empty 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) -- 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 HINT: Low bound array has different size than dimensions array. select array_fill(1, array[1,2,null]); ERROR: dimension values cannot be null