# Test sql_mode time_truncate_fractional with strict mode. SET sql_mode='time_truncate_fractional,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; --echo # --echo # Testing time_truncate_fractional from VARCHAR and TIME(6) to TIME(N) --echo # CREATE TABLE t1 (a VARCHAR(32), t6 TIME(6), t5 TIME(5), t4 TIME(4), t3 TIME(3), t2 TIME(2), t1 TIME(1), t0 TIME); INSERT INTO t1 (a) VALUES ('10:10:10.9999999'); INSERT INTO t1 (a) VALUES ('10:10:10.9999994'); --query_vertical SELECT * FROM t1; ALTER TABLE t1 MODIFY a TIME(6); UPDATE t1 SET t0=a, t1=a, t2=a, t3=a, t4=a, t5=a, t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional when altering TIME(N) to a smaller size --echo # CREATE TABLE t1 (a TIME(6)); INSERT INTO t1 VALUES ('10:10:10.999999'); ALTER TABLE t1 MODIFY a TIME(5); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1 (a TIME(6)); INSERT INTO t1 VALUES ('10:10:10.999999'); ALTER TABLE t1 MODIFY a TIME; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from DATETIME(6) to TIME(N) --echo # CREATE TABLE t1 (a DATETIME(6), t6 TIME(6), t5 TIME(5), t4 TIME(4), t3 TIME(3), t2 TIME(2), t1 TIME(1), t0 TIME); INSERT INTO t1 (a) VALUES ('2001-01-01 10:10:10.999999'); INSERT INTO t1 (a) VALUES ('2001-01-01 23:59:59.9999994'); UPDATE t1 SET t0=a, t1=a, t2=a, t3=a, t4=a, t5=a, t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from DECIMAL and DOUBLE to TIME(N) --echo # CREATE TABLE t1 (a DECIMAL(30,7), t6 TIME(6), t5 TIME(5), t4 TIME(4), t3 TIME(3), t2 TIME(2), t1 TIME(1), t0 TIME); INSERT INTO t1 (a) VALUES (101010.9999999); --query_vertical SELECT * FROM t1; ALTER TABLE t1 MODIFY a DOUBLE; UPDATE t1 SET t0=a, t1=a, t2=a, t3=a, t4=a, t5=a, t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing INSERT with near-maximum and near-minimum supported values. --echo # CREATE TABLE t1 (a TIME(6)); --error ER_TRUNCATED_WRONG_VALUE INSERT INTO t1 VALUES ('838:59:59.9999999'); --error ER_TRUNCATED_WRONG_VALUE INSERT INTO t1 VALUES ('-838:59:59.9999999'); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1 (a TIME); --error ER_TRUNCATED_WRONG_VALUE INSERT INTO t1 VALUES ('838:59:59.9999999'); --error ER_TRUNCATED_WRONG_VALUE INSERT INTO t1 VALUES ('-838:59:59.9999999'); SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing JOIN with comparison between TIME(6) and DECIMAL(20,6) --echo # CREATE TABLE t1 (a TIME(6)); INSERT INTO t1 VALUES ('11:22:33'); INSERT INTO t1 VALUES ('11:22:33.123'); INSERT INTO t1 VALUES ('-11:22:33'); INSERT INTO t1 VALUES ('-11:22:33.1234567'); CREATE TABLE t2 (b DECIMAL(20,6)); INSERT INTO t2 VALUES (112233.123); INSERT INTO t2 VALUES (-112233.1234567); SELECT * FROM t1, t2 WHERE a=b; DROP TABLE t1, t2; --echo # --echo # Testing time_truncate_fractional from TIME(N) to BIGINT --echo # CREATE TABLE t1 (a BIGINT, b TIME(6)); INSERT INTO t1 (b) VALUES ('10:10:59.500000'); INSERT INTO t1 (b) VALUES ('10:10:10.500000'); INSERT INTO t1 (b) VALUES ('10:10:10.499999'); UPDATE t1 SET a=b; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing JOIN with comparison between TIME(6) and VARCHAR --echo # CREATE TABLE t1 (a TIME(6)); INSERT INTO t1 VALUES ('11:22:33'); INSERT INTO t1 VALUES ('11:22:33.123'); INSERT INTO t1 VALUES ('-11:22:33'); INSERT INTO t1 VALUES ('-11:22:33.1234567'); CREATE TABLE t2 (b VARCHAR(20)); INSERT INTO t2 VALUES ('11:22:33.123'); INSERT INTO t2 VALUES ('-11:22:33.123456'); SELECT * FROM t1, t2 WHERE a=b; DROP TABLE t1, t2; --echo # --echo # Testing SEC_TO_TIME --echo # CREATE TABLE t1 AS SELECT SEC_TO_TIME(3661), CAST(SEC_TO_TIME(3661) AS CHAR); SHOW CREATE TABLE t1; SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1 AS SELECT SEC_TO_TIME(3661.9) AS c1, SEC_TO_TIME(3661.99) AS c2, SEC_TO_TIME(3661.999) AS c3, SEC_TO_TIME(3661.9999) AS c4, SEC_TO_TIME(3661.99999) AS c5, SEC_TO_TIME(3661.999999) AS c6, SEC_TO_TIME(3661.9999999) AS c7; SHOW CREATE TABLE t1; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional with MAKETIME() --echo # CREATE TABLE t1 (hour INT, minute INT, second DECIMAL(23,7)); INSERT INTO t1 VALUES (836, 59, 59.999999), (836, 59, 59.9999990), (836, 59, 59.9999991), (836, 59, 59.9999992), (836, 59, 59.9999993), (836, 59, 59.9999995), (836, 59, 59.9999996), (836, 59, 59.9999997), (836, 59, 59.9999998), (836, 59, 59.9999999); SELECT hour, minute, second, MAKETIME(hour, minute, second) AS MAKETIME FROM t1; SELECT hour + 1, minute, second, MAKETIME(hour + 1, minute, second) AS MAKETIME FROM t1; SELECT -hour, minute, second, MAKETIME(-hour, minute, second) AS MAKETIME FROM t1; SELECT -hour - 1, minute, second, MAKETIME(-hour - 1, minute, second) AS MAKETIME FROM t1; DROP TABLE t1; SELECT MAKETIME(838, 59, 59.0000005) AS MAKETIME; SELECT MAKETIME(838, 59, 59.00000056) AS MAKETIME; SELECT MAKETIME(838, 59, 59.000000567) AS MAKETIME; SELECT MAKETIME(838, 59, 59.0000005678) AS MAKETIME; SELECT MAKETIME(838, 59, 59.00000056789) AS MAKETIME; --echo # --echo # Testing time_truncate_fractional for DATETIME(6) --echo # CREATE TABLE t1 (a DATETIME(6)); INSERT INTO t1 VALUES (20010101100000.1234567); INSERT INTO t1 VALUES (20010228235959.9999997); INSERT INTO t1 VALUES ('2001-01-01 10:00:00.1234567'); INSERT INTO t1 VALUES ('2001-02-28 23:59:59.9999997'); SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional when altering DATETIME(N) to a smaller size --echo # CREATE TABLE t1 (a DATETIME(6)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999999'); ALTER TABLE t1 MODIFY a DATETIME(5); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1 (a DATETIME(6)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999999'); ALTER TABLE t1 MODIFY a TIME; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from VARCHAR and DATETIME(6) to DATETIME(N) --echo # CREATE TABLE t1 (a VARCHAR(32), t6 DATETIME(6), t5 DATETIME(5), t4 DATETIME(4), t3 DATETIME(3), t2 DATETIME(2), t1 DATETIME(1), t0 DATETIME); INSERT INTO t1 (a) VALUES ('2001-01-01 10:10:10.9999999'); --query_vertical SELECT * FROM t1; ALTER TABLE t1 MODIFY a DATETIME(6); UPDATE t1 SET t0=a, t1=a, t2=a, t3=a, t4=a, t5=a, t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from DATETIME(N) to BIGINT --echo # CREATE TABLE t1 (a BIGINT, b DATETIME(6)); INSERT INTO t1 (b) VALUES ('2001-01-01 10:10:59.500000'); INSERT INTO t1 (b) VALUES ('2001-01-01 10:10:10.500000'); INSERT INTO t1 (b) VALUES ('2001-01-01 10:10:10.499999'); UPDATE t1 SET a=b; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from DECIMAL to DATETIME(N) --echo # CREATE TABLE t1 (a DECIMAL(30,6), t6 DATETIME(6), t5 DATETIME(5), t4 DATETIME(4), t3 DATETIME(3), t2 DATETIME(2), t1 DATETIME(1), t0 DATETIME); INSERT INTO t1 (a) VALUES (20010101101010.999999); UPDATE t1 SET t0=a, t1=a, t2=a, t3=a, t4=a, t5=a, t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing function MICROSECOND --echo # CREATE TABLE t1 (a DATETIME(6)); INSERT INTO t1 VALUES ('2001-01-01 11:12:13.0000019'); INSERT INTO t1 VALUES ('2001-01-01 11:12:13.1000019'); INSERT INTO t1 VALUES ('2001-01-01 11:12:13.9999999'); SELECT a, MICROSECOND(a) FROM t1; SELECT a, EXTRACT(MICROSECOND FROM a) AS b FROM t1; DROP TABLE t1; SELECT MICROSECOND(CAST(20010101235959.456 AS DATETIME(6))) AS a; SELECT EXTRACT(MICROSECOND FROM CAST(20010101235959.456 AS DATETIME(6))) AS a; --echo # --echo # Testing time_truncate_fractional with CAST --echo # CREATE TABLE t1 (a DATETIME(6)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999999'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999998'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999997'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999996'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999995'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999994'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999993'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999992'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999991'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999990'); SELECT a, CAST(a AS DATETIME(5)) FROM t1; DROP TABLE t1; CREATE TABLE t1 (a DATETIME(5)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99999'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99998'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99997'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99996'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99995'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99994'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99993'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99992'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99991'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99990'); SELECT a, CAST(a AS DATETIME(4)) FROM t1; DROP TABLE t1; CREATE TABLE t1 (a DATETIME(4)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9999'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9998'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9997'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9996'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9995'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9994'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9993'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9992'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9991'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9990'); SELECT a, CAST(a AS DATETIME(3)) FROM t1; DROP TABLE t1; CREATE TABLE t1 (a DATETIME(3)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.998'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.997'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.996'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.995'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.994'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.993'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.992'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.991'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.990'); SELECT a, CAST(a AS DATETIME(2)) FROM t1; DROP TABLE t1; CREATE TABLE t1 (a DATETIME(2)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.99'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.98'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.97'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.96'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.95'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.94'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.93'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.92'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.91'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.90'); SELECT a, CAST(a AS DATETIME(1)) FROM t1; DROP TABLE t1; CREATE TABLE t1 (a DATETIME(1)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.9'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.8'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.7'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.6'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.5'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.4'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.3'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.2'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.1'); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.0'); SELECT a, CAST(a AS DATETIME) FROM t1; DROP TABLE t1; --echo # --echo # Testing that Item::get_date() do no rounds. --echo # query_vertical SELECT CAST('2001-01-01 10:10:10.9999994' AS DATETIME) AS c1, CAST('2001-01-01 10:10:10.9999995' AS DATETIME) AS c2, CAST('2001-01-01 10:10:10.9999994' AS DATETIME(6)) AS c3, CAST('2001-01-01 10:10:10.9999995' AS DATETIME(6)) AS c4, CAST(20010101101010.9999994 AS DATETIME) AS c5, CAST(20010101101010.9999995 AS DATETIME) AS c6, CAST(20010101101010.9999994 AS DATETIME(6)) AS c7, CAST(20010101101010.9999995 AS DATETIME(6)) AS c8; --echo # --echo # Testing that comparison do no rounds --echo # CREATE TABLE t1 (t0 DATETIME, t6 DATETIME(6)); INSERT INTO t1 VALUES ('2001-01-01 00:00:00', '2001-01-01 00:00:00.999999'); INSERT INTO t1 VALUES ('2001-01-01 00:00:01', '2001-01-01 00:00:01.000000'); SELECT t0 FROM t1 WHERE t6='2001-01-01 00:00:00.9999998'; SELECT t6 FROM t1 WHERE t6='2001-01-01 00:00:00.9999998'; DROP TABLE t1; --echo # --echo # Testing that EXTRACT do no rounds --echo # query_vertical SELECT EXTRACT(MICROSECOND FROM '2001-01-01 00:00:00.9999994') AS c1, EXTRACT(MICROSECOND FROM '2001-01-01 00:00:00.9999995') AS c2, EXTRACT(MICROSECOND FROM 20010101000000.9999994) AS c3, EXTRACT(MICROSECOND FROM 20010101000000.9999995) AS c4; ############################################################################## --echo # --echo # Testing time_truncate_fractional when altering TIMESTAMP(N) to a smaller size --echo # CREATE TABLE t1 (a TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999999'); ALTER TABLE t1 MODIFY a TIMESTAMP(5); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1 (a TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)); INSERT INTO t1 VALUES ('2001-01-01 10:10:10.999999'); ALTER TABLE t1 MODIFY a TIME; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from VARCHAR to TIMESTAMP(N) --echo # CREATE TABLE t1 (a VARCHAR(32), t6 TIMESTAMP(6) NULL DEFAULT NULL, t5 TIMESTAMP(5) NULL DEFAULT NULL, t4 TIMESTAMP(4) NULL DEFAULT NULL, t3 TIMESTAMP(3) NULL DEFAULT NULL, t2 TIMESTAMP(2) NULL DEFAULT NULL, t1 TIMESTAMP(1) NULL DEFAULT NULL, t0 TIMESTAMP NULL DEFAULT NULL); INSERT INTO t1 (a) VALUES ('2001-01-01 10:10:10.9999999'); --query_vertical SELECT * FROM t1; UPDATE t1 SET t0=a, t1=a, t2=a, t3=a, t4=a, t5=a, t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from TIMESTAMP(N) to BIGINT --echo # CREATE TABLE t1 (a BIGINT, b TIMESTAMP(6) NULL DEFAULT NULL); INSERT INTO t1 (b) VALUES ('2001-01-01 10:10:59.500000'); INSERT INTO t1 (b) VALUES ('2001-01-01 10:10:10.500000'); INSERT INTO t1 (b) VALUES ('2001-01-01 10:10:10.499999'); UPDATE t1 SET a=b; SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing time_truncate_fractional from TIME(6) to TIMESTAMP(N) --echo # SET timestamp=UNIX_TIMESTAMP('2001-01-01 00:00:00'); CREATE TABLE t1 (a TIME(6), t6 TIMESTAMP(6)); INSERT INTO t1 (a) VALUES ('10:10:10.999999'); SELECT * FROM t1; UPDATE t1 SET t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; SET timestamp=default; --echo # --echo # Testing time_truncate_fractional from DECIMAL to TIMESTAMP(N) --echo # CREATE TABLE t1 (a DECIMAL(30,6), t6 TIMESTAMP(6)); INSERT INTO t1 (a) VALUES (20010101101010.999999); UPDATE t1 SET t6=a; --query_vertical SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing JOIN with comparison between TIMESTAMP(6) and DECIMAL(20,6) --echo # CREATE TABLE t1 (a TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)); INSERT INTO t1 VALUES ('2001-01-01 11:22:33'); INSERT INTO t1 VALUES ('2001-01-01 11:22:33.123'); INSERT INTO t1 VALUES ('2001-01-01 11:22:33.1234567'); CREATE TABLE t2 (b DECIMAL(20,6)); INSERT INTO t2 VALUES (20010101112233); INSERT INTO t2 VALUES (20010101112233.123); INSERT INTO t2 VALUES (20010101112233.1234567); SELECT * FROM t1, t2 WHERE a=b; DROP TABLE t1, t2; --echo # --echo # Testing INSERT with near-maximum and near-minimum supported values for --echo # TIMESTAMP. --echo # SET time_zone='+00:00'; CREATE TABLE t1 (a TIMESTAMP(6)); INSERT INTO t1 VALUES ('1970-01-01 00:00:01.000000'); INSERT INTO t1 VALUES ('2038-01-19 03:14:07.9999999'); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1 (a TIMESTAMP); INSERT INTO t1 VALUES ('1970-01-01 00:00:01.000000'); INSERT INTO t1 VALUES ('2038-01-19 03:14:07.999999'); SELECT * FROM t1; DROP TABLE t1; --echo # --echo # Testing INSERT with near-maximum and near-minimum supported values for --echo # DATETIME. --echo # CREATE TABLE t1 (a DATETIME(6)); INSERT INTO t1 VALUES ('9999-12-31 23:59:59.9999999'); INSERT INTO t1 VALUES ('1000-01-01 00:00:00.000000'); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ('9999-12-31 23:59:59.999999'); INSERT INTO t1 VALUES ('1000-01-01 00:00:00.000000'); SELECT * FROM t1; DROP TABLE t1; SET sql_mode=DEFAULT;