1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
4
* Copyright (C) 2008 Sun Microsystems
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
17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
#include <drizzled/function/min_max.h>
23
#include <drizzled/item/cmpfunc.h>
24
#include <drizzled/session.h>
20
#include <drizzled/server_includes.h>
22
#include <drizzled/functions/min_max.h>
29
24
void Item_func_min_max::fix_length_and_dec()
55
50
agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV, 1);
56
51
if (datetime_found)
58
session= getSessionPtr();
53
session= current_session;
59
54
compare_as_dates= true;
62
57
else if ((cmp_type == DECIMAL_RESULT) || (cmp_type == INT_RESULT))
63
max_length= class_decimal_precision_to_length(max_int_part+decimals, decimals,
58
max_length= my_decimal_precision_to_length(max_int_part+decimals, decimals,
65
60
cached_field_type= agg_field_type(args, arg_count);
80
75
stored to the value pointer, if latter is provided.
83
0 If one of arguments is NULL or there was a execution error
78
0 If one of arguments is NULL
84
79
# index of the least/greatest argument
92
87
for (uint32_t i=0; i < arg_count ; i++)
94
89
Item **arg= args + i;
96
uint64_t res= get_datetime_value(session, &arg, 0, datetime_item,
99
/* Check if we need to stop (because of error or KILL) and stop the loop */
100
if (session->is_error())
91
uint64_t res= get_datetime_value(session, &arg, 0, datetime_item, &is_null);
106
92
if ((null_value= args[i]->null_value))
108
94
if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
133
119
str_res= args[min_max_idx]->val_str(str);
134
if (args[min_max_idx]->null_value)
136
// check if the call to val_str() above returns a NULL value
140
120
str_res->set_charset(collation.collation);
143
123
switch (cmp_type) {
146
int64_t nr=val_int();
149
str->set_int(nr, unsigned_flag, &my_charset_bin);
126
int64_t nr=val_int();
129
str->set_int(nr, unsigned_flag, &my_charset_bin);
153
132
case DECIMAL_RESULT:
155
type::Decimal dec_buf, *dec_val= val_decimal(&dec_buf);
158
class_decimal2string(dec_val, 0, str);
134
my_decimal dec_buf, *dec_val= val_decimal(&dec_buf);
137
my_decimal2string(E_DEC_FATAL_ERROR, dec_val, 0, 0, 0, str);
162
140
case REAL_RESULT:
164
double nr= val_real();
167
str->set_real(nr,decimals,&my_charset_bin);
142
double nr= val_real();
144
return 0; /* purecov: inspected */
145
str->set_real(nr,decimals,&my_charset_bin);
171
148
case STRING_RESULT:
152
for (uint32_t i=0; i < arg_count ; i++)
175
for (uint32_t i=0; i < arg_count ; i++)
155
res=args[i]->val_str(str);
178
res=args[i]->val_str(str);
182
res2= args[i]->val_str(res == str ? &tmp_value : str);
185
int cmp= sortcmp(res,res2,collation.collation);
186
if ((cmp_sign < 0 ? cmp : -cmp) < 0)
190
if ((null_value= args[i]->null_value))
159
res2= args[i]->val_str(res == str ? &tmp_value : str);
162
int cmp= sortcmp(res,res2,collation.collation);
163
if ((cmp_sign < 0 ? cmp : -cmp) < 0)
193
res->set_charset(collation.collation);
167
if ((null_value= args[i]->null_value))
170
res->set_charset(collation.collation);
198
175
// This case should never be chosen
203
179
return 0; // Keep compiler happy
261
type::Decimal *Item_func_min_max::val_decimal(type::Decimal *dec)
237
my_decimal *Item_func_min_max::val_decimal(my_decimal *dec)
263
239
assert(fixed == 1);
264
type::Decimal tmp_buf, *tmp, *res= NULL;
240
my_decimal tmp_buf, *tmp, *res= NULL;
266
242
if (compare_as_dates)
279
255
tmp= args[i]->val_decimal(&tmp_buf); // Zero if NULL
280
if (tmp && (class_decimal_cmp(tmp, res) * cmp_sign) < 0)
256
if (tmp && (my_decimal_cmp(tmp, res) * cmp_sign) < 0)
282
258
if (tmp == &tmp_buf)
284
260
/* Move value out of tmp_buf as this will be reused on next loop */
285
class_decimal2decimal(tmp, dec);
261
my_decimal2decimal(tmp, dec);