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