23 #include <drizzled/error.h>
24 #include <drizzled/session.h>
26 #include <drizzled/function/time/extract.h>
36 extern const char *interval_names[];
40 str->append(STRING_WITH_LEN(
"extract("));
41 str->append(interval_names[int_type], strlen(interval_names[int_type]));
42 str->append(STRING_WITH_LEN(
" from "));
47 void Item_extract::fix_length_and_dec()
49 value.alloc(DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING);
53 case INTERVAL_YEAR: max_length=4; date_value=1;
break;
54 case INTERVAL_YEAR_MONTH: max_length=6; date_value=1;
break;
55 case INTERVAL_QUARTER: max_length=2; date_value=1;
break;
56 case INTERVAL_MONTH: max_length=2; date_value=1;
break;
57 case INTERVAL_WEEK: max_length=2; date_value=1;
break;
58 case INTERVAL_DAY: max_length=2; date_value=1;
break;
59 case INTERVAL_DAY_HOUR: max_length=9; date_value=0;
break;
60 case INTERVAL_DAY_MINUTE: max_length=11; date_value=0;
break;
61 case INTERVAL_DAY_SECOND: max_length=13; date_value=0;
break;
62 case INTERVAL_HOUR: max_length=2; date_value=0;
break;
63 case INTERVAL_HOUR_MINUTE: max_length=4; date_value=0;
break;
64 case INTERVAL_HOUR_SECOND: max_length=6; date_value=0;
break;
65 case INTERVAL_MINUTE: max_length=2; date_value=0;
break;
66 case INTERVAL_MINUTE_SECOND: max_length=4; date_value=0;
break;
67 case INTERVAL_SECOND: max_length=2; date_value=0;
break;
68 case INTERVAL_MICROSECOND: max_length=2; date_value=0;
break;
69 case INTERVAL_DAY_MICROSECOND: max_length=20; date_value=0;
break;
70 case INTERVAL_HOUR_MICROSECOND: max_length=13; date_value=0;
break;
71 case INTERVAL_MINUTE_MICROSECOND: max_length=11; date_value=0;
break;
72 case INTERVAL_SECOND_MICROSECOND: max_length=9; date_value=0;
break;
73 case INTERVAL_LAST: assert(0);
break;
98 Item_result arg0_result_type= args[0]->result_type();
100 switch (arg0_result_type)
113 char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
114 String tmp(buff,
sizeof(buff), &my_charset_utf8_bin);
117 if (res && (res != &tmp))
122 if (! datetime_temporal.
from_string(tmp.c_ptr(), tmp.length()))
128 my_error(ER_INVALID_DATETIME_VALUE, MYF(0), tmp.c_ptr());
144 char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
145 String tmp(buff,
sizeof(buff), &my_charset_utf8_bin);
150 if (res && (res != &tmp))
155 my_error(ER_INVALID_DATETIME_VALUE, MYF(0), tmp.c_ptr());
163 temporal= &datetime_temporal;
183 char time_buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
184 String tmp_time(time_buff,
sizeof(time_buff), &my_charset_utf8_bin);
187 if (time_res && (time_res != &tmp_time))
189 tmp_time.copy(*time_res);
192 if (! time_temporal.
from_string(tmp_time.c_ptr(), tmp_time.length()))
199 Item_result arg0_result_type= args[0]->result_type();
201 switch (arg0_result_type)
214 char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
215 String tmp(buff,
sizeof(buff), &my_charset_utf8_bin);
218 if (res && (res != &tmp))
223 if (! datetime_temporal.
from_string(tmp.c_ptr(), tmp.length()))
229 my_error(ER_INVALID_DATETIME_VALUE, MYF(0), tmp.c_ptr());
245 char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
246 String tmp(buff,
sizeof(buff), &my_charset_utf8_bin);
251 my_error(ER_INVALID_DATETIME_VALUE, MYF(0), res->c_ptr());
256 temporal= &datetime_temporal;
261 temporal= &time_temporal;
268 return (int64_t) temporal->
years();
269 case INTERVAL_YEAR_MONTH:
270 return (int64_t) ((temporal->
years() * 100L) + temporal->
months());
271 case INTERVAL_QUARTER:
272 return (int64_t) (temporal->
months() + 2) / 3;
274 return (int64_t) temporal->
months();
280 return (int64_t) temporal->
days();
281 case INTERVAL_DAY_HOUR:
282 return (int64_t) ((temporal->
days() * 100L) + temporal->
hours());
283 case INTERVAL_DAY_MINUTE:
284 return (int64_t) ((temporal->
days() * 10000L)
285 + (temporal->
hours() * 100L)
287 case INTERVAL_DAY_SECOND:
289 (int64_t) (temporal->
days() * 1000000L)
290 + (int64_t) (temporal->
hours() * 10000L)
294 return (int64_t) temporal->
hours();
295 case INTERVAL_HOUR_MINUTE:
296 return (int64_t) (temporal->
hours() * 100L)
298 case INTERVAL_HOUR_SECOND:
299 return (int64_t) (temporal->
hours() * 10000L)
302 case INTERVAL_MINUTE:
303 return (int64_t) temporal->
minutes();
304 case INTERVAL_MINUTE_SECOND:
305 return (int64_t) (temporal->
minutes() * 100L) + temporal->
seconds();
306 case INTERVAL_SECOND:
307 return (int64_t) temporal->
seconds();
308 case INTERVAL_MICROSECOND:
309 return (int64_t) temporal->
useconds();
310 case INTERVAL_DAY_MICROSECOND:
314 (int64_t) (temporal->
days() * 1000000L)
315 + (int64_t) (temporal->
hours() * 10000L)
322 case INTERVAL_HOUR_MICROSECOND:
326 (int64_t) (temporal->
hours() * 10000L)
333 case INTERVAL_MINUTE_MICROSECOND:
343 case INTERVAL_SECOND_MICROSECOND:
344 return (int64_t) (temporal->
seconds() * 1000000L)
357 if (item->type() != FUNC_ITEM ||
358 functype() != ((
Item_func*)item)->functype())
362 if (ie->int_type != int_type)
365 if (!args[0]->
eq(ie->args[0], binary_cmp))