mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-26765 UNIX_TIMESTAMP(CURRENT_TIME()) return null ?!?
Problem: UNIX_TIMESTAMP() called for a expression of the TIME data type returned NULL. Inside Type_handler_timestamp_common::Item_val_native_with_conversion the call for item->get_date() did not convert TIME to DATETIME automatically (because it does not have to, by design). As a result, Type_handler_timestamp_common::TIME_to_native() received a MYSQL_TIME value with zero date 0000-00-00 and therefore returned "true" (indicating SQL NULL value). Fix: Removing the call for item->get_date(). Instantiating Datetime(item) instead. This forces automatic TIME to DATETIME conversion (unless @@old_mode is zero_date_time_cast).
This commit is contained in:
@ -221,3 +221,39 @@ a UNIX_TIMESTAMP(t1.a) a UNIX_TIMESTAMP(t2.a)
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET time_zone=DEFAULT;
|
SET time_zone=DEFAULT;
|
||||||
SET global mysql56_temporal_format=true;
|
SET global mysql56_temporal_format=true;
|
||||||
|
#
|
||||||
|
# MDEV-26765 UNIX_TIMESTAMP(CURRENT_TIME()) return null ?!?
|
||||||
|
#
|
||||||
|
SET old_mode=zero_date_time_cast;
|
||||||
|
SET @@time_zone='+00:00';
|
||||||
|
SET timestamp=1234567;
|
||||||
|
SELECT CURRENT_TIMESTAMP;
|
||||||
|
CURRENT_TIMESTAMP
|
||||||
|
1970-01-15 06:56:07
|
||||||
|
SELECT UNIX_TIMESTAMP(CURRENT_TIME());
|
||||||
|
UNIX_TIMESTAMP(CURRENT_TIME())
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect datetime value: '06:56:07'
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'06:56:07');
|
||||||
|
UNIX_TIMESTAMP(TIME'06:56:07')
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect datetime value: '06:56:07'
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'10:20:30');
|
||||||
|
UNIX_TIMESTAMP(TIME'10:20:30')
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect datetime value: '10:20:30'
|
||||||
|
CREATE OR REPLACE TABLE t1 (a TIME);
|
||||||
|
INSERT INTO t1 VALUES (TIME'06:56:07'),('10:20:30');
|
||||||
|
SELECT UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
|
||||||
|
UNIX_TIMESTAMP(a)
|
||||||
|
NULL
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1264 Out of range value for column 'a' at row 1
|
||||||
|
Warning 1264 Out of range value for column 'a' at row 2
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET @@time_zone=DEFAULT;
|
||||||
|
SET TIMESTAMP=DEFAULT;
|
||||||
|
@ -149,3 +149,23 @@ SELECT t1.a, UNIX_TIMESTAMP(t1.a), t2.a, UNIX_TIMESTAMP(t2.a) FROM t1 t1, t1 t2
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET time_zone=DEFAULT;
|
SET time_zone=DEFAULT;
|
||||||
SET global mysql56_temporal_format=true;
|
SET global mysql56_temporal_format=true;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-26765 UNIX_TIMESTAMP(CURRENT_TIME()) return null ?!?
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET old_mode=zero_date_time_cast;
|
||||||
|
SET @@time_zone='+00:00';
|
||||||
|
SET timestamp=1234567;
|
||||||
|
SELECT CURRENT_TIMESTAMP;
|
||||||
|
SELECT UNIX_TIMESTAMP(CURRENT_TIME());
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'06:56:07');
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'10:20:30');
|
||||||
|
CREATE OR REPLACE TABLE t1 (a TIME);
|
||||||
|
INSERT INTO t1 VALUES (TIME'06:56:07'),('10:20:30');
|
||||||
|
SELECT UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
SET @@time_zone=DEFAULT;
|
||||||
|
SET TIMESTAMP=DEFAULT;
|
||||||
|
@ -2420,5 +2420,31 @@ SET @@global.mysql56_temporal_format=default;
|
|||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
SET timestamp=DEFAULT;
|
SET timestamp=DEFAULT;
|
||||||
#
|
#
|
||||||
|
# MDEV-26765 UNIX_TIMESTAMP(CURRENT_TIME()) return null ?!?
|
||||||
|
#
|
||||||
|
SET @@time_zone='+00:00';
|
||||||
|
SET timestamp=1234567;
|
||||||
|
SELECT CURRENT_TIMESTAMP;
|
||||||
|
CURRENT_TIMESTAMP
|
||||||
|
1970-01-15 06:56:07
|
||||||
|
SELECT UNIX_TIMESTAMP(CURRENT_TIME());
|
||||||
|
UNIX_TIMESTAMP(CURRENT_TIME())
|
||||||
|
1234567
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'06:56:07');
|
||||||
|
UNIX_TIMESTAMP(TIME'06:56:07')
|
||||||
|
1234567
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'10:20:30');
|
||||||
|
UNIX_TIMESTAMP(TIME'10:20:30')
|
||||||
|
1246830
|
||||||
|
CREATE OR REPLACE TABLE t1 (a TIME);
|
||||||
|
INSERT INTO t1 VALUES (TIME'06:56:07'),('10:20:30');
|
||||||
|
SELECT UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
|
||||||
|
UNIX_TIMESTAMP(a)
|
||||||
|
1234567
|
||||||
|
1246830
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET @@time_zone=DEFAULT;
|
||||||
|
SET TIMESTAMP=DEFAULT;
|
||||||
|
#
|
||||||
# End of 10.4 tests
|
# End of 10.4 tests
|
||||||
#
|
#
|
||||||
|
@ -1566,6 +1566,25 @@ SET @@global.mysql56_temporal_format=default;
|
|||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
SET timestamp=DEFAULT;
|
SET timestamp=DEFAULT;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-26765 UNIX_TIMESTAMP(CURRENT_TIME()) return null ?!?
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @@time_zone='+00:00';
|
||||||
|
SET timestamp=1234567;
|
||||||
|
SELECT CURRENT_TIMESTAMP;
|
||||||
|
SELECT UNIX_TIMESTAMP(CURRENT_TIME());
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'06:56:07');
|
||||||
|
SELECT UNIX_TIMESTAMP(TIME'10:20:30');
|
||||||
|
CREATE OR REPLACE TABLE t1 (a TIME);
|
||||||
|
INSERT INTO t1 VALUES (TIME'06:56:07'),('10:20:30');
|
||||||
|
SELECT UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
SET @@time_zone=DEFAULT;
|
||||||
|
SET TIMESTAMP=DEFAULT;
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.4 tests
|
--echo # End of 10.4 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -8619,13 +8619,13 @@ Type_handler_timestamp_common::Item_val_native_with_conversion(THD *thd,
|
|||||||
Item *item,
|
Item *item,
|
||||||
Native *to) const
|
Native *to) const
|
||||||
{
|
{
|
||||||
MYSQL_TIME ltime;
|
|
||||||
if (item->type_handler()->type_handler_for_native_format() ==
|
if (item->type_handler()->type_handler_for_native_format() ==
|
||||||
&type_handler_timestamp2)
|
&type_handler_timestamp2)
|
||||||
return item->val_native(thd, to);
|
return item->val_native(thd, to);
|
||||||
|
Datetime dt(thd, item, Datetime::Options(TIME_NO_ZERO_IN_DATE, thd));
|
||||||
return
|
return
|
||||||
item->get_date(thd, <ime, Datetime::Options(TIME_NO_ZERO_IN_DATE, thd)) ||
|
!dt.is_valid_datetime() ||
|
||||||
TIME_to_native(thd, <ime, to, item->datetime_precision(thd));
|
TIME_to_native(thd, dt.get_mysql_time(), to, item->datetime_precision(thd));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Type_handler_null::union_element_finalize(Item_type_holder *item) const
|
bool Type_handler_null::union_element_finalize(Item_type_holder *item) const
|
||||||
|
Reference in New Issue
Block a user