BUG#18198: Partition function handling

Fixes of after review fixes
parent 74c7f60d
drop table if exists t1; drop table if exists t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin)
partition by hash(length(a))
partitions 10;
insert into t1 values (''),(' '),('a'),('a '),('a ');
explain partitions select * from t1 where a='a ';
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 5 Using where
explain partitions select * from t1 where a='a';
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 5 Using where
explain partitions select * from t1 where a='a ' OR a='a';
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 5 Using where
drop table t1;
create table t1 (a int unsigned) create table t1 (a int unsigned)
partition by hash(a div 2) partition by hash(a div 2)
partitions 4; partitions 4;
......
drop table if exists t1; drop table if exists t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int) create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
partition by range (length(a) * b) partition by range (length(a) * b)
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 2),('a',3); insert into t1 values ('a ', 2),('a',3);
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int) create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
partition by range (b* length(a) * b) partition by range (b* length(a) * b)
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 2),('a',3); insert into t1 values ('a ', 2),('a',3);
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin) b varchar(10) charset latin1 collate latin1_bin)
partition by range (length(b) * length(a)) partition by range (length(b) * length(a))
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b '),('a','b'); insert into t1 values ('a ', 'b '),('a','b');
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin) b varchar(10) charset latin1 collate latin1_bin)
partition by range (length(a) * length(b)) partition by range (length(a) * length(b))
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b '),('a','b'); insert into t1 values ('a ', 'b '),('a','b');
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int) b varchar(10) charset latin1 collate latin1_bin, c int)
partition by range (length(a) * c) partition by range (length(a) * c)
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b ', 2),('a','b', 3); insert into t1 values ('a ', 'b ', 2),('a','b', 3);
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int) b varchar(10) charset latin1 collate latin1_bin, c int)
partition by range (c * length(a)) partition by range (c * length(a))
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b ', 2),('a','b', 3); insert into t1 values ('a ', 'b ', 2),('a','b', 3);
drop table t1; drop table t1;
create table t1 (a int unsigned) create table t1 (a int unsigned)
......
...@@ -14,41 +14,41 @@ drop table if exists t1; ...@@ -14,41 +14,41 @@ drop table if exists t1;
# #
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int) create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
partition by range (length(a) * b) partition by range (length(a) * b)
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 2),('a',3); insert into t1 values ('a ', 2),('a',3);
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int) create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
partition by range (b* length(a) * b) partition by range (b* length(a) * b)
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 2),('a',3); insert into t1 values ('a ', 2),('a',3);
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin) b varchar(10) charset latin1 collate latin1_bin)
partition by range (length(b) * length(a)) partition by range (length(b) * length(a))
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b '),('a','b'); insert into t1 values ('a ', 'b '),('a','b');
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin) b varchar(10) charset latin1 collate latin1_bin)
partition by range (length(a) * length(b)) partition by range (length(a) * length(b))
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b '),('a','b'); insert into t1 values ('a ', 'b '),('a','b');
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int) b varchar(10) charset latin1 collate latin1_bin, c int)
partition by range (length(a) * c) partition by range (length(a) * c)
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b ', 2),('a','b', 3); insert into t1 values ('a ', 'b ', 2),('a','b', 3);
drop table t1; drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int) b varchar(10) charset latin1 collate latin1_bin, c int)
partition by range (c * length(a)) partition by range (c * length(a))
(partition p0 values less than (2), partition p1 values less than (10)); (partition p0 values less than (2), partition p1 values less than (400));
insert into t1 values ('a ', 'b ', 2),('a','b', 3); insert into t1 values ('a ', 'b ', 2),('a','b', 3);
drop table t1; drop table t1;
......
...@@ -1899,7 +1899,10 @@ int ha_ndbcluster::peek_indexed_rows(const byte *record) ...@@ -1899,7 +1899,10 @@ int ha_ndbcluster::peek_indexed_rows(const byte *record)
error= m_part_info->get_partition_id(m_part_info, &part_id, &func_value); error= m_part_info->get_partition_id(m_part_info, &part_id, &func_value);
dbug_tmp_restore_column_map(table->read_set, old_map); dbug_tmp_restore_column_map(table->read_set, old_map);
if (error) if (error)
{
m_part_info->err_value= func_value;
DBUG_RETURN(error); DBUG_RETURN(error);
}
op->setPartitionId(part_id); op->setPartitionId(part_id);
} }
} }
...@@ -2534,7 +2537,10 @@ int ha_ndbcluster::write_row(byte *record) ...@@ -2534,7 +2537,10 @@ int ha_ndbcluster::write_row(byte *record)
error= m_part_info->get_partition_id(m_part_info, &part_id, &func_value); error= m_part_info->get_partition_id(m_part_info, &part_id, &func_value);
dbug_tmp_restore_column_map(table->read_set, old_map); dbug_tmp_restore_column_map(table->read_set, old_map);
if (error) if (error)
{
m_part_info->err_value= func_value;
DBUG_RETURN(error); DBUG_RETURN(error);
}
op->setPartitionId(part_id); op->setPartitionId(part_id);
} }
...@@ -2726,6 +2732,7 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data) ...@@ -2726,6 +2732,7 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
m_part_info, &old_part_id, &new_part_id, m_part_info, &old_part_id, &new_part_id,
&func_value))) &func_value)))
{ {
m_part_info->err_value= func_value;
DBUG_RETURN(error); DBUG_RETURN(error);
} }
......
...@@ -2670,7 +2670,10 @@ int ha_partition::write_row(byte * buf) ...@@ -2670,7 +2670,10 @@ int ha_partition::write_row(byte * buf)
#endif #endif
dbug_tmp_restore_column_map(table->read_set, old_map); dbug_tmp_restore_column_map(table->read_set, old_map);
if (unlikely(error)) if (unlikely(error))
{
m_part_info->err_value= func_value;
DBUG_RETURN(error); DBUG_RETURN(error);
}
m_last_part= part_id; m_last_part= part_id;
DBUG_PRINT("info", ("Insert in partition %d", part_id)); DBUG_PRINT("info", ("Insert in partition %d", part_id));
DBUG_RETURN(m_file[part_id]->write_row(buf)); DBUG_RETURN(m_file[part_id]->write_row(buf));
...@@ -2719,6 +2722,7 @@ int ha_partition::update_row(const byte *old_data, byte *new_data) ...@@ -2719,6 +2722,7 @@ int ha_partition::update_row(const byte *old_data, byte *new_data)
m_part_info, &old_part_id, &new_part_id, m_part_info, &old_part_id, &new_part_id,
&func_value))) &func_value)))
{ {
m_part_info->err_value= func_value;
DBUG_RETURN(error); DBUG_RETURN(error);
} }
......
...@@ -855,7 +855,7 @@ void partition_info::print_no_partition_found(TABLE *table) ...@@ -855,7 +855,7 @@ void partition_info::print_no_partition_found(TABLE *table)
if (part_expr->null_value) if (part_expr->null_value)
buf_ptr= (char*)"NULL"; buf_ptr= (char*)"NULL";
else else
longlong2str(part_expr->val_int(), buf, longlong2str(err_value, buf,
part_expr->unsigned_flag ? 10 : -10); part_expr->unsigned_flag ? 10 : -10);
my_error(ER_NO_PARTITION_FOR_GIVEN_VALUE, MYF(0), buf_ptr); my_error(ER_NO_PARTITION_FOR_GIVEN_VALUE, MYF(0), buf_ptr);
dbug_tmp_restore_column_map(table->read_set, old_map); dbug_tmp_restore_column_map(table->read_set, old_map);
......
...@@ -150,7 +150,8 @@ public: ...@@ -150,7 +150,8 @@ public:
/******************************************** /********************************************
* INTERVAL ANALYSIS ENDS * INTERVAL ANALYSIS ENDS
********************************************/ ********************************************/
longlong err_value;
char* part_info_string; char* part_info_string;
char *part_func_string; char *part_func_string;
...@@ -227,7 +228,7 @@ public: ...@@ -227,7 +228,7 @@ public:
restore_full_part_field_ptrs(NULL), restore_full_part_field_ptrs(NULL),
part_expr(NULL), subpart_expr(NULL), item_free_list(NULL), part_expr(NULL), subpart_expr(NULL), item_free_list(NULL),
first_log_entry(NULL), exec_log_entry(NULL), frm_log_entry(NULL), first_log_entry(NULL), exec_log_entry(NULL), frm_log_entry(NULL),
list_array(NULL), list_array(NULL), err_value(0),
part_info_string(NULL), part_info_string(NULL),
part_func_string(NULL), subpart_func_string(NULL), part_func_string(NULL), subpart_func_string(NULL),
part_state(NULL), part_state(NULL),
......
...@@ -2771,8 +2771,8 @@ notfound: ...@@ -2771,8 +2771,8 @@ notfound:
int get_partition_id_range(partition_info *part_info, int get_partition_id_range(partition_info *part_info,
uint32 *part_id, uint32 *part_id,
longlong *func_value) longlong *func_value)
{ {
longlong *range_array= part_info->range_int_array; longlong *range_array= part_info->range_int_array;
uint max_partition= part_info->no_parts - 1; uint max_partition= part_info->no_parts - 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment