~ubuntu-branches/ubuntu/trusty/mariadb-5.5/trusty-proposed

« back to all changes in this revision

Viewing changes to mysql-test/t/trigger-compat.test

  • Committer: Package Import Robot
  • Author(s): Otto Kekäläinen
  • Date: 2013-12-22 10:27:05 UTC
  • Revision ID: package-import@ubuntu.com-20131222102705-mndw7s12mz0szrcn
Tags: upstream-5.5.32
Import upstream version 5.5.32

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Test case(s) in this file contain(s) GRANT/REVOKE statements, which are not
 
2
# supported in embedded server. So, this test should not be run on embedded
 
3
# server.
 
4
 
 
5
-- source include/not_embedded.inc
 
6
 
 
7
###########################################################################
 
8
#
 
9
# Tests for WL#2818:
 
10
#   - Check that triggers created w/o DEFINER information work well:
 
11
#     - create the first trigger;
 
12
#     - manually remove definer information from corresponding TRG file;
 
13
#     - create the second trigger (the first trigger will be reloaded; check
 
14
#       that we receive a warning);
 
15
#     - check that the triggers loaded correctly;
 
16
#
 
17
###########################################################################
 
18
 
 
19
#
 
20
# Prepare environment.
 
21
#
 
22
 
 
23
DELETE FROM mysql.user WHERE User LIKE 'mysqltest_%';
 
24
DELETE FROM mysql.db WHERE User LIKE 'mysqltest_%';
 
25
DELETE FROM mysql.tables_priv WHERE User LIKE 'mysqltest_%';
 
26
DELETE FROM mysql.columns_priv WHERE User LIKE 'mysqltest_%';
 
27
FLUSH PRIVILEGES;
 
28
 
 
29
--disable_warnings
 
30
DROP DATABASE IF EXISTS mysqltest_db1;
 
31
--enable_warnings
 
32
 
 
33
CREATE DATABASE mysqltest_db1;
 
34
 
 
35
CREATE USER mysqltest_dfn@localhost;
 
36
CREATE USER mysqltest_inv@localhost;
 
37
 
 
38
GRANT CREATE, TRIGGER ON mysqltest_db1.* TO mysqltest_dfn@localhost;
 
39
 
 
40
#
 
41
# Create a table and the first trigger.
 
42
#
 
43
 
 
44
--connect (wl2818_definer_con,localhost,mysqltest_dfn,,mysqltest_db1)
 
45
--connection wl2818_definer_con
 
46
--echo
 
47
--echo ---> connection: wl2818_definer_con
 
48
 
 
49
CREATE TABLE t1(num_value INT);
 
50
CREATE TABLE t2(user_str TEXT);
 
51
 
 
52
CREATE TRIGGER wl2818_trg1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES(CURRENT_USER());
 
53
 
 
54
#
 
55
# Remove definers from TRG file.
 
56
#
 
57
 
 
58
--echo
 
59
--echo ---> patching t1.TRG...
 
60
 
 
61
# Here we remove definers.  This is somewhat complex than the original test
 
62
# Previously, the test only used grep -v 'definers=' t1.TRG, but grep is not
 
63
# portable and we have to load the file into a table, exclude the definers line,
 
64
# then load the data to an outfile to accomplish the same effect
 
65
 
 
66
--disable_query_log
 
67
--connection default
 
68
CREATE TABLE patch (a blob);
 
69
let $MYSQLD_DATADIR = `select @@datadir`;
 
70
eval LOAD DATA LOCAL INFILE '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' INTO TABLE patch;
 
71
# remove original t1.TRG file so SELECT INTO OUTFILE won't fail
 
72
--remove_file $MYSQLD_DATADIR/mysqltest_db1/t1.TRG
 
73
eval SELECT SUBSTRING_INDEX(a,'definers=',1) INTO OUTFILE
 
74
 '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' 
 
75
FROM patch;
 
76
DROP TABLE patch;
 
77
--connection wl2818_definer_con
 
78
--enable_query_log
 
79
 
 
80
#
 
81
# Create a new trigger.
 
82
#
 
83
 
 
84
--echo
 
85
 
 
86
CREATE TRIGGER wl2818_trg2 AFTER INSERT ON t1
 
87
  FOR EACH ROW
 
88
    INSERT INTO t2 VALUES(CURRENT_USER());
 
89
 
 
90
--echo
 
91
 
 
92
SELECT trigger_name, definer FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
 
93
 
 
94
--echo
 
95
 
 
96
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS ORDER BY trigger_name;
 
97
 
 
98
# Clean up
 
99
DROP TRIGGER wl2818_trg1;
 
100
DROP TRIGGER wl2818_trg2;
 
101
disconnect wl2818_definer_con;
 
102
connection default;
 
103
use mysqltest_db1;
 
104
DROP TABLE t1;
 
105
DROP TABLE t2;
 
106
DROP USER mysqltest_dfn@localhost;
 
107
DROP USER mysqltest_inv@localhost;
 
108
DROP DATABASE mysqltest_db1;
 
109
USE test;
 
110
 
 
111
 
 
112
--echo #
 
113
--echo # Bug#45235: 5.1 does not support 5.0-only syntax triggers in any way
 
114
--echo #
 
115
let $MYSQLD_DATADIR=`SELECT @@datadir`;
 
116
 
 
117
--disable_warnings
 
118
DROP TABLE IF EXISTS t1, t2, t3;
 
119
--enable_warnings
 
120
 
 
121
CREATE TABLE t1 ( a INT );
 
122
CREATE TABLE t2 ( a INT );
 
123
CREATE TABLE t3 ( a INT );
 
124
INSERT INTO t1 VALUES (1), (2), (3);
 
125
INSERT INTO t2 VALUES (1), (2), (3);
 
126
INSERT INTO t3 VALUES (1), (2), (3);
 
127
 
 
128
--echo # We simulate importing a trigger from 5.0 by writing a .TRN file for
 
129
--echo # each trigger plus a .TRG file the way MySQL 5.0 would have done it, 
 
130
--echo # with syntax allowed in 5.0 only.
 
131
--echo #
 
132
--echo # Note that in 5.0 the following lines are missing from t1.TRG:
 
133
--echo #
 
134
--echo # client_cs_names='latin1'
 
135
--echo # connection_cl_names='latin1_swedish_ci'
 
136
--echo # db_cl_names='latin1_swedish_ci'
 
137
 
 
138
--write_file $MYSQLD_DATADIR/test/tr11.TRN
 
139
TYPE=TRIGGERNAME
 
140
trigger_table=t1
 
141
EOF
 
142
 
 
143
--write_file $MYSQLD_DATADIR/test/tr12.TRN
 
144
TYPE=TRIGGERNAME
 
145
trigger_table=t1
 
146
EOF
 
147
 
 
148
--write_file $MYSQLD_DATADIR/test/tr13.TRN
 
149
TYPE=TRIGGERNAME
 
150
trigger_table=t1
 
151
EOF
 
152
 
 
153
--write_file $MYSQLD_DATADIR/test/tr14.TRN
 
154
TYPE=TRIGGERNAME
 
155
trigger_table=t1
 
156
EOF
 
157
 
 
158
--write_file $MYSQLD_DATADIR/test/tr15.TRN
 
159
TYPE=TRIGGERNAME
 
160
trigger_table=t1
 
161
EOF
 
162
 
 
163
--write_file $MYSQLD_DATADIR/test/t1.TRG
 
164
TYPE=TRIGGERS
 
165
triggers='CREATE DEFINER=`root`@`localhost` TRIGGER tr11 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr12 AFTER INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr13 BEFORE DELETE ON t1 FOR EACH ROW DELETE FROM t1 a USING t1 a' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr14 AFTER DELETE ON t1 FOR EACH ROW DELETE FROM non_existing_table' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr15 BEFORE UPDATE ON t1 FOR EACH ROW DELETE FROM non_existing_table a USING non_existing_table a'
 
166
sql_modes=0 0 0 0 0
 
167
definers='root@localhost' 'root@localhost' 'root@localhost' 'root@localhost' 'root@localhost'
 
168
EOF
 
169
 
 
170
--write_file $MYSQLD_DATADIR/test/t2.TRG
 
171
TYPE=TRIGGERS
 
172
triggers='Not allowed syntax here, and trigger name cant be extracted either.'
 
173
sql_modes=0
 
174
definers='root@localhost'
 
175
EOF
 
176
 
 
177
FLUSH TABLE t1;
 
178
FLUSH TABLE t2;
 
179
 
 
180
--echo # We will get parse errors for most DDL and DML statements when the table
 
181
--echo # has broken triggers. The parse error refers to the first broken 
 
182
--echo # trigger.
 
183
--error ER_PARSE_ERROR
 
184
CREATE TRIGGER tr16 AFTER UPDATE ON t1 FOR EACH ROW INSERT INTO t1 VALUES (1);
 
185
--error ER_PARSE_ERROR
 
186
CREATE TRIGGER tr22 BEFORE INSERT ON t2 FOR EACH ROW DELETE FROM non_existing_table;
 
187
SHOW TRIGGERS;
 
188
--error ER_PARSE_ERROR
 
189
INSERT INTO t1 VALUES (1);
 
190
--error ER_PARSE_ERROR
 
191
INSERT INTO t2 VALUES (1);
 
192
--error ER_PARSE_ERROR
 
193
DELETE FROM t1;
 
194
--error ER_PARSE_ERROR
 
195
UPDATE t1 SET a = 1 WHERE a = 1;
 
