summaryrefslogtreecommitdiff
path: root/sql/sql_partition.cc
diff options
context:
space:
mode:
authorunknown <mikael@c-0409e253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-06-06 11:54:21 -0400
committerunknown <mikael@c-0409e253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-06-06 11:54:21 -0400
commit5239cba4b58071ea1aa16ff823305f0498078e0a (patch)
tree602f83504772f8c58798bb84a51dc17f150373b4 /sql/sql_partition.cc
parente05d2d06cb4adfe27dc4c0c4cb8f445332e9ab80 (diff)
downloadmariadb-git-5239cba4b58071ea1aa16ff823305f0498078e0a.tar.gz
BUG#16002: More review fixes
mysql-test/r/partition_range.result: Changed test cases mysql-test/t/partition_range.test: Changed test cases sql/partition_info.cc: Changes to resue signed integer code for unsigned integer partition functions Basic idea is to store value - 0x8000000000000000 in list_array and range_int_array and also perform this subtraction before applying get_partition_id_range and so forth. sql/sql_partition.cc: Changes to resue signed integer code for unsigned integer partition functions Basic idea is to store value - 0x8000000000000000 in list_array and range_int_array and also perform this subtraction before applying get_partition_id_range and so forth.
Diffstat (limited to 'sql/sql_partition.cc')
-rw-r--r--sql/sql_partition.cc265
1 files changed, 75 insertions, 190 deletions
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index 45cd13ce854..086b7f28b1e 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -1752,8 +1752,7 @@ static int add_partition_options(File fptr, partition_element *p_elem)
return err + add_engine(fptr,p_elem->engine_type);
}
-static int add_partition_values(File fptr, partition_info *part_info,
- partition_element *p_elem)
+static int add_partition_values(File fptr, partition_info *part_info, partition_element *p_elem)
{
int err= 0;
@@ -1766,7 +1765,7 @@ static int add_partition_values(File fptr, partition_info *part_info,
if (p_elem->signed_flag)
err+= add_int(fptr, p_elem->range_value);
else
- err+= add_uint(fptr, (ulonglong)p_elem->range_value);
+ err+= add_uint(fptr, p_elem->range_value);
err+= add_end_parenthesis(fptr);
}
else
@@ -2382,6 +2381,7 @@ int get_partition_id_list(partition_info *part_info,
int min_list_index= 0;
int max_list_index= part_info->no_list_values - 1;
longlong part_func_value= part_val_int(part_info->part_expr);
+ longlong list_value;
bool unsigned_flag= part_info->part_expr->unsigned_flag;
DBUG_ENTER("get_partition_id_list");
@@ -2394,50 +2394,25 @@ int get_partition_id_list(partition_info *part_info,
}
goto notfound;
}
+ if (unsigned_flag)
+ part_func_value-= 0x8000000000000000ULL;
*func_value= part_func_value;
- if (!unsigned_flag)
+ while (max_list_index >= min_list_index)
{
- longlong list_value;
- while (max_list_index >= min_list_index)
+ list_index= (max_list_index + min_list_index) >> 1;
+ list_value= list_array[list_index].list_value;
+ if (list_value < part_func_value)
+ min_list_index= list_index + 1;
+ else if (list_value > part_func_value)
{
- list_index= (max_list_index + min_list_index) >> 1;
- list_value= list_array[list_index].list_value;
- if (list_value < part_func_value)
- min_list_index= list_index + 1;
- else if (list_value > part_func_value)
- {
- if (!list_index)
- goto notfound;
- max_list_index= list_index - 1;
- }
- else
- {
- *part_id= (uint32)list_array[list_index].partition_id;
- DBUG_RETURN(0);
- }
+ if (!list_index)
+ goto notfound;
+ max_list_index= list_index - 1;
}
- }
- else
- {
- ulonglong ulist_value;
- ulonglong upart_func_value= part_func_value;
- while (max_list_index >= min_list_index)
+ else
{
- list_index= (max_list_index + min_list_index) >> 1;
- ulist_value= list_array[list_index].list_value;
- if (ulist_value < upart_func_value)
- min_list_index= list_index + 1;
- else if (ulist_value > upart_func_value)
- {
- if (!list_index)
- goto notfound;
- max_list_index= list_index - 1;
- }
- else
- {
- *part_id= (uint32)list_array[list_index].partition_id;
- DBUG_RETURN(0);
- }
+ *part_id= (uint32)list_array[list_index].partition_id;
+ DBUG_RETURN(0);
}
}
notfound:
@@ -2496,57 +2471,30 @@ uint32 get_list_array_idx_for_endpoint(partition_info *part_info,
bool unsigned_flag= part_info->part_expr->unsigned_flag;
DBUG_ENTER("get_list_array_idx_for_endpoint");
- if (!unsigned_flag)
+ if (unsigned_flag)
+ part_func_value-= 0x8000000000000000ULL;
+ longlong list_value;
+ while (max_list_index >= min_list_index)
{
- longlong list_value;
- while (max_list_index >= min_list_index)
+ list_index= (max_list_index + min_list_index) >> 1;
+ list_value= list_array[list_index].list_value;
+ if (list_value < part_func_value)
+ min_list_index= list_index + 1;
+ else if (list_value > part_func_value)
{
- list_index= (max_list_index + min_list_index) >> 1;
- list_value= list_array[list_index].list_value;
- if (list_value < part_func_value)
- min_list_index= list_index + 1;
- else if (list_value > part_func_value)
- {
- if (!list_index)
- goto notfound_signed;
- max_list_index= list_index - 1;
- }
- else
- {
- DBUG_RETURN(list_index + test(left_endpoint ^ include_endpoint));
- }
+ if (!list_index)
+ goto notfound;
+ max_list_index= list_index - 1;
}
- notfound_signed:
- if (list_value < part_func_value)
- list_index++;
- DBUG_RETURN(list_index);
- }
- else
- {
- ulonglong upart_func_value= part_func_value;
- ulonglong ulist_value;
- while (max_list_index >= min_list_index)
+ else
{
- list_index= (max_list_index + min_list_index) >> 1;
- ulist_value= list_array[list_index].list_value;
- if (ulist_value < upart_func_value)
- min_list_index= list_index + 1;
- else if (ulist_value > upart_func_value)
- {
- if (!list_index)
- goto notfound_unsigned;
- max_list_index= list_index - 1;
- }
- else
- {
- DBUG_RETURN(list_index + test(left_endpoint ^ include_endpoint));
- }
+ DBUG_RETURN(list_index + test(left_endpoint ^ include_endpoint));
}
- notfound_unsigned:
- if (ulist_value < upart_func_value)
- list_index++;
- DBUG_RETURN(list_index);
}
+notfound:
+ if (list_value < part_func_value)
+ list_index++;
+ DBUG_RETURN(list_index);
}
@@ -2568,52 +2516,26 @@ int get_partition_id_range(partition_info *part_info,
*part_id= 0;
DBUG_RETURN(0);
}
+ if (unsigned_flag)
+ part_func_value-= 0x8000000000000000ULL;
*func_value= part_func_value;
- if (!unsigned_flag)
- {
- while (max_part_id > min_part_id)
- {
- loc_part_id= (max_part_id + min_part_id + 1) >> 1;
- if (range_array[loc_part_id] <= part_func_value)
- min_part_id= loc_part_id + 1;
- else
- max_part_id= loc_part_id - 1;
- }
- loc_part_id= max_part_id;
- if (part_func_value >= range_array[loc_part_id])
- if (loc_part_id != max_partition)
- loc_part_id++;
- *part_id= (uint32)loc_part_id;
- if (loc_part_id == max_partition)
- if (range_array[loc_part_id] != LONGLONG_MAX)
- if (part_func_value >= range_array[loc_part_id])
- DBUG_RETURN(HA_ERR_NO_PARTITION_FOUND);
- }
- else
+ while (max_part_id > min_part_id)
{
- ulonglong upart_func_value= part_func_value;
- ulonglong urange_value;
- while (max_part_id > min_part_id)
- {
- loc_part_id= (max_part_id + min_part_id + 1) >> 1;
- urange_value= range_array[loc_part_id];
- if (urange_value <= upart_func_value)
- min_part_id= loc_part_id + 1;
- else
- max_part_id= loc_part_id - 1;
- }
- loc_part_id= max_part_id;
- urange_value= range_array[loc_part_id];
- if (upart_func_value >= urange_value)
- if (loc_part_id != max_partition)
- loc_part_id++;
- *part_id= (uint32)loc_part_id;
- urange_value= range_array[loc_part_id];
- if (loc_part_id == max_partition)
- if (urange_value != ULONGLONG_MAX)
- if (upart_func_value >= urange_value)
- DBUG_RETURN(HA_ERR_NO_PARTITION_FOUND);
+ loc_part_id= (max_part_id + min_part_id + 1) >> 1;
+ if (range_array[loc_part_id] <= part_func_value)
+ min_part_id= loc_part_id + 1;
+ else
+ max_part_id= loc_part_id - 1;
}
+ loc_part_id= max_part_id;
+ if (part_func_value >= range_array[loc_part_id])
+ if (loc_part_id != max_partition)
+ loc_part_id++;
+ *part_id= (uint32)loc_part_id;
+ if (loc_part_id == max_partition)
+ if (range_array[loc_part_id] != LONGLONG_MAX)
+ if (part_func_value >= range_array[loc_part_id])
+ DBUG_RETURN(HA_ERR_NO_PARTITION_FOUND);
DBUG_RETURN(0);
}
@@ -2671,71 +2593,34 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info,
bool unsigned_flag= part_info->part_expr->unsigned_flag;
DBUG_ENTER("get_partition_id_range_for_endpoint");
- if (!unsigned_flag)
+ if (unsigned_flag)
+ part_func_value-= 0x8000000000000000ULL;
+ while (max_part_id > min_part_id)
{
- while (max_part_id > min_part_id)
- {
- loc_part_id= (max_part_id + min_part_id + 1) >> 1;
- if (range_array[loc_part_id] <= part_func_value)
- min_part_id= loc_part_id + 1;
- else
- max_part_id= loc_part_id - 1;
- }
- loc_part_id= max_part_id;
- if (loc_part_id < max_partition &&
- part_func_value >= range_array[loc_part_id+1])
- {
- loc_part_id++;
- }
- if (left_endpoint)
- {
- if (part_func_value >= range_array[loc_part_id])
- loc_part_id++;
- }
- else
- {
- if (part_func_value == range_array[loc_part_id])
- loc_part_id += test(include_endpoint);
- else if (part_func_value > range_array[loc_part_id])
- loc_part_id++;
+ loc_part_id= (max_part_id + min_part_id + 1) >> 1;
+ if (range_array[loc_part_id] <= part_func_value)
+ min_part_id= loc_part_id + 1;
+ else
+ max_part_id= loc_part_id - 1;
+ }
+ loc_part_id= max_part_id;
+ if (loc_part_id < max_partition &&
+ part_func_value >= range_array[loc_part_id+1])
+ {
+ loc_part_id++;
+ }
+ if (left_endpoint)
+ {
+ if (part_func_value >= range_array[loc_part_id])
loc_part_id++;
- }
}
- else
+ else
{
- ulonglong upart_func_value= part_func_value;
- ulonglong urange_value;
- while (max_part_id > min_part_id)
- {
- loc_part_id= (max_part_id + min_part_id + 1) >> 1;
- urange_value= range_array[loc_part_id];
- if (urange_value <= upart_func_value)
- min_part_id= loc_part_id + 1;
- else
- max_part_id= loc_part_id - 1;
- }
- loc_part_id= max_part_id;
- urange_value= range_array[loc_part_id+1];
- if (loc_part_id < max_partition &&
- upart_func_value >= urange_value)
- {
- loc_part_id++;
- }
- if (left_endpoint)
- {
- urange_value= range_array[loc_part_id];
- if (upart_func_value >= urange_value)
- loc_part_id++;
- }
- else
- {
- urange_value= range_array[loc_part_id];
- if (upart_func_value == urange_value)
- loc_part_id += test(include_endpoint);
- else if (upart_func_value > urange_value)
- loc_part_id++;
+ if (part_func_value == range_array[loc_part_id])
+ loc_part_id += test(include_endpoint);
+ else if (part_func_value > range_array[loc_part_id])
loc_part_id++;
- }
+ loc_part_id++;
}
DBUG_RETURN(loc_part_id);
}