Drizzled Public API Documentation

year.cc
1 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2008 Sun Microsystems, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 #include <config.h>
21 
22 #include <drizzled/temporal.h>
23 #include <drizzled/error.h>
24 #include <drizzled/function/time/year.h>
25 
26 namespace drizzled
27 {
28 
30 {
31  assert(fixed);
32 
33  if (args[0]->is_null())
34  {
35  /* For NULL argument, we return a NULL result */
36  null_value= true;
37  return 0;
38  }
39 
40  /* Grab the first argument as a DateTime object */
41  DateTime temporal;
42  Item_result arg0_result_type= args[0]->result_type();
43 
44  switch (arg0_result_type)
45  {
46  case DECIMAL_RESULT:
47  /*
48  * For doubles supplied, interpret the arg as a string,
49  * so intentionally fall-through here...
50  * This allows us to accept double parameters like
51  * 19971231235959.01 and interpret it the way MySQL does:
52  * as a TIMESTAMP-like thing with a microsecond component.
53  * Ugh, but need to keep backwards-compat.
54  */
55  case STRING_RESULT:
56  {
57  char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
58  String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
59  String *res= args[0]->val_str(&tmp);
60 
61  if (res && (res != &tmp))
62  {
63  tmp.copy(*res);
64  }
65 
66  if (! temporal.from_string(tmp.c_ptr(), tmp.length()))
67  {
68  /*
69  * Could not interpret the function argument as a temporal value,
70  * so throw an error and return 0
71  */
72  my_error(ER_INVALID_DATETIME_VALUE, MYF(0), tmp.c_ptr());
73  return 0;
74  }
75  }
76  break;
77  case INT_RESULT:
78  if (temporal.from_int64_t(args[0]->val_int()))
79  break;
80  /* Intentionally fall-through on invalid conversion from integer */
81  default:
82  {
83  /*
84  * Could not interpret the function argument as a temporal value,
85  * so throw an error and return 0
86  */
87  null_value= true;
88  char buff[DRIZZLE_MAX_LENGTH_DATETIME_AS_STRING];
89  String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
90  String *res;
91 
92  res= args[0]->val_str(&tmp);
93 
94  if (res && (res != &tmp))
95  {
96  tmp.copy(*res);
97  }
98 
99  my_error(ER_INVALID_DATETIME_VALUE, MYF(0), tmp.c_ptr());
100  return 0;
101  }
102  }
103  return (int64_t) temporal.years();
104 }
105 
106 int64_t Item_func_year::val_int_endpoint(bool left_endp, bool *incl_endp)
107 {
108  assert(fixed == 1);
109 
110  if (args[0]->is_null())
111  {
112  /* got NULL, leave the incl_endp intact */
113  return INT64_MIN;
114  }
115 
116  /* Grab the first argument as a DateTime object */
117  DateTime temporal;
118 
119  if (! temporal.from_int64_t(args[0]->val_int()))
120  {
121  /* got bad DateTime, leave the incl_endp intact */
122  return INT64_MIN;
123  }
124 
125  /*
126  Handle the special but practically useful case of datetime values that
127  point to year bound ("strictly less" comparison stays intact) :
128 
129  col < '2007-01-01 00:00:00' -> YEAR(col) < 2007
130 
131  which is different from the general case ("strictly less" changes to
132  "less or equal"):
133 
134  col < '2007-09-15 23:00:00' -> YEAR(col) <= 2007
135  */
136  if (!left_endp && temporal.days() == 1 && temporal.months() == 1 &&
137  ! (temporal.hours() || temporal.minutes() || temporal.seconds() || temporal.useconds()))
138  ; /* do nothing */
139  else
140  *incl_endp= true;
141  return (int64_t) temporal.years();
142 }
143 
144 } /* namespace drizzled */