DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 1'; u := add(u, 'aaa', 'Hello World'::text); RAISE NOTICE 'value: %', value(u); END $$; NOTICE: Test 1 NOTICE: value: Hello World DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 2'; u := add(u, 'aaa', '1999-12-31'::date); RAISE NOTICE 'value: %', value(u); END $$; NOTICE: Test 2 ERROR: Value type does not match the return type CONTEXT: PL/pgSQL function inline_code_block line 7 at RAISE DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 3'; u := add(u, 'aaa', 'Hello World'::text); RAISE NOTICE 'value: %', value(u, null::varchar); END $$; NOTICE: Test 3 NOTICE: value: Hello World DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 4'; u := add(u, 'aaa', '1999-12-31'::date); RAISE NOTICE 'value: %', value(u, null::date); END $$; NOTICE: Test 4 NOTICE: value: 12-31-1999 DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 5'; u := add(u, 'aaa', 'Hello World'::text); u := add(u, 'bbb', 'Hello All'::text); RAISE NOTICE 'count: %', count(u); END $$; NOTICE: Test 5 NOTICE: count: 2 DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 6'; u := add(u, 'aaa', 'Hello World'::text); u := add(u, 'bbb', 'Hello All'::text); RAISE NOTICE 'find: %', find(u, 'aaa', null::text); END $$; NOTICE: Test 6 NOTICE: find: Hello World DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 7'; u := add(u, 'aaa', '1999-12-31'::date); u := add(u, 'bbb', '2000-01-01'::date); RAISE NOTICE 'find: %', find(u, 'aaa', null::text); END $$; NOTICE: Test 7 ERROR: Value type does not match the return type CONTEXT: PL/pgSQL function inline_code_block line 8 at RAISE DO $$ DECLARE u collection; t text; BEGIN RAISE NOTICE 'Test 8'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); RAISE NOTICE 'count: %', count(u); u := add(u, 'ccc', 'Hello Everyone'); u := add(u, 'ddd', 'First Hello'); RAISE NOTICE 'count: %', count(u); t := key(u); RAISE NOTICE 'current key: %', t; END $$; NOTICE: Test 8 NOTICE: count: 2 NOTICE: count: 4 NOTICE: current key: aaa DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 9'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); RAISE NOTICE 'count: %', count(u); u := delete(u, 'aaa'); RAISE NOTICE 'count: %', count(u); END $$; NOTICE: Test 9 NOTICE: count: 2 NOTICE: count: 1 DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 10'; u := add(u, 'aaa', 'Hello World'::text); u := add(u, null, 'Hello All'::text); RAISE NOTICE 'count: %', count(u); END $$; NOTICE: Test 10 ERROR: Key and value must not be null CONTEXT: PL/pgSQL function inline_code_block line 7 at assignment DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 11'; u := add(u, 'aaa', 'Hello World'::text); u := add(u, 'bbb', null); RAISE NOTICE 'count: %', count(u); END $$; NOTICE: Test 11 ERROR: Key and value must not be null CONTEXT: PL/pgSQL function inline_code_block line 7 at assignment DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 12'; u := add(u, repeat('a', 4096), 'Hello World'::text); RAISE NOTICE 'count: %', count(u); END $$; NOTICE: Test 12 NOTICE: count: 1 DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 13'; u := add(u, 'aaa', 'Hello World'::text); u := add(u, 'bbb', 'Hello All'::text); RAISE NOTICE 'find: %', find(u, null); END $$; NOTICE: Test 13 NOTICE: find: DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 14'; u := add(u, 'aaa', 'Hello World'::text); u := add(u, 'bbb', 'Hello All'::text); RAISE NOTICE 'find: %', find(u, repeat('a', 256)); END $$; NOTICE: Test 14 NOTICE: find: DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 15'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); u := delete(u, null); RAISE NOTICE 'count: %', count(u); END $$; NOTICE: Test 15 ERROR: Key must not be null CONTEXT: PL/pgSQL function inline_code_block line 9 at assignment DO $$ DECLARE u collection; BEGIN RAISE NOTICE 'Test 15'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); u := delete(u, repeat('a', 256)); RAISE NOTICE 'count: %', count(u); END $$; NOTICE: Test 15 NOTICE: count: 2 DO $$ DECLARE u collection('text'); v collection('text'); BEGIN RAISE NOTICE 'Test 16'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); v := u; v := add(v, 'ccc', 'Hi'); RAISE NOTICE 'count: u(%), v(%)', count(u), count(v); END $$; NOTICE: Test 16 NOTICE: count: u(2), v(3) DO $$ DECLARE u collection('text'); v collection('text'); BEGIN RAISE NOTICE 'Test 17'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); v := copy(u); v := add(v, 'ccc', 'Hi'); RAISE NOTICE 'count: u(%), v(%)', count(u), count(v); END $$; NOTICE: Test 17 NOTICE: count: u(2), v(3) DO $$ DECLARE u collection('text'); BEGIN RAISE NOTICE 'Test 18'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); RAISE NOTICE 'json: %', to_json(u); END $$; NOTICE: Test 18 NOTICE: json: "{\"value_type\": \"pg_catalog.text\", \"entries\": {\"aaa\": \"Hello World\", \"bbb\": \"Hello All\"}}" DO $$ DECLARE u collection('int'); BEGIN RAISE NOTICE 'Test 19'; u := add(u, 'aaa', 42); u := add(u, 'bbb', 84); RAISE NOTICE 'json: %', to_json(u); END $$; NOTICE: Test 19 NOTICE: json: "{\"value_type\": \"integer\", \"entries\": {\"aaa\": \"42\", \"bbb\": \"84\"}}" CREATE TABLE collection_regress(col1 varchar, col2 varchar, col3 int); INSERT INTO collection_regress VALUES ('aaa', 'Hello World', 42), ('bbb', 'Hello All', 84); DO $$ DECLARE r collection_regress%ROWTYPE; c collection('collection_regress'); cr record; BEGIN RAISE NOTICE 'Test 20'; FOR r IN SELECT col1, col2, col3 FROM collection_regress ORDER BY col1 LOOP c[r.col1] = r; END LOOP; RAISE NOTICE 'output: %', c; END $$; NOTICE: Test 20 NOTICE: output: {"value_type": "public.collection_regress", "entries": {"aaa": "(aaa,\"Hello World\",42)", "bbb": "(bbb,\"Hello All\",84)"}} DO $$ DECLARE r collection_regress%ROWTYPE; c collection('collection_regress'); cr record; BEGIN RAISE NOTICE 'Test 21'; FOR r IN SELECT col1, col2, col3 FROM collection_regress ORDER BY col1 LOOP c[r.col1] = r; END LOOP; RAISE NOTICE 'json: %', c::json; END $$; NOTICE: Test 21 NOTICE: json: {"value_type": "public.collection_regress", "entries": {"aaa": "(aaa,\"Hello World\",42)", "bbb": "(bbb,\"Hello All\",84)"}} DROP TABLE collection_regress; SELECT add(null::collection, 'aaa', 'Hello World'); add ---------------------------------------------------------------------- {"value_type": "pg_catalog.text", "entries": {"aaa": "Hello World"}} (1 row) SELECT add(add(null::collection, 'aaa', 'Hello World'), 'bbb', 'Hello All'); add ------------------------------------------------------------------------------------------ {"value_type": "pg_catalog.text", "entries": {"aaa": "Hello World", "bbb": "Hello All"}} (1 row) SELECT '{"value_type": "text", "entries": {"aaa": "Hello World", "bbb": "Hello All"}}'::collection; collection ------------------------------------------------------------------------------------------ {"value_type": "pg_catalog.text", "entries": {"aaa": "Hello World", "bbb": "Hello All"}} (1 row) SELECT add(add(null::collection, 'aaa', '1999-12-31'::date),'bbb', '2000-01-01'::date); add ------------------------------------------------------------------------------------------ {"value_type": "pg_catalog.date", "entries": {"aaa": "12-31-1999", "bbb": "01-01-2000"}} (1 row) SELECT '{"value_type": "text", "entries": {"aaa": "Hello World"}'::collection; ERROR: Invalid format LINE 1: SELECT '{"value_type": "text", "entries": {"aaa": "Hello Wor... ^ SELECT '{"value_type": "text", "entry": {"aaa": "Hello World"}}'::collection; ERROR: unrecognized top-level field LINE 1: SELECT '{"value_type": "text", "entry": {"aaa": "Hello World... ^ SELECT '{"entries": {"aaa": "Hello World"}}'::collection; collection ---------------------------------------------------------------------- {"value_type": "pg_catalog.text", "entries": {"aaa": "Hello World"}} (1 row) SELECT '{"entries": {"aaa": "Hello World"}, "value_type": "text"}'::collection; ERROR: unexpected object field LINE 1: SELECT '{"entries": {"aaa": "Hello World"}, "value_type": "t... ^ SELECT '{"value_type": "text", "entries": {"aaa": "Hello World", "bbb": 1}}'::collection; collection ---------------------------------------------------------------------------------- {"value_type": "pg_catalog.text", "entries": {"aaa": "Hello World", "bbb": "1"}} (1 row) SELECT collection_stats_reset(); collection_stats_reset ------------------------ (1 row) DO $$ DECLARE u collection('text'); v collection('text'); BEGIN RAISE NOTICE 'Test 22'; u := add(u, 'aaa', 'Hello World'); u := add(u, 'bbb', 'Hello All'); v := u; v := add(v, 'ccc', 'Hi'); RAISE NOTICE 'count: u(%), v(%)', count(u), count(v); END $$; NOTICE: Test 22 NOTICE: count: u(2), v(3) SELECT * FROM collection_stats; add | context_switch | delete | find | sort -----+----------------+--------+------+------ 3 | 1 | 0 | 0 | 0 (1 row) CREATE TABLE collections_test (c1 int, c2 collection); INSERT INTO collections_test VALUES (1, add(null::collection, 'aaa', 'Hello World')); INSERT INTO collections_test VALUES (2, add(null::collection, 'bbb', 'Hello ALL')); SELECT * FROM collections_test ORDER BY c1; c1 | c2 ----+---------------------------------------------------------------------- 1 | {"value_type": "pg_catalog.text", "entries": {"aaa": "Hello World"}} 2 | {"value_type": "pg_catalog.text", "entries": {"bbb": "Hello ALL"}} (2 rows) DROP TABLE collections_test; DO $$ DECLARE t collection; BEGIN RAISE NOTICE 'Test 23'; t := add(t, '1', 111::bigint); t := add(t, '2', 222::bigint); RAISE NOTICE 'The current val is %', value(t, null::bigint); RAISE NOTICE 'The current value type is %', pg_typeof(value(t, null::bigint)); END $$; NOTICE: Test 23 NOTICE: The current val is 111 NOTICE: The current value type is bigint DO $$ DECLARE t collection; BEGIN RAISE NOTICE 'Test 24'; t := add(t, '1', 111::bigint); t := add(t, '2', 'hello'::text); END $$; NOTICE: Test 24 ERROR: incompatible value data type DETAIL: expecting bigint, but received text CONTEXT: PL/pgSQL function inline_code_block line 7 at assignment DO $$ DECLARE t collection; BEGIN RAISE NOTICE 'Test 25'; t := add(t, '1', 111::bigint); RAISE NOTICE 'The type is %', value_type(t); END $$; NOTICE: Test 25 NOTICE: The type is bigint