Commit 6fef0c8b authored by unknown's avatar unknown

Merge dator6.(none):/home/mikael/mysql_clones/clean-mysql-5.1

into  dator6.(none):/home/mikael/mysql_clones/bug18198


mysql-test/t/partition_hash.test:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
sql/item.h:
  manual merge
sql/item_cmpfunc.h:
  manual merge
sql/item_func.h:
  manual merge
sql/item_strfunc.h:
  manual merge
sql/item_timefunc.h:
  manual merge
sql/item_xmlfunc.h:
  manual merge
sql/partition_info.cc:
  manual merge
sql/sql_partition.cc:
  manual merge
parents a7bb31a7 12ad6b25
drop table if exists t1;
create table t1 (a char(5) character set koi8r)
partition by list (ascii(a) mod 3)
subpartition by hash(ascii(a))
subpartitions 3
(partition p1 values in (1),
partition p2 values in (2),
partition p0 values in (0));
insert into t1 values ('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 p2_p2sp2 system NULL NULL NULL NULL 1
select * from t1 where a = 'a';
a
a
drop table t1;
create table t1 (a char(5) character set cp1251)
partition by list (ascii(a)) (partition pn values in (null));
drop table t1;
create table t1 (col1 datetime)
partition by range(datediff(col1,col1))
(partition p0 values less than (10), partition p1 values less than (30));
drop table t1;
create table t1 (a char(5) character set big5)
partition by list (ascii(a)) (partition pn values in (null));
ERROR HY000: This partition function is not allowed
create table t1 (a char(1))
partition by list(ascii(a))
(partition p1 values in (ascii('i')));
drop table t1;
create table t1 (s1 char(5) character set latin5)
partition by list (ascii(s1))
(partition p1 values in (1));
set names utf8;
drop table t1;
create table t1 (col1 int)
partition by range(greatest(col1,10))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(isnull(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(least(col1,12))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(case when col1>0 then 10 else 20 end)
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(ifnull(col1,5))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(nullif(col1,5))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(bit_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(bit_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(char_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(char_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(character_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(find_in_set(col1,1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(find_in_set(col1,'1'))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(instr(col1,3))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(instr(col1,'3'))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(locate(1,col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(locate(1,col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(octet_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(position(1 in col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(position(1 in col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 char(5))
partition by range(strcmp(col1,2))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(strcmp(col1,2))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(crc32(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(round(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(sign(col1))
(partition p0 values less than (2), partition p1 values less than (6));
ERROR HY000: This partition function is not allowed
create table t1 (col1 datetime)
partition by range(period_add(col1,5))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 datetime, col2 datetime)
partition by range(period_diff(col1,col2))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int, col2 int)
partition by range(period_diff(col1,col2))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 datetime)
partition by range(timestampdiff(day,5,col1))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 date)
partition by range(unix_timestamp(col1))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 datetime)
partition by range(week(col1))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 varchar(25))
partition by range(cast(col1 as signed))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 varchar(25))
partition by range(convert(col1,unsigned))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(col1 | 20)
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(col1 & 20)
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(col1 ^ 20)
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(col1 << 20)
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(col1 >> 20)
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(~col1)
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(bit_count(col1))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
create table t1 (col1 int)
partition by range(inet_aton(col1))
(partition p0 values less than (10), partition p1 values less than (30));
ERROR HY000: This partition function is not allowed
...@@ -16,3 +16,9 @@ s1 ...@@ -16,3 +16,9 @@ s1
1 1
3 3
drop table t1; drop table t1;
create table t1 (a varchar(1), primary key (a))
partition by list (ascii(a))
(partition p1 values in (65));
insert into t1 values ('A');
replace into t1 values ('A');
drop table t1;
...@@ -25,7 +25,7 @@ partitions 3 ...@@ -25,7 +25,7 @@ partitions 3
(partition x1 values in (1,2,9,4) tablespace ts1, (partition x1 values in (1,2,9,4) tablespace ts1,
partition x2 values in (3, 11, 5, 7) tablespace ts2, partition x2 values in (3, 11, 5, 7) tablespace ts2,
partition x3 values in (16, 8, 5+19, 70-43) tablespace ts3); partition x3 values in (16, 8, 5+19, 70-43) tablespace ts3);
ERROR HY000: The PARTITION function returns the wrong type ERROR HY000: This partition function is not allowed
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
b int not null, b int not null,
...@@ -89,7 +89,7 @@ partitions 3 ...@@ -89,7 +89,7 @@ partitions 3
(partition x1 tablespace ts1, (partition x1 tablespace ts1,
partition x2 tablespace ts2, partition x2 tablespace ts2,
partition x3 tablespace ts3); partition x3 tablespace ts3);
ERROR HY000: The PARTITION function returns the wrong type ERROR HY000: This partition function is not allowed
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
b int not null, b int not null,
...@@ -422,7 +422,7 @@ partition by range (sin(a)) ...@@ -422,7 +422,7 @@ partition by range (sin(a))
partitions 2 partitions 2
(partition x1 values less than (4), (partition x1 values less than (4),
partition x2 values less than (5)); partition x2 values less than (5));
ERROR HY000: The PARTITION function returns the wrong type ERROR HY000: This partition function is not allowed
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
b int not null, b int not null,
...@@ -619,4 +619,4 @@ partition by range (a + (select count(*) from t1)) ...@@ -619,4 +619,4 @@ partition by range (a + (select count(*) from t1))
ERROR HY000: This partition function is not allowed ERROR HY000: This partition function is not allowed
create table t1 (a char(10)) create table t1 (a char(10))
partition by hash (extractvalue(a,'a')); partition by hash (extractvalue(a,'a'));
ERROR HY000: The PARTITION function returns the wrong type ERROR HY000: This partition function is not allowed
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;
......
...@@ -295,3 +295,7 @@ select * from t1; ...@@ -295,3 +295,7 @@ select * from t1;
a a
100 100
drop table t1; drop table t1;
create table t1 (a char(1))
partition by list (ascii(ucase(a)))
(partition p1 values in (2));
ERROR HY000: This partition function is not allowed
...@@ -10,13 +10,13 @@ subpartition sp01, subpartition sp02)); ...@@ -10,13 +10,13 @@ subpartition sp01, subpartition sp02));
ERROR HY000: Wrong number of subpartitions defined, mismatch with previous setting ERROR HY000: Wrong number of subpartitions defined, mismatch with previous setting
drop table t1; drop table t1;
CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30)) CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30))
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2; PARTITION BY HASH(YEAR(f_date)) PARTITIONS 2;
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`f_date` date DEFAULT NULL, `f_date` date DEFAULT NULL,
`f_varchar` varchar(30) DEFAULT NULL `f_varchar` varchar(30) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2 */ ) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (YEAR(f_date)) PARTITIONS 2 */
hello/master-data/test/t1#P#p0.MYD hello/master-data/test/t1#P#p0.MYD
hello/master-data/test/t1#P#p0.MYI hello/master-data/test/t1#P#p0.MYI
hello/master-data/test/t1#P#p1.MYD hello/master-data/test/t1#P#p1.MYD
...@@ -29,7 +29,7 @@ Table Create Table ...@@ -29,7 +29,7 @@ Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`f_date` date DEFAULT NULL, `f_date` date DEFAULT NULL,
`f_varchar` varchar(30) DEFAULT NULL `f_varchar` varchar(30) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 1 */ ) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (YEAR(f_date)) PARTITIONS 1 */
hello/master-data/test/t1#P#p0.MYD hello/master-data/test/t1#P#p0.MYD
hello/master-data/test/t1#P#p0.MYI hello/master-data/test/t1#P#p0.MYI
hello/master-data/test/t1.frm hello/master-data/test/t1.frm
......
...@@ -677,13 +677,12 @@ f_int1 f_int2 ...@@ -677,13 +677,12 @@ f_int1 f_int2
9 9 9 9
drop table t1; drop table t1;
create table t1 (a char(10) binary) create table t1 (a char(10) binary)
partition by list(length(a)) partition by list(ascii(a))
(partition p1 values in (1), (partition p1 values in (ascii('a')),
partition p2 values in (2), partition p2 values in (ascii('b')),
partition p3 values in (3), partition p3 values in (ascii('c')),
partition p4 values in (4), partition p4 values in (ascii('d')),
partition p5 values in (5) partition p5 values in (ascii('e')));
);
insert into t1 values ('a'),('bb'),('ccc'),('dddd'),('eeEee'); insert into t1 values ('a'),('bb'),('ccc'),('dddd'),('eeEee');
select * from t1 where a>='a' and a <= 'dddd'; select * from t1 where a>='a' and a <= 'dddd';
a a
...@@ -848,22 +847,57 @@ id select_type table partitions type possible_keys key key_len ref rows Extra ...@@ -848,22 +847,57 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
drop table t1; drop table t1;
create table t1 (a int) create table t1 (a int)
partition by range((a & 0xFF) << 56) ( partition by range(a) (
partition p0 values less than (0x40 << 56), partition p0 values less than (64),
partition p1 values less than (0x80 << 56), partition p1 values less than (128),
partition p2 values less than (0xFF << 56) partition p2 values less than (255)
);
create table t2 (a int)
partition by range(a+0) (
partition p0 values less than (64),
partition p1 values less than (128),
partition p2 values less than (255)
); );
insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE);
insert into t2 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE);
explain partitions select * from t1 where a=0; explain partitions select * from t1 where a=0;
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 2 Using where 1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t2 where a=0;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t2 p0 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t1 where a=0xFE; explain partitions select * from t1 where a=0xFE;
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p2 ALL NULL NULL NULL NULL 2 Using where 1 SIMPLE t1 p2 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t1 where a>0xFE and a<= 0xFF; explain partitions select * from t2 where a=0xFE;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t2 p2 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t1 where a > 0xFE AND a <= 0xFF;
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
explain partitions select * from t2 where a > 0xFE AND a <= 0xFF;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
explain partitions select * from t1 where a >= 0xFE AND a <= 0xFF;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p2 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t2 where a >= 0xFE AND a <= 0xFF;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t2 p2 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t1 where a < 64 AND a >= 63;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t2 where a < 64 AND a >= 63;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t2 p0 ALL NULL NULL NULL NULL 2 Using where
explain partitions select * from t1 where a <= 64 AND a >= 63;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p0,p1 ALL NULL NULL NULL NULL 4 Using where
explain partitions select * from t2 where a <= 64 AND a >= 63;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t2 p0,p1 ALL NULL NULL NULL NULL 4 Using where
drop table t1; drop table t1;
drop table t2;
create table t1(a bigint unsigned not null) partition by range(a+0) ( create table t1(a bigint unsigned not null) partition by range(a+0) (
partition p1 values less than (10), partition p1 values less than (10),
partition p2 values less than (20), partition p2 values less than (20),
......
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 (ascii(a) * b)
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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* ascii(a) * b)
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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 (ascii(b) * ascii(a))
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (40000));
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 (ascii(a) * ascii(b))
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (40000));
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 (ascii(a) * c)
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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 * ascii(a))
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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)
...@@ -109,7 +109,7 @@ id select_type table partitions type possible_keys key key_len ref rows Extra ...@@ -109,7 +109,7 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 pnull_pnullsp0,pnull_pnullsp1,p0_p0sp0,p0_p0sp1 ALL NULL NULL NULL NULL 4 Using where 1 SIMPLE t1 pnull_pnullsp0,pnull_pnullsp1,p0_p0sp0,p0_p0sp1 ALL NULL NULL NULL NULL 4 Using where
explain partitions select * from t1 where a > 1; explain partitions select * from t1 where a > 1;
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1_p1sp0,p1_p1sp1 ALL NULL NULL NULL NULL 2 Using where 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
...@@ -744,7 +744,7 @@ id select_type table partitions type possible_keys key key_len ref rows Extra ...@@ -744,7 +744,7 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p407,p408,p409,p507,p508,p509 ALL NULL NULL NULL NULL 18 Using where 1 SIMPLE t1 p407,p408,p409,p507,p508,p509 ALL NULL NULL NULL NULL 18 Using where
DROP TABLE t1; DROP TABLE t1;
create table t1 (a varchar(20)) create table t1 (a varchar(20))
partition by range (crc32(md5(a))) partition by range (ascii(a))
(partition p0 values less than (100), (partition p0 values less than (100),
partition p1 values less than maxvalue); partition p1 values less than maxvalue);
insert into t1 values ("12345678901234567890"); insert into t1 values ("12345678901234567890");
...@@ -761,16 +761,16 @@ B2345678901234567890 ...@@ -761,16 +761,16 @@ B2345678901234567890
1234567890123456 1234567890123456
explain partitions select * from t1 where a = "12345678901234567890"; explain partitions select * from t1 where a = "12345678901234567890";
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 5 Using where
explain partitions select * from t1 where a = "12345678901234567890" OR explain partitions select * from t1 where a = "12345678901234567890" OR
a = "A2345678901234567890" OR a = "A2345678901234567890" OR
a = "B2345678901234567890" OR a = "B2345678901234567890" OR
a = "C2345678901234567890"; a = "C2345678901234567890";
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 5 Using where
explain partitions select * from t1 where a = "01234567890123456"; explain partitions select * from t1 where a = "01234567890123456";
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 p0 ALL NULL NULL NULL NULL 5 Using where
select * from t1 where a = "01234567890123456"; select * from t1 where a = "01234567890123456";
a a
select * from t1 where a = "12345678901234567890" OR select * from t1 where a = "12345678901234567890" OR
......
-- source include/have_partition.inc
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 (a char(5) character set koi8r)
partition by list (ascii(a) mod 3)
subpartition by hash(ascii(a))
subpartitions 3
(partition p1 values in (1),
partition p2 values in (2),
partition p0 values in (0));
insert into t1 values ('a');
explain partitions select * from t1 where a = 'a';
select * from t1 where a = 'a';
drop table t1;
create table t1 (a char(5) character set cp1251)
partition by list (ascii(a)) (partition pn values in (null));
drop table t1;
create table t1 (col1 datetime)
partition by range(datediff(col1,col1))
(partition p0 values less than (10), partition p1 values less than (30));
drop table t1;
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (a char(5) character set big5)
partition by list (ascii(a)) (partition pn values in (null));
create table t1 (a char(1))
partition by list(ascii(a))
(partition p1 values in (ascii('i')));
#insert into t1 values ('i');
drop table t1;
create table t1 (s1 char(5) character set latin5)
partition by list (ascii(s1))
(partition p1 values in (1));
set names utf8;
#insert into tn values ('¿¿');
drop table t1;
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(greatest(col1,10))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(isnull(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(least(col1,12))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(case when col1>0 then 10 else 20 end)
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(ifnull(col1,5))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(nullif(col1,5))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(bit_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(bit_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(char_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(char_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(character_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(find_in_set(col1,1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(find_in_set(col1,'1'))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(instr(col1,3))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(instr(col1,'3'))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(locate(1,col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(locate(1,col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(octet_length(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(position(1 in col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(position(1 in col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 char(5))
partition by range(strcmp(col1,2))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(strcmp(col1,2))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(crc32(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(round(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(sign(col1))
(partition p0 values less than (2), partition p1 values less than (6));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 datetime)
partition by range(period_add(col1,5))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 datetime, col2 datetime)
partition by range(period_diff(col1,col2))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int, col2 int)
partition by range(period_diff(col1,col2))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 datetime)
partition by range(timestampdiff(day,5,col1))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 date)
partition by range(unix_timestamp(col1))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 datetime)
partition by range(week(col1))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 varchar(25))
partition by range(cast(col1 as signed))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 varchar(25))
partition by range(convert(col1,unsigned))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(col1 | 20)
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(col1 & 20)
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(col1 ^ 20)
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(col1 << 20)
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(col1 >> 20)
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(~col1)
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(bit_count(col1))
(partition p0 values less than (10), partition p1 values less than (30));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (col1 int)
partition by range(inet_aton(col1))
(partition p0 values less than (10), partition p1 values less than (30));
...@@ -19,3 +19,10 @@ flush tables; ...@@ -19,3 +19,10 @@ flush tables;
set names latin1; set names latin1;
select * from t1; select * from t1;
drop table t1; drop table t1;
create table t1 (a varchar(1), primary key (a))
partition by list (ascii(a))
(partition p1 values in (65));
insert into t1 values ('A');
replace into t1 values ('A');
drop table t1;
...@@ -33,7 +33,7 @@ partitions 2; ...@@ -33,7 +33,7 @@ partitions 2;
# #
# Partition by key list, wrong result type # Partition by key list, wrong result type
# #
--error ER_PARTITION_FUNC_NOT_ALLOWED_ERROR --error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
b int not null, b int not null,
...@@ -109,7 +109,7 @@ partitions 3 ...@@ -109,7 +109,7 @@ partitions 3
# #
# Partition by hash, invalid result type # Partition by hash, invalid result type
# #
--error ER_PARTITION_FUNC_NOT_ALLOWED_ERROR --error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
b int not null, b int not null,
...@@ -533,7 +533,7 @@ partitions 2 ...@@ -533,7 +533,7 @@ partitions 2
# #
# Partition by range, wrong result type of partition function # Partition by range, wrong result type of partition function
# #
--error ER_PARTITION_FUNC_NOT_ALLOWED_ERROR --error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
b int not null, b int not null,
...@@ -790,7 +790,7 @@ partition by hash (extract(hour from convert_tz(a, '+00:00', '+00:00'))); ...@@ -790,7 +790,7 @@ partition by hash (extract(hour from convert_tz(a, '+00:00', '+00:00')));
create table t1 (a int) create table t1 (a int)
partition by range (a + (select count(*) from t1)) partition by range (a + (select count(*) from t1))
(partition p1 values less than (1)); (partition p1 values less than (1));
-- error ER_PARTITION_FUNC_NOT_ALLOWED_ERROR -- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (a char(10)) create table t1 (a char(10))
partition by hash (extractvalue(a,'a')); partition by hash (extractvalue(a,'a'));
......
...@@ -9,18 +9,6 @@ ...@@ -9,18 +9,6 @@
drop table if exists t1; drop table if exists t1;
--enable_warnings --enable_warnings
#
# BUG 18198: Partition functions handling
#
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 ';
explain partitions select * from t1 where a='a';
explain partitions select * from t1 where a='a ' OR a='a';
drop table t1;
# #
# More partition pruning tests, especially on interval walking # More partition pruning tests, especially on interval walking
# #
......
...@@ -179,4 +179,8 @@ insert into t1 values (null); ...@@ -179,4 +179,8 @@ insert into t1 values (null);
select * from t1; select * from t1;
drop table t1; drop table t1;
--error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (a char(1))
partition by list (ascii(ucase(a)))
(partition p1 values in (2));
...@@ -20,7 +20,7 @@ subpartition sp01, subpartition sp02)); ...@@ -20,7 +20,7 @@ subpartition sp01, subpartition sp02));
drop table t1; drop table t1;
CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30)) CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30))
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2; PARTITION BY HASH(YEAR(f_date)) PARTITIONS 2;
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
--replace_result $MYSQLTEST_VARDIR "hello" --replace_result $MYSQLTEST_VARDIR "hello"
......
...@@ -539,13 +539,12 @@ drop table t1; ...@@ -539,13 +539,12 @@ drop table t1;
# part2: bug in pruning code # part2: bug in pruning code
create table t1 (a char(10) binary) create table t1 (a char(10) binary)
partition by list(length(a)) partition by list(ascii(a))
(partition p1 values in (1), (partition p1 values in (ascii('a')),
partition p2 values in (2), partition p2 values in (ascii('b')),
partition p3 values in (3), partition p3 values in (ascii('c')),
partition p4 values in (4), partition p4 values in (ascii('d')),
partition p5 values in (5) partition p5 values in (ascii('e')));
);
insert into t1 values ('a'),('bb'),('ccc'),('dddd'),('eeEee'); insert into t1 values ('a'),('bb'),('ccc'),('dddd'),('eeEee');
select * from t1 where a>='a' and a <= 'dddd'; select * from t1 where a>='a' and a <= 'dddd';
explain partitions select * from t1 where a>='a' and a <= 'dddd'; explain partitions select * from t1 where a>='a' and a <= 'dddd';
...@@ -692,19 +691,46 @@ explain partitions select * from t1 where a = 18446744073709551000; ...@@ -692,19 +691,46 @@ explain partitions select * from t1 where a = 18446744073709551000;
explain partitions select * from t1 where a = 18446744073709551613; explain partitions select * from t1 where a = 18446744073709551613;
explain partitions select * from t1 where a = 18446744073709551614; explain partitions select * from t1 where a = 18446744073709551614;
drop table t1; drop table t1;
#
# Test all variants of usage for interval_via_mapping
# and interval_via_walking
#
# t1 will use interval_via_mapping since it uses a
# monotonic function, whereas t2 will use
# interval_via_walking since the intervals are short
# and the function isn't monotonic (it is, but it isn't
# discovered in this version).
#
create table t1 (a int)
partition by range(a) (
partition p0 values less than (64),
partition p1 values less than (128),
partition p2 values less than (255)
);
create table t1 (a int) create table t2 (a int)
partition by range((a & 0xFF) << 56) ( partition by range(a+0) (
partition p0 values less than (0x40 << 56), partition p0 values less than (64),
partition p1 values less than (0x80 << 56), partition p1 values less than (128),
partition p2 values less than (0xFF << 56) partition p2 values less than (255)
); );
insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE);
insert into t2 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE);
explain partitions select * from t1 where a=0; explain partitions select * from t1 where a=0;
explain partitions select * from t2 where a=0;
explain partitions select * from t1 where a=0xFE; explain partitions select * from t1 where a=0xFE;
explain partitions select * from t1 where a>0xFE and a<= 0xFF; explain partitions select * from t2 where a=0xFE;
explain partitions select * from t1 where a > 0xFE AND a <= 0xFF;
explain partitions select * from t2 where a > 0xFE AND a <= 0xFF;
explain partitions select * from t1 where a >= 0xFE AND a <= 0xFF;
explain partitions select * from t2 where a >= 0xFE AND a <= 0xFF;
explain partitions select * from t1 where a < 64 AND a >= 63;
explain partitions select * from t2 where a < 64 AND a >= 63;
explain partitions select * from t1 where a <= 64 AND a >= 63;
explain partitions select * from t2 where a <= 64 AND a >= 63;
drop table t1; drop table t1;
drop table t2;
create table t1(a bigint unsigned not null) partition by range(a+0) ( create table t1(a bigint unsigned not null) partition by range(a+0) (
partition p1 values less than (10), partition p1 values less than (10),
......
...@@ -13,42 +13,42 @@ drop table if exists t1; ...@@ -13,42 +13,42 @@ drop table if exists t1;
# BUG 18198: Various tests for partition functions # BUG 18198: Various tests for partition functions
# #
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 (ascii(a) * b)
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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* ascii(a) * b)
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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 (ascii(b) * ascii(a))
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (40000));
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 (ascii(a) * ascii(b))
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (40000));
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 (ascii(a) * c)
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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 * ascii(a))
(partition p0 values less than (2), partition p1 values less than (400)); (partition p0 values less than (2), partition p1 values less than (4000));
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;
...@@ -734,7 +734,7 @@ DROP TABLE t1; ...@@ -734,7 +734,7 @@ DROP TABLE t1;
# Bug 18198: Try with a couple of cases using VARCHAR fields in # Bug 18198: Try with a couple of cases using VARCHAR fields in
# partition function. # partition function.
create table t1 (a varchar(20)) create table t1 (a varchar(20))
partition by range (crc32(md5(a))) partition by range (ascii(a))
(partition p0 values less than (100), (partition p0 values less than (100),
partition p1 values less than maxvalue); partition p1 values less than maxvalue);
......
...@@ -843,8 +843,7 @@ class Item { ...@@ -843,8 +843,7 @@ class Item {
german character for double s is equal to 2 s. german character for double s is equal to 2 s.
The default is that an item is not allowed The default is that an item is not allowed
in a partition function. However all mathematical functions, string in a partition function. Allowed functions
manipulation functions, date functions are allowed. Allowed functions
can never depend on server version, they cannot depend on anything can never depend on server version, they cannot depend on anything
related to the environment. They can also only depend on a set of related to the environment. They can also only depend on a set of
fields in the table itself. They cannot depend on other tables and fields in the table itself. They cannot depend on other tables and
...@@ -1628,6 +1627,7 @@ class Item_int :public Item_num ...@@ -1628,6 +1627,7 @@ class Item_int :public Item_num
uint decimal_precision() const uint decimal_precision() const
{ return (uint)(max_length - test(value < 0)); } { return (uint)(max_length - test(value < 0)); }
bool eq(const Item *, bool binary_cmp) const; bool eq(const Item *, bool binary_cmp) const;
bool check_partition_func_processor(byte *bool_arg) { return FALSE;}
}; };
...@@ -1645,6 +1645,7 @@ class Item_uint :public Item_int ...@@ -1645,6 +1645,7 @@ class Item_uint :public Item_int
void print(String *str); void print(String *str);
Item_num *neg (); Item_num *neg ();
uint decimal_precision() const { return max_length; } uint decimal_precision() const { return max_length; }
bool check_partition_func_processor(byte *bool_arg) { return FALSE;}
}; };
...@@ -1687,6 +1688,7 @@ class Item_decimal :public Item_num ...@@ -1687,6 +1688,7 @@ class Item_decimal :public Item_num
uint decimal_precision() const { return decimal_value.precision(); } uint decimal_precision() const { return decimal_value.precision(); }
bool eq(const Item *, bool binary_cmp) const; bool eq(const Item *, bool binary_cmp) const;
void set_decimal_value(my_decimal *value_par); void set_decimal_value(my_decimal *value_par);
bool check_partition_func_processor(byte *bool_arg) { return FALSE;}
}; };
...@@ -1747,7 +1749,6 @@ class Item_static_float_func :public Item_float ...@@ -1747,7 +1749,6 @@ class Item_static_float_func :public Item_float
{} {}
void print(String *str) { str->append(func_name); } void print(String *str) { str->append(func_name); }
Item *safe_charset_converter(CHARSET_INFO *tocs); Item *safe_charset_converter(CHARSET_INFO *tocs);
bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
}; };
...@@ -1856,7 +1857,6 @@ class Item_partition_func_safe_string: public Item_string ...@@ -1856,7 +1857,6 @@ class Item_partition_func_safe_string: public Item_string
CHARSET_INFO *cs= NULL): CHARSET_INFO *cs= NULL):
Item_string(name, length, cs) Item_string(name, length, cs)
{} {}
bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
}; };
...@@ -1904,7 +1904,6 @@ class Item_return_int :public Item_int ...@@ -1904,7 +1904,6 @@ class Item_return_int :public Item_int
unsigned_flag=1; unsigned_flag=1;
} }
enum_field_types field_type() const { return int_field_type; } enum_field_types field_type() const { return int_field_type; }
bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
}; };
...@@ -2230,7 +2229,6 @@ class Item_int_with_ref :public Item_int ...@@ -2230,7 +2229,6 @@ class Item_int_with_ref :public Item_int
} }
Item *clone_item(); Item *clone_item();
virtual Item *real_item() { return ref; } virtual Item *real_item() { return ref; }
bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
}; };
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
......
...@@ -355,7 +355,6 @@ class Item_bool_rowready_func2 :public Item_bool_func2 ...@@ -355,7 +355,6 @@ class Item_bool_rowready_func2 :public Item_bool_func2
} }
Item *neg_transformer(THD *thd); Item *neg_transformer(THD *thd);
virtual Item *negated_item(); virtual Item *negated_item();
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
bool subst_argument_checker(uchar **arg) { return TRUE; } bool subst_argument_checker(uchar **arg) { return TRUE; }
}; };
...@@ -367,7 +366,6 @@ class Item_func_not :public Item_bool_func ...@@ -367,7 +366,6 @@ class Item_func_not :public Item_bool_func
enum Functype functype() const { return NOT_FUNC; } enum Functype functype() const { return NOT_FUNC; }
const char *func_name() const { return "not"; } const char *func_name() const { return "not"; }
Item *neg_transformer(THD *thd); Item *neg_transformer(THD *thd);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
void print(String *str); void print(String *str);
}; };
...@@ -598,7 +596,6 @@ class Item_func_between :public Item_func_opt_neg ...@@ -598,7 +596,6 @@ class Item_func_between :public Item_func_opt_neg
bool is_bool_func() { return 1; } bool is_bool_func() { return 1; }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
uint decimal_precision() const { return 1; } uint decimal_precision() const { return 1; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -610,7 +607,6 @@ class Item_func_strcmp :public Item_bool_func2 ...@@ -610,7 +607,6 @@ class Item_func_strcmp :public Item_bool_func2
optimize_type select_optimize() const { return OPTIMIZE_NONE; } optimize_type select_optimize() const { return OPTIMIZE_NONE; }
const char *func_name() const { return "strcmp"; } const char *func_name() const { return "strcmp"; }
void print(String *str) { Item_func::print(str); } void print(String *str) { Item_func::print(str); }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -673,7 +669,6 @@ class Item_func_ifnull :public Item_func_coalesce ...@@ -673,7 +669,6 @@ class Item_func_ifnull :public Item_func_coalesce
const char *func_name() const { return "ifnull"; } const char *func_name() const { return "ifnull"; }
Field *tmp_table_field(TABLE *table); Field *tmp_table_field(TABLE *table);
uint decimal_precision() const; uint decimal_precision() const;
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -714,7 +709,6 @@ class Item_func_nullif :public Item_bool_func2 ...@@ -714,7 +709,6 @@ class Item_func_nullif :public Item_bool_func2
void print(String *str) { Item_func::print(str); } void print(String *str) { Item_func::print(str); }
table_map not_null_tables() const { return 0; } table_map not_null_tables() const { return 0; }
bool is_null(); bool is_null();
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
/* Functions to handle the optimized IN */ /* Functions to handle the optimized IN */
...@@ -1141,7 +1135,6 @@ class Item_func_case :public Item_func ...@@ -1141,7 +1135,6 @@ class Item_func_case :public Item_func
void print(String *str); void print(String *str);
Item *find_item(String *str); Item *find_item(String *str);
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
bool check_partition_func_processor(uchar *bool_arg) { return FALSE;}
void cleanup() void cleanup()
{ {
uint i; uint i;
...@@ -1222,7 +1215,6 @@ class Item_func_in :public Item_func_opt_neg ...@@ -1222,7 +1215,6 @@ class Item_func_in :public Item_func_opt_neg
bool nulls_in_row(); bool nulls_in_row();
bool is_bool_func() { return 1; } bool is_bool_func() { return 1; }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class cmp_item_row :public cmp_item class cmp_item_row :public cmp_item
...@@ -1294,7 +1286,6 @@ class Item_func_isnull :public Item_bool_func ...@@ -1294,7 +1286,6 @@ class Item_func_isnull :public Item_bool_func
optimize_type select_optimize() const { return OPTIMIZE_NULL; } optimize_type select_optimize() const { return OPTIMIZE_NULL; }
Item *neg_transformer(THD *thd); Item *neg_transformer(THD *thd);
CHARSET_INFO *compare_collation() { return args[0]->collation.collation; } CHARSET_INFO *compare_collation() { return args[0]->collation.collation; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
/* Functions used by HAVING for rewriting IN subquery */ /* Functions used by HAVING for rewriting IN subquery */
...@@ -1321,7 +1312,6 @@ class Item_is_not_null_test :public Item_func_isnull ...@@ -1321,7 +1312,6 @@ class Item_is_not_null_test :public Item_func_isnull
*/ */
table_map used_tables() const table_map used_tables() const
{ return used_tables_cache | RAND_TABLE_BIT; } { return used_tables_cache | RAND_TABLE_BIT; }
bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
}; };
...@@ -1344,7 +1334,6 @@ class Item_func_isnotnull :public Item_bool_func ...@@ -1344,7 +1334,6 @@ class Item_func_isnotnull :public Item_bool_func
void print(String *str); void print(String *str);
CHARSET_INFO *compare_collation() { return args[0]->collation.collation; } CHARSET_INFO *compare_collation() { return args[0]->collation.collation; }
void top_level_item() { abort_on_null=1; } void top_level_item() { abort_on_null=1; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -1383,7 +1372,6 @@ class Item_func_like :public Item_bool_func2 ...@@ -1383,7 +1372,6 @@ class Item_func_like :public Item_bool_func2
const char *func_name() const { return "like"; } const char *func_name() const { return "like"; }
bool fix_fields(THD *thd, Item **ref); bool fix_fields(THD *thd, Item **ref);
void cleanup(); void cleanup();
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
#ifdef USE_REGEX #ifdef USE_REGEX
...@@ -1406,7 +1394,6 @@ class Item_func_regex :public Item_bool_func ...@@ -1406,7 +1394,6 @@ class Item_func_regex :public Item_bool_func
const char *func_name() const { return "regexp"; } const char *func_name() const { return "regexp"; }
void print(String *str) { print_op(str); } void print(String *str) { print_op(str); }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
#else #else
...@@ -1463,7 +1450,6 @@ class Item_cond :public Item_bool_func ...@@ -1463,7 +1450,6 @@ class Item_cond :public Item_bool_func
Item *transform(Item_transformer transformer, uchar *arg); Item *transform(Item_transformer transformer, uchar *arg);
void traverse_cond(Cond_traverser, void *arg, traverse_order order); void traverse_cond(Cond_traverser, void *arg, traverse_order order);
void neg_arguments(THD *thd); void neg_arguments(THD *thd);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
bool subst_argument_checker(uchar **arg) { return TRUE; } bool subst_argument_checker(uchar **arg) { return TRUE; }
Item *compile(Item_analyzer analyzer, uchar **arg_p, Item *compile(Item_analyzer analyzer, uchar **arg_p,
Item_transformer transformer, uchar *arg_t); Item_transformer transformer, uchar *arg_t);
......
...@@ -253,7 +253,6 @@ class Item_func_num1: public Item_func_numhybrid ...@@ -253,7 +253,6 @@ class Item_func_num1: public Item_func_numhybrid
void fix_num_length_and_dec(); void fix_num_length_and_dec();
void find_num_type(); void find_num_type();
String *str_op(String *str) { DBUG_ASSERT(0); return 0; } String *str_op(String *str) { DBUG_ASSERT(0); return 0; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -311,7 +310,6 @@ class Item_func_signed :public Item_int_func ...@@ -311,7 +310,6 @@ class Item_func_signed :public Item_int_func
{ max_length=args[0]->max_length; unsigned_flag=0; } { max_length=args[0]->max_length; unsigned_flag=0; }
void print(String *str); void print(String *str);
uint decimal_precision() const { return args[0]->decimal_precision(); } uint decimal_precision() const { return args[0]->decimal_precision(); }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -345,7 +343,6 @@ class Item_decimal_typecast :public Item_func ...@@ -345,7 +343,6 @@ class Item_decimal_typecast :public Item_func
void fix_length_and_dec() {}; void fix_length_and_dec() {};
const char *func_name() const { return "decimal_typecast"; } const char *func_name() const { return "decimal_typecast"; }
void print(String *); void print(String *);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -442,6 +439,7 @@ class Item_func_neg :public Item_func_num1 ...@@ -442,6 +439,7 @@ class Item_func_neg :public Item_func_num1
void fix_length_and_dec(); void fix_length_and_dec();
void fix_num_length_and_dec(); void fix_num_length_and_dec();
uint decimal_precision() const { return args[0]->decimal_precision(); } uint decimal_precision() const { return args[0]->decimal_precision(); }
bool check_partition_func_processor(byte *int_arg) {return FALSE;}
}; };
...@@ -454,6 +452,7 @@ class Item_func_abs :public Item_func_num1 ...@@ -454,6 +452,7 @@ class Item_func_abs :public Item_func_num1
my_decimal *decimal_op(my_decimal *); my_decimal *decimal_op(my_decimal *);
const char *func_name() const { return "abs"; } const char *func_name() const { return "abs"; }
void fix_length_and_dec(); void fix_length_and_dec();
bool check_partition_func_processor(byte *int_arg) {return FALSE;}
}; };
// A class to handle logarithmic and trigonometric functions // A class to handle logarithmic and trigonometric functions
...@@ -488,7 +487,6 @@ class Item_func_exp :public Item_dec_func ...@@ -488,7 +487,6 @@ class Item_func_exp :public Item_dec_func
Item_func_exp(Item *a) :Item_dec_func(a) {} Item_func_exp(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "exp"; } const char *func_name() const { return "exp"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -498,7 +496,6 @@ class Item_func_ln :public Item_dec_func ...@@ -498,7 +496,6 @@ class Item_func_ln :public Item_dec_func
Item_func_ln(Item *a) :Item_dec_func(a) {} Item_func_ln(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "ln"; } const char *func_name() const { return "ln"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -509,7 +506,6 @@ class Item_func_log :public Item_dec_func ...@@ -509,7 +506,6 @@ class Item_func_log :public Item_dec_func
Item_func_log(Item *a,Item *b) :Item_dec_func(a,b) {} Item_func_log(Item *a,Item *b) :Item_dec_func(a,b) {}
double val_real(); double val_real();
const char *func_name() const { return "log"; } const char *func_name() const { return "log"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -519,7 +515,6 @@ class Item_func_log2 :public Item_dec_func ...@@ -519,7 +515,6 @@ class Item_func_log2 :public Item_dec_func
Item_func_log2(Item *a) :Item_dec_func(a) {} Item_func_log2(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "log2"; } const char *func_name() const { return "log2"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -529,7 +524,6 @@ class Item_func_log10 :public Item_dec_func ...@@ -529,7 +524,6 @@ class Item_func_log10 :public Item_dec_func
Item_func_log10(Item *a) :Item_dec_func(a) {} Item_func_log10(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "log10"; } const char *func_name() const { return "log10"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -539,7 +533,6 @@ class Item_func_sqrt :public Item_dec_func ...@@ -539,7 +533,6 @@ class Item_func_sqrt :public Item_dec_func
Item_func_sqrt(Item *a) :Item_dec_func(a) {} Item_func_sqrt(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "sqrt"; } const char *func_name() const { return "sqrt"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -549,7 +542,6 @@ class Item_func_pow :public Item_dec_func ...@@ -549,7 +542,6 @@ class Item_func_pow :public Item_dec_func
Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {} Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {}
double val_real(); double val_real();
const char *func_name() const { return "pow"; } const char *func_name() const { return "pow"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -559,7 +551,6 @@ class Item_func_acos :public Item_dec_func ...@@ -559,7 +551,6 @@ class Item_func_acos :public Item_dec_func
Item_func_acos(Item *a) :Item_dec_func(a) {} Item_func_acos(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "acos"; } const char *func_name() const { return "acos"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_asin :public Item_dec_func class Item_func_asin :public Item_dec_func
...@@ -568,7 +559,6 @@ class Item_func_asin :public Item_dec_func ...@@ -568,7 +559,6 @@ class Item_func_asin :public Item_dec_func
Item_func_asin(Item *a) :Item_dec_func(a) {} Item_func_asin(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "asin"; } const char *func_name() const { return "asin"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_atan :public Item_dec_func class Item_func_atan :public Item_dec_func
...@@ -578,7 +568,6 @@ class Item_func_atan :public Item_dec_func ...@@ -578,7 +568,6 @@ class Item_func_atan :public Item_dec_func
Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {} Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {}
double val_real(); double val_real();
const char *func_name() const { return "atan"; } const char *func_name() const { return "atan"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_cos :public Item_dec_func class Item_func_cos :public Item_dec_func
...@@ -587,7 +576,6 @@ class Item_func_cos :public Item_dec_func ...@@ -587,7 +576,6 @@ class Item_func_cos :public Item_dec_func
Item_func_cos(Item *a) :Item_dec_func(a) {} Item_func_cos(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "cos"; } const char *func_name() const { return "cos"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_sin :public Item_dec_func class Item_func_sin :public Item_dec_func
...@@ -596,7 +584,6 @@ class Item_func_sin :public Item_dec_func ...@@ -596,7 +584,6 @@ class Item_func_sin :public Item_dec_func
Item_func_sin(Item *a) :Item_dec_func(a) {} Item_func_sin(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "sin"; } const char *func_name() const { return "sin"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_tan :public Item_dec_func class Item_func_tan :public Item_dec_func
...@@ -605,7 +592,6 @@ class Item_func_tan :public Item_dec_func ...@@ -605,7 +592,6 @@ class Item_func_tan :public Item_dec_func
Item_func_tan(Item *a) :Item_dec_func(a) {} Item_func_tan(Item *a) :Item_dec_func(a) {}
double val_real(); double val_real();
const char *func_name() const { return "tan"; } const char *func_name() const { return "tan"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_integer :public Item_int_func class Item_func_integer :public Item_int_func
...@@ -633,6 +619,7 @@ class Item_func_ceiling :public Item_func_int_val ...@@ -633,6 +619,7 @@ class Item_func_ceiling :public Item_func_int_val
longlong int_op(); longlong int_op();
double real_op(); double real_op();
my_decimal *decimal_op(my_decimal *); my_decimal *decimal_op(my_decimal *);
bool check_partition_func_processor(byte *int_arg) {return FALSE;}
}; };
...@@ -644,6 +631,7 @@ class Item_func_floor :public Item_func_int_val ...@@ -644,6 +631,7 @@ class Item_func_floor :public Item_func_int_val
longlong int_op(); longlong int_op();
double real_op(); double real_op();
my_decimal *decimal_op(my_decimal *); my_decimal *decimal_op(my_decimal *);
bool check_partition_func_processor(byte *int_arg) {return FALSE;}
}; };
/* This handles round and truncate */ /* This handles round and truncate */
...@@ -684,7 +672,6 @@ class Item_func_sign :public Item_int_func ...@@ -684,7 +672,6 @@ class Item_func_sign :public Item_int_func
Item_func_sign(Item *a) :Item_int_func(a) {} Item_func_sign(Item *a) :Item_int_func(a) {}
const char *func_name() const { return "sign"; } const char *func_name() const { return "sign"; }
longlong val_int(); longlong val_int();
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -699,7 +686,6 @@ class Item_func_units :public Item_real_func ...@@ -699,7 +686,6 @@ class Item_func_units :public Item_real_func
const char *func_name() const { return name; } const char *func_name() const { return name; }
void fix_length_and_dec() void fix_length_and_dec()
{ decimals= NOT_FIXED_DEC; max_length= float_length(decimals); } { decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -725,7 +711,6 @@ class Item_func_min_max :public Item_func ...@@ -725,7 +711,6 @@ class Item_func_min_max :public Item_func
void fix_length_and_dec(); void fix_length_and_dec();
enum Item_result result_type () const { return cmp_type; } enum Item_result result_type () const { return cmp_type; }
bool result_as_longlong() { return compare_as_dates; }; bool result_as_longlong() { return compare_as_dates; };
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
uint cmp_datetimes(ulonglong *value); uint cmp_datetimes(ulonglong *value);
}; };
...@@ -781,7 +766,6 @@ class Item_func_length :public Item_int_func ...@@ -781,7 +766,6 @@ class Item_func_length :public Item_int_func
longlong val_int(); longlong val_int();
const char *func_name() const { return "length"; } const char *func_name() const { return "length"; }
void fix_length_and_dec() { max_length=10; } void fix_length_and_dec() { max_length=10; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_bit_length :public Item_func_length class Item_func_bit_length :public Item_func_length
...@@ -801,7 +785,6 @@ class Item_func_char_length :public Item_int_func ...@@ -801,7 +785,6 @@ class Item_func_char_length :public Item_int_func
longlong val_int(); longlong val_int();
const char *func_name() const { return "char_length"; } const char *func_name() const { return "char_length"; }
void fix_length_and_dec() { max_length=10; } void fix_length_and_dec() { max_length=10; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_coercibility :public Item_int_func class Item_func_coercibility :public Item_int_func
...@@ -825,7 +808,6 @@ class Item_func_locate :public Item_int_func ...@@ -825,7 +808,6 @@ class Item_func_locate :public Item_int_func
longlong val_int(); longlong val_int();
void fix_length_and_dec(); void fix_length_and_dec();
void print(String *str); void print(String *str);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -860,7 +842,6 @@ class Item_func_ord :public Item_int_func ...@@ -860,7 +842,6 @@ class Item_func_ord :public Item_int_func
Item_func_ord(Item *a) :Item_int_func(a) {} Item_func_ord(Item *a) :Item_int_func(a) {}
longlong val_int(); longlong val_int();
const char *func_name() const { return "ord"; } const char *func_name() const { return "ord"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_find_in_set :public Item_int_func class Item_func_find_in_set :public Item_int_func
...@@ -874,7 +855,6 @@ class Item_func_find_in_set :public Item_int_func ...@@ -874,7 +855,6 @@ class Item_func_find_in_set :public Item_int_func
longlong val_int(); longlong val_int();
const char *func_name() const { return "find_in_set"; } const char *func_name() const { return "find_in_set"; }
void fix_length_and_dec(); void fix_length_and_dec();
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
/* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */ /* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */
...@@ -886,7 +866,6 @@ class Item_func_bit: public Item_int_func ...@@ -886,7 +866,6 @@ class Item_func_bit: public Item_int_func
Item_func_bit(Item *a) :Item_int_func(a) {} Item_func_bit(Item *a) :Item_int_func(a) {}
void fix_length_and_dec() { unsigned_flag= 1; } void fix_length_and_dec() { unsigned_flag= 1; }
void print(String *str) { print_op(str); } void print(String *str) { print_op(str); }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_bit_or :public Item_func_bit class Item_func_bit_or :public Item_func_bit
...@@ -912,7 +891,6 @@ class Item_func_bit_count :public Item_int_func ...@@ -912,7 +891,6 @@ class Item_func_bit_count :public Item_int_func
longlong val_int(); longlong val_int();
const char *func_name() const { return "bit_count"; } const char *func_name() const { return "bit_count"; }
void fix_length_and_dec() { max_length=2; } void fix_length_and_dec() { max_length=2; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_shift_left :public Item_func_bit class Item_func_shift_left :public Item_func_bit
...@@ -1363,7 +1341,6 @@ class Item_func_inet_aton : public Item_int_func ...@@ -1363,7 +1341,6 @@ class Item_func_inet_aton : public Item_int_func
longlong val_int(); longlong val_int();
const char *func_name() const { return "inet_aton"; } const char *func_name() const { return "inet_aton"; }
void fix_length_and_dec() { decimals= 0; max_length= 21; maybe_null= 1; unsigned_flag= 1;} void fix_length_and_dec() { decimals= 0; max_length= 21; maybe_null= 1; unsigned_flag= 1;}
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
......
...@@ -50,7 +50,6 @@ class Item_func_md5 :public Item_str_func ...@@ -50,7 +50,6 @@ class Item_func_md5 :public Item_str_func
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "md5"; } const char *func_name() const { return "md5"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -94,7 +93,6 @@ class Item_func_concat :public Item_str_func ...@@ -94,7 +93,6 @@ class Item_func_concat :public Item_str_func
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "concat"; } const char *func_name() const { return "concat"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_concat_ws :public Item_str_func class Item_func_concat_ws :public Item_str_func
...@@ -116,7 +114,6 @@ class Item_func_reverse :public Item_str_func ...@@ -116,7 +114,6 @@ class Item_func_reverse :public Item_str_func
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "reverse"; } const char *func_name() const { return "reverse"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -154,7 +151,6 @@ class Item_str_conv :public Item_str_func ...@@ -154,7 +151,6 @@ class Item_str_conv :public Item_str_func
public: public:
Item_str_conv(Item *item) :Item_str_func(item) {} Item_str_conv(Item *item) :Item_str_func(item) {}
String *val_str(String *); String *val_str(String *);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -455,7 +451,6 @@ class Item_func_soundex :public Item_str_func ...@@ -455,7 +451,6 @@ class Item_func_soundex :public Item_str_func
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "soundex"; } const char *func_name() const { return "soundex"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -549,7 +544,6 @@ class Item_func_rpad :public Item_str_func ...@@ -549,7 +544,6 @@ class Item_func_rpad :public Item_str_func
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "rpad"; } const char *func_name() const { return "rpad"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -562,7 +556,6 @@ class Item_func_lpad :public Item_str_func ...@@ -562,7 +556,6 @@ class Item_func_lpad :public Item_str_func
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "lpad"; } const char *func_name() const { return "lpad"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -577,7 +570,6 @@ class Item_func_conv :public Item_str_func ...@@ -577,7 +570,6 @@ class Item_func_conv :public Item_str_func
collation.set(default_charset()); collation.set(default_charset());
max_length= 64; max_length= 64;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -594,7 +586,6 @@ class Item_func_hex :public Item_str_func ...@@ -594,7 +586,6 @@ class Item_func_hex :public Item_str_func
decimals=0; decimals=0;
max_length=args[0]->max_length*2*collation.collation->mbmaxlen; max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_unhex :public Item_str_func class Item_func_unhex :public Item_str_func
...@@ -614,7 +605,6 @@ class Item_func_unhex :public Item_str_func ...@@ -614,7 +605,6 @@ class Item_func_unhex :public Item_str_func
decimals=0; decimals=0;
max_length=(1+args[0]->max_length)/2; max_length=(1+args[0]->max_length)/2;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -638,7 +628,6 @@ class Item_func_binary :public Item_str_func ...@@ -638,7 +628,6 @@ class Item_func_binary :public Item_str_func
} }
void print(String *str); void print(String *str);
const char *func_name() const { return "cast_as_binary"; } const char *func_name() const { return "cast_as_binary"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -678,7 +667,6 @@ class Item_func_inet_ntoa : public Item_str_func ...@@ -678,7 +667,6 @@ class Item_func_inet_ntoa : public Item_str_func
String* val_str(String* str); String* val_str(String* str);
const char *func_name() const { return "inet_ntoa"; } const char *func_name() const { return "inet_ntoa"; }
void fix_length_and_dec() { decimals = 0; max_length=3*8+7; } void fix_length_and_dec() { decimals = 0; max_length=3*8+7; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_quote :public Item_str_func class Item_func_quote :public Item_str_func
...@@ -693,7 +681,6 @@ class Item_func_quote :public Item_str_func ...@@ -693,7 +681,6 @@ class Item_func_quote :public Item_str_func
collation.set(args[0]->collation); collation.set(args[0]->collation);
max_length= args[0]->max_length * 2 + 2; max_length= args[0]->max_length * 2 + 2;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_conv_charset :public Item_str_func class Item_func_conv_charset :public Item_str_func
...@@ -794,7 +781,6 @@ class Item_func_crc32 :public Item_int_func ...@@ -794,7 +781,6 @@ class Item_func_crc32 :public Item_int_func
const char *func_name() const { return "crc32"; } const char *func_name() const { return "crc32"; }
void fix_length_and_dec() { max_length=10; } void fix_length_and_dec() { max_length=10; }
longlong val_int(); longlong val_int();
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_uncompressed_length : public Item_int_func class Item_func_uncompressed_length : public Item_int_func
......
...@@ -38,7 +38,6 @@ class Item_func_period_add :public Item_int_func ...@@ -38,7 +38,6 @@ class Item_func_period_add :public Item_int_func
{ {
max_length=6*MY_CHARSET_BIN_MB_MAXLEN; max_length=6*MY_CHARSET_BIN_MB_MAXLEN;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -53,7 +52,6 @@ class Item_func_period_diff :public Item_int_func ...@@ -53,7 +52,6 @@ class Item_func_period_diff :public Item_int_func
decimals=0; decimals=0;
max_length=6*MY_CHARSET_BIN_MB_MAXLEN; max_length=6*MY_CHARSET_BIN_MB_MAXLEN;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -129,6 +127,7 @@ class Item_func_monthname :public Item_func_month ...@@ -129,6 +127,7 @@ class Item_func_monthname :public Item_func_month
max_length=10*my_charset_bin.mbmaxlen; max_length=10*my_charset_bin.mbmaxlen;
maybe_null=1; maybe_null=1;
} }
bool check_partition_func_processor(byte *int_arg) {return TRUE;}
}; };
...@@ -224,7 +223,6 @@ class Item_func_week :public Item_int_func ...@@ -224,7 +223,6 @@ class Item_func_week :public Item_int_func
max_length=2*MY_CHARSET_BIN_MB_MAXLEN; max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1; maybe_null=1;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_yearweek :public Item_int_func class Item_func_yearweek :public Item_int_func
...@@ -303,6 +301,7 @@ class Item_func_dayname :public Item_func_weekday ...@@ -303,6 +301,7 @@ class Item_func_dayname :public Item_func_weekday
max_length=9*MY_CHARSET_BIN_MB_MAXLEN; max_length=9*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1; maybe_null=1;
} }
bool check_partition_func_processor(byte *int_arg) {return TRUE;}
}; };
...@@ -319,7 +318,6 @@ class Item_func_unix_timestamp :public Item_int_func ...@@ -319,7 +318,6 @@ class Item_func_unix_timestamp :public Item_int_func
decimals=0; decimals=0;
max_length=10*MY_CHARSET_BIN_MB_MAXLEN; max_length=10*MY_CHARSET_BIN_MB_MAXLEN;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -603,7 +601,6 @@ class Item_func_date_format :public Item_str_func ...@@ -603,7 +601,6 @@ class Item_func_date_format :public Item_str_func
void fix_length_and_dec(); void fix_length_and_dec();
uint format_length(const String *format); uint format_length(const String *format);
bool eq(const Item *item, bool binary_cmp) const; bool eq(const Item *item, bool binary_cmp) const;
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -617,7 +614,6 @@ class Item_func_from_unixtime :public Item_date_func ...@@ -617,7 +614,6 @@ class Item_func_from_unixtime :public Item_date_func
const char *func_name() const { return "from_unixtime"; } const char *func_name() const { return "from_unixtime"; }
void fix_length_and_dec(); void fix_length_and_dec();
bool get_date(MYSQL_TIME *res, uint fuzzy_date); bool get_date(MYSQL_TIME *res, uint fuzzy_date);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -676,7 +672,6 @@ class Item_func_sec_to_time :public Item_str_timefunc ...@@ -676,7 +672,6 @@ class Item_func_sec_to_time :public Item_str_timefunc
} }
const char *func_name() const { return "sec_to_time"; } const char *func_name() const { return "sec_to_time"; }
bool result_as_longlong() { return TRUE; } bool result_as_longlong() { return TRUE; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -698,7 +693,6 @@ class Item_date_add_interval :public Item_date_func ...@@ -698,7 +693,6 @@ class Item_date_add_interval :public Item_date_func
bool get_date(MYSQL_TIME *res, uint fuzzy_date); bool get_date(MYSQL_TIME *res, uint fuzzy_date);
bool eq(const Item *item, bool binary_cmp) const; bool eq(const Item *item, bool binary_cmp) const;
void print(String *str); void print(String *str);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -753,7 +747,6 @@ class Item_typecast_maybe_null :public Item_typecast ...@@ -753,7 +747,6 @@ class Item_typecast_maybe_null :public Item_typecast
max_length=args[0]->max_length; max_length=args[0]->max_length;
maybe_null= 1; maybe_null= 1;
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -773,7 +766,6 @@ class Item_char_typecast :public Item_typecast ...@@ -773,7 +766,6 @@ class Item_char_typecast :public Item_typecast
String *val_str(String *a); String *val_str(String *a);
void fix_length_and_dec(); void fix_length_and_dec();
void print(String *str); void print(String *str);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -884,7 +876,6 @@ class Item_func_makedate :public Item_date_func ...@@ -884,7 +876,6 @@ class Item_func_makedate :public Item_date_func
max_length=MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; max_length=MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
} }
longlong val_int(); longlong val_int();
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -907,7 +898,6 @@ class Item_func_add_time :public Item_str_func ...@@ -907,7 +898,6 @@ class Item_func_add_time :public Item_str_func
} }
void print(String *str); void print(String *str);
const char *func_name() const { return "add_time"; } const char *func_name() const { return "add_time"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
double val_real() { return val_real_from_decimal(); } double val_real() { return val_real_from_decimal(); }
my_decimal *val_decimal(my_decimal *decimal_value) my_decimal *val_decimal(my_decimal *decimal_value)
{ {
...@@ -949,7 +939,6 @@ class Item_func_maketime :public Item_str_timefunc ...@@ -949,7 +939,6 @@ class Item_func_maketime :public Item_str_timefunc
:Item_str_timefunc(a, b ,c) {} :Item_str_timefunc(a, b ,c) {}
String *val_str(String *str); String *val_str(String *str);
const char *func_name() const { return "maketime"; } const char *func_name() const { return "maketime"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
class Item_func_microsecond :public Item_int_func class Item_func_microsecond :public Item_int_func
...@@ -981,7 +970,6 @@ class Item_func_timestamp_diff :public Item_int_func ...@@ -981,7 +970,6 @@ class Item_func_timestamp_diff :public Item_int_func
maybe_null=1; maybe_null=1;
} }
void print(String *str); void print(String *str);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
...@@ -1028,7 +1016,6 @@ class Item_func_str_to_date :public Item_str_func ...@@ -1028,7 +1016,6 @@ class Item_func_str_to_date :public Item_str_func
{ {
return tmp_table_field_from_field_type(table, 1); return tmp_table_field_from_field_type(table, 1);
} }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
......
...@@ -41,7 +41,6 @@ class Item_func_xml_extractvalue: public Item_xml_str_func ...@@ -41,7 +41,6 @@ class Item_func_xml_extractvalue: public Item_xml_str_func
Item_func_xml_extractvalue(Item *a,Item *b) :Item_xml_str_func(a,b) {} Item_func_xml_extractvalue(Item *a,Item *b) :Item_xml_str_func(a,b) {}
const char *func_name() const { return "extractvalue"; } const char *func_name() const { return "extractvalue"; }
String *val_str(String *); String *val_str(String *);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
}; };
......
...@@ -905,7 +905,6 @@ bool partition_info::set_up_charset_field_preps() ...@@ -905,7 +905,6 @@ bool partition_info::set_up_charset_field_preps()
Field *field, **ptr; Field *field, **ptr;
uchar **char_ptrs; uchar **char_ptrs;
unsigned i; unsigned i;
bool found;
size_t size; size_t size;
uint tot_fields= 0; uint tot_fields= 0;
uint tot_part_fields= 0; uint tot_part_fields= 0;
...@@ -918,7 +917,6 @@ bool partition_info::set_up_charset_field_preps() ...@@ -918,7 +917,6 @@ bool partition_info::set_up_charset_field_preps()
{ {
ptr= part_field_array; ptr= part_field_array;
/* Set up arrays and buffers for those fields */ /* Set up arrays and buffers for those fields */
i= 0;
while ((field= *(ptr++))) while ((field= *(ptr++)))
{ {
if (field_is_partition_charset(field)) if (field_is_partition_charset(field))
...@@ -954,7 +952,7 @@ bool partition_info::set_up_charset_field_preps() ...@@ -954,7 +952,7 @@ bool partition_info::set_up_charset_field_preps()
} }
part_charset_field_array[i]= NULL; part_charset_field_array[i]= NULL;
} }
if (is_sub_partitioned() && list_of_subpart_fields && if (is_sub_partitioned() && !list_of_subpart_fields &&
check_part_func_fields(subpart_field_array, FALSE)) check_part_func_fields(subpart_field_array, FALSE))
{ {
/* Set up arrays and buffers for those fields */ /* Set up arrays and buffers for those fields */
...@@ -962,7 +960,10 @@ bool partition_info::set_up_charset_field_preps() ...@@ -962,7 +960,10 @@ bool partition_info::set_up_charset_field_preps()
while ((field= *(ptr++))) while ((field= *(ptr++)))
{ {
if (field_is_partition_charset(field)) if (field_is_partition_charset(field))
{
tot_subpart_fields++; tot_subpart_fields++;
tot_fields++;
}
} }
size= tot_subpart_fields * sizeof(char*); size= tot_subpart_fields * sizeof(char*);
if (!(char_ptrs= (uchar**) sql_calloc(size))) if (!(char_ptrs= (uchar**) sql_calloc(size)))
...@@ -975,10 +976,10 @@ bool partition_info::set_up_charset_field_preps() ...@@ -975,10 +976,10 @@ bool partition_info::set_up_charset_field_preps()
if (!(char_ptrs= (uchar**) sql_alloc(size))) if (!(char_ptrs= (uchar**) sql_alloc(size)))
goto error; goto error;
subpart_charset_field_array= (Field**)char_ptrs; subpart_charset_field_array= (Field**)char_ptrs;
ptr= subpart_field_array;
i= 0; i= 0;
while ((field= *(ptr++))) while ((field= *(ptr++)))
{ {
unsigned j= 0;
CHARSET_INFO *cs; CHARSET_INFO *cs;
uchar *field_buf; uchar *field_buf;
LINT_INIT(field_buf); LINT_INIT(field_buf);
...@@ -987,28 +988,16 @@ bool partition_info::set_up_charset_field_preps() ...@@ -987,28 +988,16 @@ bool partition_info::set_up_charset_field_preps()
continue; continue;
cs= ((Field_str*)field)->charset(); cs= ((Field_str*)field)->charset();
size= field->pack_length(); size= field->pack_length();
found= FALSE;
for (j= 0; j < tot_part_fields; j++)
{
if (field == part_charset_field_array[i])
found= TRUE;
}
if (!found)
{
tot_fields++;
if (!(field_buf= (uchar*) sql_calloc(size))) if (!(field_buf= (uchar*) sql_calloc(size)))
goto error; goto error;
} subpart_charset_field_array[i]= field;
subpart_field_buffers[i++]= field_buf; subpart_field_buffers[i++]= field_buf;
} }
if (!(char_ptrs= (uchar**) sql_calloc(size))) subpart_charset_field_array[i]= NULL;
goto error;
restore_subpart_field_ptrs= char_ptrs;
} }
if (tot_fields) if (tot_fields)
{ {
uint j,k,l; uint k;
size= tot_fields*sizeof(char**); size= tot_fields*sizeof(char**);
if (!(char_ptrs= (uchar**)sql_calloc(size))) if (!(char_ptrs= (uchar**)sql_calloc(size)))
goto error; goto error;
...@@ -1026,11 +1015,12 @@ bool partition_info::set_up_charset_field_preps() ...@@ -1026,11 +1015,12 @@ bool partition_info::set_up_charset_field_preps()
full_part_field_buffers[i]= part_field_buffers[i]; full_part_field_buffers[i]= part_field_buffers[i];
} }
k= tot_part_fields; k= tot_part_fields;
l= 0;
for (i= 0; i < tot_subpart_fields; i++) for (i= 0; i < tot_subpart_fields; i++)
{ {
uint j;
bool found= FALSE;
field= subpart_charset_field_array[i]; field= subpart_charset_field_array[i];
found= FALSE;
for (j= 0; j < tot_part_fields; j++) for (j= 0; j < tot_part_fields; j++)
{ {
if (field == part_charset_field_array[i]) if (field == part_charset_field_array[i])
...@@ -1038,12 +1028,12 @@ bool partition_info::set_up_charset_field_preps() ...@@ -1038,12 +1028,12 @@ bool partition_info::set_up_charset_field_preps()
} }
if (!found) if (!found)
{ {
full_part_charset_field_array[l]= subpart_charset_field_array[k]; full_part_charset_field_array[k]= subpart_charset_field_array[i];
full_part_field_buffers[l]= subpart_field_buffers[k]; full_part_field_buffers[k]= subpart_field_buffers[i];
k++; l++; k++;
} }
} }
full_part_charset_field_array[tot_fields]= NULL; full_part_charset_field_array[k]= NULL;
} }
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
error: error:
......
...@@ -2869,6 +2869,8 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info, ...@@ -2869,6 +2869,8 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info,
} }
if (unsigned_flag) if (unsigned_flag)
part_func_value-= 0x8000000000000000ULL; part_func_value-= 0x8000000000000000ULL;
if (left_endpoint && !include_endpoint)
part_func_value++;
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; loc_part_id= (max_part_id + min_part_id + 1) >> 1;
...@@ -3292,13 +3294,16 @@ static uint32 get_sub_part_id_from_key(const TABLE *table,uchar *buf, ...@@ -3292,13 +3294,16 @@ static uint32 get_sub_part_id_from_key(const TABLE *table,uchar *buf,
uint32 part_id; uint32 part_id;
DBUG_ENTER("get_sub_part_id_from_key"); DBUG_ENTER("get_sub_part_id_from_key");
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
if (likely(rec0 == buf)) if (likely(rec0 == buf))
{
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
part_id= part_info->get_subpartition_id(part_info); part_id= part_info->get_subpartition_id(part_info);
}
else else
{ {
Field **part_field_array= part_info->subpart_field_array; Field **part_field_array= part_info->subpart_field_array;
set_field_ptr(part_field_array, buf, rec0); set_field_ptr(part_field_array, buf, rec0);
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
part_id= part_info->get_subpartition_id(part_info); part_id= part_info->get_subpartition_id(part_info);
set_field_ptr(part_field_array, rec0, buf); set_field_ptr(part_field_array, rec0, buf);
} }
...@@ -3335,14 +3340,17 @@ bool get_part_id_from_key(const TABLE *table, uchar *buf, KEY *key_info, ...@@ -3335,14 +3340,17 @@ bool get_part_id_from_key(const TABLE *table, uchar *buf, KEY *key_info,
longlong func_value; longlong func_value;
DBUG_ENTER("get_part_id_from_key"); DBUG_ENTER("get_part_id_from_key");
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
if (likely(rec0 == buf)) if (likely(rec0 == buf))
{
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
result= part_info->get_part_partition_id(part_info, part_id, result= part_info->get_part_partition_id(part_info, part_id,
&func_value); &func_value);
}
else else
{ {
Field **part_field_array= part_info->part_field_array; Field **part_field_array= part_info->part_field_array;
set_field_ptr(part_field_array, buf, rec0); set_field_ptr(part_field_array, buf, rec0);
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
result= part_info->get_part_partition_id(part_info, part_id, result= part_info->get_part_partition_id(part_info, part_id,
&func_value); &func_value);
set_field_ptr(part_field_array, rec0, buf); set_field_ptr(part_field_array, rec0, buf);
...@@ -3382,14 +3390,17 @@ void get_full_part_id_from_key(const TABLE *table, uchar *buf, ...@@ -3382,14 +3390,17 @@ void get_full_part_id_from_key(const TABLE *table, uchar *buf,
longlong func_value; longlong func_value;
DBUG_ENTER("get_full_part_id_from_key"); DBUG_ENTER("get_full_part_id_from_key");
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
if (likely(rec0 == buf)) if (likely(rec0 == buf))
{
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
result= part_info->get_partition_id(part_info, &part_spec->start_part, result= part_info->get_partition_id(part_info, &part_spec->start_part,
&func_value); &func_value);
}
else else
{ {
Field **part_field_array= part_info->full_part_field_array; Field **part_field_array= part_info->full_part_field_array;
set_field_ptr(part_field_array, buf, rec0); set_field_ptr(part_field_array, buf, rec0);
key_restore(buf, (uchar*)key_spec->key, key_info, key_spec->length);
result= part_info->get_partition_id(part_info, &part_spec->start_part, result= part_info->get_partition_id(part_info, &part_spec->start_part,
&func_value); &func_value);
set_field_ptr(part_field_array, rec0, buf); set_field_ptr(part_field_array, rec0, buf);
......
...@@ -4096,8 +4096,7 @@ part_bit_expr: ...@@ -4096,8 +4096,7 @@ part_bit_expr:
} }
Lex->part_info->curr_part_elem->has_null_value= TRUE; Lex->part_info->curr_part_elem->has_null_value= TRUE;
} }
else if (part_expr->result_type() != INT_RESULT && else if (part_expr->result_type() != INT_RESULT)
!part_expr->null_value)
{ {
my_parse_error(ER(ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR)); my_parse_error(ER(ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR));
MYSQL_YYABORT; MYSQL_YYABORT;
......
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