Commit 1e148f91 authored by Staale Smedseng's avatar Staale Smedseng

Merge from 5.1-bugteam

parents f46dba5a 55a426f1
...@@ -47,8 +47,13 @@ check_cpu () { ...@@ -47,8 +47,13 @@ check_cpu () {
model_name=`sysctl -n hw.model` model_name=`sysctl -n hw.model`
;; ;;
Darwin) Darwin)
cpu_family=`uname -p` cpu_family=`sysctl -n machdep.cpu.vendor`
model_name=`machine` model_name=`sysctl -n machdep.cpu.brand_string`
if [ -z "$cpu_family" -o -z "$model_name" ]
then
cpu_family=`uname -p`
model_name=`machine`
fi
;; ;;
*) *)
cpu_family=`uname -m`; cpu_family=`uname -m`;
......
...@@ -1498,43 +1498,12 @@ INSERT INTO t1 VALUES ...@@ -1498,43 +1498,12 @@ INSERT INTO t1 VALUES
(4,1,3,'pk',NULL),(5,1,3,'c2',NULL), (4,1,3,'pk',NULL),(5,1,3,'c2',NULL),
(2,1,4,'c_extra',NULL),(3,1,4,'c_extra',NULL); (2,1,4,'c_extra',NULL),(3,1,4,'c_extra',NULL);
EXPLAIN SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC;
SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC;
DROP TABLE t1; DROP TABLE t1;
#
# Bug#21704: Renaming column does not update FK definition.
#
#
# --disable_warnings
# DROP TABLE IF EXISTS t1;
# DROP TABLE IF EXISTS t2;
# --enable_warnings
#
# CREATE TABLE t1(id INT PRIMARY KEY)
# ENGINE=innodb;
#
# CREATE TABLE t2(
# t1_id INT PRIMARY KEY,
# CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
# ENGINE=innodb;
#
# --echo
#
# --disable_result_log
# --error ER_ERROR_ON_RENAME
# ALTER TABLE t1 CHANGE id id2 INT;
# --enable_result_log
#
# --echo
#
# DROP TABLE t2;
# DROP TABLE t1;
#
--echo # --echo #
--echo # Bug #44290: explain crashes for subquery with distinct in --echo # Bug #44290: explain crashes for subquery with distinct in
--echo # SQL_SELECT::test_quick_select --echo # SQL_SELECT::test_quick_select
......
...@@ -139,9 +139,9 @@ INSERT INTO global_suppressions VALUES ...@@ -139,9 +139,9 @@ INSERT INTO global_suppressions VALUES
("Cannot find or open table test\/bug29807 from"), ("Cannot find or open table test\/bug29807 from"),
/* innodb foreign key tests that fail in ALTER or RENAME produce this */ /* innodb foreign key tests that fail in ALTER or RENAME produce this */
("InnoDB: Error: in ALTER TABLE `test`.`t[12]`"), ("InnoDB: Error: in ALTER TABLE `test`.`t[123]`"),
("InnoDB: Error: in RENAME TABLE table `test`.`t1`"), ("InnoDB: Error: in RENAME TABLE table `test`.`t1`"),
("InnoDB: Error: table `test`.`t[12]` does not exist in the InnoDB internal"), ("InnoDB: Error: table `test`.`t[123]` does not exist in the InnoDB internal"),
/* Test case for Bug#14233 produces the following warnings: */ /* Test case for Bug#14233 produces the following warnings: */
("Stored routine 'test'.'bug14233_1': invalid value in column mysql.proc"), ("Stored routine 'test'.'bug14233_1': invalid value in column mysql.proc"),
......
...@@ -89,7 +89,7 @@ static void die(const char* fmt, ...) ...@@ -89,7 +89,7 @@ static void die(const char* fmt, ...)
} }
static void kill_child (void) static void kill_child(void)
{ {
int status= 0; int status= 0;
...@@ -119,7 +119,7 @@ static void kill_child (void) ...@@ -119,7 +119,7 @@ static void kill_child (void)
} }
static void handle_abort (int sig) extern "C" void handle_abort(int sig)
{ {
message("Got signal %d, child_pid: %d, sending ABRT", sig, child_pid); message("Got signal %d, child_pid: %d, sending ABRT", sig, child_pid);
...@@ -128,8 +128,8 @@ static void handle_abort (int sig) ...@@ -128,8 +128,8 @@ static void handle_abort (int sig)
} }
} }
static void handle_signal (int sig) extern "C" void handle_signal(int sig)
{ {
message("Got signal %d, child_pid: %d", sig, child_pid); message("Got signal %d, child_pid: %d", sig, child_pid);
terminated= 1; terminated= 1;
...@@ -152,7 +152,7 @@ int main(int argc, char* const argv[] ) ...@@ -152,7 +152,7 @@ int main(int argc, char* const argv[] )
pid_t own_pid= getpid(); pid_t own_pid= getpid();
pid_t parent_pid= getppid(); pid_t parent_pid= getppid();
bool nocore = false; bool nocore = false;
/* Install signal handlers */ /* Install signal handlers */
signal(SIGTERM, handle_signal); signal(SIGTERM, handle_signal);
signal(SIGINT, handle_signal); signal(SIGINT, handle_signal);
...@@ -232,10 +232,11 @@ int main(int argc, char* const argv[] ) ...@@ -232,10 +232,11 @@ int main(int argc, char* const argv[] )
message("setrlimit failed, errno=%d", errno); message("setrlimit failed, errno=%d", errno);
} }
} }
// Signal that child is ready // Signal that child is ready
buf= 37; buf= 37;
write(pfd[1], &buf, 1); if ((write(pfd[1], &buf, 1)) < 1)
die("Failed to signal that child is ready");
// Close write end // Close write end
close(pfd[1]); close(pfd[1]);
...@@ -246,8 +247,10 @@ int main(int argc, char* const argv[] ) ...@@ -246,8 +247,10 @@ int main(int argc, char* const argv[] )
close(pfd[1]); // Close unused write end close(pfd[1]); // Close unused write end
// Wait for child to signal it's ready // Wait for child to signal it's ready
read(pfd[0], &buf, 1); if ((read(pfd[0], &buf, 1)) < 1)
if(buf != 37) die("Failed to read signal from child");
if (buf != 37)
die("Didn't get 37 from pipe"); die("Didn't get 37 from pipe");
close(pfd[0]); // Close read end close(pfd[0]); // Close read end
...@@ -272,7 +275,7 @@ int main(int argc, char* const argv[] ) ...@@ -272,7 +275,7 @@ int main(int argc, char* const argv[] )
if (WIFEXITED(status)) if (WIFEXITED(status))
{ {
// Process has exited, collect return status // Process has exited, collect return status
int ret_code= WEXITSTATUS(status); ret_code= WEXITSTATUS(status);
message("Child exit: %d", ret_code); message("Child exit: %d", ret_code);
// Exit with exit status of the child // Exit with exit status of the child
exit(ret_code); exit(ret_code);
...@@ -287,6 +290,6 @@ int main(int argc, char* const argv[] ) ...@@ -287,6 +290,6 @@ int main(int argc, char* const argv[] )
} }
kill_child(); kill_child();
exit(1); return 1;
} }
#
# Bug #46080: group_concat(... order by) crashes server when
# sort_buffer_size cannot allocate
#
CREATE TABLE t1(a CHAR(255));
INSERT INTO t1 VALUES ('a');
SET @@SESSION.sort_buffer_size=5*16*1000000;
SET @@SESSION.max_heap_table_size=5*1000000;
# Must not crash.
SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a;
Got one of the listed errors
DROP TABLE t1;
SET @@SESSION.sort_buffer_size=default;
SET @@SESSION.max_heap_table_size=default;
End of 5.0 tests
#
# Bug#21704: Renaming column does not update FK definition.
#
# Test that it's not possible to rename columns participating in a
# foreign key (either in the referencing or referenced table).
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT ENGINE=INNODB;
CREATE TABLE t2 (a INT PRIMARY KEY, b INT,
CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1(a))
ROW_FORMAT=COMPACT ENGINE=INNODB;
CREATE TABLE t3 (a INT PRIMARY KEY, b INT, KEY(b), C INT,
CONSTRAINT fk2 FOREIGN KEY (b) REFERENCES t3 (a))
ROW_FORMAT=COMPACT ENGINE=INNODB;
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
INSERT INTO t3 VALUES (1,1,1),(2,2,2),(3,3,3);
# Test renaming the column in the referenced table.
ALTER TABLE t1 CHANGE a c INT;
ERROR HY000: Error on rename of '#sql-temporary' to './test/t1' (errno: 150)
# Ensure that online column rename works.
ALTER TABLE t1 CHANGE b c INT;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
# Test renaming the column in the referencing table
ALTER TABLE t2 CHANGE a c INT;
ERROR HY000: Error on rename of '#sql-temporary' to './test/t2' (errno: 150)
# Ensure that online column rename works.
ALTER TABLE t2 CHANGE b c INT;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
# Test with self-referential constraints
ALTER TABLE t3 CHANGE a d INT;
ERROR HY000: Error on rename of '#sql-temporary' to './test/t3' (errno: 150)
ALTER TABLE t3 CHANGE b d INT;
ERROR HY000: Error on rename of '#sql-temporary' to './test/t3' (errno: 150)
# Ensure that online column rename works.
ALTER TABLE t3 CHANGE c d INT;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
# Cleanup.
DROP TABLE t3;
DROP TABLE t2;
DROP TABLE t1;
...@@ -11,11 +11,15 @@ set global innodb_commit_concurrency=42; ...@@ -11,11 +11,15 @@ set global innodb_commit_concurrency=42;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
@@innodb_commit_concurrency @@innodb_commit_concurrency
42 42
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
1
set global innodb_commit_concurrency=0; set global innodb_commit_concurrency=0;
ERROR HY000: Incorrect arguments to SET ERROR HY000: Incorrect arguments to SET
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
@@innodb_commit_concurrency @@innodb_commit_concurrency
42 1
set global innodb_commit_concurrency=1; set global innodb_commit_concurrency=1;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
@@innodb_commit_concurrency @@innodb_commit_concurrency
......
...@@ -16,3 +16,7 @@ set global innodb_commit_concurrency=0; ...@@ -16,3 +16,7 @@ set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
@@innodb_commit_concurrency @@innodb_commit_concurrency
0 0
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
0
...@@ -1701,10 +1701,10 @@ INSERT INTO t1 VALUES ...@@ -1701,10 +1701,10 @@ INSERT INTO t1 VALUES
(4,1,2,'c2',NULL),(5,1,2,'c1',NULL),(2,1,3,'c2',NULL),(3,1,3,'c2',NULL), (4,1,2,'c2',NULL),(5,1,2,'c1',NULL),(2,1,3,'c2',NULL),(3,1,3,'c2',NULL),
(4,1,3,'pk',NULL),(5,1,3,'c2',NULL), (4,1,3,'pk',NULL),(5,1,3,'c2',NULL),
(2,1,4,'c_extra',NULL),(3,1,4,'c_extra',NULL); (2,1,4,'c_extra',NULL),(3,1,4,'c_extra',NULL);
EXPLAIN SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index vid PRIMARY 12 NULL 16 Using where 1 SIMPLE t1 index NULL PRIMARY 12 NULL 16 Using where
SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC;
vid tid idx name type vid tid idx name type
3 1 4 c_extra NULL 3 1 4 c_extra NULL
3 1 3 c2 NULL 3 1 3 c2 NULL
...@@ -2137,4 +2137,75 @@ GROUP BY t1.b; ...@@ -2137,4 +2137,75 @@ GROUP BY t1.b;
a b c d a b e a b a b c d a b e a b
1 1 1 0 1 1 2 1 1 1 1 1 0 1 1 2 1 1
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
#
# Bug #45828: Optimizer won't use partial primary key if another
# index can prevent filesort
#
CREATE TABLE `t1` (
c1 int NOT NULL,
c2 int NOT NULL,
c3 int NOT NULL,
PRIMARY KEY (c1,c2),
KEY (c3)
) ENGINE=InnoDB;
INSERT INTO t1 VALUES (5,2,1246276747);
INSERT INTO t1 VALUES (2,1,1246281721);
INSERT INTO t1 VALUES (7,3,1246281756);
INSERT INTO t1 VALUES (4,2,1246282139);
INSERT INTO t1 VALUES (3,1,1246282230);
INSERT INTO t1 VALUES (1,0,1246282712);
INSERT INTO t1 VALUES (8,3,1246282765);
INSERT INTO t1 SELECT c1+10,c2+10,c3+10 FROM t1;
INSERT INTO t1 SELECT c1+100,c2+100,c3+100 from t1;
INSERT INTO t1 SELECT c1+1000,c2+1000,c3+1000 from t1;
INSERT INTO t1 SELECT c1+10000,c2+10000,c3+10000 from t1;
INSERT INTO t1 SELECT c1+100000,c2+100000,c3+100000 from t1;
INSERT INTO t1 SELECT c1+1000000,c2+1000000,c3+1000000 from t1;
SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
c1 c2 c3
EXPLAIN SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref PRIMARY,c3 PRIMARY 4 const 1 Using where; Using filesort
EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref PRIMARY PRIMARY 4 const 1 Using where; Using filesort
CREATE TABLE t2 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 int NOT NULL,
KEY (c1,c2),
KEY (c3)
) ENGINE=InnoDB;
explain SELECT * FROM t2 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ref c1,c3 c1 4 const 1 Using where; Using filesort
DROP TABLE t1,t2;
#
# 36259: Optimizing with ORDER BY
#
CREATE TABLE t1 (
a INT NOT NULL AUTO_INCREMENT,
b INT NOT NULL,
c INT NOT NULL,
d VARCHAR(5),
e INT NOT NULL,
PRIMARY KEY (a), KEY i2 (b,c,d)
) ENGINE=InnoDB;
INSERT INTO t1 (b,c,d,e) VALUES (1,1,'a',1), (2,2,'b',2);
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
EXPLAIN SELECT * FROM t1 WHERE b=1 AND c=1 ORDER BY a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref i2 i2 8 const,const 1 Using where; Using filesort
EXPLAIN SELECT * FROM t1 FORCE INDEX(i2) WHERE b=1 and c=1 ORDER BY a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref i2 i2 8 const,const 1 Using where; Using filesort
EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) WHERE b=1 AND c=1 ORDER BY a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL PRIMARY 4 NULL 128 Using where
DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
set ibmdb2i_create_index_option=1;
drop schema if exists test1;
create schema test1;
use test1;
CREATE TABLE t1 (f int primary key, index(f)) engine=ibmdb2i;
drop table t1;
CREATE TABLE t1 (f char(10) collate utf8_bin primary key, index(f)) engine=ibmdb2i;
drop table t1;
CREATE TABLE t1 (f char(10) collate latin1_swedish_ci primary key, index(f)) engine=ibmdb2i;
drop table t1;
CREATE TABLE t1 (f char(10) collate latin1_swedish_ci primary key, i int, index i(i,f)) engine=ibmdb2i;
drop table t1;
create table fd (SQSSEQ CHAR(10)) engine=ibmdb2i;
select * from fd;
SQSSEQ
*HEX
*HEX
*HEX
*HEX
drop table fd;
source suite/ibmdb2i/include/have_ibmdb2i.inc;
# Confirm that ibmdb2i_create_index_option causes additional *HEX sorted indexes to be created for all non-binary keys.
set ibmdb2i_create_index_option=1;
--disable_warnings
drop schema if exists test1;
create schema test1;
use test1;
--enable_warnings
--disable_abort_on_error
--error 0,255
exec system "DLTF QGPL/FDOUT" > /dev/null;
--enable_abort_on_error
#No additional index because no string fields in key
CREATE TABLE t1 (f int primary key, index(f)) engine=ibmdb2i;
--error 255
exec system "DSPFD FILE(\"test1\"/PRIM0001) TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
--error 255
exec system "DSPFD FILE(\"test1\"/\"f___H_t1\") TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
drop table t1;
#No additional index because binary sorting
CREATE TABLE t1 (f char(10) collate utf8_bin primary key, index(f)) engine=ibmdb2i;
--error 255
exec system "DSPFD FILE(\"test1\"/PRIM0001) TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
--error 255
exec system "DSPFD FILE(\"test1\"/\"f___H_t1\") TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
drop table t1;
CREATE TABLE t1 (f char(10) collate latin1_swedish_ci primary key, index(f)) engine=ibmdb2i;
exec system "DSPFD FILE(\"test1\"/PRIM0001) TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
exec system "DSPFD FILE(\"test1\"/\"f___H_t1\") TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
drop table t1;
CREATE TABLE t1 (f char(10) collate latin1_swedish_ci primary key, i int, index i(i,f)) engine=ibmdb2i;
exec system "DSPFD FILE(\"test1\"/PRIM0001) TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
exec system "DSPFD FILE(\"test1\"/\"i___H_t1\") TYPE(*SEQ) OUTPUT(*OUTFILE) OUTFILE(QGPL/FDOUT) OUTMBR(*FIRST *ADD)" > /dev/null;
drop table t1;
create table fd (SQSSEQ CHAR(10)) engine=ibmdb2i;
system system "CPYF FROMFILE(QGPL/FDOUT) TOFILE(\"test1\"/\"fd\") mbropt(*replace) fmtopt(*drop *map)" > /dev/null;
select * from fd;
drop table fd;
...@@ -381,12 +381,12 @@ Table Create Table ...@@ -381,12 +381,12 @@ Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL AUTO_INCREMENT, `c1` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`c1`) PRIMARY KEY (`c1`)
) ENGINE=MEMORY AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 ) ENGINE=MEMORY AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH (c1) /*!50100 PARTITION BY HASH (c1)
PARTITIONS 2 */ PARTITIONS 2 */
SELECT * FROM t1 ORDER BY c1; SELECT * FROM t1 ORDER BY c1;
c1 c1
27 1
INSERT INTO t1 VALUES (100); INSERT INTO t1 VALUES (100);
INSERT INTO t1 VALUES (NULL); INSERT INTO t1 VALUES (NULL);
DELETE FROM t1 WHERE c1 >= 100; DELETE FROM t1 WHERE c1 >= 100;
......
...@@ -381,12 +381,12 @@ Table Create Table ...@@ -381,12 +381,12 @@ Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL AUTO_INCREMENT, `c1` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`c1`) PRIMARY KEY (`c1`)
) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH (c1) /*!50100 PARTITION BY HASH (c1)
PARTITIONS 2 */ PARTITIONS 2 */
SELECT * FROM t1 ORDER BY c1; SELECT * FROM t1 ORDER BY c1;
c1 c1
27 1
INSERT INTO t1 VALUES (100); INSERT INTO t1 VALUES (100);
INSERT INTO t1 VALUES (NULL); INSERT INTO t1 VALUES (NULL);
DELETE FROM t1 WHERE c1 >= 100; DELETE FROM t1 WHERE c1 >= 100;
......
--skip-grant-tables --skip-name-resolve --safemalloc-mem-limit=4000000
--echo #
--echo # Bug #46080: group_concat(... order by) crashes server when
--echo # sort_buffer_size cannot allocate
--echo #
CREATE TABLE t1(a CHAR(255));
INSERT INTO t1 VALUES ('a');
SET @@SESSION.sort_buffer_size=5*16*1000000;
SET @@SESSION.max_heap_table_size=5*1000000;
--echo # Must not crash.
--error 5,0
SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a;
DROP TABLE t1;
SET @@SESSION.sort_buffer_size=default;
SET @@SESSION.max_heap_table_size=default;
--echo End of 5.0 tests
-- source include/have_innodb.inc
--echo #
--echo # Bug#21704: Renaming column does not update FK definition.
--echo #
--echo
--echo # Test that it's not possible to rename columns participating in a
--echo # foreign key (either in the referencing or referenced table).
--echo
--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
--enable_warnings
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT ENGINE=INNODB;
CREATE TABLE t2 (a INT PRIMARY KEY, b INT,
CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1(a))
ROW_FORMAT=COMPACT ENGINE=INNODB;
CREATE TABLE t3 (a INT PRIMARY KEY, b INT, KEY(b), C INT,
CONSTRAINT fk2 FOREIGN KEY (b) REFERENCES t3 (a))
ROW_FORMAT=COMPACT ENGINE=INNODB;
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
INSERT INTO t3 VALUES (1,1,1),(2,2,2),(3,3,3);
--echo
--echo # Test renaming the column in the referenced table.
--echo
# mysqltest first does replace_regex, then replace_result
--replace_regex /'[^']*test\/#sql-[0-9a-f_]*'/'#sql-temporary'/
# Embedded server doesn't chdir to data directory
--replace_result $MYSQLTEST_VARDIR . mysqld.1/data/ ''
--error ER_ERROR_ON_RENAME
ALTER TABLE t1 CHANGE a c INT;
--echo # Ensure that online column rename works.
--enable_info
ALTER TABLE t1 CHANGE b c INT;
--disable_info
--echo
--echo # Test renaming the column in the referencing table
--echo
# mysqltest first does replace_regex, then replace_result
--replace_regex /'[^']*test\/#sql-[0-9a-f_]*'/'#sql-temporary'/
# Embedded server doesn't chdir to data directory
--replace_result $MYSQLTEST_VARDIR . mysqld.1/data/ ''
--error ER_ERROR_ON_RENAME
ALTER TABLE t2 CHANGE a c INT;
--echo # Ensure that online column rename works.
--enable_info
ALTER TABLE t2 CHANGE b c INT;
--disable_info
--echo
--echo # Test with self-referential constraints
--echo
# mysqltest first does replace_regex, then replace_result
--replace_regex /'[^']*test\/#sql-[0-9a-f_]*'/'#sql-temporary'/
# Embedded server doesn't chdir to data directory
--replace_result $MYSQLTEST_VARDIR . mysqld.1/data/ ''
--error ER_ERROR_ON_RENAME
ALTER TABLE t3 CHANGE a d INT;
# mysqltest first does replace_regex, then replace_result
--replace_regex /'[^']*test\/#sql-[0-9a-f_]*'/'#sql-temporary'/
# Embedded server doesn't chdir to data directory
--replace_result $MYSQLTEST_VARDIR . mysqld.1/data/ ''
--error ER_ERROR_ON_RENAME
ALTER TABLE t3 CHANGE b d INT;
--echo # Ensure that online column rename works.
--enable_info
ALTER TABLE t3 CHANGE c d INT;
--disable_info
--echo
--echo # Cleanup.
--echo
DROP TABLE t3;
DROP TABLE t2;
DROP TABLE t1;
...@@ -12,6 +12,8 @@ set global innodb_commit_concurrency=1; ...@@ -12,6 +12,8 @@ set global innodb_commit_concurrency=1;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=42; set global innodb_commit_concurrency=42;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
--error ER_WRONG_ARGUMENTS --error ER_WRONG_ARGUMENTS
set global innodb_commit_concurrency=0; set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
......
...@@ -15,3 +15,5 @@ set global innodb_commit_concurrency=42; ...@@ -15,3 +15,5 @@ set global innodb_commit_concurrency=42;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=0; set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency; select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
...@@ -380,4 +380,85 @@ SELECT * FROM t1, t2, t3 ...@@ -380,4 +380,85 @@ SELECT * FROM t1, t2, t3
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
--echo #
--echo # Bug #45828: Optimizer won't use partial primary key if another
--echo # index can prevent filesort
--echo #
# Create the table
CREATE TABLE `t1` (
c1 int NOT NULL,
c2 int NOT NULL,
c3 int NOT NULL,
PRIMARY KEY (c1,c2),
KEY (c3)
) ENGINE=InnoDB;
# populate with data
INSERT INTO t1 VALUES (5,2,1246276747);
INSERT INTO t1 VALUES (2,1,1246281721);
INSERT INTO t1 VALUES (7,3,1246281756);
INSERT INTO t1 VALUES (4,2,1246282139);
INSERT INTO t1 VALUES (3,1,1246282230);
INSERT INTO t1 VALUES (1,0,1246282712);
INSERT INTO t1 VALUES (8,3,1246282765);
INSERT INTO t1 SELECT c1+10,c2+10,c3+10 FROM t1;
INSERT INTO t1 SELECT c1+100,c2+100,c3+100 from t1;
INSERT INTO t1 SELECT c1+1000,c2+1000,c3+1000 from t1;
INSERT INTO t1 SELECT c1+10000,c2+10000,c3+10000 from t1;
INSERT INTO t1 SELECT c1+100000,c2+100000,c3+100000 from t1;
INSERT INTO t1 SELECT c1+1000000,c2+1000000,c3+1000000 from t1;
# query and no rows will match the c1 condition, whereas all will match c3
SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
# SHOULD use the pk.
# index on c3 will be used instead of primary key
EXPLAIN SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
# if we force the primary key, we can see the estimate is 1
EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
CREATE TABLE t2 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 int NOT NULL,
KEY (c1,c2),
KEY (c3)
) ENGINE=InnoDB;
# SHOULD use the pk.
# if we switch it from a primary key to a regular index, it works correctly as well
explain SELECT * FROM t2 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3;
DROP TABLE t1,t2;
--echo #
--echo # 36259: Optimizing with ORDER BY
--echo #
CREATE TABLE t1 (
a INT NOT NULL AUTO_INCREMENT,
b INT NOT NULL,
c INT NOT NULL,
d VARCHAR(5),
e INT NOT NULL,
PRIMARY KEY (a), KEY i2 (b,c,d)
) ENGINE=InnoDB;
INSERT INTO t1 (b,c,d,e) VALUES (1,1,'a',1), (2,2,'b',2);
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1;
EXPLAIN SELECT * FROM t1 WHERE b=1 AND c=1 ORDER BY a;
EXPLAIN SELECT * FROM t1 FORCE INDEX(i2) WHERE b=1 and c=1 ORDER BY a;
EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) WHERE b=1 AND c=1 ORDER BY a;
DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -3179,6 +3179,7 @@ int ha_partition::delete_row(const uchar *buf) ...@@ -3179,6 +3179,7 @@ int ha_partition::delete_row(const uchar *buf)
int ha_partition::delete_all_rows() int ha_partition::delete_all_rows()
{ {
int error; int error;
bool truncate= FALSE;
handler **file; handler **file;
THD *thd= ha_thd(); THD *thd= ha_thd();
DBUG_ENTER("ha_partition::delete_all_rows"); DBUG_ENTER("ha_partition::delete_all_rows");
...@@ -3190,12 +3191,16 @@ int ha_partition::delete_all_rows() ...@@ -3190,12 +3191,16 @@ int ha_partition::delete_all_rows()
ha_data->next_auto_inc_val= 0; ha_data->next_auto_inc_val= 0;
ha_data->auto_inc_initialized= FALSE; ha_data->auto_inc_initialized= FALSE;
unlock_auto_increment(); unlock_auto_increment();
truncate= TRUE;
} }
file= m_file; file= m_file;
do do
{ {
if ((error= (*file)->ha_delete_all_rows())) if ((error= (*file)->ha_delete_all_rows()))
DBUG_RETURN(error); DBUG_RETURN(error);
/* Ignore the error */
if (truncate)
(void) (*file)->ha_reset_auto_increment(0);
} while (*(++file)); } while (*(++file));
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
...@@ -3327,8 +3327,13 @@ bool Item_func_group_concat::add() ...@@ -3327,8 +3327,13 @@ bool Item_func_group_concat::add()
TREE_ELEMENT *el= 0; // Only for safety TREE_ELEMENT *el= 0; // Only for safety
if (row_eligible && tree) if (row_eligible && tree)
{
el= tree_insert(tree, table->record[0] + table->s->null_bytes, 0, el= tree_insert(tree, table->record[0] + table->s->null_bytes, 0,
tree->custom_arg); tree->custom_arg);
/* check if there was enough memory to insert the row */
if (!el)
return 1;
}
/* /*
If the row is not a duplicate (el->count == 1) If the row is not a duplicate (el->count == 1)
we can dump the row here in case of GROUP_CONCAT(DISTINCT...) we can dump the row here in case of GROUP_CONCAT(DISTINCT...)
......
...@@ -947,6 +947,7 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, ...@@ -947,6 +947,7 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset,
if (count_relay_log_space(rli)) if (count_relay_log_space(rli))
{ {
*errmsg= "Error counting relay log space"; *errmsg= "Error counting relay log space";
error=1;
goto err; goto err;
} }
if (!just_reset) if (!just_reset)
......
...@@ -13132,9 +13132,17 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, ...@@ -13132,9 +13132,17 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
for (nr=0; nr < table->s->keys ; nr++) for (nr=0; nr < table->s->keys ; nr++)
{ {
int direction; int direction;
if (keys.is_set(nr) && if (keys.is_set(nr) &&
(direction= test_if_order_by_key(order, table, nr, &used_key_parts))) (direction= test_if_order_by_key(order, table, nr, &used_key_parts)))
{ {
/*
At this point we are sure that ref_key is a non-ordering
key (where "ordering key" is a key that will return rows
in the order required by ORDER BY).
*/
DBUG_ASSERT (ref_key != (int) nr);
bool is_covering= table->covering_keys.is_set(nr) || bool is_covering= table->covering_keys.is_set(nr) ||
(nr == table->s->primary_key && (nr == table->s->primary_key &&
table->file->primary_key_is_clustered()); table->file->primary_key_is_clustered());
...@@ -13215,7 +13223,7 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, ...@@ -13215,7 +13223,7 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
*/ */
index_scan_time= select_limit/rec_per_key * index_scan_time= select_limit/rec_per_key *
min(rec_per_key, table->file->scan_time()); min(rec_per_key, table->file->scan_time());
if (is_covering || if ((ref_key < 0 && is_covering) ||
(ref_key < 0 && (group || table->force_index)) || (ref_key < 0 && (group || table->force_index)) ||
index_scan_time < read_time) index_scan_time < read_time)
{ {
......
...@@ -419,6 +419,14 @@ int ha_heap::delete_all_rows() ...@@ -419,6 +419,14 @@ int ha_heap::delete_all_rows()
return 0; return 0;
} }
int ha_heap::reset_auto_increment(ulonglong value)
{
file->s->auto_increment= value;
return 0;
}
int ha_heap::external_lock(THD *thd, int lock_type) int ha_heap::external_lock(THD *thd, int lock_type)
{ {
return 0; // No external locking return 0; // No external locking
......
...@@ -98,6 +98,7 @@ class ha_heap: public handler ...@@ -98,6 +98,7 @@ class ha_heap: public handler
int reset(); int reset();
int external_lock(THD *thd, int lock_type); int external_lock(THD *thd, int lock_type);
int delete_all_rows(void); int delete_all_rows(void);
int reset_auto_increment(ulonglong value);
int disable_indexes(uint mode); int disable_indexes(uint mode);
int enable_indexes(uint mode); int enable_indexes(uint mode);
int indexes_are_disabled(void); int indexes_are_disabled(void);
......
...@@ -2230,34 +2230,19 @@ int ha_ibmdb2i::create(const char *name, TABLE *table_arg, ...@@ -2230,34 +2230,19 @@ int ha_ibmdb2i::create(const char *name, TABLE *table_arg,
} }
} }
bool primaryHasStringField = false; String fieldDefinition(128);
if (table_arg->s->primary_key != MAX_KEY && !isTemporary) if (table_arg->s->primary_key != MAX_KEY && !isTemporary)
{ {
KEY& curKey = table_arg->key_info[table_arg->s->primary_key]; query.append(STRING_WITH_LEN(", PRIMARY KEY "));
query.append(STRING_WITH_LEN(", PRIMARY KEY( ")); rc = buildIndexFieldList(fieldDefinition,
for (int j = 0; j < curKey.key_parts; ++j) table_arg->key_info[table_arg->s->primary_key],
{ true,
if (j != 0) &fileSortSequenceType,
{ fileSortSequence,
query.append( STRING_WITH_LEN(" , ") ); fileSortSequenceLibrary);
} if (rc) DBUG_RETURN(rc);
Field* field = curKey.key_part[j].field; query.append(fieldDefinition);
convertMySQLNameToDB2Name(field->field_name, colName, sizeof(colName));
query.append(colName);
enum_field_types type = field->real_type();
if (type == MYSQL_TYPE_VARCHAR || type == MYSQL_TYPE_BLOB ||
type == MYSQL_TYPE_STRING)
{
rc = updateAssociatedSortSequence(field->charset(),
&fileSortSequenceType,
fileSortSequence,
fileSortSequenceLibrary);
if (rc) DBUG_RETURN (rc);
primaryHasStringField = true;
}
}
query.append(STRING_WITH_LEN(" ) "));
} }
rc = buildDB2ConstraintString(thd->lex, rc = buildDB2ConstraintString(thd->lex,
...@@ -2283,6 +2268,19 @@ int ha_ibmdb2i::create(const char *name, TABLE *table_arg, ...@@ -2283,6 +2268,19 @@ int ha_ibmdb2i::create(const char *name, TABLE *table_arg,
SqlStatementStream sqlStream(query.length()); SqlStatementStream sqlStream(query.length());
sqlStream.addStatement(query,fileSortSequence,fileSortSequenceLibrary); sqlStream.addStatement(query,fileSortSequence,fileSortSequenceLibrary);
if (table_arg->s->primary_key != MAX_KEY &&
!isTemporary &&
(THDVAR(thd, create_index_option)==1) &&
(fileSortSequenceType != 'B') &&
(fileSortSequenceType != ' '))
{
rc = generateShadowIndex(sqlStream,
table_arg->key_info[table_arg->s->primary_key],
libName,
fileName,
fieldDefinition);
if (rc) DBUG_RETURN(rc);
}
for (uint i = 0; i < table_arg->s->keys; ++i) for (uint i = 0; i < table_arg->s->keys; ++i)
{ {
if (i != table_arg->s->primary_key || isTemporary) if (i != table_arg->s->primary_key || isTemporary)
...@@ -3012,61 +3010,126 @@ int32 ha_ibmdb2i::buildCreateIndexStatement(SqlStatementStream& sqlStream, ...@@ -3012,61 +3010,126 @@ int32 ha_ibmdb2i::buildCreateIndexStatement(SqlStatementStream& sqlStream,
} }
String fieldDefinition(128); String fieldDefinition(128);
fieldDefinition.length(0); rc = buildIndexFieldList(fieldDefinition,
fieldDefinition.append(STRING_WITH_LEN(" ( ")); key,
isPrimary,
&fileSortSequenceType,
fileSortSequence,
fileSortSequenceLibrary);
if (rc) DBUG_RETURN(rc);
query.append(fieldDefinition);
if ((THDVAR(ha_thd(), create_index_option)==1) &&
(fileSortSequenceType != 'B') &&
(fileSortSequenceType != ' '))
{
rc = generateShadowIndex(sqlStream,
key,
db2LibName,
db2FileName,
fieldDefinition);
if (rc) DBUG_RETURN(rc);
}
DBUG_PRINT("ha_ibmdb2i::buildCreateIndexStatement", ("Sent to DB2: %s",query.c_ptr_safe()));
sqlStream.addStatement(query,fileSortSequence,fileSortSequenceLibrary);
DBUG_RETURN(0);
}
/**
Generate the SQL syntax for the list of fields to be assigned to the
specified key. The corresponding sort sequence is also calculated.
@param[out] appendHere The string to receive the generated SQL
@param key The key to evaluate
@param isPrimary True if this is being generated on behalf of the primary key
@param[out] fileSortSequenceType The type of the associated sort sequence
@param[out] fileSortSequence The name of the associated sort sequence
@param[out] fileSortSequenceLibrary The library of the associated sort sequence
@return 0 if successful; error value otherwise
*/
int32 ha_ibmdb2i::buildIndexFieldList(String& appendHere,
const KEY& key,
bool isPrimary,
char* fileSortSequenceType,
char* fileSortSequence,
char* fileSortSequenceLibrary)
{
DBUG_ENTER("ha_ibmdb2i::buildIndexFieldList");
appendHere.append(STRING_WITH_LEN(" ( "));
for (int j = 0; j < key.key_parts; ++j) for (int j = 0; j < key.key_parts; ++j)
{ {
char colName[MAX_DB2_COLNAME_LENGTH+1]; char colName[MAX_DB2_COLNAME_LENGTH+1];
if (j != 0) if (j != 0)
{ {
fieldDefinition.append(STRING_WITH_LEN(" , ")); appendHere.append(STRING_WITH_LEN(" , "));
} }
Field* field = key.key_part[j].field;
convertMySQLNameToDB2Name(field->field_name, colName, sizeof(colName)); KEY_PART_INFO& kpi = key.key_part[j];
fieldDefinition.append(colName); Field* field = kpi.field;
convertMySQLNameToDB2Name(field->field_name,
colName,
sizeof(colName));
appendHere.append(colName);
int32 rc;
rc = updateAssociatedSortSequence(field->charset(), rc = updateAssociatedSortSequence(field->charset(),
&fileSortSequenceType, fileSortSequenceType,
fileSortSequence, fileSortSequence,
fileSortSequenceLibrary); fileSortSequenceLibrary);
if (rc) DBUG_RETURN (rc); if (rc) DBUG_RETURN (rc);
} }
fieldDefinition.append(STRING_WITH_LEN(" ) "));
query.append(fieldDefinition);
if ((THDVAR(ha_thd(), create_index_option)==1) &&
(fileSortSequenceType != 'B'))
{
String shadowQuery(256);
shadowQuery.length(0);
shadowQuery.append(STRING_WITH_LEN("CREATE INDEX "));
shadowQuery.append(db2LibName);
shadowQuery.append('.');
if (db2i_table::appendQualifiedIndexFileName(key.name, db2FileName, shadowQuery, db2i_table::ASCII_SQL, typeHex))
{
getErrTxt(DB2I_ERR_INVALID_NAME,"index","*generated*");
DBUG_RETURN(DB2I_ERR_INVALID_NAME );
}
shadowQuery.append(STRING_WITH_LEN(" ON "));
shadowQuery.append(db2LibName);
shadowQuery.append('.');
shadowQuery.append(db2FileName);
shadowQuery.append(fieldDefinition);
DBUG_PRINT("ha_ibmdb2i::buildCreateIndexStatement", ("Sent to DB2: %s",shadowQuery.c_ptr_safe()));
sqlStream.addStatement(shadowQuery,"*HEX","QSYS");
}
DBUG_PRINT("ha_ibmdb2i::buildCreateIndexStatement", ("Sent to DB2: %s",query.c_ptr_safe())); appendHere.append(STRING_WITH_LEN(" ) "));
sqlStream.addStatement(query,fileSortSequence,fileSortSequenceLibrary);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/**
Generate an SQL statement that defines a *HEX sorted index to implement
the ibmdb2i_create_index.
@param[out] stream The stream to append the generated statement to
@param key The key to evaluate
@param[out] libName The library containg the table
@param[out] fileName The DB2-compatible name of the table
@param[out] fieldDefinition The list of the fields in the index, in SQL syntax
@return 0 if successful; error value otherwise
*/
int32 ha_ibmdb2i::generateShadowIndex(SqlStatementStream& stream,
const KEY& key,
const char* libName,
const char* fileName,
const String& fieldDefinition)
{
String shadowQuery(256);
shadowQuery.length(0);
shadowQuery.append(STRING_WITH_LEN("CREATE INDEX "));
shadowQuery.append(libName);
shadowQuery.append('.');
if (db2i_table::appendQualifiedIndexFileName(key.name, fileName, shadowQuery, db2i_table::ASCII_SQL, typeHex))
{
getErrTxt(DB2I_ERR_INVALID_NAME,"index","*generated*");
return DB2I_ERR_INVALID_NAME;
}
shadowQuery.append(STRING_WITH_LEN(" ON "));
shadowQuery.append(libName);
shadowQuery.append('.');
shadowQuery.append(fileName);
shadowQuery.append(fieldDefinition);
DBUG_PRINT("ha_ibmdb2i::generateShadowIndex", ("Sent to DB2: %s",shadowQuery.c_ptr_safe()));
stream.addStatement(shadowQuery,"*HEX","QSYS");
return 0;
}
void ha_ibmdb2i::doInitialRead(char orientation, void ha_ibmdb2i::doInitialRead(char orientation,
uint32 rowsToBuffer, uint32 rowsToBuffer,
ILEMemHandle key, ILEMemHandle key,
......
...@@ -530,6 +530,13 @@ class ha_ibmdb2i: public handler ...@@ -530,6 +530,13 @@ class ha_ibmdb2i: public handler
bool isPrimary, bool isPrimary,
const char* db2LibName, const char* db2LibName,
const char* db2FileName); const char* db2FileName);
int32 buildIndexFieldList(String& appendHere,
const KEY& key,
bool isPrimary,
char* fileSortSequenceType,
char* fileSortSequence,
char* fileSortSequenceLibrary);
// Specify NULL for data when using the data pointed to by field // Specify NULL for data when using the data pointed to by field
int32 convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char* db2Buf, const uchar* data = NULL); int32 convertMySQLtoDB2(Field* field, const DB2Field& db2Field, char* db2Buf, const uchar* data = NULL);
...@@ -806,4 +813,10 @@ class ha_ibmdb2i: public handler ...@@ -806,4 +813,10 @@ class ha_ibmdb2i: public handler
query.append(STRING_WITH_LEN(" RCDFMT ")); query.append(STRING_WITH_LEN(" RCDFMT "));
query.append(rcdfmt); query.append(rcdfmt);
} }
int32 generateShadowIndex(SqlStatementStream& stream,
const KEY& key,
const char* libName,
const char* fileName,
const String& fieldDefinition);
}; };
...@@ -57,7 +57,7 @@ noinst_HEADERS= include/btr0btr.h include/btr0btr.ic \ ...@@ -57,7 +57,7 @@ noinst_HEADERS= include/btr0btr.h include/btr0btr.ic \
include/ha0ha.ic include/hash0hash.h \ include/ha0ha.ic include/hash0hash.h \
include/hash0hash.ic include/ibuf0ibuf.h \ include/hash0hash.ic include/ibuf0ibuf.h \
include/ibuf0ibuf.ic include/ibuf0types.h \ include/ibuf0ibuf.ic include/ibuf0types.h \
include/lock0iter.h include/fsp0types.h \ include/lock0iter.h \
include/lock0lock.h include/lock0lock.ic \ include/lock0lock.h include/lock0lock.ic \
include/lock0priv.h include/lock0priv.ic \ include/lock0priv.h include/lock0priv.ic \
include/lock0types.h include/log0log.h \ include/lock0types.h include/log0log.h \
......
...@@ -2745,7 +2745,7 @@ fil_open_single_table_tablespace( ...@@ -2745,7 +2745,7 @@ fil_open_single_table_tablespace(
"InnoDB: and MySQL removed the .ibd file for this.\n" "InnoDB: and MySQL removed the .ibd file for this.\n"
"InnoDB: Please refer to\n" "InnoDB: Please refer to\n"
"InnoDB: http://dev.mysql.com/doc/refman/5.1/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/"
"innodb-troubleshooting.html\n" "innodb-troubleshooting-datadict.html\n"
"InnoDB: for how to resolve the issue.\n", stderr); "InnoDB: for how to resolve the issue.\n", stderr);
mem_free(filepath); mem_free(filepath);
...@@ -2786,7 +2786,7 @@ fil_open_single_table_tablespace( ...@@ -2786,7 +2786,7 @@ fil_open_single_table_tablespace(
" IMPORT TABLESPACE?\n" " IMPORT TABLESPACE?\n"
"InnoDB: Please refer to\n" "InnoDB: Please refer to\n"
"InnoDB: http://dev.mysql.com/doc/refman/5.1/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/"
"innodb-troubleshooting.html\n" "innodb-troubleshooting-datadict.html\n"
"InnoDB: for how to resolve the issue.\n", "InnoDB: for how to resolve the issue.\n",
(ulong) space_id, (ulong) id); (ulong) space_id, (ulong) id);
...@@ -3477,7 +3477,7 @@ fil_space_for_table_exists_in_mem( ...@@ -3477,7 +3477,7 @@ fil_space_for_table_exists_in_mem(
error_exit: error_exit:
fputs("InnoDB: Please refer to\n" fputs("InnoDB: Please refer to\n"
"InnoDB: http://dev.mysql.com/doc/refman/5.1/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/"
"innodb-troubleshooting.html\n" "innodb-troubleshooting-datadict.html\n"
"InnoDB: for how to resolve the issue.\n", stderr); "InnoDB: for how to resolve the issue.\n", stderr);
mem_free(path); mem_free(path);
......
...@@ -166,6 +166,20 @@ static handler *innobase_create_handler(handlerton *hton, ...@@ -166,6 +166,20 @@ static handler *innobase_create_handler(handlerton *hton,
static const char innobase_hton_name[]= "InnoDB"; static const char innobase_hton_name[]= "InnoDB";
/** @brief Initialize the default value of innodb_commit_concurrency.
Once InnoDB is running, the innodb_commit_concurrency must not change
from zero to nonzero. (Bug #42101)
The initial default value is 0, and without this extra initialization,
SET GLOBAL innodb_commit_concurrency=DEFAULT would set the parameter
to 0, even if it was initially set to nonzero at the command line
or configuration file. */
static
void
innobase_commit_concurrency_init_default(void);
/*==========================================*/
/***************************************************************** /*****************************************************************
Check for a valid value of innobase_commit_concurrency. */ Check for a valid value of innobase_commit_concurrency. */
static static
...@@ -1775,6 +1789,8 @@ innobase_init( ...@@ -1775,6 +1789,8 @@ innobase_init(
(char*)"latin1_swedish_ci")); (char*)"latin1_swedish_ci"));
memcpy(srv_latin1_ordering, my_charset_latin1.sort_order, 256); memcpy(srv_latin1_ordering, my_charset_latin1.sort_order, 256);
innobase_commit_concurrency_init_default();
/* Since we in this module access directly the fields of a trx /* Since we in this module access directly the fields of a trx
struct, and due to different headers and flags it might happen that struct, and due to different headers and flags it might happen that
mutex_t has a different size in this module and in InnoDB mutex_t has a different size in this module and in InnoDB
...@@ -8161,6 +8177,97 @@ innobase_set_cursor_view( ...@@ -8161,6 +8177,97 @@ innobase_set_cursor_view(
} }
/***********************************************************************
Check whether any of the given columns is being renamed in the table. */
static
bool
column_is_being_renamed(
/*====================*/
/* out: true if any of col_names is
being renamed in table */
TABLE* table, /* in: MySQL table */
uint n_cols, /* in: number of columns */
const char** col_names) /* in: names of the columns */
{
uint j;
uint k;
Field* field;
const char* col_name;
for (j = 0; j < n_cols; j++) {
col_name = col_names[j];
for (k = 0; k < table->s->fields; k++) {
field = table->field[k];
if ((field->flags & FIELD_IS_RENAMED)
&& innobase_strcasecmp(field->field_name,
col_name) == 0) {
return(true);
}
}
}
return(false);
}
/***********************************************************************
Check whether a column in table "table" is being renamed and if this column
is part of a foreign key, either part of another table, referencing this
table or part of this table, referencing another table. */
static
bool
foreign_key_column_is_being_renamed(
/*================================*/
/* out: true if a column that
participates in a foreign key definition
is being renamed */
row_prebuilt_t* prebuilt, /* in: InnoDB prebuilt struct */
TABLE* table) /* in: MySQL table */
{
dict_foreign_t* foreign;
/* check whether there are foreign keys at all */
if (UT_LIST_GET_LEN(prebuilt->table->foreign_list) == 0
&& UT_LIST_GET_LEN(prebuilt->table->referenced_list) == 0) {
/* no foreign keys involved with prebuilt->table */
return(false);
}
row_mysql_lock_data_dictionary(prebuilt->trx);
/* Check whether any column in the foreign key constraints which refer
to this table is being renamed. */
for (foreign = UT_LIST_GET_FIRST(prebuilt->table->referenced_list);
foreign != NULL;
foreign = UT_LIST_GET_NEXT(referenced_list, foreign)) {
if (column_is_being_renamed(table, foreign->n_fields,
foreign->referenced_col_names)) {
row_mysql_unlock_data_dictionary(prebuilt->trx);
return(true);
}
}
/* Check whether any column in the foreign key constraints in the
table is being renamed. */
for (foreign = UT_LIST_GET_FIRST(prebuilt->table->foreign_list);
foreign != NULL;
foreign = UT_LIST_GET_NEXT(foreign_list, foreign)) {
if (column_is_being_renamed(table, foreign->n_fields,
foreign->foreign_col_names)) {
row_mysql_unlock_data_dictionary(prebuilt->trx);
return(true);
}
}
row_mysql_unlock_data_dictionary(prebuilt->trx);
return(false);
}
bool ha_innobase::check_if_incompatible_data( bool ha_innobase::check_if_incompatible_data(
HA_CREATE_INFO* info, HA_CREATE_INFO* info,
uint table_changes) uint table_changes)
...@@ -8177,6 +8284,13 @@ bool ha_innobase::check_if_incompatible_data( ...@@ -8177,6 +8284,13 @@ bool ha_innobase::check_if_incompatible_data(
return COMPATIBLE_DATA_NO; return COMPATIBLE_DATA_NO;
} }
/* Check if a column participating in a foreign key is being renamed.
There is no mechanism for updating InnoDB foreign key definitions. */
if (foreign_key_column_is_being_renamed(prebuilt, table)) {
return COMPATIBLE_DATA_NO;
}
/* Check that row format didn't change */ /* Check that row format didn't change */
if ((info->used_fields & HA_CREATE_USED_ROW_FORMAT) && if ((info->used_fields & HA_CREATE_USED_ROW_FORMAT) &&
get_row_type() != info->row_type) { get_row_type() != info->row_type) {
...@@ -8464,3 +8578,21 @@ mysql_declare_plugin(innobase) ...@@ -8464,3 +8578,21 @@ mysql_declare_plugin(innobase)
NULL /* reserved */ NULL /* reserved */
} }
mysql_declare_plugin_end; mysql_declare_plugin_end;
/** @brief Initialize the default value of innodb_commit_concurrency.
Once InnoDB is running, the innodb_commit_concurrency must not change
from zero to nonzero. (Bug #42101)
The initial default value is 0, and without this extra initialization,
SET GLOBAL innodb_commit_concurrency=DEFAULT would set the parameter
to 0, even if it was initially set to nonzero at the command line
or configuration file. */
static
void
innobase_commit_concurrency_init_default(void)
/*==========================================*/
{
MYSQL_SYSVAR_NAME(commit_concurrency).def_val
= innobase_commit_concurrency;
}
...@@ -9,6 +9,7 @@ Created 3/26/1996 Heikki Tuuri ...@@ -9,6 +9,7 @@ Created 3/26/1996 Heikki Tuuri
#include "srv0srv.h" #include "srv0srv.h"
#include "trx0trx.h" #include "trx0trx.h"
#include "data0type.h" #include "data0type.h"
#include "mtr0log.h"
/* The typedef for rseg slot in the file copy */ /* The typedef for rseg slot in the file copy */
typedef byte trx_sysf_rseg_t; typedef byte trx_sysf_rseg_t;
......
...@@ -14,6 +14,7 @@ Created 3/26/1996 Heikki Tuuri ...@@ -14,6 +14,7 @@ Created 3/26/1996 Heikki Tuuri
#include "fsp0fsp.h" #include "fsp0fsp.h"
#include "mach0data.h" #include "mach0data.h"
#include "mtr0log.h"
#include "trx0rseg.h" #include "trx0rseg.h"
#include "trx0trx.h" #include "trx0trx.h"
#include "trx0roll.h" #include "trx0roll.h"
......
...@@ -13,7 +13,7 @@ Created 3/26/1996 Heikki Tuuri ...@@ -13,7 +13,7 @@ Created 3/26/1996 Heikki Tuuri
#endif #endif
#include "fsp0fsp.h" #include "fsp0fsp.h"
#include "mtr0mtr.h" #include "mtr0log.h"
#include "trx0trx.h" #include "trx0trx.h"
#include "trx0rseg.h" #include "trx0rseg.h"
#include "trx0undo.h" #include "trx0undo.h"
......
...@@ -14,6 +14,7 @@ Created 3/26/1996 Heikki Tuuri ...@@ -14,6 +14,7 @@ Created 3/26/1996 Heikki Tuuri
#include "fsp0fsp.h" #include "fsp0fsp.h"
#include "mach0data.h" #include "mach0data.h"
#include "mtr0log.h"
#include "trx0rseg.h" #include "trx0rseg.h"
#include "trx0trx.h" #include "trx0trx.h"
#include "srv0srv.h" #include "srv0srv.h"
......
...@@ -1870,6 +1870,12 @@ int ha_myisam::delete_all_rows() ...@@ -1870,6 +1870,12 @@ int ha_myisam::delete_all_rows()
return mi_delete_all_rows(file); return mi_delete_all_rows(file);
} }
int ha_myisam::reset_auto_increment(ulonglong value)
{
file->s->state.auto_increment= value;
return 0;
}
int ha_myisam::delete_table(const char *name) int ha_myisam::delete_table(const char *name)
{ {
return mi_delete_table(name); return mi_delete_table(name);
......
...@@ -101,6 +101,7 @@ class ha_myisam: public handler ...@@ -101,6 +101,7 @@ class ha_myisam: public handler
int reset(void); int reset(void);
int external_lock(THD *thd, int lock_type); int external_lock(THD *thd, int lock_type);
int delete_all_rows(void); int delete_all_rows(void);
int reset_auto_increment(ulonglong value);
int disable_indexes(uint mode); int disable_indexes(uint mode);
int enable_indexes(uint mode); int enable_indexes(uint mode);
int indexes_are_disabled(void); int indexes_are_disabled(void);
......
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