128
type::timestamp_t str_to_datetime_with_warn(Session *session,
127
enum enum_drizzle_timestamp_type
128
str_to_datetime_with_warn(const char *str,
130
DRIZZLE_TIME *l_time,
134
type::cut_t was_cut= type::VALID;
135
type::timestamp_t ts_type;
134
Session *session= current_session;
135
enum enum_drizzle_timestamp_type ts_type;
137
ts_type= l_time->store(str, length,
138
(flags | (session->variables.sql_mode &
139
(MODE_INVALID_DATES |
140
MODE_NO_ZERO_DATE))),
142
if (was_cut || ts_type <= type::DRIZZLE_TIMESTAMP_ERROR)
143
make_truncated_value_warning(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
137
ts_type= str_to_datetime(str, length, l_time,
138
(flags | (session->variables.sql_mode &
139
(MODE_INVALID_DATES |
140
MODE_NO_ZERO_DATE))),
142
if (was_cut || ts_type <= DRIZZLE_TIMESTAMP_ERROR)
143
make_truncated_value_warning(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
144
144
str, length, ts_type, NULL);
151
str_to_time_with_warn(Session *session, const char *str, uint32_t length, type::Time *l_time)
150
str_to_time_with_warn(const char *str, uint32_t length, DRIZZLE_TIME *l_time)
154
bool ret_val= l_time->store(str, length, warning, type::DRIZZLE_TIMESTAMP_TIME);
153
bool ret_val= str_to_time(str, length, l_time, &warning);
155
154
if (ret_val || warning)
156
make_truncated_value_warning(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
157
str, length, type::DRIZZLE_TIMESTAMP_TIME, NULL);
155
make_truncated_value_warning(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
156
str, length, DRIZZLE_TIMESTAMP_TIME, NULL);
161
void localtime_to_TIME(DRIZZLE_TIME *to, struct tm *from)
165
to->year= (int) ((from->tm_year+1900) % 10000);
166
to->month= (int) from->tm_mon+1;
167
to->day= (int) from->tm_mday;
168
to->hour= (int) from->tm_hour;
169
to->minute= (int) from->tm_min;
170
to->second= (int) from->tm_sec;
173
void make_date(const DRIZZLE_TIME *l_time, String *str)
175
str->alloc(MAX_DATE_STRING_REP_LENGTH);
176
uint32_t length= (uint32_t) my_date_to_str(l_time, str->c_ptr());
178
str->set_charset(&my_charset_bin);
182
void make_datetime(const DRIZZLE_TIME *l_time, String *str)
184
str->alloc(MAX_DATE_STRING_REP_LENGTH);
185
uint32_t length= (uint32_t) my_datetime_to_str(l_time, str->c_ptr());
187
str->set_charset(&my_charset_bin);
162
191
void make_truncated_value_warning(Session *session,
163
192
DRIZZLE_ERROR::enum_warning_level level,
164
193
const char *str_val,
165
194
uint32_t str_length,
166
type::timestamp_t time_type,
195
enum enum_drizzle_timestamp_type time_type,
167
196
const char *field_name)
169
198
char warn_buff[DRIZZLE_ERRMSG_SIZE];
170
199
const char *type_str;
171
charset_info_st *cs= &my_charset_utf8_general_ci;
200
CHARSET_INFO *cs= &my_charset_utf8_general_ci;
173
202
String str(buff,(uint32_t) sizeof(buff), system_charset_info);
174
203
str.copy(str_val, str_length, system_charset_info);
175
204
str[str_length]= 0; // Ensure we have end 0 for snprintf
177
206
switch (time_type) {
178
case type::DRIZZLE_TIMESTAMP_DATE:
182
case type::DRIZZLE_TIMESTAMP_TIME:
186
case type::DRIZZLE_TIMESTAMP_DATETIME: // FALLTHROUGH
188
type_str= "datetime";
207
case DRIZZLE_TIMESTAMP_DATE:
210
case DRIZZLE_TIMESTAMP_TIME:
213
case DRIZZLE_TIMESTAMP_DATETIME: // FALLTHROUGH
215
type_str= "datetime";
194
219
cs->cset->snprintf(cs, warn_buff, sizeof(warn_buff),
195
220
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
196
221
type_str, str.c_ptr(), field_name,
197
222
(uint32_t) session->row_count);
201
if (time_type > type::DRIZZLE_TIMESTAMP_ERROR)
225
if (time_type > DRIZZLE_TIMESTAMP_ERROR)
203
226
cs->cset->snprintf(cs, warn_buff, sizeof(warn_buff),
204
227
ER(ER_TRUNCATED_WRONG_VALUE),
205
228
type_str, str.c_ptr());
209
230
cs->cset->snprintf(cs, warn_buff, sizeof(warn_buff),
210
231
ER(ER_WRONG_VALUE), type_str, str.c_ptr());
213
233
push_warning(session, level,
214
234
ER_TRUNCATED_WRONG_VALUE, warn_buff);
228
248
the second argument should be TIMESTAMP_TIME also.
229
249
We should check it before calc_time_diff call.
231
if (l_time1->time_type == type::DRIZZLE_TIMESTAMP_TIME) // Time value
251
if (l_time1->time_type == DRIZZLE_TIMESTAMP_TIME) // Time value
232
252
days= (long)l_time1->day - l_sign * (long)l_time2->day;
235
255
days= calc_daynr((uint32_t) l_time1->year,
236
(uint32_t) l_time1->month,
237
(uint32_t) l_time1->day);
238
if (l_time2->time_type == type::DRIZZLE_TIMESTAMP_TIME)
256
(uint32_t) l_time1->month,
257
(uint32_t) l_time1->day);
258
if (l_time2->time_type == DRIZZLE_TIMESTAMP_TIME)
239
259
days-= l_sign * (long)l_time2->day;
241
261
days-= l_sign*calc_daynr((uint32_t) l_time2->year,
242
(uint32_t) l_time2->month,
243
(uint32_t) l_time2->day);
262
(uint32_t) l_time2->month,
263
(uint32_t) l_time2->day);
246
266
microseconds= ((int64_t)days*86400L +
247
267
(int64_t)(l_time1->hour*3600L +
248
l_time1->minute*60L +
268
l_time1->minute*60L +
250
270
l_sign*(int64_t)(l_time2->hour*3600L +
251
l_time2->minute*60L +
252
l_time2->second)) * 1000000L +
253
(int64_t)l_time1->second_part -
254
l_sign*(int64_t)l_time2->second_part;
271
l_time2->minute*60L +
272
l_time2->second)) * 1000000L +
273
(int64_t)l_time1->second_part -
274
l_sign*(int64_t)l_time2->second_part;
257
277
if (microseconds < 0)