Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
b141437a
Commit
b141437a
authored
Jul 19, 2005
by
dlenev@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/dlenev/src/mysql-5.0-tn
parents
ec15dda2
8a3e723b
Changes
25
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
644 additions
and
130 deletions
+644
-130
mysql-test/r/information_schema.result
mysql-test/r/information_schema.result
+75
-2
mysql-test/r/information_schema_db.result
mysql-test/r/information_schema_db.result
+2
-0
mysql-test/r/rpl_sp.result
mysql-test/r/rpl_sp.result
+2
-2
mysql-test/r/trigger.result
mysql-test/r/trigger.result
+34
-19
mysql-test/r/view.result
mysql-test/r/view.result
+1
-1
mysql-test/t/information_schema.test
mysql-test/t/information_schema.test
+35
-0
mysql-test/t/rpl_sp.test
mysql-test/t/rpl_sp.test
+1
-1
mysql-test/t/trigger.test
mysql-test/t/trigger.test
+39
-20
mysql-test/t/view.test
mysql-test/t/view.test
+1
-1
sql/handler.cc
sql/handler.cc
+1
-0
sql/item.h
sql/item.h
+2
-2
sql/lex.h
sql/lex.h
+1
-0
sql/mysql_priv.h
sql/mysql_priv.h
+1
-0
sql/mysqld.cc
sql/mysqld.cc
+1
-0
sql/share/errmsg.txt
sql/share/errmsg.txt
+2
-0
sql/sp.cc
sql/sp.cc
+2
-2
sql/sql_base.cc
sql/sql_base.cc
+1
-1
sql/sql_lex.h
sql/sql_lex.h
+1
-0
sql/sql_parse.cc
sql/sql_parse.cc
+1
-0
sql/sql_show.cc
sql/sql_show.cc
+94
-0
sql/sql_table.cc
sql/sql_table.cc
+4
-10
sql/sql_trigger.cc
sql/sql_trigger.cc
+316
-51
sql/sql_trigger.h
sql/sql_trigger.h
+9
-2
sql/sql_yacc.yy
sql/sql_yacc.yy
+17
-15
sql/table.h
sql/table.h
+1
-1
No files found.
mysql-test/r/information_schema.result
View file @
b141437a
...
@@ -48,6 +48,7 @@ TABLE_PRIVILEGES
...
@@ -48,6 +48,7 @@ TABLE_PRIVILEGES
COLUMN_PRIVILEGES
COLUMN_PRIVILEGES
TABLE_CONSTRAINTS
TABLE_CONSTRAINTS
KEY_COLUMN_USAGE
KEY_COLUMN_USAGE
TRIGGERS
columns_priv
columns_priv
db
db
func
func
...
@@ -77,6 +78,7 @@ c table_name
...
@@ -77,6 +78,7 @@ c table_name
TABLES TABLES
TABLES TABLES
TABLE_PRIVILEGES TABLE_PRIVILEGES
TABLE_PRIVILEGES TABLE_PRIVILEGES
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
TRIGGERS TRIGGERS
tables_priv tables_priv
tables_priv tables_priv
time_zone time_zone
time_zone time_zone
time_zone_leap_second time_zone_leap_second
time_zone_leap_second time_zone_leap_second
...
@@ -94,6 +96,7 @@ c table_name
...
@@ -94,6 +96,7 @@ c table_name
TABLES TABLES
TABLES TABLES
TABLE_PRIVILEGES TABLE_PRIVILEGES
TABLE_PRIVILEGES TABLE_PRIVILEGES
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
TRIGGERS TRIGGERS
tables_priv tables_priv
tables_priv tables_priv
time_zone time_zone
time_zone time_zone
time_zone_leap_second time_zone_leap_second
time_zone_leap_second time_zone_leap_second
...
@@ -111,6 +114,7 @@ c table_name
...
@@ -111,6 +114,7 @@ c table_name
TABLES TABLES
TABLES TABLES
TABLE_PRIVILEGES TABLE_PRIVILEGES
TABLE_PRIVILEGES TABLE_PRIVILEGES
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
TABLE_CONSTRAINTS TABLE_CONSTRAINTS
TRIGGERS TRIGGERS
tables_priv tables_priv
tables_priv tables_priv
time_zone time_zone
time_zone time_zone
time_zone_leap_second time_zone_leap_second
time_zone_leap_second time_zone_leap_second
...
@@ -580,6 +584,7 @@ Tables_in_information_schema (T%)
...
@@ -580,6 +584,7 @@ Tables_in_information_schema (T%)
TABLES
TABLES
TABLE_PRIVILEGES
TABLE_PRIVILEGES
TABLE_CONSTRAINTS
TABLE_CONSTRAINTS
TRIGGERS
create database information_schema;
create database information_schema;
ERROR HY000: Can't create database 'information_schema'; database exists
ERROR HY000: Can't create database 'information_schema'; database exists
use information_schema;
use information_schema;
...
@@ -588,6 +593,7 @@ Tables_in_information_schema (T%) Table_type
...
@@ -588,6 +593,7 @@ Tables_in_information_schema (T%) Table_type
TABLES TEMPORARY
TABLES TEMPORARY
TABLE_PRIVILEGES TEMPORARY
TABLE_PRIVILEGES TEMPORARY
TABLE_CONSTRAINTS TEMPORARY
TABLE_CONSTRAINTS TEMPORARY
TRIGGERS TEMPORARY
create table t1(a int);
create table t1(a int);
ERROR 42S02: Unknown table 't1' in information_schema
ERROR 42S02: Unknown table 't1' in information_schema
use test;
use test;
...
@@ -599,6 +605,7 @@ Tables_in_information_schema (T%)
...
@@ -599,6 +605,7 @@ Tables_in_information_schema (T%)
TABLES
TABLES
TABLE_PRIVILEGES
TABLE_PRIVILEGES
TABLE_CONSTRAINTS
TABLE_CONSTRAINTS
TRIGGERS
select table_name from tables where table_name='user';
select table_name from tables where table_name='user';
table_name
table_name
user
user
...
@@ -693,7 +700,7 @@ CREATE TABLE t_crashme ( f1 BIGINT);
...
@@ -693,7 +700,7 @@ CREATE TABLE t_crashme ( f1 BIGINT);
CREATE VIEW a1 (t_CRASHME) AS SELECT f1 FROM t_crashme GROUP BY f1;
CREATE VIEW a1 (t_CRASHME) AS SELECT f1 FROM t_crashme GROUP BY f1;
CREATE VIEW a2 AS SELECT t_CRASHME FROM a1;
CREATE VIEW a2 AS SELECT t_CRASHME FROM a1;
count(*)
count(*)
10
0
10
1
drop view a2, a1;
drop view a2, a1;
drop table t_crashme;
drop table t_crashme;
select table_schema,table_name, column_name from
select table_schema,table_name, column_name from
...
@@ -704,6 +711,8 @@ information_schema COLUMNS COLUMN_TYPE
...
@@ -704,6 +711,8 @@ information_schema COLUMNS COLUMN_TYPE
information_schema ROUTINES ROUTINE_DEFINITION
information_schema ROUTINES ROUTINE_DEFINITION
information_schema ROUTINES SQL_MODE
information_schema ROUTINES SQL_MODE
information_schema VIEWS VIEW_DEFINITION
information_schema VIEWS VIEW_DEFINITION
information_schema TRIGGERS ACTION_CONDITION
information_schema TRIGGERS ACTION_STATEMENT
select table_name, column_name, data_type from information_schema.columns
select table_name, column_name, data_type from information_schema.columns
where data_type = 'datetime';
where data_type = 'datetime';
table_name column_name data_type
table_name column_name data_type
...
@@ -712,6 +721,7 @@ TABLES UPDATE_TIME datetime
...
@@ -712,6 +721,7 @@ TABLES UPDATE_TIME datetime
TABLES CHECK_TIME datetime
TABLES CHECK_TIME datetime
ROUTINES CREATED datetime
ROUTINES CREATED datetime
ROUTINES LAST_ALTERED datetime
ROUTINES LAST_ALTERED datetime
TRIGGERS CREATED datetime
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES A
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES A
WHERE NOT EXISTS
WHERE NOT EXISTS
(SELECT * FROM INFORMATION_SCHEMA.COLUMNS B
(SELECT * FROM INFORMATION_SCHEMA.COLUMNS B
...
@@ -758,8 +768,71 @@ delete from mysql.db where user='mysqltest_4';
...
@@ -758,8 +768,71 @@ delete from mysql.db where user='mysqltest_4';
flush privileges;
flush privileges;
SELECT table_schema, count(*) FROM information_schema.TABLES GROUP BY TABLE_SCHEMA;
SELECT table_schema, count(*) FROM information_schema.TABLES GROUP BY TABLE_SCHEMA;
table_schema count(*)
table_schema count(*)
information_schema 1
5
information_schema 1
6
mysql 17
mysql 17
create table t1 (i int, j int);
create trigger trg1 before insert on t1 for each row
begin
if new.j > 10 then
set new.j := 10;
end if;
end|
create trigger trg2 before update on t1 for each row
begin
if old.i % 2 = 0 then
set new.j := -1;
end if;
end|
create trigger trg3 after update on t1 for each row
begin
if new.j = -1 then
set @fired:= "Yes";
end if;
end|
show triggers;
Trigger Event Table Statement Timing Created
trg1 INSERT t1
begin
if new.j > 10 then
set new.j := 10;
end if;
end BEFORE NULL
trg2 UPDATE t1
begin
if old.i % 2 = 0 then
set new.j := -1;
end if;
end BEFORE NULL
trg3 UPDATE t1
begin
if new.j = -1 then
set @fired:= "Yes";
end if;
end AFTER NULL
select * from information_schema.triggers;
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED
NULL test trg1 INSERT NULL test t1 0 NULL
begin
if new.j > 10 then
set new.j := 10;
end if;
end ROW BEFORE NULL NULL OLD NEW NULL
NULL test trg2 UPDATE NULL test t1 0 NULL
begin
if old.i % 2 = 0 then
set new.j := -1;
end if;
end ROW BEFORE NULL NULL OLD NEW NULL
NULL test trg3 UPDATE NULL test t1 0 NULL
begin
if new.j = -1 then
set @fired:= "Yes";
end if;
end ROW AFTER NULL NULL OLD NEW NULL
drop trigger trg1;
drop trigger trg2;
drop trigger trg3;
drop table t1;
create database mysqltest;
create database mysqltest;
create table mysqltest.t1 (f1 int, f2 int);
create table mysqltest.t1 (f1 int, f2 int);
create table mysqltest.t2 (f1 int);
create table mysqltest.t2 (f1 int);
...
...
mysql-test/r/information_schema_db.result
View file @
b141437a
...
@@ -16,11 +16,13 @@ TABLE_PRIVILEGES
...
@@ -16,11 +16,13 @@ TABLE_PRIVILEGES
COLUMN_PRIVILEGES
COLUMN_PRIVILEGES
TABLE_CONSTRAINTS
TABLE_CONSTRAINTS
KEY_COLUMN_USAGE
KEY_COLUMN_USAGE
TRIGGERS
show tables from INFORMATION_SCHEMA like 'T%';
show tables from INFORMATION_SCHEMA like 'T%';
Tables_in_information_schema (T%)
Tables_in_information_schema (T%)
TABLES
TABLES
TABLE_PRIVILEGES
TABLE_PRIVILEGES
TABLE_CONSTRAINTS
TABLE_CONSTRAINTS
TRIGGERS
create database `inf%`;
create database `inf%`;
use `inf%`;
use `inf%`;
show tables;
show tables;
...
...
mysql-test/r/rpl_sp.result
View file @
b141437a
...
@@ -237,7 +237,7 @@ select * from t1;
...
@@ -237,7 +237,7 @@ select * from t1;
a
a
10
10
delete from t1;
delete from t1;
drop trigger t
1.t
rg;
drop trigger trg;
insert into t1 values (1);
insert into t1 values (1);
select * from t1;
select * from t1;
a
a
...
@@ -248,7 +248,7 @@ master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
...
@@ -248,7 +248,7 @@ master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
master-bin.000002 # Query 1 # use `mysqltest1`; create trigger trg before insert on t1 for each row set new.a= 10
master-bin.000002 # Query 1 # use `mysqltest1`; create trigger trg before insert on t1 for each row set new.a= 10
master-bin.000002 # Query 1 # use `mysqltest1`; insert into t1 values (1)
master-bin.000002 # Query 1 # use `mysqltest1`; insert into t1 values (1)
master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
master-bin.000002 # Query 1 # use `mysqltest1`; drop trigger t
1.t
rg
master-bin.000002 # Query 1 # use `mysqltest1`; drop trigger trg
master-bin.000002 # Query 1 # use `mysqltest1`; insert into t1 values (1)
master-bin.000002 # Query 1 # use `mysqltest1`; insert into t1 values (1)
select * from t1;
select * from t1;
a
a
...
...
mysql-test/r/trigger.result
View file @
b141437a
...
@@ -12,13 +12,13 @@ insert into t1 values (1);
...
@@ -12,13 +12,13 @@ insert into t1 values (1);
select @a;
select @a;
@a
@a
1
1
drop trigger t
1.t
rg;
drop trigger trg;
create trigger trg before insert on t1 for each row set @a:=new.i;
create trigger trg before insert on t1 for each row set @a:=new.i;
insert into t1 values (123);
insert into t1 values (123);
select @a;
select @a;
@a
@a
123
123
drop trigger t
1.t
rg;
drop trigger trg;
drop table t1;
drop table t1;
create table t1 (i int not null, j int);
create table t1 (i int not null, j int);
create trigger trg before insert on t1 for each row
create trigger trg before insert on t1 for each row
...
@@ -33,7 +33,7 @@ select * from t1|
...
@@ -33,7 +33,7 @@ select * from t1|
i j
i j
1 10
1 10
2 3
2 3
drop trigger t
1.t
rg|
drop trigger trg|
drop table t1|
drop table t1|
create table t1 (i int not null primary key);
create table t1 (i int not null primary key);
create trigger trg after insert on t1 for each row
create trigger trg after insert on t1 for each row
...
@@ -43,7 +43,7 @@ insert into t1 values (2),(3),(4),(5);
...
@@ -43,7 +43,7 @@ insert into t1 values (2),(3),(4),(5);
select @a;
select @a;
@a
@a
2:3:4:5
2:3:4:5
drop trigger t
1.t
rg;
drop trigger trg;
drop table t1;
drop table t1;
create table t1 (aid int not null primary key, balance int not null default 0);
create table t1 (aid int not null primary key, balance int not null default 0);
insert into t1 values (1, 1000), (2,3000);
insert into t1 values (1, 1000), (2,3000);
...
@@ -65,7 +65,7 @@ Too big change for aid = 2
...
@@ -65,7 +65,7 @@ Too big change for aid = 2
aid balance
aid balance
1 1500
1 1500
2 3000
2 3000
drop trigger t
1.t
rg|
drop trigger trg|
drop table t1|
drop table t1|
create table t1 (i int);
create table t1 (i int);
insert into t1 values (1),(2),(3),(4);
insert into t1 values (1),(2),(3),(4);
...
@@ -76,7 +76,7 @@ update t1 set i=3;
...
@@ -76,7 +76,7 @@ update t1 set i=3;
select @total_change;
select @total_change;
@total_change
@total_change
2
2
drop trigger t
1.t
rg;
drop trigger trg;
drop table t1;
drop table t1;
create table t1 (i int);
create table t1 (i int);
insert into t1 values (1),(2),(3),(4);
insert into t1 values (1),(2),(3),(4);
...
@@ -87,7 +87,7 @@ delete from t1 where i <= 3;
...
@@ -87,7 +87,7 @@ delete from t1 where i <= 3;
select @del_sum;
select @del_sum;
@del_sum
@del_sum
6
6
drop trigger t
1.t
rg;
drop trigger trg;
drop table t1;
drop table t1;
create table t1 (i int);
create table t1 (i int);
insert into t1 values (1),(2),(3),(4);
insert into t1 values (1),(2),(3),(4);
...
@@ -97,7 +97,7 @@ delete from t1 where i <> 0;
...
@@ -97,7 +97,7 @@ delete from t1 where i <> 0;
select @del;
select @del;
@del
@del
1
1
drop trigger t
1.t
rg;
drop trigger trg;
drop table t1;
drop table t1;
create table t1 (i int, j int);
create table t1 (i int, j int);
create trigger trg1 before insert on t1 for each row
create trigger trg1 before insert on t1 for each row
...
@@ -137,9 +137,9 @@ i j
...
@@ -137,9 +137,9 @@ i j
1 20
1 20
2 -1
2 -1
3 20
3 20
drop trigger t
1.t
rg1;
drop trigger trg1;
drop trigger t
1.t
rg2;
drop trigger trg2;
drop trigger t
1.t
rg3;
drop trigger trg3;
drop table t1;
drop table t1;
create table t1 (id int not null primary key, data int);
create table t1 (id int not null primary key, data int);
create trigger t1_bi before insert on t1 for each row
create trigger t1_bi before insert on t1 for each row
...
@@ -197,7 +197,7 @@ select * from t2;
...
@@ -197,7 +197,7 @@ select * from t2;
event
event
INSERT INTO t1 id=1 data='one'
INSERT INTO t1 id=1 data='one'
INSERT INTO t1 id=2 data='two'
INSERT INTO t1 id=2 data='two'
drop trigger t1
.t1
_ai;
drop trigger t1_ai;
create trigger t1_bi before insert on t1 for each row
create trigger t1_bi before insert on t1 for each row
begin
begin
if exists (select id from t3 where id=new.fk) then
if exists (select id from t3 where id=new.fk) then
...
@@ -271,6 +271,7 @@ id copy
...
@@ -271,6 +271,7 @@ id copy
3 NULL
3 NULL
drop table t1, t2;
drop table t1, t2;
create table t1 (i int);
create table t1 (i int);
create table t3 (i int);
create trigger trg before insert on t1 for each row set @a:= old.i;
create trigger trg before insert on t1 for each row set @a:= old.i;
ERROR HY000: There is no OLD row in on INSERT trigger
ERROR HY000: There is no OLD row in on INSERT trigger
create trigger trg before delete on t1 for each row set @a:= new.i;
create trigger trg before delete on t1 for each row set @a:= new.i;
...
@@ -292,14 +293,19 @@ create trigger trg after insert on t1 for each row set @a:=1;
...
@@ -292,14 +293,19 @@ create trigger trg after insert on t1 for each row set @a:=1;
ERROR HY000: Trigger already exists
ERROR HY000: Trigger already exists
create trigger trg2 before insert on t1 for each row set @a:=1;
create trigger trg2 before insert on t1 for each row set @a:=1;
ERROR HY000: Trigger already exists
ERROR HY000: Trigger already exists
drop trigger t1.trg;
create trigger trg before insert on t3 for each row set @a:=1;
drop trigger t1.trg;
ERROR HY000: Trigger already exists
create trigger trg2 before insert on t3 for each row set @a:=1;
drop trigger trg2;
drop trigger trg;
drop trigger trg;
ERROR HY000: Trigger does not exist
ERROR HY000: Trigger does not exist
create view v1 as select * from t1;
create view v1 as select * from t1;
create trigger trg before insert on v1 for each row set @a:=1;
create trigger trg before insert on v1 for each row set @a:=1;
ERROR HY000: 'test.v1' is not BASE TABLE
ERROR HY000: 'test.v1' is not BASE TABLE
drop view v1;
drop view v1;
drop table t1;
drop table t1;
drop table t3;
create temporary table t1 (i int);
create temporary table t1 (i int);
create trigger trg before insert on t1 for each row set @a:=1;
create trigger trg before insert on t1 for each row set @a:=1;
ERROR HY000: Trigger's 't1' is view or temporary table
ERROR HY000: Trigger's 't1' is view or temporary table
...
@@ -307,7 +313,7 @@ drop table t1;
...
@@ -307,7 +313,7 @@ drop table t1;
create table t1 (x1col char);
create table t1 (x1col char);
create trigger tx1 before insert on t1 for each row set new.x1col = 'x';
create trigger tx1 before insert on t1 for each row set new.x1col = 'x';
insert into t1 values ('y');
insert into t1 values ('y');
drop trigger t
1.t
x1;
drop trigger tx1;
drop table t1;
drop table t1;
create table t1 (i int) engine=myisam;
create table t1 (i int) engine=myisam;
insert into t1 values (1), (2);
insert into t1 values (1), (2);
...
@@ -318,8 +324,8 @@ delete from t1;
...
@@ -318,8 +324,8 @@ delete from t1;
select @del_before, @del_after;
select @del_before, @del_after;
@del_before @del_after
@del_before @del_after
3 3
3 3
drop trigger t
1.t
rg1;
drop trigger trg1;
drop trigger t
1.t
rg2;
drop trigger trg2;
drop table t1;
drop table t1;
create table t1 (a int);
create table t1 (a int);
create trigger trg1 before insert on t1 for each row set new.a= 10;
create trigger trg1 before insert on t1 for each row set new.a= 10;
...
@@ -336,6 +342,15 @@ create table t1 (i int);
...
@@ -336,6 +342,15 @@ create table t1 (i int);
create trigger trg1 before insert on t1 for each row set @a:= 1;
create trigger trg1 before insert on t1 for each row set @a:= 1;
drop database mysqltest;
drop database mysqltest;
use test;
use test;
create database mysqltest;
create table mysqltest.t1 (i int);
create trigger trg1 before insert on mysqltest.t1 for each row set @a:= 1;
ERROR HY000: Trigger in wrong schema
use mysqltest;
create trigger test.trg1 before insert on t1 for each row set @a:= 1;
ERROR HY000: Trigger in wrong schema
drop database mysqltest;
use test;
create table t1 (i int, j int default 10, k int not null, key (k));
create table t1 (i int, j int default 10, k int not null, key (k));
create table t2 (i int);
create table t2 (i int);
insert into t1 (i, k) values (1, 1);
insert into t1 (i, k) values (1, 1);
...
@@ -549,7 +564,7 @@ i k
...
@@ -549,7 +564,7 @@ i k
1 1
1 1
2 2
2 2
alter table t1 add primary key (i);
alter table t1 add primary key (i);
drop trigger
t1.
bi;
drop trigger bi;
insert into t1 values (2, 4) on duplicate key update k= k + 10;
insert into t1 values (2, 4) on duplicate key update k= k + 10;
ERROR 42S22: Unknown column 'bt' in 'NEW'
ERROR 42S22: Unknown column 'bt' in 'NEW'
select * from t1;
select * from t1;
...
@@ -578,5 +593,5 @@ create trigger t1_bu before update on t1 for each row set new.col1= bug5893();
...
@@ -578,5 +593,5 @@ create trigger t1_bu before update on t1 for each row set new.col1= bug5893();
drop function bug5893;
drop function bug5893;
update t1 set col2 = 4;
update t1 set col2 = 4;
ERROR 42000: FUNCTION test.bug5893 does not exist
ERROR 42000: FUNCTION test.bug5893 does not exist
drop trigger t1
.t1
_bu;
drop trigger t1_bu;
drop table t1;
drop table t1;
mysql-test/r/view.result
View file @
b141437a
...
@@ -1245,7 +1245,7 @@ select * from v1;
...
@@ -1245,7 +1245,7 @@ select * from v1;
s1
s1
select * from t1;
select * from t1;
s1
s1
drop trigger t1
.t1
_bi;
drop trigger t1_bi;
drop view v1;
drop view v1;
drop table t1;
drop table t1;
create table t1 (s1 tinyint);
create table t1 (s1 tinyint);
...
...
mysql-test/t/information_schema.test
View file @
b141437a
...
@@ -507,6 +507,41 @@ flush privileges;
...
@@ -507,6 +507,41 @@ flush privileges;
#
#
SELECT
table_schema
,
count
(
*
)
FROM
information_schema
.
TABLES
GROUP
BY
TABLE_SCHEMA
;
SELECT
table_schema
,
count
(
*
)
FROM
information_schema
.
TABLES
GROUP
BY
TABLE_SCHEMA
;
#
# TRIGGERS table test
#
create
table
t1
(
i
int
,
j
int
);
delimiter
|
;
create
trigger
trg1
before
insert
on
t1
for
each
row
begin
if
new
.
j
>
10
then
set
new
.
j
:=
10
;
end
if
;
end
|
create
trigger
trg2
before
update
on
t1
for
each
row
begin
if
old
.
i
%
2
=
0
then
set
new
.
j
:=
-
1
;
end
if
;
end
|
create
trigger
trg3
after
update
on
t1
for
each
row
begin
if
new
.
j
=
-
1
then
set
@
fired
:=
"Yes"
;
end
if
;
end
|
delimiter
;
|
show
triggers
;
select
*
from
information_schema
.
triggers
;
drop
trigger
trg1
;
drop
trigger
trg2
;
drop
trigger
trg3
;
drop
table
t1
;
#
#
# Bug #10964 Information Schema:Authorization check on privilege tables is improper
# Bug #10964 Information Schema:Authorization check on privilege tables is improper
#
#
...
...
mysql-test/t/rpl_sp.test
View file @
b141437a
...
@@ -249,7 +249,7 @@ select * from t1;
...
@@ -249,7 +249,7 @@ select * from t1;
connection
master
;
connection
master
;
delete
from
t1
;
delete
from
t1
;
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
insert
into
t1
values
(
1
);
insert
into
t1
values
(
1
);
select
*
from
t1
;
select
*
from
t1
;
--
replace_column
2
# 5 #
--
replace_column
2
# 5 #
...
...
mysql-test/t/trigger.test
View file @
b141437a
...
@@ -17,13 +17,13 @@ set @a:=0;
...
@@ -17,13 +17,13 @@ set @a:=0;
select
@
a
;
select
@
a
;
insert
into
t1
values
(
1
);
insert
into
t1
values
(
1
);
select
@
a
;
select
@
a
;
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
# let us test simple trigger reading some values
# let us test simple trigger reading some values
create
trigger
trg
before
insert
on
t1
for
each
row
set
@
a
:=
new
.
i
;
create
trigger
trg
before
insert
on
t1
for
each
row
set
@
a
:=
new
.
i
;
insert
into
t1
values
(
123
);
insert
into
t1
values
(
123
);
select
@
a
;
select
@
a
;
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
drop
table
t1
;
drop
table
t1
;
...
@@ -40,7 +40,7 @@ end|
...
@@ -40,7 +40,7 @@ end|
insert
into
t1
(
i
)
values
(
1
)
|
insert
into
t1
(
i
)
values
(
1
)
|
insert
into
t1
(
i
,
j
)
values
(
2
,
3
)
|
insert
into
t1
(
i
,
j
)
values
(
2
,
3
)
|
select
*
from
t1
|
select
*
from
t1
|
drop
trigger
t
1
.
t
rg
|
drop
trigger
trg
|
drop
table
t1
|
drop
table
t1
|
delimiter
;
|
delimiter
;
|
...
@@ -52,7 +52,7 @@ create trigger trg after insert on t1 for each row
...
@@ -52,7 +52,7 @@ create trigger trg after insert on t1 for each row
set
@
a
:=
""
;
set
@
a
:=
""
;
insert
into
t1
values
(
2
),(
3
),(
4
),(
5
);
insert
into
t1
values
(
2
),(
3
),(
4
),(
5
);
select
@
a
;
select
@
a
;
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
drop
table
t1
;
drop
table
t1
;
# PS doesn't work with multi-row statements
# PS doesn't work with multi-row statements
...
@@ -75,7 +75,7 @@ set @update_failed:=""|
...
@@ -75,7 +75,7 @@ set @update_failed:=""|
update
t1
set
balance
=
1500
|
update
t1
set
balance
=
1500
|
select
@
update_failed
;
select
@
update_failed
;
select
*
from
t1
|
select
*
from
t1
|
drop
trigger
t
1
.
t
rg
|
drop
trigger
trg
|
drop
table
t1
|
drop
table
t1
|
delimiter
;
|
delimiter
;
|
--
enable_ps_protocol
--
enable_ps_protocol
...
@@ -88,7 +88,7 @@ create trigger trg after update on t1 for each row
...
@@ -88,7 +88,7 @@ create trigger trg after update on t1 for each row
set
@
total_change
:=
0
;
set
@
total_change
:=
0
;
update
t1
set
i
=
3
;
update
t1
set
i
=
3
;
select
@
total_change
;
select
@
total_change
;
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
drop
table
t1
;
drop
table
t1
;
# Before delete trigger
# Before delete trigger
...
@@ -100,7 +100,7 @@ create trigger trg before delete on t1 for each row
...
@@ -100,7 +100,7 @@ create trigger trg before delete on t1 for each row
set
@
del_sum
:=
0
;
set
@
del_sum
:=
0
;
delete
from
t1
where
i
<=
3
;
delete
from
t1
where
i
<=
3
;
select
@
del_sum
;
select
@
del_sum
;
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
drop
table
t1
;
drop
table
t1
;
# After delete trigger.
# After delete trigger.
...
@@ -111,7 +111,7 @@ create trigger trg after delete on t1 for each row set @del:= 1;
...
@@ -111,7 +111,7 @@ create trigger trg after delete on t1 for each row set @del:= 1;
set
@
del
:=
0
;
set
@
del
:=
0
;
delete
from
t1
where
i
<>
0
;
delete
from
t1
where
i
<>
0
;
select
@
del
;
select
@
del
;
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
drop
table
t1
;
drop
table
t1
;
# Several triggers on one table
# Several triggers on one table
...
@@ -145,9 +145,9 @@ update t1 set j= 20;
...
@@ -145,9 +145,9 @@ update t1 set j= 20;
select
@
fired
;
select
@
fired
;
select
*
from
t1
;
select
*
from
t1
;
drop
trigger
t
1
.
t
rg1
;
drop
trigger
trg1
;
drop
trigger
t
1
.
t
rg2
;
drop
trigger
trg2
;
drop
trigger
t
1
.
t
rg3
;
drop
trigger
trg3
;
drop
table
t1
;
drop
table
t1
;
...
@@ -212,7 +212,7 @@ create trigger t1_ai after insert on t1 for each row
...
@@ -212,7 +212,7 @@ create trigger t1_ai after insert on t1 for each row
insert
into
t1
(
id
,
data
)
values
(
1
,
"one"
),
(
2
,
"two"
);
insert
into
t1
(
id
,
data
)
values
(
1
,
"one"
),
(
2
,
"two"
);
select
*
from
t1
;
select
*
from
t1
;
select
*
from
t2
;
select
*
from
t2
;
drop
trigger
t1
.
t1
_ai
;
drop
trigger
t1_ai
;
# Trigger which uses couple of tables (and partially emulates FK constraint)
# Trigger which uses couple of tables (and partially emulates FK constraint)
delimiter
|
;
delimiter
|
;
create
trigger
t1_bi
before
insert
on
t1
for
each
row
create
trigger
t1_bi
before
insert
on
t1
for
each
row
...
@@ -282,6 +282,7 @@ drop table t1, t2;
...
@@ -282,6 +282,7 @@ drop table t1, t2;
# Test of wrong column specifiers in triggers
# Test of wrong column specifiers in triggers
#
#
create
table
t1
(
i
int
);
create
table
t1
(
i
int
);
create
table
t3
(
i
int
);
--
error
1363
--
error
1363
create
trigger
trg
before
insert
on
t1
for
each
row
set
@
a
:=
old
.
i
;
create
trigger
trg
before
insert
on
t1
for
each
row
set
@
a
:=
old
.
i
;
...
@@ -301,7 +302,7 @@ create trigger trg before update on t1 for each row set @a:=old.j;
...
@@ -301,7 +302,7 @@ create trigger trg before update on t1 for each row set @a:=old.j;
#
#
# Let us test various trigger creation errors
# Let us test various trigger creation errors
#
#
Also quickly test table namespace (bug#5892/6182)
#
#
--
error
1146
--
error
1146
create
trigger
trg
before
insert
on
t2
for
each
row
set
@
a
:=
1
;
create
trigger
trg
before
insert
on
t2
for
each
row
set
@
a
:=
1
;
...
@@ -311,10 +312,14 @@ create trigger trg before insert on t1 for each row set @a:=1;
...
@@ -311,10 +312,14 @@ create trigger trg before insert on t1 for each row set @a:=1;
create
trigger
trg
after
insert
on
t1
for
each
row
set
@
a
:=
1
;
create
trigger
trg
after
insert
on
t1
for
each
row
set
@
a
:=
1
;
--
error
1359
--
error
1359
create
trigger
trg2
before
insert
on
t1
for
each
row
set
@
a
:=
1
;
create
trigger
trg2
before
insert
on
t1
for
each
row
set
@
a
:=
1
;
drop
trigger
t1
.
trg
;
--
error
1359
create
trigger
trg
before
insert
on
t3
for
each
row
set
@
a
:=
1
;
create
trigger
trg2
before
insert
on
t3
for
each
row
set
@
a
:=
1
;
drop
trigger
trg2
;
drop
trigger
trg
;
--
error
1360
--
error
1360
drop
trigger
t
1
.
t
rg
;
drop
trigger
trg
;
create
view
v1
as
select
*
from
t1
;
create
view
v1
as
select
*
from
t1
;
--
error
1347
--
error
1347
...
@@ -322,6 +327,7 @@ create trigger trg before insert on v1 for each row set @a:=1;
...
@@ -322,6 +327,7 @@ create trigger trg before insert on v1 for each row set @a:=1;
drop
view
v1
;
drop
view
v1
;
drop
table
t1
;
drop
table
t1
;
drop
table
t3
;
create
temporary
table
t1
(
i
int
);
create
temporary
table
t1
(
i
int
);
--
error
1361
--
error
1361
...
@@ -339,7 +345,7 @@ drop table t1;
...
@@ -339,7 +345,7 @@ drop table t1;
create
table
t1
(
x1col
char
);
create
table
t1
(
x1col
char
);
create
trigger
tx1
before
insert
on
t1
for
each
row
set
new
.
x1col
=
'x'
;
create
trigger
tx1
before
insert
on
t1
for
each
row
set
new
.
x1col
=
'x'
;
insert
into
t1
values
(
'y'
);
insert
into
t1
values
(
'y'
);
drop
trigger
t
1
.
t
x1
;
drop
trigger
tx1
;
drop
table
t1
;
drop
table
t1
;
#
#
...
@@ -355,8 +361,8 @@ create trigger trg2 after delete on t1 for each row set @del_after:= @del_after
...
@@ -355,8 +361,8 @@ create trigger trg2 after delete on t1 for each row set @del_after:= @del_after
set
@
del_before
:=
0
,
@
del_after
:=
0
;
set
@
del_before
:=
0
,
@
del_after
:=
0
;
delete
from
t1
;
delete
from
t1
;
select
@
del_before
,
@
del_after
;
select
@
del_before
,
@
del_after
;
drop
trigger
t
1
.
t
rg1
;
drop
trigger
trg1
;
drop
trigger
t
1
.
t
rg2
;
drop
trigger
trg2
;
drop
table
t1
;
drop
table
t1
;
# Test for bug #5859 "DROP TABLE does not drop triggers". Trigger should not
# Test for bug #5859 "DROP TABLE does not drop triggers". Trigger should not
...
@@ -378,6 +384,19 @@ create trigger trg1 before insert on t1 for each row set @a:= 1;
...
@@ -378,6 +384,19 @@ create trigger trg1 before insert on t1 for each row set @a:= 1;
drop
database
mysqltest
;
drop
database
mysqltest
;
use
test
;
use
test
;
# Test for bug #8791
# "Triggers: Allowed to create triggers on a subject table in a different DB".
create
database
mysqltest
;
create
table
mysqltest
.
t1
(
i
int
);
--
error
1429
create
trigger
trg1
before
insert
on
mysqltest
.
t1
for
each
row
set
@
a
:=
1
;
use
mysqltest
;
--
error
1429
create
trigger
test
.
trg1
before
insert
on
t1
for
each
row
set
@
a
:=
1
;
drop
database
mysqltest
;
use
test
;
# Test for bug #5860 "Multi-table UPDATE does not activate update triggers"
# Test for bug #5860 "Multi-table UPDATE does not activate update triggers"
# We will also test how delete triggers wor for multi-table DELETE.
# We will also test how delete triggers wor for multi-table DELETE.
create
table
t1
(
i
int
,
j
int
default
10
,
k
int
not
null
,
key
(
k
));
create
table
t1
(
i
int
,
j
int
default
10
,
k
int
not
null
,
key
(
k
));
...
@@ -559,7 +578,7 @@ select * from t1;
...
@@ -559,7 +578,7 @@ select * from t1;
# To test properly code-paths different from those that are used
# To test properly code-paths different from those that are used
# in ordinary INSERT we need to drop "before insert" trigger.
# in ordinary INSERT we need to drop "before insert" trigger.
alter
table
t1
add
primary
key
(
i
);
alter
table
t1
add
primary
key
(
i
);
drop
trigger
t1
.
bi
;
drop
trigger
bi
;
--
error
1054
--
error
1054
insert
into
t1
values
(
2
,
4
)
on
duplicate
key
update
k
=
k
+
10
;
insert
into
t1
values
(
2
,
4
)
on
duplicate
key
update
k
=
k
+
10
;
select
*
from
t1
;
select
*
from
t1
;
...
@@ -589,5 +608,5 @@ drop function bug5893;
...
@@ -589,5 +608,5 @@ drop function bug5893;
--
error
1305
--
error
1305
update
t1
set
col2
=
4
;
update
t1
set
col2
=
4
;
# This should not crash server too.
# This should not crash server too.
drop
trigger
t1
.
t1
_bu
;
drop
trigger
t1_bu
;
drop
table
t1
;
drop
table
t1
;
mysql-test/t/view.test
View file @
b141437a
...
@@ -1182,7 +1182,7 @@ create view v1 as select * from t1 where s1 <> 127 with check option;
...
@@ -1182,7 +1182,7 @@ create view v1 as select * from t1 where s1 <> 127 with check option;
insert
into
v1
values
(
0
);
insert
into
v1
values
(
0
);
select
*
from
v1
;
select
*
from
v1
;
select
*
from
t1
;
select
*
from
t1
;
drop
trigger
t1
.
t1
_bi
;
drop
trigger
t1_bi
;
drop
view
v1
;
drop
view
v1
;
drop
table
t1
;
drop
table
t1
;
...
...
sql/handler.cc
View file @
b141437a
...
@@ -2434,6 +2434,7 @@ TYPELIB *ha_known_exts(void)
...
@@ -2434,6 +2434,7 @@ TYPELIB *ha_known_exts(void)
known_extensions_id
=
mysys_usage_id
;
known_extensions_id
=
mysys_usage_id
;
found_exts
.
push_back
((
char
*
)
triggers_file_ext
);
found_exts
.
push_back
((
char
*
)
triggers_file_ext
);
found_exts
.
push_back
((
char
*
)
trigname_file_ext
);
for
(
types
=
sys_table_types
;
types
->
type
;
types
++
)
for
(
types
=
sys_table_types
;
types
->
type
;
types
++
)
{
{
if
(
*
types
->
value
==
SHOW_OPTION_YES
)
if
(
*
types
->
value
==
SHOW_OPTION_YES
)
...
...
sql/item.h
View file @
b141437a
...
@@ -1781,7 +1781,7 @@ class Item_insert_value : public Item_field
...
@@ -1781,7 +1781,7 @@ class Item_insert_value : public Item_field
*/
*/
enum
trg_action_time_type
enum
trg_action_time_type
{
{
TRG_ACTION_BEFORE
=
0
,
TRG_ACTION_AFTER
=
1
TRG_ACTION_BEFORE
=
0
,
TRG_ACTION_AFTER
=
1
,
TRG_ACTION_MAX
};
};
/*
/*
...
@@ -1789,7 +1789,7 @@ enum trg_action_time_type
...
@@ -1789,7 +1789,7 @@ enum trg_action_time_type
*/
*/
enum
trg_event_type
enum
trg_event_type
{
{
TRG_EVENT_INSERT
=
0
,
TRG_EVENT_UPDATE
=
1
,
TRG_EVENT_DELETE
=
2
TRG_EVENT_INSERT
=
0
,
TRG_EVENT_UPDATE
=
1
,
TRG_EVENT_DELETE
=
2
,
TRG_EVENT_MAX
};
};
class
Table_triggers_list
;
class
Table_triggers_list
;
...
...
sql/lex.h
View file @
b141437a
...
@@ -497,6 +497,7 @@ static SYMBOL symbols[] = {
...
@@ -497,6 +497,7 @@ static SYMBOL symbols[] = {
{
"TRAILING"
,
SYM
(
TRAILING
)},
{
"TRAILING"
,
SYM
(
TRAILING
)},
{
"TRANSACTION"
,
SYM
(
TRANSACTION_SYM
)},
{
"TRANSACTION"
,
SYM
(
TRANSACTION_SYM
)},
{
"TRIGGER"
,
SYM
(
TRIGGER_SYM
)},
{
"TRIGGER"
,
SYM
(
TRIGGER_SYM
)},
{
"TRIGGERS"
,
SYM
(
TRIGGERS_SYM
)},
{
"TRUE"
,
SYM
(
TRUE_SYM
)},
{
"TRUE"
,
SYM
(
TRUE_SYM
)},
{
"TRUNCATE"
,
SYM
(
TRUNCATE_SYM
)},
{
"TRUNCATE"
,
SYM
(
TRUNCATE_SYM
)},
{
"TYPE"
,
SYM
(
TYPE_SYM
)},
{
"TYPE"
,
SYM
(
TYPE_SYM
)},
...
...
sql/mysql_priv.h
View file @
b141437a
...
@@ -1082,6 +1082,7 @@ extern const char **errmesg; /* Error messages */
...
@@ -1082,6 +1082,7 @@ extern const char **errmesg; /* Error messages */
extern
const
char
*
myisam_recover_options_str
;
extern
const
char
*
myisam_recover_options_str
;
extern
const
char
*
in_left_expr_name
,
*
in_additional_cond
;
extern
const
char
*
in_left_expr_name
,
*
in_additional_cond
;
extern
const
char
*
const
triggers_file_ext
;
extern
const
char
*
const
triggers_file_ext
;
extern
const
char
*
const
trigname_file_ext
;
extern
Eq_creator
eq_creator
;
extern
Eq_creator
eq_creator
;
extern
Ne_creator
ne_creator
;
extern
Ne_creator
ne_creator
;
extern
Gt_creator
gt_creator
;
extern
Gt_creator
gt_creator
;
...
...
sql/mysqld.cc
View file @
b141437a
...
@@ -5728,6 +5728,7 @@ struct show_var_st status_vars[]= {
...
@@ -5728,6 +5728,7 @@ struct show_var_st status_vars[]= {
{
"Com_show_status"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_STATUS
]),
SHOW_LONG_STATUS
},
{
"Com_show_status"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_STATUS
]),
SHOW_LONG_STATUS
},
{
"Com_show_storage_engines"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_STORAGE_ENGINES
]),
SHOW_LONG_STATUS
},
{
"Com_show_storage_engines"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_STORAGE_ENGINES
]),
SHOW_LONG_STATUS
},
{
"Com_show_tables"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_TABLES
]),
SHOW_LONG_STATUS
},
{
"Com_show_tables"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_TABLES
]),
SHOW_LONG_STATUS
},
{
"Com_show_triggers"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_TRIGGERS
]),
SHOW_LONG_STATUS
},
{
"Com_show_variables"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_VARIABLES
]),
SHOW_LONG_STATUS
},
{
"Com_show_variables"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_VARIABLES
]),
SHOW_LONG_STATUS
},
{
"Com_show_warnings"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_WARNS
]),
SHOW_LONG_STATUS
},
{
"Com_show_warnings"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SHOW_WARNS
]),
SHOW_LONG_STATUS
},
{
"Com_slave_start"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SLAVE_START
]),
SHOW_LONG_STATUS
},
{
"Com_slave_start"
,
(
char
*
)
offsetof
(
STATUS_VAR
,
com_stat
[(
uint
)
SQLCOM_SLAVE_START
]),
SHOW_LONG_STATUS
},
...
...
sql/share/errmsg.txt
View file @
b141437a
...
@@ -5382,3 +5382,5 @@ ER_FOREIGN_DATA_STRING_INVALID
...
@@ -5382,3 +5382,5 @@ ER_FOREIGN_DATA_STRING_INVALID
eng "The data source connection string '%-.64s' is not in the correct format"
eng "The data source connection string '%-.64s' is not in the correct format"
ER_CANT_CREATE_FEDERATED_TABLE
ER_CANT_CREATE_FEDERATED_TABLE
eng "Can't create federated table. Foreign data src error : '%-.64s'"
eng "Can't create federated table. Foreign data src error : '%-.64s'"
ER_TRG_IN_WRONG_SCHEMA
eng "Trigger in wrong schema"
sql/sp.cc
View file @
b141437a
...
@@ -1442,8 +1442,8 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
...
@@ -1442,8 +1442,8 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
{
{
Sroutine_hash_entry
**
last_cached_routine_ptr
=
Sroutine_hash_entry
**
last_cached_routine_ptr
=
(
Sroutine_hash_entry
**
)
lex
->
sroutines_list
.
next
;
(
Sroutine_hash_entry
**
)
lex
->
sroutines_list
.
next
;
for
(
int
i
=
0
;
i
<
3
;
i
++
)
for
(
int
i
=
0
;
i
<
(
int
)
TRG_EVENT_MAX
;
i
++
)
for
(
int
j
=
0
;
j
<
2
;
j
++
)
for
(
int
j
=
0
;
j
<
(
int
)
TRG_ACTION_MAX
;
j
++
)
if
(
triggers
->
bodies
[
i
][
j
])
if
(
triggers
->
bodies
[
i
][
j
])
{
{
(
void
)
triggers
->
bodies
[
i
][
j
]
->
add_used_tables_to_table_list
(
thd
,
(
void
)
triggers
->
bodies
[
i
][
j
]
->
add_used_tables_to_table_list
(
thd
,
...
...
sql/sql_base.cc
View file @
b141437a
...
@@ -1740,7 +1740,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
...
@@ -1740,7 +1740,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
!
my_strcasecmp
(
system_charset_info
,
name
,
"proc"
))
!
my_strcasecmp
(
system_charset_info
,
name
,
"proc"
))
entry
->
s
->
system_table
=
1
;
entry
->
s
->
system_table
=
1
;
if
(
Table_triggers_list
::
check_n_load
(
thd
,
db
,
name
,
entry
))
if
(
Table_triggers_list
::
check_n_load
(
thd
,
db
,
name
,
entry
,
0
))
goto
err
;
goto
err
;
/*
/*
...
...
sql/sql_lex.h
View file @
b141437a
...
@@ -57,6 +57,7 @@ enum enum_sql_command {
...
@@ -57,6 +57,7 @@ enum enum_sql_command {
SQLCOM_SHOW_PROCESSLIST
,
SQLCOM_SHOW_MASTER_STAT
,
SQLCOM_SHOW_SLAVE_STAT
,
SQLCOM_SHOW_PROCESSLIST
,
SQLCOM_SHOW_MASTER_STAT
,
SQLCOM_SHOW_SLAVE_STAT
,
SQLCOM_SHOW_GRANTS
,
SQLCOM_SHOW_CREATE
,
SQLCOM_SHOW_CHARSETS
,
SQLCOM_SHOW_GRANTS
,
SQLCOM_SHOW_CREATE
,
SQLCOM_SHOW_CHARSETS
,
SQLCOM_SHOW_COLLATIONS
,
SQLCOM_SHOW_CREATE_DB
,
SQLCOM_SHOW_TABLE_STATUS
,
SQLCOM_SHOW_COLLATIONS
,
SQLCOM_SHOW_CREATE_DB
,
SQLCOM_SHOW_TABLE_STATUS
,
SQLCOM_SHOW_TRIGGERS
,
SQLCOM_LOAD
,
SQLCOM_SET_OPTION
,
SQLCOM_LOCK_TABLES
,
SQLCOM_UNLOCK_TABLES
,
SQLCOM_LOAD
,
SQLCOM_SET_OPTION
,
SQLCOM_LOCK_TABLES
,
SQLCOM_UNLOCK_TABLES
,
SQLCOM_GRANT
,
SQLCOM_GRANT
,
...
...
sql/sql_parse.cc
View file @
b141437a
...
@@ -2104,6 +2104,7 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
...
@@ -2104,6 +2104,7 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
case
SCH_TABLE_NAMES
:
case
SCH_TABLE_NAMES
:
case
SCH_TABLES
:
case
SCH_TABLES
:
case
SCH_VIEWS
:
case
SCH_VIEWS
:
case
SCH_TRIGGERS
:
#ifdef DONT_ALLOW_SHOW_COMMANDS
#ifdef DONT_ALLOW_SHOW_COMMANDS
my_message
(
ER_NOT_ALLOWED_COMMAND
,
my_message
(
ER_NOT_ALLOWED_COMMAND
,
ER
(
ER_NOT_ALLOWED_COMMAND
),
MYF
(
0
));
/* purecov: inspected */
ER
(
ER_NOT_ALLOWED_COMMAND
),
MYF
(
0
));
/* purecov: inspected */
...
...
sql/sql_show.cc
View file @
b141437a
...
@@ -21,6 +21,7 @@
...
@@ -21,6 +21,7 @@
#include "sql_select.h" // For select_describe
#include "sql_select.h" // For select_describe
#include "repl_failsafe.h"
#include "repl_failsafe.h"
#include "sp_head.h"
#include "sp_head.h"
#include "sql_trigger.h"
#include <my_dir.h>
#include <my_dir.h>
#ifdef HAVE_BERKELEY_DB
#ifdef HAVE_BERKELEY_DB
...
@@ -1696,6 +1697,7 @@ void get_index_field_values(LEX *lex, INDEX_FIELD_VALUES *index_field_values)
...
@@ -1696,6 +1697,7 @@ void get_index_field_values(LEX *lex, INDEX_FIELD_VALUES *index_field_values)
break
;
break
;
case
SQLCOM_SHOW_TABLES
:
case
SQLCOM_SHOW_TABLES
:
case
SQLCOM_SHOW_TABLE_STATUS
:
case
SQLCOM_SHOW_TABLE_STATUS
:
case
SQLCOM_SHOW_TRIGGERS
:
index_field_values
->
db_value
=
lex
->
current_select
->
db
;
index_field_values
->
db_value
=
lex
->
current_select
->
db
;
index_field_values
->
table_value
=
wild
;
index_field_values
->
table_value
=
wild
;
break
;
break
;
...
@@ -2977,6 +2979,73 @@ static int get_schema_constraints_record(THD *thd, struct st_table_list *tables,
...
@@ -2977,6 +2979,73 @@ static int get_schema_constraints_record(THD *thd, struct st_table_list *tables,
}
}
static
bool
store_trigger
(
THD
*
thd
,
TABLE
*
table
,
const
char
*
db
,
const
char
*
tname
,
LEX_STRING
*
trigger_name
,
enum
trg_event_type
event
,
enum
trg_action_time_type
timing
,
LEX_STRING
*
trigger_stmt
)
{
CHARSET_INFO
*
cs
=
system_charset_info
;
restore_record
(
table
,
s
->
default_values
);
table
->
field
[
1
]
->
store
(
db
,
strlen
(
db
),
cs
);
table
->
field
[
2
]
->
store
(
trigger_name
->
str
,
trigger_name
->
length
,
cs
);
table
->
field
[
3
]
->
store
(
trg_event_type_names
[
event
].
str
,
trg_event_type_names
[
event
].
length
,
cs
);
table
->
field
[
5
]
->
store
(
db
,
strlen
(
db
),
cs
);
table
->
field
[
6
]
->
store
(
tname
,
strlen
(
tname
),
cs
);
table
->
field
[
9
]
->
store
(
trigger_stmt
->
str
,
trigger_stmt
->
length
,
cs
);
table
->
field
[
10
]
->
store
(
"ROW"
,
3
,
cs
);
table
->
field
[
11
]
->
store
(
trg_action_time_type_names
[
timing
].
str
,
trg_action_time_type_names
[
timing
].
length
,
cs
);
table
->
field
[
14
]
->
store
(
"OLD"
,
3
,
cs
);
table
->
field
[
15
]
->
store
(
"NEW"
,
3
,
cs
);
return
schema_table_store_record
(
thd
,
table
);
}
static
int
get_schema_triggers_record
(
THD
*
thd
,
struct
st_table_list
*
tables
,
TABLE
*
table
,
bool
res
,
const
char
*
base_name
,
const
char
*
file_name
)
{
DBUG_ENTER
(
"get_schema_triggers_record"
);
/*
res can be non zero value when processed table is a view or
error happened during opening of processed table.
*/
if
(
res
)
{
if
(
!
tables
->
view
)
push_warning
(
thd
,
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
thd
->
net
.
last_errno
,
thd
->
net
.
last_error
);
thd
->
clear_error
();
DBUG_RETURN
(
0
);
}
if
(
!
tables
->
view
&&
tables
->
table
->
triggers
)
{
Table_triggers_list
*
triggers
=
tables
->
table
->
triggers
;
int
event
,
timing
;
for
(
event
=
0
;
event
<
(
int
)
TRG_EVENT_MAX
;
event
++
)
{
for
(
timing
=
0
;
timing
<
(
int
)
TRG_ACTION_MAX
;
timing
++
)
{
LEX_STRING
trigger_name
;
LEX_STRING
trigger_stmt
;
if
(
triggers
->
get_trigger_info
(
thd
,
(
enum
trg_event_type
)
event
,
(
enum
trg_action_time_type
)
timing
,
&
trigger_name
,
&
trigger_stmt
))
continue
;
if
(
store_trigger
(
thd
,
table
,
base_name
,
file_name
,
&
trigger_name
,
(
enum
trg_event_type
)
event
,
(
enum
trg_action_time_type
)
timing
,
&
trigger_stmt
))
DBUG_RETURN
(
1
);
}
}
}
DBUG_RETURN
(
0
);
}
void
store_key_column_usage
(
TABLE
*
table
,
const
char
*
db
,
const
char
*
tname
,
void
store_key_column_usage
(
TABLE
*
table
,
const
char
*
db
,
const
char
*
tname
,
const
char
*
key_name
,
uint
key_len
,
const
char
*
key_name
,
uint
key_len
,
const
char
*
con_type
,
uint
con_len
,
longlong
idx
)
const
char
*
con_type
,
uint
con_len
,
longlong
idx
)
...
@@ -3861,6 +3930,29 @@ ST_FIELD_INFO open_tables_fields_info[]=
...
@@ -3861,6 +3930,29 @@ ST_FIELD_INFO open_tables_fields_info[]=
};
};
ST_FIELD_INFO
triggers_fields_info
[]
=
{
{
"TRIGGER_CATALOG"
,
FN_REFLEN
,
MYSQL_TYPE_STRING
,
0
,
1
,
0
},
{
"TRIGGER_SCHEMA"
,
NAME_LEN
,
MYSQL_TYPE_STRING
,
0
,
0
,
0
},
{
"TRIGGER_NAME"
,
NAME_LEN
,
MYSQL_TYPE_STRING
,
0
,
0
,
"Trigger"
},
{
"EVENT_MANIPULATION"
,
6
,
MYSQL_TYPE_STRING
,
0
,
0
,
"Event"
},
{
"EVENT_OBJECT_CATALOG"
,
FN_REFLEN
,
MYSQL_TYPE_STRING
,
0
,
1
,
0
},
{
"EVENT_OBJECT_SCHEMA"
,
NAME_LEN
,
MYSQL_TYPE_STRING
,
0
,
0
,
0
},
{
"EVENT_OBJECT_TABLE"
,
NAME_LEN
,
MYSQL_TYPE_STRING
,
0
,
0
,
"Table"
},
{
"ACTION_ORDER"
,
4
,
MYSQL_TYPE_LONG
,
0
,
0
,
0
},
{
"ACTION_CONDITION"
,
65535
,
MYSQL_TYPE_STRING
,
0
,
1
,
0
},
{
"ACTION_STATEMENT"
,
65535
,
MYSQL_TYPE_STRING
,
0
,
0
,
"Statement"
},
{
"ACTION_ORIENTATION"
,
9
,
MYSQL_TYPE_STRING
,
0
,
0
,
0
},
{
"ACTION_TIMING"
,
6
,
MYSQL_TYPE_STRING
,
0
,
0
,
"Timing"
},
{
"ACTION_REFERENCE_OLD_TABLE"
,
NAME_LEN
,
MYSQL_TYPE_STRING
,
0
,
1
,
0
},
{
"ACTION_REFERENCE_NEW_TABLE"
,
NAME_LEN
,
MYSQL_TYPE_STRING
,
0
,
1
,
0
},
{
"ACTION_REFERENCE_OLD_ROW"
,
3
,
MYSQL_TYPE_STRING
,
0
,
0
,
0
},
{
"ACTION_REFERENCE_NEW_ROW"
,
3
,
MYSQL_TYPE_STRING
,
0
,
0
,
0
},
{
"CREATED"
,
0
,
MYSQL_TYPE_TIMESTAMP
,
0
,
1
,
"Created"
},
{
0
,
0
,
MYSQL_TYPE_STRING
,
0
,
0
,
0
}
};
ST_FIELD_INFO
variables_fields_info
[]
=
ST_FIELD_INFO
variables_fields_info
[]
=
{
{
{
"Variable_name"
,
80
,
MYSQL_TYPE_STRING
,
0
,
0
,
"Variable_name"
},
{
"Variable_name"
,
80
,
MYSQL_TYPE_STRING
,
0
,
0
,
"Variable_name"
},
...
@@ -3911,6 +4003,8 @@ ST_SCHEMA_TABLE schema_tables[]=
...
@@ -3911,6 +4003,8 @@ ST_SCHEMA_TABLE schema_tables[]=
fill_open_tables
,
make_old_format
,
0
,
-
1
,
-
1
,
1
},
fill_open_tables
,
make_old_format
,
0
,
-
1
,
-
1
,
1
},
{
"STATUS"
,
variables_fields_info
,
create_schema_table
,
fill_status
,
{
"STATUS"
,
variables_fields_info
,
create_schema_table
,
fill_status
,
make_old_format
,
0
,
-
1
,
-
1
,
1
},
make_old_format
,
0
,
-
1
,
-
1
,
1
},
{
"TRIGGERS"
,
triggers_fields_info
,
create_schema_table
,
get_all_tables
,
make_old_format
,
get_schema_triggers_record
,
5
,
6
,
0
},
{
"VARIABLES"
,
variables_fields_info
,
create_schema_table
,
fill_variables
,
{
"VARIABLES"
,
variables_fields_info
,
create_schema_table
,
fill_variables
,
make_old_format
,
0
,
-
1
,
-
1
,
1
},
make_old_format
,
0
,
-
1
,
-
1
,
1
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}
...
...
sql/sql_table.cc
View file @
b141437a
...
@@ -23,6 +23,8 @@
...
@@ -23,6 +23,8 @@
#include <hash.h>
#include <hash.h>
#include <myisam.h>
#include <myisam.h>
#include <my_dir.h>
#include <my_dir.h>
#include "sp_head.h"
#include "sql_trigger.h"
#ifdef __WIN__
#ifdef __WIN__
#include <io.h>
#include <io.h>
...
@@ -290,16 +292,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
...
@@ -290,16 +292,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
if
(
!
(
new_error
=
my_delete
(
path
,
MYF
(
MY_WME
))))
if
(
!
(
new_error
=
my_delete
(
path
,
MYF
(
MY_WME
))))
{
{
some_tables_deleted
=
1
;
some_tables_deleted
=
1
;
/*
new_error
=
Table_triggers_list
::
drop_all_triggers
(
thd
,
db
,
Destroy triggers for this table if there are any.
table
->
table_name
);
We won't need this as soon as we will have new .FRM format,
in which we will store trigger definitions in the same .FRM
files as table descriptions.
*/
strmov
(
end
,
triggers_file_ext
);
if
(
!
access
(
path
,
F_OK
))
new_error
=
my_delete
(
path
,
MYF
(
MY_WME
));
}
}
error
|=
new_error
;
error
|=
new_error
;
}
}
...
...
sql/sql_trigger.cc
View file @
b141437a
This diff is collapsed.
Click to expand it.
sql/sql_trigger.h
View file @
b141437a
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
class
Table_triggers_list
:
public
Sql_alloc
class
Table_triggers_list
:
public
Sql_alloc
{
{
/* Triggers as SPs grouped by event, action_time */
/* Triggers as SPs grouped by event, action_time */
sp_head
*
bodies
[
3
][
2
];
sp_head
*
bodies
[
TRG_EVENT_MAX
][
TRG_ACTION_MAX
];
/*
/*
Copy of TABLE::Field array with field pointers set to TABLE::record[1]
Copy of TABLE::Field array with field pointers set to TABLE::record[1]
buffer instead of TABLE::record[0] (used for OLD values in on UPDATE
buffer instead of TABLE::record[0] (used for OLD values in on UPDATE
...
@@ -121,9 +121,13 @@ class Table_triggers_list: public Sql_alloc
...
@@ -121,9 +121,13 @@ class Table_triggers_list: public Sql_alloc
return
res
;
return
res
;
}
}
bool
get_trigger_info
(
THD
*
thd
,
trg_event_type
event
,
trg_action_time_type
time_type
,
LEX_STRING
*
trigger_name
,
LEX_STRING
*
trigger_stmt
);
static
bool
check_n_load
(
THD
*
thd
,
const
char
*
db
,
const
char
*
table_name
,
static
bool
check_n_load
(
THD
*
thd
,
const
char
*
db
,
const
char
*
table_name
,
TABLE
*
table
);
TABLE
*
table
,
bool
names_only
);
static
bool
drop_all_triggers
(
THD
*
thd
,
char
*
db
,
char
*
table_name
);
bool
has_delete_triggers
()
bool
has_delete_triggers
()
{
{
...
@@ -143,3 +147,6 @@ class Table_triggers_list: public Sql_alloc
...
@@ -143,3 +147,6 @@ class Table_triggers_list: public Sql_alloc
private:
private:
bool
prepare_record1_accessors
(
TABLE
*
table
);
bool
prepare_record1_accessors
(
TABLE
*
table
);
};
};
extern
const
LEX_STRING
trg_action_time_type_names
[];
extern
const
LEX_STRING
trg_event_type_names
[];
sql/sql_yacc.yy
View file @
b141437a
...
@@ -599,6 +599,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
...
@@ -599,6 +599,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token TRAILING
%token TRAILING
%token TRANSACTION_SYM
%token TRANSACTION_SYM
%token TRIGGER_SYM
%token TRIGGER_SYM
%token TRIGGERS_SYM
%token TRIM
%token TRIM
%token TRUE_SYM
%token TRUE_SYM
%token TRUNCATE_SYM
%token TRUNCATE_SYM
...
@@ -1266,7 +1267,7 @@ create:
...
@@ -1266,7 +1267,7 @@ create:
}
}
opt_view_list AS select_init check_option
opt_view_list AS select_init check_option
{}
{}
| CREATE TRIGGER_SYM
ident
trg_action_time trg_event
| CREATE TRIGGER_SYM
sp_name
trg_action_time trg_event
ON table_ident FOR_SYM EACH_SYM ROW_SYM
ON table_ident FOR_SYM EACH_SYM ROW_SYM
{
{
LEX *lex= Lex;
LEX *lex= Lex;
...
@@ -1285,6 +1286,7 @@ create:
...
@@ -1285,6 +1286,7 @@ create:
sp->m_type= TYPE_ENUM_TRIGGER;
sp->m_type= TYPE_ENUM_TRIGGER;
lex->sphead= sp;
lex->sphead= sp;
lex->spname= $3;
/*
/*
We have to turn of CLIENT_MULTI_QUERIES while parsing a
We have to turn of CLIENT_MULTI_QUERIES while parsing a
stored procedure, otherwise yylex will chop it into pieces
stored procedure, otherwise yylex will chop it into pieces
...
@@ -1295,7 +1297,7 @@ create:
...
@@ -1295,7 +1297,7 @@ create:
bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics));
bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics));
lex->sphead->m_chistics= &lex->sp_chistics;
lex->sphead->m_chistics= &lex->sp_chistics;
lex->sphead->m_body_begin= lex->
tok_start
;
lex->sphead->m_body_begin= lex->
ptr
;
}
}
sp_proc_stmt
sp_proc_stmt
{
{
...
@@ -1303,14 +1305,12 @@ create:
...
@@ -1303,14 +1305,12 @@ create:
sp_head *sp= lex->sphead;
sp_head *sp= lex->sphead;
lex->sql_command= SQLCOM_CREATE_TRIGGER;
lex->sql_command= SQLCOM_CREATE_TRIGGER;
sp->init_strings(YYTHD, lex,
NULL
);
sp->init_strings(YYTHD, lex,
$3
);
/* Restore flag if it was cleared above */
/* Restore flag if it was cleared above */
if (sp->m_old_cmq)
if (sp->m_old_cmq)
YYTHD->client_capabilities |= CLIENT_MULTI_QUERIES;
YYTHD->client_capabilities |= CLIENT_MULTI_QUERIES;
sp->restore_thd_mem_root(YYTHD);
sp->restore_thd_mem_root(YYTHD);
lex->ident= $3;
/*
/*
We have to do it after parsing trigger body, because some of
We have to do it after parsing trigger body, because some of
sp_proc_stmt alternatives are not saving/restoring LEX, so
sp_proc_stmt alternatives are not saving/restoring LEX, so
...
@@ -5919,19 +5919,11 @@ drop:
...
@@ -5919,19 +5919,11 @@ drop:
lex->sql_command= SQLCOM_DROP_VIEW;
lex->sql_command= SQLCOM_DROP_VIEW;
lex->drop_if_exists= $3;
lex->drop_if_exists= $3;
}
}
| DROP TRIGGER_SYM
ident '.' ident
| DROP TRIGGER_SYM
sp_name
{
{
LEX *lex= Lex;
LEX *lex= Lex;
lex->sql_command= SQLCOM_DROP_TRIGGER;
lex->sql_command= SQLCOM_DROP_TRIGGER;
/* QQ: Could we loosen lock type in certain cases ? */
lex->spname= $3;
if (!lex->select_lex.add_table_to_list(YYTHD,
new Table_ident($3),
(LEX_STRING*) 0,
TL_OPTION_UPDATING,
TL_WRITE))
YYABORT;
lex->ident= $5;
}
}
;
;
...
@@ -6296,6 +6288,15 @@ show_param:
...
@@ -6296,6 +6288,15 @@ show_param:
if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLE_NAMES))
if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLE_NAMES))
YYABORT;
YYABORT;
}
}
| opt_full TRIGGERS_SYM opt_db wild_and_where
{
LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT;
lex->orig_sql_command= SQLCOM_SHOW_TRIGGERS;
lex->select_lex.db= $3;
if (prepare_schema_table(YYTHD, lex, 0, SCH_TRIGGERS))
YYABORT;
}
| TABLE_SYM STATUS_SYM opt_db wild_and_where
| TABLE_SYM STATUS_SYM opt_db wild_and_where
{
{
LEX *lex= Lex;
LEX *lex= Lex;
...
@@ -7590,6 +7591,7 @@ keyword_sp:
...
@@ -7590,6 +7591,7 @@ keyword_sp:
| TEMPTABLE_SYM {}
| TEMPTABLE_SYM {}
| TEXT_SYM {}
| TEXT_SYM {}
| TRANSACTION_SYM {}
| TRANSACTION_SYM {}
| TRIGGERS_SYM {}
| TIMESTAMP {}
| TIMESTAMP {}
| TIMESTAMP_ADD {}
| TIMESTAMP_ADD {}
| TIMESTAMP_DIFF {}
| TIMESTAMP_DIFF {}
...
...
sql/table.h
View file @
b141437a
...
@@ -282,7 +282,7 @@ enum enum_schema_tables
...
@@ -282,7 +282,7 @@ enum enum_schema_tables
SCH_COLLATION_CHARACTER_SET_APPLICABILITY
,
SCH_PROCEDURES
,
SCH_STATISTICS
,
SCH_COLLATION_CHARACTER_SET_APPLICABILITY
,
SCH_PROCEDURES
,
SCH_STATISTICS
,
SCH_VIEWS
,
SCH_USER_PRIVILEGES
,
SCH_SCHEMA_PRIVILEGES
,
SCH_TABLE_PRIVILEGES
,
SCH_VIEWS
,
SCH_USER_PRIVILEGES
,
SCH_SCHEMA_PRIVILEGES
,
SCH_TABLE_PRIVILEGES
,
SCH_COLUMN_PRIVILEGES
,
SCH_TABLE_CONSTRAINTS
,
SCH_KEY_COLUMN_USAGE
,
SCH_COLUMN_PRIVILEGES
,
SCH_TABLE_CONSTRAINTS
,
SCH_KEY_COLUMN_USAGE
,
SCH_TABLE_NAMES
,
SCH_OPEN_TABLES
,
SCH_STATUS
,
SCH_VARIABLES
SCH_TABLE_NAMES
,
SCH_OPEN_TABLES
,
SCH_STATUS
,
SCH_
TRIGGERS
,
SCH_
VARIABLES
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment