MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Leonard Zhou Date:March 24 2009 7:06am
Subject:bzr push into mysql-6.0-bugteam branch (leonard:3157)
View as plain text  
 3157 Leonard Zhou	2009-03-24 [merge]
      Merge

    modified:
      storage/csv/ha_tina.cc
      storage/csv/ha_tina.h
      storage/csv/transparent_file.cc
      storage/csv/transparent_file.h
=== modified file 'mysql-test/suite/rpl/r/rpl_timezone.result'
--- a/mysql-test/suite/rpl/r/rpl_timezone.result	2008-02-28 11:21:44 +0000
+++ b/mysql-test/suite/rpl/r/rpl_timezone.result	2009-03-24 06:24:27 +0000
@@ -122,4 +122,22 @@ a	b
 SET @@session.time_zone = default;
 DROP TABLE t1;
 SET @@session.time_zone = default;
+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);
+SET @@session.time_zone='+02:00';
+insert delayed into t1 values ('2008-12-23 19:39:39',2);
+flush table t1;
+flush logs;
+select * from t1;
+date	a
+2008-12-23 20:39:39	1
+2008-12-23 19:39:39	2
+DROP TABLE t1;
+select * from t1 order by a;
+date	a
+2008-12-23 20:39:39	1
+2008-12-23 19:39:39	2
+DROP TABLE t1;
+SET @@session.time_zone = default;
 End of 5.0 tests

=== modified file 'mysql-test/suite/rpl/t/rpl_timezone.test'
--- a/mysql-test/suite/rpl/t/rpl_timezone.test	2007-12-12 17:19:24 +0000
+++ b/mysql-test/suite/rpl/t/rpl_timezone.test	2009-03-24 06:24:27 +0000
@@ -165,5 +165,31 @@ connection master;
 DROP TABLE t1;
 SET @@session.time_zone = default;
 
+# 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
+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);
+# Forces table t1 to be closed and flushes the query cache.
+# This makes sure that 'delayed insert' is executed before next statement.
+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;
 
 --echo End of 5.0 tests

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2009-03-19 16:42:23 +0000
+++ b/sql/sql_insert.cc	2009-03-24 06:35:51 +0000
@@ -1697,10 +1697,11 @@ public:
   ulong auto_increment_offset;
   timestamp_auto_set_type timestamp_field_type;
   LEX_STRING query;
+  Time_zone *time_zone;
 
   delayed_row(LEX_STRING const query_arg, enum_duplicates dup_arg,
               bool ignore_arg, bool log_query_arg)
-    : record(0), dup(dup_arg), ignore(ignore_arg), log_query(log_query_arg),
+    : record(0), time_zone(0), dup(dup_arg), ignore(ignore_arg), log_query(log_query_arg),
       forced_insert_id(0), query(query_arg)
     {}
   ~delayed_row()
@@ -2187,6 +2188,19 @@ int write_delayed(THD *thd, TABLE *table
     thd->first_successful_insert_id_in_prev_stmt;
   row->timestamp_field_type=    table->timestamp_field_type;
 
+  /* Add session variable timezone
+     Time_zone object will not be freed even the thread is ended.
+     So we can get time_zone object from thread which handling delayed statement.
+     See the comment of my_tz_find() for detail.
+  */
+  if (thd->time_zone_used)
+  {
+    row->time_zone = thd->variables.time_zone;
+  }
+  else
+  {
+    row->time_zone = NULL;
+  }
   /* Copy session variables. */
   row->auto_increment_increment= thd->variables.auto_increment_increment;
   row->auto_increment_offset=    thd->variables.auto_increment_offset;
@@ -2719,6 +2733,14 @@ bool Delayed_insert::handle_inserts(void
 
     if (log_query && mysql_bin_log.is_open())
     {
+      bool backup_time_zone_used = thd.time_zone_used;
+      Time_zone *backup_time_zone = thd.variables.time_zone;
+      if (row->time_zone != NULL)
+      {
+        thd.time_zone_used = true;
+        thd.variables.time_zone = row->time_zone;
+      }
+
       /*
         If the query has several rows to insert, only the first row will come
         here. In row-based binlogging, this means that the first row will be
@@ -2730,6 +2752,9 @@ bool Delayed_insert::handle_inserts(void
       thd.binlog_query(THD::ROW_QUERY_TYPE,
                        row->query.str, row->query.length,
                        FALSE, FALSE);
+
+      thd.time_zone_used = backup_time_zone_used;
+      thd.variables.time_zone = backup_time_zone;
     }
 
     if (table->s->blob_fields)


Attachment: [text/bzr-bundle] bzr/leonard@mysql.com-20090324065952-vpz31df2ifhom983.bundle
Thread
bzr push into mysql-6.0-bugteam branch (leonard:3157) Leonard Zhou24 Mar