~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
# ==== Purpose ====
2
#
3
# Test that queries referencing variables are replicated correctly in
4
# mixed and row-based logging mode.
5
#
6
#
7
# ==== Method ====
8
#
9
# The test simply does a lot of "INSERT INTO t1 VALUES (@@variable)"
10
# and checks the result on the slave.
11
#
12
# Statements referencing a variable only replicate correctly in mixed
13
# and row mode: in row mode, the values inserted are replicated.  In
14
# mixed mode, statements referencing a variable are marked as unsafe,
15
# meaning they will be replicated by row.  In statement mode, the
16
# slave's value will be used and replication will break. (Except in a
17
# small number of special cases: random seeds, insert_id, and
18
# auto_increment are replicated).
19
#
20
# We test the following variable scopes:
21
#  - server system variables
22
#  - server session variables
23
#  - server "both" variables
24
#  - user variables
25
#
26
# For each scope, we use variables of the following types if they
27
# exist:
28
#  - boolean
29
#  - numeric
30
#  - string
31
#  - enumeration variables
32
#
33
# We use these types of variables in the following contexts:
34
#  - directly
35
#  - from a stored procedure
36
#  - from a stored function
37
#  - from a trigger
38
#  - from a prepared statement
39
#
40
# For all variables where it is possible, we set the variable to one
41
# value on slave, and insert it on the master with two distinct
42
# values.
43
#
44
# The same insertions are made in four different tables using direct
45
# insert, stored procedure, stored function, or trigger.  Then all
46
# eight resulting tables on master and slave are compared.
47
#
48
#
49
# ==== Related bugs ====
50
#
51
# BUG#31168: @@hostname does not replicate
52
#
53
#
54
# ==== Related test cases ====
55
#
56
# binlog.binlog_unsafe tests that a warning is issued if system
57
# variables are replicated in statement mode.
58
#
59
# rpl.rpl_variables_stm tests the small subset of variables that
60
# actually can be replicated safely in statement mode.
61
62
63
source include/master-slave.inc;
64
source include/have_binlog_format_mixed_or_row.inc;
65
66
67
--echo ==== Initialization ====
68
69
# Backup the values of global variables so that they can be restored
70
# later.
71
--echo [on master]
72
connection master;
73
SET @m_default_week_format=  @@global.default_week_format;
74
SET @m_init_slave=           @@global.init_slave;
75
SET @m_lc_time_names=        @@global.lc_time_names;
76
SET @m_low_priority_updates= @@global.low_priority_updates;
77
SET @m_relay_log_purge=      @@global.relay_log_purge;
78
SET @m_slave_exec_mode=      @@global.slave_exec_mode;
79
SET @m_sql_mode=             @@global.sql_mode;
80
SET @m_sync_binlog=          @@global.sync_binlog;
81
82
--echo [on slave]
83
connection slave;
84
SET @s_default_week_format=  @@global.default_week_format;
85
SET @s_init_slave=           @@global.init_slave;
86
SET @s_lc_time_names=        @@global.lc_time_names;
87
SET @s_low_priority_updates= @@global.low_priority_updates;
88
SET @s_relay_log_purge=      @@global.relay_log_purge;
89
SET @s_slave_exec_mode=      @@global.slave_exec_mode;
90
SET @s_sql_mode=             @@global.sql_mode;
91
SET @s_sync_binlog=          @@global.sync_binlog;
92
93
# Set global variables on slave to something different than on master.
94
SET @@global.relay_log_purge = OFF;
95
SET @@global.sync_binlog = 1000000;
96
SET @@global.slave_exec_mode = 'STRICT';
97
SET @@sql_big_selects = OFF;
98
SET @@last_insert_id = 10;
99
SET @@global.low_priority_updates = OFF;
100
SET @@local.low_priority_updates = OFF;
101
SET @@global.default_week_format = 1;
102
SET @@local.default_week_format = 2;
103
SET @@global.lc_time_names = 'zh_HK';
104
SET @@local.lc_time_names = 'zh_TW';
105
SET @@global.sql_mode = 'ALLOW_INVALID_DATES';
106
SET @@local.sql_mode = 'ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO,HIGH_NOT_PRECEDENCE';
107
SET @user_num = 10;
108
SET @user_text = 'Alunda';
109
110
# Stop slave so that we get a fresh sql thread, reading the slave's
111
# global values of variables into its local copies.
112
--echo [on master]
113
connection master;
114
source include/reset_master_and_slave.inc;
115
116
# We would have wanted to set this together with the other variables
117
# above, but can't because it affects how the slave works.
118
--echo [on slave]
119
connection slave;
120
SET @@global.init_slave = 'ant';
121
122
123
--echo [on master]
124
connection master;
125
126
# Tables where everything happens.
127
CREATE TABLE tstmt (id INT AUTO_INCREMENT PRIMARY KEY,
128
                    truth BOOLEAN,
129
                    num INT,
130
                    text VARCHAR(100));
131
CREATE TABLE tproc LIKE tstmt;
132
CREATE TABLE tfunc LIKE tstmt;
133
CREATE TABLE ttrig LIKE tstmt;
134
CREATE TABLE tprep LIKE tstmt;
135
136
# Table on which we put a trigger.
137
CREATE TABLE trigger_table (text CHAR(4));
138
139
140
--echo ==== Insert variables directly ====
141
142
--echo ----  global variables ----
143
144
# boolean
145
SET @@global.relay_log_purge = ON;
146
INSERT INTO tstmt(truth) VALUES (@@global.relay_log_purge);
147
SET @@global.relay_log_purge = OFF;
148
INSERT INTO tstmt(truth) VALUES (@@global.relay_log_purge);
149
150
# numeric
151
SET @@global.sync_binlog = 2000000;
152
INSERT INTO tstmt(num) VALUES (@@global.sync_binlog);
153
SET @@global.sync_binlog = 3000000;
154
INSERT INTO tstmt(num) VALUES (@@global.sync_binlog);
155
156
# string
157
SET @@global.init_slave = 'bison';
158
INSERT INTO tstmt(text) VALUES (@@global.init_slave);
159
SET @@global.init_slave = 'cat';
160
INSERT INTO tstmt(text) VALUES (@@global.init_slave);
161
162
# enumeration
163
SET @@global.slave_exec_mode = 'IDEMPOTENT';
164
INSERT INTO tstmt(text) VALUES (@@global.slave_exec_mode);
165
SET @@global.slave_exec_mode = 'STRICT';
166
INSERT INTO tstmt(text) VALUES (@@global.slave_exec_mode);
167
168
169
--echo ---- session variables ----
170
171
# boolean
172
SET @@sql_big_selects = ON;
173
INSERT INTO tstmt(truth) VALUES (@@sql_big_selects);
174
SET @@sql_big_selects = OFF;
175
INSERT INTO tstmt(truth) VALUES (@@sql_big_selects);
176
177
# numeric
178
SET @@last_insert_id = 20;
179
INSERT INTO tstmt(num) VALUES (@@last_insert_id);
180
SET @@last_insert_id = 30;
181
INSERT INTO tstmt(num) VALUES (@@last_insert_id);
182
183
--echo ---- global and session variables ----
184
185
# boolean
186
SET @@global.low_priority_updates = ON;
187
SET @@local.low_priority_updates = OFF;
188
INSERT INTO tstmt(truth) VALUES (@@global.low_priority_updates);
189
INSERT INTO tstmt(truth) VALUES (@@local.low_priority_updates);
190
SET @@global.low_priority_updates = OFF;
191
SET @@local.low_priority_updates = ON;
192
INSERT INTO tstmt(truth) VALUES (@@global.low_priority_updates);
193
INSERT INTO tstmt(truth) VALUES (@@local.low_priority_updates);
194
195
# numeric
196
SET @@global.default_week_format = 3;
197
SET @@local.default_week_format = 4;
198
INSERT INTO tstmt(num) VALUES (@@global.default_week_format);
199
INSERT INTO tstmt(num) VALUES (@@local.default_week_format);
200
SET @@global.default_week_format = 5;
201
SET @@local.default_week_format = 6;
202
INSERT INTO tstmt(num) VALUES (@@global.default_week_format);
203
INSERT INTO tstmt(num) VALUES (@@local.default_week_format);
204
205
# string
206
SET @@global.lc_time_names = 'sv_SE';
207
SET @@local.lc_time_names = 'sv_FI';
208
INSERT INTO tstmt(text) VALUES (@@global.lc_time_names);
209
INSERT INTO tstmt(text) VALUES (@@local.lc_time_names);
210
SET @@global.lc_time_names = 'ar_TN';
211
SET @@local.lc_time_names = 'ar_IQ';
212
INSERT INTO tstmt(text) VALUES (@@global.lc_time_names);
213
INSERT INTO tstmt(text) VALUES (@@local.lc_time_names);
214
215
# enum
216
SET @@global.sql_mode = '';
217
SET @@local.sql_mode = 'IGNORE_SPACE,NO_AUTO_CREATE_USER';
218
INSERT INTO tstmt(text) VALUES (@@global.sql_mode);
219
INSERT INTO tstmt(text) VALUES (@@local.sql_mode);
220
SET @@global.sql_mode = 'NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION';
221
SET @@local.sql_mode = 'NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS';
222
INSERT INTO tstmt(text) VALUES (@@global.sql_mode);
223
INSERT INTO tstmt(text) VALUES (@@local.sql_mode);
224
225
--echo ---- user variables ----
226
227
# numeric
228
SET @user_num = 20;
229
INSERT INTO tstmt(num) VALUES (@user_num);
230
SET @user_num = 30;
231
INSERT INTO tstmt(num) VALUES (@user_num);
232
233
# string
234
SET @user_text = 'Bergsbrunna';
235
INSERT INTO tstmt(text) VALUES (@user_text);
236
SET @user_text = 'Centrum';
237
INSERT INTO tstmt(text) VALUES (@user_text);
238
239
240
--echo ==== Insert variables from a stored procedure ====
241
242
DELIMITER |;
243
CREATE PROCEDURE proc()
244
BEGIN
245
246
  # GLOBAL
247
248
  # boolean
249
  SET @@global.relay_log_purge = ON;
250
  INSERT INTO tproc(truth) VALUES (@@global.relay_log_purge);
251
  SET @@global.relay_log_purge = OFF;
252
  INSERT INTO tproc(truth) VALUES (@@global.relay_log_purge);
253
254
  # numeric
255
  SET @@global.sync_binlog = 2000000;
256
  INSERT INTO tproc(num) VALUES (@@global.sync_binlog);
257
  SET @@global.sync_binlog = 3000000;
258
  INSERT INTO tproc(num) VALUES (@@global.sync_binlog);
259
260
  # string
261
  SET @@global.init_slave = 'bison';
262
  INSERT INTO tproc(text) VALUES (@@global.init_slave);
263
  SET @@global.init_slave = 'cat';
264
  INSERT INTO tproc(text) VALUES (@@global.init_slave);
265
266
  # enumeration
267
  SET @@global.slave_exec_mode = 'IDEMPOTENT';
268
  INSERT INTO tproc(text) VALUES (@@global.slave_exec_mode);
269
  SET @@global.slave_exec_mode = 'STRICT';
270
  INSERT INTO tproc(text) VALUES (@@global.slave_exec_mode);
271
272
  # SESSION
273
274
  # boolean
275
  SET @@sql_big_selects = ON;
276
  INSERT INTO tproc(truth) VALUES (@@sql_big_selects);
277
  SET @@sql_big_selects = OFF;
278
  INSERT INTO tproc(truth) VALUES (@@sql_big_selects);
279
280
  # numeric
281
  SET @@last_insert_id = 20;
282
  INSERT INTO tproc(num) VALUES (@@last_insert_id);
283
  SET @@last_insert_id = 30;
284
  INSERT INTO tproc(num) VALUES (@@last_insert_id);
285
286
  # BOTH
287
288
  # boolean
289
  SET @@global.low_priority_updates = ON;
290
  SET @@local.low_priority_updates = OFF;
291
  INSERT INTO tproc(truth) VALUES (@@global.low_priority_updates);
292
  INSERT INTO tproc(truth) VALUES (@@local.low_priority_updates);
293
  SET @@global.low_priority_updates = OFF;
294
  SET @@local.low_priority_updates = ON;
295
  INSERT INTO tproc(truth) VALUES (@@global.low_priority_updates);
296
  INSERT INTO tproc(truth) VALUES (@@local.low_priority_updates);
297
298
  # numeric
299
  SET @@global.default_week_format = 3;
300
  SET @@local.default_week_format = 4;
301
  INSERT INTO tproc(num) VALUES (@@global.default_week_format);
302
  INSERT INTO tproc(num) VALUES (@@local.default_week_format);
303
  SET @@global.default_week_format = 5;
304
  SET @@local.default_week_format = 6;
305
  INSERT INTO tproc(num) VALUES (@@global.default_week_format);
306
  INSERT INTO tproc(num) VALUES (@@local.default_week_format);
307
308
  # text
309
  SET @@global.lc_time_names = 'sv_SE';
310
  SET @@local.lc_time_names = 'sv_FI';
311
  INSERT INTO tproc(text) VALUES (@@global.lc_time_names);
312
  INSERT INTO tproc(text) VALUES (@@local.lc_time_names);
313
  SET @@global.lc_time_names = 'ar_TN';
314
  SET @@local.lc_time_names = 'ar_IQ';
