12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
33
33
#include <drizzled/item/sum.h>
34
34
#include <drizzled/field/decimal.h>
35
35
#include <drizzled/field/double.h>
36
#include <drizzled/field/int64.h>
36
#include <drizzled/field/int64_t.h>
37
37
#include <drizzled/field/date.h>
38
38
#include <drizzled/field/datetime.h>
40
#include <drizzled/type/decimal.h>
42
40
#include "drizzled/internal/m_string.h"
44
42
#include <algorithm>
421
420
void Item_sum::mark_as_sum_func()
423
Select_Lex *cur_select= getSession().getLex()->current_select;
422
Select_Lex *cur_select= current_session->lex->current_select;
424
423
cur_select->n_sum_items++;
425
424
cur_select->with_sum_func= 1;
426
425
with_sum_func= 1;
510
509
uint32_t convert_blob_length)
514
512
switch (result_type()) {
515
513
case REAL_RESULT:
516
514
field= new Field_double(max_length, maybe_null, name, decimals, true);
520
field= new field::Int64(max_length, maybe_null, name, unsigned_flag);
517
field= new Field_int64_t(max_length, maybe_null, name, unsigned_flag);
523
519
case STRING_RESULT:
524
520
if (max_length/collation.collation->mbmaxlen <= 255 ||
525
521
convert_blob_length > Field_varstring::MAX_SIZE ||
526
522
!convert_blob_length)
528
523
return make_string_field(table);
531
table->setVariableWidth();
532
524
field= new Field_varstring(convert_blob_length, maybe_null,
533
name, collation.collation);
525
name, table->getMutableShare(), collation.collation);
536
527
case DECIMAL_RESULT:
537
528
field= new Field_decimal(max_length, maybe_null, name,
538
decimals, unsigned_flag);
529
decimals, unsigned_flag);
542
533
// This case should never be choosen
548
538
field->init(table);
725
716
field= ((Item_field*) args[0])->field;
727
if ((field= create_tmp_field_from_field(&getSession(), field, name, table,
718
if ((field= create_tmp_field_from_field(current_session, field, name, table,
728
719
NULL, convert_blob_length)))
729
720
field->flags&= ~NOT_NULL_FLAG;
768
757
/* TODO: check if the following assignments are really needed */
769
758
if (hybrid_type == DECIMAL_RESULT)
771
class_decimal2decimal(item->dec_buffs, dec_buffs);
772
class_decimal2decimal(item->dec_buffs + 1, dec_buffs + 1);
760
my_decimal2decimal(item->dec_buffs, dec_buffs);
761
my_decimal2decimal(item->dec_buffs + 1, dec_buffs + 1);
809
798
case DECIMAL_RESULT:
811
/* SUM result can't be longer than length(arg) + length(MAX_ROWS) */
812
int precision= args[0]->decimal_precision() + DECIMAL_LONGLONG_DIGITS;
813
max_length= class_decimal_precision_to_length(precision, decimals,
816
hybrid_type= DECIMAL_RESULT;
817
dec_buffs->set_zero();
800
/* SUM result can't be longer than length(arg) + length(MAX_ROWS) */
801
int precision= args[0]->decimal_precision() + DECIMAL_LONGLONG_DIGITS;
802
max_length= my_decimal_precision_to_length(precision, decimals,
805
hybrid_type= DECIMAL_RESULT;
806
my_decimal_set_zero(dec_buffs);
828
819
if (hybrid_type == DECIMAL_RESULT)
830
type::Decimal value, *val= args[0]->val_decimal(&value);
821
my_decimal value, *val= args[0]->val_decimal(&value);
831
822
if (!args[0]->null_value)
833
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs + (curr_dec_buff^1),
824
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs + (curr_dec_buff^1),
834
825
val, dec_buffs + curr_dec_buff);
835
826
curr_dec_buff^= 1;
852
843
if (hybrid_type == DECIMAL_RESULT)
855
(dec_buffs + curr_dec_buff)->val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
846
my_decimal2int(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, unsigned_flag,
858
850
return (int64_t) rint(val_real());
864
856
assert(fixed == 1);
865
857
if (hybrid_type == DECIMAL_RESULT)
866
class_decimal2double(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, &sum);
858
my_decimal2double(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, &sum);
940
932
virtual void div(Hybrid_type *val, uint64_t u) const
942
int2_class_decimal(E_DEC_FATAL_ERROR, val->integer, 0, val->dec_buf);
934
int2my_decimal(E_DEC_FATAL_ERROR, val->integer, 0, val->dec_buf);
943
935
val->used_dec_buf_no= 0;
944
936
val->traits= Hybrid_type_traits_decimal::instance();
945
937
val->traits->div(val, u);
972
963
table_field_type= DRIZZLE_TYPE_DOUBLE;
976
Preserving int8, int16, int32 field types gives ~10% performance boost
977
as the size of result tree becomes significantly smaller.
978
Another speed up we gain by using int64_t for intermediate
979
calculations. The range of int64 is enough to hold sum 2^32 distinct
980
integers each <= 2^32.
982
if (table_field_type == DRIZZLE_TYPE_LONG)
984
val.traits= Hybrid_type_traits_fast_decimal::instance();
987
table_field_type= DRIZZLE_TYPE_LONGLONG;
967
Preserving int8, int16, int32 field types gives ~10% performance boost
968
as the size of result tree becomes significantly smaller.
969
Another speed up we gain by using int64_t for intermediate
970
calculations. The range of int64 is enough to hold sum 2^32 distinct
971
integers each <= 2^32.
973
if (table_field_type == DRIZZLE_TYPE_LONG)
975
val.traits= Hybrid_type_traits_fast_decimal::instance();
978
table_field_type= DRIZZLE_TYPE_LONGLONG;
989
980
case DECIMAL_RESULT:
990
981
val.traits= Hybrid_type_traits_decimal::instance();
991
982
if (table_field_type != DRIZZLE_TYPE_LONGLONG)
992
983
table_field_type= DRIZZLE_TYPE_DECIMAL;
998
989
val.traits->fix_length_and_dec(this, args[0]);
1033
1024
field_def.init_for_tmp_table(table_field_type, args[0]->max_length,
1034
1025
args[0]->decimals, args[0]->maybe_null);
1036
if (! (table= session->getInstanceTable(field_list)))
1027
if (! (table= session->create_virtual_tmp_table(field_list)))
1039
1030
/* XXX: check that the case of CHAR(0) works OK */
1165
1156
Item_sum_avg_distinct::fix_length_and_dec()
1167
1158
Item_sum_distinct::fix_length_and_dec();
1168
prec_increment= getSession().variables.div_precincrement;
1159
prec_increment= current_session->variables.div_precincrement;
1170
1161
AVG() will divide val by count. We need to reserve digits
1171
1162
after decimal point as the result can be fractional.
1229
1220
Item_sum_sum::fix_length_and_dec();
1230
1221
maybe_null=null_value=1;
1231
prec_increment= getSession().variables.div_precincrement;
1222
prec_increment= current_session->variables.div_precincrement;
1233
1223
if (hybrid_type == DECIMAL_RESULT)
1235
1225
int precision= args[0]->decimal_precision() + prec_increment;
1236
1226
decimals= min(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1237
max_length= class_decimal_precision_to_length(precision, decimals,
1227
max_length= my_decimal_precision_to_length(precision, decimals,
1238
1228
unsigned_flag);
1239
1229
f_precision= min(precision+DECIMAL_LONGLONG_DIGITS, DECIMAL_MAX_PRECISION);
1240
1230
f_scale= args[0]->decimals;
1241
dec_bin_size= class_decimal_get_binary_size(f_precision, f_scale);
1231
dec_bin_size= my_decimal_get_binary_size(f_precision, f_scale);
1244
1234
decimals= min(args[0]->decimals + prec_increment, (unsigned int) NOT_FIXED_DEC);
1264
1254
The easiest way is to do this is to store both value in a string
1265
1255
and unpack on access.
1267
table->setVariableWidth();
1268
1257
field= new Field_varstring(((hybrid_type == DECIMAL_RESULT) ?
1269
1258
dec_bin_size : sizeof(double)) + sizeof(int64_t),
1270
0, name, &my_charset_bin);
1259
0, name, table->getMutableShare(), &my_charset_bin);
1272
1261
else if (hybrid_type == DECIMAL_RESULT)
1273
1262
field= new Field_decimal(max_length, maybe_null, name,
1317
type::Decimal *Item_sum_avg::val_decimal(type::Decimal *val)
1306
my_decimal *Item_sum_avg::val_decimal(my_decimal *val)
1319
type::Decimal sum_buff, cnt;
1320
const type::Decimal *sum_dec;
1308
my_decimal sum_buff, cnt;
1309
const my_decimal *sum_dec;
1321
1310
assert(fixed == 1);
1333
1322
return val_decimal_from_real(val);
1335
1324
sum_dec= dec_buffs + curr_dec_buff;
1336
int2_class_decimal(E_DEC_FATAL_ERROR, count, 0, &cnt);
1337
class_decimal_div(E_DEC_FATAL_ERROR, val, sum_dec, &cnt, prec_increment);
1325
int2my_decimal(E_DEC_FATAL_ERROR, count, 0, &cnt);
1326
my_decimal_div(E_DEC_FATAL_ERROR, val, sum_dec, &cnt, prec_increment);
1426
1415
void Item_sum_variance::fix_length_and_dec()
1428
1417
maybe_null= null_value= 1;
1429
prec_increment= getSession().variables.div_precincrement;
1418
prec_increment= current_session->variables.div_precincrement;
1432
1421
According to the SQL2003 standard (Part 2, Foundations; sec 10.9,
1444
1433
case INT_RESULT:
1445
1434
case DECIMAL_RESULT:
1447
int precision= args[0]->decimal_precision()*2 + prec_increment;
1448
decimals= min(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1449
max_length= class_decimal_precision_to_length(precision, decimals,
1436
int precision= args[0]->decimal_precision()*2 + prec_increment;
1437
decimals= min(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1438
max_length= my_decimal_precision_to_length(precision, decimals,
1454
1443
case ROW_RESULT:
1479
1470
The easiest way is to do this is to store both value in a string
1480
1471
and unpack on access.
1482
table->setVariableWidth();
1483
field= new Field_varstring(sizeof(double)*2 + sizeof(int64_t), 0, name, &my_charset_bin);
1473
field= new Field_varstring(sizeof(double)*2 + sizeof(int64_t), 0, name, table->getMutableShare(), &my_charset_bin);
1486
1476
field= new Field_double(max_length, maybe_null, name, decimals, true);
1622
1612
assert(fixed == 1);
1623
1613
if (null_value)
1626
1615
switch (hybrid_type) {
1627
1616
case STRING_RESULT:
1631
String *res; res=val_str(&str_value);
1632
return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
1633
&end_not_used, &err_not_used) : 0.0);
1620
String *res; res=val_str(&str_value);
1621
return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
1622
&end_not_used, &err_not_used) : 0.0);
1635
1624
case INT_RESULT:
1636
1625
return (double) sum_int;
1637
1626
case DECIMAL_RESULT:
1638
class_decimal2double(E_DEC_FATAL_ERROR, &sum_dec, &sum);
1627
my_decimal2double(E_DEC_FATAL_ERROR, &sum_dec, &sum);
1640
1629
case REAL_RESULT:
1642
1631
case ROW_RESULT:
1643
1633
// This case should never be choosen
1651
1639
int64_t Item_sum_hybrid::val_int()
1671
type::Decimal *Item_sum_hybrid::val_decimal(type::Decimal *val)
1659
my_decimal *Item_sum_hybrid::val_decimal(my_decimal *val)
1673
1661
assert(fixed == 1);
1674
1662
if (null_value)
1677
1664
switch (hybrid_type) {
1678
1665
case STRING_RESULT:
1679
val->store(E_DEC_FATAL_ERROR, &value);
1666
string2my_decimal(E_DEC_FATAL_ERROR, &value, val);
1681
1668
case REAL_RESULT:
1682
double2_class_decimal(E_DEC_FATAL_ERROR, sum, val);
1669
double2my_decimal(E_DEC_FATAL_ERROR, sum, val);
1684
1671
case DECIMAL_RESULT:
1687
1674
case INT_RESULT:
1688
int2_class_decimal(E_DEC_FATAL_ERROR, sum_int, unsigned_flag, val);
1675
int2my_decimal(E_DEC_FATAL_ERROR, sum_int, unsigned_flag, val);
1690
1677
case ROW_RESULT:
1691
1679
// This case should never be choosen
1696
1683
return val; // Keep compiler happy
1711
1697
str->set_real(sum,decimals, &my_charset_bin);
1713
1699
case DECIMAL_RESULT:
1714
class_decimal2string(&sum_dec, 0, str);
1700
my_decimal2string(E_DEC_FATAL_ERROR, &sum_dec, 0, 0, 0, str);
1716
1702
case INT_RESULT:
1717
1703
str->set_int(sum_int, unsigned_flag, &my_charset_bin);
1760
1746
switch (hybrid_type) {
1761
1747
case STRING_RESULT:
1749
String *result=args[0]->val_str(&tmp_value);
1750
if (!args[0]->null_value &&
1751
(null_value || sortcmp(&value,result,collation.collation) > 0))
1763
String *result=args[0]->val_str(&tmp_value);
1764
if (!args[0]->null_value &&
1765
(null_value || sortcmp(&value,result,collation.collation) > 0))
1767
value.copy(*result);
1753
value.copy(*result);
1772
1758
case INT_RESULT:
1760
int64_t nr=args[0]->val_int();
1761
if (!args[0]->null_value && (null_value ||
1763
(uint64_t) nr < (uint64_t) sum_int) ||
1764
(!unsigned_flag && nr < sum_int)))
1774
int64_t nr=args[0]->val_int();
1775
if (!args[0]->null_value && (null_value ||
1777
(uint64_t) nr < (uint64_t) sum_int) ||
1778
(!unsigned_flag && nr < sum_int)))
1785
1771
case DECIMAL_RESULT:
1773
my_decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1774
if (!args[0]->null_value &&
1775
(null_value || (my_decimal_cmp(&sum_dec, val) > 0)))
1787
type::Decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1788
if (!args[0]->null_value &&
1789
(null_value || (class_decimal_cmp(&sum_dec, val) > 0)))
1791
class_decimal2decimal(val, &sum_dec);
1777
my_decimal2decimal(val, &sum_dec);
1796
1782
case REAL_RESULT:
1784
double nr= args[0]->val_real();
1785
if (!args[0]->null_value && (null_value || nr < sum))
1798
double nr= args[0]->val_real();
1799
if (!args[0]->null_value && (null_value || nr < sum))
1806
1792
case ROW_RESULT:
1807
1794
// This case should never be choosen
1823
1810
switch (hybrid_type) {
1824
1811
case STRING_RESULT:
1813
String *result=args[0]->val_str(&tmp_value);
1814
if (!args[0]->null_value &&
1815
(null_value || sortcmp(&value,result,collation.collation) < 0))
1826
String *result=args[0]->val_str(&tmp_value);
1827
if (!args[0]->null_value &&
1828
(null_value || sortcmp(&value,result,collation.collation) < 0))
1830
value.copy(*result);
1817
value.copy(*result);
1835
1822
case INT_RESULT:
1824
int64_t nr=args[0]->val_int();
1825
if (!args[0]->null_value && (null_value ||
1827
(uint64_t) nr > (uint64_t) sum_int) ||
1828
(!unsigned_flag && nr > sum_int)))
1837
int64_t nr=args[0]->val_int();
1838
if (!args[0]->null_value && (null_value ||
1840
(uint64_t) nr > (uint64_t) sum_int) ||
1841
(!unsigned_flag && nr > sum_int)))
1848
1835
case DECIMAL_RESULT:
1837
my_decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1838
if (!args[0]->null_value &&
1839
(null_value || (my_decimal_cmp(val, &sum_dec) > 0)))
1850
type::Decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1851
if (!args[0]->null_value &&
1852
(null_value || (class_decimal_cmp(val, &sum_dec) > 0)))
1854
class_decimal2decimal(val, &sum_dec);
1841
my_decimal2decimal(val, &sum_dec);
1859
1846
case REAL_RESULT:
1848
double nr= args[0]->val_real();
1849
if (!args[0]->null_value && (null_value || nr > sum))
1861
double nr= args[0]->val_real();
1862
if (!args[0]->null_value && (null_value || nr > sum))
1869
1856
case ROW_RESULT:
1870
1858
// This case should never be choosen
1960
1947
switch(hybrid_type) {
1961
1948
case STRING_RESULT:
1963
char buff[MAX_FIELD_WIDTH];
1964
String tmp(buff,sizeof(buff),result_field->charset()),*res;
1966
res=args[0]->val_str(&tmp);
1967
if (args[0]->null_value)
1950
char buff[MAX_FIELD_WIDTH];
1951
String tmp(buff,sizeof(buff),result_field->charset()),*res;
1953
res=args[0]->val_str(&tmp);
1954
if (args[0]->null_value)
1956
result_field->set_null();
1957
result_field->reset();
1961
result_field->set_notnull();
1962
result_field->store(res->ptr(),res->length(),tmp.charset());
1968
int64_t nr=args[0]->val_int();
1972
if (args[0]->null_value)
1975
result_field->set_null();
1978
result_field->set_notnull();
1980
result_field->store(nr, unsigned_flag);
1985
double nr= args[0]->val_real();
1989
if (args[0]->null_value)
1992
result_field->set_null();
1995
result_field->set_notnull();
1997
result_field->store(nr);
2000
case DECIMAL_RESULT:
2002
my_decimal value_buff, *arg_dec= args[0]->val_decimal(&value_buff);
2006
if (args[0]->null_value)
1969
2007
result_field->set_null();
1970
result_field->reset();
1974
2009
result_field->set_notnull();
1975
result_field->store(res->ptr(),res->length(),tmp.charset());
1981
int64_t nr=args[0]->val_int();
1985
if (args[0]->null_value)
1988
result_field->set_null();
1991
result_field->set_notnull();
1993
result_field->store(nr, unsigned_flag);
1998
double nr= args[0]->val_real();
2002
if (args[0]->null_value)
2005
result_field->set_null();
2008
result_field->set_notnull();
2010
result_field->store(nr);
2013
case DECIMAL_RESULT:
2015
type::Decimal value_buff, *arg_dec= args[0]->val_decimal(&value_buff);
2019
if (args[0]->null_value)
2020
result_field->set_null();
2022
result_field->set_notnull();
2025
We must store zero in the field as we will use the field value in
2028
if (!arg_dec) // Null
2029
arg_dec= &decimal_zero;
2030
result_field->store_decimal(arg_dec);
2012
We must store zero in the field as we will use the field value in
2015
if (!arg_dec) // Null
2016
arg_dec= &decimal_zero;
2017
result_field->store_decimal(arg_dec);
2033
2020
case ROW_RESULT:
2041
2029
if (hybrid_type == DECIMAL_RESULT)
2043
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2031
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2044
2032
if (!arg_val) // Null
2045
2033
arg_val= &decimal_zero;
2046
2034
result_field->store_decimal(arg_val);
2086
arg_dec->val_binary(E_DEC_FATAL_ERROR, res, f_precision, f_scale);
2074
my_decimal2binary(E_DEC_FATAL_ERROR, arg_dec, res, f_precision, f_scale);
2087
2075
res+= dec_bin_size;
2088
2076
int8store(res, tmp);
2128
2116
if (hybrid_type == DECIMAL_RESULT)
2130
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2118
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2131
2119
if (!args[0]->null_value)
2133
2121
if (!result_field->is_null())
2135
type::Decimal field_value,
2123
my_decimal field_value,
2136
2124
*field_val= result_field->val_decimal(&field_value);
2137
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, field_val);
2125
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, field_val);
2138
2126
result_field->store_decimal(dec_buffs);
2179
2167
unsigned char *res=result_field->ptr;
2180
2168
if (hybrid_type == DECIMAL_RESULT)
2182
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2170
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2183
2171
if (!args[0]->null_value)
2185
binary2_class_decimal(E_DEC_FATAL_ERROR, res,
2173
binary2my_decimal(E_DEC_FATAL_ERROR, res,
2186
2174
dec_buffs + 1, f_precision, f_scale);
2187
2175
field_count= sint8korr(res + dec_bin_size);
2188
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, dec_buffs + 1);
2189
dec_buffs->val_binary(E_DEC_FATAL_ERROR, res, f_precision, f_scale);
2176
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, dec_buffs + 1);
2177
my_decimal2binary(E_DEC_FATAL_ERROR, dec_buffs,
2178
res, f_precision, f_scale);
2190
2179
res+= dec_bin_size;
2192
2181
int8store(res, field_count);
2239
2227
if (!args[0]->null_value)
2241
result_field->val_str_internal(&tmp_value);
2229
result_field->val_str(&tmp_value);
2243
2231
if (result_field->is_null() ||
2244
2232
(cmp_sign * sortcmp(res_str,&tmp_value,collation.collation)) < 0)
2304
2292
Item_sum_hybrid::min_max_update_decimal_field()
2306
2294
/* TODO: optimize: do not get result_field in case of args[0] is NULL */
2307
type::Decimal old_val, nr_val;
2308
const type::Decimal *old_nr= result_field->val_decimal(&old_val);
2309
const type::Decimal *nr= args[0]->val_decimal(&nr_val);
2295
my_decimal old_val, nr_val;
2296
const my_decimal *old_nr= result_field->val_decimal(&old_val);
2297
const my_decimal *nr= args[0]->val_decimal(&nr_val);
2310
2298
if (!args[0]->null_value)
2312
2300
if (result_field->is_null(0))
2316
bool res= class_decimal_cmp(old_nr, nr) > 0;
2304
bool res= my_decimal_cmp(old_nr, nr) > 0;
2317
2305
/* (cmp_sign > 0 && res) || (!(cmp_sign > 0) && !res) */
2318
2306
if ((cmp_sign > 0) ^ (!res))
2380
2368
if ((null_value= !count))
2383
type::Decimal dec_count, dec_field;
2384
binary2_class_decimal(E_DEC_FATAL_ERROR,
2371
my_decimal dec_count, dec_field;
2372
binary2my_decimal(E_DEC_FATAL_ERROR,
2385
2373
field->ptr, &dec_field, f_precision, f_scale);
2386
int2_class_decimal(E_DEC_FATAL_ERROR, count, 0, &dec_count);
2387
class_decimal_div(E_DEC_FATAL_ERROR, dec_buf,
2374
int2my_decimal(E_DEC_FATAL_ERROR, count, 0, &dec_count);
2375
my_decimal_div(E_DEC_FATAL_ERROR, dec_buf,
2388
2376
&dec_field, &dec_count, prec_increment);
2389
2377
return dec_buf;
2418
type::Decimal *Item_std_field::val_decimal(type::Decimal *dec_buf)
2406
my_decimal *Item_std_field::val_decimal(my_decimal *dec_buf)
2421
2409
We can't call val_decimal_from_real() for DECIMAL_RESULT as
2422
2410
Item_variance_field::val_real() would cause an infinite loop
2424
type::Decimal tmp_dec, *dec;
2412
my_decimal tmp_dec, *dec;
2426
2414
if (hybrid_type == REAL_RESULT)
2427
2415
return val_decimal_from_real(dec_buf);
2429
2417
dec= Item_variance_field::val_decimal(dec_buf);
2432
class_decimal2double(E_DEC_FATAL_ERROR, dec, &nr);
2420
my_decimal2double(E_DEC_FATAL_ERROR, dec, &nr);
2433
2421
assert(nr >= 0.0);
2435
double2_class_decimal(E_DEC_FATAL_ERROR, nr, &tmp_dec);
2436
class_decimal_round(E_DEC_FATAL_ERROR, &tmp_dec, decimals, false, dec_buf);
2423
double2my_decimal(E_DEC_FATAL_ERROR, nr, &tmp_dec);
2424
my_decimal_round(E_DEC_FATAL_ERROR, &tmp_dec, decimals, false, dec_buf);
2437
2425
return dec_buf;
2610
2598
tmp_table_param->force_copy_fields= force_copy_fields;
2611
2599
assert(table == 0);
2613
if (!(table= create_tmp_table(session, tmp_table_param, list, (Order*) 0, 1,
2601
if (!(table= create_tmp_table(session, tmp_table_param, list, (order_st*) 0, 1,
2615
2603
(select_lex->options | session->options),
2616
2604
HA_POS_ERROR, (char*)"")))
2667
2655
uint32_t *length;
2668
2656
compare_key= (qsort_cmp2) composite_key_cmp;
2669
2657
cmp_arg= (void*) this;
2670
field_lengths= (uint32_t*) session->getMemRoot()->allocate(table->getShare()->sizeFields() * sizeof(uint32_t));
2658
field_lengths= (uint32_t*) session->alloc(table->getShare()->sizeFields() * sizeof(uint32_t));
2671
2659
for (tree_key_length= 0, length= field_lengths, field= table->getFields();
2672
2660
field < field_end; ++field, ++length)
2721
2709
if (always_null)
2723
2711
copy_fields(tmp_table_param);
2724
if (copy_funcs(tmp_table_param->items_to_copy, table->in_use))
2712
copy_funcs(tmp_table_param->items_to_copy);
2727
2714
for (Field **field= table->getFields() ; *field ; field++)
2831
2818
Field *field= item->get_tmp_table_field();
2833
uint32_t offset= field->offset(field->getTable()->record[0])-table->getShare()->null_bytes;
2820
uint32_t offset= field->offset(field->table->record[0])-table->getShare()->null_bytes;
2834
2821
if((res= field->cmp((unsigned char*)key1 + offset, (unsigned char*)key2 + offset)))
2846
2833
const void* key2)
2848
2835
Item_func_group_concat* grp_item= (Item_func_group_concat*) arg;
2849
Order **order_item, **end;
2836
order_st **order_item, **end;
2850
2837
Table *table= grp_item->table;
2852
2839
for (order_item= grp_item->order, end=order_item+ grp_item->arg_count_order;
2867
2854
if (field && !item->const_item())
2870
uint32_t offset= (field->offset(field->getTable()->record[0]) -
2857
uint32_t offset= (field->offset(field->table->record[0]) -
2871
2858
table->getShare()->null_bytes);
2872
2859
if ((res= field->cmp((unsigned char*)key1 + offset, (unsigned char*)key2 + offset)))
2873
2860
return (*order_item)->asc ? res : -res;
2890
2877
Item_func_group_concat *item)
2892
2879
Table *table= item->table;
2893
String tmp((char *)table->getUpdateRecord(), table->getShare()->getRecordLength(),
2880
String tmp((char *)table->record[1], table->getShare()->getRecordLength(),
2894
2881
default_charset_info);
2896
2883
String *result= &item->result;
2917
2904
because it contains both order and arg list fields.
2919
2906
Field *field= (*arg)->get_tmp_table_field();
2920
uint32_t offset= (field->offset(field->getTable()->record[0]) -
2907
uint32_t offset= (field->offset(field->table->record[0]) -
2921
2908
table->getShare()->null_bytes);
2922
2909
assert(offset < table->getShare()->getRecordLength());
2923
res= field->val_str_internal(&tmp, key + offset);
2910
res= field->val_str(&tmp, key + offset);
2926
2913
res= (*arg)->val_str(&tmp);
2990
2977
order - arg_count_order
2992
2979
if (!(args= (Item**) memory::sql_alloc(sizeof(Item*) * arg_count +
2993
sizeof(Order*)*arg_count_order)))
2980
sizeof(order_st*)*arg_count_order)))
2996
order= (Order**)(args + arg_count);
2983
order= (order_st**)(args + arg_count);
2998
2985
/* fill args items of show and sort */
2999
2986
List_iterator_fast<Item> li(*select_list);
3004
2991
if (arg_count_order)
3006
Order **order_ptr= order;
3007
for (Order *order_item= (Order*) order_list->first;
2993
order_st **order_ptr= order;
2994
for (order_st *order_item= (order_st*) order_list->first;
3008
2995
order_item != NULL;
3009
2996
order_item= order_item->next)
3052
3039
char warn_buff[DRIZZLE_ERRMSG_SIZE];
3053
3040
snprintf(warn_buff, sizeof(warn_buff), ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
3054
warning->set_msg(&getSession(), warn_buff);
3041
warning->set_msg(current_session, warn_buff);
3274
3260
if (!(table= create_tmp_table(session, tmp_table_param, all_fields,
3275
(Order*) 0, 0, true,
3261
(order_st*) 0, 0, true,
3276
3262
(select_lex->options | session->options),
3277
3263
HA_POS_ERROR, (char*) "")))