summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2018-02-09 19:47:00 +0400
committerAlexander Barkov <bar@mariadb.org>2018-02-09 19:47:00 +0400
commitb0a92333c00f8facd20c55cf7a8dfaf896b7f24d (patch)
treead266508acfbc799cb6f8e4d25bed4cdd19de6e4
parent6f0b316fbe83d2cf555f867dda262896d18fbbf6 (diff)
downloadmariadb-git-b0a92333c00f8facd20c55cf7a8dfaf896b7f24d.tar.gz
MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column
-rw-r--r--mysql-test/r/type_time_6065.result44
-rw-r--r--mysql-test/t/type_time_6065.test23
-rw-r--r--sql/field.cc7
3 files changed, 74 insertions, 0 deletions
diff --git a/mysql-test/r/type_time_6065.result b/mysql-test/r/type_time_6065.result
index db3efc3bcbb..1f64f9e90e2 100644
--- a/mysql-test/r/type_time_6065.result
+++ b/mysql-test/r/type_time_6065.result
@@ -2308,3 +2308,47 @@ col_int_nokey
1
DROP TABLE t1,t2,t3;
SET TIMESTAMP=0;
+#
+# MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column
+#
+SET TIMESTAMP=UNIX_TIMESTAMP('2012-01-31 10:14:35');
+CREATE TABLE t1 (col_time_key TIME, KEY(col_time_key));
+CREATE TABLE t2 (col_datetime_key DATETIME);
+INSERT INTO t1 VALUES ('-760:00:00'),('760:00:00');
+INSERT INTO t1 VALUES ('-770:00:00'),('770:00:00');
+INSERT INTO t2 SELECT * FROM t1;
+SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
+col_datetime_key col_time_key
+2011-12-30 08:00:00 -760:00:00
+2012-03-02 16:00:00 760:00:00
+2011-12-29 22:00:00 -770:00:00
+2012-03-03 02:00:00 770:00:00
+SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
+col_datetime_key col_time_key
+2011-12-29 22:00:00 -770:00:00
+2011-12-30 08:00:00 -760:00:00
+2012-03-02 16:00:00 760:00:00
+2012-03-03 02:00:00 770:00:00
+INSERT INTO t1 VALUES ('-838:59:59'),('838:59:59');
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-838:59:59' HOUR_SECOND));
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '838:59:59' HOUR_SECOND));
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-839:00:00' HOUR_SECOND));
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '839:00:00' HOUR_SECOND));
+SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
+col_datetime_key col_time_key
+2011-12-30 08:00:00 -760:00:00
+2012-03-02 16:00:00 760:00:00
+2011-12-29 22:00:00 -770:00:00
+2012-03-03 02:00:00 770:00:00
+2011-12-27 01:00:01 -838:59:59
+2012-03-05 22:59:59 838:59:59
+SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
+col_datetime_key col_time_key
+2011-12-29 22:00:00 -770:00:00
+2011-12-30 08:00:00 -760:00:00
+2012-03-02 16:00:00 760:00:00
+2012-03-03 02:00:00 770:00:00
+2011-12-27 01:00:01 -838:59:59
+2012-03-05 22:59:59 838:59:59
+DROP TABLE t1, t2;
+SET TIMESTAMP=DEFAULT;
diff --git a/mysql-test/t/type_time_6065.test b/mysql-test/t/type_time_6065.test
index 6e29b849be5..fc91c530760 100644
--- a/mysql-test/t/type_time_6065.test
+++ b/mysql-test/t/type_time_6065.test
@@ -172,6 +172,29 @@ eval $query;
DROP TABLE t1,t2,t3;
SET TIMESTAMP=0; # back to current time
+
+--echo #
+--echo # MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column
+--echo #
+
+SET TIMESTAMP=UNIX_TIMESTAMP('2012-01-31 10:14:35');
+CREATE TABLE t1 (col_time_key TIME, KEY(col_time_key));
+CREATE TABLE t2 (col_datetime_key DATETIME);
+INSERT INTO t1 VALUES ('-760:00:00'),('760:00:00');
+INSERT INTO t1 VALUES ('-770:00:00'),('770:00:00');
+INSERT INTO t2 SELECT * FROM t1;
+SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
+SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
+INSERT INTO t1 VALUES ('-838:59:59'),('838:59:59');
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-838:59:59' HOUR_SECOND));
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '838:59:59' HOUR_SECOND));
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-839:00:00' HOUR_SECOND));
+INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '839:00:00' HOUR_SECOND));
+SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
+SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
+DROP TABLE t1, t2;
+SET TIMESTAMP=DEFAULT;
+
#
# End of 10.0 tests
#
diff --git a/sql/field.cc b/sql/field.cc
index c36fff06a07..a9a7d54929b 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5330,6 +5330,13 @@ static void calc_datetime_days_diff(MYSQL_TIME *ltime, long days)
ltime->second) * 1000000LL +
ltime->second_part);
unpack_time(timediff, ltime);
+ /*
+ unpack_time() broke down hours into ltime members hour,day,month.
+ Mix them back to ltime->hour using the same factors
+ that pack_time()/unpack_time() use (i.e. 32 for month).
+ */
+ ltime->hour+= (ltime->month * 32 + ltime->day) * 24;
+ ltime->month= ltime->day= 0;
}
ltime->time_type= MYSQL_TIMESTAMP_TIME;
}