196
SELECT * FROM t1;
 
197
--error ER_PARSE_ERROR
 
198
RENAME TABLE t1 TO t1_2;
 
199
SHOW TRIGGERS;
 
200
 
 
201
DROP TRIGGER tr11;
 
202
DROP TRIGGER tr12;
 
203
DROP TRIGGER tr13;
 
204
DROP TRIGGER tr14;
 
205
DROP TRIGGER tr15;
 
206
 
 
207
SHOW TRIGGERS;
 
208
 
 
209
--echo # Make sure there is no trigger file left.
 
210
--list_files $MYSQLD_DATADIR/test/ tr*
 
211
 
 
212
--echo # We write the same trigger files one more time to test DROP TABLE.
 
213
--write_file $MYSQLD_DATADIR/test/tr11.TRN
 
214
TYPE=TRIGGERNAME
 
215
trigger_table=t1
 
216
EOF
 
217
 
 
218
--write_file $MYSQLD_DATADIR/test/tr12.TRN
 
219
TYPE=TRIGGERNAME
 
220
trigger_table=t1
 
221
EOF
 
222
 
 
223
--write_file $MYSQLD_DATADIR/test/tr13.TRN
 
224
TYPE=TRIGGERNAME
 
225
trigger_table=t1
 
226
EOF
 
227
 
 
228
--write_file $MYSQLD_DATADIR/test/tr14.TRN
 
229
TYPE=TRIGGERNAME
 
230
trigger_table=t1
 
231
EOF
 
232
 
 
233
--write_file $MYSQLD_DATADIR/test/tr15.TRN
 
234
TYPE=TRIGGERNAME
 
235
trigger_table=t1
 
236
EOF
 
237
 
 
238
--write_file $MYSQLD_DATADIR/test/t1.TRG
 
239
TYPE=TRIGGERS
 
240
triggers='CREATE DEFINER=`root`@`localhost` TRIGGER tr11 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr12 AFTER INSERT ON t1 FOR EACH ROW DELETE FROM t3' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr13 BEFORE DELETE ON t1 FOR EACH ROW DELETE FROM t1 a USING t1 a' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr14 AFTER DELETE ON t1 FOR EACH ROW DELETE FROM non_existing_table' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr15 BEFORE UPDATE ON t1 FOR EACH ROW DELETE FROM non_existing_table a USING non_existing_table a'
 
241
sql_modes=0 0 0 0 0
 
242
definers='root@localhost' 'root@localhost' 'root@localhost' 'root@localhost' 'root@localhost'
 
243
EOF
 
244
 
 
245
FLUSH TABLE t1;
 
246
FLUSH TABLE t2;
 
247
 
 
248
DROP TABLE t1;
 
249
DROP TABLE t2;
 
250
DROP TABLE t3;
 
251
 
 
252
--echo # Make sure there is no trigger file left.
 
253
 
 
254
--list_files $MYSQLD_DATADIR/test/ tr*
 
255
 
 
256
CREATE TABLE t1 ( a INT );
 
257
CREATE TABLE t2 ( a INT );
 
258
INSERT INTO t1 VALUES (1), (2), (3);
 
259
INSERT INTO t2 VALUES (1), (2), (3);
 
260
 
 
261
--echo # We write three trigger files. First trigger is syntaxically incorrect, next trigger is correct
 
262
--echo # and last trigger is broken.
 
263
--echo # Next we try to execute SHOW CREATE TRGGIR command for broken trigger and then try to drop one.
 
264
--write_file $MYSQLD_DATADIR/test/tr11.TRN
 
265
TYPE=TRIGGERNAME
 
266
trigger_table=t1
 
267
EOF
 
268
 
 
269
--write_file $MYSQLD_DATADIR/test/tr12.TRN
 
270
TYPE=TRIGGERNAME
 
271
trigger_table=t1
 
272
EOF
 
273
 
 
274
--write_file $MYSQLD_DATADIR/test/t1.TRG
 
275
TYPE=TRIGGERS
 
276
triggers='CREATE the wrongest trigger_in_the_world' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr11 BEFORE DELETE ON t1 FOR EACH ROW DELETE FROM t1 a USING t1 a' 'CREATE DEFINER=`root`@`localhost` TRIGGER tr12 BEFORE INSERT ON t1 FOR EACH ROW DELETE FROM t2'
 
277
sql_modes=0 0 0
 
278
definers='root@localhost' 'root@localhost' 'root@localhost'
 
279
EOF
 
280
 
 
281
FLUSH TABLE t1;
 
282
 
 
283
SHOW CREATE TRIGGER tr12;
 
284
SHOW CREATE TRIGGER tr11;
 
285
DROP TRIGGER tr12;
 
286
DROP TRIGGER tr11;
 
287
 
 
288
DROP TABLE t1;
 
289
DROP TABLE t2;