INSERTINTO arrtest (b[2]) VALUES(now()); -- error, type mismatch
INSERTINTO arrtest (b[1:2]) VALUES(now()); -- error, type mismatch
SELECT * FROM arrtest;
SELECT arrtest.a[1],
arrtest.b[1][1][1],
arrtest.c[1],
arrtest.d[1][1],
arrtest.e[0] FROM arrtest;
SELECT a[1], b[1][1][1], c[1], d[1][1], e[0] FROM arrtest;
SELECT a[1:3],
b[1:1][1:2][1:2],
c[1:2],
d[1:1][1:2] FROM arrtest;
SELECT array_ndims(a) AS a,array_ndims(b) AS b,array_ndims(c) AS c FROM arrtest;
SELECT array_dims(a) AS a,array_dims(b) AS b,array_dims(c) AS c FROM arrtest;
-- returns nothing SELECT * FROM arrtest WHERE a[1] < 5and
c = '{"foobar"}'::_name;
UPDATE arrtest SET a[1:2] = '{16,25}' WHERENOT 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) isnotnull;
SELECT a,b,c FROM arrtest;
SELECT a[1:3],
b[1:1][1:2][1:2],
c[1:2],
d[1:1][2:2] FROM arrtest;
SELECT b[1:1][2][2],
d[1:1][2] FROM arrtest;
INSERTINTO arrtest(a) VALUES('{1,null,3}'); SELECT a FROM arrtest; UPDATE arrtest SET a[4] = NULLWHERE a[2] ISNULL; SELECT a FROM arrtest WHERE a[2] ISNULL; DELETEFROM arrtest WHERE a[2] ISNULLAND b ISNULL; SELECT a,b,c FROM arrtest;
-- test non-error-throwing API SELECT pg_input_is_valid('{1,2,3}', 'integer[]'); SELECT pg_input_is_valid('{1,2', 'integer[]'); SELECT pg_input_is_valid('{1,zed}', 'integer[]'); SELECT * FROM pg_input_error_info('{1,zed}', 'integer[]');
-- -- check subscription corner cases -- -- More subscripts than MAXDIM (6) SELECT ('{}'::int[])[1][2][3][4][5][6][7]; -- NULL index yields NULL when selecting SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL][1]; SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][NULL:1][1]; SELECT ('{{{1},{2},{3}},{{4},{5},{6}}}'::int[])[1][1:NULL][1]; -- NULL index in assignment is an error UPDATE arrtest SET c[NULL] = '{"can''t assign"}' WHERE array_dims(c) isnotnull; UPDATE arrtest SET c[NULL:1] = '{"can''t assign"}' WHERE array_dims(c) isnotnull; UPDATE arrtest SET c[1:NULL] = '{"can''t assign"}' WHERE array_dims(c) isnotnull; -- Un-subscriptable type SELECT (now())[1];
-- test slices with empty lower and/or upper index CREATE TEMP TABLE arrtest_s (
a int2[],
b int2[][]
); INSERTINTO arrtest_s VALUES ('{1,2,3,4,5}', '{{1,2,3}, {4,5,6}, {7,8,9}}'); INSERTINTO arrtest_s VALUES ('[0:4]={1,2,3,4,5}', '[0:2][0:2]={{1,2,3}, {4,5,6}, {7,8,9}}');
SELECT * FROM arrtest_s; SELECT a[:3], b[:2][:2] FROM arrtest_s; SELECT a[2:], b[2:][2:] FROM arrtest_s; SELECT a[:], b[:] FROM arrtest_s;
-- updates UPDATE arrtest_s SET a[:3] = '{11, 12, 13}', b[:2][:2] = '{{11,12}, {14,15}}' WHERE array_lower(a,1) = 1; SELECT * FROM arrtest_s; UPDATE arrtest_s SET a[3:] = '{23, 24, 25}', b[2:][2:] = '{{25,26}, {28,29}}'; SELECT * FROM arrtest_s; UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; SELECT * FROM arrtest_s; UPDATE arrtest_s SET a[:] = '{23, 24, 25}'; -- fail, too small INSERTINTO arrtest_s VALUES(NULL, NULL); UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; -- fail, no good with null
-- we want to work with a point_tbl that includes a null CREATE TEMP TABLE point_tbl ASSELECT * FROM public.point_tbl; INSERTINTO POINT_TBL(f1) VALUES (NULL);
-- check with fixed-length-array type, such as point SELECT f1[0:1] FROM POINT_TBL; SELECT f1[0:] FROM POINT_TBL; SELECT f1[:1] FROM POINT_TBL; SELECT f1[:] FROM POINT_TBL;
-- subscript assignments to fixed-width result in NULL if previous value is NULL UPDATE point_tbl SET f1[0] = 10WHERE f1 ISNULL RETURNING *; INSERTINTO point_tbl(f1[0]) VALUES(0) RETURNING *; -- NULL assignments get ignored UPDATE point_tbl SET f1[0] = NULLWHERE f1::text = '(10,10)'::point::text RETURNING *; -- but non-NULL subscript assignments work UPDATE point_tbl SET f1[0] = -10, f1[1] = -10WHERE f1::text = '(10,10)'::point::text RETURNING *; -- but not to expand the range UPDATE point_tbl SET f1[3] = 10WHERE f1::text = '(-10,-10)'::point::text RETURNING *;
-- -- test array extension -- CREATE TEMP TABLE arrtest1 (i int[], t text[]); insertinto arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); select * from arrtest1; update arrtest1 set i[2] = 22, t[2] = 'twenty-two'; select * from arrtest1; update arrtest1 set i[5] = 5, t[5] = 'five'; select * from arrtest1; update arrtest1 set i[8] = 8, t[8] = 'eight'; select * from arrtest1; update arrtest1 set i[0] = 0, t[0] = 'zero'; select * from arrtest1; update arrtest1 set i[-3] = -3, t[-3] = 'minus-three'; select * from arrtest1; update arrtest1 set i[0:2] = array[10,11,12], t[0:2] = array['ten','eleven','twelve']; select * from arrtest1; update arrtest1 set i[8:10] = array[18,null,20], t[8:10] = array['p18',null,'p20']; select * from arrtest1; update arrtest1 set i[11:12] = array[null,22], t[11:12] = array[null,'p22']; select * from arrtest1; update arrtest1 set i[15:16] = array[null,26], t[15:16] = array[null,'p26']; select * from arrtest1; update arrtest1 set i[-5:-3] = array[-15,-14,-13], t[-5:-3] = array['m15','m14','m13']; select * from arrtest1; update arrtest1 set i[-7:-6] = array[-17,null], t[-7:-6] = array['m17',null]; select * from arrtest1; update arrtest1 set i[-12:-10] = array[-22,null,-20], t[-12:-10] = array['m22',null,'m20']; select * from arrtest1; deletefrom arrtest1; insertinto arrtest1 values(array[1,2,null,4], array['one','two',null,'four']); select * from arrtest1; 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;
-- -- array expressions and operators --
-- table creation and INSERTs CREATE TEMP TABLE arrtest2 (i integer ARRAY[4], f float8[], n numeric[], t text[], d timestamp[]); INSERTINTO 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); insertinto arrtest_f values(1,'cat1',1.21); insertinto arrtest_f values(2,'cat1',1.24); insertinto arrtest_f values(3,'cat1',1.18); insertinto arrtest_f values(4,'cat1',1.26); insertinto arrtest_f values(5,'cat1',1.15); insertinto arrtest_f values(6,'cat2',1.15); insertinto arrtest_f values(7,'cat2',1.26); insertinto arrtest_f values(8,'cat2',1.32); insertinto arrtest_f values(9,'cat2',1.30);
DO $$ DECLARE
o int;
a int[] := ARRAY[1,2,3,2,3,1,2];
BEGIN
o := array_position(a, 2); WHILE o ISNOTNULL LOOP
RAISE NOTICE '%', o;
o := array_position(a, 2, o + 1);
END LOOP;
END
$$ LANGUAGE plpgsql;
SELECT * FROM array_op_test WHERE i @> '{32}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i && '{32}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i @> '{17}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i && '{17}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i @> '{32,17}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i && '{32,17}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i <@ '{38,34,32,89}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i = '{}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i @> '{}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i && '{}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i <@ '{}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i = '{NULL}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i @> '{NULL}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i && '{NULL}'ORDERBY seqno; SELECT * FROM array_op_test WHERE i <@ '{NULL}'ORDERBY seqno;
SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t @> '{AAAAAAAAAA646}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t && '{AAAAAAAAAA646}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t = '{}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t @> '{}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t && '{}'ORDERBY seqno; SELECT * FROM array_op_test WHERE t <@ '{}'ORDERBY seqno;
-- scalar op any/all (array) select33 = any ('{1,2,3}'); select33 = any ('{1,2,33}'); select33 = all ('{1,2,33}'); select33 >= all ('{1,2,33}'); -- boundary cases selectnull::int >= all ('{1,2,33}'); selectnull::int >= all ('{}'); selectnull::int >= any ('{}'); -- cross-datatype select33.4 = any (array[1,2,3]); select33.4 > all (array[1,2,3]); -- errors select33 * any ('{1,2,3}'); select33 * any (44); -- nulls select33 = any (null::int[]); selectnull::int = any ('{1,2,3}'); select33 = any ('{1,null,3}'); select33 = any ('{1,null,33}'); select33 = all (null::int[]); selectnull::int = all ('{1,2,3}'); select33 = all ('{1,null,3}'); select33 = all ('{33,null,33}'); -- nulls later in the bitmap SELECT -1 != ALL(ARRAY(SELECT NULLIF(g.i, 900) FROM generate_series(1,1000) g(i)));
set enable_seqscan to off; set enable_bitmapscan to off; select * from arr_tbl where f1 > '{1,2,3}'and f1 <= '{1,5,3}'; select * from arr_tbl where f1 >= '{1,2,3}'and f1 < '{1,5,3}';
-- test ON CONFLICT DO UPDATE with arrays create temp table arr_pk_tbl (pk int4primarykey, f1 int[]); insertinto arr_pk_tbl values (1, '{1,2,3}'); insertinto arr_pk_tbl values (1, '{3,4,5}') on conflict (pk)
do updateset f1[1] = excluded.f1[1], f1[3] = excluded.f1[3]
returning pk, f1; insertinto arr_pk_tbl(pk, f1[1:2]) values (1, '{6,7,8}') on conflict (pk)
do updateset f1[1] = excluded.f1[1],
f1[2] = excluded.f1[2],
f1[3] = excluded.f1[3]
returning pk, f1;
-- 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 subscript overflow detection
-- The normal error message includes a platform-dependent limit, -- so suppress it to avoid needing multiple expected-files.
\set VERBOSITY sqlstate
-- also exercise the expanded-array case
do $$ declare a int[];
begin
a := '[-2147483648:-2147483647]={1,2}'::int[];
a[2147483647] := 42;
end $$;
\set VERBOSITY default
-- test [not] (like|ilike) (any|all) (...) select'foo'like any (array['%a', '%o']); -- t select'foo'like any (array['%a', '%b']); -- f select'foo'likeall (array['f%', '%o']); -- t select'foo'likeall (array['f%', '%b']); -- f select'foo'notlike any (array['%a', '%b']); -- t select'foo'notlikeall (array['%a', '%o']); -- f select'foo' ilike any (array['%A', '%O']); -- t select'foo' ilike all (array['F%', '%O']); -- t
-- -- General array parser tests --
-- none of the following should be accepted select'{{1,{2}},{2,3}}'::text[]; select E'{{1,2},\\{2,3}}'::text[]; select'{"a"b}'::text[]; select'{a"b"}'::text[]; select'{"a""b"}'::text[]; select'{{"1 2" x},{3}}'::text[]; select'{{"1 2"} x,{3}}'::text[]; select'{}}'::text[]; select'{ }}'::text[]; select'}{'::text[]; select'{foo{}}'::text[]; select'{"foo"{}}'::text[]; select'{foo,,bar}'::text[]; select'{{1},{{2}}}'::text[]; select'{{{1}},{2}}'::text[]; select'{{},{{}}}'::text[]; select'{{{}},{}}'::text[]; select'{{1},{}}'::text[]; select'{{},{1}}'::text[]; select'[1:0]={}'::int[]; select'[2147483646:2147483647]={1,2}'::int[]; select'[1:-1]={}'::int[]; select'[2]={1}'::int[]; select'[1:]={1}'::int[]; select'[:1]={1}'::int[]; select array[]; select'{{1,},{1},}'::text[]; select'{{1,},{1}}'::text[]; select'{{1,}}'::text[]; select'{1,}'::text[]; select'[21474836488:21474836489]={1,2}'::int[]; select'[-2147483649:-2147483648]={1,2}'::int[]; -- none of the above should be accepted
-- all of the following should be accepted select'{}'::text[]; select'{{},{}}'::text[]; select'{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; select'{null,n\ull,"null"}'::text[]; select'{ ab\c , "ab\"c" }'::text[]; select'{0 second ,0 second}'::interval[]; select'{ { "," } , { 3 } }'::text[]; select' { { " 0 second " , 0 second } }'::text[]; select'{ 0 second,
@ 1 hour @ 42 minutes @ 20 seconds
}'::interval[]; select array[]::text[]; select'[2]={1,7}'::int[]; select'[0:1]={1.1,2.2}'::float8[]; select'[2147483646:2147483646]={1}'::int[]; select'[-2147483648:-2147483647]={1,2}'::int[]; -- all of the above should be accepted
-- some day we might allow these cases, but for now they're errors: select array[]::oidvector; select array[]::int2vector;
-- tests for array aggregates CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]);
-- XXX would like to not have to specify row() construct types here ... insertinto 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; select c2[2].f2 from comptable;
drop type _comptype; droptable comptable; drop type comptype;
createorreplace function unnest1(anyarray)
returns setof anyelement as $$ select $1[s] from generate_subscripts($1,1) g(s);
$$ language sql immutable;
createorreplace 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]); select * from unnest2(array[[1,2,3],[4,5,6]]);
drop function unnest1(anyarray); drop function unnest2(anyarray);
select array_fill(null::integer, array[3,3],array[2,2]); select array_fill(null::integer, array[3,3]); select array_fill(null::text, array[3,3],array[2,2]); select array_fill(null::text, array[3,3]); select array_fill(7, array[3,3],array[2,2]); select array_fill(7, array[3,3]); select array_fill('juhu'::text, array[3,3],array[2,2]); select array_fill('juhu'::text, array[3,3]); select a, a = '{}'as is_eq, array_dims(a) from (select array_fill(42, array[0]) as a) ss; select a, a = '{}'as is_eq, array_dims(a) from (select array_fill(42, '{}') as a) ss; select a, a = '{}'as is_eq, array_dims(a) from (select array_fill(42, '{}', '{}') as a) ss; -- raise exception select array_fill(1, null, array[2,2]); select array_fill(1, array[2,2], null); select array_fill(1, array[2,2], '{}'); select array_fill(1, array[3,3], array[1,1,1]); select array_fill(1, array[1,2,null]); select array_fill(1, array[[1,2],[3,4]]);
-- array_agg(anynonarray) select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15orderby unique1) ss; select array_agg(ten) from (select ten from tenk1 where unique1 < 15orderby unique1) ss; select array_agg(nullif(ten, 4)) from (select ten from tenk1 where unique1 < 15orderby unique1) ss; select array_agg(unique1) from tenk1 where unique1 < -15;
-- array_agg(anyarray) select array_agg(ar) from (values ('{1,2}'::int[]), ('{3,4}'::int[])) v(ar); select array_agg(distinct ar orderby ar desc) from (select array[i / 2] from generate_series(1,10) a(i)) b(ar); select array_agg(ar) from (select array_agg(array[i, i+1, i-1]) from generate_series(1,2) a(i)) b(ar); select array_agg(array[i+1.2, i+1.3, i+1.4]) from generate_series(1,3) g(i); select array_agg(array['Hello', i::text]) from generate_series(9,11) g(i); select array_agg(array[i, nullif(i, 3), i+1]) from generate_series(1,4) g(i); -- errors select array_agg('{}'::int[]) from generate_series(1,2); select array_agg(null::int[]) from generate_series(1,2); select array_agg(ar) from (values ('{1,2}'::int[]), ('{3}'::int[])) v(ar);
-- array(select array-value ...) select array(select array[i,i/2] from generate_series(1,5) i); select array(select array['Hello', i::text] from generate_series(9,11) i);
-- int2vector and oidvector should be treated as scalar types for this purpose select pg_typeof(array(select'11 22 33'::int2vector from generate_series(1,5))); select array(select'11 22 33'::int2vector from generate_series(1,5)); select unnest(array(select'11 22 33'::int2vector from generate_series(1,5))); select pg_typeof(array(select'11 22 33'::oidvector from generate_series(1,5))); select array(select'11 22 33'::oidvector from generate_series(1,5)); select unnest(array(select'11 22 33'::oidvector from generate_series(1,5)));
-- no ordering operator tests SELECT array_sort('{1}'::xid[]); -- no error because no sort is required SELECT array_sort('{1,2,3}'::xid[]); SELECT array_sort('{{1,2,3},{2,3,4}}'::xid[]);
-- bounds preservation tests SELECT array_sort(a) FROM (VALUES ('[10:12][20:21]={{1,2},{10,20},{3,4}}'::int[])) v(a); SELECT array_sort(a) FROM (VALUES ('[-1:0]={7,1}'::int[])) v(a); SELECT array_sort(a) FROM (VALUES ('[-2:0][20:21]={{1,2},{10,20},{1,-4}}'::int[])) v(a); SELECT array_sort(a [-1:0]) FROM (VALUES ('[-2:0][20:21]={{1,2},{10,20},{1,-4}}'::int[])) v(a); SELECT array_sort(a [-1:0][20:20]) FROM (VALUES ('[-2:0][20:21]={{1,2},{10,20},{1,-4}}'::int[])) v(a);
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.36 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.