@@ -29,3 +29,145 @@ CREATE OPERATOR #%# (
2929-- Test comments
3030COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad right unary';
3131ERROR: operator does not exist: integer ######
32+ -- Show deprecated message. => is deprecated now
33+ CREATE OPERATOR => (
34+ leftarg = int8, -- right unary
35+ procedure = numeric_fac
36+ );
37+ WARNING: => is deprecated as an operator name
38+ DETAIL: This name may be disallowed altogether in future versions of PostgreSQL.
39+ -- Should fail. CREATE OPERATOR requires USAGE on SCHEMA
40+ BEGIN TRANSACTION;
41+ CREATE ROLE regress_rol_op1;
42+ CREATE SCHEMA schema_op1;
43+ GRANT USAGE ON SCHEMA schema_op1 TO PUBLIC;
44+ REVOKE USAGE ON SCHEMA schema_op1 FROM regress_rol_op1;
45+ SET ROLE regress_rol_op1;
46+ CREATE OPERATOR schema_op1.#*# (
47+ leftarg = int8, -- right unary
48+ procedure = numeric_fac
49+ );
50+ ERROR: permission denied for schema schema_op1
51+ ROLLBACK;
52+ -- Should fail. SETOF type functions not allowed as argument (testing leftarg)
53+ BEGIN TRANSACTION;
54+ CREATE OPERATOR #*# (
55+ leftarg = SETOF int8,
56+ procedure = numeric_fac
57+ );
58+ ERROR: SETOF type not allowed for operator argument
59+ ROLLBACK;
60+ -- Should fail. SETOF type functions not allowed as argument (testing rightarg)
61+ BEGIN TRANSACTION;
62+ CREATE OPERATOR #*# (
63+ rightarg = SETOF int8,
64+ procedure = numeric_fac
65+ );
66+ ERROR: SETOF type not allowed for operator argument
67+ ROLLBACK;
68+ -- Should work. Sample text-book case
69+ BEGIN TRANSACTION;
70+ CREATE OR REPLACE FUNCTION fn_op2(boolean, boolean)
71+ RETURNS boolean AS $$
72+ SELECT NULL::BOOLEAN;
73+ $$ LANGUAGE sql IMMUTABLE;
74+ CREATE OPERATOR === (
75+ LEFTARG = boolean,
76+ RIGHTARG = boolean,
77+ PROCEDURE = fn_op2,
78+ COMMUTATOR = ===,
79+ NEGATOR = !==,
80+ RESTRICT = contsel,
81+ JOIN = contjoinsel,
82+ SORT1, SORT2, LTCMP, GTCMP, HASHES, MERGES
83+ );
84+ ROLLBACK;
85+ -- Should fail. Invalid attribute
86+ CREATE OPERATOR #@%# (
87+ leftarg = int8, -- right unary
88+ procedure = numeric_fac,
89+ invalid_att = int8
90+ );
91+ WARNING: operator attribute "invalid_att" not recognized
92+ -- Should fail. At least leftarg or rightarg should be mandatorily specified
93+ CREATE OPERATOR #@%# (
94+ procedure = numeric_fac
95+ );
96+ ERROR: at least one of leftarg or rightarg must be specified
97+ -- Should fail. Procedure should be mandatorily specified
98+ CREATE OPERATOR #@%# (
99+ leftarg = int8
100+ );
101+ ERROR: operator procedure must be specified
102+ -- Should fail. CREATE OPERATOR requires USAGE on TYPE
103+ BEGIN TRANSACTION;
104+ CREATE ROLE regress_rol_op3;
105+ CREATE TYPE type_op3 AS ENUM ('new', 'open', 'closed');
106+ CREATE FUNCTION fn_op3(type_op3, int8)
107+ RETURNS int8 AS $$
108+ SELECT NULL::int8;
109+ $$ LANGUAGE sql IMMUTABLE;
110+ REVOKE USAGE ON TYPE type_op3 FROM regress_rol_op3;
111+ REVOKE USAGE ON TYPE type_op3 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC
112+ SET ROLE regress_rol_op3;
113+ CREATE OPERATOR #*# (
114+ leftarg = type_op3,
115+ rightarg = int8,
116+ procedure = fn_op3
117+ );
118+ ERROR: permission denied for type type_op3
119+ ROLLBACK;
120+ -- Should fail. CREATE OPERATOR requires USAGE on TYPE (need to check separately for rightarg)
121+ BEGIN TRANSACTION;
122+ CREATE ROLE regress_rol_op4;
123+ CREATE TYPE type_op4 AS ENUM ('new', 'open', 'closed');
124+ CREATE FUNCTION fn_op4(int8, type_op4)
125+ RETURNS int8 AS $$
126+ SELECT NULL::int8;
127+ $$ LANGUAGE sql IMMUTABLE;
128+ REVOKE USAGE ON TYPE type_op4 FROM regress_rol_op4;
129+ REVOKE USAGE ON TYPE type_op4 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC
130+ SET ROLE regress_rol_op4;
131+ CREATE OPERATOR #*# (
132+ leftarg = int8,
133+ rightarg = type_op4,
134+ procedure = fn_op4
135+ );
136+ ERROR: permission denied for type type_op4
137+ ROLLBACK;
138+ -- Should fail. CREATE OPERATOR requires EXECUTE on function
139+ BEGIN TRANSACTION;
140+ CREATE ROLE regress_rol_op5;
141+ CREATE TYPE type_op5 AS ENUM ('new', 'open', 'closed');
142+ CREATE FUNCTION fn_op5(int8, int8)
143+ RETURNS int8 AS $$
144+ SELECT NULL::int8;
145+ $$ LANGUAGE sql IMMUTABLE;
146+ REVOKE EXECUTE ON FUNCTION fn_op5(int8, int8) FROM regress_rol_op5;
147+ 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
148+ SET ROLE regress_rol_op5;
149+ CREATE OPERATOR #*# (
150+ leftarg = int8,
151+ rightarg = int8,
152+ procedure = fn_op5
153+ );
154+ ERROR: permission denied for function fn_op5
155+ ROLLBACK;
156+ -- Should fail. CREATE OPERATOR requires USAGE on return TYPE
157+ BEGIN TRANSACTION;
158+ CREATE ROLE regress_rol_op6;
159+ CREATE TYPE type_op6 AS ENUM ('new', 'open', 'closed');
160+ CREATE FUNCTION fn_op6(int8, int8)
161+ RETURNS type_op6 AS $$
162+ SELECT NULL::type_op6;
163+ $$ LANGUAGE sql IMMUTABLE;
164+ REVOKE USAGE ON TYPE type_op6 FROM regress_rol_op6;
165+ REVOKE USAGE ON TYPE type_op6 FROM PUBLIC; -- Need to do this so that regress_rol_op3 is not allowed USAGE via PUBLIC
166+ SET ROLE regress_rol_op6;
167+ CREATE OPERATOR #*# (
168+ leftarg = int8,
169+ rightarg = int8,
170+ procedure = fn_op6
171+ );
172+ ERROR: permission denied for type type_op6
173+ ROLLBACK;
0 commit comments