summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2018-12-02 18:59:04 +0400
committerAlexander Barkov <bar@mariadb.com>2018-12-02 18:59:04 +0400
commitf89a27b4e5d360315a090f816649edf14eae25a7 (patch)
tree5b137afb5ba45dd37bc9cda6788cc95cd849c443
parent17e371fffe3d0a25936e64f8b2f87b9f5d73c0a3 (diff)
downloadmariadb-git-f89a27b4e5d360315a090f816649edf14eae25a7.tar.gz
MDEV-17319 Assertion `ts_type != MYSQL_TIMESTAMP_TIME' failed upon inserting into TIME field
-rw-r--r--mysql-test/main/temporal_literal.result12
-rw-r--r--mysql-test/main/type_time.result9
-rw-r--r--mysql-test/main/type_time.test12
-rw-r--r--mysql-test/suite/versioning/r/sysvars.result6
-rw-r--r--sql/field.cc47
-rw-r--r--sql/field.h21
-rw-r--r--sql/item_cmpfunc.cc1
-rw-r--r--sql/sql_table.cc1
-rw-r--r--sql/sql_type.cc14
9 files changed, 65 insertions, 58 deletions
diff --git a/mysql-test/main/temporal_literal.result b/mysql-test/main/temporal_literal.result
index d2417d7f9eb..2197b990f3b 100644
--- a/mysql-test/main/temporal_literal.result
+++ b/mysql-test/main/temporal_literal.result
@@ -294,17 +294,17 @@ SELECT TIMESTAMP'2001-00-00 00:00:00.9999999';
TIMESTAMP'2001-00-00 00:00:00.9999999'
2001-00-00 00:00:00.999999
Warnings:
-Note 1292 Truncated incorrect datetime value: '2001-00-00 00:00:00.9999999'
+Note 1292 Truncated incorrect DATETIME value: '2001-00-00 00:00:00.9999999'
SELECT TIMESTAMP'2001-00-01 00:00:00.9999999';
TIMESTAMP'2001-00-01 00:00:00.9999999'
2001-00-01 00:00:00.999999
Warnings:
-Note 1292 Truncated incorrect datetime value: '2001-00-01 00:00:00.9999999'
+Note 1292 Truncated incorrect DATETIME value: '2001-00-01 00:00:00.9999999'
SELECT TIMESTAMP'2001-01-00 00:00:00.9999999';
TIMESTAMP'2001-01-00 00:00:00.9999999'
2001-01-00 00:00:00.999999
Warnings:
-Note 1292 Truncated incorrect datetime value: '2001-01-00 00:00:00.9999999'
+Note 1292 Truncated incorrect DATETIME value: '2001-01-00 00:00:00.9999999'
#
# String literal with bad dates and nanoseconds to DATETIME(N)
#
@@ -416,7 +416,7 @@ SELECT TIME'10:10:10.1234567';
TIME'10:10:10.1234567'
10:10:10.123456
Warnings:
-Note 1292 Truncated incorrect time value: '10:10:10.1234567'
+Note 1292 Truncated incorrect TIME value: '10:10:10.1234567'
SELECT TIME('10:10:10.1234567');
TIME('10:10:10.1234567')
10:10:10.123456
@@ -440,7 +440,7 @@ SELECT TIMESTAMP'2001-01-01 10:10:10.1234567';
TIMESTAMP'2001-01-01 10:10:10.1234567'
2001-01-01 10:10:10.123456
Warnings:
-Note 1292 Truncated incorrect datetime value: '2001-01-01 10:10:10.1234567'
+Note 1292 Truncated incorrect DATETIME value: '2001-01-01 10:10:10.1234567'
SELECT TIMESTAMP('2001-01-01 10:10:10.1234567');
TIMESTAMP('2001-01-01 10:10:10.1234567')
2001-01-01 10:10:10.123456
@@ -463,7 +463,7 @@ Warning 1292 Truncated incorrect datetime value: '2001-01-01 10:10:10.1234567xyz
CREATE TABLE t1 (a TIME(6));
INSERT INTO t1 VALUES (TIME'10:20:30.1234567');
Warnings:
-Note 1292 Truncated incorrect time value: '10:20:30.1234567'
+Note 1292 Truncated incorrect TIME value: '10:20:30.1234567'
INSERT INTO t1 VALUES (TIME('10:20:30.1234567'));
Warnings:
Note 1292 Truncated incorrect time value: '10:20:30.1234567'
diff --git a/mysql-test/main/type_time.result b/mysql-test/main/type_time.result
index 0a66a94db69..00b7386a64e 100644
--- a/mysql-test/main/type_time.result
+++ b/mysql-test/main/type_time.result
@@ -2168,5 +2168,14 @@ Warning 1292 Truncated incorrect datetime value: 'z'
Warning 1292 Truncated incorrect datetime value: 'z'
Warning 1292 Truncated incorrect time value: 'z'
#
+# MDEV-17319 Assertion `ts_type != MYSQL_TIMESTAMP_TIME' failed upon inserting into TIME field
+#
+CREATE TABLE t1 (t TIME);
+SET SESSION SQL_MODE='TRADITIONAL';
+INSERT INTO t1 VALUES ('0000-00-00 00:00:00'),('0000-00-00 00:00:00');
+ERROR 22007: Incorrect time value: '0000-00-00 00:00:00' for column 't' at row 1
+SET sql_mode=DEFAULT;
+DROP TABLE t1;
+#
# End of 10.4 tests
#
diff --git a/mysql-test/main/type_time.test b/mysql-test/main/type_time.test
index 5e4090f48a4..67f714e61db 100644
--- a/mysql-test/main/type_time.test
+++ b/mysql-test/main/type_time.test
@@ -1410,5 +1410,17 @@ SELECT TIMESTAMP(0)='z', DATE(0)='z', TIME(0)='z';
--echo #
+--echo # MDEV-17319 Assertion `ts_type != MYSQL_TIMESTAMP_TIME' failed upon inserting into TIME field
+--echo #
+
+CREATE TABLE t1 (t TIME);
+SET SESSION SQL_MODE='TRADITIONAL';
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES ('0000-00-00 00:00:00'),('0000-00-00 00:00:00');
+SET sql_mode=DEFAULT;
+DROP TABLE t1;
+
+
+--echo #
--echo # End of 10.4 tests
--echo #
diff --git a/mysql-test/suite/versioning/r/sysvars.result b/mysql-test/suite/versioning/r/sysvars.result
index acc5d62e069..79aa8fce746 100644
--- a/mysql-test/suite/versioning/r/sysvars.result
+++ b/mysql-test/suite/versioning/r/sysvars.result
@@ -53,7 +53,7 @@ Variable_name Value
system_versioning_asof 1900-01-01 00:00:00.000000
set global system_versioning_asof= timestamp'1911-11-11 11:11:11.1111119';
Warnings:
-Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119'
+Note 1292 Truncated incorrect DATETIME value: '1911-11-11 11:11:11.1111119'
show global variables like 'system_versioning_asof';
Variable_name Value
system_versioning_asof 1911-11-11 11:11:11.111111
@@ -80,7 +80,7 @@ Variable_name Value
system_versioning_asof 1900-01-01 00:00:00.000000
set system_versioning_asof= timestamp'1911-11-11 11:11:11.1111119';
Warnings:
-Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119'
+Note 1292 Truncated incorrect DATETIME value: '1911-11-11 11:11:11.1111119'
show variables like 'system_versioning_asof';
Variable_name Value
system_versioning_asof 1911-11-11 11:11:11.111111
@@ -136,7 +136,7 @@ drop table t;
SET sql_mode=TIME_ROUND_FRACTIONAL;
SET @@global.system_versioning_asof= timestamp'2001-12-31 23:59:59.9999999';
Warnings:
-Note 1292 Truncated incorrect datetime value: '2001-12-31 23:59:59.9999999'
+Note 1292 Truncated incorrect DATETIME value: '2001-12-31 23:59:59.9999999'
SELECT @@global.system_versioning_asof;
@@global.system_versioning_asof
2002-01-01 00:00:00.000000
diff --git a/sql/field.cc b/sql/field.cc
index 21d4aea6fb4..6b38b38782c 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -33,11 +33,6 @@
#include "rpl_rli.h" // Pull in Relay_log_info
#include "slave.h" // Pull in rpl_master_has_bug()
#include "strfunc.h" // find_type2, find_set
-#include "sql_time.h" // str_to_datetime_with_warn,
- // str_to_time_with_warn,
- // TIME_to_timestamp,
- // make_time, make_date,
- // make_truncated_value_warning
#include "tztime.h" // struct Time_zone
#include "filesort.h" // change_double_for_sort
#include "log_event.h" // class Table_map_log_event
@@ -5040,7 +5035,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, const Datetime *dt,
// Handle totally bad values
if (!dt->is_valid_datetime())
{
- set_datetime_warning(WARN_DATA_TRUNCATED, str, MYSQL_TIMESTAMP_DATETIME, 1);
+ set_datetime_warning(WARN_DATA_TRUNCATED, str, "datetime", 1);
store_TIMESTAMP(zero);
return 1;
}
@@ -5054,8 +5049,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, const Datetime *dt,
INSERT INTO t1 (ts) VALUES ('0000-00-00 00:00:00 some tail');
*/
store_TIMESTAMP(zero);
- return store_TIME_return_code_with_warnings(was_cut, str,
- MYSQL_TIMESTAMP_DATETIME);
+ return store_TIME_return_code_with_warnings(was_cut, str, "datetime");
}
// Convert DATETIME to TIMESTAMP
@@ -5064,7 +5058,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, const Datetime *dt,
my_time_t timestamp= TIME_to_timestamp(thd, l_time, &conversion_error);
if (timestamp == 0 && l_time->second_part == 0)
{
- set_datetime_warning(ER_WARN_DATA_OUT_OF_RANGE, str, MYSQL_TIMESTAMP_DATETIME, 1);
+ set_datetime_warning(ER_WARN_DATA_OUT_OF_RANGE, str, "datetime", 1);
store_TIMESTAMP(zero);
return 1; // date was fine but pointed to a DST gap
}
@@ -5076,11 +5070,10 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, const Datetime *dt,
// Calculate return value and send warnings if needed
if (unlikely(conversion_error)) // e.g. DATETIME in the DST gap
{
- set_datetime_warning(conversion_error, str, MYSQL_TIMESTAMP_DATETIME, 1);
+ set_datetime_warning(conversion_error, str, "datetime", 1);
return 1;
}
- return store_TIME_return_code_with_warnings(was_cut, str,
- MYSQL_TIMESTAMP_DATETIME);
+ return store_TIME_return_code_with_warnings(was_cut, str, "datetime");
}
@@ -5157,7 +5150,7 @@ int Field_timestamp::store_timestamp(my_time_t ts, ulong sec_part)
ErrConvString s(
STRING_WITH_LEN("0000-00-00 00:00:00.000000") - (decimals() ? 6 - decimals() : 7),
system_charset_info);
- set_datetime_warning(WARN_DATA_TRUNCATED, &s, MYSQL_TIMESTAMP_DATETIME, 1);
+ set_datetime_warning(WARN_DATA_TRUNCATED, &s, "datetime", 1);
return 1;
}
return 0;
@@ -5536,7 +5529,7 @@ uint Field_temporal::is_equal(Create_field *new_field)
void Field_temporal::set_warnings(Sql_condition::enum_warning_level trunc_level,
const ErrConv *str, int was_cut,
- timestamp_type ts_type)
+ const char *typestr)
{
/*
error code logic:
@@ -5549,9 +5542,9 @@ void Field_temporal::set_warnings(Sql_condition::enum_warning_level trunc_level,
a DATE field and non-zero time part is thrown away.
*/
if (was_cut & MYSQL_TIME_WARN_TRUNCATED)
- set_datetime_warning(trunc_level, WARN_DATA_TRUNCATED, str, ts_type, 1);
+ set_datetime_warning(trunc_level, WARN_DATA_TRUNCATED, str, typestr, 1);
if (was_cut & MYSQL_TIME_WARN_OUT_OF_RANGE)
- set_datetime_warning(ER_WARN_DATA_OUT_OF_RANGE, str, ts_type, 1);
+ set_datetime_warning(ER_WARN_DATA_OUT_OF_RANGE, str, typestr, 1);
}
@@ -5572,13 +5565,12 @@ int Field_datetime::store_TIME_with_warning(const Datetime *dt,
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED;
// Handle totally bad values
if (!dt->is_valid_datetime())
- return store_invalid_with_warning(str, was_cut, MYSQL_TIMESTAMP_DATETIME);
+ return store_invalid_with_warning(str, was_cut, "datetime");
// Store the value
DBUG_ASSERT(!dt->fraction_remainder(decimals()));
store_datetime(*dt);
// Caclulate return value and send warnings if needed
- return store_TIME_return_code_with_warnings(was_cut, str,
- MYSQL_TIMESTAMP_DATETIME);
+ return store_TIME_return_code_with_warnings(was_cut, str, "datetime");
}
@@ -5720,12 +5712,12 @@ int Field_time::store_TIME_with_warning(const Time *t,
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED;
// Handle totally bad values
if (!t->is_valid_time())
- return store_invalid_with_warning(str, warn, MYSQL_TIMESTAMP_TIME);
+ return store_invalid_with_warning(str, warn, "time");
// Store the value
DBUG_ASSERT(!t->fraction_remainder(decimals()));
store_TIME(*t);
// Calculate return value and send warnings if needed
- return store_TIME_return_code_with_warnings(warn, str, MYSQL_TIMESTAMP_TIME);
+ return store_TIME_return_code_with_warnings(warn, str, "time");
}
@@ -6219,7 +6211,8 @@ int Field_year::store_time_dec(const MYSQL_TIME *ltime, uint dec_arg)
if (Field_year::store(ltime->year, 0))
return 1;
- set_datetime_warning(WARN_DATA_TRUNCATED, &str, ltime->time_type, 1);
+ const char *typestr= Temporal::type_name_by_timestamp_type(ltime->time_type);
+ set_datetime_warning(WARN_DATA_TRUNCATED, &str, typestr, 1);
return 0;
}
@@ -6291,14 +6284,13 @@ int Field_date_common::store_TIME_with_warning(const Datetime *dt,
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED;
// Handle totally bad values
if (!dt->is_valid_datetime())
- return store_invalid_with_warning(str, was_cut, MYSQL_TIMESTAMP_DATE);
+ return store_invalid_with_warning(str, was_cut, "date");
// Store the value
if (!dt->hhmmssff_is_zero())
was_cut|= MYSQL_TIME_NOTE_TRUNCATED;
store_datetime(*dt);
// Caclulate return value and send warnings if needed
- return store_TIME_return_code_with_warnings(was_cut, str,
- MYSQL_TIMESTAMP_DATE);
+ return store_TIME_return_code_with_warnings(was_cut, str, "date");
}
int Field_date_common::store(const char *from, size_t len, CHARSET_INFO *cs)
@@ -10863,12 +10855,13 @@ Field::set_warning(Sql_condition::enum_warning_level level, uint code,
void Field::set_datetime_warning(Sql_condition::enum_warning_level level,
uint code, const ErrConv *str,
- timestamp_type ts_type, int cuted_increment)
+ const char *typestr, int cuted_increment)
const
{
THD *thd= get_thd();
if (thd->really_abort_on_warning() && level >= Sql_condition::WARN_LEVEL_WARN)
- make_truncated_value_warning(thd, level, str, ts_type, field_name.str);
+ thd->push_warning_truncated_value_for_field(level, typestr,
+ str->ptr(), field_name.str);
else
set_warning(level, code, cuted_increment);
}
diff --git a/sql/field.h b/sql/field.h
index cca3b186668..6c0a981fc0a 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -1368,13 +1368,13 @@ protected:
return set_warning(Sql_condition::WARN_LEVEL_NOTE, code, cuted_increment);
}
void set_datetime_warning(Sql_condition::enum_warning_level, uint code,
- const ErrConv *str, timestamp_type ts_type,
+ const ErrConv *str, const char *typestr,
int cuted_increment) const;
void set_datetime_warning(uint code,
- const ErrConv *str, timestamp_type ts_type,
+ const ErrConv *str, const char *typestr,
int cuted_increment) const
{
- set_datetime_warning(Sql_condition::WARN_LEVEL_WARN, code, str, ts_type,
+ set_datetime_warning(Sql_condition::WARN_LEVEL_WARN, code, str, typestr,
cuted_increment);
}
void set_warning_truncated_wrong_value(const char *type, const char *value);
@@ -2598,33 +2598,32 @@ protected:
Item *get_equal_const_item_datetime(THD *thd, const Context &ctx,
Item *const_item);
void set_warnings(Sql_condition::enum_warning_level trunc_level,
- const ErrConv *str, int was_cut, timestamp_type ts_type);
+ const ErrConv *str, int was_cut, const char *typestr);
int store_TIME_return_code_with_warnings(int warn, const ErrConv *str,
- timestamp_type ts_type)
+ const char *typestr)
{
if (!MYSQL_TIME_WARN_HAVE_WARNINGS(warn) &&
MYSQL_TIME_WARN_HAVE_NOTES(warn))
{
set_warnings(Sql_condition::WARN_LEVEL_NOTE, str,
- warn | MYSQL_TIME_WARN_TRUNCATED, ts_type);
+ warn | MYSQL_TIME_WARN_TRUNCATED, typestr);
return 3;
}
- set_warnings(Sql_condition::WARN_LEVEL_WARN, str, warn, ts_type);
+ set_warnings(Sql_condition::WARN_LEVEL_WARN, str, warn, typestr);
return warn ? 2 : 0;
}
int store_invalid_with_warning(const ErrConv *str, int was_cut,
- timestamp_type ts_type)
+ const char *typestr)
{
DBUG_ASSERT(was_cut);
reset();
Sql_condition::enum_warning_level level= Sql_condition::WARN_LEVEL_WARN;
if (was_cut & MYSQL_TIME_WARN_ZERO_DATE)
{
- DBUG_ASSERT(ts_type != MYSQL_TIMESTAMP_TIME);
- set_warnings(level, str, MYSQL_TIME_WARN_OUT_OF_RANGE, ts_type);
+ set_warnings(level, str, MYSQL_TIME_WARN_OUT_OF_RANGE, typestr);
return 2;
}
- set_warnings(level, str, MYSQL_TIME_WARN_TRUNCATED, ts_type);
+ set_warnings(level, str, MYSQL_TIME_WARN_TRUNCATED, typestr);
return 1;
}
public:
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 15f1f917b35..624d0f062cc 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -31,7 +31,6 @@
#include <m_ctype.h>
#include "sql_select.h"
#include "sql_parse.h" // check_stack_overrun
-#include "sql_time.h" // make_truncated_value_warning
#include "sql_base.h" // dynamic_column_error_message
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 2fec5cd418a..b87bd7dcc0e 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -33,7 +33,6 @@
// partition_info
// NOT_A_PARTITION_ID
#include "sql_db.h" // load_db_opt_by_name
-#include "sql_time.h" // make_truncated_value_warning
#include "records.h" // init_read_record, end_read_record
#include "filesort.h" // filesort_free_buffers
#include "sql_select.h" // setup_order
diff --git a/sql/sql_type.cc b/sql/sql_type.cc
index f92ce45bc97..c99c1df20b6 100644
--- a/sql/sql_type.cc
+++ b/sql/sql_type.cc
@@ -7767,7 +7767,6 @@ static bool have_important_literal_warnings(const MYSQL_TIME_STATUS *status)
static void literal_warn(THD *thd, const Item *item,
const char *str, size_t length, CHARSET_INFO *cs,
- timestamp_type time_type,
const MYSQL_TIME_STATUS *st,
const char *typestr, bool send_error)
{
@@ -7776,9 +7775,9 @@ static void literal_warn(THD *thd, const Item *item,
if (st->warnings) // e.g. a note on nanosecond truncation
{
ErrConvString err(str, length, cs);
- make_truncated_value_warning(thd,
+ thd->push_warning_wrong_or_truncated_value(
Sql_condition::time_warn_level(st->warnings),
- &err, time_type, 0);
+ false, typestr, err.ptr(), NullS);
}
}
else if (send_error)
@@ -7803,8 +7802,7 @@ Type_handler_date_common::create_literal_item(THD *thd,
tmp.get_mysql_time()->time_type == MYSQL_TIMESTAMP_DATE &&
!have_important_literal_warnings(&st))
item= new (thd->mem_root) Item_date_literal(thd, tmp.get_mysql_time());
- literal_warn(thd, item, str, length, cs, MYSQL_TIMESTAMP_DATE,
- &st, "DATE", send_error);
+ literal_warn(thd, item, str, length, cs, &st, "DATE", send_error);
return item;
}
@@ -7824,8 +7822,7 @@ Type_handler_temporal_with_date::create_literal_item(THD *thd,
!have_important_literal_warnings(&st))
item= new (thd->mem_root) Item_datetime_literal(thd, tmp.get_mysql_time(),
st.precision);
- literal_warn(thd, item, str, length, cs, MYSQL_TIMESTAMP_DATETIME,
- &st, "DATETIME", send_error);
+ literal_warn(thd, item, str, length, cs, &st, "DATETIME", send_error);
return item;
}
@@ -7845,7 +7842,6 @@ Type_handler_time_common::create_literal_item(THD *thd,
!have_important_literal_warnings(&st))
item= new (thd->mem_root) Item_time_literal(thd, tmp.get_mysql_time(),
st.precision);
- literal_warn(thd, item, str, length, cs, MYSQL_TIMESTAMP_TIME,
- &st, "TIME", send_error);
+ literal_warn(thd, item, str, length, cs, &st, "TIME", send_error);
return item;
}