~ubuntu-branches/ubuntu/trusty/drizzle/trusty

« back to all changes in this revision

Viewing changes to drizzled/function/min_max.cc

  • Committer: Bazaar Package Importer
  • Author(s): Monty Taylor
  • Date: 2010-12-21 16:39:40 UTC
  • mfrom: (1.2.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20101221163940-c1pfo1jjvx7909xq
Tags: 2010.12.06-0ubuntu1
* New upstream release.
* Added libaio-dev build depend for InnoDB.
* Removed libpcre patch - applied upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
3
 *
4
 
 *  Copyright (C) 2008 Sun Microsystems
 
4
 *  Copyright (C) 2008 Sun Microsystems, Inc.
5
5
 *
6
6
 *  This program is free software; you can redistribute it and/or modify
7
7
 *  it under the terms of the GNU General Public License as published by
79
79
    stored to the value pointer, if latter is provided.
80
80
 
81
81
  RETURN
82
 
   0    If one of arguments is NULL
 
82
   0    If one of arguments is NULL or there was a execution error
83
83
   #    index of the least/greatest argument
84
84
*/
85
85
 
94
94
    bool is_null_unused;
95
95
    uint64_t res= get_datetime_value(session, &arg, 0, datetime_item,
96
96
                                     &is_null_unused);
 
97
 
 
98
    /* Check if we need to stop (because of error or KILL)  and stop the loop */
 
99
    if (session->is_error())
 
100
    {
 
101
      null_value= 1;
 
102
      return 0;
 
103
    }
 
104
 
97
105
    if ((null_value= args[i]->null_value))
98
106
      return 0;
99
107
    if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
122
130
    if (null_value)
123
131
      return 0;
124
132
    str_res= args[min_max_idx]->val_str(str);
 
133
    if (args[min_max_idx]->null_value)
 
134
    {
 
135
      // check if the call to val_str() above returns a NULL value
 
136
      null_value= 1;
 
137
      return NULL;
 
138
    }
125
139
    str_res->set_charset(collation.collation);
126
140
    return str_res;
127
141
  }
128
142
  switch (cmp_type) {
129
143
  case INT_RESULT:
130
 
  {
131
 
    int64_t nr=val_int();
132
 
    if (null_value)
133
 
      return 0;
134
 
    str->set_int(nr, unsigned_flag, &my_charset_bin);
135
 
    return str;
136
 
  }
 
144
    {
 
145
      int64_t nr=val_int();
 
146
      if (null_value)
 
147
        return 0;
 
148
      str->set_int(nr, unsigned_flag, &my_charset_bin);
 
149
      return str;
 
150
    }
 
151
 
137
152
  case DECIMAL_RESULT:
138
 
  {
139
 
    my_decimal dec_buf, *dec_val= val_decimal(&dec_buf);
140
 
    if (null_value)
141
 
      return 0;
142
 
    my_decimal2string(E_DEC_FATAL_ERROR, dec_val, 0, 0, 0, str);
143
 
    return str;
144
 
  }
 
153
    {
 
154
      my_decimal dec_buf, *dec_val= val_decimal(&dec_buf);
 
155
      if (null_value)
 
156
        return 0;
 
157
      my_decimal2string(E_DEC_FATAL_ERROR, dec_val, 0, 0, 0, str);
 
158
      return str;
 
159
    }
 
160
 
145
161
  case REAL_RESULT:
146
 
  {
147
 
    double nr= val_real();
148
 
    if (null_value)
149
 
      return 0;
150
 
    str->set_real(nr,decimals,&my_charset_bin);
151
 
    return str;
152
 
  }
 
162
    {
 
163
      double nr= val_real();
 
164
      if (null_value)
 
165
        return 0;
 
166
      str->set_real(nr,decimals,&my_charset_bin);
 
167
      return str;
 
168
    }
 
169
 
153
170
  case STRING_RESULT:
154
 
  {
155
 
    String *res= NULL;
156
 
 
157
 
    for (uint32_t i=0; i < arg_count ; i++)
158
171
    {
159
 
      if (i == 0)
160
 
        res=args[i]->val_str(str);
161
 
      else
 
172
      String *res= NULL;
 
173
 
 
174
      for (uint32_t i=0; i < arg_count ; i++)
162
175
      {
163
 
        String *res2;
164
 
        res2= args[i]->val_str(res == str ? &tmp_value : str);
165
 
        if (res2)
166
 
        {
167
 
          int cmp= sortcmp(res,res2,collation.collation);
168
 
          if ((cmp_sign < 0 ? cmp : -cmp) < 0)
169
 
            res=res2;
170
 
        }
 
176
        if (i == 0)
 
177
          res=args[i]->val_str(str);
 
178
        else
 
179
        {
 
180
          String *res2;
 
181
          res2= args[i]->val_str(res == str ? &tmp_value : str);
 
182
          if (res2)
 
183
          {
 
184
            int cmp= sortcmp(res,res2,collation.collation);
 
185
            if ((cmp_sign < 0 ? cmp : -cmp) < 0)
 
186
              res=res2;
 
187
          }
 
188
        }
 
189
        if ((null_value= args[i]->null_value))
 
190
          return 0;
171
191
      }
172
 
      if ((null_value= args[i]->null_value))
173
 
        return 0;
 
192
      res->set_charset(collation.collation);
 
193
      return res;
174
194
    }
175
 
    res->set_charset(collation.collation);
176
 
    return res;
177
 
  }
 
195
 
178
196
  case ROW_RESULT:
179
 
  default:
180
197
    // This case should never be chosen
181
198
    assert(0);
182
199
    return 0;
183
200
  }
 
201
 
184
202
  return 0;                                     // Keep compiler happy
185
203
}
186
204