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

Partitioning does not work with 'ALLOW_INVALID_DATES'

    XMLWordPrintable

Details

    Description

      I create a partitioned table using TO_SECONDS as a range function:

      SET sql_mode='allow_invalid_dates';
      DROP TABLE IF EXISTS t1;
      CREATE TABLE t1 (a DATE, KEY(a))
      PARTITION BY RANGE (TO_SECONDS(a))
      (PARTITION `p0001-01-01` VALUES LESS THAN (TO_SECONDS('0001-01-02')),
       PARTITION `p1001-01-01` VALUES LESS THAN (TO_SECONDS('1001-01-02')),
       PARTITION `p2001-01-01` VALUES LESS THAN (TO_SECONDS('2001-01-02')),
       PARTITION `pmax` VALUES LESS THAN (MAXVALUE));
       
      INSERT INTO t1 VALUES ('0001-01-01');
      INSERT INTO t1 VALUES ('0001-02-30');
      INSERT INTO t1 VALUES ('1001-01-01');
      INSERT INTO t1 VALUES ('1001-02-30');
      INSERT INTO t1 VALUES ('2001-01-01');
      INSERT INTO t1 VALUES ('2001-02-30');

      Now I want to search for '1001-02-30':
      EXPLAIN PARTITIONS for this value says:

      EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a='1001-02-30';
      +------+-------------+-------+-------------+------+---------------+------+---------+-------+------+-------------+
      | id   | select_type | table | partitions  | type | possible_keys | key  | key_len | ref   | rows | Extra       |
      +------+-------------+-------+-------------+------+---------------+------+---------+-------+------+-------------+
      |    1 | SIMPLE      | t1    | p0001-01-01 | ref  | a             | a    | 4       | const |    1 | Using index |
      +------+-------------+-------+-------------+------+---------------+------+---------+-------+------+-------------+
      1 row in set (0.00 sec)

      It's going to search in the smallest possible partition,
      probably because '1001-02-30' is an invalid date,
      while TO_SECONDS() normally expects a valid date only.

      Now do actual search:

      SELECT * FROM t1 WHERE a='1001-02-30';
      Empty set (0.00 sec)

      Oops.

      Let's check which partition it's actually in:

      SELECT * FROM t1 PARTITION(`p2001-01-01`);
      +------------+
      | a          |
      +------------+
      | 1001-02-30 |
      | 2001-01-01 |
      +------------+
      2 rows in set (0.00 sec)

      Oops. Why?

      Let's check if it works without partitions:

      ALTER TABLE t1 REMOVE PARTITIONING;
      SELECT * FROM t1 WHERE a='1001-02-30';
      +------------+
      | a          |
      +------------+
      | 1001-02-30 |
      +------------+
      1 row in set (0.00 sec)

      It does.

      Partitioning should be fixed to return the same
      row set for the same WHERE clause.

      Attachments

        Issue Links

          Activity

            People

              bar Alexander Barkov
              bar Alexander Barkov
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

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