2000-01-05 18:31:08 +01:00
|
|
|
--
|
|
|
|
-- CREATE_OPERATOR
|
|
|
|
--
|
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
|
|
|
);
|
2000-01-05 18:31:08 +01:00
|
|
|
CREATE OPERATOR <% (
|
1997-04-06 08:07:13 +02:00
|
|
|
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
|
|
|
);
|
2000-01-05 18:31:08 +01: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
|
|
|
);
|
2000-01-05 18:31:08 +01: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';
|
|
|
|
ERROR: operator does not exist: integer ######
|
2013-07-03 16:48:26 +02:00
|
|
|
-- Show deprecated message. => is deprecated now
|
|
|
|
CREATE OPERATOR => (
|
|
|
|
leftarg = int8, -- right unary
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
WARNING: => is deprecated as an operator name
|
|
|
|
DETAIL: This name may be disallowed altogether in future versions of PostgreSQL.
|
|
|
|
-- 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
|
|
|
|
);
|
|
|
|
ERROR: permission denied for schema schema_op1
|
|
|
|
ROLLBACK;
|
|
|
|
-- Should fail. SETOF type functions not allowed as argument (testing leftarg)
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
leftarg = SETOF int8,
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
ERROR: SETOF type not allowed for operator argument
|
|
|
|
ROLLBACK;
|
|
|
|
-- Should fail. SETOF type functions not allowed as argument (testing rightarg)
|
|
|
|
BEGIN TRANSACTION;
|
|
|
|
CREATE OPERATOR #*# (
|
|
|
|
rightarg = SETOF int8,
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
ERROR: SETOF type not allowed for operator argument
|
|
|
|
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
|
|
|
|
);
|
|
|
|
WARNING: operator attribute "invalid_att" not recognized
|
|
|
|
-- Should fail. At least leftarg or rightarg should be mandatorily specified
|
|
|
|
CREATE OPERATOR #@%# (
|
|
|
|
procedure = numeric_fac
|
|
|
|
);
|
|
|
|
ERROR: at least one of leftarg or rightarg must be specified
|
|
|
|
-- Should fail. Procedure should be mandatorily specified
|
|
|
|
CREATE OPERATOR #@%# (
|
|
|
|
leftarg = int8
|
|
|
|
);
|
|
|
|
ERROR: operator procedure must be specified
|
|
|
|
-- 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
|
|
|
|
);
|
|
|
|
ERROR: permission denied for type type_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
|
|
|
|
);
|
|
|
|
ERROR: permission denied for type type_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
|
|
|
|
);
|
|
|
|
ERROR: permission denied for function 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
|
|
|
|
);
|
|
|
|
ERROR: permission denied for type type_op6
|
|
|
|
ROLLBACK;
|