315
  INSERT INTO tproc(text) VALUES (@@global.lc_time_names);
316
  INSERT INTO tproc(text) VALUES (@@local.lc_time_names);
317
318
  # enum
319
  SET @@global.sql_mode = '';
320
  SET @@local.sql_mode = 'IGNORE_SPACE,NO_AUTO_CREATE_USER';
321
  INSERT INTO tproc(text) VALUES (@@global.sql_mode);
322
  INSERT INTO tproc(text) VALUES (@@local.sql_mode);
323
  SET @@global.sql_mode = 'NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION';
324
  SET @@local.sql_mode = 'NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS';
325
  INSERT INTO tproc(text) VALUES (@@global.sql_mode);
326
  INSERT INTO tproc(text) VALUES (@@local.sql_mode);
327
328
  # USER
329
330
  # numeric
331
  SET @user_num = 20;
332
  INSERT INTO tproc(num) VALUES (@user_num);
333
  SET @user_num = 30;
334
  INSERT INTO tproc(num) VALUES (@user_num);
335
336
  # string
337
  SET @user_text = 'Bergsbrunna';
338
  INSERT INTO tproc(text) VALUES (@user_text);
339
  SET @user_text = 'Centrum';
340
  INSERT INTO tproc(text) VALUES (@user_text);
341
342
END|
343
DELIMITER ;|
344
345
CALL proc();
346
347
348
--echo ==== Insert variables from a stored function ====
349
350
DELIMITER |;
351
CREATE FUNCTION func()
352
RETURNS INT
353
BEGIN
354
355
  # GLOBAL
356
357
  # boolean
358
  SET @@global.relay_log_purge = ON;
359
  INSERT INTO tfunc(truth) VALUES (@@global.relay_log_purge);
360
  SET @@global.relay_log_purge = OFF;
361
  INSERT INTO tfunc(truth) VALUES (@@global.relay_log_purge);
362
363
  # numeric
364
  SET @@global.sync_binlog = 2000000;
365
  INSERT INTO tfunc(num) VALUES (@@global.sync_binlog);
366
  SET @@global.sync_binlog = 3000000;
367
  INSERT INTO tfunc(num) VALUES (@@global.sync_binlog);
368
369
  # string
370
  SET @@global.init_slave = 'bison';
371
  INSERT INTO tfunc(text) VALUES (@@global.init_slave);
372
  SET @@global.init_slave = 'cat';
373
  INSERT INTO tfunc(text) VALUES (@@global.init_slave);
374
375
  # enumeration
376
  SET @@global.slave_exec_mode = 'IDEMPOTENT';
377
  INSERT INTO tfunc(text) VALUES (@@global.slave_exec_mode);
378
  SET @@global.slave_exec_mode = 'STRICT';
379
  INSERT INTO tfunc(text) VALUES (@@global.slave_exec_mode);
380
381
  # SESSION
382
383
  # boolean
384
  SET @@sql_big_selects = ON;
385
  INSERT INTO tfunc(truth) VALUES (@@sql_big_selects);
386
  SET @@sql_big_selects = OFF;
387
  INSERT INTO tfunc(truth) VALUES (@@sql_big_selects);
388
389
  # numeric
390
  SET @@last_insert_id = 20;
391
  INSERT INTO tfunc(num) VALUES (@@last_insert_id);
392
  SET @@last_insert_id = 30;
393
  INSERT INTO tfunc(num) VALUES (@@last_insert_id);
394
395
  # BOTH
396
397
  # boolean
398
  SET @@global.low_priority_updates = ON;
399
  SET @@local.low_priority_updates = OFF;
400
  INSERT INTO tfunc(truth) VALUES (@@global.low_priority_updates);
401
  INSERT INTO tfunc(truth) VALUES (@@local.low_priority_updates);
402
  SET @@global.low_priority_updates = OFF;
403
  SET @@local.low_priority_updates = ON;
404
  INSERT INTO tfunc(truth) VALUES (@@global.low_priority_updates);
405
  INSERT INTO tfunc(truth) VALUES (@@local.low_priority_updates);
406
407
  # numeric
408
  SET @@global.default_week_format = 3;
409
  SET @@local.default_week_format = 4;
410
  INSERT INTO tfunc(num) VALUES (@@global.default_week_format);
411
  INSERT INTO tfunc(num) VALUES (@@local.default_week_format);
412
  SET @@global.default_week_format = 5;
413
  SET @@local.default_week_format = 6;
414
  INSERT INTO tfunc(num) VALUES (@@global.default_week_format);
