Commit 5958f22a authored by unknown's avatar unknown
Browse files

Fix number to date conversion so it always honors the NO_ZERO_DATE,

NO_ZERO_IN_DATE, and INVALID_DATES bits of SQL_MODE. (Bug #5906)


include/my_time.h:
  Pass flags to number_to_datetime() so it can check things
  like NO_ZERO_DATE.
libmysql/libmysql.c:
  Enable fuzzy date handling when converting strings and numbers
  to datetime fields.
mysql-test/r/ps_2myisam.result:
  Update results
mysql-test/r/ps_3innodb.result:
  Update results
mysql-test/r/ps_4heap.result:
  Update results
mysql-test/r/ps_5merge.result:
  Update results
mysql-test/r/ps_6bdb.result:
  Update results
mysql-test/r/ps_7ndb.result:
  Update results
mysql-test/r/strict.result:
  Update results
mysql-test/r/timezone2.result:
  Update results
mysql-test/r/type_datetime.result:
  Update results
mysql-test/t/strict.test:
  Add new regression test
mysql-test/t/timezone2.test:
  Add new test of timestamp values in DST gap
sql-common/my_time.c:
  Expand check_date() to check NO_ZERO_DATE and NO_ZERO_IN_DATE, and
  use it from number_to_datetime() as well as str_to_datetime(). Also,
  make number_to_datetime() return -1 on error so we can distinguish
  between a violation of NO_ZERO_DATE and other errors.
sql/field.cc:
  Update conversion of numbers to date, datetime, and timestamp to
  use number_to_datetime() and report errors and warnings correctly
  and consistently.
parent b7033fb3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ enum enum_mysql_timestamp_type
str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
                uint flags, int *was_cut);
longlong number_to_datetime(longlong nr, MYSQL_TIME *time_res,
                               my_bool fuzzy_date, int *was_cut);
                            uint flags, int *was_cut);
ulonglong TIME_to_ulonglong_datetime(const MYSQL_TIME *time);
ulonglong TIME_to_ulonglong_date(const MYSQL_TIME *time);
ulonglong TIME_to_ulonglong_time(const MYSQL_TIME *time);
+3 −2
Original line number Diff line number Diff line
@@ -3600,7 +3600,7 @@ static void fetch_string_with_conversion(MYSQL_BIND *param, char *value,
  case MYSQL_TYPE_TIMESTAMP:
  {
    MYSQL_TIME *tm= (MYSQL_TIME *)buffer;
    (void) str_to_datetime(value, length, tm, 0, &err);
    (void) str_to_datetime(value, length, tm, TIME_FUZZY_DATE, &err);
    *param->error= test(err) && (param->buffer_type == MYSQL_TYPE_DATE &&
                                 tm->time_type != MYSQL_TIMESTAMP_DATE);
    break;
@@ -3718,7 +3718,8 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
  case MYSQL_TYPE_DATETIME:
  {
    int error;
    value= number_to_datetime(value, (MYSQL_TIME *) buffer, 1, &error);
    value= number_to_datetime(value, (MYSQL_TIME *) buffer, TIME_FUZZY_DATE,
                              &error);
    *param->error= test(error);
    break;
  }
+4 −4
Original line number Diff line number Diff line
@@ -2976,25 +2976,25 @@ Warnings:
Warning	1265	Data truncated for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
+4 −4
Original line number Diff line number Diff line
@@ -2959,25 +2959,25 @@ Warnings:
Warning	1265	Data truncated for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
+4 −4
Original line number Diff line number Diff line
@@ -2960,25 +2960,25 @@ Warnings:
Warning	1265	Data truncated for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Warnings:
Warning	1264	Out of range value adjusted for column 'c13' at row 1
Warning	1265	Data truncated for column 'c14' at row 1
Warning	1264	Out of range value adjusted for column 'c14' at row 1
Warning	1265	Data truncated for column 'c15' at row 1
Warning	1264	Out of range value adjusted for column 'c16' at row 1
Warning	1264	Out of range value adjusted for column 'c17' at row 1
Loading