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 */
29
28
#include <drizzled/hybrid_type_traits_integer.h>
30
29
#include <drizzled/hybrid_type_traits_decimal.h>
31
30
#include <drizzled/sql_base.h>
32
#include <drizzled/session.h>
34
32
#include <drizzled/item/sum.h>
35
33
#include <drizzled/field/decimal.h>
36
34
#include <drizzled/field/double.h>
37
#include <drizzled/field/int64.h>
35
#include <drizzled/field/int64_t.h>
38
36
#include <drizzled/field/date.h>
39
37
#include <drizzled/field/datetime.h>
40
#include <drizzled/unique.h>
42
#include <drizzled/type/decimal.h>
44
#include <drizzled/internal/m_string.h>
39
#include "drizzled/internal/m_string.h"
46
41
#include <algorithm>
77
73
bool Item_sum::init_sum_func_check(Session *session)
79
if (!session->getLex()->allow_sum_func)
75
if (!session->lex->allow_sum_func)
81
77
my_message(ER_INVALID_GROUP_FUNC_USE, ER(ER_INVALID_GROUP_FUNC_USE),
85
81
/* Set a reference to the nesting set function if there is any */
86
in_sum_func= session->getLex()->in_sum_func;
82
in_sum_func= session->lex->in_sum_func;
87
83
/* Save a pointer to object to be used in items for nested set functions */
88
session->getLex()->in_sum_func= this;
89
nest_level= session->getLex()->current_select->nest_level;
84
session->lex->in_sum_func= this;
85
nest_level= session->lex->current_select->nest_level;
94
90
max_sum_func_level= -1;
148
144
bool Item_sum::check_sum_func(Session *session, Item **ref)
150
146
bool invalid= false;
151
nesting_map allow_sum_func= session->getLex()->allow_sum_func;
147
nesting_map allow_sum_func= session->lex->allow_sum_func;
153
149
The value of max_arg_level is updated if an argument of the set function
154
150
contains a column reference resolved against a subquery whose level is
319
315
bool Item_sum::register_sum_func(Session *session, Item **ref)
322
nesting_map allow_sum_func= session->getLex()->allow_sum_func;
323
for (sl= session->getLex()->current_select->master_unit()->outer_select() ;
318
nesting_map allow_sum_func= session->lex->allow_sum_func;
319
for (sl= session->lex->current_select->master_unit()->outer_select() ;
324
320
sl && sl->nest_level > max_arg_level;
325
321
sl= sl->master_unit()->outer_select() )
371
367
with_sum_func being set for an Select_Lex means that this Select_Lex
372
368
has aggregate functions directly referenced (i.e. not through a sub-select).
374
for (sl= session->getLex()->current_select;
370
for (sl= session->lex->current_select;
375
371
sl && sl != aggr_sel && sl->master_unit()->item;
376
372
sl= sl->master_unit()->outer_select() )
377
373
sl->master_unit()->item->with_sum_func= 1;
379
session->getLex()->current_select->mark_as_dependent(aggr_sel);
375
session->lex->current_select->mark_as_dependent(aggr_sel);
423
419
void Item_sum::mark_as_sum_func()
425
Select_Lex *cur_select= getSession().getLex()->current_select;
421
Select_Lex *cur_select= current_session->lex->current_select;
426
422
cur_select->n_sum_items++;
427
423
cur_select->with_sum_func= 1;
428
424
with_sum_func= 1;
512
508
uint32_t convert_blob_length)
516
511
switch (result_type()) {
517
512
case REAL_RESULT:
518
513
field= new Field_double(max_length, maybe_null, name, decimals, true);
522
field= new field::Int64(max_length, maybe_null, name, unsigned_flag);
516
field= new Field_int64_t(max_length, maybe_null, name, unsigned_flag);
525
518
case STRING_RESULT:
526
519
if (max_length/collation.collation->mbmaxlen <= 255 ||
527
520
convert_blob_length > Field_varstring::MAX_SIZE ||
528
521
!convert_blob_length)
530
522
return make_string_field(table);
533
table->setVariableWidth();
534
523
field= new Field_varstring(convert_blob_length, maybe_null,
535
name, collation.collation);
524
name, table->s, collation.collation);
538
526
case DECIMAL_RESULT:
539
527
field= new Field_decimal(max_length, maybe_null, name,
540
decimals, unsigned_flag);
528
decimals, unsigned_flag);
544
532
// This case should never be choosen
550
537
field->init(table);
727
715
field= ((Item_field*) args[0])->field;
729
if ((field= create_tmp_field_from_field(&getSession(), field, name, table,
717
if ((field= create_tmp_field_from_field(current_session, field, name, table,
730
718
NULL, convert_blob_length)))
731
719
field->flags&= ~NOT_NULL_FLAG;
739
727
switch (args[0]->field_type()) {
740
728
case DRIZZLE_TYPE_DATE:
741
field= new Field_date(maybe_null, name);
729
field= new Field_date(maybe_null, name, collation.collation);
743
731
case DRIZZLE_TYPE_TIMESTAMP:
744
732
case DRIZZLE_TYPE_DATETIME:
745
field= new Field_datetime(maybe_null, name);
733
field= new Field_datetime(maybe_null, name, collation.collation);
748
736
return Item_sum::create_tmp_field(group, table, convert_blob_length);
752
739
field->init(table);
770
756
/* TODO: check if the following assignments are really needed */
771
757
if (hybrid_type == DECIMAL_RESULT)
773
class_decimal2decimal(item->dec_buffs, dec_buffs);
774
class_decimal2decimal(item->dec_buffs + 1, dec_buffs + 1);
759
my_decimal2decimal(item->dec_buffs, dec_buffs);
760
my_decimal2decimal(item->dec_buffs + 1, dec_buffs + 1);
811
797
case DECIMAL_RESULT:
813
/* SUM result can't be longer than length(arg) + length(MAX_ROWS) */
814
int precision= args[0]->decimal_precision() + DECIMAL_LONGLONG_DIGITS;
815
max_length= class_decimal_precision_to_length(precision, decimals,
818
hybrid_type= DECIMAL_RESULT;
819
dec_buffs->set_zero();
799
/* SUM result can't be longer than length(arg) + length(MAX_ROWS) */
800
int precision= args[0]->decimal_precision() + DECIMAL_LONGLONG_DIGITS;
801
max_length= my_decimal_precision_to_length(precision, decimals,
804
hybrid_type= DECIMAL_RESULT;
805
my_decimal_set_zero(dec_buffs);
830
818
if (hybrid_type == DECIMAL_RESULT)
832
type::Decimal value, *val= args[0]->val_decimal(&value);
820
my_decimal value, *val= args[0]->val_decimal(&value);
833
821
if (!args[0]->null_value)
835
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs + (curr_dec_buff^1),
823
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs + (curr_dec_buff^1),
836
824
val, dec_buffs + curr_dec_buff);
837
825
curr_dec_buff^= 1;
854
842
if (hybrid_type == DECIMAL_RESULT)
857
(dec_buffs + curr_dec_buff)->val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
845
my_decimal2int(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, unsigned_flag,
860
849
return (int64_t) rint(val_real());
866
855
assert(fixed == 1);
867
856
if (hybrid_type == DECIMAL_RESULT)
868
class_decimal2double(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, &sum);
857
my_decimal2double(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, &sum);
942
931
virtual void div(Hybrid_type *val, uint64_t u) const
944
int2_class_decimal(E_DEC_FATAL_ERROR, val->integer, 0, val->dec_buf);
933
int2my_decimal(E_DEC_FATAL_ERROR, val->integer, 0, val->dec_buf);
945
934
val->used_dec_buf_no= 0;
946
935
val->traits= Hybrid_type_traits_decimal::instance();
947
936
val->traits->div(val, u);
974
962
table_field_type= DRIZZLE_TYPE_DOUBLE;
978
Preserving int8, int16, int32 field types gives ~10% performance boost
979
as the size of result tree becomes significantly smaller.
980
Another speed up we gain by using int64_t for intermediate
981
calculations. The range of int64 is enough to hold sum 2^32 distinct
982
integers each <= 2^32.
984
if (table_field_type == DRIZZLE_TYPE_LONG)
986
val.traits= Hybrid_type_traits_fast_decimal::instance();
989
table_field_type= DRIZZLE_TYPE_LONGLONG;
966
Preserving int8, int16, int32 field types gives ~10% performance boost
967
as the size of result tree becomes significantly smaller.
968
Another speed up we gain by using int64_t for intermediate
969
calculations. The range of int64 is enough to hold sum 2^32 distinct
970
integers each <= 2^32.
972
if (table_field_type == DRIZZLE_TYPE_LONG)
974
val.traits= Hybrid_type_traits_fast_decimal::instance();
977
table_field_type= DRIZZLE_TYPE_LONGLONG;
991
979
case DECIMAL_RESULT:
992
980
val.traits= Hybrid_type_traits_decimal::instance();
993
981
if (table_field_type != DRIZZLE_TYPE_LONGLONG)
994
982
table_field_type= DRIZZLE_TYPE_DECIMAL;
1000
988
val.traits->fix_length_and_dec(this, args[0]);
1035
1023
field_def.init_for_tmp_table(table_field_type, args[0]->max_length,
1036
1024
args[0]->decimals, args[0]->maybe_null);
1038
if (! (table= session->getInstanceTable(field_list)))
1026
if (! (table= create_virtual_tmp_table(session, field_list)))
1041
1029
/* XXX: check that the case of CHAR(0) works OK */
1042
tree_key_length= table->getShare()->getRecordLength() - table->getShare()->null_bytes;
1030
tree_key_length= table->s->reclength - table->s->null_bytes;
1045
1033
Unique handles all unique elements in a tree until they can't fit
1059
1047
bool Item_sum_distinct::add()
1061
args[0]->save_in_field(table->getField(0), false);
1049
args[0]->save_in_field(table->field[0], false);
1062
1050
is_evaluated= false;
1063
if (!table->getField(0)->is_null())
1051
if (!table->field[0]->is_null())
1068
1056
'0' values are also stored in the tree. This doesn't matter
1069
1057
for SUM(DISTINCT), but is important for AVG(DISTINCT)
1071
return tree->unique_add(table->getField(0)->ptr);
1059
return tree->unique_add(table->field[0]->ptr);
1077
1065
bool Item_sum_distinct::unique_walk_function(void *element)
1079
memcpy(table->getField(0)->ptr, element, tree_key_length);
1067
memcpy(table->field[0]->ptr, element, tree_key_length);
1081
val.traits->add(&val, table->getField(0));
1069
val.traits->add(&val, table->field[0]);
1167
1155
Item_sum_avg_distinct::fix_length_and_dec()
1169
1157
Item_sum_distinct::fix_length_and_dec();
1170
prec_increment= getSession().variables.div_precincrement;
1158
prec_increment= current_session->variables.div_precincrement;
1172
1160
AVG() will divide val by count. We need to reserve digits
1173
1161
after decimal point as the result can be fractional.
1231
1219
Item_sum_sum::fix_length_and_dec();
1232
1220
maybe_null=null_value=1;
1233
prec_increment= getSession().variables.div_precincrement;
1221
prec_increment= current_session->variables.div_precincrement;
1235
1222
if (hybrid_type == DECIMAL_RESULT)
1237
1224
int precision= args[0]->decimal_precision() + prec_increment;
1238
1225
decimals= min(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1239
max_length= class_decimal_precision_to_length(precision, decimals,
1226
max_length= my_decimal_precision_to_length(precision, decimals,
1240
1227
unsigned_flag);
1241
1228
f_precision= min(precision+DECIMAL_LONGLONG_DIGITS, DECIMAL_MAX_PRECISION);
1242
1229
f_scale= args[0]->decimals;
1243
dec_bin_size= class_decimal_get_binary_size(f_precision, f_scale);
1230
dec_bin_size= my_decimal_get_binary_size(f_precision, f_scale);
1246
1233
decimals= min(args[0]->decimals + prec_increment, (unsigned int) NOT_FIXED_DEC);
1266
1253
The easiest way is to do this is to store both value in a string
1267
1254
and unpack on access.
1269
table->setVariableWidth();
1270
1256
field= new Field_varstring(((hybrid_type == DECIMAL_RESULT) ?
1271
1257
dec_bin_size : sizeof(double)) + sizeof(int64_t),
1272
0, name, &my_charset_bin);
1258
0, name, table->s, &my_charset_bin);
1274
1260
else if (hybrid_type == DECIMAL_RESULT)
1275
1261
field= new Field_decimal(max_length, maybe_null, name,
1319
type::Decimal *Item_sum_avg::val_decimal(type::Decimal *val)
1305
my_decimal *Item_sum_avg::val_decimal(my_decimal *val)
1321
type::Decimal sum_buff, cnt;
1322
const type::Decimal *sum_dec;
1307
my_decimal sum_buff, cnt;
1308
const my_decimal *sum_dec;
1323
1309
assert(fixed == 1);
1335
1321
return val_decimal_from_real(val);
1337
1323
sum_dec= dec_buffs + curr_dec_buff;
1338
int2_class_decimal(E_DEC_FATAL_ERROR, count, 0, &cnt);
1339
class_decimal_div(E_DEC_FATAL_ERROR, val, sum_dec, &cnt, prec_increment);
1324
int2my_decimal(E_DEC_FATAL_ERROR, count, 0, &cnt);
1325
my_decimal_div(E_DEC_FATAL_ERROR, val, sum_dec, &cnt, prec_increment);
1428
1414
void Item_sum_variance::fix_length_and_dec()
1430
1416
maybe_null= null_value= 1;
1431
prec_increment= getSession().variables.div_precincrement;
1417
prec_increment= current_session->variables.div_precincrement;
1434
1420
According to the SQL2003 standard (Part 2, Foundations; sec 10.9,
1446
1432
case INT_RESULT:
1447
1433
case DECIMAL_RESULT:
1449
int precision= args[0]->decimal_precision()*2 + prec_increment;
1450
decimals= min(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1451
max_length= class_decimal_precision_to_length(precision, decimals,
1435
int precision= args[0]->decimal_precision()*2 + prec_increment;
1436
decimals= min(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1437
max_length= my_decimal_precision_to_length(precision, decimals,
1456
1442
case ROW_RESULT:
1481
1469
The easiest way is to do this is to store both value in a string
1482
1470
and unpack on access.
1484
table->setVariableWidth();
1485
field= new Field_varstring(sizeof(double)*2 + sizeof(int64_t), 0, name, &my_charset_bin);
1472
field= new Field_varstring(sizeof(double)*2 + sizeof(int64_t), 0, name, table->s, &my_charset_bin);
1488
1475
field= new Field_double(max_length, maybe_null, name, decimals, true);
1624
1611
assert(fixed == 1);
1625
1612
if (null_value)
1628
1614
switch (hybrid_type) {
1629
1615
case STRING_RESULT:
1633
String *res; res=val_str(&str_value);
1634
return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
1635
&end_not_used, &err_not_used) : 0.0);
1619
String *res; res=val_str(&str_value);
1620
return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
1621
&end_not_used, &err_not_used) : 0.0);
1637
1623
case INT_RESULT:
1638
1624
return (double) sum_int;
1639
1625
case DECIMAL_RESULT:
1640
class_decimal2double(E_DEC_FATAL_ERROR, &sum_dec, &sum);
1626
my_decimal2double(E_DEC_FATAL_ERROR, &sum_dec, &sum);
1642
1628
case REAL_RESULT:
1644
1630
case ROW_RESULT:
1645
1632
// This case should never be choosen
1653
1638
int64_t Item_sum_hybrid::val_int()
1673
type::Decimal *Item_sum_hybrid::val_decimal(type::Decimal *val)
1658
my_decimal *Item_sum_hybrid::val_decimal(my_decimal *val)
1675
1660
assert(fixed == 1);
1676
1661
if (null_value)
1679
1663
switch (hybrid_type) {
1680
1664
case STRING_RESULT:
1681
val->store(E_DEC_FATAL_ERROR, &value);
1665
string2my_decimal(E_DEC_FATAL_ERROR, &value, val);
1683
1667
case REAL_RESULT:
1684
double2_class_decimal(E_DEC_FATAL_ERROR, sum, val);
1668
double2my_decimal(E_DEC_FATAL_ERROR, sum, val);
1686
1670
case DECIMAL_RESULT:
1689
1673
case INT_RESULT:
1690
int2_class_decimal(E_DEC_FATAL_ERROR, sum_int, unsigned_flag, val);
1674
int2my_decimal(E_DEC_FATAL_ERROR, sum_int, unsigned_flag, val);
1692
1676
case ROW_RESULT:
1693
1678
// This case should never be choosen
1698
1682
return val; // Keep compiler happy
1713
1696
str->set_real(sum,decimals, &my_charset_bin);
1715
1698
case DECIMAL_RESULT:
1716
class_decimal2string(&sum_dec, 0, str);
1699
my_decimal2string(E_DEC_FATAL_ERROR, &sum_dec, 0, 0, 0, str);
1718
1701
case INT_RESULT:
1719
1702
str->set_int(sum_int, unsigned_flag, &my_charset_bin);
1762
1745
switch (hybrid_type) {
1763
1746
case STRING_RESULT:
1748
String *result=args[0]->val_str(&tmp_value);
1749
if (!args[0]->null_value &&
1750
(null_value || sortcmp(&value,result,collation.collation) > 0))
1765
String *result=args[0]->val_str(&tmp_value);
1766
if (!args[0]->null_value &&
1767
(null_value || sortcmp(&value,result,collation.collation) > 0))
1769
value.copy(*result);
1752
value.copy(*result);
1774
1757
case INT_RESULT:
1759
int64_t nr=args[0]->val_int();
1760
if (!args[0]->null_value && (null_value ||
1762
(uint64_t) nr < (uint64_t) sum_int) ||
1763
(!unsigned_flag && nr < sum_int)))
1776
int64_t nr=args[0]->val_int();
1777
if (!args[0]->null_value && (null_value ||
1779
(uint64_t) nr < (uint64_t) sum_int) ||
1780
(!unsigned_flag && nr < sum_int)))
1787
1770
case DECIMAL_RESULT:
1772
my_decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1773
if (!args[0]->null_value &&
1774
(null_value || (my_decimal_cmp(&sum_dec, val) > 0)))
1789
type::Decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1790
if (!args[0]->null_value &&
1791
(null_value || (class_decimal_cmp(&sum_dec, val) > 0)))
1793
class_decimal2decimal(val, &sum_dec);
1776
my_decimal2decimal(val, &sum_dec);
1798
1781
case REAL_RESULT:
1783
double nr= args[0]->val_real();
1784
if (!args[0]->null_value && (null_value || nr < sum))
1800
double nr= args[0]->val_real();
1801
if (!args[0]->null_value && (null_value || nr < sum))
1808
1791
case ROW_RESULT:
1809
1793
// This case should never be choosen
1825
1809
switch (hybrid_type) {
1826
1810
case STRING_RESULT:
1812
String *result=args[0]->val_str(&tmp_value);
1813
if (!args[0]->null_value &&
1814
(null_value || sortcmp(&value,result,collation.collation) < 0))
1828
String *result=args[0]->val_str(&tmp_value);
1829
if (!args[0]->null_value &&
1830
(null_value || sortcmp(&value,result,collation.collation) < 0))
1832
value.copy(*result);
1816
value.copy(*result);
1837
1821
case INT_RESULT:
1823
int64_t nr=args[0]->val_int();
1824
if (!args[0]->null_value && (null_value ||
1826
(uint64_t) nr > (uint64_t) sum_int) ||
1827
(!unsigned_flag && nr > sum_int)))
1839
int64_t nr=args[0]->val_int();
1840
if (!args[0]->null_value && (null_value ||
1842
(uint64_t) nr > (uint64_t) sum_int) ||
1843
(!unsigned_flag && nr > sum_int)))
1850
1834
case DECIMAL_RESULT:
1836
my_decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1837
if (!args[0]->null_value &&
1838
(null_value || (my_decimal_cmp(val, &sum_dec) > 0)))
1852
type::Decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1853
if (!args[0]->null_value &&
1854
(null_value || (class_decimal_cmp(val, &sum_dec) > 0)))
1856
class_decimal2decimal(val, &sum_dec);
1840
my_decimal2decimal(val, &sum_dec);
1861
1845
case REAL_RESULT:
1847
double nr= args[0]->val_real();
1848
if (!args[0]->null_value && (null_value || nr > sum))
1863
double nr= args[0]->val_real();
1864
if (!args[0]->null_value && (null_value || nr > sum))
1871
1855
case ROW_RESULT:
1872
1857
// This case should never be choosen
1962
1946
switch(hybrid_type) {
1963
1947
case STRING_RESULT:
1965
char buff[MAX_FIELD_WIDTH];
1966
String tmp(buff,sizeof(buff),result_field->charset()),*res;
1968
res=args[0]->val_str(&tmp);
1969
if (args[0]->null_value)
1949
char buff[MAX_FIELD_WIDTH];
1950
String tmp(buff,sizeof(buff),result_field->charset()),*res;
1952
res=args[0]->val_str(&tmp);
1953
if (args[0]->null_value)
1955
result_field->set_null();
1956
result_field->reset();
1960
result_field->set_notnull();
1961
result_field->store(res->ptr(),res->length(),tmp.charset());
1967
int64_t nr=args[0]->val_int();
1971
if (args[0]->null_value)
1974
result_field->set_null();
1977
result_field->set_notnull();
1979
result_field->store(nr, unsigned_flag);
1984
double nr= args[0]->val_real();
1988
if (args[0]->null_value)
1991
result_field->set_null();
1994
result_field->set_notnull();
1996
result_field->store(nr);
1999
case DECIMAL_RESULT:
2001
my_decimal value_buff, *arg_dec= args[0]->val_decimal(&value_buff);
2005
if (args[0]->null_value)
1971
2006
result_field->set_null();
1972
result_field->reset();
1976
2008
result_field->set_notnull();
1977
result_field->store(res->ptr(),res->length(),tmp.charset());
1983
int64_t nr=args[0]->val_int();
1987
if (args[0]->null_value)
1990
result_field->set_null();
1993
result_field->set_notnull();
1995
result_field->store(nr, unsigned_flag);
2000
double nr= args[0]->val_real();
2004
if (args[0]->null_value)
2007
result_field->set_null();
2010
result_field->set_notnull();
2012
result_field->store(nr);
2015
case DECIMAL_RESULT:
2017
type::Decimal value_buff, *arg_dec= args[0]->val_decimal(&value_buff);
2021
if (args[0]->null_value)
2022
result_field->set_null();
2024
result_field->set_notnull();
2027
We must store zero in the field as we will use the field value in
2030
if (!arg_dec) // Null
2031
arg_dec= &decimal_zero;
2032
result_field->store_decimal(arg_dec);
2011
We must store zero in the field as we will use the field value in
2014
if (!arg_dec) // Null
2015
arg_dec= &decimal_zero;
2016
result_field->store_decimal(arg_dec);
2035
2019
case ROW_RESULT:
2043
2028
if (hybrid_type == DECIMAL_RESULT)
2045
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2030
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2046
2031
if (!arg_val) // Null
2047
2032
arg_val= &decimal_zero;
2048
2033
result_field->store_decimal(arg_val);
2088
arg_dec->val_binary(E_DEC_FATAL_ERROR, res, f_precision, f_scale);
2073
my_decimal2binary(E_DEC_FATAL_ERROR, arg_dec, res, f_precision, f_scale);
2089
2074
res+= dec_bin_size;
2090
2075
int8store(res, tmp);
2130
2115
if (hybrid_type == DECIMAL_RESULT)
2132
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2117
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2133
2118
if (!args[0]->null_value)
2135
2120
if (!result_field->is_null())
2137
type::Decimal field_value,
2122
my_decimal field_value,
2138
2123
*field_val= result_field->val_decimal(&field_value);
2139
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, field_val);
2124
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, field_val);
2140
2125
result_field->store_decimal(dec_buffs);
2181
2166
unsigned char *res=result_field->ptr;
2182
2167
if (hybrid_type == DECIMAL_RESULT)
2184
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2169
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2185
2170
if (!args[0]->null_value)
2187
binary2_class_decimal(E_DEC_FATAL_ERROR, res,
2172
binary2my_decimal(E_DEC_FATAL_ERROR, res,
2188
2173
dec_buffs + 1, f_precision, f_scale);
2189
2174
field_count= sint8korr(res + dec_bin_size);
2190
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, dec_buffs + 1);
2191
dec_buffs->val_binary(E_DEC_FATAL_ERROR, res, f_precision, f_scale);
2175
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, dec_buffs + 1);
2176
my_decimal2binary(E_DEC_FATAL_ERROR, dec_buffs,
2177
res, f_precision, f_scale);
2192
2178
res+= dec_bin_size;
2194
2180
int8store(res, field_count);
2241
2226
if (!args[0]->null_value)
2243
result_field->val_str_internal(&tmp_value);
2228
result_field->val_str(&tmp_value);
2245
2230
if (result_field->is_null() ||
2246
2231
(cmp_sign * sortcmp(res_str,&tmp_value,collation.collation)) < 0)
2306
2291
Item_sum_hybrid::min_max_update_decimal_field()
2308
2293
/* TODO: optimize: do not get result_field in case of args[0] is NULL */
2309
type::Decimal old_val, nr_val;
2310
const type::Decimal *old_nr= result_field->val_decimal(&old_val);
2311
const type::Decimal *nr= args[0]->val_decimal(&nr_val);
2294
my_decimal old_val, nr_val;
2295
const my_decimal *old_nr= result_field->val_decimal(&old_val);
2296
const my_decimal *nr= args[0]->val_decimal(&nr_val);
2312
2297
if (!args[0]->null_value)
2314
2299
if (result_field->is_null(0))
2318
bool res= class_decimal_cmp(old_nr, nr) > 0;
2303
bool res= my_decimal_cmp(old_nr, nr) > 0;
2319
2304
/* (cmp_sign > 0 && res) || (!(cmp_sign > 0) && !res) */
2320
2305
if ((cmp_sign > 0) ^ (!res))
2382
2367
if ((null_value= !count))
2385
type::Decimal dec_count, dec_field;
2386
binary2_class_decimal(E_DEC_FATAL_ERROR,
2370
my_decimal dec_count, dec_field;
2371
binary2my_decimal(E_DEC_FATAL_ERROR,
2387
2372
field->ptr, &dec_field, f_precision, f_scale);
2388
int2_class_decimal(E_DEC_FATAL_ERROR, count, 0, &dec_count);
2389
class_decimal_div(E_DEC_FATAL_ERROR, dec_buf,
2373
int2my_decimal(E_DEC_FATAL_ERROR, count, 0, &dec_count);
2374
my_decimal_div(E_DEC_FATAL_ERROR, dec_buf,
2390
2375
&dec_field, &dec_count, prec_increment);
2391
2376
return dec_buf;
2420
type::Decimal *Item_std_field::val_decimal(type::Decimal *dec_buf)
2405
my_decimal *Item_std_field::val_decimal(my_decimal *dec_buf)
2423
2408
We can't call val_decimal_from_real() for DECIMAL_RESULT as
2424
2409
Item_variance_field::val_real() would cause an infinite loop
2426
type::Decimal tmp_dec, *dec;
2411
my_decimal tmp_dec, *dec;
2428
2413
if (hybrid_type == REAL_RESULT)
2429
2414
return val_decimal_from_real(dec_buf);
2431
2416
dec= Item_variance_field::val_decimal(dec_buf);
2434
class_decimal2double(E_DEC_FATAL_ERROR, dec, &nr);
2419
my_decimal2double(E_DEC_FATAL_ERROR, dec, &nr);
2435
2420
assert(nr >= 0.0);
2437
double2_class_decimal(E_DEC_FATAL_ERROR, nr, &tmp_dec);
2438
class_decimal_round(E_DEC_FATAL_ERROR, &tmp_dec, decimals, false, dec_buf);
2422
double2my_decimal(E_DEC_FATAL_ERROR, nr, &tmp_dec);
2423
my_decimal_round(E_DEC_FATAL_ERROR, &tmp_dec, decimals, false, dec_buf);
2439
2424
return dec_buf;
2507
2492
int composite_key_cmp(void* arg, unsigned char* key1, unsigned char* key2)
2509
2494
Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg;
2510
Field **field = item->table->getFields();
2511
Field **field_end= field + item->table->getShare()->sizeFields();
2495
Field **field = item->table->field;
2496
Field **field_end= field + item->table->s->fields;
2512
2497
uint32_t *lengths=item->field_lengths;
2513
2498
for (; field < field_end; ++field)
2612
2598
tmp_table_param->force_copy_fields= force_copy_fields;
2613
2599
assert(table == 0);
2615
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,
2617
2603
(select_lex->options | session->options),
2618
2604
HA_POS_ERROR, (char*)"")))
2622
2606
table->cursor->extra(HA_EXTRA_NO_ROWS); // Don't update rows
2623
2607
table->no_rows=1;
2625
if (table->getShare()->db_type() == heap_engine)
2609
if (table->s->db_type() == heap_engine)
2628
2612
No blobs, otherwise it would have been MyISAM: set up a compare
2631
2615
qsort_cmp2 compare_key;
2633
Field **field= table->getFields();
2634
Field **field_end= field + table->getShare()->sizeFields();
2617
Field **field= table->field;
2618
Field **field_end= field + table->s->fields;
2635
2619
bool all_binary= true;
2637
2621
for (tree_key_length= 0; field < field_end; ++field)
2669
2653
uint32_t *length;
2670
2654
compare_key= (qsort_cmp2) composite_key_cmp;
2671
2655
cmp_arg= (void*) this;
2672
field_lengths= (uint32_t*) session->getMemRoot()->allocate(table->getShare()->sizeFields() * sizeof(uint32_t));
2673
for (tree_key_length= 0, length= field_lengths, field= table->getFields();
2656
field_lengths= (uint32_t*) session->alloc(table->s->fields * sizeof(uint32_t));
2657
for (tree_key_length= 0, length= field_lengths, field= table->field;
2674
2658
field < field_end; ++field, ++length)
2676
2660
*length= (*field)->pack_length();
2723
2707
if (always_null)
2725
2709
copy_fields(tmp_table_param);
2726
if (copy_funcs(tmp_table_param->items_to_copy, table->in_use))
2710
copy_funcs(tmp_table_param->items_to_copy);
2729
for (Field **field= table->getFields() ; *field ; field++)
2712
for (Field **field=table->field ; *field ; field++)
2731
2713
if ((*field)->is_real_null(0))
2733
2714
return 0; // Don't count NULL
2737
2716
is_evaluated= false;
2743
2722
bloat the tree without providing any valuable info. Besides,
2744
2723
key_length used to initialize the tree didn't include space for them.
2746
return tree->unique_add(table->record[0] + table->getShare()->null_bytes);
2725
return tree->unique_add(table->record[0] + table->s->null_bytes);
2748
2727
if ((error= table->cursor->insertRecord(table->record[0])) &&
2749
2728
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
2833
2812
Field *field= item->get_tmp_table_field();
2835
uint32_t offset= field->offset(field->getTable()->record[0])-table->getShare()->null_bytes;
2814
uint32_t offset= field->offset(field->table->record[0])-table->s->null_bytes;
2836
2815
if((res= field->cmp((unsigned char*)key1 + offset, (unsigned char*)key2 + offset)))
2848
2827
const void* key2)
2850
2829
Item_func_group_concat* grp_item= (Item_func_group_concat*) arg;
2851
Order **order_item, **end;
2830
order_st **order_item, **end;
2852
2831
Table *table= grp_item->table;
2854
2833
for (order_item= grp_item->order, end=order_item+ grp_item->arg_count_order;
2869
2848
if (field && !item->const_item())
2872
uint32_t offset= (field->offset(field->getTable()->record[0]) -
2873
table->getShare()->null_bytes);
2851
uint32_t offset= (field->offset(field->table->record[0]) -
2852
table->s->null_bytes);
2874
2853
if ((res= field->cmp((unsigned char*)key1 + offset, (unsigned char*)key2 + offset)))
2875
2854
return (*order_item)->asc ? res : -res;
2892
2871
Item_func_group_concat *item)
2894
2873
Table *table= item->table;
2895
String tmp((char *)table->getUpdateRecord(), table->getShare()->getRecordLength(),
2874
String tmp((char *)table->record[1], table->s->reclength,
2896
2875
default_charset_info);
2898
2877
String *result= &item->result;
2919
2898
because it contains both order and arg list fields.
2921
2900
Field *field= (*arg)->get_tmp_table_field();
2922
uint32_t offset= (field->offset(field->getTable()->record[0]) -
2923
table->getShare()->null_bytes);
2924
assert(offset < table->getShare()->getRecordLength());
2925
res= field->val_str_internal(&tmp, key + offset);
2901
uint32_t offset= (field->offset(field->table->record[0]) -
2902
table->s->null_bytes);
2903
assert(offset < table->s->reclength);
2904
res= field->val_str(&tmp, key + offset);
2928
2907
res= (*arg)->val_str(&tmp);
2992
2971
order - arg_count_order
2994
2973
if (!(args= (Item**) memory::sql_alloc(sizeof(Item*) * arg_count +
2995
sizeof(Order*)*arg_count_order)))
2974
sizeof(order_st*)*arg_count_order)))
2998
order= (Order**)(args + arg_count);
2977
order= (order_st**)(args + arg_count);
3000
2979
/* fill args items of show and sort */
3001
List<Item>::iterator li(select_list->begin());
2980
List_iterator_fast<Item> li(*select_list);
3003
2982
for (arg_ptr=args ; (item_select= li++) ; arg_ptr++)
3004
2983
*arg_ptr= item_select;
3006
2985
if (arg_count_order)
3008
Order **order_ptr= order;
3009
for (Order *order_item= (Order*) order_list->first;
2987
order_st **order_ptr= order;
2988
for (order_st *order_item= (order_st*) order_list->first;
3010
2989
order_item != NULL;
3011
2990
order_item= order_item->next)
3054
3033
char warn_buff[DRIZZLE_ERRMSG_SIZE];
3055
3034
snprintf(warn_buff, sizeof(warn_buff), ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
3056
warning->set_msg(&getSession(), warn_buff);
3035
warning->set_msg(current_session, warn_buff);
3141
3120
/* Filter out duplicate rows. */
3142
3121
uint32_t count= unique_filter->elements_in_tree();
3143
unique_filter->unique_add(table->record[0] + table->getShare()->null_bytes);
3122
unique_filter->unique_add(table->record[0] + table->s->null_bytes);
3144
3123
if (count == unique_filter->elements_in_tree())
3145
3124
row_eligible= false;
3148
3127
TREE_ELEMENT *el= 0; // Only for safety
3149
3128
if (row_eligible && tree)
3150
el= tree_insert(tree, table->record[0] + table->getShare()->null_bytes, 0,
3129
el= tree_insert(tree, table->record[0] + table->s->null_bytes, 0,
3151
3130
tree->custom_arg);
3153
3132
If the row is not a duplicate (el->count == 1)
3157
3136
if (row_eligible && !warning_for_row &&
3158
3137
(!tree || (el->count == 1 && distinct && !arg_count_order)))
3159
dump_leaf_key(table->record[0] + table->getShare()->null_bytes, 1, this);
3138
dump_leaf_key(table->record[0] + table->s->null_bytes, 1, this);
3276
3255
if (!(table= create_tmp_table(session, tmp_table_param, all_fields,
3277
(Order*) 0, 0, true,
3256
(order_st*) 0, 0, true,
3278
3257
(select_lex->options | session->options),
3279
3258
HA_POS_ERROR, (char*) "")))
3284
3260
table->cursor->extra(HA_EXTRA_NO_ROWS);
3285
3261
table->no_rows= 1;
3289
3265
Don't reserve space for NULLs: if any of gconcat arguments is NULL,
3290
3266
the row is not added to the result.
3292
uint32_t tree_key_length= table->getShare()->getRecordLength() - table->getShare()->null_bytes;
3268
uint32_t tree_key_length= table->s->reclength - table->s->null_bytes;
3294
3270
if (arg_count_order)