415
  INSERT INTO tfunc(num) VALUES (@@local.default_week_format);
416
417
  # text
418
  SET @@global.lc_time_names = 'sv_SE';
419
  SET @@local.lc_time_names = 'sv_FI';
420
  INSERT INTO tfunc(text) VALUES (@@global.lc_time_names);
421
  INSERT INTO tfunc(text) VALUES (@@local.lc_time_names);
422
  SET @@global.lc_time_names = 'ar_TN';
423
  SET @@local.lc_time_names = 'ar_IQ';
424
  INSERT INTO tfunc(text) VALUES (@@global.lc_time_names);
425
  INSERT INTO tfunc(text) VALUES (@@local.lc_time_names);
426
427
  # enum
428
  SET @@global.sql_mode = '';
429
  SET @@local.sql_mode = 'IGNORE_SPACE,NO_AUTO_CREATE_USER';
430
  INSERT INTO tfunc(text) VALUES (@@global.sql_mode);
431
  INSERT INTO tfunc(text) VALUES (@@local.sql_mode);
432
  SET @@global.sql_mode = 'NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION';
433
  SET @@local.sql_mode = 'NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS';
434
  INSERT INTO tfunc(text) VALUES (@@global.sql_mode);
435
  INSERT INTO tfunc(text) VALUES (@@local.sql_mode);
436
437
  # USER
438
439
  # numeric
440
  SET @user_num = 20;
441
  INSERT INTO tfunc(num) VALUES (@user_num);
442
  SET @user_num = 30;
443
  INSERT INTO tfunc(num) VALUES (@user_num);
444
445
  # string
446
  SET @user_text = 'Bergsbrunna';
447
  INSERT INTO tfunc(text) VALUES (@user_text);
448
  SET @user_text = 'Centrum';
449
  INSERT INTO tfunc(text) VALUES (@user_text);
450
451
  RETURN 0;
452
END|
453
DELIMITER ;|
454
455
SELECT func();
456
457
458
--echo ==== Insert variables from a trigger ====
459
460
DELIMITER |;
461
CREATE TRIGGER trig
462
BEFORE INSERT ON trigger_table
463
FOR EACH ROW
464
BEGIN
465
466
  # GLOBAL
467
468
  # boolean
469
  SET @@global.relay_log_purge = ON;
470
  INSERT INTO ttrig(truth) VALUES (@@global.relay_log_purge);
471
  SET @@global.relay_log_purge = OFF;
472
  INSERT INTO ttrig(truth) VALUES (@@global.relay_log_purge);
473
474
  # numeric
475
  SET @@global.sync_binlog = 2000000;
476
  INSERT INTO ttrig(num) VALUES (@@global.sync_binlog);
477
  SET @@global.sync_binlog = 3000000;
478
  INSERT INTO ttrig(num) VALUES (@@global.sync_binlog);
479
480
  # string
481
  SET @@global.init_slave = 'bison';
482
  INSERT INTO ttrig(text) VALUES (@@global.init_slave);
483
  SET @@global.init_slave = 'cat';
484
  INSERT INTO ttrig(text) VALUES (@@global.init_slave);
485
486
  # enumeration
487
  SET @@global.slave_exec_mode = 'IDEMPOTENT';
488
  INSERT INTO ttrig(text) VALUES (@@global.slave_exec_mode);
489
  SET @@global.slave_exec_mode = 'STRICT';
490
  INSERT INTO ttrig(text) VALUES (@@global.slave_exec_mode);
491
492
  # SESSION
493
494
  # boolean
495
  SET @@sql_big_selects = ON;
496
  INSERT INTO ttrig(truth) VALUES (@@sql_big_selects);
497
  SET @@sql_big_selects = OFF;
498
  INSERT INTO ttrig(truth) VALUES (@@sql_big_selects);
499
500
  # numeric
501
  SET @@last_insert_id = 20;
502
  INSERT INTO ttrig(num) VALUES (@@last_insert_id);
503
  SET @@last_insert_id = 30;
504
  INSERT INTO ttrig(num) VALUES (@@last_insert_id);
505
506
  # BOTH
507
508
  # boolean
509
  SET @@global.low_priority_updates = ON;
510
  SET @@local.low_priority_updates = OFF;
511
  INSERT INTO ttrig(truth) VALUES (@@global.low_priority_updates);
512
  INSERT INTO ttrig(truth) VALUES (@@local.low_priority_updates);
513
  SET @@global.low_priority_updates = OFF;
514
  SET @@local.low_priority_updates = ON;
515
  INSERT INTO ttrig(truth) VALUES (@@global.low_priority_updates);
