merge
This commit is contained in:
commit
559efbf14e
48
mysql-test/r/partition_innodb_stmt.result
Normal file
48
mysql-test/r/partition_innodb_stmt.result
Normal file
@ -0,0 +1,48 @@
|
||||
# connection default
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
id SMALLINT NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=innodb
|
||||
PARTITION BY RANGE (id)
|
||||
(
|
||||
PARTITION p1 VALUES LESS THAN (2),
|
||||
PARTITION p2 VALUES LESS THAN (4),
|
||||
PARTITION p3 VALUES LESS THAN (10)
|
||||
);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
# Test READ COMMITTED -> REPEATABLE READ
|
||||
FLUSH TABLES;
|
||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
id
|
||||
1
|
||||
2
|
||||
3
|
||||
#connection con1
|
||||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(7);
|
||||
COMMIT;
|
||||
# connection default
|
||||
COMMIT;
|
||||
FLUSH TABLES;
|
||||
# Test REPEATABLE READ -> READ COMMITTED
|
||||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
id
|
||||
1
|
||||
2
|
||||
3
|
||||
7
|
||||
# connection con1
|
||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(9);
|
||||
ERROR HY000: Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'
|
||||
COMMIT;
|
||||
COMMIT;
|
||||
DROP TABLE t1;
|
@ -43,8 +43,13 @@ SET INSERT_ID = 30;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
if (!$skip_update)
|
||||
{
|
||||
# InnoDB Does not handle this correctly, see bug#14793, bug#21641
|
||||
UPDATE t1 SET c1 = 50 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 51 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 40 WHERE c1 = 50;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
-- error 0, ER_BAD_NULL_ERROR
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
if (!$mysql_errno)
|
||||
@ -83,6 +88,16 @@ TRUNCATE TABLE t1;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
if (!$skip_delete)
|
||||
{
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
}
|
||||
# InnoDB does reset auto_increment on OPTIMIZE, Bug#18274
|
||||
# Archive does reset auto_increment on OPTIMIZE, Bug#40216
|
||||
OPTIMIZE TABLE t1;
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo # Simple test with NULL
|
||||
@ -184,6 +199,10 @@ if (!$skip_update)
|
||||
{
|
||||
UPDATE t1 SET c1 = 150 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 151 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 140 WHERE c1 = 150;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
-- error 0, ER_BAD_NULL_ERROR
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
if (!$mysql_errno)
|
||||
@ -295,6 +314,15 @@ TRUNCATE TABLE t1;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
if (!$skip_delete)
|
||||
{
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
}
|
||||
# InnoDB does reset auto_increment on OPTIMIZE, Bug#18274
|
||||
OPTIMIZE TABLE t1;
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo # Test with two threads
|
||||
|
@ -13,7 +13,6 @@
|
||||
# part_optA-D Extra partitioning options (E.g. INDEX/DATA DIR) #
|
||||
# #
|
||||
# have_bug33158 NDB case insensitive create, but case sensitive rename #
|
||||
# have_bug37719 Archive, crash when rename and then select #
|
||||
#------------------------------------------------------------------------------#
|
||||
# Original Author: mattiasj #
|
||||
# Original Date: 2008-06-27 #
|
||||
@ -125,18 +124,12 @@ PARTITION BY KEY (a)
|
||||
PARTITION PartD $part_optD);
|
||||
INSERT INTO tablea VALUES (1), (2), (7), (8), (9), (10);
|
||||
SHOW TABLES;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
RENAME TABLE TableA to tableA;
|
||||
}
|
||||
--sorted_result
|
||||
SELECT * FROM tablea;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
--sorted_result
|
||||
SELECT * FROM tableA;
|
||||
RENAME TABLE tableA to TableA;
|
||||
}
|
||||
SHOW CREATE TABLE tablea;
|
||||
DROP TABLE tablea;
|
||||
}
|
||||
@ -262,18 +255,12 @@ PARTITION BY HASH (a)
|
||||
PARTITION PartD $part_optD);
|
||||
INSERT INTO tablea VALUES (1), (2), (7), (8), (9), (10);
|
||||
SHOW TABLES;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
RENAME TABLE TableA to tableA;
|
||||
}
|
||||
--sorted_result
|
||||
SELECT * FROM tablea;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
--sorted_result
|
||||
SELECT * FROM tableA;
|
||||
RENAME TABLE tableA to TableA;
|
||||
}
|
||||
SHOW CREATE TABLE tablea;
|
||||
DROP TABLE tablea;
|
||||
}
|
||||
@ -388,18 +375,12 @@ PARTITION BY RANGE (a)
|
||||
PARTITION PartD VALUES LESS THAN (13) $part_optD);
|
||||
INSERT INTO tablea VALUES (1), (2), (7), (8), (9), (10);
|
||||
SHOW TABLES;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
RENAME TABLE TableA to tableA;
|
||||
}
|
||||
--sorted_result
|
||||
SELECT * FROM tablea;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
--sorted_result
|
||||
SELECT * FROM tableA;
|
||||
RENAME TABLE tableA to TableA;
|
||||
}
|
||||
SHOW CREATE TABLE tablea;
|
||||
DROP TABLE tablea;
|
||||
}
|
||||
@ -516,18 +497,12 @@ PARTITION BY LIST (a)
|
||||
PARTITION PartD VALUES IN (5,6,12) $part_optD);
|
||||
INSERT INTO tablea VALUES (1), (2), (7), (8), (9), (10);
|
||||
SHOW TABLES;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
RENAME TABLE TableA to tableA;
|
||||
}
|
||||
--sorted_result
|
||||
SELECT * FROM tablea;
|
||||
if (!$have_bug37719)
|
||||
{
|
||||
--sorted_result
|
||||
SELECT * FROM tableA;
|
||||
RENAME TABLE tableA to TableA;
|
||||
}
|
||||
SHOW CREATE TABLE tablea;
|
||||
DROP TABLE tablea;
|
||||
}
|
||||
|
@ -105,6 +105,17 @@ c1
|
||||
5
|
||||
6
|
||||
7
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
# Simple test with NULL
|
||||
CREATE TABLE t1 (
|
||||
@ -368,6 +379,19 @@ c1
|
||||
25
|
||||
26
|
||||
27
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY HASH (c1)
|
||||
PARTITIONS 2 */
|
||||
DROP TABLE t1;
|
||||
# Test with two threads
|
||||
# con default
|
||||
|
@ -36,6 +36,12 @@ SET INSERT_ID = 30;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 50 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 51 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 40 WHERE c1 = 50;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
1
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -96,6 +102,18 @@ t1 CREATE TABLE `t1` (
|
||||
) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note The storage engine for the table doesn't support optimize
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
# Simple test with NULL
|
||||
CREATE TABLE t1 (
|
||||
@ -167,6 +185,12 @@ INSERT INTO t1 VALUES (NULL), (90);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 150 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 151 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 140 WHERE c1 = 150;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
1
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
# ERROR (only OK if Blackhole) should give ER_DUP_KEY or ER_DUP_ENTRY
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -278,6 +302,20 @@ t1 CREATE TABLE `t1` (
|
||||
PARTITIONS 2 */
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note The storage engine for the table doesn't support optimize
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY HASH (c1)
|
||||
PARTITIONS 2 */
|
||||
DROP TABLE t1;
|
||||
# Test with two threads
|
||||
# con default
|
||||
|
@ -35,6 +35,12 @@ SET INSERT_ID = 30;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 50 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 51 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 40 WHERE c1 = 50;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
31
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -52,7 +58,7 @@ c1
|
||||
30
|
||||
31
|
||||
32
|
||||
50
|
||||
40
|
||||
51
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (
|
||||
@ -110,6 +116,19 @@ t1 CREATE TABLE `t1` (
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t1 optimize status OK
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
# Simple test with NULL
|
||||
CREATE TABLE t1 (
|
||||
@ -189,6 +208,12 @@ INSERT INTO t1 VALUES (NULL), (90);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 150 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 151 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 140 WHERE c1 = 150;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
141
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -209,10 +234,10 @@ c1
|
||||
60
|
||||
90
|
||||
91
|
||||
150
|
||||
140
|
||||
141
|
||||
142
|
||||
151
|
||||
152
|
||||
153
|
||||
DROP TABLE t1;
|
||||
# Test with auto_increment_increment and auto_increment_offset.
|
||||
CREATE TABLE t1 (
|
||||
@ -359,6 +384,21 @@ PARTITIONS 2 */
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t1 optimize status OK
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY HASH (c1)
|
||||
PARTITIONS 2 */
|
||||
DROP TABLE t1;
|
||||
# Test with two threads
|
||||
# con default
|
||||
|
@ -35,6 +35,12 @@ SET INSERT_ID = 30;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 50 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 51 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 40 WHERE c1 = 50;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
52
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -50,7 +56,7 @@ c1
|
||||
22
|
||||
23
|
||||
30
|
||||
50
|
||||
40
|
||||
51
|
||||
52
|
||||
53
|
||||
@ -110,6 +116,18 @@ t1 CREATE TABLE `t1` (
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note The storage engine for the table doesn't support optimize
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=MEMORY AUTO_INCREMENT=102 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
# Simple test with NULL
|
||||
CREATE TABLE t1 (
|
||||
@ -189,6 +207,12 @@ INSERT INTO t1 VALUES (NULL), (90);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 150 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 151 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 140 WHERE c1 = 150;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
152
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -209,7 +233,7 @@ c1
|
||||
60
|
||||
90
|
||||
91
|
||||
150
|
||||
140
|
||||
151
|
||||
152
|
||||
153
|
||||
@ -359,6 +383,20 @@ PARTITIONS 2 */
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
27
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note The storage engine for the table doesn't support optimize
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=MEMORY AUTO_INCREMENT=102 DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY HASH (c1)
|
||||
PARTITIONS 2 */
|
||||
DROP TABLE t1;
|
||||
# Test with two threads
|
||||
# con default
|
||||
|
@ -35,6 +35,12 @@ SET INSERT_ID = 30;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 50 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 51 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 40 WHERE c1 = 50;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
52
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -50,7 +56,7 @@ c1
|
||||
22
|
||||
23
|
||||
30
|
||||
50
|
||||
40
|
||||
51
|
||||
52
|
||||
53
|
||||
@ -110,6 +116,18 @@ t1 CREATE TABLE `t1` (
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=102 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
# Simple test with NULL
|
||||
CREATE TABLE t1 (
|
||||
@ -189,6 +207,12 @@ INSERT INTO t1 VALUES (NULL), (90);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 150 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 151 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 140 WHERE c1 = 150;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
152
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -209,7 +233,7 @@ c1
|
||||
60
|
||||
90
|
||||
91
|
||||
150
|
||||
140
|
||||
151
|
||||
152
|
||||
153
|
||||
@ -359,6 +383,20 @@ PARTITIONS 2 */
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
27
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=102 DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY HASH (c1)
|
||||
PARTITIONS 2 */
|
||||
DROP TABLE t1;
|
||||
# Test with two threads
|
||||
# con default
|
||||
|
@ -36,6 +36,12 @@ SET INSERT_ID = 30;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 50 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 51 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 40 WHERE c1 = 50;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
52
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -51,7 +57,7 @@ c1
|
||||
22
|
||||
23
|
||||
30
|
||||
50
|
||||
40
|
||||
51
|
||||
52
|
||||
53
|
||||
@ -111,6 +117,18 @@ t1 CREATE TABLE `t1` (
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note The storage engine for the table doesn't support optimize
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
# Simple test with NULL
|
||||
CREATE TABLE t1 (
|
||||
@ -190,6 +208,12 @@ INSERT INTO t1 VALUES (NULL), (90);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
UPDATE t1 SET c1 = 150 WHERE c1 = 17;
|
||||
UPDATE t1 SET c1 = 151 WHERE c1 = 19;
|
||||
FLUSH TABLES;
|
||||
UPDATE t1 SET c1 = 140 WHERE c1 = 150;
|
||||
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test'
|
||||
AND TABLE_NAME='t1';
|
||||
AUTO_INCREMENT
|
||||
152
|
||||
UPDATE t1 SET c1 = NULL WHERE c1 = 4;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
@ -210,7 +234,7 @@ c1
|
||||
60
|
||||
90
|
||||
91
|
||||
150
|
||||
140
|
||||
151
|
||||
152
|
||||
153
|
||||
@ -360,6 +384,20 @@ PARTITIONS 2 */
|
||||
SELECT * FROM t1 ORDER BY c1;
|
||||
c1
|
||||
1
|
||||
INSERT INTO t1 VALUES (100);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
DELETE FROM t1 WHERE c1 >= 100;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note The storage engine for the table doesn't support optimize
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY HASH (c1)
|
||||
PARTITIONS 2 */
|
||||
DROP TABLE t1;
|
||||
# Test with two threads
|
||||
# con default
|
||||
|
@ -170,26 +170,30 @@ SHOW TABLES;
|
||||
Tables_in_MySQL_Test_DB
|
||||
TableA
|
||||
tablea
|
||||
RENAME TABLE TableA to tableA;
|
||||
SELECT * FROM tablea;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
2
|
||||
7
|
||||
8
|
||||
9
|
||||
SELECT * FROM tableA;
|
||||
a
|
||||
1
|
||||
10
|
||||
11
|
||||
12
|
||||
2
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
RENAME TABLE tableA to TableA;
|
||||
SHOW CREATE TABLE tablea;
|
||||
Table Create Table
|
||||
tablea CREATE TABLE `tablea` (
|
||||
@ -206,7 +210,6 @@ ALTER TABLE TableA REMOVE PARTITIONING;
|
||||
SELECT * FROM TableA;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
11
|
||||
12
|
||||
@ -216,10 +219,7 @@ a
|
||||
5
|
||||
6
|
||||
7
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
SHOW CREATE TABLE TableA;
|
||||
Table Create Table
|
||||
@ -406,26 +406,30 @@ SHOW TABLES;
|
||||
Tables_in_MySQL_Test_DB
|
||||
TableA
|
||||
tablea
|
||||
RENAME TABLE TableA to tableA;
|
||||
SELECT * FROM tablea;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
2
|
||||
7
|
||||
8
|
||||
9
|
||||
SELECT * FROM tableA;
|
||||
a
|
||||
1
|
||||
10
|
||||
11
|
||||
12
|
||||
2
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
RENAME TABLE tableA to TableA;
|
||||
SHOW CREATE TABLE tablea;
|
||||
Table Create Table
|
||||
tablea CREATE TABLE `tablea` (
|
||||
@ -442,21 +446,16 @@ ALTER TABLE TableA REMOVE PARTITIONING;
|
||||
SELECT * FROM TableA;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
10
|
||||
11
|
||||
12
|
||||
2
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
SHOW CREATE TABLE TableA;
|
||||
Table Create Table
|
||||
@ -638,26 +637,30 @@ SHOW TABLES;
|
||||
Tables_in_MySQL_Test_DB
|
||||
TableA
|
||||
tablea
|
||||
RENAME TABLE TableA to tableA;
|
||||
SELECT * FROM tablea;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
2
|
||||
7
|
||||
8
|
||||
9
|
||||
SELECT * FROM tableA;
|
||||
a
|
||||
1
|
||||
10
|
||||
11
|
||||
12
|
||||
2
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
RENAME TABLE tableA to TableA;
|
||||
SHOW CREATE TABLE tablea;
|
||||
Table Create Table
|
||||
tablea CREATE TABLE `tablea` (
|
||||
@ -674,22 +677,16 @@ ALTER TABLE TableA REMOVE PARTITIONING;
|
||||
SELECT * FROM TableA;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
10
|
||||
11
|
||||
12
|
||||
2
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
SHOW CREATE TABLE TableA;
|
||||
Table Create Table
|
||||
@ -866,23 +863,27 @@ SHOW TABLES;
|
||||
Tables_in_MySQL_Test_DB
|
||||
TableA
|
||||
tablea
|
||||
RENAME TABLE TableA to tableA;
|
||||
SELECT * FROM tablea;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
12
|
||||
2
|
||||
7
|
||||
8
|
||||
9
|
||||
SELECT * FROM tableA;
|
||||
a
|
||||
1
|
||||
12
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
RENAME TABLE tableA to TableA;
|
||||
SHOW CREATE TABLE tablea;
|
||||
Table Create Table
|
||||
tablea CREATE TABLE `tablea` (
|
||||
@ -899,19 +900,13 @@ ALTER TABLE TableA REMOVE PARTITIONING;
|
||||
SELECT * FROM TableA;
|
||||
a
|
||||
1
|
||||
1
|
||||
10
|
||||
12
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
7
|
||||
8
|
||||
8
|
||||
9
|
||||
9
|
||||
SHOW CREATE TABLE TableA;
|
||||
Table Create Table
|
||||
|
@ -31,7 +31,6 @@
|
||||
|
||||
#------------------------------------------------------------------------------#
|
||||
# Engine specific settings and requirements
|
||||
let $have_bug37719= 1;
|
||||
|
||||
##### Storage engine to be tested
|
||||
--source include/have_archive.inc
|
||||
|
59
mysql-test/t/partition_innodb_stmt.test
Normal file
59
mysql-test/t/partition_innodb_stmt.test
Normal file
@ -0,0 +1,59 @@
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--echo # connection default
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
|
||||
CREATE TABLE t1
|
||||
(
|
||||
id SMALLINT NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=innodb
|
||||
PARTITION BY RANGE (id)
|
||||
(
|
||||
PARTITION p1 VALUES LESS THAN (2),
|
||||
PARTITION p2 VALUES LESS THAN (4),
|
||||
PARTITION p3 VALUES LESS THAN (10)
|
||||
);
|
||||
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
|
||||
--echo # Test READ COMMITTED -> REPEATABLE READ
|
||||
FLUSH TABLES;
|
||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
|
||||
connect (con1, localhost, root,,);
|
||||
connection con1;
|
||||
|
||||
--echo #connection con1
|
||||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(7);
|
||||
COMMIT;
|
||||
|
||||
connection default;
|
||||
--echo # connection default
|
||||
COMMIT;
|
||||
|
||||
FLUSH TABLES;
|
||||
|
||||
--echo # Test REPEATABLE READ -> READ COMMITTED
|
||||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
|
||||
connection con1;
|
||||
|
||||
--echo # connection con1
|
||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
BEGIN;
|
||||
--error ER_BINLOG_LOGGING_IMPOSSIBLE
|
||||
INSERT INTO t1 VALUES(9);
|
||||
COMMIT;
|
||||
|
||||
disconnect con1;
|
||||
connection default;
|
||||
COMMIT;
|
||||
DROP TABLE t1;
|
@ -107,7 +107,7 @@ static handler *partition_create_handler(handlerton *hton,
|
||||
MEM_ROOT *mem_root)
|
||||
{
|
||||
ha_partition *file= new (mem_root) ha_partition(hton, share);
|
||||
if (file && file->initialise_partition(mem_root))
|
||||
if (file && file->initialize_partition(mem_root))
|
||||
{
|
||||
delete file;
|
||||
file= 0;
|
||||
@ -160,8 +160,7 @@ const uint ha_partition::NO_CURRENT_PART_ID= 0xFFFFFFFF;
|
||||
|
||||
ha_partition::ha_partition(handlerton *hton, TABLE_SHARE *share)
|
||||
:handler(hton, share), m_part_info(NULL), m_create_handler(FALSE),
|
||||
m_is_sub_partitioned(0), is_clone(FALSE), auto_increment_lock(FALSE),
|
||||
auto_increment_safe_stmt_log_lock(FALSE)
|
||||
m_is_sub_partitioned(0)
|
||||
{
|
||||
DBUG_ENTER("ha_partition::ha_partition(table)");
|
||||
init_handler_variables();
|
||||
@ -181,10 +180,8 @@ ha_partition::ha_partition(handlerton *hton, TABLE_SHARE *share)
|
||||
*/
|
||||
|
||||
ha_partition::ha_partition(handlerton *hton, partition_info *part_info)
|
||||
:handler(hton, NULL), m_part_info(part_info),
|
||||
m_create_handler(TRUE),
|
||||
m_is_sub_partitioned(m_part_info->is_sub_partitioned()), is_clone(FALSE),
|
||||
auto_increment_lock(FALSE), auto_increment_safe_stmt_log_lock(FALSE)
|
||||
:handler(hton, NULL), m_part_info(part_info), m_create_handler(TRUE),
|
||||
m_is_sub_partitioned(m_part_info->is_sub_partitioned())
|
||||
{
|
||||
DBUG_ENTER("ha_partition::ha_partition(part_info)");
|
||||
init_handler_variables();
|
||||
@ -194,7 +191,7 @@ ha_partition::ha_partition(handlerton *hton, partition_info *part_info)
|
||||
|
||||
|
||||
/*
|
||||
Initialise handler object
|
||||
Initialize handler object
|
||||
|
||||
SYNOPSIS
|
||||
init_handler_variables()
|
||||
@ -231,7 +228,7 @@ void ha_partition::init_handler_variables()
|
||||
m_innodb= FALSE;
|
||||
m_extra_cache= FALSE;
|
||||
m_extra_cache_size= 0;
|
||||
m_table_flags= HA_FILE_BASED | HA_REC_NOT_IN_SEQ;
|
||||
m_handler_status= handler_not_initialized;
|
||||
m_low_byte_first= 1;
|
||||
m_part_field_array= NULL;
|
||||
m_ordered_rec_buffer= NULL;
|
||||
@ -241,6 +238,9 @@ void ha_partition::init_handler_variables()
|
||||
m_rec0= 0;
|
||||
m_curr_key_info[0]= NULL;
|
||||
m_curr_key_info[1]= NULL;
|
||||
is_clone= FALSE,
|
||||
auto_increment_lock= FALSE;
|
||||
auto_increment_safe_stmt_log_lock= FALSE;
|
||||
/*
|
||||
this allows blackhole to work properly
|
||||
*/
|
||||
@ -287,10 +287,10 @@ ha_partition::~ha_partition()
|
||||
|
||||
|
||||
/*
|
||||
Initialise partition handler object
|
||||
Initialize partition handler object
|
||||
|
||||
SYNOPSIS
|
||||
initialise_partition()
|
||||
initialize_partition()
|
||||
mem_root Allocate memory through this
|
||||
|
||||
RETURN VALUE
|
||||
@ -320,8 +320,8 @@ ha_partition::~ha_partition()
|
||||
normal storage engine
|
||||
The flag HA_FILE_BASED will be set independent of the underlying handlers
|
||||
4) Index flags initialisation
|
||||
When knowledge exists on the indexes it is also possible to initialise the
|
||||
index flags. Again the index flags must be initialised by using the under-
|
||||
When knowledge exists on the indexes it is also possible to initialize the
|
||||
index flags. Again the index flags must be initialized by using the under-
|
||||
lying handlers since this is storage engine dependent.
|
||||
The flag HA_READ_ORDER will be reset for the time being to indicate no
|
||||
ordered output is available from partition handler indexes. Later a merge
|
||||
@ -331,10 +331,11 @@ ha_partition::~ha_partition()
|
||||
|
||||
*/
|
||||
|
||||
bool ha_partition::initialise_partition(MEM_ROOT *mem_root)
|
||||
bool ha_partition::initialize_partition(MEM_ROOT *mem_root)
|
||||
{
|
||||
handler **file_array, *file;
|
||||
DBUG_ENTER("ha_partition::initialise_partition");
|
||||
ulonglong check_table_flags;
|
||||
DBUG_ENTER("ha_partition::initialize_partition");
|
||||
|
||||
if (m_create_handler)
|
||||
{
|
||||
@ -346,11 +347,9 @@ bool ha_partition::initialise_partition(MEM_ROOT *mem_root)
|
||||
else if (!table_share || !table_share->normalized_path.str)
|
||||
{
|
||||
/*
|
||||
Called with dummy table share (delete, rename and alter table)
|
||||
Don't need to set-up table flags other than
|
||||
HA_FILE_BASED here
|
||||
Called with dummy table share (delete, rename and alter table).
|
||||
Don't need to set-up anything.
|
||||
*/
|
||||
m_table_flags|= HA_FILE_BASED | HA_REC_NOT_IN_SEQ;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
else if (get_from_handler_file(table_share->normalized_path.str, mem_root))
|
||||
@ -362,15 +361,12 @@ bool ha_partition::initialise_partition(MEM_ROOT *mem_root)
|
||||
We create all underlying table handlers here. We do it in this special
|
||||
method to be able to report allocation errors.
|
||||
|
||||
Set up table_flags, low_byte_first, primary_key_is_clustered and
|
||||
Set up low_byte_first, primary_key_is_clustered and
|
||||
has_transactions since they are called often in all kinds of places,
|
||||
other parameters are calculated on demand.
|
||||
HA_FILE_BASED is always set for partition handler since we use a
|
||||
special file for handling names of partitions, engine types.
|
||||
HA_CAN_GEOMETRY, HA_CAN_FULLTEXT, HA_CAN_SQL_HANDLER, HA_DUPLICATE_POS,
|
||||
HA_CAN_INSERT_DELAYED is disabled until further investigated.
|
||||
Verify that all partitions have the same table_flags.
|
||||
*/
|
||||
m_table_flags= (ulong)m_file[0]->ha_table_flags();
|
||||
check_table_flags= m_file[0]->ha_table_flags();
|
||||
m_low_byte_first= m_file[0]->low_byte_first();
|
||||
m_pkey_is_clustered= TRUE;
|
||||
file_array= m_file;
|
||||
@ -385,12 +381,13 @@ bool ha_partition::initialise_partition(MEM_ROOT *mem_root)
|
||||
}
|
||||
if (!file->primary_key_is_clustered())
|
||||
m_pkey_is_clustered= FALSE;
|
||||
m_table_flags&= file->ha_table_flags();
|
||||
if (check_table_flags != file->ha_table_flags())
|
||||
{
|
||||
my_error(ER_MIX_HANDLER_ERROR, MYF(0));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
} while (*(++file_array));
|
||||
m_table_flags&= ~(HA_CAN_GEOMETRY | HA_CAN_FULLTEXT | HA_DUPLICATE_POS |
|
||||
HA_CAN_SQL_HANDLER | HA_CAN_INSERT_DELAYED |
|
||||
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION);
|
||||
m_table_flags|= HA_FILE_BASED | HA_REC_NOT_IN_SEQ;
|
||||
m_handler_status= handler_initialized;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
@ -2399,6 +2396,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
handler **file;
|
||||
char name_buff[FN_REFLEN];
|
||||
bool is_not_tmp_table= (table_share->tmp_table == NO_TMP_TABLE);
|
||||
ulonglong check_table_flags= 0;
|
||||
DBUG_ENTER("ha_partition::open");
|
||||
|
||||
DBUG_ASSERT(table->s == table_share);
|
||||
@ -2438,7 +2436,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialise the bitmap we use to determine what partitions are used */
|
||||
/* Initialize the bitmap we use to determine what partitions are used */
|
||||
if (!is_clone)
|
||||
{
|
||||
if (bitmap_init(&(m_part_info->used_partitions), NULL, m_tot_parts, TRUE))
|
||||
@ -2446,8 +2444,6 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
bitmap_set_all(&(m_part_info->used_partitions));
|
||||
}
|
||||
|
||||
/* Recalculate table flags as they may change after open */
|
||||
m_table_flags= m_file[0]->ha_table_flags();
|
||||
file= m_file;
|
||||
do
|
||||
{
|
||||
@ -2459,11 +2455,26 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
m_no_locks+= (*file)->lock_count();
|
||||
name_buffer_ptr+= strlen(name_buffer_ptr) + 1;
|
||||
set_if_bigger(ref_length, ((*file)->ref_length));
|
||||
m_table_flags&= (*file)->ha_table_flags();
|
||||
/*
|
||||
Verify that all partitions have the same set of table flags.
|
||||
Mask all flags that partitioning enables/disables.
|
||||
*/
|
||||
if (!check_table_flags)
|
||||
{
|
||||
check_table_flags= (((*file)->ha_table_flags() &
|
||||
~(PARTITION_DISABLED_TABLE_FLAGS)) |
|
||||
(PARTITION_ENABLED_TABLE_FLAGS));
|
||||
}
|
||||
else if (check_table_flags != (((*file)->ha_table_flags() &
|
||||
~(PARTITION_DISABLED_TABLE_FLAGS)) |
|
||||
(PARTITION_ENABLED_TABLE_FLAGS)))
|
||||
{
|
||||
DBUG_PRINT("error", ("check_table_flag 0x%x != 0x%x table_flags()",
|
||||
check_table_flags, (*file)->ha_table_flags()));
|
||||
error= HA_ERR_INITIALIZATION;
|
||||
goto err_handler;
|
||||
}
|
||||
} while (*(++file));
|
||||
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;
|
||||
/*
|
||||
@ -2478,7 +2489,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
*/
|
||||
clear_handler_file();
|
||||
/*
|
||||
Initialise priority queue, initialised to reading forward.
|
||||
Initialize priority queue, initialized to reading forward.
|
||||
*/
|
||||
if ((error= init_queue(&m_queue, m_tot_parts, (uint) PARTITION_BYTES_IN_POS,
|
||||
0, key_rec_cmp, (void*)this)))
|
||||
@ -2514,6 +2525,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
to ensure we have correct statistics we call info from open after
|
||||
calling open on all individual handlers.
|
||||
*/
|
||||
m_handler_status= handler_opened;
|
||||
info(HA_STATUS_VARIABLE | HA_STATUS_CONST);
|
||||
DBUG_RETURN(0);
|
||||
|
||||
@ -2584,6 +2596,7 @@ repeat:
|
||||
goto repeat;
|
||||
}
|
||||
|
||||
m_handler_status= handler_closed;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
@ -2985,17 +2998,6 @@ int ha_partition::update_row(const uchar *old_data, uchar *new_data)
|
||||
DBUG_PRINT("info", ("Update in partition %d", new_part_id));
|
||||
tmp_disable_binlog(thd); /* Do not replicate the low-level changes. */
|
||||
error= m_file[new_part_id]->ha_update_row(old_data, new_data);
|
||||
/*
|
||||
if updating an auto_increment column, update
|
||||
table_share->ha_data->next_auto_inc_val if needed.
|
||||
(not to be used if auto_increment on secondary field in a multi-
|
||||
column index)
|
||||
mysql_update does not set table->next_number_field, so we use
|
||||
table->found_next_number_field instead.
|
||||
*/
|
||||
if (table->found_next_number_field && new_data == table->record[0] &&
|
||||
!table->s->next_number_keypart)
|
||||
set_auto_increment_if_higher(table->found_next_number_field->val_int());
|
||||
reenable_binlog(thd);
|
||||
goto exit;
|
||||
}
|
||||
@ -3005,9 +3007,6 @@ int ha_partition::update_row(const uchar *old_data, uchar *new_data)
|
||||
old_part_id, new_part_id));
|
||||
tmp_disable_binlog(thd); /* Do not replicate the low-level changes. */
|
||||
error= m_file[new_part_id]->ha_write_row(new_data);
|
||||
if (table->found_next_number_field && new_data == table->record[0] &&
|
||||
!table->s->next_number_keypart)
|
||||
set_auto_increment_if_higher(table->found_next_number_field->val_int());
|
||||
reenable_binlog(thd);
|
||||
if (error)
|
||||
goto exit;
|
||||
@ -3025,6 +3024,22 @@ int ha_partition::update_row(const uchar *old_data, uchar *new_data)
|
||||
}
|
||||
|
||||
exit:
|
||||
/*
|
||||
if updating an auto_increment column, update
|
||||
table_share->ha_data->next_auto_inc_val if needed.
|
||||
(not to be used if auto_increment on secondary field in a multi-column
|
||||
index)
|
||||
mysql_update does not set table->next_number_field, so we use
|
||||
table->found_next_number_field instead.
|
||||
*/
|
||||
if (table->found_next_number_field && new_data == table->record[0] &&
|
||||
!table->s->next_number_keypart)
|
||||
{
|
||||
HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data;
|
||||
if (!ha_data->auto_inc_initialized)
|
||||
info(HA_STATUS_AUTO);
|
||||
set_auto_increment_if_higher(table->found_next_number_field->val_int());
|
||||
}
|
||||
table->timestamp_field_type= orig_timestamp_type;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
@ -3571,7 +3586,7 @@ int ha_partition::rnd_pos_by_record(uchar *record)
|
||||
*/
|
||||
|
||||
/*
|
||||
Initialise handler before start of index scan
|
||||
Initialize handler before start of index scan
|
||||
|
||||
SYNOPSIS
|
||||
index_init()
|
||||
@ -4456,7 +4471,7 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
|
||||
{
|
||||
found= TRUE;
|
||||
/*
|
||||
Initialise queue without order first, simply insert
|
||||
Initialize queue without order first, simply insert
|
||||
*/
|
||||
queue_element(&m_queue, j++)= (uchar*)queue_buf(i);
|
||||
}
|
||||
@ -4777,7 +4792,7 @@ int ha_partition::info(uint flag)
|
||||
}
|
||||
} while (*(++file_array));
|
||||
if (stats.records < 2 &&
|
||||
!(m_table_flags & HA_STATS_RECORDS_IS_EXACT))
|
||||
!(m_file[0]->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT))
|
||||
stats.records= 2;
|
||||
if (stats.records > 0)
|
||||
stats.mean_rec_length= (ulong) (stats.data_file_length / stats.records);
|
||||
@ -5151,7 +5166,7 @@ void ha_partition::get_dynamic_partition_info(PARTITION_INFO *stat_info,
|
||||
5) Parameters only used by MyISAM internally
|
||||
--------------------------------------------
|
||||
HA_EXTRA_REINIT_CACHE:
|
||||
This call reinitialises the READ CACHE described above if there is one
|
||||
This call reinitializes the READ CACHE described above if there is one
|
||||
and otherwise the call is ignored.
|
||||
|
||||
We can thus safely call it on all underlying handlers if they are
|
||||
@ -5233,7 +5248,6 @@ int ha_partition::extra(enum ha_extra_function operation)
|
||||
break;
|
||||
case HA_EXTRA_NORMAL:
|
||||
case HA_EXTRA_QUICK:
|
||||
case HA_EXTRA_NO_READCHECK:
|
||||
case HA_EXTRA_PREPARE_FOR_UPDATE:
|
||||
case HA_EXTRA_FORCE_REOPEN:
|
||||
case HA_EXTRA_PREPARE_FOR_DROP:
|
||||
@ -5243,6 +5257,14 @@ int ha_partition::extra(enum ha_extra_function operation)
|
||||
DBUG_RETURN(loop_extra(operation));
|
||||
break;
|
||||
}
|
||||
case HA_EXTRA_NO_READCHECK:
|
||||
{
|
||||
/*
|
||||
This is only done as a part of ha_open, which is also used in
|
||||
ha_partition::open, so no need to do anything.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
case HA_EXTRA_CACHE:
|
||||
{
|
||||
prepare_extra_cache(0);
|
||||
@ -6154,7 +6176,7 @@ void ha_partition::release_auto_increment()
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
MODULE initialise handler for HANDLER call
|
||||
MODULE initialize handler for HANDLER call
|
||||
****************************************************************************/
|
||||
|
||||
void ha_partition::init_table_handle_for_HANDLER()
|
||||
@ -6247,7 +6269,7 @@ int ha_partition::indexes_are_disabled(void)
|
||||
-------------------------------------------------------------------------
|
||||
Variables for partition share methods. A hash used to track open tables.
|
||||
A mutex for the hash table and an init variable to check if hash table
|
||||
is initialised.
|
||||
is initialized.
|
||||
There is also a constant ending of the partition handler file name.
|
||||
*/
|
||||
|
||||
|
@ -48,6 +48,13 @@ typedef struct st_ha_data_partition
|
||||
} HA_DATA_PARTITION;
|
||||
|
||||
#define PARTITION_BYTES_IN_POS 2
|
||||
#define PARTITION_ENABLED_TABLE_FLAGS (HA_FILE_BASED | HA_REC_NOT_IN_SEQ)
|
||||
#define PARTITION_DISABLED_TABLE_FLAGS (HA_CAN_GEOMETRY | \
|
||||
HA_CAN_FULLTEXT | \
|
||||
HA_DUPLICATE_POS | \
|
||||
HA_CAN_SQL_HANDLER | \
|
||||
HA_CAN_INSERT_DELAYED | \
|
||||
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION)
|
||||
class ha_partition :public handler
|
||||
{
|
||||
private:
|
||||
@ -92,8 +99,15 @@ private:
|
||||
for this since the MySQL Server sometimes allocating the handler object
|
||||
without freeing them.
|
||||
*/
|
||||
longlong m_table_flags;
|
||||
ulong m_low_byte_first;
|
||||
enum enum_handler_status
|
||||
{
|
||||
handler_not_initialized= 0,
|
||||
handler_initialized,
|
||||
handler_opened,
|
||||
handler_closed
|
||||
};
|
||||
enum_handler_status m_handler_status;
|
||||
|
||||
uint m_reorged_parts; // Number of reorganised parts
|
||||
uint m_tot_parts; // Total number of partitions;
|
||||
@ -189,7 +203,7 @@ public:
|
||||
enable later calls of the methods to retrieve constants from the under-
|
||||
lying handlers. Returns false if not successful.
|
||||
*/
|
||||
bool initialise_partition(MEM_ROOT *mem_root);
|
||||
bool initialize_partition(MEM_ROOT *mem_root);
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------
|
||||
@ -594,6 +608,8 @@ public:
|
||||
The partition handler will support whatever the underlying handlers
|
||||
support except when specifically mentioned below about exceptions
|
||||
to this rule.
|
||||
NOTE: This cannot be cached since it can depend on TRANSACTION ISOLATION
|
||||
LEVEL which is dynamic, see bug#39084.
|
||||
|
||||
HA_READ_RND_SAME:
|
||||
Not currently used. (Means that the handler supports the rnd_same() call)
|
||||
@ -718,9 +734,33 @@ public:
|
||||
transfer those calls into index_read and other calls in the
|
||||
index scan module.
|
||||
(NDB)
|
||||
|
||||
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION:
|
||||
Does the storage engine need a PK for position?
|
||||
Used with hidden primary key in InnoDB.
|
||||
Hidden primary keys cannot be supported by partitioning, since the
|
||||
partitioning expressions columns must be a part of the primary key.
|
||||
(InnoDB)
|
||||
|
||||
HA_FILE_BASED is always set for partition handler since we use a
|
||||
special file for handling names of partitions, engine types.
|
||||
HA_REC_NOT_IN_SEQ is always set for partition handler since we cannot
|
||||
guarantee that the records will be returned in sequence.
|
||||
HA_CAN_GEOMETRY, HA_CAN_FULLTEXT, HA_CAN_SQL_HANDLER, HA_DUPLICATE_POS,
|
||||
HA_CAN_INSERT_DELAYED, HA_PRIMARY_KEY_REQUIRED_FOR_POSITION is disabled
|
||||
until further investigated.
|
||||
*/
|
||||
virtual ulonglong table_flags() const
|
||||
{ return m_table_flags; }
|
||||
virtual Table_flags table_flags() const
|
||||
{
|
||||
DBUG_ENTER("ha_partition::table_flags");
|
||||
if (m_handler_status < handler_initialized ||
|
||||
m_handler_status >= handler_closed)
|
||||
DBUG_RETURN(PARTITION_ENABLED_TABLE_FLAGS);
|
||||
else
|
||||
DBUG_RETURN((m_file[0]->ha_table_flags() &
|
||||
~(PARTITION_DISABLED_TABLE_FLAGS)) |
|
||||
(PARTITION_ENABLED_TABLE_FLAGS));
|
||||
}
|
||||
|
||||
/*
|
||||
This is a bitmap of flags that says how the storage engine
|
||||
@ -892,10 +932,10 @@ private:
|
||||
{
|
||||
HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data;
|
||||
lock_auto_increment();
|
||||
DBUG_ASSERT(ha_data->auto_inc_initialized == TRUE);
|
||||
/* must check when the mutex is taken */
|
||||
if (nr >= ha_data->next_auto_inc_val)
|
||||
ha_data->next_auto_inc_val= nr + 1;
|
||||
ha_data->auto_inc_initialized= TRUE;
|
||||
unlock_auto_increment();
|
||||
}
|
||||
|
||||
@ -903,7 +943,7 @@ public:
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------
|
||||
MODULE initialise handler for HANDLER call
|
||||
MODULE initialize handler for HANDLER call
|
||||
-------------------------------------------------------------------------
|
||||
This method is a special InnoDB method called before a HANDLER query.
|
||||
-------------------------------------------------------------------------
|
||||
|
@ -263,7 +263,7 @@ handler *get_ha_partition(partition_info *part_info)
|
||||
DBUG_ENTER("get_ha_partition");
|
||||
if ((partition= new ha_partition(partition_hton, part_info)))
|
||||
{
|
||||
if (partition->initialise_partition(current_thd->mem_root))
|
||||
if (partition->initialize_partition(current_thd->mem_root))
|
||||
{
|
||||
delete partition;
|
||||
partition= 0;
|
||||
|
@ -1198,6 +1198,9 @@ public:
|
||||
{
|
||||
return inited == INDEX ? ha_index_end() : inited == RND ? ha_rnd_end() : 0;
|
||||
}
|
||||
/**
|
||||
The cached_table_flags is set at ha_open and ha_external_lock
|
||||
*/
|
||||
Table_flags ha_table_flags() const { return cached_table_flags; }
|
||||
/**
|
||||
These functions represent the public interface to *users* of the
|
||||
|
@ -171,7 +171,7 @@ int archive_db_init(void *p)
|
||||
|
||||
if (pthread_mutex_init(&archive_mutex, MY_MUTEX_INIT_FAST))
|
||||
goto error;
|
||||
if (hash_init(&archive_open_tables, system_charset_info, 32, 0, 0,
|
||||
if (hash_init(&archive_open_tables, table_alias_charset, 32, 0, 0,
|
||||
(hash_get_key) archive_get_key, 0, 0))
|
||||
{
|
||||
VOID(pthread_mutex_destroy(&archive_mutex));
|
||||
|
Loading…
x
Reference in New Issue
Block a user