summaryrefslogtreecommitdiff
path: root/mysql-test/suite/rpl/t/rpl_timezone.test
blob: 1f0220421abef2156885d6cd570e92b8d9c95089 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#######################################
# Change Author: JBM
# Change Date: 2006-01-17
# Change: Added order by
#######################################
# Test of replication of time zones.
######################################
# There is currently some bug possibly in prepared statements (this
# test fails with --ps-protocol): sys_var_thd_time_zone::value_ptr()
# is called only at prepare time, not at execution time. So,
# thd->time_zone_used is not equal to 1 (it is back to 0, because of
# reset_thd_for_next_command called at execution time), so the
# timezone used in CONVERT_TZ is not binlogged. To debug (by Guilhem
# and possibly Konstantin).

source include/master-slave.inc;

--disable_query_log
CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
--enable_query_log

--disable_ps_protocol

# Save original timezone
set @my_time_zone= @@global.time_zone;

# Some preparations
let $VERSION=`select version()`;
set timestamp=100000000; # for fixed output of mysqlbinlog
create table t1 (t timestamp, n int not null auto_increment, PRIMARY KEY(n));
create table t2 (t char(32), n int not null auto_increment, PRIMARY KEY(n));

connection slave;
select @@time_zone;
#set time_zone='UTC';
#select @@time_zone;
#
# Let us check how well replication works when we are saving datetime
# value in TIMESTAMP field.
#
connection master;
select @@time_zone;
#set time_zone='UTC';
#select @@time_zone;
insert into t1 values ('20050101000000', NULL), ('20050611093902',NULL);
insert into t1 values ('20040101000000',NULL), ('20040611093902',NULL);
SELECT * FROM t1 ORDER BY n;
sync_slave_with_master;
#set time_zone='UTC';
SELECT * FROM t1 ORDER BY n;

# Let us check also that setting of time_zone back to default also works
# well
connection master;
delete from t1;
set time_zone='Europe/Moscow';
insert into t1 values ('20040101000000',NULL), ('20040611093902',NULL);
SELECT * FROM t1 ORDER BY n;
sync_slave_with_master;
set time_zone='Europe/Moscow';
SELECT * FROM t1 ORDER BY n;
connection master;
# Change Author: JBM
# Change Date: 2005-12-22
# Change: Comment out the exec of the binlog so test works for both SBR and RBR
#--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
#--exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/log/master-bin.000001

# Let us check with LOAD DATA INFILE
# (we do it after mysqlbinlog because the temp files names are not constant)
connection master;
delete from t1;
set time_zone='UTC';
load data infile '../../std_data/rpl_timezone2.dat' into table t1;
SELECT * FROM t1 ORDER BY n;
sync_slave_with_master;
set time_zone='UTC';
SELECT * FROM t1 ORDER BY n;
set time_zone='Europe/Moscow';

# Put back values of before the LOAD
connection master;
set time_zone='Europe/Moscow';
delete from t1;
insert into t1 values ('20040101000000',NULL), ('20040611093902',NULL);

#
# Now let us check how well we replicate statments reading TIMESTAMP fields
# (We should see the same data on master and on slave but it should differ
# from originally inserted)
#
set time_zone='MET';
--disable_warnings ONCE
insert into t2 (select * from t1);
SELECT * FROM t1 ORDER BY n;
sync_slave_with_master;
SELECT * FROM t2 ORDER BY n;

#
# Now let us check how well we replicate various CURRENT_* functions
#
connection master;
delete from t2;
set timestamp=1000072000;
insert into t2 values (current_timestamp,NULL), (current_date,NULL), (current_time,NULL);
sync_slave_with_master;
SELECT * FROM t2 ORDER BY n;

#
# At last let us check replication of FROM_UNIXTIME/UNIX_TIMESTAMP functions.
#
connection master;
delete from t2;
insert into t2 values (from_unixtime(1000000000),NULL),
                      (unix_timestamp('2001-09-09 03:46:40'),NULL);
SELECT * FROM t2 ORDER BY n;
sync_slave_with_master;
# We should get same result on slave as on master
SELECT * FROM t2 ORDER BY n;

#
# Let us check that we are allowing to set global time_zone with
# replication
#
connection master;
set global time_zone='MET';

#
# Let us see if CONVERT_TZ(@@time_zone) replicates
#
delete from t2;
set time_zone='UTC';
insert into t2 values(convert_tz('2004-01-01 00:00:00','MET',@@time_zone),NULL);
insert into t2 values(convert_tz('2005-01-01 00:00:00','MET','Japan'),NULL);
SELECT * FROM t2 ORDER BY n;
sync_slave_with_master;
SELECT * FROM t2 ORDER BY n;

# Clean up
connection master;
drop table t1, t2;
sync_slave_with_master;


# Restore original timezone
connection master;
set global time_zone= @my_time_zone;

--echo End of 4.1 tests

#
# Bug #29536: timestamp inconsistent in replication around 1970
#
connection master;

CREATE TABLE t1 (a INT, b TIMESTAMP);
INSERT INTO t1 VALUES (1, NOW());

SET @@session.time_zone='Japan';
UPDATE t1 SET b= '1970-01-01 08:59:59' WHERE a= 1;
SELECT * FROM t1 ORDER BY a;

sync_slave_with_master;
SET @@session.time_zone='Japan';
# must procdure the same result as the SELECT on the master
SELECT * FROM t1 ORDER BY a;

SET @@session.time_zone = default;
connection master;
DROP TABLE t1;
SET @@session.time_zone = default;
--sync_slave_with_master
--source include/stop_slave.inc

# Bug#41719 delayed INSERT into timestamp col needs set time_zone for concurrent binlogging
# To test that time_zone is correctly binloging for 'insert delayed' statement
# Insert 2 values into timestamp col with different time_zone. Check result.

--connection master
reset master;
CREATE TABLE t1 (date timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, a int(11) default NULL);

SET @@session.time_zone='+01:00';
insert into t1 values('2008-12-23 19:39:39',1);

--connection master1
SET @@session.time_zone='+02:00';
insert delayed into t1 values ('2008-12-23 19:39:39',2);

# wait for the delayed insert to be executed
let $wait_condition= SELECT date FROM t1 WHERE a=2;
--source include/wait_condition.inc

flush table t1;
flush logs;
select * from t1;
DROP TABLE t1;

let $MYSQLD_DATADIR= `select @@datadir;`;
--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 | $MYSQL
--connection master1
select * from t1 order by a;
DROP TABLE t1;
SET @@session.time_zone = default;

--let $rpl_only_running_threads= 1
--source include/rpl_end.inc

--echo End of 5.0 tests