516
  INSERT INTO ttrig(truth) VALUES (@@local.low_priority_updates);
517
518
  # numeric
519
  SET @@global.default_week_format = 3;
520
  SET @@local.default_week_format = 4;
521
  INSERT INTO ttrig(num) VALUES (@@global.default_week_format);
522
  INSERT INTO ttrig(num) VALUES (@@local.default_week_format);
523
  SET @@global.default_week_format = 5;
524
  SET @@local.default_week_format = 6;
525
  INSERT INTO ttrig(num) VALUES (@@global.default_week_format);
526
  INSERT INTO ttrig(num) VALUES (@@local.default_week_format);
527
528
  # text
529
  SET @@global.lc_time_names = 'sv_SE';
530
  SET @@local.lc_time_names = 'sv_FI';
531
  INSERT INTO ttrig(text) VALUES (@@global.lc_time_names);
532
  INSERT INTO ttrig(text) VALUES (@@local.lc_time_names);
533
  SET @@global.lc_time_names = 'ar_TN';
534
  SET @@local.lc_time_names = 'ar_IQ';
535
  INSERT INTO ttrig(text) VALUES (@@global.lc_time_names);
536
  INSERT INTO ttrig(text) VALUES (@@local.lc_time_names);
537
538
  # enum
539
  SET @@global.sql_mode = '';
540
  SET @@local.sql_mode = 'IGNORE_SPACE,NO_AUTO_CREATE_USER';
541
  INSERT INTO ttrig(text) VALUES (@@global.sql_mode);
542
  INSERT INTO ttrig(text) VALUES (@@local.sql_mode);
543
  SET @@global.sql_mode = 'NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION';
544
  SET @@local.sql_mode = 'NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS';
545
  INSERT INTO ttrig(text) VALUES (@@global.sql_mode);
546
  INSERT INTO ttrig(text) VALUES (@@local.sql_mode);
547
548
  # USER
549
550
  # numeric
551
  SET @user_num = 20;
552
  INSERT INTO ttrig(num) VALUES (@user_num);
553
  SET @user_num = 30;
554
  INSERT INTO ttrig(num) VALUES (@user_num);
555
556
  # string
557
  SET @user_text = 'Bergsbrunna';
558
  INSERT INTO ttrig(text) VALUES (@user_text);
559
  SET @user_text = 'Centrum';
560
  INSERT INTO ttrig(text) VALUES (@user_text);
