polardbxengine/mysql-test/t/dd_is_view_usage.test

206 lines
6.3 KiB
Plaintext

--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;