mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS table
MariaDB 11.8 and above allows to specify list of columns in the update trigger and such trigger is fired only when one of the specified columns is updated. The `INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS` table lists all such columns for a trigger. A column is shown only if the user has any non-SELECT privileges on the column specified in the trigger.
This commit is contained in:
committed by
Raghunandan Bhat
parent
b10e209d16
commit
9057f741d7
@@ -62,6 +62,7 @@ TABLESPACES TABLESPACE_NAME
|
||||
TABLE_CONSTRAINTS CONSTRAINT_SCHEMA
|
||||
TABLE_PRIVILEGES TABLE_SCHEMA
|
||||
TABLE_STATISTICS TABLE_SCHEMA
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA
|
||||
TRIGGERS TRIGGER_SCHEMA
|
||||
USERS USER
|
||||
USER_PRIVILEGES GRANTEE
|
||||
@@ -128,6 +129,7 @@ TABLESPACES TABLESPACE_NAME
|
||||
TABLE_CONSTRAINTS CONSTRAINT_SCHEMA
|
||||
TABLE_PRIVILEGES TABLE_SCHEMA
|
||||
TABLE_STATISTICS TABLE_SCHEMA
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA
|
||||
TRIGGERS TRIGGER_SCHEMA
|
||||
USERS USER
|
||||
USER_PRIVILEGES GRANTEE
|
||||
|
||||
@@ -61,6 +61,7 @@ TABLESPACES TABLESPACE_NAME
|
||||
TABLE_CONSTRAINTS CONSTRAINT_SCHEMA
|
||||
TABLE_PRIVILEGES TABLE_SCHEMA
|
||||
TABLE_STATISTICS TABLE_SCHEMA
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA
|
||||
TRIGGERS TRIGGER_SCHEMA
|
||||
USERS USER
|
||||
USER_PRIVILEGES GRANTEE
|
||||
@@ -126,6 +127,7 @@ TABLESPACES TABLESPACE_NAME
|
||||
TABLE_CONSTRAINTS CONSTRAINT_SCHEMA
|
||||
TABLE_PRIVILEGES TABLE_SCHEMA
|
||||
TABLE_STATISTICS TABLE_SCHEMA
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA
|
||||
TRIGGERS TRIGGER_SCHEMA
|
||||
USERS USER
|
||||
USER_PRIVILEGES GRANTEE
|
||||
|
||||
@@ -95,6 +95,7 @@ TABLESPACES
|
||||
TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS
|
||||
USERS
|
||||
USER_PRIVILEGES
|
||||
@@ -144,6 +145,7 @@ TABLESPACES TABLESPACES
|
||||
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS TRIGGERS
|
||||
t1 t1
|
||||
t2 t2
|
||||
@@ -167,6 +169,7 @@ TABLESPACES TABLESPACES
|
||||
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS TRIGGERS
|
||||
t1 t1
|
||||
t2 t2
|
||||
@@ -190,6 +193,7 @@ TABLESPACES TABLESPACES
|
||||
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS TRIGGERS
|
||||
t1 t1
|
||||
t2 t2
|
||||
@@ -734,6 +738,7 @@ TABLESPACES
|
||||
TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS
|
||||
create database information_schema;
|
||||
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||
@@ -745,6 +750,7 @@ TABLESPACES SYSTEM VIEW
|
||||
TABLE_CONSTRAINTS SYSTEM VIEW
|
||||
TABLE_PRIVILEGES SYSTEM VIEW
|
||||
TABLE_STATISTICS SYSTEM VIEW
|
||||
TRIGGERED_UPDATE_COLUMNS SYSTEM VIEW
|
||||
TRIGGERS SYSTEM VIEW
|
||||
create table t1(a int);
|
||||
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||
@@ -759,6 +765,7 @@ TABLESPACES
|
||||
TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS
|
||||
select table_name from tables where table_name='user';
|
||||
table_name
|
||||
|
||||
@@ -68,6 +68,7 @@ TABLESPACES
|
||||
TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS
|
||||
USERS
|
||||
USER_PRIVILEGES
|
||||
@@ -155,6 +156,7 @@ TABLESPACES TABLESPACE_NAME
|
||||
TABLE_CONSTRAINTS CONSTRAINT_SCHEMA
|
||||
TABLE_PRIVILEGES TABLE_SCHEMA
|
||||
TABLE_STATISTICS TABLE_SCHEMA
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA
|
||||
TRIGGERS TRIGGER_SCHEMA
|
||||
USERS USER
|
||||
USER_PRIVILEGES GRANTEE
|
||||
@@ -242,6 +244,7 @@ TABLESPACES TABLESPACE_NAME
|
||||
TABLE_CONSTRAINTS CONSTRAINT_SCHEMA
|
||||
TABLE_PRIVILEGES TABLE_SCHEMA
|
||||
TABLE_STATISTICS TABLE_SCHEMA
|
||||
TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA
|
||||
TRIGGERS TRIGGER_SCHEMA
|
||||
USERS USER
|
||||
USER_PRIVILEGES GRANTEE
|
||||
@@ -328,6 +331,7 @@ TABLESPACES information_schema.TABLESPACES 1
|
||||
TABLE_CONSTRAINTS information_schema.TABLE_CONSTRAINTS 1
|
||||
TABLE_PRIVILEGES information_schema.TABLE_PRIVILEGES 1
|
||||
TABLE_STATISTICS information_schema.TABLE_STATISTICS 1
|
||||
TRIGGERED_UPDATE_COLUMNS information_schema.TRIGGERED_UPDATE_COLUMNS 1
|
||||
TRIGGERS information_schema.TRIGGERS 1
|
||||
USERS information_schema.USERS 1
|
||||
USER_PRIVILEGES information_schema.USER_PRIVILEGES 1
|
||||
@@ -405,6 +409,7 @@ Database: information_schema
|
||||
| TABLE_CONSTRAINTS |
|
||||
| TABLE_PRIVILEGES |
|
||||
| TABLE_STATISTICS |
|
||||
| TRIGGERED_UPDATE_COLUMNS |
|
||||
| TRIGGERS |
|
||||
| USERS |
|
||||
| USER_PRIVILEGES |
|
||||
@@ -482,6 +487,7 @@ Database: INFORMATION_SCHEMA
|
||||
| TABLE_CONSTRAINTS |
|
||||
| TABLE_PRIVILEGES |
|
||||
| TABLE_STATISTICS |
|
||||
| TRIGGERED_UPDATE_COLUMNS |
|
||||
| TRIGGERS |
|
||||
| USERS |
|
||||
| USER_PRIVILEGES |
|
||||
@@ -495,5 +501,5 @@ Wildcard: inf_rmation_schema
|
||||
| information_schema |
|
||||
SELECT table_schema, count(*) FROM information_schema.TABLES WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test', 'mysqltest') GROUP BY TABLE_SCHEMA;
|
||||
table_schema count(*)
|
||||
information_schema 72
|
||||
information_schema 73
|
||||
mysql 31
|
||||
|
||||
@@ -7,6 +7,7 @@ TABLESPACES
|
||||
TABLE_CONSTRAINTS
|
||||
TABLE_PRIVILEGES
|
||||
TABLE_STATISTICS
|
||||
TRIGGERED_UPDATE_COLUMNS
|
||||
TRIGGERS
|
||||
create database `inf%`;
|
||||
create database mbase;
|
||||
|
||||
@@ -2960,3 +2960,107 @@ DROP TABLE t1, t2;
|
||||
#
|
||||
# End of 11.8 tests
|
||||
#
|
||||
#
|
||||
# MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS table
|
||||
#
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
CREATE TABLE t2 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
# Test BEFORE UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t;
|
||||
a b c
|
||||
10 2 3
|
||||
SELECT * FROM t1;
|
||||
a_old b_old a_new b_new
|
||||
1 2 10 2
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_before_update # CREATE DEFINER=`root`@`localhost` TRIGGER trigger_before_update BEFORE UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_before_update def test t a
|
||||
def test trigger_before_update def test t b
|
||||
# Test AFTER UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
UPDATE t SET a = -10 WHERE a = 10;
|
||||
SELECT * FROM t;
|
||||
a b c
|
||||
-10 2 3
|
||||
SELECT * FROM t2;
|
||||
a_old b_old a_new b_new
|
||||
10 2 -10 2
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_after_update # CREATE DEFINER=`root`@`localhost` TRIGGER trigger_after_update AFTER UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b, NEW.a, NEW.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_after_update def test t a
|
||||
def test trigger_after_update def test t b
|
||||
DROP TABLE t1, t2;
|
||||
# Multiple triggers on same table but on different columns
|
||||
CREATE TABLE t1 (a_old INT, a_new INT);
|
||||
CREATE TABLE t2 (b_old INT, b_new INT);
|
||||
CREATE TABLE t3 (c_old INT, c_new INT);
|
||||
CREATE TRIGGER t_bu1 BEFORE UPDATE OF a ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, NEW.a);
|
||||
CREATE TRIGGER t_bu2 BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.b, NEW.b);
|
||||
CREATE TRIGGER t_au1 AFTER UPDATE OF c ON t FOR EACH ROW INSERT INTO t3 VALUES (OLD.c, NEW.c);
|
||||
SHOW CREATE TRIGGER t_bu1;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
t_bu1 # CREATE DEFINER=`root`@`localhost` TRIGGER t_bu1 BEFORE UPDATE OF a ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, NEW.a) # # # #
|
||||
SHOW CREATE TRIGGER t_bu2;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
t_bu2 # CREATE DEFINER=`root`@`localhost` TRIGGER t_bu2 BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.b, NEW.b) # # # #
|
||||
SHOW CREATE TRIGGER t_au1;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
t_au1 # CREATE DEFINER=`root`@`localhost` TRIGGER t_au1 AFTER UPDATE OF c ON t FOR EACH ROW INSERT INTO t3 VALUES (OLD.c, NEW.c) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME LIKE 't\_%';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu1 def test t a
|
||||
def test t_bu2 def test t b
|
||||
def test t_au1 def test t c
|
||||
DROP TABLE t1, t2, t3, t;
|
||||
# Tests with Multi-update
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
CREATE TABLE t2 (a INT, b INT);
|
||||
# Test Multi-update with BEFORE_UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
UPDATE t, t1 SET t.c = t.c + 10 WHERE t.b = t1.a;
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_before_update # CREATE DEFINER=`root`@`localhost` TRIGGER trigger_before_update BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_before_update def test t b
|
||||
# Test Multi-update with AFTER_UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b);
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_after_update # CREATE DEFINER=`root`@`localhost` TRIGGER trigger_after_update AFTER UPDATE OF a ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_after_update def test t a
|
||||
DROP TABLE t, t1, t2;
|
||||
# Test with normal trigger without list of columns. This should not list any rows in TRIGGERED_UPDATE_COLUMNS
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_before_update # CREATE DEFINER=`root`@`localhost` TRIGGER trigger_before_update BEFORE UPDATE ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
# Trigger on view is not supported in mariadb
|
||||
CREATE VIEW vt AS SELECT * FROM t;
|
||||
CREATE TRIGGER t_on_view BEFORE UPDATE OF a, b ON vt FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
ERROR HY000: 'test.vt' is not of type 'BASE TABLE'
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_on_view';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
DROP VIEW IF EXISTS vt;
|
||||
DROP TABLE t, t1;
|
||||
# End of 12.2 tests
|
||||
|
||||
@@ -3304,3 +3304,103 @@ DROP TABLE t1, t2;
|
||||
--echo #
|
||||
--echo # End of 11.8 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS table
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
CREATE TABLE t2 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
|
||||
--echo # Test BEFORE UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t;
|
||||
SELECT * FROM t1;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
|
||||
--echo # Test AFTER UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
|
||||
UPDATE t SET a = -10 WHERE a = 10;
|
||||
SELECT * FROM t;
|
||||
SELECT * FROM t2;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo # Multiple triggers on same table but on different columns
|
||||
CREATE TABLE t1 (a_old INT, a_new INT);
|
||||
CREATE TABLE t2 (b_old INT, b_new INT);
|
||||
CREATE TABLE t3 (c_old INT, c_new INT);
|
||||
|
||||
CREATE TRIGGER t_bu1 BEFORE UPDATE OF a ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, NEW.a);
|
||||
CREATE TRIGGER t_bu2 BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.b, NEW.b);
|
||||
CREATE TRIGGER t_au1 AFTER UPDATE OF c ON t FOR EACH ROW INSERT INTO t3 VALUES (OLD.c, NEW.c);
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER t_bu1;
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER t_bu2;
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER t_au1;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME LIKE 't\_%';
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t1, t2, t3, t;
|
||||
|
||||
--echo # Tests with Multi-update
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
CREATE TABLE t2 (a INT, b INT);
|
||||
|
||||
--echo # Test Multi-update with BEFORE_UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
UPDATE t, t1 SET t.c = t.c + 10 WHERE t.b = t1.a;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
|
||||
--echo # Test Multi-update with AFTER_UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b);
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t, t1, t2;
|
||||
|
||||
--echo # Test with normal trigger without list of columns. This should not list any rows in TRIGGERED_UPDATE_COLUMNS
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
|
||||
--echo # Trigger on view is not supported in mariadb
|
||||
CREATE VIEW vt AS SELECT * FROM t;
|
||||
--error ER_WRONG_OBJECT
|
||||
CREATE TRIGGER t_on_view BEFORE UPDATE OF a, b ON vt FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_on_view';
|
||||
|
||||
# Cleanup
|
||||
DROP VIEW IF EXISTS vt;
|
||||
DROP TABLE t, t1;
|
||||
|
||||
--echo # End of 12.2 tests
|
||||
|
||||
@@ -622,3 +622,75 @@ DROP TABLE t1;
|
||||
#
|
||||
# End of 11.7 tests
|
||||
#
|
||||
#
|
||||
# MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS
|
||||
# Test privileges. Columns should be show only if the user has non-select
|
||||
# privileges on the trigger updatable columns
|
||||
#
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
CREATE TRIGGER t_bu BEFORE UPDATE OF a, b, c ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t1;
|
||||
a_old b_old a_new b_new
|
||||
1 2 10 2
|
||||
SHOW CREATE TRIGGER t_bu;
|
||||
Trigger t_bu
|
||||
sql_mode #
|
||||
SQL Original Statement CREATE DEFINER=`root`@`localhost` TRIGGER t_bu BEFORE UPDATE OF a, b, c ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b)
|
||||
character_set_client #
|
||||
collation_connection #
|
||||
Database Collation #
|
||||
Created #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
def test t_bu def test t b
|
||||
def test t_bu def test t c
|
||||
CREATE USER user@localhost;
|
||||
GRANT SELECT (a, b, c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT UPDATE (a) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT INSERT (b) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
def test t_bu def test t b
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT REFERENCES (c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
def test t_bu def test t b
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
REVOKE UPDATE (a), INSERT (b), REFERENCES (c) ON t FROM user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT DELETE ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
DROP USER user@localhost;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t;
|
||||
# End of 12.2 tests
|
||||
|
||||
@@ -998,3 +998,86 @@ DROP TABLE t1;
|
||||
--echo #
|
||||
--echo # End of 11.7 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS
|
||||
--echo # Test privileges. Columns should be show only if the user has non-select
|
||||
--echo # privileges on the trigger updatable columns
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
|
||||
CREATE TRIGGER t_bu BEFORE UPDATE OF a, b, c ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t1;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
query_vertical SHOW CREATE TRIGGER t_bu;
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CREATE USER user@localhost;
|
||||
GRANT SELECT (a, b, c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should not show columns
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
GRANT UPDATE (a) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should show only one columns
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
GRANT INSERT (b) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should show only columns- a, b
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
GRANT REFERENCES (c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should show columns- a, b but not c, REFERENCES is unused
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
# revoke all privileges
|
||||
REVOKE UPDATE (a), INSERT (b), REFERENCES (c) ON t FROM user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should not show updatable colums
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
# add DELETE privilege
|
||||
GRANT DELETE ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should not show columns- a, b and c
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
DROP USER user@localhost;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t;
|
||||
|
||||
--echo # End of 12.2 tests
|
||||
|
||||
@@ -98,3 +98,108 @@ SELECT * FROM t1;
|
||||
a b total
|
||||
10 20 30
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS table
|
||||
# Tests for oralce mode
|
||||
#
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
CREATE TABLE t2 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
# Test BEFORE UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t;
|
||||
a b c
|
||||
10 2 3
|
||||
SELECT * FROM t1;
|
||||
a_old b_old a_new b_new
|
||||
1 2 10 2
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_before_update # CREATE DEFINER="root"@"localhost" TRIGGER trigger_before_update BEFORE UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_before_update def test t a
|
||||
def test trigger_before_update def test t b
|
||||
# Test AFTER UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
UPDATE t SET a = -10 WHERE a = 10;
|
||||
SELECT * FROM t;
|
||||
a b c
|
||||
-10 2 3
|
||||
SELECT * FROM t2;
|
||||
a_old b_old a_new b_new
|
||||
10 2 -10 2
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_after_update # CREATE DEFINER="root"@"localhost" TRIGGER trigger_after_update AFTER UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b, NEW.a, NEW.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_after_update def test t a
|
||||
def test trigger_after_update def test t b
|
||||
DROP TABLE t1, t2;
|
||||
# Multiple triggers on same table but on different columns
|
||||
CREATE TABLE t1 (a_old INT, a_new INT);
|
||||
CREATE TABLE t2 (b_old INT, b_new INT);
|
||||
CREATE TABLE t3 (c_old INT, c_new INT);
|
||||
CREATE TRIGGER t_bu1 BEFORE UPDATE OF a ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, NEW.a);
|
||||
CREATE TRIGGER t_bu2 BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.b, NEW.b);
|
||||
CREATE TRIGGER t_au1 AFTER UPDATE OF c ON t FOR EACH ROW INSERT INTO t3 VALUES (OLD.c, NEW.c);
|
||||
SHOW CREATE TRIGGER t_bu1;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
t_bu1 # CREATE DEFINER="root"@"localhost" TRIGGER t_bu1 BEFORE UPDATE OF a ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, NEW.a) # # # #
|
||||
SHOW CREATE TRIGGER t_bu2;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
t_bu2 # CREATE DEFINER="root"@"localhost" TRIGGER t_bu2 BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.b, NEW.b) # # # #
|
||||
SHOW CREATE TRIGGER t_au1;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
t_au1 # CREATE DEFINER="root"@"localhost" TRIGGER t_au1 AFTER UPDATE OF c ON t FOR EACH ROW INSERT INTO t3 VALUES (OLD.c, NEW.c) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME LIKE 't\_%';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu1 def test t a
|
||||
def test t_bu2 def test t b
|
||||
def test t_au1 def test t c
|
||||
DROP TABLE t1, t2, t3, t;
|
||||
# Tests with Multi-update
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
CREATE TABLE t2 (a INT, b INT);
|
||||
# Test Multi-update with BEFORE_UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
UPDATE t, t1 SET t.c = t.c + 10 WHERE t.b = t1.a;
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_before_update # CREATE DEFINER="root"@"localhost" TRIGGER trigger_before_update BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_before_update def test t b
|
||||
# Test Multi-update with AFTER_UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b);
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_after_update # CREATE DEFINER="root"@"localhost" TRIGGER trigger_after_update AFTER UPDATE OF a ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test trigger_after_update def test t a
|
||||
DROP TABLE t, t1, t2;
|
||||
# Test with normal trigger without list of columns. This should not list any rows in TRIGGERED_UPDATE_COLUMNS
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
|
||||
trigger_before_update # CREATE DEFINER="root"@"localhost" TRIGGER trigger_before_update BEFORE UPDATE ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b) # # # #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
# Trigger on view is not supported in mariadb
|
||||
CREATE VIEW vt AS SELECT * FROM t;
|
||||
CREATE TRIGGER t_on_view BEFORE UPDATE OF a, b ON vt FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
ERROR HY000: 'test.vt' is not of type 'BASE TABLE'
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_on_view';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
DROP VIEW IF EXISTS vt;
|
||||
DROP TABLE t, t1;
|
||||
# End of 12.2 tests
|
||||
|
||||
72
mysql-test/suite/compat/oracle/r/trigger_notembedded.result
Normal file
72
mysql-test/suite/compat/oracle/r/trigger_notembedded.result
Normal file
@@ -0,0 +1,72 @@
|
||||
#
|
||||
# MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS
|
||||
# Test privileges. Columns should be show only if the user has non-select
|
||||
# privileges on the trigger updatable columns
|
||||
#
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
CREATE TRIGGER t_bu BEFORE UPDATE OF a, b, c ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t1;
|
||||
a_old b_old a_new b_new
|
||||
1 2 10 2
|
||||
SHOW CREATE TRIGGER t_bu;
|
||||
Trigger t_bu
|
||||
sql_mode #
|
||||
SQL Original Statement CREATE DEFINER=`root`@`localhost` TRIGGER t_bu BEFORE UPDATE OF a, b, c ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b)
|
||||
character_set_client #
|
||||
collation_connection #
|
||||
Database Collation #
|
||||
Created #
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
def test t_bu def test t b
|
||||
def test t_bu def test t c
|
||||
CREATE USER user@localhost;
|
||||
GRANT SELECT (a, b, c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT UPDATE (a) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT INSERT (b) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
def test t_bu def test t b
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT REFERENCES (c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
def test t_bu def test t a
|
||||
def test t_bu def test t b
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
REVOKE UPDATE (a), INSERT (b), REFERENCES (c) ON t FROM user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
GRANT DELETE ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE EVENT_OBJECT_COLUMN
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
DROP USER user@localhost;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t;
|
||||
# End of 12.2 tests
|
||||
@@ -104,3 +104,104 @@ DELIMITER ;$$
|
||||
INSERT INTO t1 (a,b) VALUES (10, 20);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS table
|
||||
--echo # Tests for oralce mode
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
CREATE TABLE t2 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
|
||||
--echo # Test BEFORE UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t;
|
||||
SELECT * FROM t1;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
|
||||
--echo # Test AFTER UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a, b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
|
||||
UPDATE t SET a = -10 WHERE a = 10;
|
||||
SELECT * FROM t;
|
||||
SELECT * FROM t2;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo # Multiple triggers on same table but on different columns
|
||||
CREATE TABLE t1 (a_old INT, a_new INT);
|
||||
CREATE TABLE t2 (b_old INT, b_new INT);
|
||||
CREATE TABLE t3 (c_old INT, c_new INT);
|
||||
|
||||
CREATE TRIGGER t_bu1 BEFORE UPDATE OF a ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, NEW.a);
|
||||
CREATE TRIGGER t_bu2 BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.b, NEW.b);
|
||||
CREATE TRIGGER t_au1 AFTER UPDATE OF c ON t FOR EACH ROW INSERT INTO t3 VALUES (OLD.c, NEW.c);
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER t_bu1;
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER t_bu2;
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER t_au1;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME LIKE 't\_%';
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t1, t2, t3, t;
|
||||
|
||||
--echo # Tests with Multi-update
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
CREATE TABLE t2 (a INT, b INT);
|
||||
|
||||
--echo # Test Multi-update with BEFORE_UPDATE trigger
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE OF b ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
UPDATE t, t1 SET t.c = t.c + 10 WHERE t.b = t1.a;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
|
||||
--echo # Test Multi-update with AFTER_UPDATE trigger
|
||||
CREATE TRIGGER trigger_after_update AFTER UPDATE OF a ON t FOR EACH ROW INSERT INTO t2 VALUES (OLD.a, OLD.b);
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_after_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_after_update';
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t, t1, t2;
|
||||
|
||||
--echo # Test with normal trigger without list of columns. This should not list any rows in TRIGGERED_UPDATE_COLUMNS
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, -3), (2, 3, -4);
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
|
||||
CREATE TRIGGER trigger_before_update BEFORE UPDATE ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
SHOW CREATE TRIGGER trigger_before_update;
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 'trigger_before_update';
|
||||
|
||||
--echo # Trigger on view is not supported in mariadb
|
||||
CREATE VIEW vt AS SELECT * FROM t;
|
||||
--error ER_WRONG_OBJECT
|
||||
CREATE TRIGGER t_on_view BEFORE UPDATE OF a, b ON vt FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b);
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_on_view';
|
||||
|
||||
# Cleanup
|
||||
DROP VIEW IF EXISTS vt;
|
||||
DROP TABLE t, t1;
|
||||
|
||||
--echo # End of 12.2 tests
|
||||
|
||||
85
mysql-test/suite/compat/oracle/t/trigger_notembedded.test
Normal file
85
mysql-test/suite/compat/oracle/t/trigger_notembedded.test
Normal file
@@ -0,0 +1,85 @@
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-36996: Implement INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS
|
||||
--echo # Test privileges. Columns should be show only if the user has non-select
|
||||
--echo # privileges on the trigger updatable columns
|
||||
--echo #
|
||||
|
||||
--source include/not_embedded.inc
|
||||
|
||||
CREATE TABLE t (a INT, b INT, c INT);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
CREATE TABLE t1 (a_old INT, b_old INT, a_new INT, b_new INT);
|
||||
|
||||
CREATE TRIGGER t_bu BEFORE UPDATE OF a, b, c ON t FOR EACH ROW INSERT INTO t1 VALUES (OLD.a, OLD.b, NEW.a, NEW.b);
|
||||
|
||||
UPDATE t SET a = 10 WHERE a = 1;
|
||||
SELECT * FROM t1;
|
||||
|
||||
--replace_column 2 # 4 # 5 # 6 # 7 # 8 #
|
||||
query_vertical SHOW CREATE TRIGGER t_bu;
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CREATE USER user@localhost;
|
||||
GRANT SELECT (a, b, c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should not show columns
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
GRANT UPDATE (a) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should show only one columns
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
GRANT INSERT (b) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should show only columns- a, b
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
GRANT REFERENCES (c) ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should show columns- a, b but not c
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
# revoke all privileges
|
||||
REVOKE UPDATE (a), INSERT (b), REFERENCES (c) ON t FROM user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should not show updatable colums
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
# add DELETE privilege
|
||||
GRANT DELETE ON t TO user@localhost;
|
||||
CONNECT conn1, localhost, user, , test;
|
||||
|
||||
# should not show columns- a, b and c
|
||||
SELECT * FROM INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS WHERE TRIGGER_NAME = 't_bu';
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT conn1;
|
||||
|
||||
DROP USER user@localhost;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t;
|
||||
|
||||
--echo # End of 12.2 tests
|
||||
@@ -550,6 +550,13 @@ def information_schema TABLE_STATISTICS ROWS_READ 3 NULL NO bigint NULL NULL 19
|
||||
def information_schema TABLE_STATISTICS ROWS_UPDATED 7 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL NO NO
|
||||
def information_schema TABLE_STATISTICS TABLE_NAME 2 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) select NEVER NULL NO NO
|
||||
def information_schema TABLE_STATISTICS TABLE_SCHEMA 1 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_CATALOG 4 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_COLUMN 7 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_SCHEMA 5 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_TABLE 6 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_CATALOG 1 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_NAME 3 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA 2 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERS ACTION_CONDITION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8mb3 utf8mb3_general_ci longtext select NEVER NULL NO NO
|
||||
def information_schema TRIGGERS ACTION_ORDER 8 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) select NEVER NULL NO NO
|
||||
def information_schema TRIGGERS ACTION_ORIENTATION 11 NULL NO varchar 9 27 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(9) select NEVER NULL NO NO
|
||||
@@ -1229,6 +1236,13 @@ NULL information_schema TABLE_STATISTICS KEY_READ_HITS bigint NULL NULL NULL NUL
|
||||
NULL information_schema TABLE_STATISTICS KEY_READ_MISSES bigint NULL NULL NULL NULL bigint(21)
|
||||
NULL information_schema TABLE_STATISTICS PAGES_ACCESSED bigint NULL NULL NULL NULL bigint(21)
|
||||
NULL information_schema TABLE_STATISTICS PAGES_READ_FROM_DISK bigint NULL NULL NULL NULL bigint(21)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_CATALOG varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_CATALOG varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_SCHEMA varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_TABLE varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_COLUMN varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERS TRIGGER_CATALOG varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512)
|
||||
3.0000 information_schema TRIGGERS TRIGGER_SCHEMA varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERS TRIGGER_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
|
||||
@@ -483,6 +483,13 @@ def information_schema TABLE_STATISTICS ROWS_READ 3 NULL NO bigint NULL NULL 19
|
||||
def information_schema TABLE_STATISTICS ROWS_UPDATED 7 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL NO NO
|
||||
def information_schema TABLE_STATISTICS TABLE_NAME 2 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) NEVER NULL NO NO
|
||||
def information_schema TABLE_STATISTICS TABLE_SCHEMA 1 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_CATALOG 4 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_COLUMN 7 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_SCHEMA 5 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_TABLE 6 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_CATALOG 1 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_NAME 3 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL NO NO
|
||||
def information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA 2 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL NO NO
|
||||
def information_schema TRIGGERS ACTION_CONDITION 9 NULL YES longtext 4294967295 4294967295 NULL NULL NULL utf8mb3 utf8mb3_general_ci longtext NEVER NULL NO NO
|
||||
def information_schema TRIGGERS ACTION_ORDER 8 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(4) NEVER NULL NO NO
|
||||
def information_schema TRIGGERS ACTION_ORIENTATION 11 NULL NO varchar 9 27 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(9) NEVER NULL NO NO
|
||||
@@ -1094,6 +1101,13 @@ NULL information_schema TABLE_STATISTICS KEY_READ_HITS bigint NULL NULL NULL NUL
|
||||
NULL information_schema TABLE_STATISTICS KEY_READ_MISSES bigint NULL NULL NULL NULL bigint(21)
|
||||
NULL information_schema TABLE_STATISTICS PAGES_ACCESSED bigint NULL NULL NULL NULL bigint(21)
|
||||
NULL information_schema TABLE_STATISTICS PAGES_READ_FROM_DISK bigint NULL NULL NULL NULL bigint(21)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_CATALOG varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_SCHEMA varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS TRIGGER_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_CATALOG varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_SCHEMA varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_TABLE varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERED_UPDATE_COLUMNS EVENT_OBJECT_COLUMN varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERS TRIGGER_CATALOG varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512)
|
||||
3.0000 information_schema TRIGGERS TRIGGER_SCHEMA varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
3.0000 information_schema TRIGGERS TRIGGER_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
|
||||
|
||||
@@ -1139,6 +1139,31 @@ user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERED_UPDATE_COLUMNS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MEMORY
|
||||
VERSION 11
|
||||
ROW_FORMAT Fixed
|
||||
TABLE_ROWS #TBLR#
|
||||
AVG_ROW_LENGTH #ARL#
|
||||
DATA_LENGTH #DL#
|
||||
MAX_DATA_LENGTH #MDL#
|
||||
INDEX_LENGTH #IL#
|
||||
DATA_FREE #DF#
|
||||
AUTO_INCREMENT NULL
|
||||
CREATE_TIME #CRT#
|
||||
UPDATE_TIME #UT#
|
||||
CHECK_TIME #CT#
|
||||
TABLE_COLLATION utf8mb3_general_ci
|
||||
CHECKSUM NULL
|
||||
CREATE_OPTIONS #CO#
|
||||
TABLE_COMMENT #TC#
|
||||
MAX_INDEX_LENGTH #MIL#
|
||||
TEMPORARY Y
|
||||
user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MYISAM_OR_MARIA
|
||||
@@ -2405,6 +2430,31 @@ user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERED_UPDATE_COLUMNS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MEMORY
|
||||
VERSION 11
|
||||
ROW_FORMAT Fixed
|
||||
TABLE_ROWS #TBLR#
|
||||
AVG_ROW_LENGTH #ARL#
|
||||
DATA_LENGTH #DL#
|
||||
MAX_DATA_LENGTH #MDL#
|
||||
INDEX_LENGTH #IL#
|
||||
DATA_FREE #DF#
|
||||
AUTO_INCREMENT NULL
|
||||
CREATE_TIME #CRT#
|
||||
UPDATE_TIME #UT#
|
||||
CHECK_TIME #CT#
|
||||
TABLE_COLLATION utf8mb3_general_ci
|
||||
CHECKSUM NULL
|
||||
CREATE_OPTIONS #CO#
|
||||
TABLE_COMMENT #TC#
|
||||
MAX_INDEX_LENGTH #MIL#
|
||||
TEMPORARY Y
|
||||
user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MYISAM_OR_MARIA
|
||||
|
||||
@@ -1114,6 +1114,31 @@ user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERED_UPDATE_COLUMNS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MEMORY
|
||||
VERSION 11
|
||||
ROW_FORMAT Fixed
|
||||
TABLE_ROWS #TBLR#
|
||||
AVG_ROW_LENGTH #ARL#
|
||||
DATA_LENGTH #DL#
|
||||
MAX_DATA_LENGTH #MDL#
|
||||
INDEX_LENGTH #IL#
|
||||
DATA_FREE #DF#
|
||||
AUTO_INCREMENT NULL
|
||||
CREATE_TIME #CRT#
|
||||
UPDATE_TIME #UT#
|
||||
CHECK_TIME #CT#
|
||||
TABLE_COLLATION utf8mb3_general_ci
|
||||
CHECKSUM NULL
|
||||
CREATE_OPTIONS #CO#
|
||||
TABLE_COMMENT #TC#
|
||||
MAX_INDEX_LENGTH #MIL#
|
||||
TEMPORARY Y
|
||||
user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MYISAM_OR_MARIA
|
||||
@@ -2355,6 +2380,31 @@ user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERED_UPDATE_COLUMNS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MEMORY
|
||||
VERSION 11
|
||||
ROW_FORMAT Fixed
|
||||
TABLE_ROWS #TBLR#
|
||||
AVG_ROW_LENGTH #ARL#
|
||||
DATA_LENGTH #DL#
|
||||
MAX_DATA_LENGTH #MDL#
|
||||
INDEX_LENGTH #IL#
|
||||
DATA_FREE #DF#
|
||||
AUTO_INCREMENT NULL
|
||||
CREATE_TIME #CRT#
|
||||
UPDATE_TIME #UT#
|
||||
CHECK_TIME #CT#
|
||||
TABLE_COLLATION utf8mb3_general_ci
|
||||
CHECKSUM NULL
|
||||
CREATE_OPTIONS #CO#
|
||||
TABLE_COMMENT #TC#
|
||||
MAX_INDEX_LENGTH #MIL#
|
||||
TEMPORARY Y
|
||||
user_comment
|
||||
Separator -----------------------------------------------------
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA information_schema
|
||||
TABLE_NAME TRIGGERS
|
||||
TABLE_TYPE SYSTEM VIEW
|
||||
ENGINE MYISAM_OR_MARIA
|
||||
|
||||
@@ -1106,6 +1106,7 @@ enum enum_schema_tables
|
||||
SCH_TABLE_NAMES,
|
||||
SCH_TABLE_PRIVILEGES,
|
||||
SCH_TRIGGERS,
|
||||
SCH_TRIGGERED_UPDATE_COLUMNS,
|
||||
SCH_USERS,
|
||||
SCH_USER_PRIVILEGES,
|
||||
SCH_VIEWS,
|
||||
|
||||
108
sql/sql_show.cc
108
sql/sql_show.cc
@@ -5657,7 +5657,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
if (fill_schema_table_names(thd, tables, db_name, table_name))
|
||||
continue;
|
||||
}
|
||||
else if (schema_table_idx == SCH_TRIGGERS &&
|
||||
else if ((schema_table_idx == SCH_TRIGGERS ||
|
||||
schema_table_idx == SCH_TRIGGERED_UPDATE_COLUMNS) &&
|
||||
db_name == &INFORMATION_SCHEMA_NAME)
|
||||
{
|
||||
continue;
|
||||
@@ -7852,6 +7853,95 @@ ret:
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
store_triggered_update_columns(THD *thd, TABLE_LIST *tbl,
|
||||
Trigger *trigger, TABLE *table,
|
||||
const LEX_CSTRING *db_name,
|
||||
const LEX_CSTRING *table_name)
|
||||
{
|
||||
bool error= 0;
|
||||
CHARSET_INFO *cs= system_charset_info;
|
||||
char definer_holder[USER_HOST_BUFF_SIZE];
|
||||
LEX_STRING definer_buffer;
|
||||
LEX_CSTRING trigger_stmt, trigger_body;
|
||||
definer_buffer.str= definer_holder;
|
||||
trigger->get_trigger_info(&trigger_stmt, &trigger_body, &definer_buffer);
|
||||
List_iterator_fast<LEX_CSTRING> it(*trigger->updatable_columns);
|
||||
|
||||
/*
|
||||
For TRIGGERED_UPDATE_COLUMNS table, the SQL standard requires the user to
|
||||
have any non-SELECT privilege on the column and no table level privilege
|
||||
is necessary.
|
||||
*/
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
bool need_column_checks=
|
||||
!get_schema_privileges_for_show(thd, tbl, (INSERT_ACL|UPDATE_ACL), false);
|
||||
#endif
|
||||
|
||||
restore_record(table, s->default_values);
|
||||
while(LEX_CSTRING *trigger_column= it++)
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (need_column_checks)
|
||||
{
|
||||
Lex_ident_column col(*trigger_column);
|
||||
ulonglong col_access=
|
||||
get_column_grant(thd, &tbl->grant, db_name->str, table_name->str, col) &
|
||||
(INSERT_ACL | UPDATE_ACL); // non-SELECT privilege on the column
|
||||
if (!col_access)
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
table->field[0]->store(STRING_WITH_LEN("def"), cs);
|
||||
table->field[1]->store(db_name->str, db_name->length, cs);
|
||||
table->field[2]->store(trigger->name.str, trigger->name.length, cs);
|
||||
table->field[3]->store(STRING_WITH_LEN("def"), cs);
|
||||
table->field[4]->store(db_name->str, db_name->length, cs);
|
||||
table->field[5]->store(table_name->str, table_name->length, cs);
|
||||
table->field[6]->store(trigger_column->str, trigger_column->length, cs);
|
||||
|
||||
if (schema_table_store_record(thd, table))
|
||||
{
|
||||
error= 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
get_schema_triggered_update_columns_record(THD *thd, TABLE_LIST *tables,
|
||||
TABLE *table, bool res,
|
||||
const LEX_CSTRING *db_name,
|
||||
const LEX_CSTRING *table_name)
|
||||
{
|
||||
DBUG_ENTER("get_schema_triggered_updatable_columns_record");
|
||||
if (!tables->view && tables->table->triggers)
|
||||
{
|
||||
Table_triggers_list *triggers= tables->table->triggers;
|
||||
int timing;
|
||||
|
||||
for (timing= 0; timing < (int)TRG_ACTION_MAX; timing++)
|
||||
{
|
||||
Trigger *trigger;
|
||||
for (trigger= triggers->
|
||||
get_trigger(TRG_EVENT_UPDATE, (enum trg_action_time_type) timing);
|
||||
trigger;
|
||||
trigger= trigger->next[TRG_EVENT_UPDATE])
|
||||
{
|
||||
if (trigger->updatable_columns &&
|
||||
store_triggered_update_columns(thd, tables, trigger,
|
||||
table, db_name, table_name))
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
static int
|
||||
store_key_column_usage(TABLE *table, const LEX_CSTRING &db_name,
|
||||
const LEX_CSTRING &table_name,
|
||||
@@ -10709,6 +10799,18 @@ ST_FIELD_INFO check_constraints_fields_info[]=
|
||||
CEnd()
|
||||
};
|
||||
|
||||
ST_FIELD_INFO triggered_update_columns_info[]=
|
||||
{
|
||||
Column("TRIGGER_CATALOG", Catalog(), NOT_NULL, OPEN_FRM_ONLY),
|
||||
Column("TRIGGER_SCHEMA", Name(), NOT_NULL, OPEN_FRM_ONLY),
|
||||
Column("TRIGGER_NAME", Name(), NOT_NULL, "Trigger", OPEN_FRM_ONLY),
|
||||
Column("EVENT_OBJECT_CATALOG", Catalog(), NOT_NULL, OPEN_FRM_ONLY),
|
||||
Column("EVENT_OBJECT_SCHEMA", Name(), NOT_NULL, OPEN_FRM_ONLY),
|
||||
Column("EVENT_OBJECT_TABLE", Name(), NOT_NULL, "Table", OPEN_FRM_ONLY),
|
||||
Column("EVENT_OBJECT_COLUMN", Name(), NOT_NULL, "Column", OPEN_FRM_ONLY),
|
||||
CEnd()
|
||||
};
|
||||
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
ST_FIELD_INFO slave_status_info[]=
|
||||
@@ -10923,6 +11025,10 @@ ST_SCHEMA_TABLE schema_tables[]=
|
||||
{"TRIGGERS"_Lex_ident_i_s_table, Show::triggers_fields_info, 0,
|
||||
get_all_tables, make_old_format, get_schema_triggers_record, 5, 6, 0,
|
||||
OPEN_TRIGGER_ONLY|OPTIMIZE_I_S_TABLE},
|
||||
{"TRIGGERED_UPDATE_COLUMNS"_Lex_ident_i_s_table,
|
||||
Show::triggered_update_columns_info, 0, get_all_tables, 0,
|
||||
get_schema_triggered_update_columns_record, 4, 5, 0,
|
||||
OPEN_TRIGGER_ONLY|OPTIMIZE_I_S_TABLE},
|
||||
{"USERS"_Lex_ident_i_s_table, Show::users_fields_info, 0, fill_users_schema_table,
|
||||
0, 0, -1, -1, 0, 0},
|
||||
{"USER_PRIVILEGES"_Lex_ident_i_s_table,
|
||||
|
||||
Reference in New Issue
Block a user