1997-04-06 08:07:13 +02:00
|
|
|
--
|
2000-01-05 18:32:29 +01:00
|
|
|
-- CREATE_OPERATOR
|
1997-04-06 08:07:13 +02:00
|
|
|
--
|
2000-01-05 18:32:29 +01:00
|
|
|
|
2010-11-23 21:27:50 +01:00
|
|
|
CREATE OPERATOR ## (
|
1997-04-06 08:07:13 +02:00
|
|
|
leftarg = path,
|
|
|
|
rightarg = path,
|
|
|
|
procedure = path_inter,
|
2010-11-23 21:27:50 +01:00
|
|
|
commutator = ##
|
1997-04-06 08:07:13 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
CREATE OPERATOR <% (
|
|
|
|
leftarg = point,
|
Major patch from Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
OK, here are a passel of patches for the geometric data types.
These add a "circle" data type, new operators and functions
for the existing data types, and change the default formats
for some of the existing types to make them consistant with
each other. Current formatting conventions (e.g. compatible
with v6.0 to allow dump/reload) are supported, but the new
conventions should be an improvement and we can eventually
drop the old conventions entirely.
For example, there are two kinds of paths (connected line segments),
open and closed, and the old format was
'(1,2,1,2,3,4)' for a closed path with two points (1,2) and (3,4)
'(0,2,1,2,3,4)' for an open path with two points (1,2) and (3,4)
Pretty arcane, huh? The new format for paths is
'((1,2),(3,4))' for a closed path with two points (1,2) and (3,4)
'[(1,2),(3,4)]' for an open path with two points (1,2) and (3,4)
For polygons, the old convention is
'(0,4,2,0,4,3)' for a triangle with points at (0,0),(4,4), and (2,3)
and the new convention is
'((0,0),(4,4),(2,3))' for a triangle with points at (0,0),(4,4), and (2,3)
Other data types which are also represented as lists of points
(e.g. boxes, line segments, and polygons) have similar representations
(they surround each point with parens).
For v6.1, any format which can be interpreted as the old style format
is decoded as such; we can remove that backwards compatibility but ugly
convention for v7.0. This will allow dump/reloads from v6.0.
These include some updates to the regression test files to change the test
for creating a data type from "circle" to "widget" to keep the test from
trashing the new builtin circle type.
1997-04-22 19:35:09 +02:00
|
|
|
rightarg = widget,
|
|
|
|
procedure = pt_in_widget,
|
1999-04-11 01:51:16 +02:00
|
|
|
commutator = >% ,
|
2010-11-23 21:27:50 +01:00
|
|
|
negator = >=%
|
1997-04-06 08:07:13 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
CREATE OPERATOR @#@ (
|
2010-11-23 21:27:50 +01:00
|
|
|
rightarg = int8, -- left unary
|
|
|
|
procedure = numeric_fac
|
1997-04-06 08:07:13 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
CREATE OPERATOR #@# (
|
2003-12-01 22:52:38 +01:00
|
|
|
leftarg = int8, -- right unary
|
|
|
|
procedure = numeric_fac
|
1997-04-06 08:07:13 +02:00
|
|
|
);
|
|
|
|
|
2010-11-23 21:27:50 +01:00
|
|
|
CREATE OPERATOR #%# (
|
|
|
|
leftarg = int8, -- right unary
|
|
|
|
procedure = numeric_fac
|
1997-04-06 08:07:13 +02:00
|
|
|
);
|
|
|
|
|
2003-11-21 23:32:49 +01:00
|
|
|
-- Test comments
|
|
|
|
COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad right unary';
|
2013-07-03 16:48:26 +02:00
|
|
|
|
Allow named parameters to be specified using => in addition to :=
SQL has standardized on => as the use of to specify named parameters,
and we've wanted for many years to support the same syntax ourselves,
but this has been complicated by the possible use of => as an operator
name. In PostgreSQL 9.0, we began emitting a warning when an operator
named => was defined, and in PostgreSQL 9.2, we stopped shipping a
=>(text, text) operator as part of hstore. By the time the next major
version of PostgreSQL is released, => will have been deprecated for a
full five years, so hopefully there won't be too many people still
relying on it. We continue to support := for compatibility with
previous PostgreSQL releases.
Pavel Stehule, reviewed by Petr Jelinek, with a few documentation
tweaks by me.
2015-03-10 15:59:11 +01:00
|
|
|
-- => is disallowed now
|
2013-07-03 16:48:26 +02:00
|
|
|
CREATE OPERATOR => (
|
|
|
|
leftarg = int8, -- right unary
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
|
|
|
|
-- Should fail. CREATE OPERATOR requires USAGE on SCHEMA
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE ROLE regress_rol_op1;
|
|
|
|
CREATE SCHEMA schema_op1;
|
|
|
|
GRANT USAGE ON SCHEMA schema_op1 TO PUBLIC;
|
|
|
|
REVOKE USAGE ON SCHEMA schema_op1 FROM regress_rol_op1;
|
|
|
|
SET ROLE regress_rol_op1;
|
|
|
|
CREATE OPERATOR schema_op1.#*# (
|
|
|
|
leftarg = int8, -- right unary
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
ROLLBACK;
|
|
|
|
|
|
|
|
|
|
|
|
-- Should fail. SETOF type functions not allowed as argument (testing leftarg)
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
leftarg = SETOF int8,
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
ROLLBACK;
|
|
|
|
|
|
|
|
|
|
|
|
-- Should fail. SETOF type functions not allowed as argument (testing rightarg)
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
rightarg = SETOF int8,
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
ROLLBACK;
|
|
|
|
|
|
|
|
|
|
|
|
-- Should work. Sample text-book case
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE OR REPLACE FUNCTION fn_op2(boolean, boolean)
|
|
|
|
RETURNS boolean AS $$
|
|
|
|
SELECT NULL::BOOLEAN;
|
|
|
|
$$ LANGUAGE sql IMMUTABLE;
|
|
|
|
CREATE OPERATOR === (
|
|
|
|
LEFTARG = boolean,
|
|
|
|
RIGHTARG = boolean,
|
|
|
|
PROCEDURE = fn_op2,
|
|
|
|
COMMUTATOR = ===,
|
|
|
|
NEGATOR = !==,
|
|
|
|
RESTRICT = contsel,
|
|
|
|
JOIN = contjoinsel,
|
|
|
|
SORT1, SORT2, LTCMP, GTCMP, HASHES, MERGES
|
|
|
|
);
|
|
|
|
ROLLBACK;
|
|
|
|
|
|
|
|
-- Should fail. Invalid attribute
|
|
|
|
CREATE OPERATOR #@%# (
|
|
|
|
leftarg = int8, -- right unary
|
|
|
|
procedure = numeric_fac,
|
|
|
|
invalid_att = int8
|
|
|
|
);
|
|
|
|
|
|
|
|
-- Should fail. At least leftarg or rightarg should be mandatorily specified
|
|
|
|
CREATE OPERATOR #@%# (
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
|
|
|
|
-- Should fail. Procedure should be mandatorily specified
|
|
|
|
CREATE OPERATOR #@%# (
|
|
|
|
leftarg = int8
|
|
|
|
);
|
|
|
|
|
|
|
|
-- Should fail. CREATE OPERATOR requires USAGE on TYPE
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE ROLE regress_rol_op3;
|
|
|
|
CREATE TYPE type_op3 AS ENUM ('new', 'open', 'closed');
|
|
|
|
CREATE FUNCTION fn_op3(type_op3, int8)
|
|
|
|
RETURNS int8 AS $$
|
|
|
|
SELECT NULL::int8;
|
|
|
|
$$ LANGUAGE sql IMMUTABLE;
|
|
|
|
REVOKE USAGE ON TYPE type_op3 FROM regress_rol_op3;
|
|
|
|
REVOKE USAGE ON TYPE type_op3 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC
|
|
|
|
SET ROLE regress_rol_op3;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
leftarg = type_op3,
|
|
|
|
rightarg = int8,
|
|
|
|
procedure = fn_op3
|
|
|
|
);
|
|
|
|
ROLLBACK;
|
|
|
|
|
|
|
|
-- Should fail. CREATE OPERATOR requires USAGE on TYPE (need to check separately for rightarg)
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE ROLE regress_rol_op4;
|
|
|
|
CREATE TYPE type_op4 AS ENUM ('new', 'open', 'closed');
|
|
|
|
CREATE FUNCTION fn_op4(int8, type_op4)
|
|
|
|
RETURNS int8 AS $$
|
|
|
|
SELECT NULL::int8;
|
|
|
|
$$ LANGUAGE sql IMMUTABLE;
|
|
|
|
REVOKE USAGE ON TYPE type_op4 FROM regress_rol_op4;
|
|
|
|
REVOKE USAGE ON TYPE type_op4 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC
|
|
|
|
SET ROLE regress_rol_op4;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
leftarg = int8,
|
|
|
|
rightarg = type_op4,
|
|
|
|
procedure = fn_op4
|
|
|
|
);
|
|
|
|
ROLLBACK;
|
|
|
|
|
|
|
|
-- Should fail. CREATE OPERATOR requires EXECUTE on function
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE ROLE regress_rol_op5;
|
|
|
|
CREATE TYPE type_op5 AS ENUM ('new', 'open', 'closed');
|
|
|
|
CREATE FUNCTION fn_op5(int8, int8)
|
|
|
|
RETURNS int8 AS $$
|
|
|
|
SELECT NULL::int8;
|
|
|
|
$$ LANGUAGE sql IMMUTABLE;
|
|
|
|
REVOKE EXECUTE ON FUNCTION fn_op5(int8, int8) FROM regress_rol_op5;
|
|
|
|
REVOKE EXECUTE ON FUNCTION fn_op5(int8, int8) FROM PUBLIC;-- Need to do this so that regress_rol_op3 is not allowed EXECUTE via PUBLIC
|
|
|
|
SET ROLE regress_rol_op5;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
leftarg = int8,
|
|
|
|
rightarg = int8,
|
|
|
|
procedure = fn_op5
|
|
|
|
);
|
|
|
|
ROLLBACK;
|
|
|
|
|
|
|
|
-- Should fail. CREATE OPERATOR requires USAGE on return TYPE
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE ROLE regress_rol_op6;
|
|
|
|
CREATE TYPE type_op6 AS ENUM ('new', 'open', 'closed');
|
|
|
|
CREATE FUNCTION fn_op6(int8, int8)
|
|
|
|
RETURNS type_op6 AS $$
|
|
|
|
SELECT NULL::type_op6;
|
|
|
|
$$ LANGUAGE sql IMMUTABLE;
|
|
|
|
REVOKE USAGE ON TYPE type_op6 FROM regress_rol_op6;
|
|
|
|
REVOKE USAGE ON TYPE type_op6 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC
|
|
|
|
SET ROLE regress_rol_op6;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
leftarg = int8,
|
|
|
|
rightarg = int8,
|
|
|
|
procedure = fn_op6
|
|
|
|
);
|
|
|
|
ROLLBACK;
|