1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
--echo #
--echo # WL#11864 Implement I_S.VIEW_TABLE_USAGE and I_S.VIEW_ROUTINE_USAGE
--echo #
--echo # Basic schema definition used by test cases.
CREATE DATABASE db1;
USE db1;
CREATE TABLE t1 (c1 INT);
CREATE FUNCTION f1() RETURNS INT RETURN 1;
CREATE FUNCTION f2() RETURNS INT RETURN 2;
CREATE VIEW v1 AS SELECT f1() AS f1;
CREATE VIEW v2 AS SELECT f1, f2() AS f2 FROM v1;
CREATE VIEW v3 AS SELECT c1, f2 FROM t1, v2;
--echo # Case 1: Show table and views used by view v2 and v3.
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--echo # Case 2: Show routines used by views.
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
--echo # Case 3: Rename the column of t1 and list view dependency.
--echo # The query should throw warning on view v3.
ALTER TABLE t1 RENAME COLUMN c1 TO c2;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' AND VIEW_NAME='v3';
ALTER TABLE t1 RENAME COLUMN c2 TO c1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' AND VIEW_NAME='v3';
--echo # Case 4: Drop function f1 and list dependency.
--echo # The query should throw warning on view v1.
DROP FUNCTION f1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1' AND TABLE_NAME='v1';
CREATE FUNCTION f1() RETURNS INT return 1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1' AND TABLE_NAME='v1';
--echo # Case 5: Access checks.
CREATE USER 'testuser'@'localhost';
--echo # 5.1 Grant permission on v2, but not v1. VIEW_TABLE_USAGE will not
--echo # list any entry because user has no permission on v1.
GRANT ALL ON db1.v2 TO 'testuser'@'localhost';
--connect (con1,localhost,testuser,,db1)
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--echo # 5.2 Give permission on v1 and that VIEW_TABLE_USAGE shows v2 entry.
--connection default
GRANT ALL ON db1.v1 TO 'testuser'@'localhost';
--connection con1
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--echo # 5.3 VIEW_ROUTINE_USAGE does not list v1, as it have no grant on f1.
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
--echo # 5.4 Grant access to f1 and check that VIEW_ROUTINE_USAGE shows it.
--connection default
GRANT EXECUTE ON FUNCTION db1.f1 TO 'testuser'@'localhost';
--connection con1
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
--echo # 5.5 Grant access on v3, see that dependency 't1' is not listed.
--connection default
GRANT ALL ON db1.v3 TO 'testuser'@'localhost';
--connection con1
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--echo # 5.6 Grant access on t1, see that dependency 't1' is listed.
--connection default
GRANT SELECT on db1.t1 TO 'testuser'@'localhost';
--connection con1
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--disconnect con1
--connection default
DROP USER 'testuser'@'localhost';
--echo # Cleanup
DROP FUNCTION f1;
DROP FUNCTION f2;
DROP VIEW v1, v2, v3;
DROP TABLE t1;
--echo # Case 6:
--echo # 6.1 Rename table t1 to t2 and list view dependency.
--echo # The query should throw warning on view v1.
CREATE TABLE t1 (c1 INT);
CREATE VIEW v1 AS SELECT c1 FROM t1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
RENAME TABLE t1 to t2;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
RENAME TABLE t2 to t1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--echo # 6.2 Drop table t1 and list view dependency.
DROP TABLE t1;
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
DROP VIEW v1;
--echo # Case 7: List dependent table and function names
--echo # that are permitted to the current user.
CREATE USER testuser1@localhost;
GRANT CREATE ON db1.* TO testuser1@localhost;
GRANT SELECT ON db1.* TO testuser1@localhost;
GRANT CREATE VIEW ON db1.* TO testuser1@localhost;
GRANT CREATE ROUTINE ON db1.* TO testuser1@localhost;
GRANT DROP ON db1.* TO testuser1@localhost;
CREATE USER testuser2@localhost;
GRANT CREATE ON db1.* TO testuser2@localhost;
GRANT SELECT ON db1.* TO testuser2@localhost;
GRANT CREATE VIEW ON db1.* TO testuser2@localhost;
GRANT CREATE ROUTINE ON db1.* TO testuser2@localhost;
GRANT DROP ON db1.* TO testuser2@localhost;
--connect (con1,localhost,testuser1,,db1)
CREATE TABLE t1(c1 INT);
CREATE VIEW v1 AS SELECT c1 FROM t1;
CREATE FUNCTION f1() RETURNS INT RETURN 1;
CREATE VIEW v2 AS SELECT f1();
--connect (con2,localhost,testuser2,,db1)
CREATE TABLE t2(c1 INT);
CREATE VIEW v3 AS SELECT c1 FROM t2;
CREATE FUNCTION f2() RETURNS INT RETURN 1;
CREATE VIEW v4 AS SELECT f2();
--connection con1
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
--connection con2
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
SELECT * FROM INFORMATION_SCHEMA.VIEW_ROUTINE_USAGE
WHERE TABLE_SCHEMA='db1';
--connection con1
DROP VIEW v1,v2;
DROP FUNCTION f1;
DROP TABLE t1;
--disconnect con1
--connection con2
DROP VIEW v3,v4;
DROP FUNCTION f2;
DROP TABLE t2;
--disconnect con2
--connection default
DROP USER testuser1@localhost;
DROP USER testuser2@localhost;
--echo # Case 8: Revoke view privilege
CREATE USER testuser1@localhost;
CREATE TABLE t1(c1 INT);
CREATE VIEW v1 AS SELECT c1 FROM t1;
GRANT ALL ON db1.v1 TO testuser1@localhost;
GRANT ALL ON db1.t1 TO testuser1@localhost;
--connect (con1,localhost,testuser1,,db1)
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--connection default
REVOKE ALL ON db1.v1 FROM testuser1@localhost;
--connection con1
SELECT * FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE VIEW_SCHEMA='db1' ORDER BY VIEW_NAME, TABLE_NAME;
--disconnect con1
--connection default
REVOKE ALL ON db1.t1 FROM testuser1@localhost;
DROP USER testuser1@localhost;
DROP VIEW v1;
DROP TABLE t1;
DROP DATABASE db1;
|