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 */
21
21
Sum functions (COUNT, MIN...)
23
#include <drizzled/server_includes.h>
26
24
#include <drizzled/sql_select.h>
27
#include <drizzled/error.h>
28
#include <drizzled/hybrid_type_traits.h>
29
#include <drizzled/hybrid_type_traits_integer.h>
30
#include <drizzled/hybrid_type_traits_decimal.h>
31
#include <drizzled/sql_base.h>
33
#include <drizzled/item/sum.h>
34
#include <drizzled/field/decimal.h>
35
#include <drizzled/field/double.h>
36
#include <drizzled/field/int64.h>
37
#include <drizzled/field/date.h>
38
#include <drizzled/field/datetime.h>
40
#include <drizzled/type/decimal.h>
42
#include "drizzled/internal/m_string.h"
51
extern plugin::StorageEngine *heap_engine;
25
#include <drizzled/drizzled_error_messages.h>
54
28
Prepare an aggregate function item for checking context conditions.
59
33
If the set function is not allowed in any subquery where it occurs
60
34
an error is reported immediately.
62
@param session reference to the thread context info
36
@param thd reference to the thread context info
65
39
This function is to be called for any item created for a set function
75
bool Item_sum::init_sum_func_check(Session *session)
49
bool Item_sum::init_sum_func_check(THD *thd)
77
if (!session->lex->allow_sum_func)
51
if (!thd->lex->allow_sum_func)
79
53
my_message(ER_INVALID_GROUP_FUNC_USE, ER(ER_INVALID_GROUP_FUNC_USE),
83
57
/* Set a reference to the nesting set function if there is any */
84
in_sum_func= session->lex->in_sum_func;
58
in_sum_func= thd->lex->in_sum_func;
85
59
/* Save a pointer to object to be used in items for nested set functions */
86
session->lex->in_sum_func= this;
87
nest_level= session->lex->current_select->nest_level;
60
thd->lex->in_sum_func= this;
61
nest_level= thd->lex->current_select->nest_level;
106
80
If the context conditions are not met the method reports an error.
107
81
If the set function is aggregated in some outer subquery the method
108
82
adds it to the chain of items for such set functions that is attached
109
to the the Select_Lex structure for this subquery.
83
to the the st_select_lex structure for this subquery.
111
85
A number of designated members of the object are used to check the
112
86
conditions. They are specified in the comment before the Item_sum
113
87
class declaration.
114
88
Additionally a bitmap variable called allow_sum_func is employed.
115
It is included into the session->lex structure.
89
It is included into the thd->lex structure.
116
90
The bitmap contains 1 at n-th position if the set function happens
117
91
to occur under a construct of the n-th level subquery where usage
118
92
of set functions are allowed (i.e either in the SELECT list or
123
97
HAVING t1.a IN (SELECT t2.c FROM t2 WHERE AVG(t1.b) > 20) AND
124
98
t1.a > (SELECT MIN(t2.d) FROM t2);
126
allow_sum_func will contain:
127
- for SUM(t1.b) - 1 at the first position
100
allow_sum_func will contain:
101
- for SUM(t1.b) - 1 at the first position
128
102
- for AVG(t1.b) - 1 at the first position, 0 at the second position
129
103
- for MIN(t2.d) - 1 at the first position, 1 at the second position.
131
@param session reference to the thread context info
105
@param thd reference to the thread context info
132
106
@param ref location of the pointer to this item in the embedding expression
146
bool Item_sum::check_sum_func(Session *session, Item **ref)
120
bool Item_sum::check_sum_func(THD *thd, Item **ref)
148
122
bool invalid= false;
149
nesting_map allow_sum_func= session->lex->allow_sum_func;
123
nesting_map allow_sum_func= thd->lex->allow_sum_func;
151
125
The value of max_arg_level is updated if an argument of the set function
152
126
contains a column reference resolved against a subquery whose level is
153
127
greater than the current value of max_arg_level.
154
128
max_arg_level cannot be greater than nest level.
155
nest level is always >= 0
129
nest level is always >= 0
157
131
if (nest_level == max_arg_level)
160
The function must be aggregated in the current subquery,
161
If it is there under a construct where it is not allowed
134
The function must be aggregated in the current subquery,
135
If it is there under a construct where it is not allowed
164
138
invalid= !(allow_sum_func & (1 << max_arg_level));
166
140
else if (max_arg_level >= 0 || !(allow_sum_func & (1 << nest_level)))
170
144
Try to find a subquery where it can be aggregated;
171
145
If we fail to find such a subquery report an error.
173
if (register_sum_func(session, ref))
147
if (register_sum_func(thd, ref))
175
149
invalid= aggr_level < 0 && !(allow_sum_func & (1 << nest_level));
176
150
if (!invalid && false)
179
153
if (!invalid && aggr_level < 0)
181
155
aggr_level= nest_level;
182
aggr_sel= session->lex->current_select;
156
aggr_sel= thd->lex->current_select;
185
159
By this moment we either found a subquery where the set function is
186
160
to be aggregated and assigned a value that is >= 0 to aggr_level,
187
or set the value of 'invalid' to TRUE to report later an error.
161
or set the value of 'invalid' to TRUE to report later an error.
190
164
Additionally we have to check whether possible nested set functions
191
165
are acceptable here: they are not, if the level of aggregation of
192
166
some of them is less than aggr_level.
195
169
invalid= aggr_level <= max_sum_func_level;
198
172
my_message(ER_INVALID_GROUP_FUNC_USE, ER(ER_INVALID_GROUP_FUNC_USE),
206
180
If the set function is nested adjust the value of
207
181
max_sum_func_level for the nesting set function.
208
We take into account only enclosed set functions that are to be
209
aggregated on the same level or above of the nest level of
182
We take into account only enclosed set functions that are to be
183
aggregated on the same level or above of the nest level of
210
184
the enclosing set function.
211
185
But we must always pass up the max_sum_func_level because it is
212
186
the maximum nested level of all directly and indirectly enclosed
269
243
in_sum_func->outer_fields.push_back(field);
273
sel->full_group_by_flag.set(NON_AGG_FIELD_USED);
246
sel->full_group_by_flag|= NON_AGG_FIELD_USED;
276
248
if (sel->nest_level > aggr_level &&
277
(sel->full_group_by_flag.test(SUM_FUNC_USED)) &&
278
! sel->group_list.elements)
249
(sel->full_group_by_flag & SUM_FUNC_USED) &&
250
!sel->group_list.elements)
280
252
my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS,
281
253
ER(ER_MIX_OF_GROUP_FUNC_AND_FIELDS), MYF(0));
296
268
aggregated. If it finds such a subquery then aggr_level is set to
297
269
the nest level of this subquery and the item for the set function
298
270
is added to the list of set functions used in nested subqueries
299
inner_sum_func_list defined for each subquery. When the item is placed
271
inner_sum_func_list defined for each subquery. When the item is placed
300
272
there the field 'ref_by' is set to ref.
305
277
a subquery in one chain. It would simplify the process of 'splitting'
306
278
for set functions.
308
@param session reference to the thread context info
280
@param thd reference to the thread context info
309
281
@param ref location of the pointer to this item in the embedding expression
312
284
FALSE if the executes without failures (currently always)
317
bool Item_sum::register_sum_func(Session *session, Item **ref)
289
bool Item_sum::register_sum_func(THD *thd, Item **ref)
320
nesting_map allow_sum_func= session->lex->allow_sum_func;
321
for (sl= session->lex->current_select->master_unit()->outer_select() ;
292
nesting_map allow_sum_func= thd->lex->allow_sum_func;
293
for (sl= thd->lex->current_select->master_unit()->outer_select() ;
322
294
sl && sl->nest_level > max_arg_level;
323
295
sl= sl->master_unit()->outer_select() )
332
304
if (sl && (allow_sum_func & (1 << sl->nest_level)))
335
307
We reached the subquery of level max_arg_level and checked
336
that the function can be aggregated here.
308
that the function can be aggregated here.
337
309
The set function will be aggregated in this subquery.
339
311
aggr_level= sl->nest_level;
354
326
aggr_sel->inner_sum_func_list= this;
355
327
aggr_sel->with_sum_func= 1;
358
330
Mark Item_subselect(s) as containing aggregate function all the way up
359
331
to aggregate function's calculation context.
360
332
Note that we must not mark the Item of calculation context itself
361
because with_sum_func on the calculation context Select_Lex is
333
because with_sum_func on the calculation context st_select_lex is
362
334
already set above.
364
with_sum_func being set for an Item means that this Item refers
336
with_sum_func being set for an Item means that this Item refers
365
337
(somewhere in it, e.g. one of its arguments if it's a function) directly
366
338
or through intermediate items to an aggregate function that is calculated
367
339
in a context "outside" of the Item (e.g. in the current or outer select).
369
with_sum_func being set for an Select_Lex means that this Select_Lex
341
with_sum_func being set for an st_select_lex means that this st_select_lex
370
342
has aggregate functions directly referenced (i.e. not through a sub-select).
372
for (sl= session->lex->current_select;
344
for (sl= thd->lex->current_select;
373
345
sl && sl != aggr_sel && sl->master_unit()->item;
374
346
sl= sl->master_unit()->outer_select() )
375
347
sl->master_unit()->item->with_sum_func= 1;
377
session->lex->current_select->mark_as_dependent(aggr_sel);
349
thd->lex->current_select->mark_as_dependent(aggr_sel);
382
Item_sum::Item_sum(List<Item> &list) :arg_count(list.elements),
354
Item_sum::Item_sum(List<Item> &list) :arg_count(list.elements),
383
355
forced_const(false)
385
if ((args=(Item**) memory::sql_alloc(sizeof(Item*)*arg_count)))
357
if ((args=(Item**) sql_alloc(sizeof(Item*)*arg_count)))
388
360
List_iterator_fast<Item> li(list);
402
374
Constructor used in processing select with temporary tebles.
405
Item_sum::Item_sum(Session *session, Item_sum *item):
406
Item_result_field(session, item), arg_count(item->arg_count),
377
Item_sum::Item_sum(THD *thd, Item_sum *item):
378
Item_result_field(thd, item), arg_count(item->arg_count),
407
379
aggr_sel(item->aggr_sel),
408
380
nest_level(item->nest_level), aggr_level(item->aggr_level),
409
381
quick_group(item->quick_group), used_tables_cache(item->used_tables_cache),
410
forced_const(item->forced_const)
382
forced_const(item->forced_const)
412
384
if (arg_count <= 2)
415
if (!(args= (Item**) session->getMemRoot()->allocate(sizeof(Item*)*arg_count)))
387
if (!(args= (Item**) thd->alloc(sizeof(Item*)*arg_count)))
417
389
memcpy(args, item->args, sizeof(Item*)*arg_count);
421
393
void Item_sum::mark_as_sum_func()
423
Select_Lex *cur_select= getSession().getLex()->current_select;
395
SELECT_LEX *cur_select= current_thd->lex->current_select;
424
396
cur_select->n_sum_items++;
425
397
cur_select->with_sum_func= 1;
426
398
with_sum_func= 1;
430
void Item_sum::make_field(SendField *tmp_field)
402
void Item_sum::make_field(Send_field *tmp_field)
432
404
if (args[0]->type() == Item::FIELD_ITEM && keep_field_type())
467
439
max_length=float_length(decimals);
470
Item *Item_sum::get_tmp_table_item(Session *session)
442
Item *Item_sum::get_tmp_table_item(THD *thd)
472
Item_sum* sum_item= (Item_sum *) copy_or_same(session);
444
Item_sum* sum_item= (Item_sum *) copy_or_same(thd);
473
445
if (sum_item && sum_item->result_field) // If not a const sum func
475
447
Field *result_field_tmp= sum_item->result_field;
508
Field *Item_sum::create_tmp_field(bool ,
480
Field *Item_sum::create_tmp_field(bool group __attribute__((unused)),
510
482
uint32_t convert_blob_length)
514
485
switch (result_type()) {
515
486
case REAL_RESULT:
516
487
field= new Field_double(max_length, maybe_null, name, decimals, true);
520
field= new field::Int64(max_length, maybe_null, name, unsigned_flag);
490
field= new Field_int64_t(max_length, maybe_null, name, unsigned_flag);
523
492
case STRING_RESULT:
524
493
if (max_length/collation.collation->mbmaxlen <= 255 ||
525
494
convert_blob_length > Field_varstring::MAX_SIZE ||
526
495
!convert_blob_length)
528
496
return make_string_field(table);
531
table->setVariableWidth();
532
497
field= new Field_varstring(convert_blob_length, maybe_null,
533
name, collation.collation);
498
name, table->s, collation.collation);
536
500
case DECIMAL_RESULT:
537
field= new Field_decimal(max_length, maybe_null, name,
538
decimals, unsigned_flag);
501
field= new Field_new_decimal(max_length, maybe_null, name,
502
decimals, unsigned_flag);
542
506
// This case should never be choosen
548
511
field->init(table);
580
int64_t Item_sum_num::val_int()
583
return (int64_t) rint(val_real()); /* Real as default */
587
type::Decimal *Item_sum_num::val_decimal(type::Decimal *decimal_value)
542
my_decimal *Item_sum_num::val_decimal(my_decimal *decimal_value)
589
544
return val_decimal_from_real(decimal_value);
600
type::Decimal *Item_sum_int::val_decimal(type::Decimal *decimal_value)
555
my_decimal *Item_sum_int::val_decimal(my_decimal *decimal_value)
602
557
return val_decimal_from_int(decimal_value);
607
Item_sum_num::fix_fields(Session *session, Item **ref)
562
Item_sum_num::fix_fields(THD *thd, Item **ref)
609
564
assert(fixed == 0);
611
if (init_sum_func_check(session))
566
if (init_sum_func_check(thd))
616
571
for (uint32_t i=0 ; i < arg_count ; i++)
618
if (args[i]->fix_fields(session, args + i) || args[i]->check_cols(1))
573
if (args[i]->fix_fields(thd, args + i) || args[i]->check_cols(1))
620
575
set_if_bigger(decimals, args[i]->decimals);
621
576
maybe_null |= args[i]->maybe_null;
636
Item_sum_hybrid::Item_sum_hybrid(Session *session, Item_sum_hybrid *item)
637
:Item_sum(session, item), value(item->value), hybrid_type(item->hybrid_type),
591
Item_sum_hybrid::Item_sum_hybrid(THD *thd, Item_sum_hybrid *item)
592
:Item_sum(thd, item), value(item->value), hybrid_type(item->hybrid_type),
638
593
hybrid_field_type(item->hybrid_field_type), cmp_sign(item->cmp_sign),
639
594
was_values(item->was_values)
661
617
collation.set(item->collation);
665
Item_sum_hybrid::fix_fields(Session *session, Item **ref)
621
Item_sum_hybrid::fix_fields(THD *thd, Item **ref)
667
623
assert(fixed == 0);
669
625
Item *item= args[0];
671
if (init_sum_func_check(session))
627
if (init_sum_func_check(thd))
674
630
// 'item' can be changed during fix_fields
675
if ((!item->fixed && item->fix_fields(session, args)) ||
631
if ((!item->fixed && item->fix_fields(thd, args)) ||
676
632
(item= args[0])->check_cols(1))
678
634
decimals=item->decimals;
723
680
if (args[0]->type() == Item::FIELD_ITEM)
725
682
field= ((Item_field*) args[0])->field;
727
if ((field= create_tmp_field_from_field(&getSession(), field, name, table,
684
if ((field= create_tmp_field_from_field(current_thd, field, name, table,
728
685
NULL, convert_blob_length)))
729
686
field->flags&= ~NOT_NULL_FLAG;
735
692
fields creations separately.
737
694
switch (args[0]->field_type()) {
738
case DRIZZLE_TYPE_DATE:
739
field= new Field_date(maybe_null, name, collation.collation);
695
case DRIZZLE_TYPE_NEWDATE:
696
field= new Field_newdate(maybe_null, name, collation.collation);
698
case DRIZZLE_TYPE_TIME:
699
field= new Field_time(maybe_null, name, collation.collation);
741
701
case DRIZZLE_TYPE_TIMESTAMP:
742
702
case DRIZZLE_TYPE_DATETIME:
762
720
check if the following assignments are really needed
764
Item_sum_sum::Item_sum_sum(Session *session, Item_sum_sum *item)
765
:Item_sum_num(session, item), hybrid_type(item->hybrid_type),
722
Item_sum_sum::Item_sum_sum(THD *thd, Item_sum_sum *item)
723
:Item_sum_num(thd, item), hybrid_type(item->hybrid_type),
766
724
curr_dec_buff(item->curr_dec_buff)
768
726
/* TODO: check if the following assignments are really needed */
769
727
if (hybrid_type == DECIMAL_RESULT)
771
class_decimal2decimal(item->dec_buffs, dec_buffs);
772
class_decimal2decimal(item->dec_buffs + 1, dec_buffs + 1);
729
my_decimal2decimal(item->dec_buffs, dec_buffs);
730
my_decimal2decimal(item->dec_buffs + 1, dec_buffs + 1);
778
Item *Item_sum_sum::copy_or_same(Session* session)
736
Item *Item_sum_sum::copy_or_same(THD* thd)
780
return new (session->mem_root) Item_sum_sum(session, this);
738
return new (thd->mem_root) Item_sum_sum(thd, this);
809
767
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();
769
/* SUM result can't be longer than length(arg) + length(MAX_ROWS) */
770
int precision= args[0]->decimal_precision() + DECIMAL_LONGLONG_DIGITS;
771
max_length= my_decimal_precision_to_length(precision, decimals,
774
hybrid_type= DECIMAL_RESULT;
775
my_decimal_set_zero(dec_buffs);
828
788
if (hybrid_type == DECIMAL_RESULT)
830
type::Decimal value, *val= args[0]->val_decimal(&value);
790
my_decimal value, *val= args[0]->val_decimal(&value);
831
791
if (!args[0]->null_value)
833
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs + (curr_dec_buff^1),
793
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs + (curr_dec_buff^1),
834
794
val, dec_buffs + curr_dec_buff);
835
795
curr_dec_buff^= 1;
852
812
if (hybrid_type == DECIMAL_RESULT)
855
(dec_buffs + curr_dec_buff)->val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
815
my_decimal2int(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, unsigned_flag,
858
819
return (int64_t) rint(val_real());
864
825
assert(fixed == 1);
865
826
if (hybrid_type == DECIMAL_RESULT)
866
class_decimal2double(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, &sum);
827
my_decimal2double(E_DEC_FATAL_ERROR, dec_buffs + curr_dec_buff, &sum);
896
861
static int item_sum_distinct_walk(void *element,
862
element_count num_of_dups __attribute__((unused)),
900
865
return ((Item_sum_distinct*) (item))->unique_walk_function(element);
903
872
/* Item_sum_distinct */
905
874
Item_sum_distinct::Item_sum_distinct(Item *item_arg)
918
Item_sum_distinct::Item_sum_distinct(Session *session, Item_sum_distinct *original)
919
:Item_sum_num(session, original), val(original->val), tree(0),
887
Item_sum_distinct::Item_sum_distinct(THD *thd, Item_sum_distinct *original)
888
:Item_sum_num(thd, original), val(original->val), tree(0),
920
889
table_field_type(original->table_field_type)
940
909
virtual void div(Hybrid_type *val, uint64_t u) const
942
int2_class_decimal(E_DEC_FATAL_ERROR, val->integer, 0, val->dec_buf);
911
int2my_decimal(E_DEC_FATAL_ERROR, val->integer, 0, val->dec_buf);
943
912
val->used_dec_buf_no= 0;
944
913
val->traits= Hybrid_type_traits_decimal::instance();
945
914
val->traits->div(val, u);
956
925
return &fast_decimal_traits_instance;
960
928
void Item_sum_distinct::fix_length_and_dec()
962
930
assert(args[0]->fixed);
964
null_value= maybe_null= true;
965
932
table_field_type= args[0]->field_type();
967
934
/* Adjust tmp table type according to the chosen aggregation type */
972
939
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;
943
Preserving int8, int16, int32 field types gives ~10% performance boost
944
as the size of result tree becomes significantly smaller.
945
Another speed up we gain by using int64_t for intermediate
946
calculations. The range of int64 is enough to hold sum 2^32 distinct
947
integers each <= 2^32.
949
if (table_field_type >= DRIZZLE_TYPE_TINY && table_field_type <= DRIZZLE_TYPE_LONG)
951
val.traits= Hybrid_type_traits_fast_decimal::instance();
954
table_field_type= DRIZZLE_TYPE_LONGLONG;
989
956
case DECIMAL_RESULT:
990
957
val.traits= Hybrid_type_traits_decimal::instance();
991
958
if (table_field_type != DRIZZLE_TYPE_LONGLONG)
992
table_field_type= DRIZZLE_TYPE_DECIMAL;
959
table_field_type= DRIZZLE_TYPE_NEWDECIMAL;
998
965
val.traits->fix_length_and_dec(this, args[0]);
1002
enum Item_result Item_sum_distinct::result_type () const
1004
return val.traits->type();
1010
971
check that the case of CHAR(0) works OK
1012
bool Item_sum_distinct::setup(Session *session)
973
bool Item_sum_distinct::setup(THD *thd)
1014
List<CreateField> field_list;
1015
CreateField field_def; /* field definition */
975
List<Create_field> field_list;
976
Create_field field_def; /* field definition */
1016
977
/* It's legal to call setup() more than once when in a subquery */
1031
992
assert(args[0]->fixed);
1033
994
field_def.init_for_tmp_table(table_field_type, args[0]->max_length,
1034
args[0]->decimals, args[0]->maybe_null);
995
args[0]->decimals, args[0]->maybe_null,
996
args[0]->unsigned_flag);
1036
if (! (table= session->getInstanceTable(field_list)))
998
if (! (table= create_virtual_tmp_table(thd, field_list)))
1039
1001
/* XXX: check that the case of CHAR(0) works OK */
1040
tree_key_length= table->getShare()->getRecordLength() - table->getShare()->null_bytes;
1002
tree_key_length= table->s->reclength - table->s->null_bytes;
1043
1005
Unique handles all unique elements in a tree until they can't fit
1045
1007
simple_raw_key_cmp because the table contains numbers only; decimals
1046
1008
are converted to binary representation as well.
1048
tree= new Unique(simple_raw_key_cmp, &tree_key_length,
1050
(size_t)session->variables.max_heap_table_size);
1010
tree= new Unique(simple_raw_key_cmp, &tree_key_length, tree_key_length,
1011
thd->variables.max_heap_table_size);
1052
1013
is_evaluated= false;
1053
1014
return(tree == 0);
1057
1018
bool Item_sum_distinct::add()
1059
args[0]->save_in_field(table->getField(0), false);
1020
args[0]->save_in_field(table->field[0], false);
1060
1021
is_evaluated= false;
1061
if (!table->getField(0)->is_null())
1022
if (!table->field[0]->is_null())
1066
1027
'0' values are also stored in the tree. This doesn't matter
1067
1028
for SUM(DISTINCT), but is important for AVG(DISTINCT)
1069
return tree->unique_add(table->getField(0)->ptr);
1030
return tree->unique_add(table->field[0]->ptr);
1075
1036
bool Item_sum_distinct::unique_walk_function(void *element)
1077
memcpy(table->getField(0)->ptr, element, tree_key_length);
1038
memcpy(table->field[0]->ptr, element, tree_key_length);
1079
val.traits->add(&val, table->getField(0));
1040
val.traits->add(&val, table->field[0]);
1165
1126
Item_sum_avg_distinct::fix_length_and_dec()
1167
1128
Item_sum_distinct::fix_length_and_dec();
1168
prec_increment= getSession().variables.div_precincrement;
1129
prec_increment= current_thd->variables.div_precincrement;
1170
1131
AVG() will divide val by count. We need to reserve digits
1171
1132
after decimal point as the result can be fractional.
1173
decimals= min(decimals + prec_increment, (unsigned int)NOT_FIXED_DEC);
1134
decimals= cmin(decimals + prec_increment, (unsigned int)NOT_FIXED_DEC);
1190
Item *Item_sum_count::copy_or_same(Session* session)
1151
Item *Item_sum_count::copy_or_same(THD* thd)
1192
return new (session->mem_root) Item_sum_count(session, this);
1153
return new (thd->mem_root) Item_sum_count(thd, this);
1229
1190
Item_sum_sum::fix_length_and_dec();
1230
1191
maybe_null=null_value=1;
1231
prec_increment= getSession().variables.div_precincrement;
1192
prec_increment= current_thd->variables.div_precincrement;
1233
1193
if (hybrid_type == DECIMAL_RESULT)
1235
1195
int precision= args[0]->decimal_precision() + prec_increment;
1236
decimals= min(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1237
max_length= class_decimal_precision_to_length(precision, decimals,
1196
decimals= cmin(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1197
max_length= my_decimal_precision_to_length(precision, decimals,
1238
1198
unsigned_flag);
1239
f_precision= min(precision+DECIMAL_LONGLONG_DIGITS, DECIMAL_MAX_PRECISION);
1199
f_precision= cmin(precision+DECIMAL_LONGLONG_DIGITS, DECIMAL_MAX_PRECISION);
1240
1200
f_scale= args[0]->decimals;
1241
dec_bin_size= class_decimal_get_binary_size(f_precision, f_scale);
1201
dec_bin_size= my_decimal_get_binary_size(f_precision, f_scale);
1244
decimals= min(args[0]->decimals + prec_increment, (unsigned int) NOT_FIXED_DEC);
1204
decimals= cmin(args[0]->decimals + prec_increment, (unsigned int) NOT_FIXED_DEC);
1245
1205
max_length= args[0]->max_length + prec_increment;
1250
Item *Item_sum_avg::copy_or_same(Session* session)
1210
Item *Item_sum_avg::copy_or_same(THD* thd)
1252
return new (session->mem_root) Item_sum_avg(session, this);
1212
return new (thd->mem_root) Item_sum_avg(thd, this);
1256
1216
Field *Item_sum_avg::create_tmp_field(bool group, Table *table,
1217
uint32_t convert_blob_len __attribute__((unused)))
1264
1224
The easiest way is to do this is to store both value in a string
1265
1225
and unpack on access.
1267
table->setVariableWidth();
1268
1227
field= new Field_varstring(((hybrid_type == DECIMAL_RESULT) ?
1269
1228
dec_bin_size : sizeof(double)) + sizeof(int64_t),
1270
0, name, &my_charset_bin);
1229
0, name, table->s, &my_charset_bin);
1272
1231
else if (hybrid_type == DECIMAL_RESULT)
1273
field= new Field_decimal(max_length, maybe_null, name,
1274
decimals, unsigned_flag);
1232
field= new Field_new_decimal(max_length, maybe_null, name,
1233
decimals, unsigned_flag);
1276
1235
field= new Field_double(max_length, maybe_null, name, decimals, true);
1311
int64_t Item_sum_avg::val_int()
1313
return (int64_t) rint(val_real());
1317
type::Decimal *Item_sum_avg::val_decimal(type::Decimal *val)
1319
type::Decimal sum_buff, cnt;
1320
const type::Decimal *sum_dec;
1270
my_decimal *Item_sum_avg::val_decimal(my_decimal *val)
1272
my_decimal sum_buff, cnt;
1273
const my_decimal *sum_dec;
1321
1274
assert(fixed == 1);
1333
1286
return val_decimal_from_real(val);
1335
1288
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);
1289
int2my_decimal(E_DEC_FATAL_ERROR, count, 0, &cnt);
1290
my_decimal_div(E_DEC_FATAL_ERROR, val, sum_dec, &cnt, prec_increment);
1359
1312
return sqrt(nr);
1362
Item *Item_sum_std::copy_or_same(Session* session)
1315
Item *Item_sum_std::copy_or_same(THD* thd)
1364
return new (session->mem_root) Item_sum_std(session, this);
1317
return new (thd->mem_root) Item_sum_std(thd, this);
1416
Item_sum_variance::Item_sum_variance(Session *session, Item_sum_variance *item):
1417
Item_sum_num(session, item), hybrid_type(item->hybrid_type),
1369
Item_sum_variance::Item_sum_variance(THD *thd, Item_sum_variance *item):
1370
Item_sum_num(thd, item), hybrid_type(item->hybrid_type),
1418
1371
count(item->count), sample(item->sample),
1419
1372
prec_increment(item->prec_increment)
1426
1379
void Item_sum_variance::fix_length_and_dec()
1428
1381
maybe_null= null_value= 1;
1429
prec_increment= getSession().variables.div_precincrement;
1382
prec_increment= current_thd->variables.div_precincrement;
1432
1385
According to the SQL2003 standard (Part 2, Foundations; sec 10.9,
1433
aggregate function; paragraph 7h of Syntax Rules), "the declared
1386
aggregate function; paragraph 7h of Syntax Rules), "the declared
1434
1387
type of the result is an implementation-defined aproximate numeric
1439
1392
switch (args[0]->result_type()) {
1440
1393
case REAL_RESULT:
1441
1394
case STRING_RESULT:
1442
decimals= min(args[0]->decimals + 4, (int)NOT_FIXED_DEC);
1395
decimals= cmin(args[0]->decimals + 4, NOT_FIXED_DEC);
1444
1397
case INT_RESULT:
1445
1398
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,
1400
int precision= args[0]->decimal_precision()*2 + prec_increment;
1401
decimals= cmin(args[0]->decimals + prec_increment, (unsigned int) DECIMAL_MAX_SCALE);
1402
max_length= my_decimal_precision_to_length(precision, decimals,
1454
1407
case ROW_RESULT:
1460
Item *Item_sum_variance::copy_or_same(Session* session)
1415
Item *Item_sum_variance::copy_or_same(THD* thd)
1462
return new (session->mem_root) Item_sum_variance(session, this);
1417
return new (thd->mem_root) Item_sum_variance(thd, this);
1479
1434
The easiest way is to do this is to store both value in a string
1480
1435
and unpack on access.
1482
table->setVariableWidth();
1483
field= new Field_varstring(sizeof(double)*2 + sizeof(int64_t), 0, name, &my_charset_bin);
1437
field= new Field_varstring(sizeof(double)*2 + sizeof(int64_t), 0, name, table->s, &my_charset_bin);
1486
1440
field= new Field_double(max_length, maybe_null, name, decimals, true);
1495
1449
void Item_sum_variance::clear()
1500
1454
bool Item_sum_variance::add()
1503
1457
Why use a temporary variable? We don't know if it is null until we
1504
1458
evaluate it, which has the side-effect of setting null_value .
1506
1460
double nr= args[0]->val_real();
1508
1462
if (!args[0]->null_value)
1509
1463
variance_fp_recurrence_next(&recurrence_m, &recurrence_s, &count, nr);
1538
int64_t Item_sum_variance::val_int()
1540
/* can't be fix_fields()ed */
1541
return (int64_t) rint(val_real());
1545
type::Decimal *Item_sum_variance::val_decimal(type::Decimal *dec_buf)
1492
my_decimal *Item_sum_variance::val_decimal(my_decimal *dec_buf)
1547
1494
assert(fixed == 1);
1548
1495
return val_decimal_from_real(dec_buf);
1622
1569
assert(fixed == 1);
1623
1570
if (null_value)
1626
1572
switch (hybrid_type) {
1627
1573
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);
1577
String *res; res=val_str(&str_value);
1578
return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
1579
&end_not_used, &err_not_used) : 0.0);
1635
1581
case INT_RESULT:
1583
return uint64_t2double(sum_int);
1636
1584
return (double) sum_int;
1637
1585
case DECIMAL_RESULT:
1638
class_decimal2double(E_DEC_FATAL_ERROR, &sum_dec, &sum);
1586
my_decimal2double(E_DEC_FATAL_ERROR, &sum_dec, &sum);
1640
1588
case REAL_RESULT:
1642
1590
case ROW_RESULT:
1643
1592
// This case should never be choosen
1651
1598
int64_t Item_sum_hybrid::val_int()
1671
type::Decimal *Item_sum_hybrid::val_decimal(type::Decimal *val)
1618
my_decimal *Item_sum_hybrid::val_decimal(my_decimal *val)
1673
1620
assert(fixed == 1);
1674
1621
if (null_value)
1677
1623
switch (hybrid_type) {
1678
1624
case STRING_RESULT:
1679
val->store(E_DEC_FATAL_ERROR, &value);
1625
string2my_decimal(E_DEC_FATAL_ERROR, &value, val);
1681
1627
case REAL_RESULT:
1682
double2_class_decimal(E_DEC_FATAL_ERROR, sum, val);
1628
double2my_decimal(E_DEC_FATAL_ERROR, sum, val);
1684
1630
case DECIMAL_RESULT:
1687
1633
case INT_RESULT:
1688
int2_class_decimal(E_DEC_FATAL_ERROR, sum_int, unsigned_flag, val);
1634
int2my_decimal(E_DEC_FATAL_ERROR, sum_int, unsigned_flag, val);
1690
1636
case ROW_RESULT:
1691
1638
// This case should never be choosen
1696
1642
return val; // Keep compiler happy
1711
1656
str->set_real(sum,decimals, &my_charset_bin);
1713
1658
case DECIMAL_RESULT:
1714
class_decimal2string(&sum_dec, 0, str);
1659
my_decimal2string(E_DEC_FATAL_ERROR, &sum_dec, 0, 0, 0, str);
1716
1661
case INT_RESULT:
1717
1662
str->set_int(sum_int, unsigned_flag, &my_charset_bin);
1752
Item *Item_sum_min::copy_or_same(Session* session)
1697
Item *Item_sum_min::copy_or_same(THD* thd)
1754
return new (session->mem_root) Item_sum_min(session, this);
1699
return new (thd->mem_root) Item_sum_min(thd, this);
1760
1705
switch (hybrid_type) {
1761
1706
case STRING_RESULT:
1708
String *result=args[0]->val_str(&tmp_value);
1709
if (!args[0]->null_value &&
1710
(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);
1712
value.copy(*result);
1772
1717
case INT_RESULT:
1719
int64_t nr=args[0]->val_int();
1720
if (!args[0]->null_value && (null_value ||
1722
(uint64_t) nr < (uint64_t) sum_int) ||
1723
(!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
1730
case DECIMAL_RESULT:
1732
my_decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1733
if (!args[0]->null_value &&
1734
(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);
1736
my_decimal2decimal(val, &sum_dec);
1796
1741
case REAL_RESULT:
1743
double nr= args[0]->val_real();
1744
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
1751
case ROW_RESULT:
1807
1753
// This case should never be choosen
1815
Item *Item_sum_max::copy_or_same(Session* session)
1761
Item *Item_sum_max::copy_or_same(THD* thd)
1817
return new (session->mem_root) Item_sum_max(session, this);
1763
return new (thd->mem_root) Item_sum_max(thd, this);
1823
1769
switch (hybrid_type) {
1824
1770
case STRING_RESULT:
1772
String *result=args[0]->val_str(&tmp_value);
1773
if (!args[0]->null_value &&
1774
(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);
1776
value.copy(*result);
1835
1781
case INT_RESULT:
1783
int64_t nr=args[0]->val_int();
1784
if (!args[0]->null_value && (null_value ||
1786
(uint64_t) nr > (uint64_t) sum_int) ||
1787
(!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
1794
case DECIMAL_RESULT:
1796
my_decimal value_buff, *val= args[0]->val_decimal(&value_buff);
1797
if (!args[0]->null_value &&
1798
(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);
1800
my_decimal2decimal(val, &sum_dec);
1859
1805
case REAL_RESULT:
1807
double nr= args[0]->val_real();
1808
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
1815
case ROW_RESULT:
1870
1817
// This case should never be choosen
1890
1836
bits= reset_bits;
1893
Item *Item_sum_or::copy_or_same(Session* session)
1839
Item *Item_sum_or::copy_or_same(THD* thd)
1895
return new (session->mem_root) Item_sum_or(session, this);
1841
return new (thd->mem_root) Item_sum_or(thd, this);
1907
Item *Item_sum_xor::copy_or_same(Session* session)
1853
Item *Item_sum_xor::copy_or_same(THD* thd)
1909
return new (session->mem_root) Item_sum_xor(session, this);
1855
return new (thd->mem_root) Item_sum_xor(thd, this);
1921
Item *Item_sum_and::copy_or_same(Session* session)
1867
Item *Item_sum_and::copy_or_same(THD* thd)
1923
return new (session->mem_root) Item_sum_and(session, this);
1869
return new (thd->mem_root) Item_sum_and(thd, this);
1960
1906
switch(hybrid_type) {
1961
1907
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)
1909
char buff[MAX_FIELD_WIDTH];
1910
String tmp(buff,sizeof(buff),result_field->charset()),*res;
1912
res=args[0]->val_str(&tmp);
1913
if (args[0]->null_value)
1915
result_field->set_null();
1916
result_field->reset();
1920
result_field->set_notnull();
1921
result_field->store(res->ptr(),res->length(),tmp.charset());
1927
int64_t nr=args[0]->val_int();
1931
if (args[0]->null_value)
1934
result_field->set_null();
1937
result_field->set_notnull();
1939
result_field->store(nr, unsigned_flag);
1944
double nr= args[0]->val_real();
1948
if (args[0]->null_value)
1951
result_field->set_null();
1954
result_field->set_notnull();
1956
result_field->store(nr);
1959
case DECIMAL_RESULT:
1961
my_decimal value_buff, *arg_dec= args[0]->val_decimal(&value_buff);
1965
if (args[0]->null_value)
1969
1966
result_field->set_null();
1970
result_field->reset();
1974
1968
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);
1971
We must store zero in the field as we will use the field value in
1974
if (!arg_dec) // Null
1975
arg_dec= &decimal_zero;
1976
result_field->store_decimal(arg_dec);
2033
1979
case ROW_RESULT:
2041
1988
if (hybrid_type == DECIMAL_RESULT)
2043
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
1990
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2044
1991
if (!arg_val) // Null
2045
1992
arg_val= &decimal_zero;
2046
1993
result_field->store_decimal(arg_val);
2086
arg_dec->val_binary(E_DEC_FATAL_ERROR, res, f_precision, f_scale);
2033
my_decimal2binary(E_DEC_FATAL_ERROR, arg_dec, res, f_precision, f_scale);
2087
2034
res+= dec_bin_size;
2088
2035
int8store(res, tmp);
2128
2075
if (hybrid_type == DECIMAL_RESULT)
2130
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2077
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2131
2078
if (!args[0]->null_value)
2133
2080
if (!result_field->is_null())
2135
type::Decimal field_value,
2082
my_decimal field_value,
2136
2083
*field_val= result_field->val_decimal(&field_value);
2137
class_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, field_val);
2084
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, field_val);
2138
2085
result_field->store_decimal(dec_buffs);
2179
2126
unsigned char *res=result_field->ptr;
2180
2127
if (hybrid_type == DECIMAL_RESULT)
2182
type::Decimal value, *arg_val= args[0]->val_decimal(&value);
2129
my_decimal value, *arg_val= args[0]->val_decimal(&value);
2183
2130
if (!args[0]->null_value)
2185
binary2_class_decimal(E_DEC_FATAL_ERROR, res,
2132
binary2my_decimal(E_DEC_FATAL_ERROR, res,
2186
2133
dec_buffs + 1, f_precision, f_scale);
2187
2134
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);
2135
my_decimal_add(E_DEC_FATAL_ERROR, dec_buffs, arg_val, dec_buffs + 1);
2136
my_decimal2binary(E_DEC_FATAL_ERROR, dec_buffs,
2137
res, f_precision, f_scale);
2190
2138
res+= dec_bin_size;
2192
2140
int8store(res, field_count);
2239
2186
if (!args[0]->null_value)
2241
result_field->val_str_internal(&tmp_value);
2188
result_field->val_str(&tmp_value);
2243
2190
if (result_field->is_null() ||
2244
2191
(cmp_sign * sortcmp(res_str,&tmp_value,collation.collation)) < 0)
2304
2251
Item_sum_hybrid::min_max_update_decimal_field()
2306
2253
/* 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);
2254
my_decimal old_val, nr_val;
2255
const my_decimal *old_nr= result_field->val_decimal(&old_val);
2256
const my_decimal *nr= args[0]->val_decimal(&nr_val);
2310
2257
if (!args[0]->null_value)
2312
2259
if (result_field->is_null(0))
2316
bool res= class_decimal_cmp(old_nr, nr) > 0;
2263
bool res= my_decimal_cmp(old_nr, nr) > 0;
2317
2264
/* (cmp_sign > 0 && res) || (!(cmp_sign > 0) && !res) */
2318
2265
if ((cmp_sign > 0) ^ (!res))
2380
2327
if ((null_value= !count))
2383
type::Decimal dec_count, dec_field;
2384
binary2_class_decimal(E_DEC_FATAL_ERROR,
2330
my_decimal dec_count, dec_field;
2331
binary2my_decimal(E_DEC_FATAL_ERROR,
2385
2332
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,
2333
int2my_decimal(E_DEC_FATAL_ERROR, count, 0, &dec_count);
2334
my_decimal_div(E_DEC_FATAL_ERROR, dec_buf,
2388
2335
&dec_field, &dec_count, prec_increment);
2389
2336
return dec_buf;
2418
type::Decimal *Item_std_field::val_decimal(type::Decimal *dec_buf)
2365
my_decimal *Item_std_field::val_decimal(my_decimal *dec_buf)
2421
2368
We can't call val_decimal_from_real() for DECIMAL_RESULT as
2422
2369
Item_variance_field::val_real() would cause an infinite loop
2424
type::Decimal tmp_dec, *dec;
2371
my_decimal tmp_dec, *dec;
2426
2373
if (hybrid_type == REAL_RESULT)
2427
2374
return val_decimal_from_real(dec_buf);
2429
2376
dec= Item_variance_field::val_decimal(dec_buf);
2432
class_decimal2double(E_DEC_FATAL_ERROR, dec, &nr);
2379
my_decimal2double(E_DEC_FATAL_ERROR, dec, &nr);
2433
2380
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);
2382
double2my_decimal(E_DEC_FATAL_ERROR, nr, &tmp_dec);
2383
my_decimal_round(E_DEC_FATAL_ERROR, &tmp_dec, decimals, false, dec_buf);
2437
2384
return dec_buf;
2463
int64_t Item_variance_field::val_int()
2465
/* can't be fix_fields()ed */
2466
return (int64_t) rint(val_real());
2470
2410
double Item_variance_field::val_real()
2472
2412
// fix_fields() never calls for this Item
2505
2445
int composite_key_cmp(void* arg, unsigned char* key1, unsigned char* key2)
2507
2447
Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg;
2508
Field **field = item->table->getFields();
2509
Field **field_end= field + item->table->getShare()->sizeFields();
2448
Field **field = item->table->field;
2449
Field **field_end= field + item->table->s->fields;
2510
2450
uint32_t *lengths=item->field_lengths;
2511
2451
for (; field < field_end; ++field)
2524
static int count_distinct_walk(void *,
2468
static int count_distinct_walk(void *elem __attribute__((unused)),
2469
element_count count __attribute__((unused)),
2528
2472
(*((uint64_t*)arg))++;
2532
2482
void Item_sum_count_distinct::cleanup()
2534
2484
Item_sum_int::cleanup();
2582
bool Item_sum_count_distinct::setup(Session *session)
2533
bool Item_sum_count_distinct::setup(THD *thd)
2584
2535
List<Item> list;
2585
Select_Lex *select_lex= session->lex->current_select;
2536
SELECT_LEX *select_lex= thd->lex->current_select;
2588
2539
Setup can be called twice for ROLLUP items. This is a bug.
2610
2561
tmp_table_param->force_copy_fields= force_copy_fields;
2611
2562
assert(table == 0);
2613
if (!(table= create_tmp_table(session, tmp_table_param, list, (Order*) 0, 1,
2564
if (!(table= create_tmp_table(thd, tmp_table_param, list, (order_st*) 0, 1,
2615
(select_lex->options | session->options),
2566
(select_lex->options | thd->options),
2616
2567
HA_POS_ERROR, (char*)"")))
2620
table->cursor->extra(HA_EXTRA_NO_ROWS); // Don't update rows
2569
table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows
2621
2570
table->no_rows=1;
2623
if (table->getShare()->db_type() == heap_engine)
2572
if (table->s->db_type() == heap_hton)
2626
2575
No blobs, otherwise it would have been MyISAM: set up a compare
2629
2578
qsort_cmp2 compare_key;
2631
Field **field= table->getFields();
2632
Field **field_end= field + table->getShare()->sizeFields();
2580
Field **field= table->field;
2581
Field **field_end= field + table->s->fields;
2633
2582
bool all_binary= true;
2635
2584
for (tree_key_length= 0; field < field_end; ++field)
2667
2616
uint32_t *length;
2668
2617
compare_key= (qsort_cmp2) composite_key_cmp;
2669
2618
cmp_arg= (void*) this;
2670
field_lengths= (uint32_t*) session->getMemRoot()->allocate(table->getShare()->sizeFields() * sizeof(uint32_t));
2671
for (tree_key_length= 0, length= field_lengths, field= table->getFields();
2619
field_lengths= (uint32_t*) thd->alloc(table->s->fields * sizeof(uint32_t));
2620
for (tree_key_length= 0, length= field_lengths, field= table->field;
2672
2621
field < field_end; ++field, ++length)
2674
2623
*length= (*field)->pack_length();
2679
2628
assert(tree == 0);
2680
2629
tree= new Unique(compare_key, cmp_arg, tree_key_length,
2681
(size_t)session->variables.max_heap_table_size);
2630
thd->variables.max_heap_table_size);
2683
2632
The only time tree_key_length could be 0 is if someone does
2684
2633
count(distinct) on a char(0) field - stupid thing to do,
2696
Item *Item_sum_count_distinct::copy_or_same(Session* session)
2645
Item *Item_sum_count_distinct::copy_or_same(THD* thd)
2698
return new (session->mem_root) Item_sum_count_distinct(session, this);
2647
return new (thd->mem_root) Item_sum_count_distinct(thd, this);
2710
2659
else if (table)
2712
table->cursor->extra(HA_EXTRA_NO_CACHE);
2713
table->cursor->ha_delete_all_rows();
2714
table->cursor->extra(HA_EXTRA_WRITE_CACHE);
2661
table->file->extra(HA_EXTRA_NO_CACHE);
2662
table->file->ha_delete_all_rows();
2663
table->file->extra(HA_EXTRA_WRITE_CACHE);
2721
2670
if (always_null)
2723
2672
copy_fields(tmp_table_param);
2724
if (copy_funcs(tmp_table_param->items_to_copy, table->in_use))
2673
copy_funcs(tmp_table_param->items_to_copy);
2727
for (Field **field= table->getFields() ; *field ; field++)
2675
for (Field **field=table->field ; *field ; field++)
2729
2676
if ((*field)->is_real_null(0))
2731
2677
return 0; // Don't count NULL
2735
2679
is_evaluated= false;
2741
2685
bloat the tree without providing any valuable info. Besides,
2742
2686
key_length used to initialize the tree didn't include space for them.
2744
return tree->unique_add(table->record[0] + table->getShare()->null_bytes);
2688
return tree->unique_add(table->record[0] + table->s->null_bytes);
2746
if ((error= table->cursor->insertRecord(table->record[0])) &&
2747
table->cursor->is_fatal_error(error, HA_CHECK_DUP))
2690
if ((error= table->file->ha_write_row(table->record[0])) &&
2691
table->file->is_fatal_error(error, HA_CHECK_DUP))
2769
2713
return (int64_t) count;
2772
error= table->cursor->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
2716
error= table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
2776
table->print_error(error, MYF(0));
2720
table->file->print_error(error, MYF(0));
2779
return table->cursor->stats.records;
2723
return table->file->stats.records;
2782
2726
/*****************************************************************************
2793
2737
*****************************************************************************/
2797
2741
Compares the values for fields in expr list of GROUP_CONCAT.
2800
2744
GROUP_CONCAT([DISTINCT] expr [,expr ...]
2801
2745
[order_st BY {unsigned_integer | col_name | expr}
2802
2746
[ASC | DESC] [,col_name ...]]
2803
2747
[SEPARATOR str_val])
2806
@retval -1 : key1 < key2
2750
@retval -1 : key1 < key2
2807
2751
@retval 0 : key1 = key2
2808
@retval 1 : key1 > key2
2752
@retval 1 : key1 > key2
2811
int group_concat_key_cmp_with_distinct(void* arg, const void* key1,
2755
int group_concat_key_cmp_with_distinct(void* arg, const void* key1,
2812
2756
const void* key2)
2814
2758
Item_func_group_concat *item_func= (Item_func_group_concat*)arg;
2817
2761
for (uint32_t i= 0; i < item_func->arg_count_field; i++)
2819
2763
Item *item= item_func->args[i];
2821
2765
If field_item is a const item then either get_tp_table_field returns 0
2822
or it is an item over a const table.
2766
or it is an item over a const table.
2824
2768
if (item->const_item())
2831
2775
Field *field= item->get_tmp_table_field();
2833
uint32_t offset= field->offset(field->getTable()->record[0])-table->getShare()->null_bytes;
2777
uint32_t offset= field->offset(field->table->record[0])-table->s->null_bytes;
2834
2778
if((res= field->cmp((unsigned char*)key1 + offset, (unsigned char*)key2 + offset)))
2842
function of sort for syntax: GROUP_CONCAT(expr,... ORDER BY col,... )
2786
function of sort for syntax: GROUP_CONCAT(expr,... order_st BY col,... )
2845
int group_concat_key_cmp_with_order(void* arg, const void* key1,
2789
int group_concat_key_cmp_with_order(void* arg, const void* key1,
2846
2790
const void* key2)
2848
2792
Item_func_group_concat* grp_item= (Item_func_group_concat*) arg;
2849
Order **order_item, **end;
2793
order_st **order_item, **end;
2850
2794
Table *table= grp_item->table;
2852
2796
for (order_item= grp_item->order, end=order_item+ grp_item->arg_count_order;
2860
2804
the temporary table, not the original field
2862
2806
Field *field= item->get_tmp_table_field();
2864
2808
If item is a const item then either get_tp_table_field returns 0
2865
or it is an item over a const table.
2809
or it is an item over a const table.
2867
2811
if (field && !item->const_item())
2870
uint32_t offset= (field->offset(field->getTable()->record[0]) -
2871
table->getShare()->null_bytes);
2814
uint32_t offset= (field->offset(field->table->record[0]) -
2815
table->s->null_bytes);
2872
2816
if ((res= field->cmp((unsigned char*)key1 + offset, (unsigned char*)key2 + offset)))
2873
2817
return (*order_item)->asc ? res : -res;
2886
2830
Append data from current leaf to item->result.
2889
int dump_leaf_key(unsigned char* key, uint32_t ,
2833
int dump_leaf_key(unsigned char* key, element_count count __attribute__((unused)),
2890
2834
Item_func_group_concat *item)
2892
2836
Table *table= item->table;
2893
String tmp((char *)table->getUpdateRecord(), table->getShare()->getRecordLength(),
2837
String tmp((char *)table->record[1], table->s->reclength,
2894
2838
default_charset_info);
2896
2840
String *result= &item->result;
2917
2861
because it contains both order and arg list fields.
2919
2863
Field *field= (*arg)->get_tmp_table_field();
2920
uint32_t offset= (field->offset(field->getTable()->record[0]) -
2921
table->getShare()->null_bytes);
2922
assert(offset < table->getShare()->getRecordLength());
2923
res= field->val_str_internal(&tmp, key + offset);
2864
uint32_t offset= (field->offset(field->table->record[0]) -
2865
table->s->null_bytes);
2866
assert(offset < table->s->reclength);
2867
res= field->val_str(&tmp, key + offset);
2926
2870
res= (*arg)->val_str(&tmp);
2968
2912
bool distinct_arg, List<Item> *select_list,
2969
2913
SQL_LIST *order_list, String *separator_arg)
2970
2914
:tmp_table_param(0), warning(0),
2971
separator(separator_arg), tree(NULL), unique_filter(NULL), table(0),
2915
separator(separator_arg), tree(0), unique_filter(NULL), table(0),
2972
2916
order(0), context(context_arg),
2973
2917
arg_count_order(order_list ? order_list->elements : 0),
2974
2918
arg_count_field(select_list->elements),
2989
2933
(for possible order items in temporare tables)
2990
2934
order - arg_count_order
2992
if (!(args= (Item**) memory::sql_alloc(sizeof(Item*) * arg_count +
2993
sizeof(Order*)*arg_count_order)))
2936
if (!(args= (Item**) sql_alloc(sizeof(Item*) * arg_count +
2937
sizeof(order_st*)*arg_count_order)))
2996
order= (Order**)(args + arg_count);
2940
order= (order_st**)(args + arg_count);
2998
2942
/* fill args items of show and sort */
2999
2943
List_iterator_fast<Item> li(*select_list);
3004
2948
if (arg_count_order)
3006
Order **order_ptr= order;
3007
for (Order *order_item= (Order*) order_list->first;
2950
order_st **order_ptr= order;
2951
for (order_st *order_item= (order_st*) order_list->first;
3008
2952
order_item != NULL;
3009
2953
order_item= order_item->next)
3019
Item_func_group_concat::Item_func_group_concat(Session *session,
2963
Item_func_group_concat::Item_func_group_concat(THD *thd,
3020
2964
Item_func_group_concat *item)
3021
:Item_sum(session, item),
2965
:Item_sum(thd, item),
3022
2966
tmp_table_param(item->tmp_table_param),
3023
2967
warning(item->warning),
3024
2968
separator(item->separator),
3052
2996
char warn_buff[DRIZZLE_ERRMSG_SIZE];
3053
snprintf(warn_buff, sizeof(warn_buff), ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
3054
warning->set_msg(&getSession(), warn_buff);
2997
sprintf(warn_buff, ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
2998
warning->set_msg(current_thd, warn_buff);
3082
3027
char warn_buff[DRIZZLE_ERRMSG_SIZE];
3083
snprintf(warn_buff, sizeof(warn_buff), ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
3084
warning->set_msg(session, warn_buff);
3028
sprintf(warn_buff, ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
3029
warning->set_msg(thd, warn_buff);
3094
Item *Item_func_group_concat::copy_or_same(Session* session)
3039
Item *Item_func_group_concat::copy_or_same(THD* thd)
3096
return new (session->mem_root) Item_func_group_concat(session, this);
3041
return new (thd->mem_root) Item_func_group_concat(thd, this);
3134
3078
null_value= false;
3135
3079
bool row_eligible= true;
3139
3083
/* Filter out duplicate rows. */
3140
3084
uint32_t count= unique_filter->elements_in_tree();
3141
unique_filter->unique_add(table->record[0] + table->getShare()->null_bytes);
3085
unique_filter->unique_add(table->record[0] + table->s->null_bytes);
3142
3086
if (count == unique_filter->elements_in_tree())
3143
3087
row_eligible= false;
3146
3090
TREE_ELEMENT *el= 0; // Only for safety
3147
3091
if (row_eligible && tree)
3148
el= tree_insert(tree, table->record[0] + table->getShare()->null_bytes, 0,
3092
el= tree_insert(tree, table->record[0] + table->s->null_bytes, 0,
3149
3093
tree->custom_arg);
3151
3095
If the row is not a duplicate (el->count == 1)
3155
3099
if (row_eligible && !warning_for_row &&
3156
3100
(!tree || (el->count == 1 && distinct && !arg_count_order)))
3157
dump_leaf_key(table->record[0] + table->getShare()->null_bytes, 1, this);
3101
dump_leaf_key(table->record[0] + table->s->null_bytes, 1, this);
3164
Item_func_group_concat::fix_fields(Session *session, Item **ref)
3108
Item_func_group_concat::fix_fields(THD *thd, Item **ref)
3166
3110
uint32_t i; /* for loop variable */
3167
3111
assert(fixed == 0);
3169
if (init_sum_func_check(session))
3113
if (init_sum_func_check(thd))
3193
3137
result.set_charset(collation.collation);
3194
3138
result_field= 0;
3196
max_length= (size_t)session->variables.group_concat_max_len;
3198
if (check_sum_func(session, ref))
3140
max_length= thd->variables.group_concat_max_len;
3143
if (separator->needs_conversion(separator->length(), separator->charset(),
3144
collation.collation, &offset))
3146
uint32_t buflen= collation.collation->mbmaxlen * separator->length();
3147
uint32_t errors, conv_length;
3149
String *new_separator;
3151
if (!(buf= (char*) thd->alloc(buflen)) ||
3152
!(new_separator= new(thd->mem_root)
3153
String(buf, buflen, collation.collation)))
3156
conv_length= copy_and_convert(buf, buflen, collation.collation,
3157
separator->ptr(), separator->length(),
3158
separator->charset(), &errors);
3159
new_separator->length(conv_length);
3160
separator= new_separator;
3163
if (check_sum_func(thd, ref))
3206
bool Item_func_group_concat::setup(Session *session)
3171
bool Item_func_group_concat::setup(THD *thd)
3208
3173
List<Item> list;
3209
Select_Lex *select_lex= session->lex->current_select;
3174
SELECT_LEX *select_lex= thd->lex->current_select;
3212
3177
Currently setup() can be called twice. Please add
3246
3211
tmp table columns.
3248
3213
if (arg_count_order &&
3249
setup_order(session, args, context->table_list, list, all_fields, *order))
3214
setup_order(thd, args, context->table_list, list, all_fields, *order))
3252
3217
count_field_types(select_lex, tmp_table_param, all_fields, 0);
3258
3223
Currently we have to force conversion of BLOB values to VARCHAR's
3259
if we are to store them in TREE objects used for ORDER BY and
3224
if we are to store them in TREE objects used for order_st BY and
3260
3225
DISTINCT. This leads to truncation if the BLOB's size exceeds
3261
3226
Field_varstring::MAX_SIZE.
3263
set_if_smaller(tmp_table_param->convert_blob_length,
3228
set_if_smaller(tmp_table_param->convert_blob_length,
3264
3229
Field_varstring::MAX_SIZE);
3268
3233
We have to create a temporary table to get descriptions of fields
3269
3234
(types, sizes and so on).
3271
Note that in the table, we first have the ORDER BY fields, then the
3236
Note that in the table, we first have the order_st BY fields, then the
3274
if (!(table= create_tmp_table(session, tmp_table_param, all_fields,
3275
(Order*) 0, 0, true,
3276
(select_lex->options | session->options),
3239
if (!(table= create_tmp_table(thd, tmp_table_param, all_fields,
3240
(order_st*) 0, 0, true,
3241
(select_lex->options | thd->options),
3277
3242
HA_POS_ERROR, (char*) "")))
3282
table->cursor->extra(HA_EXTRA_NO_ROWS);
3244
table->file->extra(HA_EXTRA_NO_ROWS);
3283
3245
table->no_rows= 1;
3287
3249
Don't reserve space for NULLs: if any of gconcat arguments is NULL,
3288
3250
the row is not added to the result.
3290
uint32_t tree_key_length= table->getShare()->getRecordLength() - table->getShare()->null_bytes;
3252
uint32_t tree_key_length= table->s->reclength - table->s->null_bytes;
3292
3254
if (arg_count_order)
3294
3256
tree= &tree_base;
3296
3258
Create a tree for sorting. The tree is used to sort (according to the
3297
syntax of this function). If there is no ORDER BY clause, we don't
3259
syntax of this function). If there is no order_st BY clause, we don't
3298
3260
create this tree.
3300
init_tree(tree, (uint32_t) min(session->variables.max_heap_table_size,
3301
(uint64_t)(session->variables.sortbuff_size/16)),
3304
group_concat_key_cmp_with_order , false, NULL, (void*) this);
3262
init_tree(tree, (uint) cmin(thd->variables.max_heap_table_size,
3263
thd->variables.sortbuff_size/16), 0,
3265
group_concat_key_cmp_with_order , 0, NULL, (void*) this);
3308
3269
unique_filter= new Unique(group_concat_key_cmp_with_distinct,
3310
3271
tree_key_length,
3311
(size_t)session->variables.max_heap_table_size);
3272
thd->variables.max_heap_table_size);
3328
double Item_func_group_concat::val_real()
3330
String *res; res=val_str(&str_value);
3331
return res ? internal::my_atof(res->c_ptr()) : 0.0;
3334
int64_t Item_func_group_concat::val_int()
3339
if (!(res= val_str(&str_value)))
3341
end_ptr= (char*) res->ptr()+ res->length();
3342
return internal::my_strtoll10(res->ptr(), &end_ptr, &error);
3345
String* Item_func_group_concat::val_str(String* )
3290
String* Item_func_group_concat::val_str(String* str __attribute__((unused)))
3347
3292
assert(fixed == 1);
3348
3293
if (null_value)