Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
30989a77
Commit
30989a77
authored
Jul 15, 2006
by
mikael/pappa@dator5.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge dator5.(none):/home/pappa/clean-mysql-5.1
into dator5.(none):/home/pappa/push_tree_w28
parents
2834bc1e
cacbb674
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
468 additions
and
34 deletions
+468
-34
mysql-test/r/partition.result
mysql-test/r/partition.result
+39
-0
mysql-test/r/partition_innodb.result
mysql-test/r/partition_innodb.result
+11
-0
mysql-test/r/partition_mgm.result
mysql-test/r/partition_mgm.result
+12
-0
mysql-test/r/partition_order.result
mysql-test/r/partition_order.result
+54
-2
mysql-test/r/partition_range.result
mysql-test/r/partition_range.result
+112
-0
mysql-test/t/partition.test
mysql-test/t/partition.test
+43
-0
mysql-test/t/partition_innodb.test
mysql-test/t/partition_innodb.test
+13
-0
mysql-test/t/partition_mgm.test
mysql-test/t/partition_mgm.test
+15
-1
mysql-test/t/partition_order.test
mysql-test/t/partition_order.test
+17
-1
mysql-test/t/partition_range.test
mysql-test/t/partition_range.test
+87
-0
sql/ha_myisam.cc
sql/ha_myisam.cc
+2
-1
sql/ha_partition.cc
sql/ha_partition.cc
+50
-21
sql/ha_partition.h
sql/ha_partition.h
+8
-4
sql/sql_yacc.yy
sql/sql_yacc.yy
+5
-4
No files found.
mysql-test/r/partition.result
View file @
30989a77
...
...
@@ -1082,4 +1082,43 @@ a
2
1
drop table t1;
create table t1 (a int) engine myisam
partition by range (a)
subpartition by hash (a)
(partition p0 VALUES LESS THAN (1) DATA DIRECTORY = 'hello/master-data/tmpdata' INDEX DIRECTORY = 'hello/master-data/tmpinx'
(SUBPARTITION subpart00, SUBPARTITION subpart01));
t1#P#p0#SP#subpart00.MYD
t1#P#p0#SP#subpart00.MYI
t1#P#p0#SP#subpart01.MYD
t1#P#p0#SP#subpart01.MYI
t1.frm
t1.par
t1#P#p0#SP#subpart00.MYD
t1#P#p0#SP#subpart01.MYD
t1#P#p0#SP#subpart00.MYI
t1#P#p0#SP#subpart01.MYI
ALTER TABLE t1 REORGANIZE PARTITION p0 INTO
(partition p1 VALUES LESS THAN (1) DATA DIRECTORY = 'hello/master-data/tmpdata' INDEX DIRECTORY = 'hello/master-data/tmpinx'
(SUBPARTITION subpart10, SUBPARTITION subpart11),
partition p2 VALUES LESS THAN (2) DATA DIRECTORY = 'hello/master-data/tmpdata' INDEX DIRECTORY = 'hello/master-data/tmpinx'
(SUBPARTITION subpart20, SUBPARTITION subpart21));
t1#P#p1#SP#subpart10.MYD
t1#P#p1#SP#subpart10.MYI
t1#P#p1#SP#subpart11.MYD
t1#P#p1#SP#subpart11.MYI
t1#P#p2#SP#subpart20.MYD
t1#P#p2#SP#subpart20.MYI
t1#P#p2#SP#subpart21.MYD
t1#P#p2#SP#subpart21.MYI
t1.frm
t1.par
t1#P#p1#SP#subpart10.MYD
t1#P#p1#SP#subpart11.MYD
t1#P#p2#SP#subpart20.MYD
t1#P#p2#SP#subpart21.MYD
t1#P#p1#SP#subpart10.MYI
t1#P#p1#SP#subpart11.MYI
t1#P#p2#SP#subpart20.MYI
t1#P#p2#SP#subpart21.MYI
drop table t1;
End of 5.1 tests
mysql-test/r/partition_innodb.result
View file @
30989a77
...
...
@@ -107,3 +107,14 @@ select * from t1 where id = 'aaa';
id
aaa
drop table t1;
create table t1 (a int, b int, primary key (b,a))
engine = innodb
partition by hash (a);
insert into t1 values (0, 0);
insert into t1 values (1, 0);
update t1 set b = b + 1 where a = 1;
select * from t1;
a b
0 0
1 1
drop table t1;
mysql-test/r/partition_mgm.result
View file @
30989a77
...
...
@@ -24,3 +24,15 @@ hello/master-data/test/t1#P#p0.MYD
hello/master-data/test/t1#P#p0.MYI
hello/master-data/test/t1.frm
hello/master-data/test/t1.par
drop table t1;
create table t1 (a int)
partition by list (a)
subpartition by hash (a)
(partition p11 values in (1,2),
partition p12 values in (3,4));
alter table t1 REORGANIZE partition p11, p12 INTO
(partition p1 values in (1,2,3,4));
alter table t1 REORGANIZE partition p1 INTO
(partition p11 values in (1,2),
partition p12 values in (3,4));
drop table t1;
mysql-test/r/partition_order.result
View file @
30989a77
...
...
@@ -718,7 +718,11 @@ partitions 2
partition x2 values less than (100));
INSERT into t1 values (1, 1);
INSERT into t1 values (5, NULL);
INSERT into t1 values (2, 5);
INSERT into t1 values (2, 4);
INSERT into t1 values (3, 3);
INSERT into t1 values (4, 5);
INSERT into t1 values (7, 1);
INSERT into t1 values (6, 6);
INSERT into t1 values (30, 4);
INSERT into t1 values (35, 2);
INSERT into t1 values (40, NULL);
...
...
@@ -727,7 +731,55 @@ a b
5 NULL
40 NULL
1 1
7 1
35 2
3 3
2 4
30 4
2 5
4 5
6 6
select * from t1 force index (b) where b < 10 ORDER BY b;
a b
1 1
7 1
35 2
3 3
2 4
30 4
4 5
6 6
select * from t1 force index (b) where b < 10 ORDER BY b DESC;
a b
6 6
4 5
2 4
30 4
3 3
35 2
7 1
1 1
drop table t1;
create table t1 (a int not null, b int, c varchar(20), key (a,b,c))
partition by range (b)
(partition p0 values less than (5),
partition p1 values less than (10));
INSERT into t1 values (1,1,'1'),(2,2,'2'),(1,3,'3'),(2,4,'4'),(1,5,'5');
INSERT into t1 values (2,6,'6'),(1,7,'7'),(2,8,'8'),(1,9,'9');
INSERT into t1 values (1, NULL, NULL), (2, NULL, '10');
select * from t1 where a = 1 order by a desc, b desc;
a b c
1 9 9
1 7 7
1 5 5
1 3 3
1 1 1
1 NULL NULL
select * from t1 where a = 1 order by b desc;
a b c
1 9 9
1 7 7
1 5 5
1 3 3
1 1 1
1 NULL NULL
drop table t1;
mysql-test/r/partition_range.result
View file @
30989a77
...
...
@@ -519,3 +519,115 @@ partition p3 values less than (1998),
partition p4 values less than (1999),
partition p5 values less than (2000));
drop table t1;
CREATE TABLE t1 (a date)
PARTITION BY RANGE (TO_DAYS(a))
(PARTITION p3xx VALUES LESS THAN (TO_DAYS('2004-01-01')),
PARTITION p401 VALUES LESS THAN (TO_DAYS('2004-02-01')),
PARTITION p402 VALUES LESS THAN (TO_DAYS('2004-03-01')),
PARTITION p403 VALUES LESS THAN (TO_DAYS('2004-04-01')),
PARTITION p404 VALUES LESS THAN (TO_DAYS('2004-05-01')),
PARTITION p405 VALUES LESS THAN (TO_DAYS('2004-06-01')),
PARTITION p406 VALUES LESS THAN (TO_DAYS('2004-07-01')),
PARTITION p407 VALUES LESS THAN (TO_DAYS('2004-08-01')),
PARTITION p408 VALUES LESS THAN (TO_DAYS('2004-09-01')),
PARTITION p409 VALUES LESS THAN (TO_DAYS('2004-10-01')),
PARTITION p410 VALUES LESS THAN (TO_DAYS('2004-11-01')),
PARTITION p411 VALUES LESS THAN (TO_DAYS('2004-12-01')),
PARTITION p412 VALUES LESS THAN (TO_DAYS('2005-01-01')),
PARTITION p501 VALUES LESS THAN (TO_DAYS('2005-02-01')),
PARTITION p502 VALUES LESS THAN (TO_DAYS('2005-03-01')),
PARTITION p503 VALUES LESS THAN (TO_DAYS('2005-04-01')),
PARTITION p504 VALUES LESS THAN (TO_DAYS('2005-05-01')),
PARTITION p505 VALUES LESS THAN (TO_DAYS('2005-06-01')),
PARTITION p506 VALUES LESS THAN (TO_DAYS('2005-07-01')),
PARTITION p507 VALUES LESS THAN (TO_DAYS('2005-08-01')),
PARTITION p508 VALUES LESS THAN (TO_DAYS('2005-09-01')),
PARTITION p509 VALUES LESS THAN (TO_DAYS('2005-10-01')),
PARTITION p510 VALUES LESS THAN (TO_DAYS('2005-11-01')),
PARTITION p511 VALUES LESS THAN (TO_DAYS('2005-12-01')),
PARTITION p512 VALUES LESS THAN (TO_DAYS('2006-01-01')),
PARTITION p601 VALUES LESS THAN (TO_DAYS('2006-02-01')),
PARTITION p602 VALUES LESS THAN (TO_DAYS('2006-03-01')),
PARTITION p603 VALUES LESS THAN (TO_DAYS('2006-04-01')),
PARTITION p604 VALUES LESS THAN (TO_DAYS('2006-05-01')),
PARTITION p605 VALUES LESS THAN (TO_DAYS('2006-06-01')),
PARTITION p606 VALUES LESS THAN (TO_DAYS('2006-07-01')),
PARTITION p607 VALUES LESS THAN (TO_DAYS('2006-08-01')));
INSERT INTO t1 VALUES ('2003-01-13'),('2003-06-20'),('2003-08-30');
INSERT INTO t1 VALUES ('2003-04-13'),('2003-07-20'),('2003-10-30');
INSERT INTO t1 VALUES ('2003-05-13'),('2003-11-20'),('2003-12-30');
INSERT INTO t1 VALUES ('2004-01-13'),('2004-01-20'),('2004-01-30');
INSERT INTO t1 VALUES ('2004-02-13'),('2004-02-20'),('2004-02-28');
INSERT INTO t1 VALUES ('2004-03-13'),('2004-03-20'),('2004-03-30');
INSERT INTO t1 VALUES ('2004-04-13'),('2004-04-20'),('2004-04-30');
INSERT INTO t1 VALUES ('2004-05-13'),('2004-05-20'),('2004-05-30');
INSERT INTO t1 VALUES ('2004-06-13'),('2004-06-20'),('2004-06-30');
INSERT INTO t1 VALUES ('2004-07-13'),('2004-07-20'),('2004-07-30');
INSERT INTO t1 VALUES ('2004-08-13'),('2004-08-20'),('2004-08-30');
INSERT INTO t1 VALUES ('2004-09-13'),('2004-09-20'),('2004-09-30');
INSERT INTO t1 VALUES ('2004-10-13'),('2004-10-20'),('2004-10-30');
INSERT INTO t1 VALUES ('2004-11-13'),('2004-11-20'),('2004-11-30');
INSERT INTO t1 VALUES ('2004-12-13'),('2004-12-20'),('2004-12-30');
INSERT INTO t1 VALUES ('2005-01-13'),('2005-01-20'),('2005-01-30');
INSERT INTO t1 VALUES ('2005-02-13'),('2005-02-20'),('2005-02-28');
INSERT INTO t1 VALUES ('2005-03-13'),('2005-03-20'),('2005-03-30');
INSERT INTO t1 VALUES ('2005-04-13'),('2005-04-20'),('2005-04-30');
INSERT INTO t1 VALUES ('2005-05-13'),('2005-05-20'),('2005-05-30');
INSERT INTO t1 VALUES ('2005-06-13'),('2005-06-20'),('2005-06-30');
INSERT INTO t1 VALUES ('2005-07-13'),('2005-07-20'),('2005-07-30');
INSERT INTO t1 VALUES ('2005-08-13'),('2005-08-20'),('2005-08-30');
INSERT INTO t1 VALUES ('2005-09-13'),('2005-09-20'),('2005-09-30');
INSERT INTO t1 VALUES ('2005-10-13'),('2005-10-20'),('2005-10-30');
INSERT INTO t1 VALUES ('2005-11-13'),('2005-11-20'),('2005-11-30');
INSERT INTO t1 VALUES ('2005-12-13'),('2005-12-20'),('2005-12-30');
INSERT INTO t1 VALUES ('2006-01-13'),('2006-01-20'),('2006-01-30');
INSERT INTO t1 VALUES ('2006-02-13'),('2006-02-20'),('2006-02-28');
INSERT INTO t1 VALUES ('2006-03-13'),('2006-03-20'),('2006-03-30');
INSERT INTO t1 VALUES ('2006-04-13'),('2006-04-20'),('2006-04-30');
INSERT INTO t1 VALUES ('2006-05-13'),('2006-05-20'),('2006-05-30');
INSERT INTO t1 VALUES ('2006-06-13'),('2006-06-20'),('2006-06-30');
INSERT INTO t1 VALUES ('2006-07-13'),('2006-07-20'),('2006-07-30');
SELECT * FROM t1
WHERE a >= '2004-07-01' AND a <= '2004-09-30';
a
2004-07-13
2004-07-20
2004-07-30
2004-08-13
2004-08-20
2004-08-30
2004-09-13
2004-09-20
2004-09-30
EXPLAIN PARTITIONS SELECT * FROM t1
WHERE a >= '2004-07-01' AND a <= '2004-09-30';
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p407,p408,p409 ALL NULL NULL NULL NULL 9 Using where
SELECT * from t1
WHERE (a >= '2004-07-01' AND a <= '2004-09-30') OR
(a >= '2005-07-01' AND a <= '2005-09-30');
a
2004-07-13
2004-07-20
2004-07-30
2004-08-13
2004-08-20
2004-08-30
2004-09-13
2004-09-20
2004-09-30
2005-07-13
2005-07-20
2005-07-30
2005-08-13
2005-08-20
2005-08-30
2005-09-13
2005-09-20
2005-09-30
EXPLAIN PARTITIONS SELECT * from t1
WHERE (a >= '2004-07-01' AND a <= '2004-09-30') OR
(a >= '2005-07-01' AND a <= '2005-09-30');
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
DROP TABLE t1;
mysql-test/t/partition.test
View file @
30989a77
...
...
@@ -1261,4 +1261,47 @@ insert into t1 values (1),(2);
select
*
from
t1
ORDER
BY
a
DESC
;
drop
table
t1
;
#
# Bug 20770 Partitions: DATA DIRECTORY clause change in reorganize
# doesn't remove old directory
#
--
disable_query_log
--
exec
mkdir
$MYSQLTEST_VARDIR
/
master
-
data
/
tmpdata
||
true
eval
SET
@
data_dir
=
'DATA DIRECTORY = ''$MYSQLTEST_VARDIR/master-data/tmpdata'''
;
let
$data_directory
=
`select @data_dir`
;
--
exec
mkdir
$MYSQLTEST_VARDIR
/
master
-
data
/
tmpinx
||
true
eval
SET
@
inx_dir
=
'INDEX DIRECTORY = ''$MYSQLTEST_VARDIR/master-data/tmpinx'''
;
let
$inx_directory
=
`select @inx_dir`
;
--
enable_query_log
--
replace_result
$MYSQLTEST_VARDIR
"hello"
eval
create
table
t1
(
a
int
)
engine
myisam
partition
by
range
(
a
)
subpartition
by
hash
(
a
)
(
partition
p0
VALUES
LESS
THAN
(
1
)
$data_directory
$inx_directory
(
SUBPARTITION
subpart00
,
SUBPARTITION
subpart01
));
--
replace_result
$MYSQLTEST_VARDIR
"hello"
--
exec
ls
$MYSQLTEST_VARDIR
/
master
-
data
/
test
||
true
--
replace_result
$MYSQLTEST_VARDIR
"hello"
--
exec
ls
$MYSQLTEST_VARDIR
/
master
-
data
/
tmpdata
||
true
--
replace_result
$MYSQLTEST_VARDIR
"hello"
--
exec
ls
$MYSQLTEST_VARDIR
/
master
-
data
/
tmpinx
||
true
--
replace_result
$MYSQLTEST_VARDIR
"hello"
eval
ALTER
TABLE
t1
REORGANIZE
PARTITION
p0
INTO
(
partition
p1
VALUES
LESS
THAN
(
1
)
$data_directory
$inx_directory
(
SUBPARTITION
subpart10
,
SUBPARTITION
subpart11
),
partition
p2
VALUES
LESS
THAN
(
2
)
$data_directory
$inx_directory
(
SUBPARTITION
subpart20
,
SUBPARTITION
subpart21
));
--
replace_result
$MYSQLTEST_VARDIR
"hello"
--
exec
ls
$MYSQLTEST_VARDIR
/
master
-
data
/
test
||
true
--
replace_result
$MYSQLTEST_VARDIR
"hello"
--
exec
ls
$MYSQLTEST_VARDIR
/
master
-
data
/
tmpdata
||
true
--
replace_result
$MYSQLTEST_VARDIR
"hello"
--
exec
ls
$MYSQLTEST_VARDIR
/
master
-
data
/
tmpinx
||
true
drop
table
t1
;
--
echo
End
of
5.1
tests
mysql-test/t/partition_innodb.test
View file @
30989a77
...
...
@@ -78,3 +78,16 @@ select * from t1 where id = 'a';
select
*
from
t1
where
id
=
'aa'
;
select
*
from
t1
where
id
=
'aaa'
;
drop
table
t1
;
#
# Bug #20852 Partitions: Crash if hash innodb, composite primary key
#
create
table
t1
(
a
int
,
b
int
,
primary
key
(
b
,
a
))
engine
=
innodb
partition
by
hash
(
a
);
insert
into
t1
values
(
0
,
0
);
insert
into
t1
values
(
1
,
0
);
update
t1
set
b
=
b
+
1
where
a
=
1
;
select
*
from
t1
;
drop
table
t1
;
mysql-test/t/partition_mgm.test
View file @
30989a77
...
...
@@ -12,7 +12,21 @@ ALTER TABLE t1 COALESCE PARTITION 1;
SHOW
CREATE
TABLE
t1
;
--
replace_result
$MYSQLTEST_VARDIR
"hello"
--
exec
ls
$MYSQLTEST_VARDIR
/
master
-
data
/
test
/
t1
*
drop
table
t1
;
#
# Bug 20767: REORGANIZE partition crashes
#
create
table
t1
(
a
int
)
partition
by
list
(
a
)
subpartition
by
hash
(
a
)
(
partition
p11
values
in
(
1
,
2
),
partition
p12
values
in
(
3
,
4
));
alter
table
t1
REORGANIZE
partition
p11
,
p12
INTO
(
partition
p1
values
in
(
1
,
2
,
3
,
4
));
alter
table
t1
REORGANIZE
partition
p1
INTO
(
partition
p11
values
in
(
1
,
2
),
partition
p12
values
in
(
3
,
4
));
drop
table
t1
;
mysql-test/t/partition_order.test
View file @
30989a77
...
...
@@ -818,11 +818,27 @@ partitions 2
# Insert a couple of tuples
INSERT
into
t1
values
(
1
,
1
);
INSERT
into
t1
values
(
5
,
NULL
);
INSERT
into
t1
values
(
2
,
5
);
INSERT
into
t1
values
(
2
,
4
);
INSERT
into
t1
values
(
3
,
3
);
INSERT
into
t1
values
(
4
,
5
);
INSERT
into
t1
values
(
7
,
1
);
INSERT
into
t1
values
(
6
,
6
);
INSERT
into
t1
values
(
30
,
4
);
INSERT
into
t1
values
(
35
,
2
);
INSERT
into
t1
values
(
40
,
NULL
);
select
*
from
t1
force
index
(
b
)
where
b
<
10
OR
b
IS
NULL
order
by
b
;
select
*
from
t1
force
index
(
b
)
where
b
<
10
ORDER
BY
b
;
select
*
from
t1
force
index
(
b
)
where
b
<
10
ORDER
BY
b
DESC
;
drop
table
t1
;
create
table
t1
(
a
int
not
null
,
b
int
,
c
varchar
(
20
),
key
(
a
,
b
,
c
))
partition
by
range
(
b
)
(
partition
p0
values
less
than
(
5
),
partition
p1
values
less
than
(
10
));
INSERT
into
t1
values
(
1
,
1
,
'1'
),(
2
,
2
,
'2'
),(
1
,
3
,
'3'
),(
2
,
4
,
'4'
),(
1
,
5
,
'5'
);
INSERT
into
t1
values
(
2
,
6
,
'6'
),(
1
,
7
,
'7'
),(
2
,
8
,
'8'
),(
1
,
9
,
'9'
);
INSERT
into
t1
values
(
1
,
NULL
,
NULL
),
(
2
,
NULL
,
'10'
);
select
*
from
t1
where
a
=
1
order
by
a
desc
,
b
desc
;
select
*
from
t1
where
a
=
1
order
by
b
desc
;
drop
table
t1
;
mysql-test/t/partition_range.test
View file @
30989a77
...
...
@@ -555,3 +555,90 @@ reorganize partition p5 into
drop
table
t1
;
#
# New test cases for date based partitioning
#
CREATE
TABLE
t1
(
a
date
)
PARTITION
BY
RANGE
(
TO_DAYS
(
a
))
(
PARTITION
p3xx
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-01-01'
)),
PARTITION
p401
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-02-01'
)),
PARTITION
p402
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-03-01'
)),
PARTITION
p403
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-04-01'
)),
PARTITION
p404
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-05-01'
)),
PARTITION
p405
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-06-01'
)),
PARTITION
p406
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-07-01'
)),
PARTITION
p407
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-08-01'
)),
PARTITION
p408
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-09-01'
)),
PARTITION
p409
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-10-01'
)),
PARTITION
p410
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-11-01'
)),
PARTITION
p411
VALUES
LESS
THAN
(
TO_DAYS
(
'2004-12-01'
)),
PARTITION
p412
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-01-01'
)),
PARTITION
p501
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-02-01'
)),
PARTITION
p502
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-03-01'
)),
PARTITION
p503
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-04-01'
)),
PARTITION
p504
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-05-01'
)),
PARTITION
p505
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-06-01'
)),
PARTITION
p506
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-07-01'
)),
PARTITION
p507
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-08-01'
)),
PARTITION
p508
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-09-01'
)),
PARTITION
p509
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-10-01'
)),
PARTITION
p510
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-11-01'
)),
PARTITION
p511
VALUES
LESS
THAN
(
TO_DAYS
(
'2005-12-01'
)),
PARTITION
p512
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-01-01'
)),
PARTITION
p601
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-02-01'
)),
PARTITION
p602
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-03-01'
)),
PARTITION
p603
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-04-01'
)),
PARTITION
p604
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-05-01'
)),
PARTITION
p605
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-06-01'
)),
PARTITION
p606
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-07-01'
)),
PARTITION
p607
VALUES
LESS
THAN
(
TO_DAYS
(
'2006-08-01'
)));
INSERT
INTO
t1
VALUES
(
'2003-01-13'
),(
'2003-06-20'
),(
'2003-08-30'
);
INSERT
INTO
t1
VALUES
(
'2003-04-13'
),(
'2003-07-20'
),(
'2003-10-30'
);
INSERT
INTO
t1
VALUES
(
'2003-05-13'
),(
'2003-11-20'
),(
'2003-12-30'
);
INSERT
INTO
t1
VALUES
(
'2004-01-13'
),(
'2004-01-20'
),(
'2004-01-30'
);
INSERT
INTO
t1
VALUES
(
'2004-02-13'
),(
'2004-02-20'
),(
'2004-02-28'
);
INSERT
INTO
t1
VALUES
(
'2004-03-13'
),(
'2004-03-20'
),(
'2004-03-30'
);
INSERT
INTO
t1
VALUES
(
'2004-04-13'
),(
'2004-04-20'
),(
'2004-04-30'
);
INSERT
INTO
t1
VALUES
(
'2004-05-13'
),(
'2004-05-20'
),(
'2004-05-30'
);
INSERT
INTO
t1
VALUES
(
'2004-06-13'
),(
'2004-06-20'
),(
'2004-06-30'
);
INSERT
INTO
t1
VALUES
(
'2004-07-13'
),(
'2004-07-20'
),(
'2004-07-30'
);
INSERT
INTO
t1
VALUES
(
'2004-08-13'
),(
'2004-08-20'
),(
'2004-08-30'
);
INSERT
INTO
t1
VALUES
(
'2004-09-13'
),(
'2004-09-20'
),(
'2004-09-30'
);
INSERT
INTO
t1
VALUES
(
'2004-10-13'
),(
'2004-10-20'
),(
'2004-10-30'
);
INSERT
INTO
t1
VALUES
(
'2004-11-13'
),(
'2004-11-20'
),(
'2004-11-30'
);
INSERT
INTO
t1
VALUES
(
'2004-12-13'
),(
'2004-12-20'
),(
'2004-12-30'
);
INSERT
INTO
t1
VALUES
(
'2005-01-13'
),(
'2005-01-20'
),(
'2005-01-30'
);
INSERT
INTO
t1
VALUES
(
'2005-02-13'
),(
'2005-02-20'
),(
'2005-02-28'
);
INSERT
INTO
t1
VALUES
(
'2005-03-13'
),(
'2005-03-20'
),(
'2005-03-30'
);
INSERT
INTO
t1
VALUES
(
'2005-04-13'
),(
'2005-04-20'
),(
'2005-04-30'
);
INSERT
INTO
t1
VALUES
(
'2005-05-13'
),(
'2005-05-20'
),(
'2005-05-30'
);
INSERT
INTO
t1
VALUES
(
'2005-06-13'
),(
'2005-06-20'
),(
'2005-06-30'
);
INSERT
INTO
t1
VALUES
(
'2005-07-13'
),(
'2005-07-20'
),(
'2005-07-30'
);
INSERT
INTO
t1
VALUES
(
'2005-08-13'
),(
'2005-08-20'
),(
'2005-08-30'
);
INSERT
INTO
t1
VALUES
(
'2005-09-13'
),(
'2005-09-20'
),(
'2005-09-30'
);
INSERT
INTO
t1
VALUES
(
'2005-10-13'
),(
'2005-10-20'
),(
'2005-10-30'
);
INSERT
INTO
t1
VALUES
(
'2005-11-13'
),(
'2005-11-20'
),(
'2005-11-30'
);
INSERT
INTO
t1
VALUES
(
'2005-12-13'
),(
'2005-12-20'
),(
'2005-12-30'
);
INSERT
INTO
t1
VALUES
(
'2006-01-13'
),(
'2006-01-20'
),(
'2006-01-30'
);
INSERT
INTO
t1
VALUES
(
'2006-02-13'
),(
'2006-02-20'
),(
'2006-02-28'
);
INSERT
INTO
t1
VALUES
(
'2006-03-13'
),(
'2006-03-20'
),(
'2006-03-30'
);
INSERT
INTO
t1
VALUES
(
'2006-04-13'
),(
'2006-04-20'
),(
'2006-04-30'
);
INSERT
INTO
t1
VALUES
(
'2006-05-13'
),(
'2006-05-20'
),(
'2006-05-30'
);
INSERT
INTO
t1
VALUES
(
'2006-06-13'
),(
'2006-06-20'
),(
'2006-06-30'
);
INSERT
INTO
t1
VALUES
(
'2006-07-13'
),(
'2006-07-20'
),(
'2006-07-30'
);
SELECT
*
FROM
t1
WHERE
a
>=
'2004-07-01'
AND
a
<=
'2004-09-30'
;
EXPLAIN
PARTITIONS
SELECT
*
FROM
t1
WHERE
a
>=
'2004-07-01'
AND
a
<=
'2004-09-30'
;
SELECT
*
from
t1
WHERE
(
a
>=
'2004-07-01'
AND
a
<=
'2004-09-30'
)
OR
(
a
>=
'2005-07-01'
AND
a
<=
'2005-09-30'
);
EXPLAIN
PARTITIONS
SELECT
*
from
t1
WHERE
(
a
>=
'2004-07-01'
AND
a
<=
'2004-09-30'
)
OR
(
a
>=
'2005-07-01'
AND
a
<=
'2005-09-30'
);
DROP
TABLE
t1
;
sql/ha_myisam.cc
View file @
30989a77
...
...
@@ -1202,12 +1202,13 @@ int ha_myisam::index_read_idx(byte * buf, uint index, const byte * key,
int
ha_myisam
::
index_read_last
(
byte
*
buf
,
const
byte
*
key
,
uint
key_len
)
{
DBUG_ENTER
(
"ha_myisam::index_read_last"
);
DBUG_ASSERT
(
inited
==
INDEX
);
statistic_increment
(
table
->
in_use
->
status_var
.
ha_read_key_count
,
&
LOCK_status
);
int
error
=
mi_rkey
(
file
,
buf
,
active_index
,
key
,
key_len
,
HA_READ_PREFIX_LAST
);
table
->
status
=
error
?
STATUS_NOT_FOUND
:
0
;
return
error
;
DBUG_RETURN
(
error
)
;
}
int
ha_myisam
::
index_next
(
byte
*
buf
)
...
...
sql/ha_partition.cc
View file @
30989a77
...
...
@@ -204,6 +204,7 @@ void ha_partition::init_handler_variables()
m_name_buffer_ptr
=
NULL
;
m_engine_array
=
NULL
;
m_file
=
NULL
;
m_file_tot_parts
=
0
;
m_reorged_file
=
NULL
;
m_new_file
=
NULL
;
m_reorged_parts
=
0
;
...
...
@@ -1125,13 +1126,15 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
int
ha_partition
::
prepare_new_partition
(
TABLE
*
table
,
HA_CREATE_INFO
*
create_info
,
handler
*
file
,
const
char
*
part_name
)
handler
*
file
,
const
char
*
part_name
,
partition_element
*
p_elem
)
{
int
error
;
bool
create_flag
=
FALSE
;
bool
open_flag
=
FALSE
;
DBUG_ENTER
(
"prepare_new_partition"
);
set_up_table_before_create
(
table
,
part_name
,
create_info
,
0
,
p_elem
);
if
((
error
=
file
->
create
(
part_name
,
table
,
create_info
)))
goto
error
;
create_flag
=
TRUE
;
...
...
@@ -1231,7 +1234,7 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
uint
no_parts
=
m_part_info
->
partitions
.
elements
;
uint
no_subparts
=
m_part_info
->
no_subparts
;
uint
i
=
0
;
uint
no_remain_partitions
,
part_count
;
uint
no_remain_partitions
,
part_count
,
orig_count
;
handler
**
new_file_array
;
int
error
=
1
;
bool
first
;
...
...
@@ -1266,10 +1269,10 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
}
while
(
++
i
<
no_parts
);
}
if
(
m_reorged_parts
&&
!
(
m_reorged_file
=
(
handler
**
)
sql_calloc
(
sizeof
(
partition_element
*
)
*
!
(
m_reorged_file
=
(
handler
**
)
sql_calloc
(
sizeof
(
handler
*
)
*
(
m_reorged_parts
+
1
))))
{
mem_alloc_error
(
sizeof
(
partition_element
*
)
*
(
m_reorged_parts
+
1
));
mem_alloc_error
(
sizeof
(
handler
*
)
*
(
m_reorged_parts
+
1
));
DBUG_RETURN
(
ER_OUTOFMEMORY
);
}
...
...
@@ -1340,6 +1343,7 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
ones used to be.
*/
first
=
FALSE
;
DBUG_ASSERT
(
i
+
m_reorged_parts
<=
m_file_tot_parts
);
memcpy
((
void
*
)
m_reorged_file
,
&
m_file
[
i
*
no_subparts
],
sizeof
(
handler
*
)
*
m_reorged_parts
*
no_subparts
);
}
...
...
@@ -1353,15 +1357,18 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
*/
i
=
0
;
part_count
=
0
;
orig_count
=
0
;
part_it
.
rewind
();
do
{
partition_element
*
part_elem
=
part_it
++
;
if
(
part_elem
->
part_state
==
PART_NORMAL
)
{
memcpy
((
void
*
)
&
new_file_array
[
part_count
],
(
void
*
)
&
m_file
[
i
],
DBUG_ASSERT
(
orig_count
+
no_subparts
<=
m_file_tot_parts
);
memcpy
((
void
*
)
&
new_file_array
[
part_count
],
(
void
*
)
&
m_file
[
orig_count
],
sizeof
(
handler
*
)
*
no_subparts
);
part_count
+=
no_subparts
;
orig_count
+=
no_subparts
;
}
else
if
(
part_elem
->
part_state
==
PART_CHANGED
||
part_elem
->
part_state
==
PART_TO_BE_ADDED
)
...
...
@@ -1420,7 +1427,8 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
DBUG_PRINT
(
"info"
,
(
"Add subpartition %s"
,
part_name_buff
));
if
((
error
=
prepare_new_partition
(
table
,
create_info
,
new_file_array
[
part
],
(
const
char
*
)
part_name_buff
)))
(
const
char
*
)
part_name_buff
,
sub_elem
)))
{
cleanup_new_partition
(
part_count
);
DBUG_RETURN
(
error
);
...
...
@@ -1436,7 +1444,8 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
DBUG_PRINT
(
"info"
,
(
"Add partition %s"
,
part_name_buff
));
if
((
error
=
prepare_new_partition
(
table
,
create_info
,
new_file_array
[
i
],
(
const
char
*
)
part_name_buff
)))
(
const
char
*
)
part_name_buff
,
part_elem
)))
{
cleanup_new_partition
(
part_count
);
DBUG_RETURN
(
error
);
...
...
@@ -1648,7 +1657,7 @@ uint ha_partition::del_ren_cre_table(const char *from,
error
=
(
*
file
)
->
delete_table
((
const
char
*
)
from_buff
);
else
{
set_up_table_before_create
(
table_arg
,
from_buff
,
create_info
,
i
);
set_up_table_before_create
(
table_arg
,
from_buff
,
create_info
,
i
,
NULL
);
error
=
(
*
file
)
->
create
(
from_buff
,
table_arg
,
create_info
);
}
name_buffer_ptr
=
strend
(
name_buffer_ptr
)
+
1
;
...
...
@@ -1724,12 +1733,15 @@ partition_element *ha_partition::find_partition_element(uint part_id)
void
ha_partition
::
set_up_table_before_create
(
TABLE
*
table
,
const
char
*
partition_name_with_path
,
HA_CREATE_INFO
*
info
,
uint
part_id
)
uint
part_id
,
partition_element
*
part_elem
)
{
partition_element
*
part_elem
=
find_partition_element
(
part_id
);
if
(
!
part_elem
)
{
part_elem
=
find_partition_element
(
part_id
);
if
(
!
part_elem
)
return
;
// Fatal error
}
table
->
s
->
max_rows
=
part_elem
->
part_max_rows
;
table
->
s
->
min_rows
=
part_elem
->
part_min_rows
;
const
char
*
partition_name
=
strrchr
(
partition_name_with_path
,
FN_LIBCHAR
);
...
...
@@ -1959,6 +1971,7 @@ bool ha_partition::create_handlers(MEM_ROOT *mem_root)
if
(
!
(
m_file
=
(
handler
**
)
alloc_root
(
mem_root
,
alloc_len
)))
DBUG_RETURN
(
TRUE
);
m_file_tot_parts
=
m_tot_parts
;
bzero
((
char
*
)
m_file
,
alloc_len
);
for
(
i
=
0
;
i
<
m_tot_parts
;
i
++
)
{
...
...
@@ -2008,6 +2021,7 @@ bool ha_partition::new_handlers_from_part_info(MEM_ROOT *mem_root)
mem_alloc_error
(
alloc_len
);
goto
error_end
;
}
m_file_tot_parts
=
m_tot_parts
;
bzero
((
char
*
)
m_file
,
alloc_len
);
DBUG_ASSERT
(
m_part_info
->
no_parts
>
0
);
...
...
@@ -2229,7 +2243,8 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
m_table_flags
&=
~
(
HA_CAN_GEOMETRY
|
HA_CAN_FULLTEXT
|
HA_DUPLICATE_POS
|
HA_CAN_SQL_HANDLER
|
HA_CAN_INSERT_DELAYED
);
m_table_flags
|=
HA_FILE_BASED
|
HA_REC_NOT_IN_SEQ
;
key_used_on_scan
=
m_file
[
0
]
->
key_used_on_scan
;
implicit_emptied
=
m_file
[
0
]
->
implicit_emptied
;
/*
Add 2 bytes for partition id in position ref length.
ref_length=max_in_all_partitions(ref_length) + PARTITION_BYTES_IN_POS
...
...
@@ -3265,6 +3280,7 @@ int ha_partition::index_read(byte * buf, const byte * key,
DBUG_ENTER
(
"ha_partition::index_read"
);
end_range
=
0
;
m_index_scan_type
=
partition_index_read
;
DBUG_RETURN
(
common_index_read
(
buf
,
key
,
key_len
,
find_flag
));
}
...
...
@@ -3282,18 +3298,24 @@ int ha_partition::common_index_read(byte *buf, const byte *key, uint key_len,
enum
ha_rkey_function
find_flag
)
{
int
error
;
bool
reverse_order
=
FALSE
;
DBUG_ENTER
(
"ha_partition::common_index_read"
);
memcpy
((
void
*
)
m_start_key
.
key
,
key
,
key_len
);
m_start_key
.
length
=
key_len
;
m_start_key
.
flag
=
find_flag
;
m_index_scan_type
=
partition_index_read
;
if
((
error
=
partition_scan_set_up
(
buf
,
TRUE
)))
{
DBUG_RETURN
(
error
);
}
if
(
find_flag
==
HA_READ_PREFIX_LAST
||
find_flag
==
HA_READ_PREFIX_LAST_OR_PREV
||
find_flag
==
HA_READ_BEFORE_KEY
)
{
reverse_order
=
TRUE
;
m_ordered_scan_ongoing
=
TRUE
;
}
if
(
!
m_ordered_scan_ongoing
||
(
find_flag
==
HA_READ_KEY_EXACT
&&
(
key_len
>=
m_curr_key_info
->
key_length
||
...
...
@@ -3319,7 +3341,7 @@ int ha_partition::common_index_read(byte *buf, const byte *key, uint key_len,
In all other cases we will use the ordered index scan. This will use
the partition set created by the get_partition_set method.
*/
error
=
handle_ordered_index_scan
(
buf
);
error
=
handle_ordered_index_scan
(
buf
,
reverse_order
);
}
DBUG_RETURN
(
error
);
}
...
...
@@ -3403,7 +3425,7 @@ int ha_partition::common_first_last(byte *buf)
if
(
!
m_ordered_scan_ongoing
&&
m_index_scan_type
!=
partition_index_last
)
return
handle_unordered_scan_next_partition
(
buf
);
return
handle_ordered_index_scan
(
buf
);
return
handle_ordered_index_scan
(
buf
,
FALSE
);
}
...
...
@@ -3457,7 +3479,9 @@ int ha_partition::index_read_last(byte *buf, const byte *key, uint keylen)
DBUG_ENTER
(
"ha_partition::index_read_last"
);
m_ordered
=
TRUE
;
// Safety measure
DBUG_RETURN
(
index_read
(
buf
,
key
,
keylen
,
HA_READ_PREFIX_LAST
));
end_range
=
0
;
m_index_scan_type
=
partition_index_read_last
;
DBUG_RETURN
(
common_index_read
(
buf
,
key
,
keylen
,
HA_READ_PREFIX_LAST
));
}
...
...
@@ -3597,6 +3621,7 @@ int ha_partition::read_range_first(const key_range *start_key,
}
else
{
m_index_scan_type
=
partition_index_read
;
error
=
common_index_read
(
m_rec0
,
start_key
->
key
,
start_key
->
length
,
start_key
->
flag
);
...
...
@@ -3855,12 +3880,11 @@ int ha_partition::handle_unordered_scan_next_partition(byte * buf)
entries.
*/
int
ha_partition
::
handle_ordered_index_scan
(
byte
*
buf
)
int
ha_partition
::
handle_ordered_index_scan
(
byte
*
buf
,
bool
reverse_order
)
{
uint
i
;
uint
j
=
0
;
bool
found
=
FALSE
;
bool
reverse_order
=
FALSE
;
DBUG_ENTER
(
"ha_partition::handle_ordered_index_scan"
);
m_top_entry
=
NO_CURRENT_PART_ID
;
...
...
@@ -3881,7 +3905,6 @@ int ha_partition::handle_ordered_index_scan(byte *buf)
m_start_key
.
key
,
m_start_key
.
length
,
m_start_key
.
flag
);
reverse_order
=
FALSE
;
break
;
case
partition_index_first
:
error
=
file
->
index_first
(
rec_buf_ptr
);
...
...
@@ -3891,6 +3914,12 @@ int ha_partition::handle_ordered_index_scan(byte *buf)
error
=
file
->
index_last
(
rec_buf_ptr
);
reverse_order
=
TRUE
;
break
;
case
partition_index_read_last
:
error
=
file
->
index_read_last
(
rec_buf_ptr
,
m_start_key
.
key
,
m_start_key
.
length
);
reverse_order
=
TRUE
;
break
;
default:
DBUG_ASSERT
(
FALSE
);
DBUG_RETURN
(
HA_ERR_END_OF_FILE
);
...
...
sql/ha_partition.h
View file @
30989a77
...
...
@@ -46,7 +46,8 @@ private:
partition_index_read
=
0
,
partition_index_first
=
1
,
partition_index_last
=
2
,
partition_no_index_scan
=
3
partition_index_read_last
=
3
,
partition_no_index_scan
=
4
};
/* Data for the partition handler */
int
m_mode
;
// Open mode
...
...
@@ -55,6 +56,7 @@ private:
char
*
m_name_buffer_ptr
;
// Pointer to first partition name
handlerton
**
m_engine_array
;
// Array of types of the handlers
handler
**
m_file
;
// Array of references to handler inst.
uint
m_file_tot_parts
;
// Debug
handler
**
m_new_file
;
// Array of references to new handlers
handler
**
m_reorged_file
;
// Reorganised partitions
handler
**
m_added_file
;
// Added parts kept for errors
...
...
@@ -202,7 +204,8 @@ private:
int
copy_partitions
(
ulonglong
*
copied
,
ulonglong
*
deleted
);
void
cleanup_new_partition
(
uint
part_count
);
int
prepare_new_partition
(
TABLE
*
table
,
HA_CREATE_INFO
*
create_info
,
handler
*
file
,
const
char
*
part_name
);
handler
*
file
,
const
char
*
part_name
,
partition_element
*
p_elem
);
/*
delete_table, rename_table and create uses very similar logic which
is packed into this routine.
...
...
@@ -222,7 +225,8 @@ private:
void
set_up_table_before_create
(
TABLE
*
table_arg
,
const
char
*
partition_name_with_path
,
HA_CREATE_INFO
*
info
,
uint
part_id
);
uint
part_id
,
partition_element
*
p_elem
);
partition_element
*
find_partition_element
(
uint
part_id
);
public:
...
...
@@ -429,7 +433,7 @@ private:
return
(
queue_buf
(
part_id
)
+
PARTITION_BYTES_IN_POS
);
}
int
handle_ordered_index_scan
(
byte
*
buf
);
int
handle_ordered_index_scan
(
byte
*
buf
,
bool
reverse_order
);
int
handle_ordered_next
(
byte
*
buf
,
bool
next_same
);
int
handle_ordered_prev
(
byte
*
buf
);
void
return_top_record
(
byte
*
buf
);
...
...
sql/sql_yacc.yy
View file @
30989a77
...
...
@@ -3734,14 +3734,15 @@ sub_part_definition:
{
LEX *lex= Lex;
partition_info *part_info= lex->part_info;
partition_element *p_elem= new partition_element();
if (!p_elem ||
part_info->current_partition->subpartitions.push_back(p_elem))
partition_element *curr_part= part_info->current_partition;
partition_element *sub_p_elem= new partition_element(curr_part);
if (!sub_p_elem ||
curr_part->subpartitions.push_back(sub_p_elem))
{
mem_alloc_error(sizeof(partition_element));
YYABORT;
}
part_info->curr_part_elem= p_elem;
part_info->curr_part_elem=
sub_
p_elem;
part_info->use_default_subpartitions= FALSE;
part_info->use_default_no_subpartitions= FALSE;
part_info->count_curr_subparts++;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment