hstore_op.patch
application/octet-stream
Filename: hstore_op.patch
Type: application/octet-stream
Part: 0
Message:
hstore ==> and deprecate =>
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| contrib/hstore/expected/hstore.out | 45 | 45 |
| contrib/hstore/hstore.sql.in | 21 | 0 |
| contrib/hstore/sql/hstore.sql | 45 | 45 |
| contrib/hstore/uninstall_hstore.sql | 3 | 0 |
| src/backend/commands/operatorcmds.c | 10 | 0 |
diff --git a/contrib/hstore/expected/hstore.out b/contrib/hstore/expected/hstore.out
index 34db7f5..58325d7 100644
--- a/contrib/hstore/expected/hstore.out
+++ b/contrib/hstore/expected/hstore.out
@@ -712,137 +712,137 @@ select pg_column_size(''::hstore || 'aa=>1, b=>2'::hstore)
t
(1 row)
--- =>
-select 'a=>g, b=>c'::hstore || ( 'asd'=>'gf' );
+-- ==>
+select 'a=>g, b=>c'::hstore || ( 'asd'==>'gf' );
?column?
---------------------------------
"a"=>"g", "b"=>"c", "asd"=>"gf"
(1 row)
-select 'a=>g, b=>c'::hstore || ( 'b'=>'gf' );
+select 'a=>g, b=>c'::hstore || ( 'b'==>'gf' );
?column?
---------------------
"a"=>"g", "b"=>"gf"
(1 row)
-select 'a=>g, b=>c'::hstore || ( 'b'=>'NULL' );
+select 'a=>g, b=>c'::hstore || ( 'b'==>'NULL' );
?column?
-----------------------
"a"=>"g", "b"=>"NULL"
(1 row)
-select 'a=>g, b=>c'::hstore || ( 'b'=>NULL );
+select 'a=>g, b=>c'::hstore || ( 'b'==>NULL );
?column?
---------------------
"a"=>"g", "b"=>NULL
(1 row)
-select ('a=>g, b=>c'::hstore || ( NULL=>'b' )) is null;
+select ('a=>g, b=>c'::hstore || ( NULL==>'b' )) is null;
?column?
----------
t
(1 row)
-select pg_column_size(('b'=>'gf'))
+select pg_column_size(('b'==>'gf'))
= pg_column_size('b=>gf'::hstore);
?column?
----------
t
(1 row)
-select pg_column_size('a=>g, b=>c'::hstore || ('b'=>'gf'))
+select pg_column_size('a=>g, b=>c'::hstore || ('b'==>'gf'))
= pg_column_size('a=>g, b=>gf'::hstore);
?column?
----------
t
(1 row)
--- => arrays
-select ARRAY['a','b','asd'] => ARRAY['g','h','i'];
+-- ==> arrays
+select ARRAY['a','b','asd'] ==> ARRAY['g','h','i'];
?column?
--------------------------------
"a"=>"g", "b"=>"h", "asd"=>"i"
(1 row)
-select ARRAY['a','b','asd'] => ARRAY['g','h',NULL];
+select ARRAY['a','b','asd'] ==> ARRAY['g','h',NULL];
?column?
---------------------------------
"a"=>"g", "b"=>"h", "asd"=>NULL
(1 row)
-select ARRAY['z','y','x'] => ARRAY['1','2','3'];
+select ARRAY['z','y','x'] ==> ARRAY['1','2','3'];
?column?
------------------------------
"x"=>"3", "y"=>"2", "z"=>"1"
(1 row)
-select ARRAY['aaa','bb','c','d'] => ARRAY[null::text,null,null,null];
+select ARRAY['aaa','bb','c','d'] ==> ARRAY[null::text,null,null,null];
?column?
-----------------------------------------------
"c"=>NULL, "d"=>NULL, "bb"=>NULL, "aaa"=>NULL
(1 row)
-select ARRAY['aaa','bb','c','d'] => null;
+select ARRAY['aaa','bb','c','d'] ==> null;
?column?
-----------------------------------------------
"c"=>NULL, "d"=>NULL, "bb"=>NULL, "aaa"=>NULL
(1 row)
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['g','h','i'];
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['g','h','i'];
?column?
----------
(1 row)
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b'];
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['c','b'];
?column?
--------------------
"b"=>"2", "c"=>"3"
(1 row)
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['aa','b'];
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['aa','b'];
?column?
---------------------
"b"=>"2", "aa"=>"1"
(1 row)
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b','aa'];
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['c','b','aa'];
?column?
-------------------------------
"b"=>"2", "c"=>"3", "aa"=>"1"
(1 row)
-select quote_literal('{}'::text[] => '{}'::text[]);
+select quote_literal('{}'::text[] ==> '{}'::text[]);
quote_literal
---------------
''
(1 row)
-select quote_literal('{}'::text[] => null);
+select quote_literal('{}'::text[] ==> null);
quote_literal
---------------
''
(1 row)
-select ARRAY['a'] => '{}'::text[]; -- error
+select ARRAY['a'] ==> '{}'::text[]; -- error
ERROR: arrays must have same bounds
-select '{}'::text[] => ARRAY['a']; -- error
+select '{}'::text[] ==> ARRAY['a']; -- error
ERROR: arrays must have same bounds
-select pg_column_size(ARRAY['a','b','asd'] => ARRAY['g','h','i'])
+select pg_column_size(ARRAY['a','b','asd'] ==> ARRAY['g','h','i'])
= pg_column_size('a=>g, b=>h, asd=>i'::hstore);
?column?
----------
t
(1 row)
-select pg_column_size(hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b'])
+select pg_column_size(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(hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b','aa'])
+select pg_column_size(hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['c','b','aa'])
= pg_column_size('aa=>1, b=>2, c=>3'::hstore);
?column?
----------
@@ -948,45 +948,45 @@ select pg_column_size(hstore(v))
t
(1 row)
-select populate_record(v, ('c' => '3.45')) from testhstore1 v;
+select populate_record(v, ('c' ==> '3.45')) from testhstore1 v;
populate_record
------------------
(1,foo,3.45,3,0)
(1 row)
-select populate_record(v, ('d' => '3.45')) from testhstore1 v;
+select populate_record(v, ('d' ==> '3.45')) from testhstore1 v;
populate_record
--------------------
(1,foo,1.2,3.45,0)
(1 row)
-select populate_record(v, ('e' => '123')) from testhstore1 v;
+select populate_record(v, ('e' ==> '123')) from testhstore1 v;
populate_record
-------------------
(1,foo,1.2,3,123)
(1 row)
-select populate_record(v, ('e' => null)) from testhstore1 v;
+select populate_record(v, ('e' ==> null)) from testhstore1 v;
ERROR: domain hstestdom1 does not allow null values
-select populate_record(v, ('c' => null)) from testhstore1 v;
+select populate_record(v, ('c' ==> null)) from testhstore1 v;
populate_record
-----------------
(1,foo,,3,0)
(1 row)
-select populate_record(v, ('b' => 'foo') || ('a' => '123')) from testhstore1 v;
+select populate_record(v, ('b' ==> 'foo') || ('a' ==> '123')) from testhstore1 v;
populate_record
-------------------
(123,foo,1.2,3,0)
(1 row)
-select populate_record(v, ('b' => 'foo') || ('e' => null)) from testhstore0 v;
+select populate_record(v, ('b' ==> 'foo') || ('e' ==> null)) from testhstore0 v;
populate_record
-----------------
(1,foo,1.2,3)
(1 row)
-select populate_record(v, ('b' => 'foo') || ('e' => null)) from testhstore1 v;
+select populate_record(v, ('b' ==> 'foo') || ('e' ==> null)) from testhstore1 v;
ERROR: domain hstestdom1 does not allow null values
select populate_record(v, '') from testhstore0 v;
populate_record
@@ -1000,9 +1000,9 @@ select populate_record(v, '') from testhstore1 v;
(1,foo,1.2,3,0)
(1 row)
-select populate_record(null::testhstore1, ('c' => '3.45') || ('a' => '123'));
+select populate_record(null::testhstore1, ('c' ==> '3.45') || ('a' ==> '123'));
ERROR: domain hstestdom1 does not allow null values
-select populate_record(null::testhstore1, ('c' => '3.45') || ('e' => '123'));
+select populate_record(null::testhstore1, ('c' ==> '3.45') || ('e' ==> '123'));
populate_record
-----------------
(,,3.45,,123)
@@ -1016,45 +1016,45 @@ select populate_record(null::testhstore0, '');
select populate_record(null::testhstore1, '');
ERROR: domain hstestdom1 does not allow null values
-select v #= ('c' => '3.45') from testhstore1 v;
+select v #= ('c' ==> '3.45') from testhstore1 v;
?column?
------------------
(1,foo,3.45,3,0)
(1 row)
-select v #= ('d' => '3.45') from testhstore1 v;
+select v #= ('d' ==> '3.45') from testhstore1 v;
?column?
--------------------
(1,foo,1.2,3.45,0)
(1 row)
-select v #= ('e' => '123') from testhstore1 v;
+select v #= ('e' ==> '123') from testhstore1 v;
?column?
-------------------
(1,foo,1.2,3,123)
(1 row)
-select v #= ('c' => null) from testhstore1 v;
+select v #= ('c' ==> null) from testhstore1 v;
?column?
--------------
(1,foo,,3,0)
(1 row)
-select v #= ('e' => null) from testhstore0 v;
+select v #= ('e' ==> null) from testhstore0 v;
?column?
---------------
(1,foo,1.2,3)
(1 row)
-select v #= ('e' => null) from testhstore1 v;
+select v #= ('e' ==> null) from testhstore1 v;
ERROR: domain hstestdom1 does not allow null values
-select v #= (('b' => 'foo') || ('a' => '123')) from testhstore1 v;
+select v #= (('b' ==> 'foo') || ('a' ==> '123')) from testhstore1 v;
?column?
-------------------
(123,foo,1.2,3,0)
(1 row)
-select v #= (('b' => 'foo') || ('e' => '123')) from testhstore1 v;
+select v #= (('b' ==> 'foo') || ('e' ==> '123')) from testhstore1 v;
?column?
-------------------
(1,foo,1.2,3,123)
@@ -1072,9 +1072,9 @@ select v #= hstore '' from testhstore1 v;
(1,foo,1.2,3,0)
(1 row)
-select null::testhstore1 #= (('c' => '3.45') || ('a' => '123'));
+select null::testhstore1 #= (('c' ==> '3.45') || ('a' ==> '123'));
ERROR: domain hstestdom1 does not allow null values
-select null::testhstore1 #= (('c' => '3.45') || ('e' => '123'));
+select null::testhstore1 #= (('c' ==> '3.45') || ('e' ==> '123'));
?column?
---------------
(,,3.45,,123)
diff --git a/contrib/hstore/hstore.sql.in b/contrib/hstore/hstore.sql.in
index 972557a..61e048f 100644
--- a/contrib/hstore/hstore.sql.in
+++ b/contrib/hstore/hstore.sql.in
@@ -66,6 +66,13 @@ RETURNS hstore
AS 'MODULE_PATHNAME','hstore_slice_to_hstore'
LANGUAGE C STRICT IMMUTABLE;
+CREATE OPERATOR ==> (
+ LEFTARG = hstore,
+ RIGHTARG = text[],
+ PROCEDURE = slice_hstore
+);
+
+-- Deprecated. For backward compatibility.
CREATE OPERATOR => (
LEFTARG = hstore,
RIGHTARG = text[],
@@ -227,6 +234,13 @@ RETURNS hstore
AS 'MODULE_PATHNAME','hstore_from_text'
LANGUAGE C IMMUTABLE; -- not STRICT; needs to allow (key,NULL)
+CREATE OPERATOR ==> (
+ LEFTARG = text,
+ RIGHTARG = text,
+ PROCEDURE = hstore
+);
+
+-- Deprecated. For backward compatibility.
CREATE OPERATOR => (
LEFTARG = text,
RIGHTARG = text,
@@ -238,6 +252,13 @@ RETURNS hstore
AS 'MODULE_PATHNAME', 'hstore_from_arrays'
LANGUAGE C IMMUTABLE; -- not STRICT; allows (keys,null)
+CREATE OPERATOR ==> (
+ LEFTARG = text[],
+ RIGHTARG = text[],
+ PROCEDURE = hstore
+);
+
+-- Deprecated. For backward compatibility.
CREATE OPERATOR => (
LEFTARG = text[],
RIGHTARG = text[],
diff --git a/contrib/hstore/sql/hstore.sql b/contrib/hstore/sql/hstore.sql
index a88ff1d..68f9033 100644
--- a/contrib/hstore/sql/hstore.sql
+++ b/contrib/hstore/sql/hstore.sql
@@ -160,36 +160,36 @@ select pg_column_size('aa=>1, b=>2'::hstore || ''::hstore)
select pg_column_size(''::hstore || 'aa=>1, b=>2'::hstore)
= pg_column_size('aa=>1, b=>2'::hstore);
--- =>
-select 'a=>g, b=>c'::hstore || ( 'asd'=>'gf' );
-select 'a=>g, b=>c'::hstore || ( 'b'=>'gf' );
-select 'a=>g, b=>c'::hstore || ( 'b'=>'NULL' );
-select 'a=>g, b=>c'::hstore || ( 'b'=>NULL );
-select ('a=>g, b=>c'::hstore || ( NULL=>'b' )) is null;
-select pg_column_size(('b'=>'gf'))
+-- ==>
+select 'a=>g, b=>c'::hstore || ( 'asd'==>'gf' );
+select 'a=>g, b=>c'::hstore || ( 'b'==>'gf' );
+select 'a=>g, b=>c'::hstore || ( 'b'==>'NULL' );
+select 'a=>g, b=>c'::hstore || ( 'b'==>NULL );
+select ('a=>g, b=>c'::hstore || ( NULL==>'b' )) is null;
+select pg_column_size(('b'==>'gf'))
= pg_column_size('b=>gf'::hstore);
-select pg_column_size('a=>g, b=>c'::hstore || ('b'=>'gf'))
+select pg_column_size('a=>g, b=>c'::hstore || ('b'==>'gf'))
= pg_column_size('a=>g, b=>gf'::hstore);
--- => arrays
-select ARRAY['a','b','asd'] => ARRAY['g','h','i'];
-select ARRAY['a','b','asd'] => ARRAY['g','h',NULL];
-select ARRAY['z','y','x'] => ARRAY['1','2','3'];
-select ARRAY['aaa','bb','c','d'] => ARRAY[null::text,null,null,null];
-select ARRAY['aaa','bb','c','d'] => null;
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['g','h','i'];
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b'];
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['aa','b'];
-select hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b','aa'];
-select quote_literal('{}'::text[] => '{}'::text[]);
-select quote_literal('{}'::text[] => null);
-select ARRAY['a'] => '{}'::text[]; -- error
-select '{}'::text[] => ARRAY['a']; -- error
-select pg_column_size(ARRAY['a','b','asd'] => ARRAY['g','h','i'])
+-- ==> arrays
+select ARRAY['a','b','asd'] ==> ARRAY['g','h','i'];
+select ARRAY['a','b','asd'] ==> ARRAY['g','h',NULL];
+select ARRAY['z','y','x'] ==> ARRAY['1','2','3'];
+select ARRAY['aaa','bb','c','d'] ==> ARRAY[null::text,null,null,null];
+select ARRAY['aaa','bb','c','d'] ==> null;
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['g','h','i'];
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['c','b'];
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['aa','b'];
+select hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['c','b','aa'];
+select quote_literal('{}'::text[] ==> '{}'::text[]);
+select quote_literal('{}'::text[] ==> null);
+select ARRAY['a'] ==> '{}'::text[]; -- error
+select '{}'::text[] ==> ARRAY['a']; -- error
+select pg_column_size(ARRAY['a','b','asd'] ==> ARRAY['g','h','i'])
= pg_column_size('a=>g, b=>h, asd=>i'::hstore);
-select pg_column_size(hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b'])
+select pg_column_size(hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['c','b'])
= pg_column_size('b=>2, c=>3'::hstore);
-select pg_column_size(hstore 'aa=>1, b=>2, c=>3' => ARRAY['c','b','aa'])
+select pg_column_size(hstore 'aa=>1, b=>2, c=>3' ==> ARRAY['c','b','aa'])
= pg_column_size('aa=>1, b=>2, c=>3'::hstore);
-- array input
@@ -221,32 +221,32 @@ select hstore(null::testhstore1);
select pg_column_size(hstore(v))
= pg_column_size('a=>1, b=>"foo", c=>"1.2", d=>"3", e=>"0"'::hstore)
from testhstore1 v;
-select populate_record(v, ('c' => '3.45')) from testhstore1 v;
-select populate_record(v, ('d' => '3.45')) from testhstore1 v;
-select populate_record(v, ('e' => '123')) from testhstore1 v;
-select populate_record(v, ('e' => null)) from testhstore1 v;
-select populate_record(v, ('c' => null)) from testhstore1 v;
-select populate_record(v, ('b' => 'foo') || ('a' => '123')) from testhstore1 v;
-select populate_record(v, ('b' => 'foo') || ('e' => null)) from testhstore0 v;
-select populate_record(v, ('b' => 'foo') || ('e' => null)) from testhstore1 v;
+select populate_record(v, ('c' ==> '3.45')) from testhstore1 v;
+select populate_record(v, ('d' ==> '3.45')) from testhstore1 v;
+select populate_record(v, ('e' ==> '123')) from testhstore1 v;
+select populate_record(v, ('e' ==> null)) from testhstore1 v;
+select populate_record(v, ('c' ==> null)) from testhstore1 v;
+select populate_record(v, ('b' ==> 'foo') || ('a' ==> '123')) from testhstore1 v;
+select populate_record(v, ('b' ==> 'foo') || ('e' ==> null)) from testhstore0 v;
+select populate_record(v, ('b' ==> 'foo') || ('e' ==> null)) from testhstore1 v;
select populate_record(v, '') from testhstore0 v;
select populate_record(v, '') from testhstore1 v;
-select populate_record(null::testhstore1, ('c' => '3.45') || ('a' => '123'));
-select populate_record(null::testhstore1, ('c' => '3.45') || ('e' => '123'));
+select populate_record(null::testhstore1, ('c' ==> '3.45') || ('a' ==> '123'));
+select populate_record(null::testhstore1, ('c' ==> '3.45') || ('e' ==> '123'));
select populate_record(null::testhstore0, '');
select populate_record(null::testhstore1, '');
-select v #= ('c' => '3.45') from testhstore1 v;
-select v #= ('d' => '3.45') from testhstore1 v;
-select v #= ('e' => '123') from testhstore1 v;
-select v #= ('c' => null) from testhstore1 v;
-select v #= ('e' => null) from testhstore0 v;
-select v #= ('e' => null) from testhstore1 v;
-select v #= (('b' => 'foo') || ('a' => '123')) from testhstore1 v;
-select v #= (('b' => 'foo') || ('e' => '123')) from testhstore1 v;
+select v #= ('c' ==> '3.45') from testhstore1 v;
+select v #= ('d' ==> '3.45') from testhstore1 v;
+select v #= ('e' ==> '123') from testhstore1 v;
+select v #= ('c' ==> null) from testhstore1 v;
+select v #= ('e' ==> null) from testhstore0 v;
+select v #= ('e' ==> null) from testhstore1 v;
+select v #= (('b' ==> 'foo') || ('a' ==> '123')) from testhstore1 v;
+select v #= (('b' ==> 'foo') || ('e' ==> '123')) from testhstore1 v;
select v #= hstore '' from testhstore0 v;
select v #= hstore '' from testhstore1 v;
-select null::testhstore1 #= (('c' => '3.45') || ('a' => '123'));
-select null::testhstore1 #= (('c' => '3.45') || ('e' => '123'));
+select null::testhstore1 #= (('c' ==> '3.45') || ('a' ==> '123'));
+select null::testhstore1 #= (('c' ==> '3.45') || ('e' ==> '123'));
select null::testhstore0 #= hstore '';
select null::testhstore1 #= hstore '';
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;
diff --git a/contrib/hstore/uninstall_hstore.sql b/contrib/hstore/uninstall_hstore.sql
index 27463b9..a273bf6 100644
--- a/contrib/hstore/uninstall_hstore.sql
+++ b/contrib/hstore/uninstall_hstore.sql
@@ -21,6 +21,9 @@ DROP OPERATOR @> ( hstore, hstore );
DROP OPERATOR <@ ( hstore, hstore );
DROP OPERATOR @ ( hstore, hstore );
DROP OPERATOR ~ ( hstore, hstore );
+DROP OPERATOR ==> ( text, text );
+DROP OPERATOR ==> ( text[], text[] );
+DROP OPERATOR ==> ( hstore, text[] );
DROP OPERATOR => ( text, text );
DROP OPERATOR => ( text[], text[] );
DROP OPERATOR => ( hstore, text[] );
diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c
index 9c07cf3..83d68f8 100644
--- a/src/backend/commands/operatorcmds.c
+++ b/src/backend/commands/operatorcmds.c
@@ -88,6 +88,16 @@ DefineOperator(List *names, List *parameters)
/* Convert list of names to a name and namespace */
oprNamespace = QualifiedNameGetCreationNamespace(names, &oprName);
+ /*
+ * The SQL standard committee has decided that => should be used for
+ * named parameters; therefore, a future release of PostgreSQL will
+ * no longer allow this to be used as the name of a user-defined
+ * operator. For now, we just emit a warning.
+ */
+ if (!strcmp(oprName, "=>"))
+ ereport(WARNING,
+ (errmsg("The use of => as an operator name is deprecated and may be disallowed in a future release.")));
+
/* Check we have creation rights in target namespace */
aclresult = pg_namespace_aclcheck(oprNamespace, GetUserId(), ACL_CREATE);
if (aclresult != ACLCHECK_OK)