CREATE EXTENSION hstore; -- Check whether any of our opclasses fail amvalidate SELECT amname, opcname FROM pg_opclass opc LEFT JOIN pg_am am ON am.oid = opcmethod WHERE opc.oid >= 16384 AND NOT amvalidate(opc.oid); amname | opcname --------+--------- (0 rows) set escape_string_warning=off; --hstore; select ''::hstore; hstore -------- (1 row) select 'a=>b'::hstore; hstore ---------- "a"=>"b" (1 row) select ' a=>b'::hstore; hstore ---------- "a"=>"b" (1 row) select 'a =>b'::hstore; hstore ---------- "a"=>"b" (1 row) select 'a=>b '::hstore; hstore ---------- "a"=>"b" (1 row) select 'a=> b'::hstore; hstore ---------- "a"=>"b" (1 row) select '"a"=>"b"'::hstore; hstore ---------- "a"=>"b" (1 row) select ' "a"=>"b"'::hstore; hstore ---------- "a"=>"b" (1 row) select '"a" =>"b"'::hstore; hstore ---------- "a"=>"b" (1 row) select '"a"=>"b" '::hstore; hstore ---------- "a"=>"b" (1 row) select '"a"=> "b"'::hstore; hstore ---------- "a"=>"b" (1 row) select 'aa=>bb'::hstore; hstore ------------ "aa"=>"bb" (1 row) select ' aa=>bb'::hstore; hstore ------------ "aa"=>"bb" (1 row) select 'aa =>bb'::hstore; hstore ------------ "aa"=>"bb" (1 row) select 'aa=>bb '::hstore; hstore ------------ "aa"=>"bb" (1 row) select 'aa=> bb'::hstore; hstore ------------ "aa"=>"bb" (1 row) select '"aa"=>"bb"'::hstore; hstore ------------ "aa"=>"bb" (1 row) select ' "aa"=>"bb"'::hstore; hstore ------------ "aa"=>"bb" (1 row) select '"aa" =>"bb"'::hstore; hstore ------------ "aa"=>"bb" (1 row) select '"aa"=>"bb" '::hstore; hstore ------------ "aa"=>"bb" (1 row) select '"aa"=> "bb"'::hstore; hstore ------------ "aa"=>"bb" (1 row) select 'aa=>bb, cc=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>bb , cc=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>bb ,cc=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>bb, "cc"=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>bb , "cc"=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>bb ,"cc"=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>"bb", cc=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>"bb" , cc=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>"bb" ,cc=>dd'::hstore; hstore ------------------------ "aa"=>"bb", "cc"=>"dd" (1 row) select 'aa=>null'::hstore; hstore ------------ "aa"=>NULL (1 row) select 'aa=>NuLl'::hstore; hstore ------------ "aa"=>NULL (1 row) select 'aa=>"NuLl"'::hstore; hstore -------------- "aa"=>"NuLl" (1 row) select e'\\=a=>q=w'::hstore; hstore ------------- "=a"=>"q=w" (1 row) select e'"=a"=>q\\=w'::hstore; hstore ------------- "=a"=>"q=w" (1 row) select e'"\\"a"=>q>w'::hstore; hstore -------------- "\"a"=>"q>w" (1 row) select e'\\"a=>q"w'::hstore; hstore --------------- "\"a"=>"q\"w" (1 row) select ''::hstore; hstore -------- (1 row) select ' '::hstore; hstore -------- (1 row) -- -> operator select 'aa=>b, c=>d , b=>16'::hstore->'c'; ?column? ---------- d (1 row) select 'aa=>b, c=>d , b=>16'::hstore->'b'; ?column? ---------- 16 (1 row) select 'aa=>b, c=>d , b=>16'::hstore->'aa'; ?column? ---------- b (1 row) select ('aa=>b, c=>d , b=>16'::hstore->'gg') is null; ?column? ---------- t (1 row) select ('aa=>NULL, c=>d , b=>16'::hstore->'aa') is null; ?column? ---------- t (1 row) select ('aa=>"NULL", c=>d , b=>16'::hstore->'aa') is null; ?column? ---------- f (1 row) -- -> array operator select 'aa=>"NULL", c=>d , b=>16'::hstore -> ARRAY['aa','c']; ?column? ------------ {"NULL",d} (1 row) select 'aa=>"NULL", c=>d , b=>16'::hstore -> ARRAY['c','aa']; ?column? ------------ {d,"NULL"} (1 row) select 'aa=>NULL, c=>d , b=>16'::hstore -> ARRAY['aa','c',null]; ?column? --------------- {NULL,d,NULL} (1 row) select 'aa=>1, c=>3, b=>2, d=>4'::hstore -> ARRAY[['b','d'],['aa','c']]; ?column? --------------- {{2,4},{1,3}} (1 row) -- exists/defined select exist('a=>NULL, b=>qq', 'a'); exist ------- t (1 row) select exist('a=>NULL, b=>qq', 'b'); exist ------- t (1 row) select exist('a=>NULL, b=>qq', 'c'); exist ------- f (1 row) select exist('a=>"NULL", b=>qq', 'a'); exist ------- t (1 row) select defined('a=>NULL, b=>qq', 'a'); defined --------- f (1 row) select defined('a=>NULL, b=>qq', 'b'); defined --------- t (1 row) select defined('a=>NULL, b=>qq', 'c'); defined --------- f (1 row) select defined('a=>"NULL", b=>qq', 'a'); defined --------- t (1 row) select hstore 'a=>NULL, b=>qq' ? 'a'; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ? 'b'; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ? 'c'; ?column? ---------- f (1 row) select hstore 'a=>"NULL", b=>qq' ? 'a'; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ?| ARRAY['a','b']; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ?| ARRAY['b','a']; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ?| ARRAY['c','a']; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ?| ARRAY['c','d']; ?column? ---------- f (1 row) select hstore 'a=>NULL, b=>qq' ?| '{}'::text[]; ?column? ---------- f (1 row) select hstore 'a=>NULL, b=>qq' ?& ARRAY['a','b']; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ?& ARRAY['b','a']; ?column? ---------- t (1 row) select hstore 'a=>NULL, b=>qq' ?& ARRAY['c','a']; ?column? ---------- f (1 row) select hstore 'a=>NULL, b=>qq' ?& ARRAY['c','d']; ?column? ---------- f (1 row) select hstore 'a=>NULL, b=>qq' ?& '{}'::text[]; ?column? ---------- t (1 row) -- delete select delete('a=>1 , b=>2, c=>3'::hstore, 'a'); delete -------------------- "b"=>"2", "c"=>"3" (1 row) select delete('a=>null , b=>2, c=>3'::hstore, 'a'); delete -------------------- "b"=>"2", "c"=>"3" (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, 'b'); delete -------------------- "a"=>"1", "c"=>"3" (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, 'c'); delete -------------------- "a"=>"1", "b"=>"2" (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, 'd'); delete ------------------------------ "a"=>"1", "b"=>"2", "c"=>"3" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - 'a'::text; ?column? -------------------- "b"=>"2", "c"=>"3" (1 row) select 'a=>null , b=>2, c=>3'::hstore - 'a'::text; ?column? -------------------- "b"=>"2", "c"=>"3" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - 'b'::text; ?column? -------------------- "a"=>"1", "c"=>"3" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - 'c'::text; ?column? -------------------- "a"=>"1", "b"=>"2" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - 'd'::text; ?column? ------------------------------ "a"=>"1", "b"=>"2", "c"=>"3" (1 row) select pg_column_size('a=>1 , b=>2, c=>3'::hstore - 'b'::text) = pg_column_size('a=>1, b=>2'::hstore); ?column? ---------- t (1 row) -- delete (array) select delete('a=>1 , b=>2, c=>3'::hstore, ARRAY['d','e']); delete ------------------------------ "a"=>"1", "b"=>"2", "c"=>"3" (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, ARRAY['d','b']); delete -------------------- "a"=>"1", "c"=>"3" (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, ARRAY['a','c']); delete ---------- "b"=>"2" (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, ARRAY[['b'],['c'],['a']]); delete -------- (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, '{}'::text[]); delete ------------------------------ "a"=>"1", "b"=>"2", "c"=>"3" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - ARRAY['d','e']; ?column? ------------------------------ "a"=>"1", "b"=>"2", "c"=>"3" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - ARRAY['d','b']; ?column? -------------------- "a"=>"1", "c"=>"3" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - ARRAY['a','c']; ?column? ---------- "b"=>"2" (1 row) select 'a=>1 , b=>2, c=>3'::hstore - ARRAY[['b'],['c'],['a']]; ?column? ---------- (1 row) select 'a=>1 , b=>2, c=>3'::hstore - '{}'::text[]; ?column? ------------------------------ "a"=>"1", "b"=>"2", "c"=>"3" (1 row) select pg_column_size('a=>1 , b=>2, c=>3'::hstore - ARRAY['a','c']) = pg_column_size('b=>2'::hstore); ?column? ---------- t (1 row) select pg_column_size('a=>1 , b=>2, c=>3'::hstore - '{}'::text[]) = pg_column_size('a=>1, b=>2, c=>3'::hstore); ?column? ---------- t (1 row) -- delete (hstore) select delete('aa=>1 , b=>2, c=>3'::hstore, 'aa=>4, b=>2'::hstore); delete --------------------- "c"=>"3", "aa"=>"1" (1 row) select delete('aa=>1 , b=>2, c=>3'::hstore, 'aa=>NULL, c=>3'::hstore); delete --------------------- "b"=>"2", "aa"=>"1" (1 row) select delete('aa=>1 , b=>2, c=>3'::hstore, 'aa=>1, b=>2, c=>3'::hstore); delete -------- (1 row) select delete('aa=>1 , b=>2, c=>3'::hstore, 'b=>2'::hstore); delete --------------------- "c"=>"3", "aa"=>"1" (1 row) select delete('aa=>1 , b=>2, c=>3'::hstore, ''::hstore); delete ------------------------------- "b"=>"2", "c"=>"3", "aa"=>"1" (1 row) select 'aa=>1 , b=>2, c=>3'::hstore - 'aa=>4, b=>2'::hstore; ?column? --------------------- "c"=>"3", "aa"=>"1" (1 row) select 'aa=>1 , b=>2, c=>3'::hstore - 'aa=>NULL, c=>3'::hstore; ?column? --------------------- "b"=>"2", "aa"=>"1" (1 row) select 'aa=>1 , b=>2, c=>3'::hstore - 'aa=>1, b=>2, c=>3'::hstore; ?column? ---------- (1 row) select 'aa=>1 , b=>2, c=>3'::hstore - 'b=>2'::hstore; ?column? --------------------- "c"=>"3", "aa"=>"1" (1 row) select 'aa=>1 , b=>2, c=>3'::hstore - ''::hstore; ?column? ------------------------------- "b"=>"2", "c"=>"3", "aa"=>"1" (1 row) select pg_column_size('a=>1 , b=>2, c=>3'::hstore - 'b=>2'::hstore) = pg_column_size('a=>1, c=>3'::hstore); ?column? ---------- t (1 row) select pg_column_size('a=>1 , b=>2, c=>3'::hstore - ''::hstore) = pg_column_size('a=>1, b=>2, c=>3'::hstore); ?column? ---------- t (1 row) -- || select 'aa=>1 , b=>2, cq=>3'::hstore || 'cq=>l, b=>g, fg=>f'; ?column? ------------------------------------------- "b"=>"g", "aa"=>"1", "cq"=>"l", "fg"=>"f" (1 row) select 'aa=>1 , b=>2, cq=>3'::hstore || 'aq=>l'; ?column? ------------------------------------------- "b"=>"2", "aa"=>"1", "aq"=>"l", "cq"=>"3" (1 row) select 'aa=>1 , b=>2, cq=>3'::hstore || 'aa=>l'; ?column? -------------------------------- "b"=>"2", "aa"=>"l", "cq"=>"3" (1 row) select 'aa=>1 , b=>2, cq=>3'::hstore || ''; ?column? -------------------------------- "b"=>"2", "aa"=>"1", "cq"=>"3" (1 row) select ''::hstore || 'cq=>l, b=>g, fg=>f'; ?column? -------------------------------- "b"=>"g", "cq"=>"l", "fg"=>"f" (1 row) select pg_column_size(''::hstore || ''::hstore) = pg_column_size(''::hstore); ?column? ---------- t (1 row) select pg_column_size('aa=>1'::hstore || 'b=>2'::hstore) = pg_column_size('aa=>1, b=>2'::hstore); ?column? ---------- t (1 row) select pg_column_size('aa=>1, b=>2'::hstore || ''::hstore) = pg_column_size('aa=>1, b=>2'::hstore); ?column? ---------- t (1 row) select pg_column_size(''::hstore || 'aa=>1, b=>2'::hstore) = pg_column_size('aa=>1, b=>2'::hstore); ?column? ---------- t (1 row) -- hstore(text,text) select 'a=>g, b=>c'::hstore || hstore('asd', 'gf'); ?column? --------------------------------- "a"=>"g", "b"=>"c", "asd"=>"gf" (1 row) select 'a=>g, b=>c'::hstore || hstore('b', 'gf'); ?column? --------------------- "a"=>"g", "b"=>"gf" (1 row) select 'a=>g, b=>c'::hstore || hstore('b', 'NULL'); ?column? ----------------------- "a"=>"g", "b"=>"NULL" (1 row) select 'a=>g, b=>c'::hstore || hstore('b', NULL); ?column? --------------------- "a"=>"g", "b"=>NULL (1 row) select ('a=>g, b=>c'::hstore || hstore(NULL, 'b')) is null; ?column? ---------- t (1 row) select pg_column_size(hstore('b', 'gf')) = pg_column_size('b=>gf'::hstore); ?column? ---------- t (1 row) select pg_column_size('a=>g, b=>c'::hstore || hstore('b', 'gf')) = pg_column_size('a=>g, b=>gf'::hstore); ?column? ---------- t (1 row) -- slice() select slice(hstore 'aa=>1, b=>2, c=>3', ARRAY['g','h','i']); slice ------- (1 row) select slice(hstore 'aa=>1, b=>2, c=>3', ARRAY['c','b']); slice -------------------- "b"=>"2", "c"=>"3" (1 row) select slice(hstore 'aa=>1, b=>2, c=>3', ARRAY['aa','b']); slice --------------------- "b"=>"2", "aa"=>"1" (1 row) select slice(hstore 'aa=>1, b=>2, c=>3', ARRAY['c','b','aa']); slice ------------------------------- "b"=>"2", "c"=>"3", "aa"=>"1" (1 row) select pg_column_size(slice(hstore 'aa=>1, b=>2, c=>3', ARRAY['c','b'])) = pg_column_size('b=>2, c=>3'::hstore); ?column? ---------- t (1 row) select pg_column_size(slice(hstore 'aa=>1, b=>2, c=>3', ARRAY['c','b','aa'])) = pg_column_size('aa=>1, b=>2, c=>3'::hstore); ?column? ---------- t (1 row) -- array input select '{}'::text[]::hstore; hstore -------- (1 row) select ARRAY['a','g','b','h','asd']::hstore; ERROR: array must have even number of elements select ARRAY['a','g','b','h','asd','i']::hstore; array -------------------------------- "a"=>"g", "b"=>"h", "asd"=>"i" (1 row) select ARRAY[['a','g'],['b','h'],['asd','i']]::hstore; array -------------------------------- "a"=>"g", "b"=>"h", "asd"=>"i" (1 row) select ARRAY[['a','g','b'],['h','asd','i']]::hstore; ERROR: array must have two columns select ARRAY[[['a','g'],['b','h'],['asd','i']]]::hstore; ERROR: wrong number of array subscripts select hstore('{}'::text[]); hstore -------- (1 row) select hstore(ARRAY['a','g','b','h','asd']); ERROR: array must have even number of elements select hstore(ARRAY['a','g','b','h','asd','i']); hstore -------------------------------- "a"=>"g", "b"=>"h", "asd"=>"i" (1 row) select hstore(ARRAY[['a','g'],['b','h'],['asd','i']]); hstore -------------------------------- "a"=>"g", "b"=>"h", "asd"=>"i" (1 row) select hstore(ARRAY[['a','g','b'],['h','asd','i']]); ERROR: array must have two columns select hstore(ARRAY[[['a','g'],['b','h'],['asd','i']]]); ERROR: wrong number of array subscripts select hstore('[0:5]={a,g,b,h,asd,i}'::text[]); hstore -------------------------------- "a"=>"g", "b"=>"h", "asd"=>"i" (1 row) select hstore('[0:2][1:2]={{a,g},{b,h},{asd,i}}'::text[]); hstore -------------------------------- "a"=>"g", "b"=>"h", "asd"=>"i" (1 row) -- pairs of arrays select hstore(ARRAY['a','b','asd'], ARRAY['g','h','i']); hstore -------------------------------- "a"=>"g", "b"=>"h", "asd"=>"i" (1 row) select hstore(ARRAY['a','b','asd'], ARRAY['g','h',NULL]); hstore --------------------------------- "a"=>"g", "b"=>"h", "asd"=>NULL (1 row) select hstore(ARRAY['z','y','x'], ARRAY['1','2','3']); hstore ------------------------------ "x"=>"3", "y"=>"2", "z"=>"1" (1 row) select hstore(ARRAY['aaa','bb','c','d'], ARRAY[null::text,null,null,null]); hstore ----------------------------------------------- "c"=>NULL, "d"=>NULL, "bb"=>NULL, "aaa"=>NULL (1 row) select hstore(ARRAY['aaa','bb','c','d'], null); hstore ----------------------------------------------- "c"=>NULL, "d"=>NULL, "bb"=>NULL, "aaa"=>NULL (1 row) select quote_literal(hstore('{}'::text[], '{}'::text[])); quote_literal --------------- '' (1 row) select quote_literal(hstore('{}'::text[], null)); quote_literal --------------- '' (1 row) select hstore(ARRAY['a'], '{}'::text[]); -- error ERROR: arrays must have same bounds select hstore('{}'::text[], ARRAY['a']); -- error ERROR: arrays must have same bounds select pg_column_size(hstore(ARRAY['a','b','asd'], ARRAY['g','h','i'])) = pg_column_size('a=>g, b=>h, asd=>i'::hstore); ?column? ---------- t (1 row) -- records select hstore(v) from (values (1, 'foo', 1.2, 3::float8)) v(a,b,c,d); hstore -------------------------------------------- "a"=>"1", "b"=>"foo", "c"=>"1.2", "d"=>"3" (1 row) create domain hstestdom1 as integer not null default 0; create table testhstore0 (a integer, b text, c numeric, d float8); create table testhstore1 (a integer, b text, c numeric, d float8, e hstestdom1); insert into testhstore0 values (1, 'foo', 1.2, 3::float8); insert into testhstore1 values (1, 'foo', 1.2, 3::float8); select hstore(v) from testhstore1 v; hstore ------------------------------------------------------ "a"=>"1", "b"=>"foo", "c"=>"1.2", "d"=>"3", "e"=>"0" (1 row) select hstore(null::testhstore0); hstore -------------------------------------------- "a"=>NULL, "b"=>NULL, "c"=>NULL, "d"=>NULL (1 row) select hstore(null::testhstore1); hstore ------------------------------------------------------- "a"=>NULL, "b"=>NULL, "c"=>NULL, "d"=>NULL, "e"=>NULL (1 row) select pg_column_size(hstore(v)) = pg_column_size('a=>1, b=>"foo", c=>"1.2", d=>"3", e=>"0"'::hstore) from testhstore1 v; ?column? ---------- t (1 row) select populate_record(v, hstore('c', '3.45')) from testhstore1 v; populate_record ------------------ (1,foo,3.45,3,0) (1 row) select populate_record(v, hstore('d', '3.45')) from testhstore1 v; populate_record -------------------- (1,foo,1.2,3.45,0) (1 row) select populate_record(v, hstore('e', '123')) from testhstore1 v; populate_record ------------------- (1,foo,1.2,3,123) (1 row) select populate_record(v, hstore('e', null)) from testhstore1 v; ERROR: domain hstestdom1 does not allow null values select populate_record(v, hstore('c', null)) from testhstore1 v; populate_record ----------------- (1,foo,,3,0) (1 row) select populate_record(v, hstore('b', 'foo') || hstore('a', '123')) from testhstore1 v; populate_record ------------------- (123,foo,1.2,3,0) (1 row) select populate_record(v, hstore('b', 'foo') || hstore('e', null)) from testhstore0 v; populate_record ----------------- (1,foo,1.2,3) (1 row) select populate_record(v, hstore('b', 'foo') || hstore('e', null)) from testhstore1 v; ERROR: domain hstestdom1 does not allow null values select populate_record(v, '') from testhstore0 v; populate_record ----------------- (1,foo,1.2,3) (1 row) select populate_record(v, '') from testhstore1 v; populate_record ----------------- (1,foo,1.2,3,0) (1 row) select populate_record(null::testhstore1, hstore('c', '3.45') || hstore('a', '123')); ERROR: domain hstestdom1 does not allow null values select populate_record(null::testhstore1, hstore('c', '3.45') || hstore('e', '123')); populate_record ----------------- (,,3.45,,123) (1 row) select populate_record(null::testhstore0, ''); populate_record ----------------- (,,,) (1 row) select populate_record(null::testhstore1, ''); ERROR: domain hstestdom1 does not allow null values select v #= hstore('c', '3.45') from testhstore1 v; ?column? ------------------ (1,foo,3.45,3,0) (1 row) select v #= hstore('d', '3.45') from testhstore1 v; ?column? -------------------- (1,foo,1.2,3.45,0) (1 row) select v #= hstore('e', '123') from testhstore1 v; ?column? ------------------- (1,foo,1.2,3,123) (1 row) select v #= hstore('c', null) from testhstore1 v; ?column? -------------- (1,foo,,3,0) (1 row) select v #= hstore('e', null) from testhstore0 v; ?column? --------------- (1,foo,1.2,3) (1 row) select v #= hstore('e', null) from testhstore1 v; ERROR: domain hstestdom1 does not allow null values select v #= (hstore('b', 'foo') || hstore('a', '123')) from testhstore1 v; ?column? ------------------- (123,foo,1.2,3,0) (1 row) select v #= (hstore('b', 'foo') || hstore('e', '123')) from testhstore1 v; ?column? ------------------- (1,foo,1.2,3,123) (1 row) select v #= hstore '' from testhstore0 v; ?column? --------------- (1,foo,1.2,3) (1 row) select v #= hstore '' from testhstore1 v; ?column? ----------------- (1,foo,1.2,3,0) (1 row) select null::testhstore1 #= (hstore('c', '3.45') || hstore('a', '123')); ERROR: domain hstestdom1 does not allow null values select null::testhstore1 #= (hstore('c', '3.45') || hstore('e', '123')); ?column? --------------- (,,3.45,,123) (1 row) select null::testhstore0 #= hstore ''; ?column? ---------- (,,,) (1 row) select null::testhstore1 #= hstore ''; ERROR: domain hstestdom1 does not allow null values select v #= h from testhstore1 v, (values (hstore 'a=>123',1),('b=>foo,c=>3.21',2),('a=>null',3),('e=>123',4),('f=>blah',5)) x(h,i) order by i; ?column? ------------------- (123,foo,1.2,3,0) (1,foo,3.21,3,0) (,foo,1.2,3,0) (1,foo,1.2,3,123) (1,foo,1.2,3,0) (5 rows) -- keys/values select akeys('aa=>1 , b=>2, cq=>3'::hstore || 'cq=>l, b=>g, fg=>f'); akeys -------------- {b,aa,cq,fg} (1 row) select akeys('""=>1'); akeys ------- {""} (1 row) select akeys(''); akeys ------- {} (1 row) select avals('aa=>1 , b=>2, cq=>3'::hstore || 'cq=>l, b=>g, fg=>f'); avals ----------- {g,1,l,f} (1 row) select avals('aa=>1 , b=>2, cq=>3'::hstore || 'cq=>l, b=>g, fg=>NULL'); avals -------------- {g,1,l,NULL} (1 row) select avals('""=>1'); avals ------- {1} (1 row) select avals(''); avals ------- {} (1 row) select hstore_to_array('aa=>1, cq=>l, b=>g, fg=>NULL'::hstore); hstore_to_array ------------------------- {b,g,aa,1,cq,l,fg,NULL} (1 row) select %% 'aa=>1, cq=>l, b=>g, fg=>NULL'; ?column? ------------------------- {b,g,aa,1,cq,l,fg,NULL} (1 row) select hstore_to_matrix('aa=>1, cq=>l, b=>g, fg=>NULL'::hstore); hstore_to_matrix --------------------------------- {{b,g},{aa,1},{cq,l},{fg,NULL}} (1 row) select %# 'aa=>1, cq=>l, b=>g, fg=>NULL'; ?column? --------------------------------- {{b,g},{aa,1},{cq,l},{fg,NULL}} (1 row) select * from skeys('aa=>1 , b=>2, cq=>3'::hstore || 'cq=>l, b=>g, fg=>f'); skeys ------- b aa cq fg (4 rows) select * from skeys('""=>1'); skeys ------- (1 row) select * from skeys(''); skeys ------- (0 rows) select * from svals('aa=>1 , b=>2, cq=>3'::hstore || 'cq=>l, b=>g, fg=>f'); svals ------- g 1 l f (4 rows) select *, svals is null from svals('aa=>1 , b=>2, cq=>3'::hstore || 'cq=>l, b=>g, fg=>NULL'); svals | ?column? -------+---------- g | f 1 | f l | f | t (4 rows) select * from svals('""=>1'); svals ------- 1 (1 row) select * from svals(''); svals ------- (0 rows) select * from each('aaa=>bq, b=>NULL, ""=>1 '); key | value -----+------- | 1 b | aaa | bq (3 rows) -- @> select 'a=>b, b=>1, c=>NULL'::hstore @> 'a=>b'; ?column? ---------- t (1 row) select 'a=>b, b=>1, c=>NULL'::hstore @> 'a=>b, c=>NULL'; ?column? ---------- t (1 row) select 'a=>b, b=>1, c=>NULL'::hstore @> 'a=>b, g=>NULL'; ?column? ---------- f (1 row) select 'a=>b, b=>1, c=>NULL'::hstore @> 'g=>NULL'; ?column? ---------- f (1 row) select 'a=>b, b=>1, c=>NULL'::hstore @> 'a=>c'; ?column? ---------- f (1 row) select 'a=>b, b=>1, c=>NULL'::hstore @> 'a=>b'; ?column? ---------- t (1 row) select 'a=>b, b=>1, c=>NULL'::hstore @> 'a=>b, c=>q'; ?column? ---------- f (1 row) CREATE TABLE testhstore (h hstore); \copy testhstore from 'data/hstore.data' select count(*) from testhstore where h @> 'wait=>NULL'; count ------- 1 (1 row) select count(*) from testhstore where h @> 'wait=>CC'; count ------- 15 (1 row) select count(*) from testhstore where h @> 'wait=>CC, public=>t'; count ------- 2 (1 row) select count(*) from testhstore where h ? 'public'; count ------- 194 (1 row) select count(*) from testhstore where h ?| ARRAY['public','disabled']; count ------- 337 (1 row) select count(*) from testhstore where h ?& ARRAY['public','disabled']; count ------- 42 (1 row) create index hidx on testhstore using gist(h); set enable_seqscan=off; select count(*) from testhstore where h @> 'wait=>NULL'; count ------- 1 (1 row) select count(*) from testhstore where h @> 'wait=>CC'; count ------- 15 (1 row) select count(*) from testhstore where h @> 'wait=>CC, public=>t'; count ------- 2 (1 row) select count(*) from testhstore where h ? 'public'; count ------- 194 (1 row) select count(*) from testhstore where h ?| ARRAY['public','disabled']; count ------- 337 (1 row) select count(*) from testhstore where h ?& ARRAY['public','disabled']; count ------- 42 (1 row) drop index hidx; create index hidx on testhstore using gist(h gist_hstore_ops(siglen=0)); ERROR: value 0 out of bounds for option "siglen" DETAIL: Valid values are between "1" and "2024". create index hidx on testhstore using gist(h gist_hstore_ops(siglen=2025)); ERROR: value 2025 out of bounds for option "siglen" DETAIL: Valid values are between "1" and "2024". create index hidx on testhstore using gist(h gist_hstore_ops(siglen=2024)); set enable_seqscan=off; select count(*) from testhstore where h @> 'wait=>NULL'; count ------- 1 (1 row) select count(*) from testhstore where h @> 'wait=>CC'; count ------- 15 (1 row) select count(*) from testhstore where h @> 'wait=>CC, public=>t'; count ------- 2 (1 row) select count(*) from testhstore where h ? 'public'; count ------- 194 (1 row) select count(*) from testhstore where h ?| ARRAY['public','disabled']; count ------- 337 (1 row) select count(*) from testhstore where h ?& ARRAY['public','disabled']; count ------- 42 (1 row) drop index hidx; create index hidx on testhstore using gin (h); set enable_seqscan=off; select count(*) from testhstore where h @> 'wait=>NULL'; count ------- 1 (1 row) select count(*) from testhstore where h @> 'wait=>CC'; count ------- 15 (1 row) select count(*) from testhstore where h @> 'wait=>CC, public=>t'; count ------- 2 (1 row) select count(*) from testhstore where h ? 'public'; count ------- 194 (1 row) select count(*) from testhstore where h ?| ARRAY['public','disabled']; count ------- 337 (1 row) select count(*) from testhstore where h ?& ARRAY['public','disabled']; count ------- 42 (1 row) select count(*) from (select (each(h)).key from testhstore) as wow ; count ------- 4781 (1 row) select key, count(*) from (select (each(h)).key from testhstore) as wow group by key order by count desc, key; key | count -----------+------- line | 884 query | 207 pos | 203 node | 202 space | 197 status | 195 public | 194 title | 190 wait | 190 org | 189 user | 189 coauthors | 188 disabled | 185 indexed | 184 cleaned | 180 bad | 179 date | 179 world | 176 state | 172 subtitle | 169 auth | 168 abstract | 161 (22 rows) -- sort/hash select count(distinct h) from testhstore; count ------- 885 (1 row) set enable_hashagg = false; select count(*) from (select h from (select * from testhstore union all select * from testhstore) hs group by h) hs2; count ------- 885 (1 row) set enable_hashagg = true; set enable_sort = false; select count(*) from (select h from (select * from testhstore union all select * from testhstore) hs group by h) hs2; count ------- 885 (1 row) select distinct * from (values (hstore '' || ''),('')) v(h); h --- (1 row) set enable_sort = true; -- btree drop index hidx; create index hidx on testhstore using btree (h); set enable_seqscan=off; select count(*) from testhstore where h #># 'p=>1'; count ------- 125 (1 row) select count(*) from testhstore where h = 'pos=>98, line=>371, node=>CBA, indexed=>t'; count ------- 1 (1 row) -- json and jsonb select hstore_to_json('"a key" =>1, b => t, c => null, d=> 12345, e => 012345, f=> 1.234, g=> 2.345e+4'); hstore_to_json ------------------------------------------------------------------------------------------------- {"b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4", "a key": "1"} (1 row) select cast( hstore '"a key" =>1, b => t, c => null, d=> 12345, e => 012345, f=> 1.234, g=> 2.345e+4' as json); json ------------------------------------------------------------------------------------------------- {"b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4", "a key": "1"} (1 row) select hstore_to_json_loose('"a key" =>1, b => t, c => null, d=> 12345, e => 012345, f=> 1.234, g=> 2.345e+4, h=> "2016-01-01"'); hstore_to_json_loose ------------------------------------------------------------------------------------------------------------- {"b": true, "c": null, "d": 12345, "e": "012345", "f": 1.234, "g": 2.345e+4, "h": "2016-01-01", "a key": 1} (1 row) select hstore_to_jsonb('"a key" =>1, b => t, c => null, d=> 12345, e => 012345, f=> 1.234, g=> 2.345e+4'); hstore_to_jsonb ------------------------------------------------------------------------------------------------- {"b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4", "a key": "1"} (1 row) select cast( hstore '"a key" =>1, b => t, c => null, d=> 12345, e => 012345, f=> 1.234, g=> 2.345e+4' as jsonb); jsonb ------------------------------------------------------------------------------------------------- {"b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4", "a key": "1"} (1 row) select hstore_to_jsonb_loose('"a key" =>1, b => t, c => null, d=> 12345, e => 012345, f=> 1.234, g=> 2.345e+4, h=> "2016-01-01"'); hstore_to_jsonb_loose ---------------------------------------------------------------------------------------------------------- {"b": true, "c": null, "d": 12345, "e": "012345", "f": 1.234, "g": 23450, "h": "2016-01-01", "a key": 1} (1 row) create table test_json_agg (f1 text, f2 hstore); insert into test_json_agg values ('rec1','"a key" =>1, b => t, c => null, d=> 12345, e => 012345, f=> 1.234, g=> 2.345e+4'), ('rec2','"a key" =>2, b => f, c => "null", d=> -12345, e => 012345.6, f=> -1.234, g=> 0.345e-4'); select json_agg(q) from test_json_agg q; json_agg ---------------------------------------------------------------------------------------------------------------------------- [{"f1":"rec1","f2":{"b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4", "a key": "1"}}, + {"f1":"rec2","f2":{"b": "f", "c": "null", "d": "-12345", "e": "012345.6", "f": "-1.234", "g": "0.345e-4", "a key": "2"}}] (1 row) select json_agg(q) from (select f1, hstore_to_json_loose(f2) as f2 from test_json_agg) q; json_agg ---------------------------------------------------------------------------------------------------------------------- [{"f1":"rec1","f2":{"b": true, "c": null, "d": 12345, "e": "012345", "f": 1.234, "g": 2.345e+4, "a key": 1}}, + {"f1":"rec2","f2":{"b": false, "c": "null", "d": -12345, "e": "012345.6", "f": -1.234, "g": 0.345e-4, "a key": 2}}] (1 row) -- Test subscripting insert into test_json_agg default values; select f2['d'], f2['x'] is null as x_isnull from test_json_agg; f2 | x_isnull --------+---------- 12345 | t -12345 | t | t (3 rows) select f2['d']['e'] from test_json_agg; -- error ERROR: hstore allows only one subscript select f2['d':'e'] from test_json_agg; -- error ERROR: hstore allows only one subscript update test_json_agg set f2['d'] = f2['e'], f2['x'] = 'xyzzy'; select f2 from test_json_agg; f2 --------------------------------------------------------------------------------------------------------------------- "b"=>"t", "c"=>NULL, "d"=>"012345", "e"=>"012345", "f"=>"1.234", "g"=>"2.345e+4", "x"=>"xyzzy", "a key"=>"1" "b"=>"f", "c"=>"null", "d"=>"012345.6", "e"=>"012345.6", "f"=>"-1.234", "g"=>"0.345e-4", "x"=>"xyzzy", "a key"=>"2" "d"=>NULL, "x"=>"xyzzy" (3 rows) -- Test subscripting in plpgsql do $$ declare h hstore; begin h['a'] := 'b'; raise notice 'h = %, h[a] = %', h, h['a']; end $$; NOTICE: h = "a"=>"b", h[a] = b -- Check the hstore_hash() and hstore_hash_extended() function explicitly. SELECT v as value, hstore_hash(v)::bit(32) as standard, hstore_hash_extended(v, 0)::bit(32) as extended0, hstore_hash_extended(v, 1)::bit(32) as extended1 FROM (VALUES (NULL::hstore), (''), ('"a key" =>1'), ('c => null'), ('e => 012345'), ('g => 2.345e+4')) x(v) WHERE hstore_hash(v)::bit(32) != hstore_hash_extended(v, 0)::bit(32) OR hstore_hash(v)::bit(32) = hstore_hash_extended(v, 1)::bit(32); value | standard | extended0 | extended1 -------+----------+-----------+----------- (0 rows)