Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-16246

insert timestamp into spider table from mysqldump gets wrong time zone.

Details

    Description

      From a dump file generated by:

      mysqldump --comments=0 --complete-insert=1 --default-character-set=utf8mb4 --disable-keys=1 --hex-blob=1 --no-create-db=1 --no-create-info=1 --set-charset=1 --tz-utc=1 test t1 > timestamp.dump
      

      Load it to a spider table:

      mysql test < timestamp.dump
      

      And it fails with:

      ERROR 1292 (22007) at line 13: Incorrect datetime value: '2018-03-25 02:40:00' for column 'b' at row 1
      

      How to reproduce:
      Create tables on at least two datanodes (spider children):

      CREATE TABLE `t1` (
        `a` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `b` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
        PRIMARY KEY (`a`);
      

      create the servers:

      CREATE SERVER testserver1 FOREIGN DATA WRAPPER mysql options ( host 'testserver1.example.com', user 'test_user', password 'test_password', port 3306);
      CREATE SERVER testserver2 FOREIGN DATA WRAPPER mysql options ( host 'testserver2.example.com', user 'test_user', password 'test_password', port 3306);
      

      Create the spider table:

      CREATE TABLE `t1` (
        `a` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `b` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
        PRIMARY KEY (`a`)
      ) ENGINE=SPIDER AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4
       PARTITION BY HASH (`a`)
      (PARTITION `p0` COMMENT = 'srv "testserver1", tbl "t1"' ENGINE = SPIDER,
       PARTITION `p1` COMMENT = 'srv "testserver2", tbl "t1"' ENGINE = SPIDER);
      

      Use the dumpfile:

      cat timestamp.dump

      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;
      /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
      /*!40103 SET TIME_ZONE='+00:00' */;
      /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
      /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
      /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
       
      LOCK TABLES `t1` WRITE;
      /*!40000 ALTER TABLE `t1` DISABLE KEYS */;
      INSERT INTO `t1` (`a`, `b`) VALUES (3,'2018-03-25 02:40:00'),(5,'2018-03-25 00:30:00'),(13,'2018-03-24 23:30:00'),(15,'2018-03-25 01:30:00');
      /*!40000 ALTER TABLE `t1` ENABLE KEYS */;
      UNLOCK TABLES;
      /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
       
      /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
      /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
      /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
      /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
      /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
      /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
      

      and load with mysql test < timestamp.dump and it fails with:

      ERROR 1292 (22007) at line 13: Incorrect datetime value: '2018-03-25 02:40:00' for column 'b' at row 1
      

      This is of course a simplified table structure etc. from what we are using, but it shows the bug in an easier fashion.

      Attachments

        Issue Links

          Activity

            Jacob,
            For initialize "UTC" time zone, if it is possible, it should be initialized at spider_db_init().
            I think it is better to change time_zone like "thd->variables.time_zone = UTC" instead of "table->in_use->variables.time_zone = UTC". It reduces changing it.

            Kentoku Kentoku Shiba (Inactive) added a comment - Jacob, For initialize "UTC" time zone, if it is possible, it should be initialized at spider_db_init(). I think it is better to change time_zone like "thd->variables.time_zone = UTC" instead of "table->in_use->variables.time_zone = UTC". It reduces changing it.

            Kentoku,
            The UTC initialization cannot be done in spider_db_init(), which is called during plugin initialization, because MariaDB's time zone infrastructure is initialized AFTER plugin initialization.
            I have made the "thd->variables.time_zone = UTC" changes that you suggested.

            jacob-mathew Jacob Mathew (Inactive) added a comment - Kentoku, The UTC initialization cannot be done in spider_db_init(), which is called during plugin initialization, because MariaDB's time zone infrastructure is initialized AFTER plugin initialization. I have made the "thd->variables.time_zone = UTC" changes that you suggested.

            Fix is pushed to 10.3.

            jacob-mathew Jacob Mathew (Inactive) added a comment - Fix is pushed to 10.3.

            Fix is pushed to 10.4.

            jacob-mathew Jacob Mathew (Inactive) added a comment - Fix is pushed to 10.4.

            We have tested and verified that the fix works.

            mattiasjonsson Mattias Jonsson added a comment - We have tested and verified that the fix works.

            People

              jacob-mathew Jacob Mathew (Inactive)
              mattiasjonsson Mattias Jonsson
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.