summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormikael/pappa@dator5.(none) <>2006-10-02 15:52:29 -0400
committermikael/pappa@dator5.(none) <>2006-10-02 15:52:29 -0400
commit1cdf82e012148370a721d9c4ac5c3cc9bcba00ba (patch)
tree4bca4ca32b026e15672d4d0284b012a03a358a81
parent74c7f60d45e8285b17e2ecac71b33b35114be975 (diff)
downloadmariadb-git-1cdf82e012148370a721d9c4ac5c3cc9bcba00ba.tar.gz
BUG#18198: Partition function handling
Fixes of after review fixes
-rw-r--r--mysql-test/r/partition_hash.result14
-rw-r--r--mysql-test/r/partition_range.result12
-rw-r--r--mysql-test/t/partition_range.test12
-rw-r--r--sql/ha_ndbcluster.cc7
-rw-r--r--sql/ha_partition.cc4
-rw-r--r--sql/partition_info.cc2
-rw-r--r--sql/partition_info.h5
-rw-r--r--sql/sql_partition.cc4
8 files changed, 43 insertions, 17 deletions
diff --git a/mysql-test/r/partition_hash.result b/mysql-test/r/partition_hash.result
index 9a82a36d902..7ef3ee5c6c8 100644
--- a/mysql-test/r/partition_hash.result
+++ b/mysql-test/r/partition_hash.result
@@ -1,4 +1,18 @@
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)
partition by hash(a div 2)
partitions 4;
diff --git a/mysql-test/r/partition_range.result b/mysql-test/r/partition_range.result
index c8380446f44..d39b39f413a 100644
--- a/mysql-test/r/partition_range.result
+++ b/mysql-test/r/partition_range.result
@@ -1,36 +1,36 @@
drop table if exists t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
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);
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
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);
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin)
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');
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin)
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');
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int)
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);
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int)
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);
drop table t1;
create table t1 (a int unsigned)
diff --git a/mysql-test/t/partition_range.test b/mysql-test/t/partition_range.test
index ead971c189e..84f67febe8b 100644
--- a/mysql-test/t/partition_range.test
+++ b/mysql-test/t/partition_range.test
@@ -14,41 +14,41 @@ drop table if exists t1;
#
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
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);
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin, b int)
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);
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin)
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');
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin)
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');
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int)
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);
drop table t1;
create table t1 (a varchar(10) charset latin1 collate latin1_bin,
b varchar(10) charset latin1 collate latin1_bin, c int)
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);
drop table t1;
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 0739b704462..ccfe8e717fb 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -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);
dbug_tmp_restore_column_map(table->read_set, old_map);
if (error)
+ {
+ m_part_info->err_value= func_value;
DBUG_RETURN(error);
+ }
op->setPartitionId(part_id);
}
}
@@ -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);
dbug_tmp_restore_column_map(table->read_set, old_map);
if (error)
+ {
+ m_part_info->err_value= func_value;
DBUG_RETURN(error);
+ }
op->setPartitionId(part_id);
}
@@ -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,
&func_value)))
{
+ m_part_info->err_value= func_value;
DBUG_RETURN(error);
}
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 3cb855b1035..1e75dd08f38 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -2670,7 +2670,10 @@ int ha_partition::write_row(byte * buf)
#endif
dbug_tmp_restore_column_map(table->read_set, old_map);
if (unlikely(error))
+ {
+ m_part_info->err_value= func_value;
DBUG_RETURN(error);
+ }
m_last_part= part_id;
DBUG_PRINT("info", ("Insert in partition %d", part_id));
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)
m_part_info, &old_part_id, &new_part_id,
&func_value)))
{
+ m_part_info->err_value= func_value;
DBUG_RETURN(error);
}
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index 1f84d3f1e83..2a06a649eca 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -855,7 +855,7 @@ void partition_info::print_no_partition_found(TABLE *table)
if (part_expr->null_value)
buf_ptr= (char*)"NULL";
else
- longlong2str(part_expr->val_int(), buf,
+ longlong2str(err_value, buf,
part_expr->unsigned_flag ? 10 : -10);
my_error(ER_NO_PARTITION_FOR_GIVEN_VALUE, MYF(0), buf_ptr);
dbug_tmp_restore_column_map(table->read_set, old_map);
diff --git a/sql/partition_info.h b/sql/partition_info.h
index b45789c4bae..09d827d44c4 100644
--- a/sql/partition_info.h
+++ b/sql/partition_info.h
@@ -150,7 +150,8 @@ public:
/********************************************
* INTERVAL ANALYSIS ENDS
********************************************/
-
+
+ longlong err_value;
char* part_info_string;
char *part_func_string;
@@ -227,7 +228,7 @@ public:
restore_full_part_field_ptrs(NULL),
part_expr(NULL), subpart_expr(NULL), item_free_list(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_func_string(NULL), subpart_func_string(NULL),
part_state(NULL),
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index 0944db9ccb8..a20e5dd512b 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -2771,8 +2771,8 @@ notfound:
int get_partition_id_range(partition_info *part_info,
- uint32 *part_id,
- longlong *func_value)
+ uint32 *part_id,
+ longlong *func_value)
{
longlong *range_array= part_info->range_int_array;
uint max_partition= part_info->no_parts - 1;