1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Merge bk-internal.mysql.com:/home/bk/mysql-4.1

into mashka.mysql.fi:/home/my/mysql-tmp


sql/item.cc:
  Auto merged
sql/item_sum.cc:
  Auto merged
sql/item_sum.h:
  Auto merged
sql/sql_load.cc:
  Auto merged
sql/sql_parse.cc:
  Auto merged
This commit is contained in:
unknown
2003-09-07 15:14:32 +03:00
194 changed files with 3950 additions and 3232 deletions

View File

@ -70,6 +70,8 @@ void Item_sum::make_field(Send_field *tmp_field)
tmp_field->db_name=(char*)"";
tmp_field->org_table_name=tmp_field->table_name=(char*)"";
tmp_field->org_col_name=tmp_field->col_name=name;
if (maybe_null)
tmp_field->flags&= ~NOT_NULL_FLAG;
}
else
init_make_field(tmp_field, field_type());
@ -197,7 +199,8 @@ Item_sum_hybrid::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
max_length=item->max_length;
}
decimals=item->decimals;
maybe_null=item->maybe_null;
/* MIN/MAX can return NULL for empty set indepedent of the used column */
maybe_null= 1;
unsigned_flag=item->unsigned_flag;
collation.set(item->collation);
result_field=0;
@ -388,15 +391,15 @@ void Item_sum_variance::reset_field()
}
}
void Item_sum_variance::update_field(int offset)
void Item_sum_variance::update_field()
{
double nr,old_nr,old_sqr;
longlong field_count;
char *res=result_field->ptr;
float8get(old_nr,res+offset);
float8get(old_sqr,res+offset+sizeof(double));
field_count=sint8korr(res+offset+sizeof(double)*2);
float8get(old_nr, res);
float8get(old_sqr, res+sizeof(double));
field_count=sint8korr(res+sizeof(double)*2);
nr=args[0]->val();
if (!args[0]->null_value)
@ -753,12 +756,12 @@ void Item_sum_bit::reset_field()
** calc next value and merge it with field_value
*/
void Item_sum_sum::update_field(int offset)
void Item_sum_sum::update_field()
{
double old_nr,nr;
char *res=result_field->ptr;
float8get(old_nr,res+offset);
float8get(old_nr,res);
nr=args[0]->val();
if (!args[0]->null_value)
{
@ -769,12 +772,12 @@ void Item_sum_sum::update_field(int offset)
}
void Item_sum_count::update_field(int offset)
void Item_sum_count::update_field()
{
longlong nr;
char *res=result_field->ptr;
nr=sint8korr(res+offset);
nr=sint8korr(res);
if (!args[0]->maybe_null)
nr++;
else
@ -787,14 +790,14 @@ void Item_sum_count::update_field(int offset)
}
void Item_sum_avg::update_field(int offset)
void Item_sum_avg::update_field()
{
double nr,old_nr;
longlong field_count;
char *res=result_field->ptr;
float8get(old_nr,res+offset);
field_count=sint8korr(res+offset+sizeof(double));
float8get(old_nr,res);
field_count=sint8korr(res+sizeof(double));
nr=args[0]->val();
if (!args[0]->null_value)
@ -807,77 +810,65 @@ void Item_sum_avg::update_field(int offset)
int8store(res,field_count);
}
void Item_sum_hybrid::update_field(int offset)
void Item_sum_hybrid::update_field()
{
if (hybrid_type == STRING_RESULT)
min_max_update_str_field(offset);
min_max_update_str_field();
else if (hybrid_type == INT_RESULT)
min_max_update_int_field(offset);
min_max_update_int_field();
else
min_max_update_real_field(offset);
min_max_update_real_field();
}
void
Item_sum_hybrid::min_max_update_str_field(int offset)
Item_sum_hybrid::min_max_update_str_field()
{
String *res_str=args[0]->val_str(&value);
if (args[0]->null_value)
result_field->copy_from_tmp(offset); // Use old value
else
if (!args[0]->null_value)
{
res_str->strip_sp();
result_field->ptr+=offset; // Get old max/min
result_field->val_str(&tmp_value,&tmp_value);
result_field->ptr-=offset;
if (result_field->is_null() ||
(cmp_sign * sortcmp(res_str,&tmp_value,cmp_charset)) < 0)
result_field->store(res_str->ptr(),res_str->length(),res_str->charset());
else
{ // Use old value
char *res=result_field->ptr;
memcpy(res,res+offset,result_field->pack_length());
}
result_field->set_notnull();
}
}
void
Item_sum_hybrid::min_max_update_real_field(int offset)
Item_sum_hybrid::min_max_update_real_field()
{
double nr,old_nr;
result_field->ptr+=offset;
old_nr=result_field->val_real();
nr=args[0]->val();
if (!args[0]->null_value)
{
if (result_field->is_null(offset) ||
if (result_field->is_null(0) ||
(cmp_sign > 0 ? old_nr > nr : old_nr < nr))
old_nr=nr;
result_field->set_notnull();
}
else if (result_field->is_null(offset))
else if (result_field->is_null(0))
result_field->set_null();
result_field->ptr-=offset;
result_field->store(old_nr);
}
void
Item_sum_hybrid::min_max_update_int_field(int offset)
Item_sum_hybrid::min_max_update_int_field()
{
longlong nr,old_nr;
result_field->ptr+=offset;
old_nr=result_field->val_int();
nr=args[0]->val_int();
if (!args[0]->null_value)
{
if (result_field->is_null(offset))
if (result_field->is_null(0))
old_nr=nr;
else
{
@ -890,30 +881,29 @@ Item_sum_hybrid::min_max_update_int_field(int offset)
}
result_field->set_notnull();
}
else if (result_field->is_null(offset))
else if (result_field->is_null(0))
result_field->set_null();
result_field->ptr-=offset;
result_field->store(old_nr);
}
void Item_sum_or::update_field(int offset)
void Item_sum_or::update_field()
{
ulonglong nr;
char *res=result_field->ptr;
nr=uint8korr(res+offset);
nr=uint8korr(res);
nr|= (ulonglong) args[0]->val_int();
int8store(res,nr);
}
void Item_sum_and::update_field(int offset)
void Item_sum_and::update_field()
{
ulonglong nr;
char *res=result_field->ptr;
nr=uint8korr(res+offset);
nr=uint8korr(res);
nr&= (ulonglong) args[0]->val_int();
int8store(res,nr);
}
@ -1931,6 +1921,3 @@ String* Item_func_group_concat::val_str(String* str)
}
return &result;
}