Merge from 5.1-bugteam
This commit is contained in:
commit
0e02df4ded
10
README
10
README
@ -1,11 +1,19 @@
|
||||
This is a release of MySQL, a dual-license SQL database server.
|
||||
MySQL is brought to you by the MySQL team at MySQL AB.
|
||||
MySQL is brought to you by the MySQL team at Sun Microsystems, Inc.
|
||||
|
||||
License information can be found in these files:
|
||||
- For GPL (free) distributions, see the COPYING file and
|
||||
the EXCEPTIONS-CLIENT file.
|
||||
- For commercial distributions, see the LICENSE.mysql file.
|
||||
|
||||
GPLv2 Disclaimer
|
||||
For the avoidance of doubt, except that if any license choice
|
||||
other than GPL or LGPL is available it will apply instead, Sun
|
||||
elects to use only the General Public License version 2 (GPLv2)
|
||||
at this time for any software where a choice of GPL license versions
|
||||
is made available with the language indicating that GPLv2 or any
|
||||
later version may be used, or where a choice of which version of
|
||||
the GPL is applied is otherwise unspecified.
|
||||
|
||||
For further information about MySQL or additional documentation, see:
|
||||
- The latest information about MySQL: http://www.mysql.com
|
||||
|
@ -10,7 +10,7 @@ AC_CANONICAL_SYSTEM
|
||||
#
|
||||
# When changing major version number please also check switch statement
|
||||
# in mysqlbinlog::check_master_version().
|
||||
AM_INIT_AUTOMAKE(mysql, 5.1.35)
|
||||
AM_INIT_AUTOMAKE(mysql, 5.1.36)
|
||||
AM_CONFIG_HEADER([include/config.h:config.h.in])
|
||||
|
||||
PROTOCOL_VERSION=10
|
||||
|
@ -887,7 +887,7 @@ sub collect_one_test_case {
|
||||
if ( $tinfo->{'innodb_test'} )
|
||||
{
|
||||
# This is a test that need innodb
|
||||
if ( $::mysqld_variables{'innodb'} ne "TRUE" )
|
||||
if ( $::mysqld_variables{'innodb'} eq "OFF" )
|
||||
{
|
||||
# innodb is not supported, skip it
|
||||
$tinfo->{'skip'}= 1;
|
||||
|
@ -1,6 +1,9 @@
|
||||
DROP TABLE IF EXISTS t1;
|
||||
# Establish connection con1 (user=root)
|
||||
# Establish connection con2 (user=root)
|
||||
### Test 1:
|
||||
### - While a consistent snapshot transaction is executed,
|
||||
### no external inserts should be visible to the transaction.
|
||||
# Switch to connection con1
|
||||
CREATE TABLE t1 (a INT) ENGINE=innodb;
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
@ -10,6 +13,9 @@ INSERT INTO t1 VALUES(1);
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
COMMIT;
|
||||
### Test 2:
|
||||
### - For any non-consistent snapshot transaction, external
|
||||
### committed inserts should be visible to the transaction.
|
||||
DELETE FROM t1;
|
||||
START TRANSACTION;
|
||||
# Switch to connection con2
|
||||
@ -19,5 +25,18 @@ SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
COMMIT;
|
||||
### Test 3:
|
||||
### - Bug#44664: valgrind warning for COMMIT_AND_CHAIN and ROLLBACK_AND_CHAIN
|
||||
### Chaining a transaction does not retain consistency level.
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
DELETE FROM t1;
|
||||
COMMIT WORK AND CHAIN;
|
||||
# Switch to connection con2
|
||||
INSERT INTO t1 VALUES(1);
|
||||
# Switch to connection con1
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
COMMIT;
|
||||
# Switch to connection default + close connections con1 and con2
|
||||
DROP TABLE t1;
|
||||
|
@ -2525,6 +2525,15 @@ SELECT DATE_FORMAT(c, GET_FORMAT(DATE, 'eur')) h, CONCAT(UPPER(aa),', ', aa) i F
|
||||
h i
|
||||
31.12.2008 AAAAAA, aaaaaa
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# BUG#44774: load_file function produces valgrind warnings
|
||||
#
|
||||
CREATE TABLE t1 (a TINYBLOB);
|
||||
INSERT INTO t1 VALUES ('aaaaaaaa');
|
||||
SELECT LOAD_FILE(a) FROM t1;
|
||||
LOAD_FILE(a)
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
drop table if exists t1;
|
||||
create table t1(f1 tinyint default null)engine=myisam;
|
||||
|
@ -61,7 +61,7 @@ begin
|
||||
select table_name from information_schema.key_column_usage
|
||||
order by table_name;
|
||||
end|
|
||||
create table t1
|
||||
create table t1
|
||||
(f1 int(10) unsigned not null,
|
||||
f2 varchar(100) not null,
|
||||
primary key (f1), unique key (f2));
|
||||
@ -203,15 +203,15 @@ View Create View character_set_client collation_connection
|
||||
v2 CREATE ALGORITHM=UNDEFINED DEFINER=`testdb_2`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `v1`.`f1` AS `f1` from `testdb_1`.`v1` latin1 latin1_swedish_ci
|
||||
show create view testdb_1.v1;
|
||||
ERROR 42000: SHOW VIEW command denied to user 'testdb_2'@'localhost' for table 'v1'
|
||||
select table_name from information_schema.columns a
|
||||
select table_name from information_schema.columns a
|
||||
where a.table_name = 'v2';
|
||||
table_name
|
||||
v2
|
||||
select view_definition from information_schema.views a
|
||||
select view_definition from information_schema.views a
|
||||
where a.table_name = 'v2';
|
||||
view_definition
|
||||
select `v1`.`f1` AS `f1` from `testdb_1`.`v1`
|
||||
select view_definition from information_schema.views a
|
||||
select view_definition from information_schema.views a
|
||||
where a.table_name = 'testdb_1.v1';
|
||||
view_definition
|
||||
select * from v2;
|
||||
|
@ -128,3 +128,13 @@ SELECT sum(f3) FROM t1 where f2='2007-07-01 00:00:00' group by f2;
|
||||
sum(f3)
|
||||
3
|
||||
drop table t1;
|
||||
#
|
||||
# Bug #44792: valgrind warning when casting from time to time
|
||||
#
|
||||
CREATE TABLE t1 (c TIME);
|
||||
INSERT INTO t1 VALUES ('0:00:00');
|
||||
SELECT CAST(c AS TIME) FROM t1;
|
||||
CAST(c AS TIME)
|
||||
00:00:00
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
|
@ -1574,4 +1574,17 @@ SHOW FIELDS FROM t2;
|
||||
Field Type Null Key Default Extra
|
||||
d double(9,6) YES NULL
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1(a INT);
|
||||
EXPLAIN EXTENDED
|
||||
SELECT a FROM t1
|
||||
UNION
|
||||
SELECT a FROM t1
|
||||
ORDER BY a;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
2 UNION t1 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
|
||||
Warnings:
|
||||
Note 1003 select '0' AS `a` from `test`.`t1` union select '0' AS `a` from `test`.`t1` order by `a`
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
|
156
mysql-test/suite/binlog/r/binlog_tbl_metadata.result
Normal file
156
mysql-test/suite/binlog/r/binlog_tbl_metadata.result
Normal file
@ -0,0 +1,156 @@
|
||||
RESET MASTER;
|
||||
DROP TABLE IF EXISTS `t1`;
|
||||
CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`c2` varchar(30) NOT NULL,
|
||||
`c3` varchar(30) DEFAULT NULL,
|
||||
`c4` varchar(30) DEFAULT NULL,
|
||||
`c5` varchar(30) DEFAULT NULL,
|
||||
`c6` varchar(30) DEFAULT NULL,
|
||||
`c7` varchar(30) DEFAULT NULL,
|
||||
`c8` varchar(30) DEFAULT NULL,
|
||||
`c9` varchar(30) DEFAULT NULL,
|
||||
`c10` varchar(30) DEFAULT NULL,
|
||||
`c11` varchar(30) DEFAULT NULL,
|
||||
`c12` varchar(30) DEFAULT NULL,
|
||||
`c13` varchar(30) DEFAULT NULL,
|
||||
`c14` varchar(30) DEFAULT NULL,
|
||||
`c15` varchar(30) DEFAULT NULL,
|
||||
`c16` varchar(30) DEFAULT NULL,
|
||||
`c17` varchar(30) DEFAULT NULL,
|
||||
`c18` varchar(30) DEFAULT NULL,
|
||||
`c19` varchar(30) DEFAULT NULL,
|
||||
`c20` varchar(30) DEFAULT NULL,
|
||||
`c21` varchar(30) DEFAULT NULL,
|
||||
`c22` varchar(30) DEFAULT NULL,
|
||||
`c23` varchar(30) DEFAULT NULL,
|
||||
`c24` varchar(30) DEFAULT NULL,
|
||||
`c25` varchar(30) DEFAULT NULL,
|
||||
`c26` varchar(30) DEFAULT NULL,
|
||||
`c27` varchar(30) DEFAULT NULL,
|
||||
`c28` varchar(30) DEFAULT NULL,
|
||||
`c29` varchar(30) DEFAULT NULL,
|
||||
`c30` varchar(30) DEFAULT NULL,
|
||||
`c31` varchar(30) DEFAULT NULL,
|
||||
`c32` varchar(30) DEFAULT NULL,
|
||||
`c33` varchar(30) DEFAULT NULL,
|
||||
`c34` varchar(30) DEFAULT NULL,
|
||||
`c35` varchar(30) DEFAULT NULL,
|
||||
`c36` varchar(30) DEFAULT NULL,
|
||||
`c37` varchar(30) DEFAULT NULL,
|
||||
`c38` varchar(30) DEFAULT NULL,
|
||||
`c39` varchar(30) DEFAULT NULL,
|
||||
`c40` varchar(30) DEFAULT NULL,
|
||||
`c41` varchar(30) DEFAULT NULL,
|
||||
`c42` varchar(30) DEFAULT NULL,
|
||||
`c43` varchar(30) DEFAULT NULL,
|
||||
`c44` varchar(30) DEFAULT NULL,
|
||||
`c45` varchar(30) DEFAULT NULL,
|
||||
`c46` varchar(30) DEFAULT NULL,
|
||||
`c47` varchar(30) DEFAULT NULL,
|
||||
`c48` varchar(30) DEFAULT NULL,
|
||||
`c49` varchar(30) DEFAULT NULL,
|
||||
`c50` varchar(30) DEFAULT NULL,
|
||||
`c51` varchar(30) DEFAULT NULL,
|
||||
`c52` varchar(30) DEFAULT NULL,
|
||||
`c53` varchar(30) DEFAULT NULL,
|
||||
`c54` varchar(30) DEFAULT NULL,
|
||||
`c55` varchar(30) DEFAULT NULL,
|
||||
`c56` varchar(30) DEFAULT NULL,
|
||||
`c57` varchar(30) DEFAULT NULL,
|
||||
`c58` varchar(30) DEFAULT NULL,
|
||||
`c59` varchar(30) DEFAULT NULL,
|
||||
`c60` varchar(30) DEFAULT NULL,
|
||||
`c61` varchar(30) DEFAULT NULL,
|
||||
`c62` varchar(30) DEFAULT NULL,
|
||||
`c63` varchar(30) DEFAULT NULL,
|
||||
`c64` varchar(30) DEFAULT NULL,
|
||||
`c65` varchar(30) DEFAULT NULL,
|
||||
`c66` varchar(30) DEFAULT NULL,
|
||||
`c67` varchar(30) DEFAULT NULL,
|
||||
`c68` varchar(30) DEFAULT NULL,
|
||||
`c69` varchar(30) DEFAULT NULL,
|
||||
`c70` varchar(30) DEFAULT NULL,
|
||||
`c71` varchar(30) DEFAULT NULL,
|
||||
`c72` varchar(30) DEFAULT NULL,
|
||||
`c73` varchar(30) DEFAULT NULL,
|
||||
`c74` varchar(30) DEFAULT NULL,
|
||||
`c75` varchar(30) DEFAULT NULL,
|
||||
`c76` varchar(30) DEFAULT NULL,
|
||||
`c77` varchar(30) DEFAULT NULL,
|
||||
`c78` varchar(30) DEFAULT NULL,
|
||||
`c79` varchar(30) DEFAULT NULL,
|
||||
`c80` varchar(30) DEFAULT NULL,
|
||||
`c81` varchar(30) DEFAULT NULL,
|
||||
`c82` varchar(30) DEFAULT NULL,
|
||||
`c83` varchar(30) DEFAULT NULL,
|
||||
`c84` varchar(30) DEFAULT NULL,
|
||||
`c85` varchar(30) DEFAULT NULL,
|
||||
`c86` varchar(30) DEFAULT NULL,
|
||||
`c87` varchar(30) DEFAULT NULL,
|
||||
`c88` varchar(30) DEFAULT NULL,
|
||||
`c89` varchar(30) DEFAULT NULL,
|
||||
`c90` varchar(30) DEFAULT NULL,
|
||||
`c91` varchar(30) DEFAULT NULL,
|
||||
`c92` varchar(30) DEFAULT NULL,
|
||||
`c93` varchar(30) DEFAULT NULL,
|
||||
`c94` varchar(30) DEFAULT NULL,
|
||||
`c95` varchar(30) DEFAULT NULL,
|
||||
`c96` varchar(30) DEFAULT NULL,
|
||||
`c97` varchar(30) DEFAULT NULL,
|
||||
`c98` varchar(30) DEFAULT NULL,
|
||||
`c99` varchar(30) DEFAULT NULL,
|
||||
`c100` varchar(30) DEFAULT NULL,
|
||||
`c101` varchar(30) DEFAULT NULL,
|
||||
`c102` varchar(30) DEFAULT NULL,
|
||||
`c103` varchar(30) DEFAULT NULL,
|
||||
`c104` varchar(30) DEFAULT NULL,
|
||||
`c105` varchar(30) DEFAULT NULL,
|
||||
`c106` varchar(30) DEFAULT NULL,
|
||||
`c107` varchar(30) DEFAULT NULL,
|
||||
`c108` varchar(30) DEFAULT NULL,
|
||||
`c109` varchar(30) DEFAULT NULL,
|
||||
`c110` varchar(30) DEFAULT NULL,
|
||||
`c111` varchar(30) DEFAULT NULL,
|
||||
`c112` varchar(30) DEFAULT NULL,
|
||||
`c113` varchar(30) DEFAULT NULL,
|
||||
`c114` varchar(30) DEFAULT NULL,
|
||||
`c115` varchar(30) DEFAULT NULL,
|
||||
`c116` varchar(30) DEFAULT NULL,
|
||||
`c117` varchar(30) DEFAULT NULL,
|
||||
`c118` varchar(30) DEFAULT NULL,
|
||||
`c119` varchar(30) DEFAULT NULL,
|
||||
`c120` varchar(30) DEFAULT NULL,
|
||||
`c121` varchar(30) DEFAULT NULL,
|
||||
`c122` varchar(30) DEFAULT NULL,
|
||||
`c123` varchar(30) DEFAULT NULL,
|
||||
`c124` varchar(30) DEFAULT NULL,
|
||||
`c125` varchar(30) DEFAULT NULL,
|
||||
`c126` varchar(30) DEFAULT NULL,
|
||||
`c127` varchar(30) DEFAULT NULL,
|
||||
`c128` varchar(30) DEFAULT NULL,
|
||||
`c129` varchar(30) DEFAULT NULL,
|
||||
`c130` varchar(30) DEFAULT NULL,
|
||||
`c131` varchar(30) DEFAULT NULL,
|
||||
`c132` varchar(30) DEFAULT NULL,
|
||||
`c133` varchar(30) DEFAULT NULL,
|
||||
`c134` varchar(30) DEFAULT NULL,
|
||||
`c135` varchar(30) DEFAULT NULL,
|
||||
`c136` varchar(30) DEFAULT NULL,
|
||||
`c137` varchar(30) DEFAULT NULL,
|
||||
`c138` varchar(30) DEFAULT NULL,
|
||||
`c139` varchar(30) DEFAULT NULL,
|
||||
`c140` varchar(30) DEFAULT NULL,
|
||||
`c141` varchar(30) DEFAULT NULL,
|
||||
`c142` varchar(30) DEFAULT NULL,
|
||||
`c143` varchar(30) DEFAULT NULL,
|
||||
`c144` varchar(30) DEFAULT NULL,
|
||||
`c145` varchar(30) DEFAULT NULL,
|
||||
`c146` varchar(30) DEFAULT NULL,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB;
|
||||
LOCK TABLES `t1` WRITE;
|
||||
INSERT INTO `t1` VALUES ('1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1');
|
||||
DROP TABLE `t1`;
|
||||
FLUSH LOGS;
|
||||
=== Using mysqlbinlog to detect failure. Before the patch mysqlbinlog would find a corrupted event, thence would fail.
|
199
mysql-test/suite/binlog/t/binlog_tbl_metadata.test
Normal file
199
mysql-test/suite/binlog/t/binlog_tbl_metadata.test
Normal file
@ -0,0 +1,199 @@
|
||||
#
|
||||
# BUG#42749: infinite loop writing to row based binlog - processlist shows
|
||||
# "freeing items"
|
||||
#
|
||||
# WHY
|
||||
# ===
|
||||
#
|
||||
# This bug would make table map event to report data_written one byte less
|
||||
# than what would actually be written in its body. This would cause one byte shorter
|
||||
# event end_log_pos. The ultimate impact was that it would make fixing the
|
||||
# position in MYSQL_BIN_LOG::write_cache bogus or end up in an infinite loop.
|
||||
#
|
||||
# HOW
|
||||
# ===
|
||||
#
|
||||
# Checking that the patch fixes the problem is done as follows:
|
||||
# i) a table with several fields is created;
|
||||
# ii) an insert is performed;
|
||||
# iii) the logs are flushed;
|
||||
# iv) mysqlbinlog is used to check if it succeeds.
|
||||
#
|
||||
# In step iv), before the bug was fixed, the test case would fail with
|
||||
# mysqlbinlog reporting that it was unable to succeed in reading the event.
|
||||
#
|
||||
|
||||
-- source include/have_log_bin.inc
|
||||
-- source include/have_innodb.inc
|
||||
-- source include/have_binlog_format_row.inc
|
||||
-- connection default
|
||||
|
||||
RESET MASTER;
|
||||
|
||||
-- disable_warnings
|
||||
DROP TABLE IF EXISTS `t1`;
|
||||
-- enable_warnings
|
||||
|
||||
CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`c2` varchar(30) NOT NULL,
|
||||
`c3` varchar(30) DEFAULT NULL,
|
||||
`c4` varchar(30) DEFAULT NULL,
|
||||
`c5` varchar(30) DEFAULT NULL,
|
||||
`c6` varchar(30) DEFAULT NULL,
|
||||
`c7` varchar(30) DEFAULT NULL,
|
||||
`c8` varchar(30) DEFAULT NULL,
|
||||
`c9` varchar(30) DEFAULT NULL,
|
||||
`c10` varchar(30) DEFAULT NULL,
|
||||
`c11` varchar(30) DEFAULT NULL,
|
||||
`c12` varchar(30) DEFAULT NULL,
|
||||
`c13` varchar(30) DEFAULT NULL,
|
||||
`c14` varchar(30) DEFAULT NULL,
|
||||
`c15` varchar(30) DEFAULT NULL,
|
||||
`c16` varchar(30) DEFAULT NULL,
|
||||
`c17` varchar(30) DEFAULT NULL,
|
||||
`c18` varchar(30) DEFAULT NULL,
|
||||
`c19` varchar(30) DEFAULT NULL,
|
||||
`c20` varchar(30) DEFAULT NULL,
|
||||
`c21` varchar(30) DEFAULT NULL,
|
||||
`c22` varchar(30) DEFAULT NULL,
|
||||
`c23` varchar(30) DEFAULT NULL,
|
||||
`c24` varchar(30) DEFAULT NULL,
|
||||
`c25` varchar(30) DEFAULT NULL,
|
||||
`c26` varchar(30) DEFAULT NULL,
|
||||
`c27` varchar(30) DEFAULT NULL,
|
||||
`c28` varchar(30) DEFAULT NULL,
|
||||
`c29` varchar(30) DEFAULT NULL,
|
||||
`c30` varchar(30) DEFAULT NULL,
|
||||
`c31` varchar(30) DEFAULT NULL,
|
||||
`c32` varchar(30) DEFAULT NULL,
|
||||
`c33` varchar(30) DEFAULT NULL,
|
||||
`c34` varchar(30) DEFAULT NULL,
|
||||
`c35` varchar(30) DEFAULT NULL,
|
||||
`c36` varchar(30) DEFAULT NULL,
|
||||
`c37` varchar(30) DEFAULT NULL,
|
||||
`c38` varchar(30) DEFAULT NULL,
|
||||
`c39` varchar(30) DEFAULT NULL,
|
||||
`c40` varchar(30) DEFAULT NULL,
|
||||
`c41` varchar(30) DEFAULT NULL,
|
||||
`c42` varchar(30) DEFAULT NULL,
|
||||
`c43` varchar(30) DEFAULT NULL,
|
||||
`c44` varchar(30) DEFAULT NULL,
|
||||
`c45` varchar(30) DEFAULT NULL,
|
||||
`c46` varchar(30) DEFAULT NULL,
|
||||
`c47` varchar(30) DEFAULT NULL,
|
||||
`c48` varchar(30) DEFAULT NULL,
|
||||
`c49` varchar(30) DEFAULT NULL,
|
||||
`c50` varchar(30) DEFAULT NULL,
|
||||
`c51` varchar(30) DEFAULT NULL,
|
||||
`c52` varchar(30) DEFAULT NULL,
|
||||
`c53` varchar(30) DEFAULT NULL,
|
||||
`c54` varchar(30) DEFAULT NULL,
|
||||
`c55` varchar(30) DEFAULT NULL,
|
||||
`c56` varchar(30) DEFAULT NULL,
|
||||
`c57` varchar(30) DEFAULT NULL,
|
||||
`c58` varchar(30) DEFAULT NULL,
|
||||
`c59` varchar(30) DEFAULT NULL,
|
||||
`c60` varchar(30) DEFAULT NULL,
|
||||
`c61` varchar(30) DEFAULT NULL,
|
||||
`c62` varchar(30) DEFAULT NULL,
|
||||
`c63` varchar(30) DEFAULT NULL,
|
||||
`c64` varchar(30) DEFAULT NULL,
|
||||
`c65` varchar(30) DEFAULT NULL,
|
||||
`c66` varchar(30) DEFAULT NULL,
|
||||
`c67` varchar(30) DEFAULT NULL,
|
||||
`c68` varchar(30) DEFAULT NULL,
|
||||
`c69` varchar(30) DEFAULT NULL,
|
||||
`c70` varchar(30) DEFAULT NULL,
|
||||
`c71` varchar(30) DEFAULT NULL,
|
||||
`c72` varchar(30) DEFAULT NULL,
|
||||
`c73` varchar(30) DEFAULT NULL,
|
||||
`c74` varchar(30) DEFAULT NULL,
|
||||
`c75` varchar(30) DEFAULT NULL,
|
||||
`c76` varchar(30) DEFAULT NULL,
|
||||
`c77` varchar(30) DEFAULT NULL,
|
||||
`c78` varchar(30) DEFAULT NULL,
|
||||
`c79` varchar(30) DEFAULT NULL,
|
||||
`c80` varchar(30) DEFAULT NULL,
|
||||
`c81` varchar(30) DEFAULT NULL,
|
||||
`c82` varchar(30) DEFAULT NULL,
|
||||
`c83` varchar(30) DEFAULT NULL,
|
||||
`c84` varchar(30) DEFAULT NULL,
|
||||
`c85` varchar(30) DEFAULT NULL,
|
||||
`c86` varchar(30) DEFAULT NULL,
|
||||
`c87` varchar(30) DEFAULT NULL,
|
||||
`c88` varchar(30) DEFAULT NULL,
|
||||
`c89` varchar(30) DEFAULT NULL,
|
||||
`c90` varchar(30) DEFAULT NULL,
|
||||
`c91` varchar(30) DEFAULT NULL,
|
||||
`c92` varchar(30) DEFAULT NULL,
|
||||
`c93` varchar(30) DEFAULT NULL,
|
||||
`c94` varchar(30) DEFAULT NULL,
|
||||
`c95` varchar(30) DEFAULT NULL,
|
||||
`c96` varchar(30) DEFAULT NULL,
|
||||
`c97` varchar(30) DEFAULT NULL,
|
||||
`c98` varchar(30) DEFAULT NULL,
|
||||
`c99` varchar(30) DEFAULT NULL,
|
||||
`c100` varchar(30) DEFAULT NULL,
|
||||
`c101` varchar(30) DEFAULT NULL,
|
||||
`c102` varchar(30) DEFAULT NULL,
|
||||
`c103` varchar(30) DEFAULT NULL,
|
||||
`c104` varchar(30) DEFAULT NULL,
|
||||
`c105` varchar(30) DEFAULT NULL,
|
||||
`c106` varchar(30) DEFAULT NULL,
|
||||
`c107` varchar(30) DEFAULT NULL,
|
||||
`c108` varchar(30) DEFAULT NULL,
|
||||
`c109` varchar(30) DEFAULT NULL,
|
||||
`c110` varchar(30) DEFAULT NULL,
|
||||
`c111` varchar(30) DEFAULT NULL,
|
||||
`c112` varchar(30) DEFAULT NULL,
|
||||
`c113` varchar(30) DEFAULT NULL,
|
||||
`c114` varchar(30) DEFAULT NULL,
|
||||
`c115` varchar(30) DEFAULT NULL,
|
||||
`c116` varchar(30) DEFAULT NULL,
|
||||
`c117` varchar(30) DEFAULT NULL,
|
||||
`c118` varchar(30) DEFAULT NULL,
|
||||
`c119` varchar(30) DEFAULT NULL,
|
||||
`c120` varchar(30) DEFAULT NULL,
|
||||
`c121` varchar(30) DEFAULT NULL,
|
||||
`c122` varchar(30) DEFAULT NULL,
|
||||
`c123` varchar(30) DEFAULT NULL,
|
||||
`c124` varchar(30) DEFAULT NULL,
|
||||
`c125` varchar(30) DEFAULT NULL,
|
||||
`c126` varchar(30) DEFAULT NULL,
|
||||
`c127` varchar(30) DEFAULT NULL,
|
||||
`c128` varchar(30) DEFAULT NULL,
|
||||
`c129` varchar(30) DEFAULT NULL,
|
||||
`c130` varchar(30) DEFAULT NULL,
|
||||
`c131` varchar(30) DEFAULT NULL,
|
||||
`c132` varchar(30) DEFAULT NULL,
|
||||
`c133` varchar(30) DEFAULT NULL,
|
||||
`c134` varchar(30) DEFAULT NULL,
|
||||
`c135` varchar(30) DEFAULT NULL,
|
||||
`c136` varchar(30) DEFAULT NULL,
|
||||
`c137` varchar(30) DEFAULT NULL,
|
||||
`c138` varchar(30) DEFAULT NULL,
|
||||
`c139` varchar(30) DEFAULT NULL,
|
||||
`c140` varchar(30) DEFAULT NULL,
|
||||
`c141` varchar(30) DEFAULT NULL,
|
||||
`c142` varchar(30) DEFAULT NULL,
|
||||
`c143` varchar(30) DEFAULT NULL,
|
||||
`c144` varchar(30) DEFAULT NULL,
|
||||
`c145` varchar(30) DEFAULT NULL,
|
||||
`c146` varchar(30) DEFAULT NULL,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
LOCK TABLES `t1` WRITE;
|
||||
|
||||
INSERT INTO `t1` VALUES ('1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1');
|
||||
|
||||
DROP TABLE `t1`;
|
||||
|
||||
FLUSH LOGS;
|
||||
|
||||
-- echo === Using mysqlbinlog to detect failure. Before the patch mysqlbinlog would find a corrupted event, thence would fail.
|
||||
|
||||
-- let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||
-- exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog
|
||||
-- remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog
|
20
mysql-test/suite/ibmdb2i/include/have_i54.inc
Executable file
20
mysql-test/suite/ibmdb2i/include/have_i54.inc
Executable file
@ -0,0 +1,20 @@
|
||||
# Check for IBM i 6.1 or later
|
||||
--disable_query_log
|
||||
system uname -rv > $MYSQLTEST_VARDIR/tmp/version;
|
||||
--disable_warnings
|
||||
drop table if exists uname_vr;
|
||||
--enable_warnings
|
||||
create temporary table uname_vr (r int, v int);
|
||||
--disable_warnings
|
||||
eval LOAD DATA INFILE "$MYSQLTEST_VARDIR/tmp/version" into table uname_vr fields terminated by ' ';
|
||||
--enable_warnings
|
||||
let $ok = `select count(*) from uname_vr where v = 5 and r = 4`;
|
||||
drop table uname_vr;
|
||||
remove_file $MYSQLTEST_VARDIR/tmp/version;
|
||||
--enable_query_log
|
||||
if (!$ok)
|
||||
{
|
||||
skip "Need IBM i 5.4 or later";
|
||||
}
|
||||
|
||||
|
4
mysql-test/suite/ibmdb2i/r/ibmdb2i_bug_44232.result
Executable file
4
mysql-test/suite/ibmdb2i/r/ibmdb2i_bug_44232.result
Executable file
@ -0,0 +1,4 @@
|
||||
create table t1 (c char(1) character set armscii8) engine=ibmdb2i;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 2504)
|
||||
create table t1 (c char(1) character set eucjpms ) engine=ibmdb2i;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 2504)
|
8
mysql-test/suite/ibmdb2i/t/ibmdb2i_bug_44232.test
Executable file
8
mysql-test/suite/ibmdb2i/t/ibmdb2i_bug_44232.test
Executable file
@ -0,0 +1,8 @@
|
||||
--source suite/ibmdb2i/include/have_ibmdb2i.inc
|
||||
--source suite/ibmdb2i/include/have_i54.inc
|
||||
|
||||
--error 1005
|
||||
create table t1 (c char(1) character set armscii8) engine=ibmdb2i;
|
||||
|
||||
--error 1005
|
||||
create table t1 (c char(1) character set eucjpms ) engine=ibmdb2i;
|
@ -12,9 +12,9 @@ connect (con1,localhost,root,,);
|
||||
--echo # Establish connection con2 (user=root)
|
||||
connect (con2,localhost,root,,);
|
||||
|
||||
### Test 1:
|
||||
### - While a consistent snapshot transaction is executed,
|
||||
### no external inserts should be visible to the transaction.
|
||||
--echo ### Test 1:
|
||||
--echo ### - While a consistent snapshot transaction is executed,
|
||||
--echo ### no external inserts should be visible to the transaction.
|
||||
|
||||
--echo # Switch to connection con1
|
||||
connection con1;
|
||||
@ -31,9 +31,9 @@ SELECT * FROM t1; # if consistent snapshot was set as expected, we
|
||||
# should see nothing.
|
||||
COMMIT;
|
||||
|
||||
### Test 2:
|
||||
### - For any non-consistent snapshot transaction, external
|
||||
### committed inserts should be visible to the transaction.
|
||||
--echo ### Test 2:
|
||||
--echo ### - For any non-consistent snapshot transaction, external
|
||||
--echo ### committed inserts should be visible to the transaction.
|
||||
|
||||
DELETE FROM t1;
|
||||
START TRANSACTION; # Now we omit WITH CONSISTENT SNAPSHOT
|
||||
@ -48,6 +48,24 @@ SELECT * FROM t1; # if consistent snapshot was not set, as expected, we
|
||||
# should see 1.
|
||||
COMMIT;
|
||||
|
||||
--echo ### Test 3:
|
||||
--echo ### - Bug#44664: valgrind warning for COMMIT_AND_CHAIN and ROLLBACK_AND_CHAIN
|
||||
--echo ### Chaining a transaction does not retain consistency level.
|
||||
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
DELETE FROM t1;
|
||||
COMMIT WORK AND CHAIN;
|
||||
|
||||
--echo # Switch to connection con2
|
||||
connection con2;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
|
||||
--echo # Switch to connection con1
|
||||
connection con1;
|
||||
SELECT * FROM t1; # if consistent snapshot was not set, as expected, we
|
||||
# should see 1.
|
||||
COMMIT;
|
||||
|
||||
--echo # Switch to connection default + close connections con1 and con2
|
||||
connection default;
|
||||
disconnect con1;
|
||||
|
@ -1282,6 +1282,16 @@ INSERT INTO t1 VALUES ('2008-12-31','aaaaaa');
|
||||
SELECT DATE_FORMAT(c, GET_FORMAT(DATE, 'eur')) h, CONCAT(UPPER(aa),', ', aa) i FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # BUG#44774: load_file function produces valgrind warnings
|
||||
--echo #
|
||||
CREATE TABLE t1 (a TINYBLOB);
|
||||
INSERT INTO t1 VALUES ('aaaaaaaa');
|
||||
SELECT LOAD_FILE(a) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
|
@ -53,7 +53,7 @@ order by table_name;
|
||||
end|
|
||||
delimiter ;|
|
||||
|
||||
create table t1
|
||||
create table t1
|
||||
(f1 int(10) unsigned not null,
|
||||
f2 varchar(100) not null,
|
||||
primary key (f1), unique key (f2));
|
||||
@ -105,8 +105,8 @@ drop function f2;
|
||||
drop view v1, v2;
|
||||
|
||||
#
|
||||
# Bug#20543: select on information_schema strange warnings, view, different
|
||||
# schemas/users
|
||||
# Bug#20543 select on information_schema strange warnings, view, different
|
||||
# schemas/users
|
||||
#
|
||||
#
|
||||
create database testdb_1;
|
||||
@ -125,7 +125,7 @@ grant insert on v1 to testdb_2@localhost;
|
||||
create view v5 as select f1 from t1;
|
||||
grant show view on v5 to testdb_2@localhost;
|
||||
|
||||
--error 1227
|
||||
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
|
||||
create definer=`no_such_user`@`no_such_host` view v6 as select f1 from t1;
|
||||
|
||||
connection default;
|
||||
@ -169,46 +169,53 @@ use testdb_1;
|
||||
revoke show view on v6 from testdb_2@localhost;
|
||||
connection testdb_2;
|
||||
|
||||
--error 1142
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show fields from testdb_1.v5;
|
||||
--error 1142
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show create view testdb_1.v5;
|
||||
|
||||
--error 1142
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show fields from testdb_1.v6;
|
||||
--error 1142
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show create view testdb_1.v6;
|
||||
|
||||
--error 1142
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show fields from testdb_1.v7;
|
||||
--error 1142
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show create view testdb_1.v7;
|
||||
|
||||
--error 1345
|
||||
--error ER_VIEW_NO_EXPLAIN
|
||||
show create view v4;
|
||||
#--error 1345
|
||||
#--error ER_VIEW_NO_EXPLAIN
|
||||
show fields from v4;
|
||||
|
||||
show fields from v2;
|
||||
show fields from testdb_1.v1;
|
||||
show create view v2;
|
||||
--error 1142
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show create view testdb_1.v1;
|
||||
|
||||
select table_name from information_schema.columns a
|
||||
select table_name from information_schema.columns a
|
||||
where a.table_name = 'v2';
|
||||
select view_definition from information_schema.views a
|
||||
select view_definition from information_schema.views a
|
||||
where a.table_name = 'v2';
|
||||
select view_definition from information_schema.views a
|
||||
select view_definition from information_schema.views a
|
||||
where a.table_name = 'testdb_1.v1';
|
||||
|
||||
--error 1356
|
||||
--error ER_VIEW_INVALID
|
||||
select * from v2;
|
||||
|
||||
connection default;
|
||||
use test;
|
||||
drop view testdb_1.v1, v2, testdb_1.v3, v4;
|
||||
drop database testdb_1;
|
||||
connection testdb_1;
|
||||
disconnect testdb_1;
|
||||
--source include/wait_until_disconnected.inc
|
||||
connection testdb_2;
|
||||
disconnect testdb_2;
|
||||
--source include/wait_until_disconnected.inc
|
||||
connection default;
|
||||
drop user testdb_1@localhost;
|
||||
drop user testdb_2@localhost;
|
||||
|
||||
@ -239,4 +246,7 @@ show create view testdb_1.v1;
|
||||
connection default;
|
||||
drop user mysqltest_1@localhost;
|
||||
drop database testdb_1;
|
||||
connection user1;
|
||||
disconnect user1;
|
||||
--source include/wait_until_disconnected.inc
|
||||
connection default;
|
||||
|
@ -77,3 +77,16 @@ insert into t1 values('2007-07-02', 1);
|
||||
insert into t1 values('2007-07-02', 2);
|
||||
SELECT sum(f3) FROM t1 where f2='2007-07-01 00:00:00' group by f2;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #44792: valgrind warning when casting from time to time
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (c TIME);
|
||||
INSERT INTO t1 VALUES ('0:00:00');
|
||||
SELECT CAST(c AS TIME) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
@ -1089,4 +1089,16 @@ CREATE TABLE t2 AS SELECT d FROM t1 UNION SELECT d FROM t1;
|
||||
SHOW FIELDS FROM t2;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
#
|
||||
# Bug#43612 crash with explain extended, union, order by
|
||||
#
|
||||
CREATE TABLE t1(a INT);
|
||||
EXPLAIN EXTENDED
|
||||
SELECT a FROM t1
|
||||
UNION
|
||||
SELECT a FROM t1
|
||||
ORDER BY a;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
@ -410,7 +410,8 @@ invalid value '%s'",
|
||||
argument= optend;
|
||||
}
|
||||
else if (optp->arg_type == OPT_ARG &&
|
||||
(optp->var_type & GET_TYPE_MASK) == GET_BOOL)
|
||||
(((optp->var_type & GET_TYPE_MASK) == GET_BOOL) ||
|
||||
(optp->var_type & GET_TYPE_MASK) == GET_ENUM))
|
||||
{
|
||||
if (optend == disabled_my_option)
|
||||
*((my_bool*) value)= (my_bool) 0;
|
||||
|
@ -116,10 +116,15 @@ case $PLATFORM in
|
||||
esac
|
||||
|
||||
# Change the distribution to a long descriptive name
|
||||
# For the cluster product, concentrate on the second part
|
||||
VERSION_NAME=@VERSION@
|
||||
case $VERSION_NAME in
|
||||
*-ndb-* ) VERSION_NAME=`echo $VERSION_NAME | sed -e 's/[.0-9]*-ndb-//'` ;;
|
||||
esac
|
||||
if [ x"$SHORT_PRODUCT_TAG" != x"" ] ; then
|
||||
NEW_NAME=mysql-$SHORT_PRODUCT_TAG-@VERSION@-$PLATFORM$SUFFIX
|
||||
NEW_NAME=mysql-$SHORT_PRODUCT_TAG-$VERSION_NAME-$PLATFORM$SUFFIX
|
||||
else
|
||||
NEW_NAME=mysql@MYSQL_SERVER_SUFFIX@-@VERSION@-$PLATFORM$SUFFIX
|
||||
NEW_NAME=mysql@MYSQL_SERVER_SUFFIX@-$VERSION_NAME-$PLATFORM$SUFFIX
|
||||
fi
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
@ -126,7 +126,7 @@ if [ -e $DESTDIR ] ; then
|
||||
usage
|
||||
fi
|
||||
|
||||
trap 'echo "Clearning up and exiting..." ; rm -fr $DESTDIR; exit 1' ERR
|
||||
trap 'echo "Cleaning up and exiting..." ; rm -fr $DESTDIR; exit 1' ERR
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Adjust target name if needed, release with debug info has another name
|
||||
|
@ -5307,7 +5307,7 @@ bool Field_time::get_time(MYSQL_TIME *ltime)
|
||||
ltime->neg= 1;
|
||||
tmp=-tmp;
|
||||
}
|
||||
ltime->day= 0;
|
||||
ltime->year= ltime->month= ltime->day= 0;
|
||||
ltime->hour= (int) (tmp/10000);
|
||||
tmp-=ltime->hour*10000;
|
||||
ltime->minute= (int) tmp/100;
|
||||
|
@ -2943,7 +2943,7 @@ String *Item_load_file::val_str(String *str)
|
||||
)
|
||||
goto err;
|
||||
|
||||
(void) fn_format(path, file_name->c_ptr(), mysql_real_data_home, "",
|
||||
(void) fn_format(path, file_name->c_ptr_safe(), mysql_real_data_home, "",
|
||||
MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
|
||||
|
||||
/* Read only allowed from within dir specified by secure_file_priv */
|
||||
@ -2969,7 +2969,7 @@ String *Item_load_file::val_str(String *str)
|
||||
}
|
||||
if (tmp_value.alloc(stat_info.st_size))
|
||||
goto err;
|
||||
if ((file = my_open(file_name->c_ptr(), O_RDONLY, MYF(0))) < 0)
|
||||
if ((file = my_open(file_name->ptr(), O_RDONLY, MYF(0))) < 0)
|
||||
goto err;
|
||||
if (my_read(file, (uchar*) tmp_value.ptr(), stat_info.st_size, MYF(MY_NABP)))
|
||||
{
|
||||
|
@ -7360,6 +7360,7 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
|
||||
// Do event specific preparations
|
||||
error= do_before_row_operations(rli);
|
||||
|
||||
// row processing loop
|
||||
|
||||
while (error == 0 && m_curr_row < m_rows_end)
|
||||
@ -7861,10 +7862,11 @@ Table_map_log_event::Table_map_log_event(THD *thd, TABLE *tbl, ulong tid,
|
||||
|
||||
/*
|
||||
Now set the size of the data to the size of the field metadata array
|
||||
plus one or two bytes for number of elements in the field metadata array.
|
||||
plus one or three bytes (see pack.c:net_store_length) for number of
|
||||
elements in the field metadata array.
|
||||
*/
|
||||
if (m_field_metadata_size > 255)
|
||||
m_data_size+= m_field_metadata_size + 2;
|
||||
m_data_size+= m_field_metadata_size + 3;
|
||||
else
|
||||
m_data_size+= m_field_metadata_size + 1;
|
||||
|
||||
|
@ -404,8 +404,8 @@ int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
|
||||
DBUG_PRINT("info",("Terminating IO thread"));
|
||||
mi->abort_slave=1;
|
||||
if ((error=terminate_slave_thread(mi->io_thd, io_lock,
|
||||
&mi->stop_cond,
|
||||
&mi->slave_running,
|
||||
&mi->stop_cond,
|
||||
&mi->slave_running,
|
||||
skip_lock)) &&
|
||||
!force_all)
|
||||
DBUG_RETURN(error);
|
||||
@ -415,8 +415,8 @@ int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
|
||||
DBUG_PRINT("info",("Terminating SQL thread"));
|
||||
mi->rli.abort_slave=1;
|
||||
if ((error=terminate_slave_thread(mi->rli.sql_thd, sql_lock,
|
||||
&mi->rli.stop_cond,
|
||||
&mi->rli.slave_running,
|
||||
&mi->rli.stop_cond,
|
||||
&mi->rli.slave_running,
|
||||
skip_lock)) &&
|
||||
!force_all)
|
||||
DBUG_RETURN(error);
|
||||
@ -424,6 +424,7 @@ int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Wait for a slave thread to terminate.
|
||||
|
||||
|
@ -195,11 +195,8 @@ bool begin_trans(THD *thd)
|
||||
error= -1;
|
||||
else
|
||||
{
|
||||
LEX *lex= thd->lex;
|
||||
thd->options|= OPTION_BEGIN;
|
||||
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
||||
if (lex->start_transaction_opt & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT)
|
||||
error= ha_start_consistent_snapshot(thd);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
@ -4027,6 +4024,11 @@ end_with_restore_list:
|
||||
}
|
||||
if (begin_trans(thd))
|
||||
goto error;
|
||||
if (lex->start_transaction_opt & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT)
|
||||
{
|
||||
if (ha_start_consistent_snapshot(thd))
|
||||
goto error;
|
||||
}
|
||||
my_ok(thd);
|
||||
break;
|
||||
case SQLCOM_COMMIT:
|
||||
|
@ -29,6 +29,18 @@
|
||||
|
||||
extern struct st_mysql_plugin *mysqld_builtins[];
|
||||
|
||||
/**
|
||||
@note The order of the enumeration is critical.
|
||||
@see construct_options
|
||||
*/
|
||||
static const char *global_plugin_typelib_names[]=
|
||||
{ "OFF", "ON", "FORCE", NULL };
|
||||
enum enum_plugin_load_policy {PLUGIN_OFF, PLUGIN_ON, PLUGIN_FORCE};
|
||||
static TYPELIB global_plugin_typelib=
|
||||
{ array_elements(global_plugin_typelib_names)-1,
|
||||
"", global_plugin_typelib_names, NULL };
|
||||
|
||||
|
||||
char *opt_plugin_load= NULL;
|
||||
char *opt_plugin_dir_ptr;
|
||||
char opt_plugin_dir[FN_REFLEN];
|
||||
@ -192,7 +204,7 @@ static void plugin_load(MEM_ROOT *tmp_root, int *argc, char **argv);
|
||||
static bool plugin_load_list(MEM_ROOT *tmp_root, int *argc, char **argv,
|
||||
const char *list);
|
||||
static int test_plugin_options(MEM_ROOT *, struct st_plugin_int *,
|
||||
int *, char **, my_bool);
|
||||
int *, char **);
|
||||
static bool register_builtin(struct st_mysql_plugin *, struct st_plugin_int *,
|
||||
struct st_plugin_int **);
|
||||
static void unlock_variables(THD *thd, struct system_variables *vars);
|
||||
@ -751,7 +763,7 @@ static bool plugin_add(MEM_ROOT *tmp_root,
|
||||
tmp.name.length= name_len;
|
||||
tmp.ref_count= 0;
|
||||
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
||||
if (test_plugin_options(tmp_root, &tmp, argc, argv, true))
|
||||
if (test_plugin_options(tmp_root, &tmp, argc, argv))
|
||||
tmp.state= PLUGIN_IS_DISABLED;
|
||||
|
||||
if ((tmp_plugin_ptr= plugin_insert_or_reuse(&tmp)))
|
||||
@ -997,7 +1009,6 @@ static int plugin_initialize(struct st_plugin_int *plugin)
|
||||
DBUG_ENTER("plugin_initialize");
|
||||
|
||||
safe_mutex_assert_owner(&LOCK_plugin);
|
||||
|
||||
if (plugin_type_initialize[plugin->plugin->type])
|
||||
{
|
||||
if ((*plugin_type_initialize[plugin->plugin->type])(plugin))
|
||||
@ -1083,6 +1094,20 @@ uchar *get_bookmark_hash_key(const uchar *buff, size_t *length,
|
||||
return (uchar*) var->key;
|
||||
}
|
||||
|
||||
static inline void convert_dash_to_underscore(char *str, int len)
|
||||
{
|
||||
for (char *p= str; p <= str+len; p++)
|
||||
if (*p == '-')
|
||||
*p= '_';
|
||||
}
|
||||
|
||||
static inline void convert_underscore_to_dash(char *str, int len)
|
||||
{
|
||||
for (char *p= str; p <= str+len; p++)
|
||||
if (*p == '_')
|
||||
*p= '-';
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
The logic is that we first load and initialize all compiled in plugins.
|
||||
@ -1094,11 +1119,12 @@ uchar *get_bookmark_hash_key(const uchar *buff, size_t *length,
|
||||
int plugin_init(int *argc, char **argv, int flags)
|
||||
{
|
||||
uint i;
|
||||
bool def_enabled, is_myisam;
|
||||
bool is_myisam;
|
||||
struct st_mysql_plugin **builtins;
|
||||
struct st_mysql_plugin *plugin;
|
||||
struct st_plugin_int tmp, *plugin_ptr, **reap;
|
||||
MEM_ROOT tmp_root;
|
||||
bool reaped_mandatory_plugin= FALSE;
|
||||
DBUG_ENTER("plugin_init");
|
||||
|
||||
if (initialized)
|
||||
@ -1142,17 +1168,13 @@ int plugin_init(int *argc, char **argv, int flags)
|
||||
!my_strnncoll(&my_charset_latin1, (const uchar*) plugin->name,
|
||||
6, (const uchar*) "InnoDB", 6))
|
||||
continue;
|
||||
/* by default, ndbcluster and federated are disabled */
|
||||
def_enabled=
|
||||
my_strcasecmp(&my_charset_latin1, plugin->name, "NDBCLUSTER") != 0 &&
|
||||
my_strcasecmp(&my_charset_latin1, plugin->name, "FEDERATED") != 0;
|
||||
bzero(&tmp, sizeof(tmp));
|
||||
tmp.plugin= plugin;
|
||||
tmp.name.str= (char *)plugin->name;
|
||||
tmp.name.length= strlen(plugin->name);
|
||||
tmp.state= 0;
|
||||
free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE));
|
||||
if (test_plugin_options(&tmp_root, &tmp, argc, argv, def_enabled))
|
||||
if (test_plugin_options(&tmp_root, &tmp, argc, argv))
|
||||
tmp.state= PLUGIN_IS_DISABLED;
|
||||
else
|
||||
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
||||
@ -1227,6 +1249,8 @@ int plugin_init(int *argc, char **argv, int flags)
|
||||
while ((plugin_ptr= *(--reap)))
|
||||
{
|
||||
pthread_mutex_unlock(&LOCK_plugin);
|
||||
if (plugin_ptr->is_mandatory)
|
||||
reaped_mandatory_plugin= TRUE;
|
||||
plugin_deinitialize(plugin_ptr, true);
|
||||
pthread_mutex_lock(&LOCK_plugin);
|
||||
plugin_del(plugin_ptr);
|
||||
@ -1234,6 +1258,8 @@ int plugin_init(int *argc, char **argv, int flags)
|
||||
|
||||
pthread_mutex_unlock(&LOCK_plugin);
|
||||
my_afree(reap);
|
||||
if (reaped_mandatory_plugin)
|
||||
goto err;
|
||||
|
||||
end:
|
||||
free_root(&tmp_root, MYF(0));
|
||||
@ -1299,7 +1325,7 @@ bool plugin_register_builtin(THD *thd, struct st_mysql_plugin *plugin)
|
||||
pthread_mutex_lock(&LOCK_plugin);
|
||||
rw_wrlock(&LOCK_system_variables_hash);
|
||||
|
||||
if (test_plugin_options(thd->mem_root, &tmp, &dummy_argc, NULL, true))
|
||||
if (test_plugin_options(thd->mem_root, &tmp, &dummy_argc, NULL))
|
||||
goto end;
|
||||
tmp.state= PLUGIN_IS_UNINITIALIZED;
|
||||
if ((result= register_builtin(plugin, &tmp, &ptr)))
|
||||
@ -2889,59 +2915,78 @@ my_bool get_one_plugin_option(int optid __attribute__((unused)),
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Creates a set of my_option objects associated with a specified plugin-
|
||||
handle.
|
||||
|
||||
@param mem_root Memory allocator to be used.
|
||||
@param tmp A pointer to a plugin handle
|
||||
@param[out] options A pointer to a pre-allocated static array
|
||||
|
||||
The set is stored in the pre-allocated static array supplied to the function.
|
||||
The size of the array is calculated as (number_of_plugin_varaibles*2+3). The
|
||||
reason is that each option can have a prefix '--plugin-' in addtion to the
|
||||
shorter form '--<plugin-name>'. There is also space allocated for
|
||||
terminating NULL pointers.
|
||||
|
||||
@return
|
||||
@retval -1 An error occurred
|
||||
@retval 0 Success
|
||||
*/
|
||||
|
||||
static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
||||
my_option *options, my_bool **enabled,
|
||||
bool can_disable)
|
||||
my_option *options)
|
||||
{
|
||||
const char *plugin_name= tmp->plugin->name;
|
||||
uint namelen= strlen(plugin_name), optnamelen;
|
||||
uint buffer_length= namelen * 4 + (can_disable ? 75 : 10);
|
||||
char *name= (char*) alloc_root(mem_root, buffer_length) + 1;
|
||||
char *optname, *p;
|
||||
const LEX_STRING plugin_dash = { C_STRING_WITH_LEN("plugin-") };
|
||||
uint plugin_name_len= strlen(plugin_name);
|
||||
uint optnamelen;
|
||||
const int max_comment_len= 180;
|
||||
char *comment= (char *) alloc_root(mem_root, max_comment_len + 1);
|
||||
char *optname;
|
||||
|
||||
int index= 0, offset= 0;
|
||||
st_mysql_sys_var *opt, **plugin_option;
|
||||
st_bookmark *v;
|
||||
|
||||
/** Used to circumvent the const attribute on my_option::name */
|
||||
char *plugin_name_ptr, *plugin_name_with_prefix_ptr;
|
||||
|
||||
DBUG_ENTER("construct_options");
|
||||
DBUG_PRINT("plugin", ("plugin: '%s' enabled: %d can_disable: %d",
|
||||
plugin_name, **enabled, can_disable));
|
||||
|
||||
options[0].name= plugin_name_ptr= (char*) alloc_root(mem_root,
|
||||
plugin_name_len + 1);
|
||||
strcpy(plugin_name_ptr, plugin_name);
|
||||
my_casedn_str(&my_charset_latin1, plugin_name_ptr);
|
||||
convert_underscore_to_dash(plugin_name_ptr, plugin_name_len);
|
||||
/* support --skip-plugin-foo syntax */
|
||||
memcpy(name, plugin_name, namelen + 1);
|
||||
my_casedn_str(&my_charset_latin1, name);
|
||||
strxmov(name + namelen + 1, "plugin-", name, NullS);
|
||||
/* Now we have namelen + 1 + 7 + namelen + 1 == namelen * 2 + 9. */
|
||||
options[1].name= plugin_name_with_prefix_ptr= (char*) alloc_root(mem_root,
|
||||
plugin_name_len +
|
||||
plugin_dash.length + 1);
|
||||
strxmov(plugin_name_with_prefix_ptr, plugin_dash.str, options[0].name, NullS);
|
||||
|
||||
for (p= name + namelen*2 + 8; p > name; p--)
|
||||
if (*p == '_')
|
||||
*p= '-';
|
||||
options[0].id= options[1].id= 256; /* must be >255. dup id ok */
|
||||
options[0].var_type= options[1].var_type= GET_ENUM;
|
||||
options[0].arg_type= options[1].arg_type= OPT_ARG;
|
||||
options[0].def_value= options[1].def_value= 1; /* ON */
|
||||
options[0].typelib= options[1].typelib= &global_plugin_typelib;
|
||||
|
||||
if (can_disable)
|
||||
{
|
||||
strxmov(name + namelen*2 + 10, "Enable ", plugin_name, " plugin. "
|
||||
"Disable with --skip-", name," (will save memory).", NullS);
|
||||
/*
|
||||
Now we have namelen * 2 + 10 (one char unused) + 7 + namelen + 9 +
|
||||
20 + namelen + 20 + 1 == namelen * 4 + 67.
|
||||
*/
|
||||
|
||||
options[0].comment= name + namelen*2 + 10;
|
||||
}
|
||||
strxnmov(comment, max_comment_len, "Enable or disable ", plugin_name,
|
||||
" plugin. Possible values are ON, OFF, FORCE (don't start "
|
||||
"if the plugin fails to load).", NullS);
|
||||
options[0].comment= comment;
|
||||
|
||||
/*
|
||||
NOTE: 'name' is one char above the allocated buffer!
|
||||
NOTE: This code assumes that 'my_bool' and 'char' are of same size.
|
||||
Allocate temporary space for the value of the tristate.
|
||||
This option will have a limited lifetime and is not used beyond
|
||||
server initialization.
|
||||
GET_ENUM value is an integer.
|
||||
*/
|
||||
*((my_bool *)(name -1))= **enabled;
|
||||
*enabled= (my_bool *)(name - 1);
|
||||
options[0].value= options[1].value= (uchar **)alloc_root(mem_root,
|
||||
sizeof(int));
|
||||
*((uint*) options[0].value)= *((uint*) options[1].value)=
|
||||
(uint) options[0].def_value;
|
||||
|
||||
|
||||
options[1].name= (options[0].name= name) + namelen + 1;
|
||||
options[0].id= options[1].id= 256; /* must be >255. dup id ok */
|
||||
options[0].var_type= options[1].var_type= GET_BOOL;
|
||||
options[0].arg_type= options[1].arg_type= NO_ARG;
|
||||
options[0].def_value= options[1].def_value= **enabled;
|
||||
options[0].value= options[0].u_max_value=
|
||||
options[1].value= options[1].u_max_value= (uchar**) (name - 1);
|
||||
options+= 2;
|
||||
|
||||
/*
|
||||
@ -2955,7 +3000,7 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
||||
opt= *plugin_option;
|
||||
if (!(opt->flags & PLUGIN_VAR_THDLOCAL))
|
||||
continue;
|
||||
if (!(register_var(name, opt->name, opt->flags)))
|
||||
if (!(register_var(plugin_name_ptr, opt->name, opt->flags)))
|
||||
continue;
|
||||
switch (opt->flags & PLUGIN_VAR_TYPEMASK) {
|
||||
case PLUGIN_VAR_BOOL:
|
||||
@ -3020,7 +3065,7 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
||||
if (!opt->update)
|
||||
{
|
||||
opt->update= update_func_str;
|
||||
if (!(opt->flags & PLUGIN_VAR_MEMALLOC | PLUGIN_VAR_READONLY))
|
||||
if (!(opt->flags & (PLUGIN_VAR_MEMALLOC | PLUGIN_VAR_READONLY)))
|
||||
{
|
||||
opt->flags|= PLUGIN_VAR_READONLY;
|
||||
sql_print_warning("Server variable %s of plugin %s was forced "
|
||||
@ -3062,14 +3107,14 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
||||
if (!(opt->flags & PLUGIN_VAR_THDLOCAL))
|
||||
{
|
||||
optnamelen= strlen(opt->name);
|
||||
optname= (char*) alloc_root(mem_root, namelen + optnamelen + 2);
|
||||
strxmov(optname, name, "-", opt->name, NullS);
|
||||
optnamelen= namelen + optnamelen + 1;
|
||||
optname= (char*) alloc_root(mem_root, plugin_name_len + optnamelen + 2);
|
||||
strxmov(optname, plugin_name_ptr, "-", opt->name, NullS);
|
||||
optnamelen= plugin_name_len + optnamelen + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* this should not fail because register_var should create entry */
|
||||
if (!(v= find_bookmark(name, opt->name, opt->flags)))
|
||||
if (!(v= find_bookmark(plugin_name_ptr, opt->name, opt->flags)))
|
||||
{
|
||||
sql_print_error("Thread local variable '%s' not allocated "
|
||||
"in plugin '%s'.", opt->name, plugin_name);
|
||||
@ -3085,10 +3130,7 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
||||
(optnamelen= v->name_len) + 1);
|
||||
}
|
||||
|
||||
/* convert '_' to '-' */
|
||||
for (p= optname; *p; p++)
|
||||
if (*p == '_')
|
||||
*p= '-';
|
||||
convert_underscore_to_dash(optname, optnamelen);
|
||||
|
||||
options->name= optname;
|
||||
options->comment= opt->comment;
|
||||
@ -3103,10 +3145,13 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
|
||||
else
|
||||
options->value= options->u_max_value= *(uchar***) (opt + 1);
|
||||
|
||||
char *option_name_ptr;
|
||||
options[1]= options[0];
|
||||
options[1].name= p= (char*) alloc_root(mem_root, optnamelen + 8);
|
||||
options[1].comment= 0; // hidden
|
||||
strxmov(p, "plugin-", optname, NullS);
|
||||
options[1].name= option_name_ptr= (char*) alloc_root(mem_root,
|
||||
plugin_dash.length +
|
||||
optnamelen + 1);
|
||||
options[1].comment= 0; /* Hidden from the help text */
|
||||
strxmov(option_name_ptr, plugin_dash.str, optname, NullS);
|
||||
|
||||
options+= 2;
|
||||
}
|
||||
@ -3120,55 +3165,57 @@ static my_option *construct_help_options(MEM_ROOT *mem_root,
|
||||
{
|
||||
st_mysql_sys_var **opt;
|
||||
my_option *opts;
|
||||
my_bool dummy, can_disable;
|
||||
my_bool *dummy2= &dummy;
|
||||
uint count= EXTRA_OPTIONS;
|
||||
DBUG_ENTER("construct_help_options");
|
||||
|
||||
for (opt= p->plugin->system_vars; opt && *opt; opt++, count+= 2);
|
||||
for (opt= p->plugin->system_vars; opt && *opt; opt++, count+= 2)
|
||||
;
|
||||
|
||||
if (!(opts= (my_option*) alloc_root(mem_root, sizeof(my_option) * count)))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
bzero(opts, sizeof(my_option) * count);
|
||||
|
||||
dummy= TRUE; /* plugin is enabled. */
|
||||
|
||||
can_disable=
|
||||
my_strcasecmp(&my_charset_latin1, p->name.str, "MyISAM") &&
|
||||
my_strcasecmp(&my_charset_latin1, p->name.str, "MEMORY");
|
||||
|
||||
if (construct_options(mem_root, p, opts, &dummy2, can_disable))
|
||||
if (construct_options(mem_root, p, opts))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
DBUG_RETURN(opts);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
test_plugin_options()
|
||||
tmp_root temporary scratch space
|
||||
plugin internal plugin structure
|
||||
argc user supplied arguments
|
||||
argv user supplied arguments
|
||||
default_enabled default plugin enable status
|
||||
RETURNS:
|
||||
0 SUCCESS - plugin should be enabled/loaded
|
||||
NOTE:
|
||||
Requires that a write-lock is held on LOCK_system_variables_hash
|
||||
/**
|
||||
Create and register system variables supplied from the plugin and
|
||||
assigns initial values from corresponding command line arguments.
|
||||
|
||||
@param tmp_root Temporary scratch space
|
||||
@param[out] plugin Internal plugin structure
|
||||
@param argc Number of command line arguments
|
||||
@param argv Command line argument vector
|
||||
|
||||
The plugin will be updated with a policy on how to handle errors during
|
||||
initialization.
|
||||
|
||||
@note Requires that a write-lock is held on LOCK_system_variables_hash
|
||||
|
||||
@return How initialization of the plugin should be handled.
|
||||
@retval 0 Initialization should proceed.
|
||||
@retval 1 Plugin is disabled.
|
||||
@retval -1 An error has occurred.
|
||||
*/
|
||||
|
||||
static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
int *argc, char **argv, my_bool default_enabled)
|
||||
int *argc, char **argv)
|
||||
{
|
||||
struct sys_var_chain chain= { NULL, NULL };
|
||||
my_bool enabled_saved= default_enabled, can_disable;
|
||||
my_bool *enabled= &default_enabled;
|
||||
my_bool can_disable;
|
||||
bool disable_plugin;
|
||||
enum_plugin_load_policy plugin_load_policy= PLUGIN_ON;
|
||||
|
||||
MEM_ROOT *mem_root= alloc_root_inited(&tmp->mem_root) ?
|
||||
&tmp->mem_root : &plugin_mem_root;
|
||||
st_mysql_sys_var **opt;
|
||||
my_option *opts= NULL;
|
||||
char *p, *varname;
|
||||
char *varname;
|
||||
int error;
|
||||
st_mysql_sys_var *o;
|
||||
sys_var *v;
|
||||
@ -3177,13 +3224,17 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
DBUG_ENTER("test_plugin_options");
|
||||
DBUG_ASSERT(tmp->plugin && tmp->name.str);
|
||||
|
||||
/*
|
||||
The 'federated' and 'ndbcluster' storage engines are always disabled by
|
||||
default.
|
||||
*/
|
||||
if (!(my_strcasecmp(&my_charset_latin1, tmp->name.str, "federated") &&
|
||||
my_strcasecmp(&my_charset_latin1, tmp->name.str, "ndbcluster")))
|
||||
plugin_load_policy= PLUGIN_OFF;
|
||||
|
||||
for (opt= tmp->plugin->system_vars; opt && *opt; opt++)
|
||||
count+= 2; /* --{plugin}-{optname} and --plugin-{plugin}-{optname} */
|
||||
|
||||
can_disable=
|
||||
my_strcasecmp(&my_charset_latin1, tmp->name.str, "MyISAM") &&
|
||||
my_strcasecmp(&my_charset_latin1, tmp->name.str, "MEMORY");
|
||||
|
||||
if (count > EXTRA_OPTIONS || (*argc > 1))
|
||||
{
|
||||
if (!(opts= (my_option*) alloc_root(tmp_root, sizeof(my_option) * count)))
|
||||
@ -3193,12 +3244,18 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
}
|
||||
bzero(opts, sizeof(my_option) * count);
|
||||
|
||||
if (construct_options(tmp_root, tmp, opts, &enabled, can_disable))
|
||||
if (construct_options(tmp_root, tmp, opts))
|
||||
{
|
||||
sql_print_error("Bad options for plugin '%s'.", tmp->name.str);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
We adjust the default value to account for the hardcoded exceptions
|
||||
we have set for the federated and ndbcluster storage engines.
|
||||
*/
|
||||
opts[0].def_value= opts[1].def_value= (int)plugin_load_policy;
|
||||
|
||||
error= handle_options(argc, &argv, opts, get_one_plugin_option);
|
||||
(*argc)++; /* add back one for the program name */
|
||||
|
||||
@ -3208,64 +3265,79 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
|
||||
tmp->name.str);
|
||||
goto err;
|
||||
}
|
||||
/*
|
||||
Set plugin loading policy from option value. First element in the option
|
||||
list is always the <plugin name> option value.
|
||||
*/
|
||||
plugin_load_policy= (enum_plugin_load_policy)*(uint*)opts[0].value;
|
||||
}
|
||||
|
||||
if (!*enabled && !can_disable)
|
||||
disable_plugin= (plugin_load_policy == PLUGIN_OFF);
|
||||
/*
|
||||
The 'MyISAM' and 'Memory' storage engines currently can't be disabled.
|
||||
*/
|
||||
can_disable=
|
||||
my_strcasecmp(&my_charset_latin1, tmp->name.str, "MyISAM") &&
|
||||
my_strcasecmp(&my_charset_latin1, tmp->name.str, "MEMORY");
|
||||
|
||||
tmp->is_mandatory= (plugin_load_policy == PLUGIN_FORCE) || !can_disable;
|
||||
|
||||
if (disable_plugin && !can_disable)
|
||||
{
|
||||
sql_print_warning("Plugin '%s' cannot be disabled", tmp->name.str);
|
||||
*enabled= TRUE;
|
||||
disable_plugin= FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
If the plugin is disabled it should not be initialized.
|
||||
*/
|
||||
if (disable_plugin)
|
||||
{
|
||||
if (global_system_variables.log_warnings)
|
||||
sql_print_information("Plugin '%s' is disabled.",
|
||||
tmp->name.str);
|
||||
if (opts)
|
||||
my_cleanup_options(opts);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
error= 1;
|
||||
|
||||
if (*enabled)
|
||||
for (opt= tmp->plugin->system_vars; opt && *opt; opt++)
|
||||
{
|
||||
for (opt= tmp->plugin->system_vars; opt && *opt; opt++)
|
||||
if (((o= *opt)->flags & PLUGIN_VAR_NOSYSVAR))
|
||||
continue;
|
||||
if ((var= find_bookmark(tmp->name.str, o->name, o->flags)))
|
||||
v= new (mem_root) sys_var_pluginvar(var->key + 1, o);
|
||||
else
|
||||
{
|
||||
if (((o= *opt)->flags & PLUGIN_VAR_NOSYSVAR))
|
||||
continue;
|
||||
|
||||
if ((var= find_bookmark(tmp->name.str, o->name, o->flags)))
|
||||
v= new (mem_root) sys_var_pluginvar(var->key + 1, o);
|
||||
else
|
||||
{
|
||||
len= tmp->name.length + strlen(o->name) + 2;
|
||||
varname= (char*) alloc_root(mem_root, len);
|
||||
strxmov(varname, tmp->name.str, "-", o->name, NullS);
|
||||
my_casedn_str(&my_charset_latin1, varname);
|
||||
|
||||
for (p= varname; *p; p++)
|
||||
if (*p == '-')
|
||||
*p= '_';
|
||||
|
||||
v= new (mem_root) sys_var_pluginvar(varname, o);
|
||||
}
|
||||
DBUG_ASSERT(v); /* check that an object was actually constructed */
|
||||
|
||||
/*
|
||||
Add to the chain of variables.
|
||||
Done like this for easier debugging so that the
|
||||
pointer to v is not lost on optimized builds.
|
||||
*/
|
||||
v->chain_sys_var(&chain);
|
||||
len= tmp->name.length + strlen(o->name) + 2;
|
||||
varname= (char*) alloc_root(mem_root, len);
|
||||
strxmov(varname, tmp->name.str, "-", o->name, NullS);
|
||||
my_casedn_str(&my_charset_latin1, varname);
|
||||
convert_dash_to_underscore(varname, len);
|
||||
v= new (mem_root) sys_var_pluginvar(varname, o);
|
||||
}
|
||||
if (chain.first)
|
||||
DBUG_ASSERT(v); /* check that an object was actually constructed */
|
||||
/*
|
||||
Add to the chain of variables.
|
||||
Done like this for easier debugging so that the
|
||||
pointer to v is not lost on optimized builds.
|
||||
*/
|
||||
v->chain_sys_var(&chain);
|
||||
} /* end for */
|
||||
if (chain.first)
|
||||
{
|
||||
chain.last->next = NULL;
|
||||
if (mysql_add_sys_var_chain(chain.first, NULL))
|
||||
{
|
||||
chain.last->next = NULL;
|
||||
if (mysql_add_sys_var_chain(chain.first, NULL))
|
||||
{
|
||||
sql_print_error("Plugin '%s' has conflicting system variables",
|
||||
tmp->name.str);
|
||||
goto err;
|
||||
}
|
||||
tmp->system_vars= chain.first;
|
||||
sql_print_error("Plugin '%s' has conflicting system variables",
|
||||
tmp->name.str);
|
||||
goto err;
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
tmp->system_vars= chain.first;
|
||||
}
|
||||
|
||||
if (enabled_saved && global_system_variables.log_warnings)
|
||||
sql_print_information("Plugin '%s' disabled by command line option",
|
||||
tmp->name.str);
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
if (opts)
|
||||
my_cleanup_options(opts);
|
||||
|
@ -79,6 +79,7 @@ struct st_plugin_int
|
||||
void *data; /* plugin type specific, e.g. handlerton */
|
||||
MEM_ROOT mem_root; /* memory for dynamic plugin structures */
|
||||
sys_var *system_vars; /* server variables for this plugin */
|
||||
bool is_mandatory; /* If true then plugin must not fail to load */
|
||||
};
|
||||
|
||||
|
||||
|
@ -653,10 +653,22 @@ bool st_select_lex_unit::cleanup()
|
||||
join->tables= 0;
|
||||
}
|
||||
error|= fake_select_lex->cleanup();
|
||||
if (fake_select_lex->order_list.elements)
|
||||
/*
|
||||
There are two cases when we should clean order items:
|
||||
1. UNION with SELECTs which all enclosed into braces
|
||||
in this case global_parameters == fake_select_lex
|
||||
2. UNION where last SELECT is not enclosed into braces
|
||||
in this case global_parameters == 'last select'
|
||||
So we should use global_parameters->order_list for
|
||||
proper order list clean up.
|
||||
Note: global_parameters and fake_select_lex are always
|
||||
initialized for UNION
|
||||
*/
|
||||
DBUG_ASSERT(global_parameters);
|
||||
if (global_parameters->order_list.elements)
|
||||
{
|
||||
ORDER *ord;
|
||||
for (ord= (ORDER*)fake_select_lex->order_list.first; ord; ord= ord->next)
|
||||
for (ord= (ORDER*)global_parameters->order_list.first; ord; ord= ord->next)
|
||||
(*ord->item)->cleanup();
|
||||
}
|
||||
}
|
||||
|
@ -1474,8 +1474,8 @@ int ha_archive::info(uint flag)
|
||||
|
||||
stats.mean_rec_length= table->s->reclength + buffer.alloced_length();
|
||||
stats.data_file_length= file_stat.st_size;
|
||||
stats.create_time= file_stat.st_ctime;
|
||||
stats.update_time= file_stat.st_mtime;
|
||||
stats.create_time= (ulong) file_stat.st_ctime;
|
||||
stats.update_time= (ulong) file_stat.st_mtime;
|
||||
stats.max_data_file_length= share->rows_recorded * stats.mean_rec_length;
|
||||
}
|
||||
stats.delete_length= 0;
|
||||
|
@ -2850,10 +2850,10 @@ int ha_federated::info(uint flag)
|
||||
stats.data_file_length= stats.records * stats.mean_rec_length;
|
||||
|
||||
if (row[12] != NULL)
|
||||
stats.update_time= (time_t) my_strtoll10(row[12], (char**) 0,
|
||||
stats.update_time= (ulong) my_strtoll10(row[12], (char**) 0,
|
||||
&error);
|
||||
if (row[13] != NULL)
|
||||
stats.check_time= (time_t) my_strtoll10(row[13], (char**) 0,
|
||||
stats.check_time= (ulong) my_strtoll10(row[13], (char**) 0,
|
||||
&error);
|
||||
}
|
||||
/*
|
||||
|
@ -6012,7 +6012,7 @@ ha_innobase::info(
|
||||
nor the CHECK TABLE time, nor the UPDATE or INSERT time. */
|
||||
|
||||
if (os_file_get_status(path,&stat_info)) {
|
||||
stats.create_time = stat_info.ctime;
|
||||
stats.create_time = (ulong) stat_info.ctime;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1784,7 +1784,7 @@ int ha_myisam::info(uint flag)
|
||||
stats.data_file_length= misam_info.data_file_length;
|
||||
stats.index_file_length= misam_info.index_file_length;
|
||||
stats.delete_length= misam_info.delete_length;
|
||||
stats.check_time= misam_info.check_time;
|
||||
stats.check_time= (ulong) misam_info.check_time;
|
||||
stats.mean_rec_length= misam_info.mean_reclength;
|
||||
}
|
||||
if (flag & HA_STATUS_CONST)
|
||||
@ -1792,7 +1792,7 @@ int ha_myisam::info(uint flag)
|
||||
TABLE_SHARE *share= table->s;
|
||||
stats.max_data_file_length= misam_info.max_data_file_length;
|
||||
stats.max_index_file_length= misam_info.max_index_file_length;
|
||||
stats.create_time= misam_info.create_time;
|
||||
stats.create_time= (ulong) misam_info.create_time;
|
||||
ref_length= misam_info.reflength;
|
||||
share->db_options_in_use= misam_info.options;
|
||||
stats.block_size= myisam_block_size; /* record block size */
|
||||
@ -1831,7 +1831,7 @@ int ha_myisam::info(uint flag)
|
||||
my_store_ptr(dup_ref, ref_length, misam_info.dupp_key_pos);
|
||||
}
|
||||
if (flag & HA_STATUS_TIME)
|
||||
stats.update_time = misam_info.update_time;
|
||||
stats.update_time = (ulong) misam_info.update_time;
|
||||
if (flag & HA_STATUS_AUTO)
|
||||
stats.auto_increment_value= misam_info.auto_increment;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user