Commit 179c9799 authored by unknown's avatar unknown
Browse files

Merge c-0409e253.1238-1-64736c10.cust.bredbandsbolaget.se:/home/pappa/clean-mysql-5.1

into  c-0409e253.1238-1-64736c10.cust.bredbandsbolaget.se:/home/pappa/bug19801


mysql-test/r/partition.result:
  Auto merged
mysql-test/t/partition.test:
  Auto merged
sql/sql_partition.cc:
  Auto merged
sql/partition_info.cc:
  manual merge
parents 2ecd916d a4c2d33e
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -779,6 +779,18 @@ insert into t1 values (null);
select * from t1 where f1 is null;
f1
NULL
select * from t1 where f1 < 1;
f1
select * from t1 where f1 <= NULL;
f1
select * from t1 where f1 < NULL;
f1
select * from t1 where f1 >= NULL;
f1
select * from t1 where f1 > NULL;
f1
select * from t1 where f1 > 1;
f1
drop table t1;
create table t1 (f1 smallint)
partition by range (f1) (partition p0 values less than (0));
+6 −0
Original line number Diff line number Diff line
@@ -919,6 +919,12 @@ create table t1 (f1 smallint)
partition by list (f1) (partition p0 values in (null));
insert into t1 values (null);
select * from t1 where f1 is null;
select * from t1 where f1 < 1;
select * from t1 where f1 <= NULL;
select * from t1 where f1 < NULL;
select * from t1 where f1 >= NULL;
select * from t1 where f1 > NULL;
select * from t1 where f1 > 1;
drop table t1;

create table t1 (f1 smallint)
+22 −18
Original line number Diff line number Diff line
@@ -569,7 +569,6 @@ bool partition_info::check_list_constants()
  uint i;
  uint list_index= 0;
  longlong *list_value;
  bool not_first;
  bool result= TRUE;
  longlong curr_value, prev_value;
  partition_element* part_def;
@@ -614,7 +613,8 @@ bool partition_info::check_list_constants()
      no_list_values++;
  } while (++i < no_parts);
  list_func_it.rewind();
  list_array= (LIST_PART_ENTRY*)sql_alloc(no_list_values*sizeof(LIST_PART_ENTRY));
  list_array= (LIST_PART_ENTRY*)sql_alloc((no_list_values+1) *
                                          sizeof(LIST_PART_ENTRY));
  if (unlikely(list_array == NULL))
  {
    mem_alloc_error(no_list_values * sizeof(LIST_PART_ENTRY));
@@ -633,24 +633,28 @@ bool partition_info::check_list_constants()
    }
  } while (++i < no_parts);

  if (no_list_values)
  {
    bool first= TRUE;
    qsort((void*)list_array, no_list_values, sizeof(LIST_PART_ENTRY), 
          &list_part_cmp);
 
  not_first= FALSE;
  prev_value= 0; // prev_value initialised to quiet compiler
  for (i= 0; i < no_list_values ; i++)
    i= prev_value= 0; //prev_value initialised to quiet compiler
    do
    {
      DBUG_ASSERT(i < no_list_values);
      curr_value= list_array[i].list_value;
    if (likely(!not_first || prev_value != curr_value))
      if (likely(first || prev_value != curr_value))
      {
        prev_value= curr_value;
      not_first= TRUE;
        first= FALSE;
      }
      else
      {
        my_error(ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR, MYF(0));
        goto end;
      }
    } while (++i < no_list_values);
  }
  result= FALSE;
end:
+17 −4
Original line number Diff line number Diff line
@@ -2357,7 +2357,8 @@ uint32 get_list_array_idx_for_endpoint(partition_info *part_info,
  uint min_list_index= 0, max_list_index= part_info->no_list_values - 1;
  /* Get the partitioning function value for the endpoint */
  longlong part_func_value= part_val_int(part_info->part_expr);
  while (max_list_index >= min_list_index)
  DBUG_ASSERT(part_info->no_list_values);
  do
  {
    list_index= (max_list_index + min_list_index) >> 1;
    list_value= list_array[list_index].list_value;
@@ -2373,7 +2374,7 @@ uint32 get_list_array_idx_for_endpoint(partition_info *part_info,
    {
      DBUG_RETURN(list_index + test(left_endpoint ^ include_endpoint));
    }
  }
  } while (max_list_index >= min_list_index);
notfound:
  if (list_value < part_func_value)
    list_index++;
@@ -6305,6 +6306,18 @@ int get_part_iter_for_interval_via_mapping(partition_info *part_info,
    part_iter->get_next= get_next_partition_id_list;
    part_iter->part_info= part_info;
    part_iter->ret_null_part= part_iter->ret_null_part_orig= FALSE;
    if (max_endpoint_val == 0)
    {
      /*
        We handle this special case without optimisations since it is
        of little practical value but causes a great number of complex
        checks later in the code.
      */
      part_iter->part_nums.start= part_iter->part_nums.end= 0;
      part_iter->part_nums.cur= 0;
      part_iter->ret_null_part= part_iter->ret_null_part_orig= TRUE;
      return -1;
    }
  }
  else
    DBUG_ASSERT(0);