~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/function/time/year.cc

  • Committer: Brian Aker
  • Date: 2009-01-28 08:27:13 UTC
  • mfrom: (813.1.7 new-temporal)
  • Revision ID: brian@tangent.org-20090128082713-13yfi46omee0wbpx
Import work from Jay

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
18
 */
19
19
 
20
 
#include <drizzled/server_includes.h>
 
20
#include "drizzled/server_includes.h"
 
21
#include "drizzled/temporal.h"
21
22
#include CSTDINT_H
22
 
#include <drizzled/function/time/year.h>
 
23
#include "drizzled/function/time/year.h"
 
24
#include "drizzled/error.h"
23
25
 
24
26
int64_t Item_func_year::val_int()
25
27
{
26
 
  assert(fixed == 1);
27
 
  DRIZZLE_TIME ltime;
28
 
  (void) get_arg0_date(&ltime, TIME_FUZZY_DATE);
29
 
  return (int64_t) ltime.year;
 
28
  assert(fixed);
 
29
 
 
30
  if (args[0]->is_null())
 
31
  {
 
32
    /* For NULL argument, we return a NULL result */
 
33
    null_value= true;
 
34
    return 0;
 
35
  }
 
36
 
 
37
  /* Grab the first argument as a DateTime object */
 
38
  drizzled::DateTime temporal;
 
39
  Item_result arg0_result_type= args[0]->result_type();
 
40
  
 
41
  switch (arg0_result_type)
 
42
  {
 
43
    case STRING_RESULT:
 
44
      {
 
45
        char buff[40];
 
46
        String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
 
47
        String *res= args[0]->val_str(&tmp);
 
48
        if (! temporal.from_string(res->c_ptr(), res->length()))
 
49
        {
 
50
          /* 
 
51
          * Could not interpret the function argument as a temporal value, 
 
52
          * so throw an error and return 0
 
53
          */
 
54
          my_error(ER_INVALID_DATETIME_VALUE, MYF(0), res->c_ptr());
 
55
          return 0;
 
56
        }
 
57
      }
 
58
      break;
 
59
    case INT_RESULT:
 
60
      if (! temporal.from_int64_t(args[0]->val_int()))
 
61
      {
 
62
        /* 
 
63
        * Could not interpret the function argument as a temporal value, 
 
64
        * so throw an error and return 0
 
65
        */
 
66
        null_value= true;
 
67
        char buff[40];
 
68
        String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
 
69
        String *res;
 
70
 
 
71
        res= args[0]->val_str(&tmp);
 
72
 
 
73
        my_error(ER_INVALID_DATETIME_VALUE, MYF(0), res->c_ptr());
 
74
        return 0;
 
75
      }
 
76
      break;
 
77
    default:
 
78
      {
 
79
        /* 
 
80
        * Could not interpret the function argument as a temporal value, 
 
81
        * so throw an error and return 0
 
82
        */
 
83
        null_value= true;
 
84
        char buff[40];
 
85
        String tmp(buff,sizeof(buff), &my_charset_utf8_bin);
 
86
        String *res;
 
87
 
 
88
        res= args[0]->val_str(&tmp);
 
89
 
 
90
        my_error(ER_INVALID_DATETIME_VALUE, MYF(0), res->c_ptr());
 
91
        return 0;
 
92
      }
 
93
  }
 
94
  return (int64_t) temporal.years();
30
95
}
31
96
 
32
97
/* information about this Item tree monotonicity
54
119
int64_t Item_func_year::val_int_endpoint(bool left_endp, bool *incl_endp)
55
120
{
56
121
  assert(fixed == 1);
57
 
  DRIZZLE_TIME ltime;
58
 
  if (get_arg0_date(&ltime, TIME_FUZZY_DATE))
 
122
 
 
123
  if (args[0]->is_null())
59
124
  {
60
125
    /* got NULL, leave the incl_endp intact */
61
126
    return INT64_MIN;
62
127
  }
63
128
 
 
129
  /* Grab the first argument as a DateTime object */
 
130
  drizzled::DateTime temporal;
 
131
  
 
132
  if (! temporal.from_int64_t(args[0]->val_int()))
 
133
  {
 
134
    /* got bad DateTime, leave the incl_endp intact */
 
135
    return INT64_MIN;
 
136
  }
 
137
 
64
138
  /*
65
139
    Handle the special but practically useful case of datetime values that
66
140
    point to year bound ("strictly less" comparison stays intact) :
72
146
 
73
147
      col < '2007-09-15 23:00:00'  -> YEAR(col) <= 2007
74
148
  */
75
 
  if (!left_endp && ltime.day == 1 && ltime.month == 1 &&
76
 
      !(ltime.hour || ltime.minute || ltime.second || ltime.second_part))
 
149
  if (!left_endp && temporal.days() == 1 && temporal.months() == 1 &&
 
150
      ! (temporal.hours() || temporal.minutes() || temporal.seconds() || temporal.useconds()))
77
151
    ; /* do nothing */
78
152
  else
79
153
    *incl_endp= true;
80
 
  return ltime.year;
 
154
  return (int64_t) temporal.years();
81
155
}
82
156