Commit 87351da2 authored by monty@hundin.mysql.fi's avatar monty@hundin.mysql.fi
Browse files

Merge work:/home/bk/mysql into hundin.mysql.fi:/my/bk/mysql

parents 31b69aff b4343ba9
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -46942,6 +46942,8 @@ temporary tables used for some (unlikely) @code{GROUP BY} queries.
Fixed a bug in key optimizing handling where the expression
@code{WHERE column_name = key_column_name} was calculated as true
for @code{NULL} values.
@item
Fixed core dump bug when doing @code{LEFT JOIN ... WHERE key_column=NULL}.
@end itemize
@node News-3.23.53, News-3.23.52, News-3.23.54, News-3.23.x
+1 −0
Original line number Diff line number Diff line
@@ -1043,6 +1043,7 @@ Field *make_field(char *ptr, uint32 field_length,
uint pack_length_to_packflag(uint type);
uint32 calc_pack_length(enum_field_types type,uint32 length);
bool set_field_to_null(Field *field);
bool set_field_to_null_with_conversions(Field *field);
uint find_enum(TYPELIB *typelib,const char *x, uint length);
ulonglong find_set(TYPELIB *typelib,const char *x, uint length);
bool test_if_int(const char *str,int length);
+36 −19
Original line number Diff line number Diff line
@@ -112,13 +112,30 @@ static void do_outer_field_to_null_str(Copy_field *copy)
bool
set_field_to_null(Field *field)
{
  if (field->maybe_null())
  if (field->real_maybe_null())
  {
    field->set_null();
    field->reset();
    return 0;
  }
  else
  return 1;
}


bool
set_field_to_null_with_conversions(Field *field)
{
  if (field->real_maybe_null())
  {
    field->set_null();
    field->reset();
    return 0;
  }

  /*
    Check if this is a special type, which will get a special walue
    when set to NULL
  */
  if (field->type() == FIELD_TYPE_TIMESTAMP)
  {
    ((Field_timestamp*) field)->set_time();
@@ -137,8 +154,8 @@ set_field_to_null(Field *field)
		    field->field_name);
  return 1;
}
  return 0;
}




static void do_skip(Copy_field *copy __attribute__((unused)))
+38 −4
Original line number Diff line number Diff line
@@ -383,7 +383,7 @@ void Item_field::save_org_in_field(Field *to)
  if (field->is_null())
  {
    null_value=1;
    set_field_to_null(to);
    set_field_to_null_with_conversions(to);
  }
  else
  {
@@ -398,7 +398,7 @@ bool Item_field::save_in_field(Field *to)
  if (result_field->is_null())
  {
    null_value=1;
    return set_field_to_null(to);
    return set_field_to_null_with_conversions(to);
  }
  else
  {
@@ -409,8 +409,41 @@ bool Item_field::save_in_field(Field *to)
  return 0;
}

/*
  Store null in field

  SYNOPSIS
    save_in_field()
    field		Field where we want to store NULL

  DESCRIPTION
    This is used on INSERT.
    Allow NULL to be inserted in timestamp and auto_increment values

  RETURN VALUES
    0	 ok
    1	 Field doesn't support NULL values and can't handle 'field = NULL'
*/   

bool Item_null::save_in_field(Field *field)
{
  return set_field_to_null_with_conversions(field);
}


/*
  Store null in field

  SYNOPSIS
    save_safe_in_field()
    field		Field where we want to store NULL

  RETURN VALUES
    0	 ok
    1	 Field doesn't support NULL values
*/   

bool Item_null::save_safe_in_field(Field *field)
{
  return set_field_to_null(field);
}
@@ -427,7 +460,7 @@ bool Item::save_in_field(Field *field)
    str_value.set_quick(buff,sizeof(buff));
    result=val_str(&str_value);
    if (null_value)
      return set_field_to_null(field);
      return set_field_to_null_with_conversions(field);
    field->set_notnull();
    field->store(result->ptr(),result->length());
    str_value.set_quick(0, 0);
@@ -444,13 +477,14 @@ bool Item::save_in_field(Field *field)
  {
    longlong nr=val_int();
    if (null_value)
      return set_field_to_null(field);
      return set_field_to_null_with_conversions(field);
    field->set_notnull();
    field->store(nr);
  }
  return 0;
}


bool Item_string::save_in_field(Field *field)
{
  String *result;
+3 −0
Original line number Diff line number Diff line
@@ -55,6 +55,8 @@ class Item {
  virtual bool save_in_field(Field *field);
  virtual void save_org_in_field(Field *field)
    { (void) save_in_field(field); }
  virtual bool save_safe_in_field(Field *field)
    { return save_in_field(field); }
  virtual bool send(String *str);
  virtual bool eq(const Item *, bool binary_cmp) const;
  virtual Item_result result_type () const { return REAL_RESULT; }
@@ -144,6 +146,7 @@ class Item_null :public Item
  String *val_str(String *str);
  void make_field(Send_field *field);
  bool save_in_field(Field *field);
  bool save_safe_in_field(Field *field);
  enum Item_result result_type () const
  { return STRING_RESULT; }
  bool send(String *str);