1--source include/not_embedded.inc
2
3--echo #
4--echo # MDEV-12461 TYPE OF and ROW TYPE OF anchored data types
5--echo #
6
7
8--echo #
9--echo # Initiation:
10--echo # - creating database db1
11--echo # - creating user user1 with access rights to db1
12--echo #
13
14CREATE DATABASE db1;
15CREATE TABLE db1.t1 (a INT, b VARCHAR(10));
16
17CREATE USER user1;
18
19GRANT ALL PRIVILEGES ON test.* TO user1;
20
21connect (conn1,localhost,user1,,test);
22
23SELECT database();
24SELECT user();
25
26--echo #
27--echo # Making sure that user1 does not have privileges to db1.t1
28--echo #
29
30--error ER_TABLEACCESS_DENIED_ERROR
31SHOW CREATE TABLE db1.t1;
32--error ER_TABLEACCESS_DENIED_ERROR
33SHOW FIELDS IN db1.t1;
34
35
36--echo #
37--echo # Trigger: using TYPE OF with a table we don't have access to
38--echo #
39CREATE TABLE test.t1 (a INT, b INT);
40INSERT INTO test.t1 (a,b) VALUES (10,20);
41SELECT * FROM t1;
42DELIMITER $$;
43CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW
44BEGIN
45  DECLARE b TYPE OF db1.t1.b DEFAULT 20;
46  SET NEW.b = 10;
47END
48$$
49DELIMITER ;$$
50--error ER_TABLEACCESS_DENIED_ERROR
51INSERT INTO t1 (a) VALUES (10);
52SELECT * FROM t1;
53DROP TRIGGER tr1;
54DROP TABLE t1;
55
56
57--echo #
58--echo # Stored procedure: Using TYPE OF for with a table that we don't have access to
59--echo # DEFINER user1, SQL SECURITY DEFAULT
60--echo #
61
62DELIMITER $$;
63CREATE PROCEDURE p1()
64BEGIN
65  DECLARE a TYPE OF db1.t1.a DEFAULT 10;
66  SELECT a;
67END;
68$$
69DELIMITER ;$$
70--error ER_TABLEACCESS_DENIED_ERROR
71CALL p1;
72DROP PROCEDURE p1;
73
74#DELIMITER $$;
75#CREATE PROCEDURE p1()
76#BEGIN
77#  DECLARE a ROW TYPE OF db1.t1;
78#  SELECT a.a;
79#END;
80#$$
81#DELIMITER ;$$
82#--error ER_TABLEACCESS_DENIED_ERROR
83#CALL p1;
84#DROP PROCEDURE p1;
85
86
87--echo #
88--echo # Stored procedure: Using TYPE OF for with a table that we don't have access to
89--echo # DEFINER root, SQL SECURITY INVOKER
90--echo #
91
92connection default;
93DELIMITER $$;
94CREATE PROCEDURE p1()
95SQL SECURITY INVOKER
96BEGIN
97  DECLARE a TYPE OF db1.t1.a DEFAULT 10;
98  SELECT a;
99END;
100$$
101DELIMITER ;$$
102connection conn1;
103--error ER_TABLEACCESS_DENIED_ERROR
104CALL p1;
105DROP PROCEDURE p1;
106
107
108connection default;
109DELIMITER $$;
110CREATE PROCEDURE p1()
111SQL SECURITY INVOKER
112BEGIN
113  DECLARE a ROW TYPE OF db1.t1;
114  SELECT a.a;
115END;
116$$
117DELIMITER ;$$
118connection conn1;
119--error ER_TABLEACCESS_DENIED_ERROR
120CALL p1;
121DROP PROCEDURE p1;
122
123
124--echo #
125--echo # Stored procedure: Using TYPE OF for with a table that we don't have access to
126--echo # DEFINER root, SQL SECURITY DEFINER
127--echo #
128
129connection default;
130DELIMITER $$;
131CREATE PROCEDURE p1()
132SQL SECURITY DEFINER
133BEGIN
134  DECLARE a TYPE OF db1.t1.a DEFAULT 10;
135  SELECT a;
136END;
137$$
138DELIMITER ;$$
139connection conn1;
140CALL p1;
141DROP PROCEDURE p1;
142
143connection default;
144DELIMITER $$;
145CREATE PROCEDURE p1()
146SQL SECURITY DEFINER
147BEGIN
148  DECLARE a ROW TYPE OF db1.t1;
149  SET a.a= 10;
150  SELECT a.a;
151END;
152$$
153DELIMITER ;$$
154connection conn1;
155CALL p1;
156DROP PROCEDURE p1;
157
158
159--echo #
160--echo # Stored function: Using TYPE OF for with a table that we don't have access to
161--echo # DEFINER user1, SQL SECURITY DEFAULT
162--echo #
163
164CREATE TABLE t1 (a INT);
165DELIMITER $$;
166CREATE FUNCTION f1() RETURNS INT
167BEGIN
168  DECLARE a TYPE OF db1.t1.a DEFAULT 0;
169  RETURN OCTET_LENGTH(a);
170END;
171$$
172DELIMITER ;$$
173--error ER_TABLEACCESS_DENIED_ERROR
174SELECT f1();
175DROP FUNCTION f1;
176DROP TABLE t1;
177
178
179--echo #
180--echo # Stored function: Using TYPE OF for with a table that we don't have access to
181--echo # DEFINER root, SQL SECURITY INVOKER
182--echo #
183
184connection default;
185CREATE TABLE t1 (a INT);
186DELIMITER $$;
187CREATE FUNCTION f1() RETURNS INT
188SQL SECURITY INVOKER
189BEGIN
190  DECLARE a TYPE OF db1.t1.a DEFAULT 0;
191  RETURN OCTET_LENGTH(a);
192END;
193$$
194DELIMITER ;$$
195connection conn1;
196--error ER_TABLEACCESS_DENIED_ERROR
197SELECT f1();
198DROP FUNCTION f1;
199DROP TABLE t1;
200
201
202--echo #
203--echo # Stored function: Using TYPE OF for with a table that we don't have access to
204--echo # DEFINER root, SQL SECURITY DEFINER
205--echo #
206
207connection default;
208CREATE TABLE t1 (a INT);
209DELIMITER $$;
210CREATE FUNCTION f1() RETURNS INT
211SQL SECURITY DEFINER
212BEGIN
213  DECLARE a TYPE OF db1.t1.a DEFAULT 0;
214  RETURN OCTET_LENGTH(a);
215END;
216$$
217DELIMITER ;$$
218connection conn1;
219SELECT f1();
220DROP FUNCTION f1;
221DROP TABLE t1;
222
223
224connection default;
225GRANT SELECT (a) ON db1.t1 TO user1;
226connection conn1;
227
228--echo #
229--echo # Making sure that user1 has access to db1.t1.a, but not to db1.t1.b
230--echo #
231
232--error ER_TABLEACCESS_DENIED_ERROR
233SHOW CREATE TABLE db1.t1;
234SHOW FIELDS IN db1.t1;
235
236--echo #
237--echo # Trigger: Per-column privileges
238--echo #
239CREATE TABLE test.t1 (a INT, b INT);
240INSERT INTO test.t1 (a,b) VALUES (10,20);
241SELECT * FROM t1;
242# TYPE OF reference using a column we have access to
243DELIMITER $$;
244CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW
245BEGIN
246  DECLARE a TYPE OF db1.t1.a DEFAULT 20;
247  BEGIN
248    SET NEW.b := 10;
249  END;
250END
251$$
252DELIMITER ;$$
253INSERT INTO t1 (a) VALUES (10);
254SELECT * FROM t1;
255DROP TRIGGER tr1;
256# TYPE OF reference using a column that we don't have access to
257DELIMITER $$;
258CREATE TRIGGER test.tr1 BEFORE INSERT ON test.t1 FOR EACH ROW
259BEGIN
260  DECLARE b TYPE OF db1.t1.b DEFAULT 20;
261  BEGIN
262    SET NEW.b = 10;
263  END;
264END
265$$
266DELIMITER ;$$
267--error ER_COLUMNACCESS_DENIED_ERROR
268INSERT INTO t1 (a) VALUES (10);
269SELECT * FROM t1;
270DROP TRIGGER tr1;
271DROP TABLE t1;
272
273
274
275--echo #
276--echo # Stored procedure: Per-column privileges
277--echo # DEFINER user1, SQL SECURITY DEFAULT
278--echo #
279
280DELIMITER $$;
281CREATE PROCEDURE p1()
282BEGIN
283  DECLARE a TYPE OF db1.t1.a DEFAULT 10;
284  SELECT a;
285END;
286$$
287DELIMITER ;$$
288CALL p1;
289DROP PROCEDURE p1;
290
291DELIMITER $$;
292CREATE PROCEDURE p1()
293BEGIN
294  DECLARE b TYPE OF db1.t1.b DEFAULT 10;
295  SELECT b;
296END;
297$$
298DELIMITER ;$$
299--error ER_COLUMNACCESS_DENIED_ERROR
300CALL p1;
301DROP PROCEDURE p1;
302
303DELIMITER $$;
304CREATE PROCEDURE p1()
305BEGIN
306  DECLARE b ROW TYPE OF db1.t1;
307  SET b.b=10;
308  SELECT b.b;
309END;
310$$
311DELIMITER ;$$
312--error ER_COLUMNACCESS_DENIED_ERROR
313CALL p1;
314DROP PROCEDURE p1;
315
316
317--echo #
318--echo # Clean up
319--echo #
320disconnect conn1;
321connection default;
322
323DROP USER user1;
324DROP DATABASE db1;
325
326--echo #
327--echo # End of MDEV-12461 TYPE OF and ROW TYPE OF anchored data types
328--echo #
329