561
END|
562
DELIMITER ;|
563
564
INSERT INTO trigger_table VALUES ('bye.');
565
566
567
--echo ==== Insert variables from a prepared statement ====
568
569
# GLOBAL
570
571
# boolean
572
PREPARE p1 FROM 'SET @@global.relay_log_purge = ON';
573
PREPARE p2 FROM 'INSERT INTO tprep(truth) VALUES (@@global.relay_log_purge)';
574
PREPARE p3 FROM 'SET @@global.relay_log_purge = OFF';
575
PREPARE p4 FROM 'INSERT INTO tprep(truth) VALUES (@@global.relay_log_purge)';
576
577
# numeric
578
PREPARE p5 FROM 'SET @@global.sync_binlog = 2000000';
579
PREPARE p6 FROM 'INSERT INTO tprep(num) VALUES (@@global.sync_binlog)';
580
PREPARE p7 FROM 'SET @@global.sync_binlog = 3000000';
581
PREPARE p8 FROM 'INSERT INTO tprep(num) VALUES (@@global.sync_binlog)';
582
583
# string
584
PREPARE p9 FROM 'SET @@global.init_slave = \'bison\'';
585
PREPARE p10 FROM 'INSERT INTO tprep(text) VALUES (@@global.init_slave)';
586
PREPARE p11 FROM 'SET @@global.init_slave = \'cat\'';
587
PREPARE p12 FROM 'INSERT INTO tprep(text) VALUES (@@global.init_slave)';
588
589
# enumeration
590
PREPARE p13 FROM 'SET @@global.slave_exec_mode = \'IDEMPOTENT\'';
591
PREPARE p14 FROM 'INSERT INTO tprep(text) VALUES (@@global.slave_exec_mode)';
592
PREPARE p15 FROM 'SET @@global.slave_exec_mode = \'STRICT\'';
593
PREPARE p16 FROM 'INSERT INTO tprep(text) VALUES (@@global.slave_exec_mode)';
594
595
# SESSION
596
597
# boolean
598
PREPARE p17 FROM 'SET @@sql_big_selects = ON';
599
PREPARE p18 FROM 'INSERT INTO tprep(truth) VALUES (@@sql_big_selects)';
600
PREPARE p19 FROM 'SET @@sql_big_selects = OFF';
601
PREPARE p20 FROM 'INSERT INTO tprep(truth) VALUES (@@sql_big_selects)';
602
603
# numeric
604
PREPARE p21 FROM 'SET @@last_insert_id = 20';
605
PREPARE p22 FROM 'INSERT INTO tprep(num) VALUES (@@last_insert_id)';
606
PREPARE p23 FROM 'SET @@last_insert_id = 30';
607
PREPARE p24 FROM 'INSERT INTO tprep(num) VALUES (@@last_insert_id)';
608
609
# BOTH
610
611
# boolean
612
PREPARE p25 FROM 'SET @@global.low_priority_updates = ON';
613
PREPARE p26 FROM 'SET @@local.low_priority_updates = OFF';
614
PREPARE p27 FROM 'INSERT INTO tprep(truth) VALUES (@@global.low_priority_updates)';
615
PREPARE p28 FROM 'INSERT INTO tprep(truth) VALUES (@@local.low_priority_updates)';
616
PREPARE p29 FROM 'SET @@global.low_priority_updates = OFF';
617
PREPARE p30 FROM 'SET @@local.low_priority_updates = ON';
618
PREPARE p31 FROM 'INSERT INTO tprep(truth) VALUES (@@global.low_priority_updates)';
619
PREPARE p32 FROM 'INSERT INTO tprep(truth) VALUES (@@local.low_priority_updates)';
620
621
# numeric
622
PREPARE p33 FROM 'SET @@global.default_week_format = 3';
623
PREPARE p34 FROM 'SET @@local.default_week_format = 4';
624
PREPARE p35 FROM 'INSERT INTO tprep(num) VALUES (@@global.default_week_format)';
625
PREPARE p36 FROM 'INSERT INTO tprep(num) VALUES (@@local.default_week_format)';
626
PREPARE p37 FROM 'SET @@global.default_week_format = 5';
627
PREPARE p38 FROM 'SET @@local.default_week_format = 6';
628
PREPARE p39 FROM 'INSERT INTO tprep(num) VALUES (@@global.default_week_format)';
629
PREPARE p40 FROM 'INSERT INTO tprep(num) VALUES (@@local.default_week_format)';
630
631
# text
632
PREPARE p41 FROM 'SET @@global.lc_time_names = \'sv_SE\'';
633
PREPARE p42 FROM 'SET @@local.lc_time_names = \'sv_FI\'';
634
PREPARE p43 FROM 'INSERT INTO tprep(text) VALUES (@@global.lc_time_names)';
635
PREPARE p44 FROM 'INSERT INTO tprep(text) VALUES (@@local.lc_time_names)';
636
PREPARE p45 FROM 'SET @@global.lc_time_names = \'ar_TN\'';
637
PREPARE p46 FROM 'SET @@local.lc_time_names = \'ar_IQ\'';
638
PREPARE p47 FROM 'INSERT INTO tprep(text) VALUES (@@global.lc_time_names)';
639
PREPARE p48 FROM 'INSERT INTO tprep(text) VALUES (@@local.lc_time_names)';
640
641
# enum
642
PREPARE p49 FROM 'SET @@global.sql_mode = \'\'';
643
PREPARE p50 FROM 'SET @@local.sql_mode = \'IGNORE_SPACE,NO_AUTO_CREATE_USER\'';
644
PREPARE p51 FROM 'INSERT INTO tprep(text) VALUES (@@global.sql_mode)';
645
PREPARE p52 FROM 'INSERT INTO tprep(text) VALUES (@@local.sql_mode)';
646
PREPARE p53 FROM 'SET @@global.sql_mode = \'NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION\'';
647
PREPARE p54 FROM 'SET @@local.sql_mode = \'NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS\'';
648
PREPARE p55 FROM 'INSERT INTO tprep(text) VALUES (@@global.sql_mode)';
649
PREPARE p56 FROM 'INSERT INTO tprep(text) VALUES (@@local.sql_mode)';
650
651
# USER
652
653
# numeric
654
PREPARE p57 FROM 'SET @user_num = 20';
655
PREPARE p58 FROM 'INSERT INTO tprep(num) VALUES (@user_num)';
656
PREPARE p59 FROM 'SET @user_num = 30';
657
PREPARE p60 FROM 'INSERT INTO tprep(num) VALUES (@user_num)';
658
659
# string
660
PREPARE p61 FROM 'SET @user_text = \'Bergsbrunna\'';
661
PREPARE p62 FROM 'INSERT INTO tprep(text) VALUES (@user_text)';
662
PREPARE p63 FROM 'SET @user_text = \'Centrum\'';
663
PREPARE p64 FROM 'INSERT INTO tprep(text) VALUES (@user_text)';
664
665
EXECUTE p1;  EXECUTE p2;  EXECUTE p3;  EXECUTE p4;  EXECUTE p5;  EXECUTE p6;
666
EXECUTE p7;  EXECUTE p8;  EXECUTE p9;  EXECUTE p10; EXECUTE p11; EXECUTE p12;
667
EXECUTE p13; EXECUTE p14; EXECUTE p15; EXECUTE p16; EXECUTE p17; EXECUTE p18;
668
EXECUTE p19; EXECUTE p20; EXECUTE p21; EXECUTE p22; EXECUTE p23; EXECUTE p24;
669
EXECUTE p25; EXECUTE p26; EXECUTE p27; EXECUTE p28; EXECUTE p29; EXECUTE p30;
670
EXECUTE p31; EXECUTE p32; EXECUTE p33; EXECUTE p34; EXECUTE p35; EXECUTE p36;
671
EXECUTE p37; EXECUTE p38; EXECUTE p39; EXECUTE p40; EXECUTE p41; EXECUTE p42;
672
EXECUTE p43; EXECUTE p44; EXECUTE p45; EXECUTE p46; EXECUTE p47; EXECUTE p48;
673
EXECUTE p49; EXECUTE p50; EXECUTE p51; EXECUTE p52; EXECUTE p53; EXECUTE p54;
674
EXECUTE p55; EXECUTE p56; EXECUTE p57; EXECUTE p58; EXECUTE p59; EXECUTE p60;
675
EXECUTE p61; EXECUTE p62; EXECUTE p63; EXECUTE p64;
676
677
678
--echo ==== Results ====
679
680
# Show the result in table test.tstmt on master...
681
SELECT * FROM tstmt ORDER BY id;
682
let $diff_table_1=master:test.tstmt;
683
684
# ... then compare test.tstmt on master to the other tables on master...
685
let $diff_table_2=master:test.tproc;
686
source include/diff_tables.inc;
687
let $diff_table_2=master:test.tfunc;
688
source include/diff_tables.inc;
689
let $diff_table_2=master:test.ttrig;
690
source include/diff_tables.inc;
691
let $diff_table_2=master:test.tprep;
692
source include/diff_tables.inc;
693
694
# ... and to all tables on slave.
695
connection master;
696
sync_slave_with_master;
697
let $diff_table_2=slave:test.tstmt;
698
source include/diff_tables.inc;
699
let $diff_table_2=slave:test.tproc;
700
source include/diff_tables.inc;
701
let $diff_table_2=slave:test.tfunc;
702
source include/diff_tables.inc;
703
let $diff_table_2=slave:test.ttrig;
704
source include/diff_tables.inc;
705
let $diff_table_2=slave:test.tprep;
706
source include/diff_tables.inc;
707
708
709
--echo ==== Clean up ====
710
711
--echo [on master]
712
connection master;
713
DROP PROCEDURE proc;
714
DROP FUNCTION func;
715
DROP TRIGGER trig;
716
DROP TABLE tstmt, tproc, tfunc, ttrig, tprep, trigger_table;
717
718
SET @@global.default_week_format=  @m_default_week_format;
719
SET @@global.init_slave=           @m_init_slave;
720
SET @@global.lc_time_names=        @m_lc_time_names;
721
SET @@global.low_priority_updates= @m_low_priority_updates;
722
SET @@global.relay_log_purge=      @m_relay_log_purge;
723
SET @@global.slave_exec_mode=      @m_slave_exec_mode;
724
SET @@global.sql_mode=             @m_sql_mode;
725
SET @@global.sync_binlog=          @m_sync_binlog;
726
727
--echo [on slave]
728
connection slave;
729
SET @@global.default_week_format=  @s_default_week_format;
730
SET @@global.init_slave=           @s_init_slave;
731
SET @@global.lc_time_names=        @s_lc_time_names;
732
SET @@global.low_priority_updates= @s_low_priority_updates;
733
SET @@global.relay_log_purge=      @s_relay_log_purge;
734
SET @@global.slave_exec_mode=      @s_slave_exec_mode;
735
SET @@global.sql_mode=             @s_sql_mode;
736
SET @@global.sync_binlog=          @s_sync_binlog;
737
738
connection master;
739
sync_slave_with_master;