1
0
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:
Raghunandan Bhat
2025-08-06 11:04:47 +05:30
committed by Raghunandan Bhat
parent b10e209d16
commit 9057f741d7
19 changed files with 977 additions and 2 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,6 +7,7 @@ TABLESPACES
TABLE_CONSTRAINTS
TABLE_PRIVILEGES
TABLE_STATISTICS
TRIGGERED_UPDATE_COLUMNS
TRIGGERS
create database `inf%`;
create database mbase;

View File

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

View File

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

View File

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

View File

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

View File

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

View 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

View File

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

View 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

View File

@@ -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)

View File

@@ -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)

View File

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

View File

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

View File

@@ -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,

View File

@@ -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,