mysql-5.5.29 merge

This commit is contained in:
Sergei Golubchik 2013-01-15 19:13:32 +01:00
commit d3935adf7a
94 changed files with 4300 additions and 320 deletions

View File

@ -20,6 +20,7 @@ if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 2.6)
CMAKE_POLICY(VERSION 2.8) CMAKE_POLICY(VERSION 2.8)
endif() endif()
MESSAGE(STATUS "Running cmake version ${CMAKE_VERSION}")
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
@ -321,6 +322,7 @@ IF(NOT WITHOUT_SERVER)
IF(EXISTS ${CMAKE_SOURCE_DIR}/internal/CMakeLists.txt) IF(EXISTS ${CMAKE_SOURCE_DIR}/internal/CMakeLists.txt)
ADD_SUBDIRECTORY(internal) ADD_SUBDIRECTORY(internal)
ENDIF() ENDIF()
ADD_SUBDIRECTORY(packaging/rpm-uln)
ENDIF() ENDIF()
IF(UNIX) IF(UNIX)

View File

@ -227,6 +227,16 @@ foreach my $option (@ARGV)
$cmakeargs = $cmakeargs." -DCMAKE_VERBOSE_MAKEFILE=1"; $cmakeargs = $cmakeargs." -DCMAKE_VERBOSE_MAKEFILE=1";
next; next;
} }
if ($option =~ /with-client-ldflags/)
{
print("configure.pl : ignoring $option\n");
next;
}
if ($option =~ /with-mysqld-ldflags=/)
{
print("configure.pl : ignoring $option\n");
next;
}
$option = uc($option); $option = uc($option);
$option =~ s/-/_/g; $option =~ s/-/_/g;

View File

@ -69,10 +69,13 @@ EXECUTE_PROCESS(
COMMAND "@CMAKE_COMMAND@" -E echo Executing ${BOOTSTRAP_COMMAND} COMMAND "@CMAKE_COMMAND@" -E echo Executing ${BOOTSTRAP_COMMAND}
) )
EXECUTE_PROCESS ( EXECUTE_PROCESS (
COMMAND "@CMAKE_COMMAND@" -E echo input file bootstrap.sql, current directory ${CWD} COMMAND "@CMAKE_COMMAND@" -E
echo input file bootstrap.sql, current directory ${CWD}
) )
EXECUTE_PROCESS ( EXECUTE_PROCESS (
COMMAND ${BOOTSTRAP_COMMAND} INPUT_FILE bootstrap.sql OUTPUT_VARIABLE OUT COMMAND ${BOOTSTRAP_COMMAND}
INPUT_FILE bootstrap.sql
OUTPUT_VARIABLE OUT
ERROR_VARIABLE ERR ERROR_VARIABLE ERR
RESULT_VARIABLE RESULT RESULT_VARIABLE RESULT
) )
@ -81,3 +84,6 @@ IF(NOT RESULT EQUAL 0)
MESSAGE(FATAL_ERROR "Could not create initial database \n ${OUT} \n ${ERR}") MESSAGE(FATAL_ERROR "Could not create initial database \n ${OUT} \n ${ERR}")
ENDIF() ENDIF()
EXECUTE_PROCESS (
COMMAND "@CMAKE_COMMAND@" -E touch ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep
)

View File

@ -1,4 +1,4 @@
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -82,9 +82,11 @@ MACRO(CREATE_INFO_BIN)
FILE(WRITE ${INFO_BIN} "===== Information about the build process: =====\n") FILE(WRITE ${INFO_BIN} "===== Information about the build process: =====\n")
IF (WIN32) IF (WIN32)
EXECUTE_PROCESS(COMMAND cmd /c date /T OUTPUT_VARIABLE TMP_DATE) EXECUTE_PROCESS(COMMAND cmd /c date /T
OUTPUT_VARIABLE TMP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
ELSEIF(UNIX) ELSEIF(UNIX)
EXECUTE_PROCESS(COMMAND date "+%Y-%m-%d %H:%M:%S" OUTPUT_VARIABLE TMP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) EXECUTE_PROCESS(COMMAND date "+%Y-%m-%d %H:%M:%S"
OUTPUT_VARIABLE TMP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
ELSE() ELSE()
SET(TMP_DATE "(no date command known for this platform)") SET(TMP_DATE "(no date command known for this platform)")
ENDIF() ENDIF()

View File

@ -1,4 +1,4 @@
# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -100,7 +100,10 @@ ENDIF()
# just use if(INSTALL_PLUGINTESTDIR). # just use if(INSTALL_PLUGINTESTDIR).
# The plugin must set its own install path for tests # The plugin must set its own install path for tests
# #
FILE(GLOB plugin_tests ${CMAKE_SOURCE_DIR}/plugin/*/tests) FILE(GLOB plugin_tests
${CMAKE_SOURCE_DIR}/plugin/*/tests
${CMAKE_SOURCE_DIR}/internal/plugin/*/tests
)
# #
# STANDALONE layout # STANDALONE layout

View File

@ -54,7 +54,7 @@ MACRO(GET_MYSQL_VERSION)
ENDIF() ENDIF()
SET(VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}${EXTRA_VERSION}") SET(VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}${EXTRA_VERSION}")
MESSAGE("-- MariaDB ${VERSION}") MESSAGE(STATUS "MariaDB ${VERSION}")
SET(MYSQL_BASE_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}" CACHE INTERNAL "MySQL Base version") SET(MYSQL_BASE_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}" CACHE INTERNAL "MySQL Base version")
SET(MYSQL_NO_DASH_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}") SET(MYSQL_NO_DASH_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}")
# Use NDBVERSION irregardless of whether this is Cluster or not, if not # Use NDBVERSION irregardless of whether this is Cluster or not, if not

View File

@ -130,7 +130,7 @@ IF(NOT VERSION)
SET(package_name "mariadb${PRODUCT_TAG}-${VERSION}-${SYSTEM_NAME_AND_PROCESSOR}") SET(package_name "mariadb${PRODUCT_TAG}-${VERSION}-${SYSTEM_NAME_AND_PROCESSOR}")
ENDIF() ENDIF()
MESSAGE("-- Packaging as: ${package_name}") MESSAGE(STATUS "Packaging as: ${package_name}")
# Sometimes package suffix is added (something like "-icc-glibc23") # Sometimes package suffix is added (something like "-icc-glibc23")
IF(PACKAGE_SUFFIX) IF(PACKAGE_SUFFIX)

View File

@ -39,6 +39,7 @@ MACRO(PLUGIN_APPEND_COLLECTIONS plugin)
GET_FILENAME_COMPONENT(fname ${cfile} NAME) GET_FILENAME_COMPONENT(fname ${cfile} NAME)
FILE(APPEND ${CMAKE_SOURCE_DIR}/mysql-test/collections/${fname} "${contents}") FILE(APPEND ${CMAKE_SOURCE_DIR}/mysql-test/collections/${fname} "${contents}")
FILE(APPEND ${fcopied} "${fname}\n") FILE(APPEND ${fcopied} "${fname}\n")
MESSAGE(STATUS "Appended ${cfile}")
ENDFOREACH() ENDFOREACH()
ENDIF() ENDIF()
ENDMACRO() ENDMACRO()

View File

@ -40,3 +40,4 @@ ha_blackhole storage/blackhole BLACKHOLE_PLUGIN
ha_federated storage/federated FEDERATED_PLUGIN ha_federated storage/federated FEDERATED_PLUGIN
mypluglib plugin/fulltext SIMPLE_PARSER mypluglib plugin/fulltext SIMPLE_PARSER
libdaemon_example plugin/daemon_example DAEMONEXAMPLE libdaemon_example plugin/daemon_example DAEMONEXAMPLE
adt_null plugin/audit_null AUDIT_NULL

View File

@ -8,6 +8,7 @@
# --let $rpl_server_number= N # --let $rpl_server_number= N
# [--let $rpl_server_parameters= --flag1 --flag2 ...] # [--let $rpl_server_parameters= --flag1 --flag2 ...]
# [--let $rpl_debug= 1] # [--let $rpl_debug= 1]
# [--let $rpl_server_error= 0]
# --source include/rpl_start_server.inc # --source include/rpl_start_server.inc
# #
# Parameters: # Parameters:
@ -21,6 +22,9 @@
# If set, extra parameters given by this variable are passed to # If set, extra parameters given by this variable are passed to
# mysqld. # mysqld.
# #
# $rpl_server_error
# If set, failure of the server startup is expected.
#
# $rpl_debug # $rpl_debug
# See include/rpl_init.inc # See include/rpl_init.inc
# #
@ -47,8 +51,9 @@ if ($rpl_server_parameters)
# Write file to make mysql-test-run.pl start up the server again # Write file to make mysql-test-run.pl start up the server again
--exec echo "$_rpl_start_server_command" > $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect --exec echo "$_rpl_start_server_command" > $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect
--source include/rpl_reconnect.inc if (!$rpl_server_error)
{
--source include/rpl_reconnect.inc
--let $include_filename= rpl_start_server.inc $_rpl_start_server_args --let $include_filename= rpl_start_server.inc $_rpl_start_server_args
--source include/end_include_file.inc --source include/end_include_file.inc
}

View File

@ -3,3 +3,5 @@ Name Location Comment
Ronald Bradford Brisbane, Australia EFF contribution for UC2006 Auction Ronald Bradford Brisbane, Australia EFF contribution for UC2006 Auction
Sheeri Kritzer Boston, Mass. USA EFF contribution for UC2006 Auction Sheeri Kritzer Boston, Mass. USA EFF contribution for UC2006 Auction
Mark Shuttleworth London, UK. EFF contribution for UC2006 Auction Mark Shuttleworth London, UK. EFF contribution for UC2006 Auction
Warnings:
Warning 1681 'SHOW CONTRIBUTORS' is deprecated and will be removed in a future release.

View File

@ -121,17 +121,20 @@ ERROR 28000: Access denied for user 'grant_plug_dest'@'localhost'
this should fail : not the same user this should fail : not the same user
GRANT PROXY ON grant_plug TO grant_plug_dest; GRANT PROXY ON grant_plug TO grant_plug_dest;
ERROR 28000: Access denied for user 'grant_plug_dest'@'localhost' ERROR 28000: Access denied for user 'grant_plug_dest'@'localhost'
this should fail : same user, but on a different host This is a valid grant
GRANT PROXY ON grant_plug_dest TO grant_plug; GRANT PROXY ON grant_plug_dest TO grant_plug;
ERROR 28000: Access denied for user 'grant_plug_dest'@'localhost' REVOKE PROXY ON grant_plug_dest FROM grant_plug;
this should work : same user
GRANT PROXY ON grant_plug_dest@localhost TO grant_plug_dest2;
REVOKE PROXY ON grant_plug_dest@localhost FROM grant_plug_dest2;
this should work : same user this should work : same user
GRANT PROXY ON grant_plug_dest TO grant_plug_dest2;
REVOKE PROXY ON grant_plug_dest FROM grant_plug_dest2;
this should fail : not the same user
GRANT PROXY ON grant_plug_dest@localhost TO grant_plug WITH GRANT OPTION; GRANT PROXY ON grant_plug_dest@localhost TO grant_plug WITH GRANT OPTION;
ERROR 28000: Access denied for user 'grant_plug_dest'@'localhost'
this should fail : not the same user
REVOKE PROXY ON grant_plug_dest@localhost FROM grant_plug; REVOKE PROXY ON grant_plug_dest@localhost FROM grant_plug;
ERROR 28000: Access denied for user 'grant_plug_dest'@'localhost'
this should fail : can't create users this should fail : can't create users
GRANT PROXY ON grant_plug_dest@localhost TO grant_plug@localhost; GRANT PROXY ON grant_plug_dest TO grant_plug@localhost;
ERROR 42000: You are not allowed to create a user with GRANT ERROR 42000: You are not allowed to create a user with GRANT
in default connection in default connection
# test what root can grant # test what root can grant
@ -149,12 +152,12 @@ GRANT PROXY ON future_user TO grant_plug;
in default connection in default connection
SHOW GRANTS FOR grant_plug; SHOW GRANTS FOR grant_plug;
Grants for grant_plug@% Grants for grant_plug@%
GRANT ALL PRIVILEGES ON *.* TO 'grant_plug'@'%' IDENTIFIED VIA test_plugin_server USING 'grant_plug_dest' WITH GRANT OPTION GRANT ALL PRIVILEGES ON *.* TO 'grant_plug'@'%' IDENTIFIED VIA test_plugin_server USING 'grant_plug_dest'
GRANT PROXY ON 'future_user'@'%' TO 'grant_plug'@'%' GRANT PROXY ON 'future_user'@'%' TO 'grant_plug'@'%'
REVOKE PROXY ON future_user FROM grant_plug; REVOKE PROXY ON future_user FROM grant_plug;
SHOW GRANTS FOR grant_plug; SHOW GRANTS FOR grant_plug;
Grants for grant_plug@% Grants for grant_plug@%
GRANT ALL PRIVILEGES ON *.* TO 'grant_plug'@'%' IDENTIFIED VIA test_plugin_server USING 'grant_plug_dest' WITH GRANT OPTION GRANT ALL PRIVILEGES ON *.* TO 'grant_plug'@'%' IDENTIFIED VIA test_plugin_server USING 'grant_plug_dest'
## testing drop user ## testing drop user
CREATE USER test_drop@localhost; CREATE USER test_drop@localhost;
GRANT PROXY ON future_user TO test_drop@localhost; GRANT PROXY ON future_user TO test_drop@localhost;

View File

@ -1552,3 +1552,14 @@ RELEASE_LOCK('t')
óóóó óóóó
1 1
SET NAMES latin1; SET NAMES latin1;
#
# WL#6454: Deprecate SHOW AUTHORS and SHOW CONTRIBUTORS
#
SHOW AUTHORS;
SHOW WARNINGS;
Level Code Message
Warning 1681 'SHOW AUTHORS' is deprecated and will be removed in a future release.
SHOW CONTRIBUTORS;
SHOW WARNINGS;
Level Code Message
Warning 1681 'SHOW CONTRIBUTORS' is deprecated and will be removed in a future release.

View File

@ -259,7 +259,6 @@ SELECT `my.db`.f1(2);
# Switching to default connection. # Switching to default connection.
DROP DATABASE `my.db`; DROP DATABASE `my.db`;
USE test; USE test;
set @@global.concurrent_insert= @old_concurrent_insert;
# #
# Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
# #

View File

@ -1269,3 +1269,43 @@ SELECT * FROM t1;
c1 c2 c1 c2
1 NULL 1 NULL
DROP TABLE t1; DROP TABLE t1;
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
SHOW VARIABLES LIKE "%auto_inc%";
Variable_name Value
auto_increment_increment 1
auto_increment_offset 1
CREATE TABLE t1 (c1 INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (2147483648, 'a');
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(10) unsigned NOT NULL AUTO_INCREMENT,
`c2` varchar(10) DEFAULT NULL,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=2147483649 DEFAULT CHARSET=latin1
SELECT * FROM t1;
c1 c2
2147483648 a
ALTER TABLE t1 CHANGE c1 c1 INT;
Warnings:
Warning 1264 Out of range value for column 'c1' at row 1
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL DEFAULT '0',
`c2` varchar(10) DEFAULT NULL,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
INSERT INTO t1(c2) VALUES('b');
SELECT * FROM t1;
c1 c2
0 b
2147483647 a
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL DEFAULT '0',
`c2` varchar(10) DEFAULT NULL,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t1;

View File

@ -126,12 +126,12 @@ CREATE TABLE t1(
c TEXT NOT NULL, d TEXT NOT NULL, c TEXT NOT NULL, d TEXT NOT NULL,
PRIMARY KEY (c(767),d(767))) PRIMARY KEY (c(767),d(767)))
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII; ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
CREATE TABLE t1( CREATE TABLE t1(
c TEXT NOT NULL, d TEXT NOT NULL, c TEXT NOT NULL, d TEXT NOT NULL,
PRIMARY KEY (c(767),d(767))) PRIMARY KEY (c(767),d(767)))
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 CHARSET=ASCII; ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 CHARSET=ASCII;
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
CREATE TABLE t1( CREATE TABLE t1(
c TEXT NOT NULL, d TEXT NOT NULL, c TEXT NOT NULL, d TEXT NOT NULL,
PRIMARY KEY (c(767),d(767))) PRIMARY KEY (c(767),d(767)))
@ -139,7 +139,7 @@ ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4 CHARSET=ASCII;
drop table t1; drop table t1;
CREATE TABLE t1(c TEXT, PRIMARY KEY (c(440))) CREATE TABLE t1(c TEXT, PRIMARY KEY (c(440)))
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII; ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
CREATE TABLE t1(c TEXT, PRIMARY KEY (c(438))) CREATE TABLE t1(c TEXT, PRIMARY KEY (c(438)))
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII; ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
INSERT INTO t1 VALUES(REPEAT('A',512)),(REPEAT('B',512)); INSERT INTO t1 VALUES(REPEAT('A',512)),(REPEAT('B',512));

View File

@ -3026,7 +3026,7 @@ c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255),
c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255),
c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255) c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255)
) ENGINE = InnoDB; ) ENGINE = InnoDB;
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
Warnings: Warnings:
Note 1051 Unknown table 't1' Note 1051 Unknown table 't1'

View File

@ -8,7 +8,7 @@ ERROR HY000: Too big row
SHOW WARNINGS; SHOW WARNINGS;
Level Code Message Level Code Message
Error 139 Too big row Error 139 Too big row
Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs Error 1118 Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
DROP TABLE bug53591; DROP TABLE bug53591;
SET GLOBAL innodb_file_format=Antelope; SET GLOBAL innodb_file_format=Antelope;
SET GLOBAL innodb_file_per_table=0; SET GLOBAL innodb_file_per_table=0;

View File

@ -649,7 +649,7 @@ CREATE TABLE worklog5743 (col_1_varchar VARCHAR (4000) CHARACTER SET 'utf8',
col_2_varchar VARCHAR (4000) CHARACTER SET 'utf8' , col_2_varchar VARCHAR (4000) CHARACTER SET 'utf8' ,
PRIMARY KEY (col_1_varchar(1024)) PRIMARY KEY (col_1_varchar(1024))
) ROW_FORMAT=DYNAMIC, engine = innodb; ) ROW_FORMAT=DYNAMIC, engine = innodb;
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large (> max_row_size). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
CREATE TABLE worklog5743 ( CREATE TABLE worklog5743 (
col_1_varbinary VARBINARY (4000) , col_1_varbinary VARBINARY (4000) ,
col_2_varchar VARCHAR (4000) CHARACTER SET 'utf8', col_2_varchar VARCHAR (4000) CHARACTER SET 'utf8',

View File

@ -139,7 +139,7 @@ DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) ENGINE=InnoDB; CREATE TABLE t1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (NULL, 1); INSERT INTO t1 VALUES (NULL, 1);
DELETE FROM t1 WHERE c1 = 1; DELETE FROM t1 WHERE c1 = 1;
INSERT INTO t1 VALUES (2,1); INSERT INTO t1 VALUES (2,1);
INSERT INTO t1 VALUES (NULL,8); INSERT INTO t1 VALUES (NULL,8);
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
@ -639,7 +639,7 @@ SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
# Check if we handl offset > column max value properly # Check if we handle offset > column max value properly
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=256; SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=256;
SHOW VARIABLES LIKE "%auto_inc%"; SHOW VARIABLES LIKE "%auto_inc%";
# TINYINT # TINYINT
@ -648,3 +648,21 @@ INSERT INTO t1 VALUES (1, NULL);
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
# Check if we handle the case where a current value is greater than the max
# of the column. IMO, this should not be allowed and the assertion that fails
# is actually an invariant.
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
SHOW VARIABLES LIKE "%auto_inc%";
# TINYINT
CREATE TABLE t1 (c1 INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (2147483648, 'a');
SHOW CREATE TABLE t1;
SELECT * FROM t1;
ALTER TABLE t1 CHANGE c1 c1 INT;
SHOW CREATE TABLE t1;
INSERT INTO t1(c2) VALUES('b');
SELECT * FROM t1;
SHOW CREATE TABLE t1;
DROP TABLE t1;

View File

@ -1,5 +1,10 @@
-- source include/have_innodb.inc -- source include/have_innodb.inc
if (`select plugin_auth_version <= "1.1.8-29.1" from information_schema.plugins where plugin_name='innodb'`)
{
--skip Not fixed in XtraDB 1.1.8-29.1 or earlier
}
let $per_table=`select @@innodb_file_per_table`; let $per_table=`select @@innodb_file_per_table`;
let $format=`select @@innodb_file_format`; let $format=`select @@innodb_file_format`;
let $innodb_strict_mode_orig=`select @@session.innodb_strict_mode`; let $innodb_strict_mode_orig=`select @@session.innodb_strict_mode`;

View File

@ -4,6 +4,11 @@
# .\sync\sync0sync.c line 324 # .\sync\sync0sync.c line 324
# is fixed # is fixed
if (`select plugin_auth_version <= "1.1.8-29.1" from information_schema.plugins where plugin_name='innodb'`)
{
--skip Not fixed in XtraDB 1.1.8-29.1 or earlier
}
####################################################################### #######################################################################
# # # #
# Please, DO NOT TOUCH this file as well as the innodb.result file. # # Please, DO NOT TOUCH this file as well as the innodb.result file. #

View File

@ -1,5 +1,9 @@
--source include/have_innodb.inc --source include/have_innodb.inc
if (`select plugin_auth_version <= "1.1.8-29.1" from information_schema.plugins where plugin_name='innodb'`)
{
--skip Not fixed in XtraDB 1.1.8-29.1 or earlier
}
let $file_format=`select @@innodb_file_format`; let $file_format=`select @@innodb_file_format`;
let $file_per_table=`select @@innodb_file_per_table`; let $file_per_table=`select @@innodb_file_per_table`;

View File

@ -14,6 +14,10 @@
# # # #
###################################################################### ######################################################################
if (`select plugin_auth_version <= "1.1.8-29.1" from information_schema.plugins where plugin_name='innodb'`)
{
--skip Not fixed in XtraDB 1.1.8-29.1 or earlier
}
# Save innodb variables # Save innodb variables
let $innodb_file_format_orig=`select @@innodb_file_format`; let $innodb_file_format_orig=`select @@innodb_file_format`;
@ -601,6 +605,7 @@ DROP TABLE worklog5743;
# Prefix index with utf8 charset + varchar. # Prefix index with utf8 charset + varchar.
# For varchar we also log the column itself as oppose of TEXT so it error # For varchar we also log the column itself as oppose of TEXT so it error
# with limit 1024 due to overhead. # with limit 1024 due to overhead.
--replace_regex /> [0-9]*/> max_row_size/
-- error 1118 -- error 1118
CREATE TABLE worklog5743 (col_1_varchar VARCHAR (4000) CHARACTER SET 'utf8', CREATE TABLE worklog5743 (col_1_varchar VARCHAR (4000) CHARACTER SET 'utf8',
col_2_varchar VARCHAR (4000) CHARACTER SET 'utf8' , col_2_varchar VARCHAR (4000) CHARACTER SET 'utf8' ,

View File

@ -1,6 +1,7 @@
UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES'; UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES';
UPDATE performance_schema.setup_instruments SET enabled = 'YES' UPDATE performance_schema.setup_instruments SET enabled = 'YES'
WHERE name LIKE 'wait/io/file/%'; WHERE name LIKE 'wait/io/file/%';
flush status;
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (id INT PRIMARY KEY, b CHAR(100) DEFAULT 'initial value') CREATE TABLE t1 (id INT PRIMARY KEY, b CHAR(100) DEFAULT 'initial value')
ENGINE=MyISAM; ENGINE=MyISAM;
@ -113,3 +114,19 @@ WHERE p.PROCESSLIST_ID = 1
GROUP BY h.EVENT_NAME GROUP BY h.EVENT_NAME
HAVING TOTAL_WAIT > 0; HAVING TOTAL_WAIT > 0;
UPDATE performance_schema.setup_instruments SET enabled = 'YES'; UPDATE performance_schema.setup_instruments SET enabled = 'YES';
show status like "performance_schema%";
Variable_name Value
Performance_schema_cond_classes_lost 0
Performance_schema_cond_instances_lost 0
Performance_schema_file_classes_lost 0
Performance_schema_file_handles_lost 0
Performance_schema_file_instances_lost 0
Performance_schema_locker_lost 0
Performance_schema_mutex_classes_lost 0
Performance_schema_mutex_instances_lost 0
Performance_schema_rwlock_classes_lost 0
Performance_schema_rwlock_instances_lost 0
Performance_schema_table_handles_lost 0
Performance_schema_table_instances_lost 0
Performance_schema_thread_classes_lost 0
Performance_schema_thread_instances_lost 0

View File

@ -2,6 +2,15 @@ UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES';
UPDATE performance_schema.setup_instruments SET enabled = 'YES' UPDATE performance_schema.setup_instruments SET enabled = 'YES'
WHERE name LIKE 'wait/synch/mutex/%' WHERE name LIKE 'wait/synch/mutex/%'
OR name LIKE 'wait/synch/rwlock/%'; OR name LIKE 'wait/synch/rwlock/%';
flush status;
select NAME from performance_schema.mutex_instances
where NAME = 'wait/synch/mutex/sql/LOCK_open';
NAME
wait/synch/mutex/sql/LOCK_open
select NAME from performance_schema.rwlock_instances
where NAME = 'wait/synch/rwlock/sql/LOCK_grant';
NAME
wait/synch/rwlock/sql/LOCK_grant
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (id INT PRIMARY KEY, b CHAR(100) DEFAULT 'initial value') CREATE TABLE t1 (id INT PRIMARY KEY, b CHAR(100) DEFAULT 'initial value')
ENGINE=MyISAM; ENGINE=MyISAM;
@ -112,3 +121,19 @@ test_fm2_rw_timed
Success Success
UPDATE performance_schema.setup_instruments SET enabled = 'YES'; UPDATE performance_schema.setup_instruments SET enabled = 'YES';
DROP TABLE t1; DROP TABLE t1;
show status like "performance_schema%";
Variable_name Value
Performance_schema_cond_classes_lost 0
Performance_schema_cond_instances_lost 0
Performance_schema_file_classes_lost 0
Performance_schema_file_handles_lost 0
Performance_schema_file_instances_lost 0
Performance_schema_locker_lost 0
Performance_schema_mutex_classes_lost 0
Performance_schema_mutex_instances_lost 0
Performance_schema_rwlock_classes_lost 0
Performance_schema_rwlock_instances_lost 0
Performance_schema_table_handles_lost 0
Performance_schema_table_instances_lost 0
Performance_schema_thread_classes_lost 0
Performance_schema_thread_instances_lost 0

View File

@ -12,6 +12,9 @@ UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES';
UPDATE performance_schema.setup_instruments SET enabled = 'YES' UPDATE performance_schema.setup_instruments SET enabled = 'YES'
WHERE name LIKE 'wait/io/file/%'; WHERE name LIKE 'wait/io/file/%';
# reset lost counters
flush status;
--disable_warnings --disable_warnings
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
--enable_warnings --enable_warnings
@ -182,3 +185,7 @@ HAVING TOTAL_WAIT > 0;
# Clean-up. # Clean-up.
UPDATE performance_schema.setup_instruments SET enabled = 'YES'; UPDATE performance_schema.setup_instruments SET enabled = 'YES';
# In case of failure, will indicate the root cause
show status like "performance_schema%";

View File

@ -13,6 +13,15 @@ UPDATE performance_schema.setup_instruments SET enabled = 'YES'
WHERE name LIKE 'wait/synch/mutex/%' WHERE name LIKE 'wait/synch/mutex/%'
OR name LIKE 'wait/synch/rwlock/%'; OR name LIKE 'wait/synch/rwlock/%';
# reset lost counters
flush status;
# Make sure objects are instrumented
select NAME from performance_schema.mutex_instances
where NAME = 'wait/synch/mutex/sql/LOCK_open';
select NAME from performance_schema.rwlock_instances
where NAME = 'wait/synch/rwlock/sql/LOCK_grant';
--disable_warnings --disable_warnings
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
--enable_warnings --enable_warnings
@ -116,3 +125,7 @@ SELECT IF((COALESCE(@after_count, 0) - COALESCE(@before_count, 0)) = 0, 'Success
# Clean-up. # Clean-up.
UPDATE performance_schema.setup_instruments SET enabled = 'YES'; UPDATE performance_schema.setup_instruments SET enabled = 'YES';
DROP TABLE t1; DROP TABLE t1;
# In case of failure, will indicate the root cause
show status like "performance_schema%";

View File

@ -93,7 +93,7 @@ Variable_name Value
Rpl_semi_sync_master_no_tx 0 Rpl_semi_sync_master_no_tx 0
show status like 'Rpl_semi_sync_master_yes_tx'; show status like 'Rpl_semi_sync_master_yes_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_yes_tx 301 Rpl_semi_sync_master_yes_tx 11
[ on slave ] [ on slave ]
[ slave status after replicated inserts ] [ slave status after replicated inserts ]
show status like 'Rpl_semi_sync_slave_status'; show status like 'Rpl_semi_sync_slave_status';
@ -101,13 +101,13 @@ Variable_name Value
Rpl_semi_sync_slave_status ON Rpl_semi_sync_slave_status ON
select count(distinct a) from t1; select count(distinct a) from t1;
count(distinct a) count(distinct a)
300 10
select min(a) from t1; select min(a) from t1;
min(a) min(a)
1 1
select max(a) from t1; select max(a) from t1;
max(a) max(a)
300 10
# BUG#50157 # BUG#50157
# semi-sync replication crashes when replicating a transaction which # semi-sync replication crashes when replicating a transaction which
@ -133,6 +133,7 @@ SET SESSION AUTOCOMMIT= 1;
# #
include/stop_slave.inc include/stop_slave.inc
[ on master ] [ on master ]
set global rpl_semi_sync_master_timeout= 5000;
[ master status should be ON ] [ master status should be ON ]
show status like 'Rpl_semi_sync_master_status'; show status like 'Rpl_semi_sync_master_status';
Variable_name Value Variable_name Value
@ -142,7 +143,7 @@ Variable_name Value
Rpl_semi_sync_master_no_tx 0 Rpl_semi_sync_master_no_tx 0
show status like 'Rpl_semi_sync_master_yes_tx'; show status like 'Rpl_semi_sync_master_yes_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_yes_tx 304 Rpl_semi_sync_master_yes_tx 14
show status like 'Rpl_semi_sync_master_clients'; show status like 'Rpl_semi_sync_master_clients';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_clients 1 Rpl_semi_sync_master_clients 1
@ -157,7 +158,7 @@ Variable_name Value
Rpl_semi_sync_master_no_tx 1 Rpl_semi_sync_master_no_tx 1
show status like 'Rpl_semi_sync_master_yes_tx'; show status like 'Rpl_semi_sync_master_yes_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_yes_tx 304 Rpl_semi_sync_master_yes_tx 14
insert into t1 values (100); insert into t1 values (100);
[ master status should be OFF ] [ master status should be OFF ]
show status like 'Rpl_semi_sync_master_status'; show status like 'Rpl_semi_sync_master_status';
@ -165,10 +166,10 @@ Variable_name Value
Rpl_semi_sync_master_status OFF Rpl_semi_sync_master_status OFF
show status like 'Rpl_semi_sync_master_no_tx'; show status like 'Rpl_semi_sync_master_no_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_no_tx 302 Rpl_semi_sync_master_no_tx 12
show status like 'Rpl_semi_sync_master_yes_tx'; show status like 'Rpl_semi_sync_master_yes_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_yes_tx 304 Rpl_semi_sync_master_yes_tx 14
# #
# Test semi-sync status on master will be ON again when slave catches up # Test semi-sync status on master will be ON again when slave catches up
# #
@ -198,10 +199,10 @@ Variable_name Value
Rpl_semi_sync_master_status ON Rpl_semi_sync_master_status ON
show status like 'Rpl_semi_sync_master_no_tx'; show status like 'Rpl_semi_sync_master_no_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_no_tx 302 Rpl_semi_sync_master_no_tx 12
show status like 'Rpl_semi_sync_master_yes_tx'; show status like 'Rpl_semi_sync_master_yes_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_yes_tx 304 Rpl_semi_sync_master_yes_tx 14
show status like 'Rpl_semi_sync_master_clients'; show status like 'Rpl_semi_sync_master_clients';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_clients 1 Rpl_semi_sync_master_clients 1
@ -217,10 +218,10 @@ include/stop_slave.inc
[ Semi-sync master status variables before FLUSH STATUS ] [ Semi-sync master status variables before FLUSH STATUS ]
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx'; SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_no_tx 302 Rpl_semi_sync_master_no_tx 12
SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx'; SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx';
Variable_name Value Variable_name Value
Rpl_semi_sync_master_yes_tx 305 Rpl_semi_sync_master_yes_tx 15
FLUSH NO_WRITE_TO_BINLOG STATUS; FLUSH NO_WRITE_TO_BINLOG STATUS;
[ Semi-sync master status variables after FLUSH STATUS ] [ Semi-sync master status variables after FLUSH STATUS ]
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx'; SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx';

View File

@ -67,7 +67,7 @@ if ($value == No such row)
{ {
set sql_log_bin=0; set sql_log_bin=0;
eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO'; eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
set global rpl_semi_sync_master_timeout= 5000; /* 5s */ set global rpl_semi_sync_master_timeout= 60000; /* 60s */
set sql_log_bin=1; set sql_log_bin=1;
} }
enable_query_log; enable_query_log;
@ -173,7 +173,7 @@ let $_connections_semisync_slave= query_get_value(SHOW STATUS LIKE 'Threads_conn
replace_result $_connections_normal_slave CONNECTIONS_NORMAL_SLAVE $_connections_semisync_slave CONNECTIONS_SEMISYNC_SLAVE; replace_result $_connections_normal_slave CONNECTIONS_NORMAL_SLAVE $_connections_semisync_slave CONNECTIONS_SEMISYNC_SLAVE;
eval select $_connections_semisync_slave - $_connections_normal_slave as 'Should be 0'; eval select $_connections_semisync_slave - $_connections_normal_slave as 'Should be 0';
let $i=300; let $i=10;
echo [ insert records to table ]; echo [ insert records to table ];
disable_query_log; disable_query_log;
while ($i) while ($i)
@ -237,6 +237,7 @@ source include/stop_slave.inc;
connection master; connection master;
echo [ on master ]; echo [ on master ];
set global rpl_semi_sync_master_timeout= 5000;
# The first semi-sync check should be on because after slave stop, # The first semi-sync check should be on because after slave stop,
# there are no transactions on the master. # there are no transactions on the master.
@ -263,7 +264,7 @@ show status like 'Rpl_semi_sync_master_yes_tx';
# Semi-sync status on master is now OFF, so all these transactions # Semi-sync status on master is now OFF, so all these transactions
# will be replicated asynchronously. # will be replicated asynchronously.
let $i=300; let $i=10;
disable_query_log; disable_query_log;
while ($i) while ($i)
{ {

View File

@ -174,21 +174,35 @@ GRANT PROXY ON ''@'' TO grant_plug;
--error ER_ACCESS_DENIED_NO_PASSWORD_ERROR --error ER_ACCESS_DENIED_NO_PASSWORD_ERROR
GRANT PROXY ON grant_plug TO grant_plug_dest; GRANT PROXY ON grant_plug TO grant_plug_dest;
--echo this should fail : same user, but on a different host # Security context in THD contains two pairs of (user,host)
--error ER_ACCESS_DENIED_NO_PASSWORD_ERROR # 1. (user,host) pair referring to inbound connection
# 2. (priv_user,priv_host) pair obtained from mysql.user table after doing
# authnetication of incoming connection.
# Granting/revoking proxy privileges, privileges should be checked wrt
# (priv_user, priv_host) tuple that is obtained from mysql.user table
# Following is a valid grant because effective user of connection is
# grant_plug_dest@% and statement is trying to grant proxy on the same
# user.
--echo This is a valid grant
GRANT PROXY ON grant_plug_dest TO grant_plug; GRANT PROXY ON grant_plug_dest TO grant_plug;
REVOKE PROXY ON grant_plug_dest FROM grant_plug;
--echo this should work : same user --echo this should work : same user
GRANT PROXY ON grant_plug_dest@localhost TO grant_plug_dest2; GRANT PROXY ON grant_plug_dest TO grant_plug_dest2;
REVOKE PROXY ON grant_plug_dest@localhost FROM grant_plug_dest2; REVOKE PROXY ON grant_plug_dest FROM grant_plug_dest2;
--echo this should work : same user # grant_plug_dest@localhost is not the same as grant_plug_dest@%
# so following grant/revoke should fail
--echo this should fail : not the same user
--error ER_ACCESS_DENIED_NO_PASSWORD_ERROR
GRANT PROXY ON grant_plug_dest@localhost TO grant_plug WITH GRANT OPTION; GRANT PROXY ON grant_plug_dest@localhost TO grant_plug WITH GRANT OPTION;
--echo this should fail : not the same user
--error ER_ACCESS_DENIED_NO_PASSWORD_ERROR
REVOKE PROXY ON grant_plug_dest@localhost FROM grant_plug; REVOKE PROXY ON grant_plug_dest@localhost FROM grant_plug;
--echo this should fail : can't create users --echo this should fail : can't create users
--error ER_CANT_CREATE_USER_WITH_GRANT --error ER_CANT_CREATE_USER_WITH_GRANT
GRANT PROXY ON grant_plug_dest@localhost TO grant_plug@localhost; GRANT PROXY ON grant_plug_dest TO grant_plug@localhost;
connection default; connection default;
--echo in default connection --echo in default connection

View File

@ -1371,3 +1371,17 @@ SELECT RELEASE_LOCK('t');
--connection default --connection default
SET NAMES latin1; SET NAMES latin1;
--echo #
--echo # WL#6454: Deprecate SHOW AUTHORS and SHOW CONTRIBUTORS
--echo #
--disable_result_log
SHOW AUTHORS;
--enable_result_log
SHOW WARNINGS;
--disable_result_log
SHOW CONTRIBUTORS;
--enable_result_log
SHOW WARNINGS;

View File

@ -429,14 +429,6 @@ disconnect addcon;
DROP DATABASE `my.db`; DROP DATABASE `my.db`;
USE test; USE test;
#
# Restore global concurrent_insert value. Keep in the end of the test file.
#
set @@global.concurrent_insert= @old_concurrent_insert;
# Wait till all disconnects are completed
--source include/wait_until_count_sessions.inc
--echo # --echo #
--echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE --echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE

View File

@ -0,0 +1,38 @@
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
IF(UNIX)
SET(prefix ${CMAKE_INSTALL_PREFIX})
SET(SPECFILENAME "mysql.${VERSION}.spec")
IF("${VERSION}" MATCHES "-ndb-")
STRING(REGEX REPLACE "^.*-ndb-" "" NDBVERSION "${VERSION}")
SET(SPECFILENAME "mysql-cluster-${NDBVERSION}.spec")
ENDIF()
# Left in current directory, to be taken during build
CONFIGURE_FILE(mysql.spec.sh ${CMAKE_CURRENT_BINARY_DIR}/${SPECFILENAME} @ONLY)
FOREACH(ulnfile filter-requires-mysql.sh generate-tarball.sh my.cnf my_config.h
mysql-5.5-errno.patch mysql-5.5-fix-tests.patch mysql-5.5-libdir.patch
mysql-5.5-mtr1.patch mysql-5.5-stack-guard.patch mysql-5.5-testing.patch
mysql-chain-certs.patch mysql-embedded-check.c mysql-expired-certs.patch
mysql.init mysql-install-test.patch mysql-strmov.patch scriptstub.c
README.mysql-docs)
CONFIGURE_FILE(${ulnfile} ${CMAKE_CURRENT_BINARY_DIR}/${ulnfile} COPYONLY)
ENDFOREACH()
ENDIF()

View File

@ -0,0 +1,15 @@
In order to have RPMs of MySQL which are distributed via ULN for Oracle Linux
to be as closely compatible to such RPMs built and distributed by RedHat,
this directory contains additional files which originated at RedHat
and are used only for such RPMs intended for distribution via ULN.
Especially, this directory contains the spec file used to build these RPMs,
named "mysql.spec". Please regard the following note:
You are receiving a copy of the Red Hat spec file.
The terms of the Oracle license do NOT apply to the Red Hat spec file;
it is licensed under the
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
separately from the Oracle programs you receive.

View File

@ -0,0 +1,4 @@
The official MySQL documentation is not freely redistributable, so we cannot
include it in RHEL or Fedora. You can find it on-line at
http://dev.mysql.com/doc/

View File

@ -0,0 +1,3 @@
#!/bin/sh
/usr/lib/rpm/perl.req $* | grep -v -e "perl(th" -e "perl(lib::mtr" -e "perl(mtr"

View File

@ -0,0 +1,15 @@
#!/bin/sh
VERSION=$1
rm -rf mysql-$VERSION
tar xfz mysql-$VERSION.tar.gz || exit 1
rm mysql-$VERSION/Docs/mysql.info
tar cfz mysql-$VERSION-nodocs.tar.gz mysql-$VERSION || exit 1
rm -rf mysql-$VERSION
exit 0

10
packaging/rpm-uln/my.cnf Normal file
View File

@ -0,0 +1,10 @@
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

View File

@ -0,0 +1,29 @@
/*
* Kluge to support multilib installation of both 32- and 64-bit RPMS:
* we need to arrange that header files that appear in both RPMs are
* identical. Hence, this file is architecture-independent and calls
* in an arch-dependent file that will appear in just one RPM.
*
* To avoid breaking arches not explicitly supported by Red Hat, we
* use this indirection file *only* on known multilib arches.
*
* Note: this may well fail if user tries to use gcc's -I- option.
* But that option is deprecated anyway.
*/
#if defined(__x86_64__)
#include "my_config_x86_64.h"
#elif defined(__i386__)
#include "my_config_i386.h"
#elif defined(__ppc64__) || defined(__powerpc64__)
#include "my_config_ppc64.h"
#elif defined(__ppc__) || defined(__powerpc__)
#include "my_config_ppc.h"
#elif defined(__s390x__)
#include "my_config_s390x.h"
#elif defined(__s390__)
#include "my_config_s390.h"
#elif defined(__sparc__) && defined(__arch64__)
#include "my_config_sparc64.h"
#elif defined(__sparc__)
#include "my_config_sparc.h"
#endif

View File

@ -0,0 +1,21 @@
"extern int errno" is just a really bad idea.
diff -Naur mysql-5.1.32.orig/include/my_sys.h mysql-5.1.32/include/my_sys.h
--- mysql-5.1.32.orig/include/my_sys.h 2009-02-13 19:52:19.000000000 -0500
+++ mysql-5.1.32/include/my_sys.h 2009-03-04 18:08:40.000000000 -0500
@@ -199,13 +199,8 @@
#define my_afree(PTR) my_free(PTR)
#endif /* HAVE_ALLOCA */
-#ifndef errno /* did we already get it? */
-#ifdef HAVE_ERRNO_AS_DEFINE
#include <errno.h> /* errno is a define */
-#else
-extern int errno; /* declare errno */
-#endif
-#endif /* #ifndef errno */
+
extern char *home_dir; /* Home directory for user */
extern const char *my_progname; /* program-name (printed in errors) */
extern char curr_dir[]; /* Current directory for user */

View File

@ -0,0 +1,34 @@
Adapt tests (where needed) to RedHat conventions.
1) The RedHat convention uses the package name "mysql*" whereas upstream uses "MySQL*".
Test "file_contents" constructs path names and needs to be adapted.
=== modified file 'mysql-test/t/file_contents.test'
--- mysql-5.5.17-orig/mysql-test/t/file_contents.test 2011-10-10 12:03:29 +0000
+++ mysql-5.5.17/mysql-test/t/file_contents.test 2011-11-16 18:07:55 +0000
@@ -17,20 +17,20 @@ if ($dir_bin =~ m|/usr/|) {
$dir_docs =~ s|/lib|/share/doc|;
if(-d "$dir_docs/packages") {
# SuSE: "packages/" in the documentation path
- $dir_docs = glob "$dir_docs/packages/MySQL-server*";
+ $dir_docs = glob "$dir_docs/packages/mysql-server*";
} else {
# RedHat: version number in directory name
- $dir_docs = glob "$dir_docs/MySQL-server*";
+ $dir_docs = glob "$dir_docs/mysql-server*";
}
} elsif ($dir_bin =~ m|/usr$|) {
# RPM build during development
$dir_docs = "$dir_bin/share/doc";
if(-d "$dir_docs/packages") {
# SuSE: "packages/" in the documentation path
- $dir_docs = glob "$dir_docs/packages/MySQL-server*";
+ $dir_docs = glob "$dir_docs/packages/mysql-server*";
} else {
# RedHat: version number in directory name
- $dir_docs = glob "$dir_docs/MySQL-server*";
+ $dir_docs = glob "$dir_docs/mysql-server*";
}
} else {
# tar.gz package, Windows, or developer work (in BZR)

View File

@ -0,0 +1,28 @@
The RPMs built by MySQL AB (-> Sun -> Oracle) put the libraries into "/usr/lib".
Those built by RedHat put them into "/usr/lib/mysql".
This patch is to modify the cmake files to follow the RedHat convention.
Similar, the server is now in "/usr/libexec" (formerly "/usr/sbin").
diff -Naur mysql-5.5.17.orig/cmake/install_layout.cmake mysql-5.5.17/cmake/install_layout.cmake
--- mysql-5.5.17.orig/cmake/install_layout.cmake 2011-06-30 15:46:53 +0000
+++ mysql-5.5.17/cmake/install_layout.cmake 2011-10-27 16:40:10 +0000
@@ -140,14 +140,14 @@ SET(INSTALL_SBINDIR_RPM
# be applied at build time via "rpmbuild".
#
SET(INSTALL_BINDIR_RPM "bin")
-SET(INSTALL_SBINDIR_RPM "sbin")
+SET(INSTALL_SBINDIR_RPM "libexec")
SET(INSTALL_SCRIPTDIR_RPM "bin")
#
IF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
- SET(INSTALL_LIBDIR_RPM "lib64")
+ SET(INSTALL_LIBDIR_RPM "lib64/mysql")
SET(INSTALL_PLUGINDIR_RPM "lib64/mysql/plugin")
ELSE()
- SET(INSTALL_LIBDIR_RPM "lib")
+ SET(INSTALL_LIBDIR_RPM "lib/mysql")
SET(INSTALL_PLUGINDIR_RPM "lib/mysql/plugin")
ENDIF()
#

View File

@ -0,0 +1,25 @@
Drop support for version 1 of "mysql-test-run.pl" from the RPMs:
1) The auto-generation of Perl dependencies will mishandle that code,
probably because its run directory differs from its storage location.
2) It does not provide several variables which are used in tests of MySQL 5.5
If you really need it, take it from the source tarball.
=== modified file 'mysql-test/mysql-test-run.pl'
--- mysql-5.5.17-orig/mysql-test/mysql-test-run.pl 2011-10-03 11:16:40 +0000
+++ mysql-5.5.17/mysql-test/mysql-test-run.pl 2011-11-16 19:06:38 +0000
@@ -58,10 +58,9 @@ BEGIN {
if ( $version == 1 )
{
print "=======================================================\n";
- print " WARNING: Using mysql-test-run.pl version 1! \n";
+ print " ERROR: Support for version 1 is dropped in this distribution! \n";
print "=======================================================\n";
- # Should use exec() here on *nix but this appears not to work on Windows
- exit(system($^X, "lib/v1/mysql-test-run.pl", @ARGV) >> 8);
+ exit(1);
}
elsif ( $version == 2 )
{

View File

@ -0,0 +1,140 @@
mysql is not accounting for the "guard page" when setting thread stack size
requests. This is fatal on PPC systems, which may use guard pages as large
as 64K. This patch also documents the IA64 situation a bit better.
Note: there are quite a few other setstacksize calls besides the two in
mysqld.cc; is it important to fix any of the others?
Filed upstream at http://bugs.mysql.com/bug.php?id=35019
diff -Naur mysql-5.1.30.orig/sql/mysqld.cc mysql-5.1.30/sql/mysqld.cc
--- mysql-5.1.30.orig/sql/mysqld.cc 2008-11-14 11:37:13.000000000 -0500
+++ mysql-5.1.30/sql/mysqld.cc 2009-01-13 12:08:35.000000000 -0500
@@ -2653,6 +2653,70 @@
}
+/* pthread_attr_setstacksize without so much platform-dependency */
+/* returns the actual stack size if possible */
+static size_t my_setstacksize(pthread_attr_t *attr, size_t stacksize)
+{
+ size_t guard_size = 0;
+
+#if defined(__ia64__) || defined(__ia64)
+ /*
+ On IA64, half of the requested stack size is used for "normal stack"
+ and half for "register stack". The space measured by check_stack_overrun
+ is the "normal stack", so double the request to make sure we have the
+ caller-expected amount of normal stack.
+
+ NOTE: there is no guarantee that the register stack can't grow faster
+ than normal stack, so it's very unclear that we won't dump core due to
+ stack overrun despite check_stack_overrun's efforts. Experimentation
+ shows that in the execution_constants test, the register stack grows
+ less than half as fast as normal stack, but perhaps other scenarios are
+ less forgiving. If it turns out that more space is needed for the
+ register stack, that could be forced (rather inefficiently) by using a
+ multiplier higher than 2 here.
+ */
+ stacksize *= 2;
+#endif
+
+ /*
+ On many machines, the "guard space" is subtracted from the requested
+ stack size, and that space is quite large on some platforms. So add
+ it to our request, if we can find out what it is.
+
+ FIXME: autoconfiscate use of pthread_attr_getguardsize
+ */
+ if (pthread_attr_getguardsize(attr, &guard_size))
+ guard_size = 0; /* if can't find it out, treat as 0 */
+
+ pthread_attr_setstacksize(attr, stacksize + guard_size);
+
+ /* Retrieve actual stack size if possible */
+#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
+ {
+ size_t real_stack_size= 0;
+ /* We must ignore real_stack_size = 0 as Solaris 2.9 can return 0 here */
+ if (pthread_attr_getstacksize(attr, &real_stack_size) == 0 &&
+ real_stack_size > guard_size)
+ {
+ real_stack_size -= guard_size;
+ if (real_stack_size < stacksize)
+ {
+ if (global_system_variables.log_warnings)
+ sql_print_warning("Asked for %ld thread stack, but got %ld",
+ (long) stacksize, (long) real_stack_size);
+ stacksize= real_stack_size;
+ }
+ }
+ }
+#endif
+
+#if defined(__ia64__) || defined(__ia64)
+ stacksize /= 2;
+#endif
+ return stacksize;
+}
+
+
static void start_signal_handler(void)
{
int error;
@@ -2663,15 +2727,7 @@
#if !defined(HAVE_DEC_3_2_THREADS)
pthread_attr_setscope(&thr_attr,PTHREAD_SCOPE_SYSTEM);
(void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED);
-#if defined(__ia64__) || defined(__ia64)
- /*
- Peculiar things with ia64 platforms - it seems we only have half the
- stack size in reality, so we have to double it here
- */
- pthread_attr_setstacksize(&thr_attr,my_thread_stack_size*2);
-#else
- pthread_attr_setstacksize(&thr_attr,my_thread_stack_size);
-#endif
+ (void) my_setstacksize(&thr_attr,my_thread_stack_size);
#endif
mysql_mutex_lock(&LOCK_thread_count);
@@ -4445,37 +4501,7 @@
unireg_abort(1); // Will do exit
init_signals();
-#if defined(__ia64__) || defined(__ia64)
- /*
- Peculiar things with ia64 platforms - it seems we only have half the
- stack size in reality, so we have to double it here
- */
- pthread_attr_setstacksize(&connection_attrib,my_thread_stack_size*2);
-#else
- pthread_attr_setstacksize(&connection_attrib,my_thread_stack_size);
-#endif
-#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
- {
- /* Retrieve used stack size; Needed for checking stack overflows */
- size_t stack_size= 0;
- pthread_attr_getstacksize(&connection_attrib, &stack_size);
-#if defined(__ia64__) || defined(__ia64)
- stack_size/= 2;
-#endif
- /* We must check if stack_size = 0 as Solaris 2.9 can return 0 here */
- if (stack_size && stack_size < my_thread_stack_size)
- {
- if (global_system_variables.log_warnings)
- sql_print_warning("Asked for %lu thread stack, but got %ld",
- my_thread_stack_size, (long) stack_size);
-#if defined(__ia64__) || defined(__ia64)
- my_thread_stack_size= stack_size*2;
-#else
- my_thread_stack_size= stack_size;
-#endif
- }
- }
-#endif
+ my_thread_stack_size = my_setstacksize(&connection_attrib,my_thread_stack_size);
(void) thr_setconcurrency(concurrency); // 10 by default

View File

@ -0,0 +1,23 @@
Hack the top-level Makefile to enable the openssl regression tests.
(Why doesn't this happen automatically given the configure option??)
Also, increase the overall timeout for the regression tests to 12 hours,
because on a slow or heavily-loaded build machine sometimes the default of
5 hours isn't enough. (This has been demonstrated to fail in mass-rebuild
scenarios, which aren't that uncommon for Fedora.) Similarly increase the
per-testcase timeout to 30 minutes, since the default of 15 hasn't got a
great deal of headroom either.
diff -Naur mysql-5.1.32.orig/Makefile.am mysql-5.1.32/Makefile.am
--- mysql-5.1.32.orig/Makefile.am 2009-02-13 19:51:56.000000000 -0500
+++ mysql-5.1.32/Makefile.am 2009-03-04 18:12:36.000000000 -0500
@@ -98,7 +98,7 @@
test-ns:
cd mysql-test ; \
- @PERL@ ./mysql-test-run.pl $(force) $(mem) --mysqld=--binlog-format=mixed
+ @PERL@ ./mysql-test-run.pl $(force) $(mem) --ssl --mysqld=--binlog-format=mixed --suite-timeout=720 --testcase-timeout=30
test-binlog-statement:
cd mysql-test ; \

View File

@ -0,0 +1,45 @@
Fix things so that chains of certificates work in the server and client
certificate files.
This only really works for OpenSSL-based builds, as yassl is unable to read
multiple certificates from a file. The patch below to yassl/src/ssl.cpp
doesn't fix that, but just arranges that the viosslfactories.c patch won't
have any ill effects in a yassl build. Since we don't use yassl in Red Hat/
Fedora builds, I'm not feeling motivated to try to fix yassl for this.
See RH bug #598656. Filed upstream at http://bugs.mysql.com/bug.php?id=54158
===
Joerg Bruehe, MySQL Build Team at Oracle: First patch adapted to code changes in MySQL 5.5
diff -Naur mysql-5.5.29.orig/vio/viosslfactories.c mysql-5.5.29/vio/viosslfactories.c
--- mysql-5.5.29.orig/vio/viosslfactories.c 2010-05-06 11:28:07.000000000 -0400
+++ mysql-5.5.29/vio/viosslfactories.c 2010-05-26 23:23:46.000000000 -0400
@@ -106,7 +106,7 @@
key_file= cert_file;
if (cert_file &&
- SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0)
+ SSL_CTX_use_certificate_chain_file(ctx, cert_file) <= 0)
{
*error= SSL_INITERR_CERT;
DBUG_PRINT("error",("%s from file '%s'", sslGetErrString(*error), cert_file));
diff -Naur mysql-5.1.47.orig/extra/yassl/src/ssl.cpp mysql-5.1.47/extra/yassl/src/ssl.cpp
--- mysql-5.1.47.orig/extra/yassl/src/ssl.cpp 2010-05-06 11:24:26.000000000 -0400
+++ mysql-5.1.47/extra/yassl/src/ssl.cpp 2010-05-26 23:29:13.000000000 -0400
@@ -1606,10 +1606,10 @@
}
- int SSL_CTX_use_certificate_chain_file(SSL_CTX*, const char*)
+ int SSL_CTX_use_certificate_chain_file(SSL_CTX* ctx, const char* file)
{
- // TDOD:
- return SSL_SUCCESS;
+ // For the moment, treat like use_certificate_file
+ return read_file(ctx, file, SSL_FILETYPE_PEM, Cert);
}

View File

@ -0,0 +1,26 @@
/* simple test program to see if we can link the embedded server library */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "mysql.h"
MYSQL *mysql;
static char *server_options[] = \
{ "mysql_test", "--defaults-file=my.cnf", NULL };
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
static char *server_groups[] = { "libmysqld_server",
"libmysqld_client", NULL };
int main(int argc, char **argv)
{
mysql_library_init(num_elements, server_options, server_groups);
mysql = mysql_init(NULL);
mysql_close(mysql);
mysql_library_end();
return 0;
}

View File

@ -0,0 +1,555 @@
Upstream insists on generating SSL testing certificates with relatively short
lifespan, which has repeatedly caused problems (ie, one day the regression
tests suddenly stop working). Replace them with certificates with 20-year
lifespan. We should periodically regenerate these, too, but at least not
very often.
diff -Naur mysql-5.1.50.orig/mysql-test/std_data/cacert.pem mysql-5.1.50/mysql-test/std_data/cacert.pem
--- mysql-5.1.50.orig/mysql-test/std_data/cacert.pem 2010-08-03 13:55:04.000000000 -0400
+++ mysql-5.1.50/mysql-test/std_data/cacert.pem 2010-08-27 23:42:05.751428144 -0400
@@ -1,17 +1,22 @@
-----BEGIN CERTIFICATE-----
-MIICrTCCAhagAwIBAgIJAMI7xZKjhrDbMA0GCSqGSIb3DQEBBAUAMEQxCzAJBgNV
+MIIDsjCCApqgAwIBAgIJAL5YrUwfPSWVMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV
BAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBzYWxhMREwDwYD
-VQQKEwhNeVNRTCBBQjAeFw0xMDAxMjkxMTQ3MTBaFw0xNTAxMjgxMTQ3MTBaMEQx
+VQQKEwhNeVNRTCBBQjAeFw0xMDAxMjkwNTU5NTNaFw0xNTAxMjgwNTU5NTNaMEQx
CzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBzYWxh
-MREwDwYDVQQKEwhNeVNRTCBBQjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
-wQYsOEfrN4ESP3FjsI8cghE+tZVuyK2gck61lwieVxjgFMtBd65mI5a1y9pmlOI1
-yM4SB2Ppqcuw7/e1CdV1y7lvHrGNt5yqEHbN4QX1gvsN8TQauP/2WILturk4R4Hq
-rKg0ZySu7f1Xhl0ed9a48LpaEHD17IcxWEGMMJwAxF0CAwEAAaOBpjCBozAMBgNV
-HRMEBTADAQH/MB0GA1UdDgQWBBSvktYQ0ahLnyxyVKqty+WpBbBrDTB0BgNVHSME
-bTBrgBSvktYQ0ahLnyxyVKqty+WpBbBrDaFIpEYwRDELMAkGA1UEBhMCU0UxEDAO
-BgNVBAgTB1VwcHNhbGExEDAOBgNVBAcTB1VwcHNhbGExETAPBgNVBAoTCE15U1FM
-IEFCggkAwjvFkqOGsNswDQYJKoZIhvcNAQEEBQADgYEAdKN1PjwMHAKG2Ww1145g
-JQGBnKxSFOUaoSvkBi/4ntTM+ysnViWh7WvxyWjR9zU9arfr7aqsDeQxm0XDOqzj
-AQ/cQIla2/Li8tXyfc06bisH/IHRaSc2zWqioTKbEwMdVOdrvq4a8V8ic3xYyIWn
-7F4WeS07J8LKardSvM0+hOA=
+MREwDwYDVQQKEwhNeVNRTCBBQjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL6kNN4peX7uhK9rb06W/QbPEpVuejmdWdl2PqMshP/eSuXXw7kwVgfpxx9R
+vC000CKQQSG9MCoZjtqPnFRsetmWLZgApRpEalGXTXJqq9sEbCfoFizg94U8G7d2
+u5XJjLVmcG34ru36KoBgVx1zeH1puBAf8dOzrE4L7Y+ZQBFzFohjh8C2LqWC4nM5
+qsLmOkDWMipGqYU5DvkKjIbTbwTyRNRgZHWSPfVDDPUIUOsY4BGUp2DpgeGY9aEv
+lIs57Ev9JqlIUCV65lOhhDkG+xwmkHKHA+ECEU9cALI8+uXbh48MB9XpMOuk408X
+/lX89aZwD0/G9kmObVGnE2G+H5UCAwEAAaOBpjCBozAdBgNVHQ4EFgQUsft+d7VA
+jWgRftkR5cPG2k2sUbAwdAYDVR0jBG0wa4AUsft+d7VAjWgRftkR5cPG2k2sUbCh
+SKRGMEQxCzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdV
+cHBzYWxhMREwDwYDVQQKEwhNeVNRTCBBQoIJAL5YrUwfPSWVMAwGA1UdEwQFMAMB
+Af8wDQYJKoZIhvcNAQEFBQADggEBALRUOAmdL8R8sl1y8kiEiFgDatdXK5RDqWai
+8yZChfmwTIToHhmQsOEshJe2e8hky3huUj+33VyXjINoMbebIwMuXPwEkbJal8RZ
+nSJmF0jN1Qz7J/jFffwK9xmejWZJx49Kt2+Qwrwp6kDeq9TLFqQOoVczgyJPYsTL
+NAOib5WqTud3XWvCwxrhqmWu7JZq6sp1fomP/uunprb8y2miWfLESZN2mKAhm44Q
+Lws867LT8v2lskEjq2dT1LutD5+R66XcdjgSr0uDziDs64jZwCD6ea94hVFM7ej0
+ZOXYeSEZJ56FjUxu632e9fY8NyMh30yKjjmQf1mM9PuGJvdvsWU=
-----END CERTIFICATE-----
diff -Naur mysql-5.1.50.orig/mysql-test/std_data/client-cert.pem mysql-5.1.50/mysql-test/std_data/client-cert.pem
--- mysql-5.1.50.orig/mysql-test/std_data/client-cert.pem 2010-08-03 13:55:04.000000000 -0400
+++ mysql-5.1.50/mysql-test/std_data/client-cert.pem 2010-08-27 23:42:05.752428395 -0400
@@ -1,46 +1,69 @@
Certificate:
Data:
- Version: 1 (0x0)
- Serial Number: 1048577 (0x100001)
- Signature Algorithm: md5WithRSAEncryption
+ Version: 3 (0x2)
+ Serial Number: 6 (0x6)
+ Signature Algorithm: sha1WithRSAEncryption
Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB
Validity
- Not Before: Jan 29 11:50:22 2010 GMT
- Not After : Jan 28 11:50:22 2015 GMT
+ Not Before: Feb 20 03:03:26 2010 GMT
+ Not After : Sep 3 03:03:26 2030 GMT
Subject: C=SE, ST=Uppsala, O=MySQL AB
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- Public-Key: (1024 bit)
- Modulus:
- 00:cc:9a:37:49:13:66:dc:cf:e3:0b:13:a1:23:ed:
- 78:db:4e:bd:11:f6:8c:0d:76:f9:a3:32:56:9a:f8:
- a1:21:6a:55:4e:4d:3f:e6:67:9d:26:99:b2:cd:a4:
- 9a:d2:2b:59:5c:d7:8a:d3:60:68:f8:18:bd:c5:be:
- 15:e1:2a:3c:a3:d4:61:cb:f5:11:94:17:81:81:f7:
- 87:8c:f6:6a:d2:ee:d8:e6:77:f6:62:66:4d:2e:16:
- 8d:08:81:4a:c9:c6:4b:31:e5:b9:c7:8a:84:96:48:
- a7:47:8c:0d:26:90:56:4e:e6:a5:6e:8c:b3:f2:9f:
- fc:3d:78:9b:49:6e:86:83:77
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:c2:e7:20:cf:89:59:2f:67:cb:4c:9f:e8:11:f2:
+ 23:e5:f1:b1:ee:3f:66:5f:c3:f5:fd:1e:31:ee:8f:
+ 4c:2a:bd:c0:4a:a5:9f:c8:44:d5:77:8f:15:1b:4d:
+ 78:6e:b2:a2:48:a5:24:33:05:40:02:b3:c1:87:8d:
+ 59:3c:1a:07:aa:86:f0:04:e1:9c:20:4b:22:32:c4:
+ 51:9e:40:e4:31:c3:57:f5:98:bf:2e:b1:fd:2c:56:
+ bf:49:d9:9b:e7:17:cc:95:5f:b5:08:19:5e:9d:df:
+ 65:22:39:2c:48:fb:69:96:31:7a:35:4d:de:60:b4:
+ c1:60:19:5f:96:56:7e:55:19
Exponent: 65537 (0x10001)
- Signature Algorithm: md5WithRSAEncryption
- 5e:1f:a3:53:5f:24:13:1c:f8:28:32:b0:7f:69:69:f3:0e:c0:
- 34:87:10:03:7d:da:15:8b:bd:19:b8:1a:56:31:e7:85:49:81:
- c9:7f:45:20:74:3e:89:c0:e0:26:84:51:cc:04:16:ce:69:99:
- 01:e1:26:99:b3:e3:f5:bd:ec:5f:a0:84:e4:38:da:75:78:7b:
- 89:9c:d2:cd:60:95:20:ba:8e:e3:7c:e6:df:76:3a:7c:89:77:
- 02:94:86:11:3a:c4:61:7d:6f:71:83:21:8a:17:fb:17:e2:ee:
- 02:6b:61:c1:b4:52:63:d7:d8:46:b2:c5:9c:6f:38:91:8a:35:
- 32:0b
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ X509v3 Subject Key Identifier:
+ 8D:10:67:91:33:76:9C:02:E5:78:5D:D8:C5:EF:25:96:B2:D7:FA:1F
+ X509v3 Authority Key Identifier:
+ keyid:B1:FB:7E:77:B5:40:8D:68:11:7E:D9:11:E5:C3:C6:DA:4D:AC:51:B0
+ DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB
+ serial:BE:58:AD:4C:1F:3D:25:95
+
+ Signature Algorithm: sha1WithRSAEncryption
+ a9:88:10:3e:5d:2a:47:29:c8:03:27:7a:31:5a:8e:10:03:bc:
+ b5:4e:37:1d:12:7b:eb:5f:50:71:70:b1:a3:8e:93:0e:77:17:
+ 6c:47:b6:c9:a4:4d:2a:c4:38:f0:61:55:b2:7f:28:ba:06:79:
+ ee:67:11:7d:d4:c9:7f:0a:18:c8:c1:cb:d0:2c:f9:63:0f:bb:
+ 45:ca:de:ea:bb:ac:00:01:52:48:36:2b:07:2b:c8:46:c7:b1:
+ 21:81:bd:77:39:e7:4c:39:aa:bd:ac:60:d8:a7:bf:cf:14:98:
+ 4a:0b:a1:40:55:06:8d:6f:35:a9:39:a0:71:a9:97:ba:7c:73:
+ 3c:41:ba:c5:1c:11:4b:2b:43:1d:2d:ba:7b:5f:14:b5:3d:64:
+ 62:15:36:b4:16:bd:78:c8:43:8d:f9:1c:a5:d2:ac:a1:58:74:
+ e1:99:de:ad:04:19:43:a8:bd:0a:fd:19:9b:50:44:46:6d:18:
+ 55:4d:bf:b4:5b:a4:93:62:c7:64:91:6c:54:34:d1:f8:f3:ff:
+ 12:6d:5f:85:e7:35:9e:5c:42:81:5e:fb:c8:bb:44:51:98:b2:
+ ef:1b:9f:5a:22:77:28:7d:da:fb:08:c2:94:9a:0f:42:08:93:
+ 54:10:1e:ad:f2:4f:fc:62:98:51:e9:9b:b9:3a:93:d9:e4:1f:
+ 1d:c4:76:d0
-----BEGIN CERTIFICATE-----
-MIIB5zCCAVACAxAAATANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJTRTEQMA4G
-A1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwg
-QUIwHhcNMTAwMTI5MTE1MDIyWhcNMTUwMTI4MTE1MDIyWjAyMQswCQYDVQQGEwJT
-RTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIwgZ8wDQYJKoZI
-hvcNAQEBBQADgY0AMIGJAoGBAMyaN0kTZtzP4wsToSPteNtOvRH2jA12+aMyVpr4
-oSFqVU5NP+ZnnSaZss2kmtIrWVzXitNgaPgYvcW+FeEqPKPUYcv1EZQXgYH3h4z2
-atLu2OZ39mJmTS4WjQiBSsnGSzHluceKhJZIp0eMDSaQVk7mpW6Ms/Kf/D14m0lu
-hoN3AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAXh+jU18kExz4KDKwf2lp8w7ANIcQ
-A33aFYu9GbgaVjHnhUmByX9FIHQ+icDgJoRRzAQWzmmZAeEmmbPj9b3sX6CE5Dja
-dXh7iZzSzWCVILqO43zm33Y6fIl3ApSGETrEYX1vcYMhihf7F+LuAmthwbRSY9fY
-RrLFnG84kYo1Mgs=
+MIIDETCCAfmgAwIBAgIBBjANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ
+MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT
+UUwgQUIwHhcNMTAwMjIwMDMwMzI2WhcNMzAwOTAzMDMwMzI2WjAyMQswCQYDVQQG
+EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIwgZ8wDQYJ
+KoZIhvcNAQEBBQADgY0AMIGJAoGBAMLnIM+JWS9ny0yf6BHyI+Xxse4/Zl/D9f0e
+Me6PTCq9wEqln8hE1XePFRtNeG6yokilJDMFQAKzwYeNWTwaB6qG8AThnCBLIjLE
+UZ5A5DHDV/WYvy6x/SxWv0nZm+cXzJVftQgZXp3fZSI5LEj7aZYxejVN3mC0wWAZ
+X5ZWflUZAgMBAAGjgaMwgaAwCQYDVR0TBAIwADAdBgNVHQ4EFgQUjRBnkTN2nALl
+eF3Yxe8llrLX+h8wdAYDVR0jBG0wa4AUsft+d7VAjWgRftkR5cPG2k2sUbChSKRG
+MEQxCzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBz
+YWxhMREwDwYDVQQKEwhNeVNRTCBBQoIJAL5YrUwfPSWVMA0GCSqGSIb3DQEBBQUA
+A4IBAQCpiBA+XSpHKcgDJ3oxWo4QA7y1TjcdEnvrX1BxcLGjjpMOdxdsR7bJpE0q
+xDjwYVWyfyi6BnnuZxF91Ml/ChjIwcvQLPljD7tFyt7qu6wAAVJINisHK8hGx7Eh
+gb13OedMOaq9rGDYp7/PFJhKC6FAVQaNbzWpOaBxqZe6fHM8QbrFHBFLK0MdLbp7
+XxS1PWRiFTa0Fr14yEON+Ryl0qyhWHThmd6tBBlDqL0K/RmbUERGbRhVTb+0W6ST
+YsdkkWxUNNH48/8SbV+F5zWeXEKBXvvIu0RRmLLvG59aIncofdr7CMKUmg9CCJNU
+EB6t8k/8YphR6Zu5OpPZ5B8dxHbQ
-----END CERTIFICATE-----
diff -Naur mysql-5.1.50.orig/mysql-test/std_data/client-key.pem mysql-5.1.50/mysql-test/std_data/client-key.pem
--- mysql-5.1.50.orig/mysql-test/std_data/client-key.pem 2010-08-03 13:55:05.000000000 -0400
+++ mysql-5.1.50/mysql-test/std_data/client-key.pem 2010-08-27 23:42:05.752428395 -0400
@@ -1,15 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
-MIICXQIBAAKBgQDMmjdJE2bcz+MLE6Ej7XjbTr0R9owNdvmjMlaa+KEhalVOTT/m
-Z50mmbLNpJrSK1lc14rTYGj4GL3FvhXhKjyj1GHL9RGUF4GB94eM9mrS7tjmd/Zi
-Zk0uFo0IgUrJxksx5bnHioSWSKdHjA0mkFZO5qVujLPyn/w9eJtJboaDdwIDAQAB
-AoGASqk/4We2En+93y3jkIO4pXafIe3w/3zZ7caRue1ehx4RUQh5d+95djuB9u7J
-HEZ7TpjM7QNyao5EueL6gvbxt0LXFvqAMni7yM9tt/HUYtHHPqYiRtUny9bKYFTm
-l8szCCMal/wD9GZU9ByHDNHm7tHUMyMhARNTYSgx+SERFmECQQD/6jJocC4SXf6f
-T3LqimWR02lbJ7qCoDgRglsUXh0zjrG+IIiAyE+QOCCx1GMe3Uw6bsIuYwdHT6as
-WcdPs04xAkEAzKulvEvLVvN5zfa/DTYRTV7jh6aDleOxjsD5oN/oJXoACnPzVuUL
-qQQMNtuAXm6Q1QItrRxpQsSKbY0UQka6JwJBAOSgoNoG5lIIYTKIMvzwGV+XBLeo
-HYsXgh+6Wo4uql3mLErUG78ZtWL9kc/tE4R+ZdyKGLaCR/1gXmH5bwN4B/ECQEBb
-uUH8k3REG4kojesZlVc+/00ojzgS4UKCa/yqa9VdB6ZBz8MDQydinnShkTwgiGpy
-xOoqhO753o2UT0qH8wECQQC99IEJWUnwvExVMkLaZH5NjAFJkb22sjkmuT11tAgU
-RQgOMoDOm6driojnOnDWOkx1r1Gy9NgMLooduja4v6cx
+MIICWwIBAAKBgQDC5yDPiVkvZ8tMn+gR8iPl8bHuP2Zfw/X9HjHuj0wqvcBKpZ/I
+RNV3jxUbTXhusqJIpSQzBUACs8GHjVk8GgeqhvAE4ZwgSyIyxFGeQOQxw1f1mL8u
+sf0sVr9J2ZvnF8yVX7UIGV6d32UiOSxI+2mWMXo1Td5gtMFgGV+WVn5VGQIDAQAB
+AoGARXcXLKDpVooJ3W+IyQyiWsw//IhANpWjUOm4JiyQmxMyO+i4ACr4Yjpu7WI5
+MEseqAGj20NdwxjKO0PXsCIe5LmrGZ+SI8+CSERFOWXWRtCWz7y7SG30i1k6suvM
+mwqWom0tJLwn93uA1lm/WSwKQwUrJRahRQd3EaZqrl7DP5kCQQD/8gbuYAT5pxQe
+ULLGM0RvEsXxDYbEDxNbY5wrBazfklBwpumxZpFl6jEAT++7Kh2Ns3A7kB1oUNlA
+FPYr+dYPAkEAwvHEwRtoyUr8jqoqVVJWI76CDmBjEOzVeMKW97ztqbs2LxZW8dYI
+iOh/myFGpdoUwgu0U8w9MmXcj3ZeZCYKVwJALyQ+AJPw9qa+fuLwOq9gsHCtwrty
+EhSQxSlwrz/pWniRll439vPkXfgntF4E0t1r+hiN2Hqv3/HcQgBaYzkuIwJAG023
+bACFxaOuCeFFepvEms8E8jSHy4gQQhCnCl24v8wLw76SQN7kZSCDNtwLRBFuVNtE
+z3PMonFn2eQPRmGZkwJAP1c1BHprMQx/ruafdscROILv3JrH40C1bR6KVVBKt1dK
+Qpnpgi7hK5rUQjDF8k3bn9ugTt06jyeHe/QhAml0kg==
-----END RSA PRIVATE KEY-----
diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server-cert.pem mysql-5.1.50/mysql-test/std_data/server-cert.pem
--- mysql-5.1.50.orig/mysql-test/std_data/server-cert.pem 2010-08-03 13:55:08.000000000 -0400
+++ mysql-5.1.50/mysql-test/std_data/server-cert.pem 2010-08-27 23:42:05.753428361 -0400
@@ -1,41 +1,69 @@
Certificate:
Data:
- Version: 1 (0x0)
- Serial Number: 1048578 (0x100002)
- Signature Algorithm: md5WithRSAEncryption
+ Version: 3 (0x2)
+ Serial Number: 4 (0x4)
+ Signature Algorithm: sha1WithRSAEncryption
Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB
Validity
- Not Before: Jan 29 11:56:49 2010 GMT
- Not After : Jan 28 11:56:49 2015 GMT
+ Not Before: Feb 20 02:55:06 2010 GMT
+ Not After : Sep 3 02:55:06 2030 GMT
Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=localhost
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- Public-Key: (512 bit)
- Modulus:
- 00:cd:e4:87:51:9d:72:11:a0:d1:fa:f3:92:8b:13:
- 1c:eb:f7:e2:9a:2f:72:a8:d6:65:48:d1:69:af:1b:
- c0:4c:13:e5:60:60:51:41:e9:ab:a6:bc:13:bb:0c:
- 5e:32:7c:d9:6c:9e:cd:05:24:84:78:db:80:91:2e:
- d8:88:2b:c2:ed
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:e3:7d:4f:c2:23:77:a9:3a:2c:d2:69:59:a0:2f:
+ 4e:d1:51:4c:ae:8d:f5:17:cc:ce:58:9c:83:4f:0b:
+ a3:bb:29:a2:b8:1d:3e:1b:04:f9:a9:3e:e2:61:d0:
+ e6:7b:b9:7c:12:d8:1f:86:c9:53:b5:04:dd:df:26:
+ e9:c0:2b:de:4a:96:2e:f3:23:6f:79:6d:a9:d2:4e:
+ 17:af:2f:de:8b:68:44:ae:de:a3:e2:c4:37:1c:04:
+ ad:73:4b:85:f9:83:ac:fe:b7:c1:54:47:2e:96:d4:
+ 31:96:85:94:69:d6:5a:63:24:04:99:89:19:1d:56:
+ 8a:d1:77:aa:87:fb:38:cd:b7
Exponent: 65537 (0x10001)
- Signature Algorithm: md5WithRSAEncryption
- 73:ce:9c:6e:39:46:b4:14:be:da:3f:f3:1b:ba:90:bc:23:43:
- d7:82:2a:70:4e:a6:d9:5a:65:5c:b7:df:71:df:75:77:c5:80:
- a4:af:fa:d2:59:e2:fd:c9:9c:f0:98:95:8e:69:a9:8c:7c:d8:
- 6f:48:d2:e3:36:e0:cd:ff:3f:d1:a5:e6:ab:75:09:c4:50:10:
- c4:96:dd:bf:3b:de:32:46:da:ca:4a:f1:d6:52:8a:33:2f:ab:
- f5:2e:70:3f:d4:9c:be:00:c8:03:f9:39:8a:df:5b:70:3c:40:
- ef:03:be:7c:3d:1d:32:32:f3:51:81:e2:83:30:6e:3d:38:9b:
- fb:3c
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ X509v3 Subject Key Identifier:
+ CC:8C:71:40:D0:0F:BF:D1:99:79:3F:1B:E9:10:76:19:67:36:0F:A3
+ X509v3 Authority Key Identifier:
+ keyid:B1:FB:7E:77:B5:40:8D:68:11:7E:D9:11:E5:C3:C6:DA:4D:AC:51:B0
+ DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB
+ serial:BE:58:AD:4C:1F:3D:25:95
+
+ Signature Algorithm: sha1WithRSAEncryption
+ 6f:ad:5e:59:fa:84:3a:be:e2:72:b1:e8:66:2a:4e:f8:73:19:
+ 11:06:11:92:78:56:3e:d6:e8:68:29:90:8b:59:d2:fe:aa:ae:
+ 25:59:c7:e9:99:bb:4a:06:43:dd:40:bd:cb:f4:ae:79:95:7d:
+ 8e:90:ef:58:d2:a8:fc:bf:07:f3:37:b2:9b:bd:da:e6:8c:56:
+ dd:5e:c6:4a:70:7c:3e:3d:a1:e8:35:06:b8:a7:7b:ac:26:85:
+ 54:5d:09:a2:7b:77:b4:17:7f:72:31:cb:ff:cc:67:6d:e6:3e:
+ c6:dc:96:eb:4a:0a:ae:e9:48:ae:8a:e0:d6:73:57:6e:32:4c:
+ 00:dc:28:da:55:b3:9f:9f:d8:98:cc:d9:f1:b6:b3:14:67:2e:
+ a1:47:1e:51:11:cf:70:9f:31:8f:ba:59:29:f2:d0:88:0b:e2:
+ 51:6b:f8:31:ed:6d:ac:00:5e:d3:78:4c:95:97:02:cc:74:2b:
+ 3b:c6:28:e6:2a:c3:30:99:35:b4:4d:31:46:d4:90:f2:47:ed:
+ 64:85:1a:75:2a:72:0a:2f:c6:3a:2f:d2:ac:6b:31:cc:e5:a8:
+ 07:c2:d6:22:f3:c6:0f:bf:67:d9:d6:b2:79:cd:48:b5:c3:e0:
+ e3:18:7f:b5:74:c9:43:19:fb:c4:93:29:ca:cc:90:2b:1b:6f:
+ 45:f6:25:f9
-----BEGIN CERTIFICATE-----
-MIIBtzCCASACAxAAAjANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJTRTEQMA4G
-A1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwg
-QUIwHhcNMTAwMTI5MTE1NjQ5WhcNMTUwMTI4MTE1NjQ5WjBGMQswCQYDVQQGEwJT
-RTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxEjAQBgNVBAMT
-CWxvY2FsaG9zdDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDN5IdRnXIRoNH685KL
-Exzr9+KaL3Ko1mVI0WmvG8BME+VgYFFB6aumvBO7DF4yfNlsns0FJIR424CRLtiI
-K8LtAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAc86cbjlGtBS+2j/zG7qQvCND14Iq
-cE6m2VplXLffcd91d8WApK/60lni/cmc8JiVjmmpjHzYb0jS4zbgzf8/0aXmq3UJ
-xFAQxJbdvzveMkbaykrx1lKKMy+r9S5wP9ScvgDIA/k5it9bcDxA7wO+fD0dMjLz
-UYHigzBuPTib+zw=
+MIIDJTCCAg2gAwIBAgIBBDANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ
+MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT
+UUwgQUIwHhcNMTAwMjIwMDI1NTA2WhcNMzAwOTAzMDI1NTA2WjBGMQswCQYDVQQG
+EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxEjAQBgNV
+BAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA431PwiN3
+qTos0mlZoC9O0VFMro31F8zOWJyDTwujuymiuB0+GwT5qT7iYdDme7l8EtgfhslT
+tQTd3ybpwCveSpYu8yNveW2p0k4Xry/ei2hErt6j4sQ3HAStc0uF+YOs/rfBVEcu
+ltQxloWUadZaYyQEmYkZHVaK0Xeqh/s4zbcCAwEAAaOBozCBoDAJBgNVHRMEAjAA
+MB0GA1UdDgQWBBTMjHFA0A+/0Zl5PxvpEHYZZzYPozB0BgNVHSMEbTBrgBSx+353
+tUCNaBF+2RHlw8baTaxRsKFIpEYwRDELMAkGA1UEBhMCU0UxEDAOBgNVBAgTB1Vw
+cHNhbGExEDAOBgNVBAcTB1VwcHNhbGExETAPBgNVBAoTCE15U1FMIEFCggkAvlit
+TB89JZUwDQYJKoZIhvcNAQEFBQADggEBAG+tXln6hDq+4nKx6GYqTvhzGREGEZJ4
+Vj7W6GgpkItZ0v6qriVZx+mZu0oGQ91Avcv0rnmVfY6Q71jSqPy/B/M3spu92uaM
+Vt1exkpwfD49oeg1Brine6wmhVRdCaJ7d7QXf3Ixy//MZ23mPsbclutKCq7pSK6K
+4NZzV24yTADcKNpVs5+f2JjM2fG2sxRnLqFHHlERz3CfMY+6WSny0IgL4lFr+DHt
+bawAXtN4TJWXAsx0KzvGKOYqwzCZNbRNMUbUkPJH7WSFGnUqcgovxjov0qxrMczl
+qAfC1iLzxg+/Z9nWsnnNSLXD4OMYf7V0yUMZ+8STKcrMkCsbb0X2Jfk=
-----END CERTIFICATE-----
diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server-key.pem mysql-5.1.50/mysql-test/std_data/server-key.pem
--- mysql-5.1.50.orig/mysql-test/std_data/server-key.pem 2010-08-03 13:55:08.000000000 -0400
+++ mysql-5.1.50/mysql-test/std_data/server-key.pem 2010-08-27 23:42:05.754428433 -0400
@@ -1,9 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
-MIIBOwIBAAJBAM3kh1GdchGg0frzkosTHOv34povcqjWZUjRaa8bwEwT5WBgUUHp
-q6a8E7sMXjJ82WyezQUkhHjbgJEu2Igrwu0CAwEAAQJBAJuwhFbF3NzRpBbEmnqJ
-4GPa1UJMQMLFJF+04tqj/HxJcAIVhOJhGmmtYNw1yjz/ZsPnfJCMz4eFOtdjvGtf
-peECIQDmFFg2WLvYo+2m9w9V7z4ZIkg7ixYkI/ObUUctfZkPOQIhAOUWnrvjFrAX
-bIvYT/YR50+3ZDLEc51XxNgJnWqWYl1VAiEAnTOFWgyivFC1DgF8PvDp8u5TgCt2
-A1d1GMgd490O+TECIC/WMl0/hTxOF9930vKqOGf//o9PUGkZq8QE9fcM4gtlAiAE
-iOcFpnLjtWj57jrhuw214ucnB5rklkQQe+AtcARNkg==
+MIICXgIBAAKBgQDjfU/CI3epOizSaVmgL07RUUyujfUXzM5YnINPC6O7KaK4HT4b
+BPmpPuJh0OZ7uXwS2B+GyVO1BN3fJunAK95Kli7zI295banSThevL96LaESu3qPi
+xDccBK1zS4X5g6z+t8FURy6W1DGWhZRp1lpjJASZiRkdVorRd6qH+zjNtwIDAQAB
+AoGAUb0o91y/FjMs/72S0pes/lDz+JRRSGfyjKxQEgrgndNsADOhqRu0iTdrKDJj
+XnlbN3ooecnFJfnFrvTQcJhSmlS30j6VrBw6LXpCBK3dvjYgJ9LOne7WK+dF1+vS
+FMQtsP04C56Sxy6HJDpMyWJ6oS3Bu169ygG2AxKo+Fk+E6ECQQD38w/MzmrARz2Z
+AGeEPDUnVZPYgtmXkmks95S0/2jSoLhmgpvJimzxwpYwVG/BG8dSDVuTDu5kp05D
+3bZIp3EzAkEA6uAwJsCZPtHXlWU3wYZJsA697rUNjPaCQOIaZ/lnh5RUHTmUiw1h
+Oj/VORqKB0kXqcDfawwLjZEvh1Xli+H5bQJBANTmhw2TvEPnp/OFTl1UGUvyBmXl
+TRMB639qAu07VfVtfYi/4ya1zn/0VmOfTOoigQ5qW9Q1AOu6YNCTQl62L9MCQQDc
+YfEsW2kvNYxYJHoVfuBjbuGuOnn1e1Oqd70ZND59S6NFLMMBWlORaVWzWACNZ3rp
+kAzSj6HDeqgjD2jsQONdAkEAt7S1YHUn8F760bRn4AnAto2TVOYdArtTP/wYjd4o
+9rJREO/d8AYkYJ96APLvF0SZ4n3t1pLwQRsKKN8ZGTmzLA==
-----END RSA PRIVATE KEY-----
diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server8k-cert.pem mysql-5.1.50/mysql-test/std_data/server8k-cert.pem
--- mysql-5.1.50.orig/mysql-test/std_data/server8k-cert.pem 2010-08-03 13:55:08.000000000 -0400
+++ mysql-5.1.50/mysql-test/std_data/server8k-cert.pem 2010-08-27 23:43:00.005366270 -0400
@@ -1,51 +1,69 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 5 (0x5)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB
+ Validity
+ Not Before: Feb 20 03:00:54 2010 GMT
+ Not After : Sep 3 03:00:54 2030 GMT
+ Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=server
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:c5:da:44:95:06:77:16:21:af:a0:c4:3c:e9:f8:
+ 1d:2d:95:f9:63:90:8c:3f:86:ba:77:76:4a:52:4b:
+ 6b:af:29:f5:1c:aa:d4:3f:3e:42:9f:6d:46:ba:86:
+ 90:b1:2d:cc:db:c6:33:15:a3:f4:af:53:33:4f:a1:
+ 56:d1:aa:3b:26:10:f7:64:b5:f9:bf:1b:b1:47:8e:
+ cc:a6:d6:0d:aa:4a:77:e3:a3:63:9d:2a:dc:65:f4:
+ 7f:91:17:38:2d:d6:cd:4e:8d:53:52:97:6e:87:fc:
+ 64:60:a6:a1:00:ac:96:6c:e4:42:94:75:17:46:6f:
+ 91:b5:dd:06:47:ed:05:e3:db
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ X509v3 Subject Key Identifier:
+ 6E:60:3F:29:13:60:99:ED:0C:F7:15:B5:DB:7B:1C:FB:6F:60:19:ED
+ X509v3 Authority Key Identifier:
+ keyid:B1:FB:7E:77:B5:40:8D:68:11:7E:D9:11:E5:C3:C6:DA:4D:AC:51:B0
+ DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB
+ serial:BE:58:AD:4C:1F:3D:25:95
+
+ Signature Algorithm: sha1WithRSAEncryption
+ 63:2e:0f:07:14:06:cf:74:90:3d:37:42:f2:48:70:60:21:bc:
+ 34:52:31:f1:87:70:d2:b2:fb:ff:13:38:dc:f0:5e:43:d7:ee:
+ a7:c7:1f:ac:aa:d2:8c:4f:fa:3c:4c:73:f6:b6:c2:0c:a0:ea:
+ a2:c9:e2:73:61:c3:2e:78:40:0f:2a:d3:63:50:9b:b8:f9:89:
+ 40:ed:98:08:97:c3:07:24:17:34:b5:78:89:0a:bb:83:4c:e2:
+ 5c:2e:13:d6:21:30:ad:30:48:b5:70:12:ff:4a:6f:42:f0:f8:
+ 9f:b1:4b:bd:89:2b:f0:9d:e2:49:2b:35:69:18:1f:76:40:b4:
+ 76:bd:cb:dd:27:2f:c0:c1:e2:33:3e:6e:df:68:54:19:92:8a:
+ bb:13:9c:cf:d6:17:56:da:bf:0d:64:70:3a:45:b7:aa:5f:e3:
+ f5:96:ae:34:f2:17:37:27:d0:4b:e8:30:4a:c0:02:42:e2:d2:
+ 30:eb:eb:c7:d7:ec:d8:df:5c:43:58:e2:6f:b7:58:54:0d:c4:
+ 01:71:2d:59:8f:44:c7:a1:6c:0b:41:28:fa:b7:63:a7:68:d3:
+ 4f:c3:0f:17:9e:b2:32:50:e6:0b:87:3d:e2:39:47:c0:d8:0a:
+ 3b:f6:af:50:68:0f:9d:ef:6e:34:0d:3a:07:94:f8:a4:d7:24:
+ 86:32:d3:b4
-----BEGIN CERTIFICATE-----
-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
-/w8pMRr8gEuRqpL2WdJiKGG6lhMHLVFo
+MIIDIjCCAgqgAwIBAgIBBTANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ
+MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT
+UUwgQUIwHhcNMTAwMjIwMDMwMDU0WhcNMzAwOTAzMDMwMDU0WjBDMQswCQYDVQQG
+EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxDzANBgNV
+BAMTBnNlcnZlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAxdpElQZ3FiGv
+oMQ86fgdLZX5Y5CMP4a6d3ZKUktrryn1HKrUPz5Cn21GuoaQsS3M28YzFaP0r1Mz
+T6FW0ao7JhD3ZLX5vxuxR47MptYNqkp346NjnSrcZfR/kRc4LdbNTo1TUpduh/xk
+YKahAKyWbORClHUXRm+Rtd0GR+0F49sCAwEAAaOBozCBoDAJBgNVHRMEAjAAMB0G
+A1UdDgQWBBRuYD8pE2CZ7Qz3FbXbexz7b2AZ7TB0BgNVHSMEbTBrgBSx+353tUCN
+aBF+2RHlw8baTaxRsKFIpEYwRDELMAkGA1UEBhMCU0UxEDAOBgNVBAgTB1VwcHNh
+bGExEDAOBgNVBAcTB1VwcHNhbGExETAPBgNVBAoTCE15U1FMIEFCggkAvlitTB89
+JZUwDQYJKoZIhvcNAQEFBQADggEBAGMuDwcUBs90kD03QvJIcGAhvDRSMfGHcNKy
++/8TONzwXkPX7qfHH6yq0oxP+jxMc/a2wgyg6qLJ4nNhwy54QA8q02NQm7j5iUDt
+mAiXwwckFzS1eIkKu4NM4lwuE9YhMK0wSLVwEv9Kb0Lw+J+xS72JK/Cd4kkrNWkY
+H3ZAtHa9y90nL8DB4jM+bt9oVBmSirsTnM/WF1bavw1kcDpFt6pf4/WWrjTyFzcn
+0EvoMErAAkLi0jDr68fX7NjfXENY4m+3WFQNxAFxLVmPRMehbAtBKPq3Y6do00/D
+DxeesjJQ5guHPeI5R8DYCjv2r1BoD53vbjQNOgeU+KTXJIYy07Q=
-----END CERTIFICATE-----
diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server8k-key.pem mysql-5.1.50/mysql-test/std_data/server8k-key.pem
--- mysql-5.1.50.orig/mysql-test/std_data/server8k-key.pem 2010-08-03 13:55:08.000000000 -0400
+++ mysql-5.1.50/mysql-test/std_data/server8k-key.pem 2010-08-27 23:43:10.165365998 -0400
@@ -1,99 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
-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
+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
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,33 @@
Improve the documentation that will be installed in the mysql-test RPM.
diff -Naur mysql-5.1.43.orig/mysql-test/README mysql-5.1.43/mysql-test/README
--- mysql-5.1.43.orig/mysql-test/README 2010-01-15 12:14:43.000000000 -0500
+++ mysql-5.1.43/mysql-test/README 2010-02-13 21:18:06.000000000 -0500
@@ -6,6 +6,16 @@
actually have a co-existing MySQL installation. The tests will not
conflict with it.
+For use in Red Hat distributions, you should run the script as user mysql,
+so the best bet is something like
+ cd /usr/share/mysql-test
+ sudo -u mysql ./mysql-test-run
+This will use the installed mysql executables, but will run a private copy
+of the server process (using data files within /usr/share/mysql-test),
+so you need not start the mysqld service beforehand.
+To clean up afterwards, remove the created "var" subdirectory, eg
+ sudo -u mysql rm -rf /usr/share/mysql-test/var
+
All tests must pass. If one or more of them fail on your system, please
read the following manual section for instructions on how to report the
problem:
@@ -25,7 +35,8 @@
With no test cases named on the command line, mysql-test-run falls back
to the normal "non-extern" behavior. The reason for this is that some
-tests cannot run with an external server.
+tests cannot run with an external server (because they need to control the
+options with which the server is started).
You can create your own test cases. To create a test case, create a new

View File

@ -0,0 +1,32 @@
Remove overly optimistic definition of strmov() as stpcpy().
mysql uses this macro with overlapping source and destination strings,
which is verboten per spec, and fails on some Red Hat platforms.
Deleting the definition is sufficient to make it fall back to a
byte-at-a-time copy loop, which should consistently give the
expected behavior.
Note: the particular case that prompted this patch is reported and fixed
at http://bugs.mysql.com/bug.php?id=48864. However, my faith in upstream's
ability to detect this type of error is low, and I also see little evidence
of any real performance gain from optimizing these calls. So I'm keeping
this patch.
diff -Naur mysql-5.1.37.orig/include/m_string.h mysql-5.1.37/include/m_string.h
--- mysql-5.1.37.orig/include/m_string.h 2009-07-13 19:08:50.000000000 -0400
+++ mysql-5.1.37/include/m_string.h 2009-08-31 21:49:49.000000000 -0400
@@ -81,13 +81,6 @@
extern void *(*my_str_malloc)(size_t);
extern void (*my_str_free)(void *);
-#if defined(HAVE_STPCPY)
-#define strmov(A,B) stpcpy((A),(B))
-#ifndef stpcpy
-extern char *stpcpy(char *, const char *); /* For AIX with gcc 2.95.3 */
-#endif
-#endif
-
/* Declared in int2str() */
extern char NEAR _dig_vec_upper[];
extern char NEAR _dig_vec_lower[];

View File

@ -0,0 +1,209 @@
#!/bin/sh
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my.cnf
# pidfile: /var/run/mysqld/mysqld.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
exec="/usr/bin/mysqld_safe"
prog="mysqld"
# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/$prog
# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}
get_mysql_option mysqld datadir "/var/lib/mysql"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld.pid"
mypidfile="$result"
start(){
[ -x $exec ] || exit 5
# check to see if it's already running
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile"
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --datadir="$datadir" --socket="$socketfile" \
--pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` && break
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}
stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile"`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}
restart(){
stop
start
}
condrestart(){
[ -e $lockfile ] && restart || :
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/* Translate call of myself into call of same-named script in LIBDIR */
/* The macro LIBDIR must be defined as a double-quoted string */
int main (int argc, char **argv)
{
char *basename;
char *fullname;
char **newargs;
int i;
basename = strrchr(argv[0], '/');
if (basename)
basename++;
else
basename = argv[0];
fullname = malloc(strlen(LIBDIR) + strlen(basename) + 2);
sprintf(fullname, "%s/%s", LIBDIR, basename);
newargs = malloc((argc+1) * sizeof(char *));
newargs[0] = fullname;
for (i = 1; i < argc; i++)
newargs[i] = argv[i];
newargs[argc] = NULL;
execvp(fullname, newargs);
return 1;
}

View File

@ -450,29 +450,6 @@ else
DATADIR=@localstatedir@ DATADIR=@localstatedir@
fi fi
#
# Try to find the plugin directory
#
# Use user-supplied argument
if [ -n "${PLUGIN_DIR}" ]; then
plugin_dir="${PLUGIN_DIR}"
else
# Try to find plugin dir relative to basedir
for dir in lib/mysql/plugin lib/plugin
do
if [ -d "${MY_BASEDIR_VERSION}/${dir}" ]; then
plugin_dir="${MY_BASEDIR_VERSION}/${dir}"
break
fi
done
# Give up and use compiled-in default
if [ -z "${plugin_dir}" ]; then
plugin_dir='@pkgplugindir@'
fi
fi
plugin_dir="${plugin_dir}${PLUGIN_VARIANT}"
if test -z "$MYSQL_HOME" if test -z "$MYSQL_HOME"
then then
if test -r "$MY_BASEDIR_VERSION/my.cnf" && test -r "$DATADIR/my.cnf" if test -r "$MY_BASEDIR_VERSION/my.cnf" && test -r "$DATADIR/my.cnf"
@ -533,6 +510,31 @@ fi
parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld` parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`
parse_arguments PICK-ARGS-FROM-ARGV "$@" parse_arguments PICK-ARGS-FROM-ARGV "$@"
#
# Try to find the plugin directory
#
# Use user-supplied argument
if [ -n "${PLUGIN_DIR}" ]; then
plugin_dir="${PLUGIN_DIR}"
else
# Try to find plugin dir relative to basedir
for dir in lib/mysql/plugin lib/plugin
do
if [ -d "${MY_BASEDIR_VERSION}/${dir}" ]; then
plugin_dir="${MY_BASEDIR_VERSION}/${dir}"
break
fi
done
# Give up and use compiled-in default
if [ -z "${plugin_dir}" ]; then
plugin_dir='@pkgplugindir@'
fi
fi
plugin_dir="${plugin_dir}${PLUGIN_VARIANT}"
# Determine what logging facility to use # Determine what logging facility to use
# Ensure that 'logger' exists, if it's requested # Ensure that 'logger' exists, if it's requested

View File

@ -295,7 +295,6 @@ IF(WIN32 AND MYSQLD_EXECUTABLE)
COMMAND ${CMAKE_COMMAND} COMMAND ${CMAKE_COMMAND}
${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_initial_db.cmake ${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_initial_db.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep
DEPENDS mysqld DEPENDS mysqld
) )
ADD_CUSTOM_TARGET(initial_database ADD_CUSTOM_TARGET(initial_database

View File

@ -409,7 +409,6 @@ Event_db_repository::index_read_for_db_for_i_s(THD *thd, TABLE *schema_table,
TABLE *event_table, TABLE *event_table,
const char *db) const char *db)
{ {
int ret=0;
CHARSET_INFO *scs= system_charset_info; CHARSET_INFO *scs= system_charset_info;
KEY *key_info; KEY *key_info;
uint key_len; uint key_len;
@ -419,7 +418,14 @@ Event_db_repository::index_read_for_db_for_i_s(THD *thd, TABLE *schema_table,
DBUG_ENTER("Event_db_repository::index_read_for_db_for_i_s"); DBUG_ENTER("Event_db_repository::index_read_for_db_for_i_s");
DBUG_PRINT("info", ("Using prefix scanning on PK")); DBUG_PRINT("info", ("Using prefix scanning on PK"));
event_table->file->ha_index_init(0, 1);
int ret= event_table->file->ha_index_init(0, 1);
if (ret)
{
event_table->file->print_error(ret, MYF(0));
DBUG_RETURN(true);
}
key_info= event_table->key_info; key_info= event_table->key_info;
if (key_info->key_parts == 0 || if (key_info->key_parts == 0 ||

View File

@ -136,6 +136,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
*/ */
memcpy(&table_sort, &table->sort, sizeof(FILESORT_INFO)); memcpy(&table_sort, &table->sort, sizeof(FILESORT_INFO));
table->sort.io_cache= NULL; table->sort.io_cache= NULL;
DBUG_ASSERT(table_sort.record_pointers == NULL);
outfile= table_sort.io_cache; outfile= table_sort.io_cache;
my_b_clear(&tempfile); my_b_clear(&tempfile);
@ -364,6 +365,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
void filesort_free_buffers(TABLE *table, bool full) void filesort_free_buffers(TABLE *table, bool full)
{ {
DBUG_ENTER("filesort_free_buffers");
my_free(table->sort.record_pointers); my_free(table->sort.record_pointers);
table->sort.record_pointers= NULL; table->sort.record_pointers= NULL;
@ -380,6 +382,7 @@ void filesort_free_buffers(TABLE *table, bool full)
my_free(table->sort.addon_field); my_free(table->sort.addon_field);
table->sort.addon_buf= NULL; table->sort.addon_buf= NULL;
table->sort.addon_field= NULL; table->sort.addon_field= NULL;
DBUG_VOID_RETURN;
} }
@ -529,6 +532,8 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
if (!quick_select) if (!quick_select)
{ {
next_pos=(uchar*) 0; /* Find records in sequence */ next_pos=(uchar*) 0; /* Find records in sequence */
DBUG_EXECUTE_IF("bug14365043_1",
DBUG_SET("+d,ha_rnd_init_fail"););
if (file->ha_rnd_init_with_error(1)) if (file->ha_rnd_init_with_error(1))
DBUG_RETURN(HA_POS_ERROR); DBUG_RETURN(HA_POS_ERROR);
file->extra_opt(HA_EXTRA_CACHE, file->extra_opt(HA_EXTRA_CACHE,

View File

@ -2857,6 +2857,17 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
if (bitmap_init(&m_bulk_insert_started, NULL, m_tot_parts + 1, FALSE)) if (bitmap_init(&m_bulk_insert_started, NULL, m_tot_parts + 1, FALSE))
DBUG_RETURN(error); DBUG_RETURN(error);
bitmap_clear_all(&m_bulk_insert_started); bitmap_clear_all(&m_bulk_insert_started);
/*
Initialize the bitmap we use to keep track of partitions which returned
HA_ERR_KEY_NOT_FOUND from index_read_map.
*/
if (bitmap_init(&m_key_not_found_partitions, NULL, m_tot_parts, FALSE))
{
bitmap_free(&m_bulk_insert_started);
DBUG_RETURN(error);
}
bitmap_clear_all(&m_key_not_found_partitions);
m_key_not_found= false;
/* Initialize the bitmap we use to determine what partitions are used */ /* Initialize the bitmap we use to determine what partitions are used */
if (!m_is_clone_of) if (!m_is_clone_of)
{ {
@ -2999,6 +3010,7 @@ err_handler:
(*file)->ha_close(); (*file)->ha_close();
err_alloc: err_alloc:
bitmap_free(&m_bulk_insert_started); bitmap_free(&m_bulk_insert_started);
bitmap_free(&m_key_not_found_partitions);
if (!m_is_clone_of) if (!m_is_clone_of)
bitmap_free(&(m_part_info->used_partitions)); bitmap_free(&(m_part_info->used_partitions));
@ -3075,6 +3087,7 @@ int ha_partition::close(void)
DBUG_ASSERT(table->s == table_share); DBUG_ASSERT(table->s == table_share);
destroy_record_priority_queue(); destroy_record_priority_queue();
bitmap_free(&m_bulk_insert_started); bitmap_free(&m_bulk_insert_started);
bitmap_free(&m_key_not_found_partitions);
if (!m_is_clone_of) if (!m_is_clone_of)
bitmap_free(&(m_part_info->used_partitions)); bitmap_free(&(m_part_info->used_partitions));
file= m_file; file= m_file;
@ -4614,21 +4627,24 @@ int ha_partition::index_read_map(uchar *buf, const uchar *key,
} }
/* /**
Common routine for a number of index_read variants Common routine for a number of index_read variants
SYNOPSIS @param buf Buffer where the record should be returned.
ha_partition::common_index_read() @param have_start_key TRUE <=> the left endpoint is available, i.e.
buf Buffer where the record should be returned we're in index_read call or in read_range_first
have_start_key TRUE <=> the left endpoint is available, i.e. call and the range has left endpoint.
we're in index_read call or in read_range_first FALSE <=> there is no left endpoint (we're in
call and the range has left endpoint read_range_first() call and the range has no left
endpoint).
FALSE <=> there is no left endpoint (we're in
read_range_first() call and the range has no left
endpoint)
DESCRIPTION @return Operation status
@retval 0 OK
@retval HA_ERR_END_OF_FILE Whole index scanned, without finding the record.
@retval HA_ERR_KEY_NOT_FOUND Record not found, but index cursor positioned.
@retval other error code.
@details
Start scanning the range (when invoked from read_range_first()) or doing Start scanning the range (when invoked from read_range_first()) or doing
an index lookup (when invoked from index_read_XXX): an index lookup (when invoked from index_read_XXX):
- If possible, perform partition selection - If possible, perform partition selection
@ -4638,10 +4654,6 @@ int ha_partition::index_read_map(uchar *buf, const uchar *key,
handle_unordered_scan_next_partition) handle_unordered_scan_next_partition)
YES: Fill the priority queue and get the record that is the first in YES: Fill the priority queue and get the record that is the first in
the ordering the ordering
RETURN
0 OK
other HA_ERR_END_OF_FILE or other error code.
*/ */
int ha_partition::common_index_read(uchar *buf, bool have_start_key) int ha_partition::common_index_read(uchar *buf, bool have_start_key)
@ -4651,14 +4663,16 @@ int ha_partition::common_index_read(uchar *buf, bool have_start_key)
bool reverse_order= FALSE; bool reverse_order= FALSE;
DBUG_ENTER("ha_partition::common_index_read"); DBUG_ENTER("ha_partition::common_index_read");
DBUG_PRINT("info", ("m_ordered: %u have_start_key: %u", DBUG_PRINT("info", ("m_ordered %u m_ordered_scan_ong %u",
m_ordered, have_start_key)); m_ordered, m_ordered_scan_ongoing));
if (have_start_key) if (have_start_key)
{ {
m_start_key.length= key_len= calculate_key_len(table, active_index, m_start_key.length= key_len= calculate_key_len(table, active_index,
m_start_key.key, m_start_key.key,
m_start_key.keypart_map); m_start_key.keypart_map);
DBUG_PRINT("info", ("have_start_key map %lu find_flag %u len %u",
m_start_key.keypart_map, m_start_key.flag, key_len));
DBUG_ASSERT(key_len); DBUG_ASSERT(key_len);
} }
if ((error= partition_scan_set_up(buf, have_start_key))) if ((error= partition_scan_set_up(buf, have_start_key)))
@ -4676,24 +4690,16 @@ int ha_partition::common_index_read(uchar *buf, bool have_start_key)
} }
DBUG_PRINT("info", ("m_ordered %u m_o_scan_ong %u have_start_key %u", DBUG_PRINT("info", ("m_ordered %u m_o_scan_ong %u have_start_key %u",
m_ordered, m_ordered_scan_ongoing, have_start_key)); m_ordered, m_ordered_scan_ongoing, have_start_key));
if (!m_ordered_scan_ongoing || if (!m_ordered_scan_ongoing)
(have_start_key && m_start_key.flag == HA_READ_KEY_EXACT &&
!m_pkey_is_clustered &&
key_len >= m_curr_key_info[0]->key_length))
{ {
/* /*
We use unordered index scan either when read_range is used and flag We use unordered index scan when read_range is used and flag
is set to not use ordered or when an exact key is used and in this is set to not use ordered.
case all records will be sorted equal and thus the sort order of the
resulting records doesn't matter.
We also use an unordered index scan when the number of partitions to We also use an unordered index scan when the number of partitions to
scan is only one. scan is only one.
The unordered index scan will use the partition set created. The unordered index scan will use the partition set created.
Need to set unordered scan ongoing since we can come here even when
it isn't set.
*/ */
DBUG_PRINT("info", ("doing unordered scan")); DBUG_PRINT("info", ("doing unordered scan"));
m_ordered_scan_ongoing= FALSE;
error= handle_unordered_scan_next_partition(buf); error= handle_unordered_scan_next_partition(buf);
} }
else else
@ -4874,6 +4880,8 @@ int ha_partition::index_next(uchar * buf)
TODO(low priority): TODO(low priority):
If we want partition to work with the HANDLER commands, we If we want partition to work with the HANDLER commands, we
must be able to do index_last() -> index_prev() -> index_next() must be able to do index_last() -> index_prev() -> index_next()
and if direction changes, we must step back those partitions in
the record queue so we don't return a value from the wrong direction.
*/ */
DBUG_ASSERT(m_index_scan_type != partition_index_last); DBUG_ASSERT(m_index_scan_type != partition_index_last);
if (!m_ordered_scan_ongoing) if (!m_ordered_scan_ongoing)
@ -5127,10 +5135,18 @@ int ha_partition::partition_scan_set_up(uchar * buf, bool idx_read_flag)
int ha_partition::handle_unordered_next(uchar *buf, bool is_next_same) int ha_partition::handle_unordered_next(uchar *buf, bool is_next_same)
{ {
handler *file= m_file[m_part_spec.start_part]; handler *file;
int error; int error;
DBUG_ENTER("ha_partition::handle_unordered_next"); DBUG_ENTER("ha_partition::handle_unordered_next");
if (m_part_spec.start_part >= m_tot_parts)
{
/* Should never happen! */
DBUG_ASSERT(0);
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
file= m_file[m_part_spec.start_part];
/* /*
We should consider if this should be split into three functions as We should consider if this should be split into three functions as
partition_read_range is_next_same are always local constants partition_read_range is_next_same are always local constants
@ -5191,6 +5207,7 @@ int ha_partition::handle_unordered_next(uchar *buf, bool is_next_same)
int ha_partition::handle_unordered_scan_next_partition(uchar * buf) int ha_partition::handle_unordered_scan_next_partition(uchar * buf)
{ {
uint i; uint i;
int saved_error= HA_ERR_END_OF_FILE;
DBUG_ENTER("ha_partition::handle_unordered_scan_next_partition"); DBUG_ENTER("ha_partition::handle_unordered_scan_next_partition");
for (i= m_part_spec.start_part; i <= m_part_spec.end_part; i++) for (i= m_part_spec.start_part; i <= m_part_spec.end_part; i++)
@ -5241,26 +5258,33 @@ int ha_partition::handle_unordered_scan_next_partition(uchar * buf)
} }
if ((error != HA_ERR_END_OF_FILE) && (error != HA_ERR_KEY_NOT_FOUND)) if ((error != HA_ERR_END_OF_FILE) && (error != HA_ERR_KEY_NOT_FOUND))
DBUG_RETURN(error); DBUG_RETURN(error);
DBUG_PRINT("info", ("HA_ERR_END_OF_FILE on partition %d", i));
/*
If HA_ERR_KEY_NOT_FOUND, we must return that error instead of
HA_ERR_END_OF_FILE, to be able to continue search.
*/
if (saved_error != HA_ERR_KEY_NOT_FOUND)
saved_error= error;
DBUG_PRINT("info", ("END_OF_FILE/KEY_NOT_FOUND on partition %d", i));
} }
m_part_spec.start_part= NO_CURRENT_PART_ID; if (saved_error == HA_ERR_END_OF_FILE)
DBUG_RETURN(HA_ERR_END_OF_FILE); m_part_spec.start_part= NO_CURRENT_PART_ID;
DBUG_RETURN(saved_error);
} }
/* /**
Common routine to start index scan with ordered results Common routine to start index scan with ordered results.
SYNOPSIS @param[out] buf Read row in MySQL Row Format
handle_ordered_index_scan()
out:buf Read row in MySQL Row Format
RETURN VALUE @return Operation status
HA_ERR_END_OF_FILE End of scan @retval HA_ERR_END_OF_FILE End of scan
0 Success @retval HA_ERR_KEY_NOT_FOUNE End of scan
other Error code @retval 0 Success
@retval other Error code
DESCRIPTION @details
This part contains the logic to handle index scans that require ordered This part contains the logic to handle index scans that require ordered
output. This includes all except those started by read_range_first with output. This includes all except those started by read_range_first with
the flag ordered set to FALSE. Thus most direct index_read and all the flag ordered set to FALSE. Thus most direct index_read and all
@ -5282,8 +5306,14 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
uint j= queue_first_element(&m_queue); uint j= queue_first_element(&m_queue);
bool found= FALSE; bool found= FALSE;
uchar *part_rec_buf_ptr= m_ordered_rec_buffer; uchar *part_rec_buf_ptr= m_ordered_rec_buffer;
int saved_error= HA_ERR_END_OF_FILE;
DBUG_ENTER("ha_partition::handle_ordered_index_scan"); DBUG_ENTER("ha_partition::handle_ordered_index_scan");
if (m_key_not_found)
{
m_key_not_found= false;
bitmap_clear_all(&m_key_not_found_partitions);
}
m_top_entry= NO_CURRENT_PART_ID; m_top_entry= NO_CURRENT_PART_ID;
queue_remove_all(&m_queue); queue_remove_all(&m_queue);
@ -5345,6 +5375,13 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
{ {
DBUG_RETURN(error); DBUG_RETURN(error);
} }
else if (error == HA_ERR_KEY_NOT_FOUND)
{
DBUG_PRINT("info", ("HA_ERR_KEY_NOT_FOUND from partition %u", i));
bitmap_set_bit(&m_key_not_found_partitions, i);
m_key_not_found= true;
saved_error= error;
}
part_rec_buf_ptr+= m_rec_length + PARTITION_BYTES_IN_POS; part_rec_buf_ptr+= m_rec_length + PARTITION_BYTES_IN_POS;
} }
if (found) if (found)
@ -5362,7 +5399,7 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
DBUG_PRINT("info", ("Record returned from partition %d", m_top_entry)); DBUG_PRINT("info", ("Record returned from partition %d", m_top_entry));
DBUG_RETURN(0); DBUG_RETURN(0);
} }
DBUG_RETURN(HA_ERR_END_OF_FILE); DBUG_RETURN(saved_error);
} }
@ -5390,6 +5427,59 @@ void ha_partition::return_top_record(uchar *buf)
} }
/**
Add index_next/prev from partitions without exact match.
If there where any partitions that returned HA_ERR_KEY_NOT_FOUND when
ha_index_read_map was done, those partitions must be included in the
following index_next/prev call.
*/
int ha_partition::handle_ordered_index_scan_key_not_found()
{
int error;
uint i;
uchar *part_buf= m_ordered_rec_buffer;
uchar *curr_rec_buf= NULL;
DBUG_ENTER("ha_partition::handle_ordered_index_scan_key_not_found");
DBUG_ASSERT(m_key_not_found);
/*
Loop over all used partitions to get the correct offset
into m_ordered_rec_buffer.
*/
for (i= 0; i < m_tot_parts; i++)
{
if (!bitmap_is_set(&m_part_info->used_partitions, i))
continue;
if (bitmap_is_set(&m_key_not_found_partitions, i))
{
/*
This partition is used and did return HA_ERR_KEY_NOT_FOUND
in index_read_map.
*/
curr_rec_buf= part_buf + PARTITION_BYTES_IN_POS;
error= m_file[i]->index_next(curr_rec_buf);
/* HA_ERR_KEY_NOT_FOUND is not allowed from index_next! */
DBUG_ASSERT(error != HA_ERR_KEY_NOT_FOUND);
if (!error)
queue_insert(&m_queue, part_buf);
else if (error != HA_ERR_END_OF_FILE && error != HA_ERR_KEY_NOT_FOUND)
DBUG_RETURN(error);
}
part_buf+= m_rec_length + PARTITION_BYTES_IN_POS;
}
DBUG_ASSERT(curr_rec_buf);
bitmap_clear_all(&m_key_not_found_partitions);
m_key_not_found= false;
/* Update m_top_entry, which may have changed. */
uchar *key_buffer= queue_top(&m_queue);
m_top_entry= uint2korr(key_buffer);
DBUG_RETURN(0);
}
/* /*
Common routine to handle index_next with ordered results Common routine to handle index_next with ordered results
@ -5409,9 +5499,45 @@ int ha_partition::handle_ordered_next(uchar *buf, bool is_next_same)
int error; int error;
uint part_id= m_top_entry; uint part_id= m_top_entry;
uchar *rec_buf= queue_top(&m_queue) + PARTITION_BYTES_IN_POS; uchar *rec_buf= queue_top(&m_queue) + PARTITION_BYTES_IN_POS;
handler *file= m_file[part_id]; handler *file;
DBUG_ENTER("ha_partition::handle_ordered_next"); DBUG_ENTER("ha_partition::handle_ordered_next");
if (m_key_not_found)
{
if (is_next_same)
{
/* Only rows which match the key. */
m_key_not_found= false;
bitmap_clear_all(&m_key_not_found_partitions);
}
else
{
/* There are partitions not included in the index record queue. */
uint old_elements= m_queue.elements;
if ((error= handle_ordered_index_scan_key_not_found()))
DBUG_RETURN(error);
/*
If the queue top changed, i.e. one of the partitions that gave
HA_ERR_KEY_NOT_FOUND in index_read_map found the next record,
return it.
Otherwise replace the old with a call to index_next (fall through).
*/
if (old_elements != m_queue.elements && part_id != m_top_entry)
{
return_top_record(buf);
DBUG_RETURN(0);
}
}
}
if (part_id >= m_tot_parts)
{
/* This should never happen! */
DBUG_ASSERT(0);
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
file= m_file[part_id];
if (m_index_scan_type == partition_read_range) if (m_index_scan_type == partition_read_range)
{ {
error= file->read_range_next(); error= file->read_range_next();

View File

@ -182,6 +182,9 @@ private:
static int compare_number_of_records(ha_partition *me, static int compare_number_of_records(ha_partition *me,
const uint32 *a, const uint32 *a,
const uint32 *b); const uint32 *b);
/** partitions that returned HA_ERR_KEY_NOT_FOUND. */
MY_BITMAP m_key_not_found_partitions;
bool m_key_not_found;
public: public:
handler *clone(const char *name, MEM_ROOT *mem_root); handler *clone(const char *name, MEM_ROOT *mem_root);
virtual void set_part_info(partition_info *part_info) virtual void set_part_info(partition_info *part_info)
@ -516,6 +519,7 @@ private:
int handle_unordered_next(uchar * buf, bool next_same); int handle_unordered_next(uchar * buf, bool next_same);
int handle_unordered_scan_next_partition(uchar * buf); int handle_unordered_scan_next_partition(uchar * buf);
int handle_ordered_index_scan(uchar * buf, bool reverse_order); int handle_ordered_index_scan(uchar * buf, bool reverse_order);
int handle_ordered_index_scan_key_not_found();
int handle_ordered_next(uchar * buf, bool next_same); int handle_ordered_next(uchar * buf, bool next_same);
int handle_ordered_prev(uchar * buf); int handle_ordered_prev(uchar * buf);
void return_top_record(uchar * buf); void return_top_record(uchar * buf);

View File

@ -2334,18 +2334,25 @@ int handler::read_first_row(uchar * buf, uint primary_key)
if (stats.deleted < 10 || primary_key >= MAX_KEY || if (stats.deleted < 10 || primary_key >= MAX_KEY ||
!(index_flags(primary_key, 0, 0) & HA_READ_ORDER)) !(index_flags(primary_key, 0, 0) & HA_READ_ORDER))
{ {
if ((!(error= ha_rnd_init(1)))) if (!(error= ha_rnd_init(1)))
{ {
while ((error= ha_rnd_next(buf)) == HA_ERR_RECORD_DELETED) ; while ((error= ha_rnd_next(buf)) == HA_ERR_RECORD_DELETED)
(void) ha_rnd_end(); /* skip deleted row */;
const int end_error= ha_rnd_end();
if (!error)
error= end_error;
} }
} }
else else
{ {
/* Find the first row through the primary key */ /* Find the first row through the primary key */
if (!(error = ha_index_init(primary_key, 0))) if (!(error= ha_index_init(primary_key, 0)))
{
error= ha_index_first(buf); error= ha_index_first(buf);
(void) ha_index_end(); const int end_error= ha_index_end();
if (!error)
error= end_error;
}
} }
DBUG_RETURN(error); DBUG_RETURN(error);
} }
@ -2744,7 +2751,15 @@ void handler::get_auto_increment(ulonglong offset, ulonglong increment,
table->mark_columns_used_by_index_no_reset(table->s->next_number_index, table->mark_columns_used_by_index_no_reset(table->s->next_number_index,
table->read_set); table->read_set);
column_bitmaps_signal(); column_bitmaps_signal();
ha_index_init(table->s->next_number_index, 1);
if (ha_index_init(table->s->next_number_index, 1))
{
/* This should never happen, assert in debug, and fail in release build */
DBUG_ASSERT(0);
*first_value= ULONGLONG_MAX;
return;
}
if (table->s->next_number_keypart == 0) if (table->s->next_number_keypart == 0)
{ // Autoincrement at key-start { // Autoincrement at key-start
error=ha_index_last(table->record[1]); error=ha_index_last(table->record[1]);
@ -2775,13 +2790,25 @@ void handler::get_auto_increment(ulonglong offset, ulonglong increment,
} }
if (error) if (error)
nr=1; {
if (error == HA_ERR_END_OF_FILE || error == HA_ERR_KEY_NOT_FOUND)
{
/* No entry found, start with 1. */
nr= 1;
}
else
{
DBUG_ASSERT(0);
nr= ULONGLONG_MAX;
}
}
else else
nr= ((ulonglong) table->next_number_field-> nr= ((ulonglong) table->next_number_field->
val_int_offset(table->s->rec_buff_length)+1); val_int_offset(table->s->rec_buff_length)+1);
ha_index_end(); ha_index_end();
(void) extra(HA_EXTRA_NO_KEYREAD); (void) extra(HA_EXTRA_NO_KEYREAD);
*first_value= nr; *first_value= nr;
return;
} }

View File

@ -1843,6 +1843,7 @@ public:
int ha_open(TABLE *table, const char *name, int mode, uint test_if_locked); int ha_open(TABLE *table, const char *name, int mode, uint test_if_locked);
int ha_index_init(uint idx, bool sorted) int ha_index_init(uint idx, bool sorted)
{ {
DBUG_EXECUTE_IF("ha_index_init_fail", return HA_ERR_TABLE_DEF_CHANGED;);
int result; int result;
DBUG_ENTER("ha_index_init"); DBUG_ENTER("ha_index_init");
DBUG_ASSERT(inited==NONE); DBUG_ASSERT(inited==NONE);
@ -1867,6 +1868,7 @@ public:
virtual int prepare_index_scan() { return 0; } virtual int prepare_index_scan() { return 0; }
int ha_rnd_init(bool scan) __attribute__ ((warn_unused_result)) int ha_rnd_init(bool scan) __attribute__ ((warn_unused_result))
{ {
DBUG_EXECUTE_IF("ha_rnd_init_fail", return HA_ERR_TABLE_DEF_CHANGED;);
int result; int result;
DBUG_ENTER("ha_rnd_init"); DBUG_ENTER("ha_rnd_init");
DBUG_ASSERT(inited==NONE || (inited==RND && scan)); DBUG_ASSERT(inited==NONE || (inited==RND && scan));
@ -2748,7 +2750,7 @@ private:
*/ */
virtual int open(const char *name, int mode, uint test_if_locked)=0; virtual int open(const char *name, int mode, uint test_if_locked)=0;
/* Note: ha_index_read_idx_map() may buypass index_init() */ /* Note: ha_index_read_idx_map() may bypass index_init() */
virtual int index_init(uint idx, bool sorted) { return 0; } virtual int index_init(uint idx, bool sorted) { return 0; }
virtual int index_end() { return 0; } virtual int index_end() { return 0; }
/** /**

View File

@ -367,6 +367,14 @@ bool ip_to_hostname(struct sockaddr_storage *ip_storage,
err_code= vio_getnameinfo(ip, hostname_buffer, NI_MAXHOST, NULL, 0, err_code= vio_getnameinfo(ip, hostname_buffer, NI_MAXHOST, NULL, 0,
NI_NAMEREQD); NI_NAMEREQD);
/* BEGIN : DEBUG */
DBUG_EXECUTE_IF("addr_fake_ipv4",
{
strcpy(hostname_buffer, "santa.claus.ipv4.example.com");
err_code= 0;
};);
/* END : DEBUG */
if (err_code) if (err_code)
{ {
// NOTE: gai_strerror() returns a string ending by a dot. // NOTE: gai_strerror() returns a string ending by a dot.
@ -439,6 +447,12 @@ bool ip_to_hostname(struct sockaddr_storage *ip_storage,
DBUG_RETURN(err_status); DBUG_RETURN(err_status);
} }
/*
To avoid crashing the server in DBUG_EXECUTE_IF,
Define a variable which depicts state of addr_info_list.
*/
bool free_addr_info_list= false;
/* Get IP-addresses for the resolved host name (FCrDNS technique). */ /* Get IP-addresses for the resolved host name (FCrDNS technique). */
struct addrinfo hints; struct addrinfo hints;
@ -453,6 +467,42 @@ bool ip_to_hostname(struct sockaddr_storage *ip_storage,
(const char *) hostname_buffer)); (const char *) hostname_buffer));
err_code= getaddrinfo(hostname_buffer, NULL, &hints, &addr_info_list); err_code= getaddrinfo(hostname_buffer, NULL, &hints, &addr_info_list);
if (err_code == 0)
free_addr_info_list= true;
/* BEGIN : DEBUG */
DBUG_EXECUTE_IF("addr_fake_ipv4",
{
if (free_addr_info_list)
freeaddrinfo(addr_info_list);
struct sockaddr_in *debug_addr;
static struct sockaddr_in debug_sock_addr[2];
static struct addrinfo debug_addr_info[2];
/* Simulating ipv4 192.0.2.5 */
debug_addr= & debug_sock_addr[0];
debug_addr->sin_family= AF_INET;
debug_addr->sin_addr.s_addr= inet_addr("192.0.2.5");
/* Simulating ipv4 192.0.2.4 */
debug_addr= & debug_sock_addr[1];
debug_addr->sin_family= AF_INET;
debug_addr->sin_addr.s_addr= inet_addr("192.0.2.4");
debug_addr_info[0].ai_addr= (struct sockaddr*) & debug_sock_addr[0];
debug_addr_info[0].ai_addrlen= sizeof (struct sockaddr_in);
debug_addr_info[0].ai_next= & debug_addr_info[1];
debug_addr_info[1].ai_addr= (struct sockaddr*) & debug_sock_addr[1];
debug_addr_info[1].ai_addrlen= sizeof (struct sockaddr_in);
debug_addr_info[1].ai_next= NULL;
addr_info_list= & debug_addr_info[0];
err_code= 0;
free_addr_info_list= false;
};);
/* END : DEBUG */
if (err_code == EAI_NONAME) if (err_code == EAI_NONAME)
{ {
@ -505,7 +555,8 @@ bool ip_to_hostname(struct sockaddr_storage *ip_storage,
{ {
DBUG_PRINT("error", ("Out of memory.")); DBUG_PRINT("error", ("Out of memory."));
freeaddrinfo(addr_info_list); if (free_addr_info_list)
freeaddrinfo(addr_info_list);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
@ -539,7 +590,8 @@ bool ip_to_hostname(struct sockaddr_storage *ip_storage,
/* Free the result of getaddrinfo(). */ /* Free the result of getaddrinfo(). */
freeaddrinfo(addr_info_list); if (free_addr_info_list)
freeaddrinfo(addr_info_list);
/* Add an entry for the IP to the cache. */ /* Add an entry for the IP to the cache. */

View File

@ -3258,11 +3258,14 @@ int subselect_uniquesubquery_engine::scan_table()
TABLE *table= tab->table; TABLE *table= tab->table;
DBUG_ENTER("subselect_uniquesubquery_engine::scan_table"); DBUG_ENTER("subselect_uniquesubquery_engine::scan_table");
if (table->file->inited) if ((table->file->inited &&
table->file->ha_index_end(); (error= table->file->ha_index_end())) ||
(error= table->file->ha_rnd_init(1)))
if (table->file->ha_rnd_init_with_error(1)) {
DBUG_RETURN(1); (void) report_error(table, error);
DBUG_RETURN(true);
}
table->file->extra_opt(HA_EXTRA_CACHE, table->file->extra_opt(HA_EXTRA_CACHE,
current_thd->variables.read_buff_size); current_thd->variables.read_buff_size);
table->null_row= 0; table->null_row= 0;
@ -3398,8 +3401,13 @@ int subselect_uniquesubquery_engine::exec()
DBUG_RETURN(0); DBUG_RETURN(0);
} }
if (!table->file->inited) if (!table->file->inited &&
table->file->ha_index_init(tab->ref.key, 0); (error= table->file->ha_index_init(tab->ref.key, 0)))
{
(void) report_error(table, error);
DBUG_RETURN(true);
}
error= table->file->ha_index_read_map(table->record[0], error= table->file->ha_index_read_map(table->record[0],
tab->ref.key_buff, tab->ref.key_buff,
make_prev_keypart_map(tab-> make_prev_keypart_map(tab->
@ -3563,8 +3571,13 @@ int subselect_indexsubquery_engine::exec()
DBUG_RETURN(0); DBUG_RETURN(0);
} }
if (!table->file->inited) if (!table->file->inited &&
table->file->ha_index_init(tab->ref.key, 1); (error= table->file->ha_index_init(tab->ref.key, 1)))
{
(void) report_error(table, error);
DBUG_RETURN(true);
}
error= table->file->ha_index_read_map(table->record[0], error= table->file->ha_index_read_map(table->record[0],
tab->ref.key_buff, tab->ref.key_buff,
make_prev_keypart_map(tab-> make_prev_keypart_map(tab->

View File

@ -725,7 +725,10 @@ static int find_and_fetch_row(TABLE *table, uchar *key)
int error; int error;
/* We have a key: search the table using the index */ /* We have a key: search the table using the index */
if (!table->file->inited && (error= table->file->ha_index_init(0, FALSE))) if (!table->file->inited && (error= table->file->ha_index_init(0, FALSE)))
{
table->file->print_error(error, MYF(0));
DBUG_RETURN(error); DBUG_RETURN(error);
}
/* /*
Don't print debug messages when running valgrind since they can Don't print debug messages when running valgrind since they can
@ -858,7 +861,7 @@ static int find_and_fetch_row(TABLE *table, uchar *key)
default: default:
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
DBUG_PRINT("info", ("Record not found")); DBUG_PRINT("info", ("Record not found"));
table->file->ha_rnd_end(); (void) table->file->ha_rnd_end();
DBUG_RETURN(error); DBUG_RETURN(error);
} }
} }
@ -2428,7 +2431,7 @@ int Old_rows_log_event::find_row(const Relay_log_info *rli)
continue; continue;
DBUG_PRINT("info",("no record matching the given row found")); DBUG_PRINT("info",("no record matching the given row found"));
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
table->file->ha_index_end(); (void) table->file->ha_index_end();
DBUG_RETURN(error); DBUG_RETURN(error);
} }
} }

View File

@ -117,6 +117,7 @@
#include "records.h" // init_read_record, end_read_record #include "records.h" // init_read_record, end_read_record
#include <m_ctype.h> #include <m_ctype.h>
#include "sql_select.h" #include "sql_select.h"
#include "filesort.h" // filesort_free_buffers
#ifndef EXTRA_DEBUG #ifndef EXTRA_DEBUG
#define test_rb_tree(A,B) {} #define test_rb_tree(A,B) {}
@ -1892,7 +1893,8 @@ int QUICK_INDEX_SORT_SELECT::init()
int QUICK_INDEX_SORT_SELECT::reset() int QUICK_INDEX_SORT_SELECT::reset()
{ {
DBUG_ENTER("QUICK_INDEX_SORT_SELECT::reset"); DBUG_ENTER("QUICK_INDEX_SORT_SELECT::reset");
DBUG_RETURN(read_keys_and_merge()); const int retval= read_keys_and_merge();
DBUG_RETURN(retval);
} }
bool bool
@ -2138,8 +2140,9 @@ int QUICK_ROR_INTERSECT_SELECT::init_ror_merged_scan(bool reuse_handler)
There is no use of this->file. Use it for the first of merged range There is no use of this->file. Use it for the first of merged range
selects. selects.
*/ */
if (quick->init_ror_merged_scan(TRUE)) int error= quick->init_ror_merged_scan(TRUE);
DBUG_RETURN(1); if (error)
DBUG_RETURN(error);
quick->file->extra(HA_EXTRA_KEYREAD_PRESERVE_FIELDS); quick->file->extra(HA_EXTRA_KEYREAD_PRESERVE_FIELDS);
} }
while ((cur= quick_it++)) while ((cur= quick_it++))
@ -2322,8 +2325,8 @@ int QUICK_ROR_UNION_SELECT::reset()
List_iterator_fast<QUICK_SELECT_I> it(quick_selects); List_iterator_fast<QUICK_SELECT_I> it(quick_selects);
while ((quick= it++)) while ((quick= it++))
{ {
if (quick->reset()) if ((error= quick->reset()))
DBUG_RETURN(1); DBUG_RETURN(error);
if ((error= quick->get_next())) if ((error= quick->get_next()))
{ {
if (error == HA_ERR_END_OF_FILE) if (error == HA_ERR_END_OF_FILE)
@ -2334,10 +2337,10 @@ int QUICK_ROR_UNION_SELECT::reset()
queue_insert(&queue, (uchar*)quick); queue_insert(&queue, (uchar*)quick);
} }
if (head->file->ha_rnd_init_with_error(1)) if ((error= head->file->ha_rnd_init(1)))
{ {
DBUG_PRINT("error", ("ROR index_merge rnd_init call failed")); DBUG_PRINT("error", ("ROR index_merge rnd_init call failed"));
DBUG_RETURN(1); DBUG_RETURN(error);
} }
DBUG_RETURN(0); DBUG_RETURN(0);
@ -10604,7 +10607,10 @@ int read_keys_and_merge_scans(THD *thd,
*unique_ptr= unique; *unique_ptr= unique;
} }
else else
{
unique->reset(); unique->reset();
filesort_free_buffers(head, false);
}
DBUG_ASSERT(file->ref_length == unique->get_size()); DBUG_ASSERT(file->ref_length == unique->get_size());
DBUG_ASSERT(thd->variables.sortbuff_size == unique->get_max_in_memory_size()); DBUG_ASSERT(thd->variables.sortbuff_size == unique->get_max_in_memory_size());
@ -10763,6 +10769,13 @@ int QUICK_INDEX_INTERSECT_SELECT::get_next()
If a Clustered PK scan is present, it is used only to check if row If a Clustered PK scan is present, it is used only to check if row
satisfies its condition (and never used for row retrieval). satisfies its condition (and never used for row retrieval).
Locking: to ensure that exclusive locks are only set on records that
are included in the final result we must release the lock
on all rows we read but do not include in the final result. This
must be done on each index that reads the record and the lock
must be released using the same handler (the same quick object) as
used when reading the record.
RETURN RETURN
0 - Ok 0 - Ok
other - Error code if any error occurred. other - Error code if any error occurred.
@ -10773,6 +10786,12 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
List_iterator_fast<QUICK_SELECT_WITH_RECORD> quick_it(quick_selects); List_iterator_fast<QUICK_SELECT_WITH_RECORD> quick_it(quick_selects);
QUICK_SELECT_WITH_RECORD *qr; QUICK_SELECT_WITH_RECORD *qr;
QUICK_RANGE_SELECT* quick; QUICK_RANGE_SELECT* quick;
/* quick that reads the given rowid first. This is needed in order
to be able to unlock the row using the same handler object that locked
it */
QUICK_RANGE_SELECT* quick_with_last_rowid;
int error, cmp; int error, cmp;
uint last_rowid_count=0; uint last_rowid_count=0;
DBUG_ENTER("QUICK_ROR_INTERSECT_SELECT::get_next"); DBUG_ENTER("QUICK_ROR_INTERSECT_SELECT::get_next");
@ -10786,7 +10805,10 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
if (cpk_quick) if (cpk_quick)
{ {
while (!error && !cpk_quick->row_in_ranges()) while (!error && !cpk_quick->row_in_ranges())
{
quick->file->unlock_row(); /* row not in range; unlock */
error= quick->get_next(); error= quick->get_next();
}
} }
if (error) if (error)
DBUG_RETURN(error); DBUG_RETURN(error);
@ -10798,6 +10820,7 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
quick->file->position(quick->record); quick->file->position(quick->record);
memcpy(last_rowid, quick->file->ref, head->file->ref_length); memcpy(last_rowid, quick->file->ref, head->file->ref_length);
last_rowid_count= 1; last_rowid_count= 1;
quick_with_last_rowid= quick;
while (last_rowid_count < quick_selects.elements) while (last_rowid_count < quick_selects.elements)
{ {
@ -10811,9 +10834,17 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
do do
{ {
if ((error= quick->get_next())) if ((error= quick->get_next()))
{
quick_with_last_rowid->file->unlock_row();
DBUG_RETURN(error); DBUG_RETURN(error);
}
quick->file->position(quick->record); quick->file->position(quick->record);
cmp= head->file->cmp_ref(quick->file->ref, last_rowid); cmp= head->file->cmp_ref(quick->file->ref, last_rowid);
if (cmp < 0)
{
/* This row is being skipped. Release lock on it. */
quick->file->unlock_row();
}
} while (cmp < 0); } while (cmp < 0);
key_copy(qr->key_tuple, record, head->key_info + quick->index, key_copy(qr->key_tuple, record, head->key_info + quick->index,
@ -10827,13 +10858,19 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
{ {
while (!cpk_quick->row_in_ranges()) while (!cpk_quick->row_in_ranges())
{ {
quick->file->unlock_row(); /* row not in range; unlock */
if ((error= quick->get_next())) if ((error= quick->get_next()))
{
quick_with_last_rowid->file->unlock_row();
DBUG_RETURN(error); DBUG_RETURN(error);
}
} }
quick->file->position(quick->record); quick->file->position(quick->record);
} }
memcpy(last_rowid, quick->file->ref, head->file->ref_length); memcpy(last_rowid, quick->file->ref, head->file->ref_length);
quick_with_last_rowid->file->unlock_row();
last_rowid_count= 1; last_rowid_count= 1;
quick_with_last_rowid= quick;
//save the fields here //save the fields here
key_copy(qr->key_tuple, record, head->key_info + quick->index, key_copy(qr->key_tuple, record, head->key_info + quick->index,
@ -10956,8 +10993,14 @@ int QUICK_RANGE_SELECT::reset()
{ {
if (in_ror_merged_scan) if (in_ror_merged_scan)
head->column_bitmaps_set_no_signal(&column_bitmap, &column_bitmap); head->column_bitmaps_set_no_signal(&column_bitmap, &column_bitmap);
DBUG_EXECUTE_IF("bug14365043_2",
DBUG_SET("+d,ha_index_init_fail"););
if ((error= file->ha_index_init(index,1))) if ((error= file->ha_index_init(index,1)))
{
file->print_error(error, MYF(0));
DBUG_RETURN(error); DBUG_RETURN(error);
}
} }
/* Allocate buffer if we need one but haven't allocated it yet */ /* Allocate buffer if we need one but haven't allocated it yet */
@ -13161,7 +13204,10 @@ int QUICK_GROUP_MIN_MAX_SELECT::reset(void)
head->enable_keyread(); /* We need only the key attributes */ head->enable_keyread(); /* We need only the key attributes */
} }
if ((result= file->ha_index_init(index,1))) if ((result= file->ha_index_init(index,1)))
{
head->file->print_error(result, MYF(0));
DBUG_RETURN(result); DBUG_RETURN(result);
}
if (quick_prefix_select && quick_prefix_select->reset()) if (quick_prefix_select && quick_prefix_select->reset())
DBUG_RETURN(1); DBUG_RETURN(1);
result= file->ha_index_last(record); result= file->ha_index_last(record);

View File

@ -68,6 +68,7 @@ static int rr_index_desc(READ_RECORD *info);
void init_read_record_idx(READ_RECORD *info, THD *thd, TABLE *table, void init_read_record_idx(READ_RECORD *info, THD *thd, TABLE *table,
bool print_error, uint idx, bool reverse) bool print_error, uint idx, bool reverse)
{ {
int error;
empty_record(table); empty_record(table);
bzero((char*) info,sizeof(*info)); bzero((char*) info,sizeof(*info));
info->thd= thd; info->thd= thd;
@ -77,8 +78,13 @@ void init_read_record_idx(READ_RECORD *info, THD *thd, TABLE *table,
info->unlock_row= rr_unlock_row; info->unlock_row= rr_unlock_row;
table->status=0; /* And it's always found */ table->status=0; /* And it's always found */
if (!table->file->inited) if (!table->file->inited &&
table->file->ha_index_init(idx, 1); (error= table->file->ha_index_init(idx, 1)))
{
if (print_error)
table->file->print_error(error, MYF(0));
}
/* read_record will be changed to rr_index in rr_index_first */ /* read_record will be changed to rr_index in rr_index_first */
info->read_record= reverse ? rr_index_last : rr_index_first; info->read_record= reverse ? rr_index_last : rr_index_first;
} }

View File

@ -1452,7 +1452,6 @@ bool lock_db_routines(THD *thd, char *db)
{ {
TABLE *table; TABLE *table;
uint key_len; uint key_len;
int nxtres= 0;
Open_tables_backup open_tables_state_backup; Open_tables_backup open_tables_state_backup;
MDL_request_list mdl_requests; MDL_request_list mdl_requests;
Lock_db_routines_error_handler err_handler; Lock_db_routines_error_handler err_handler;
@ -1480,7 +1479,13 @@ bool lock_db_routines(THD *thd, char *db)
table->field[MYSQL_PROC_FIELD_DB]->store(db, strlen(db), system_charset_info); table->field[MYSQL_PROC_FIELD_DB]->store(db, strlen(db), system_charset_info);
key_len= table->key_info->key_part[0].store_length; key_len= table->key_info->key_part[0].store_length;
table->field[MYSQL_PROC_FIELD_DB]->get_key_image(keybuf, key_len, Field::itRAW); table->field[MYSQL_PROC_FIELD_DB]->get_key_image(keybuf, key_len, Field::itRAW);
table->file->ha_index_init(0, 1); int nxtres= table->file->ha_index_init(0, 1);
if (nxtres)
{
table->file->print_error(nxtres, MYF(0));
close_system_tables(thd, &open_tables_state_backup);
DBUG_RETURN(true);
}
if (! table->file->ha_index_read_map(table->record[0], keybuf, (key_part_map)1, if (! table->file->ha_index_read_map(table->record[0], keybuf, (key_part_map)1,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
@ -1543,7 +1548,11 @@ sp_drop_db_routines(THD *thd, char *db)
table->field[MYSQL_PROC_FIELD_DB]->get_key_image(keybuf, key_len, Field::itRAW); table->field[MYSQL_PROC_FIELD_DB]->get_key_image(keybuf, key_len, Field::itRAW);
ret= SP_OK; ret= SP_OK;
table->file->ha_index_init(0, 1); if (table->file->ha_index_init(0, 1))
{
ret= SP_KEY_NOT_FOUND;
goto err_idx_init;
}
if (!table->file->ha_index_read_map(table->record[0], keybuf, (key_part_map)1, if (!table->file->ha_index_read_map(table->record[0], keybuf, (key_part_map)1,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
{ {
@ -1569,6 +1578,7 @@ sp_drop_db_routines(THD *thd, char *db)
} }
table->file->ha_index_end(); table->file->ha_index_end();
err_idx_init:
close_thread_tables(thd); close_thread_tables(thd);
/* /*
Make sure to only release the MDL lock on mysql.proc, not other Make sure to only release the MDL lock on mysql.proc, not other

View File

@ -4110,9 +4110,9 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check)
(and therefore should not be prelocked). Otherwise we will erroneously (and therefore should not be prelocked). Otherwise we will erroneously
treat table with same name but with different alias as non-temporary. treat table with same name but with different alias as non-temporary.
*/ */
if ((tab= (SP_TABLE *)my_hash_search(&m_sptabs, (uchar *)tname.ptr(), if ((tab= (SP_TABLE*) my_hash_search(&m_sptabs, (uchar *)tname.ptr(),
tname.length())) || tname.length())) ||
((tab= (SP_TABLE *)my_hash_search(&m_sptabs, (uchar *)tname.ptr(), ((tab= (SP_TABLE*) my_hash_search(&m_sptabs, (uchar *)tname.ptr(),
temp_table_key_length)) && temp_table_key_length)) &&
tab->temp)) tab->temp))
{ {

View File

@ -67,19 +67,15 @@ sp_rcontext::~sp_rcontext()
bool sp_rcontext::init(THD *thd) bool sp_rcontext::init(THD *thd)
{ {
uint handler_count= m_root_parsing_ctx->max_handler_index(); uint handler_count= m_root_parsing_ctx->max_handler_index();
uint i;
in_sub_stmt= thd->in_sub_stmt; in_sub_stmt= thd->in_sub_stmt;
if (init_var_table(thd) || init_var_items()) if (init_var_table(thd) || init_var_items())
return TRUE; return TRUE;
if (!(m_raised_conditions= new (thd->mem_root) MYSQL_ERROR[handler_count])) if (!(m_raised_conditions= new (thd->mem_root) Sql_condition_info[handler_count]))
return TRUE; return TRUE;
for (i= 0; i<handler_count; i++)
m_raised_conditions[i].init(thd->mem_root);
return return
!(m_handler= !(m_handler=
(sp_handler_t*)thd->alloc(handler_count * sizeof(sp_handler_t))) || (sp_handler_t*)thd->alloc(handler_count * sizeof(sp_handler_t))) ||
@ -446,13 +442,12 @@ sp_rcontext::exit_handler()
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
MYSQL_ERROR* Sql_condition_info* sp_rcontext::raised_condition() const
sp_rcontext::raised_condition() const
{ {
if (m_ihsp > 0) if (m_ihsp > 0)
{ {
uint hindex= m_in_handler[m_ihsp - 1].index; uint hindex= m_in_handler[m_ihsp - 1].index;
MYSQL_ERROR *raised= & m_raised_conditions[hindex]; Sql_condition_info *raised= & m_raised_conditions[hindex];
return raised; return raised;
} }

View File

@ -58,6 +58,46 @@ typedef struct
uint index; uint index;
} sp_active_handler_t; } sp_active_handler_t;
class Sql_condition_info : public Sql_alloc
{
public:
/** SQL error code. */
uint m_sql_errno;
/** Error level. */
MYSQL_ERROR::enum_warning_level m_level;
/** SQLSTATE. */
char m_sql_state[SQLSTATE_LENGTH + 1];
/** Text message. */
char m_message[MYSQL_ERRMSG_SIZE];
void set(uint sql_errno, const char* sqlstate,
MYSQL_ERROR::enum_warning_level level,
const char* msg)
{
m_sql_errno= sql_errno;
m_level= level;
memcpy(m_sql_state, sqlstate, SQLSTATE_LENGTH);
m_sql_state[SQLSTATE_LENGTH]= '\0';
strncpy(m_message, msg, MYSQL_ERRMSG_SIZE);
}
void clear()
{
m_sql_errno= 0;
m_level= MYSQL_ERROR::WARN_LEVEL_ERROR;
m_sql_state[0]= '\0';
m_message[0]= '\0';
}
};
/* /*
This class is a runtime context of a Stored Routine. It is used in an This class is a runtime context of a Stored Routine. It is used in an
execution and is intended to contain all dynamic objects (i.e. objects, which execution and is intended to contain all dynamic objects (i.e. objects, which
@ -146,8 +186,7 @@ class sp_rcontext : public Sql_alloc
MYSQL_ERROR::enum_warning_level level, MYSQL_ERROR::enum_warning_level level,
const char *msg); const char *msg);
MYSQL_ERROR * Sql_condition_info *raised_condition() const;
raised_condition() const;
void void
push_hstack(uint h); push_hstack(uint h);
@ -232,7 +271,7 @@ private:
SQL conditions caught by each handler. SQL conditions caught by each handler.
This is an array indexed by handler index. This is an array indexed by handler index.
*/ */
MYSQL_ERROR *m_raised_conditions; Sql_condition_info *m_raised_conditions;
uint m_hcount; // Stack pointer for m_handler uint m_hcount; // Stack pointer for m_handler
uint *m_hstack; // Return stack for continue handlers uint *m_hstack; // Return stack for continue handlers

View File

@ -50,6 +50,7 @@
#include "sql_connect.h" #include "sql_connect.h"
#include "hostname.h" #include "hostname.h"
#include "sql_db.h" #include "sql_db.h"
#include "sql_array.h"
bool mysql_user_table_is_in_short_password_format= false; bool mysql_user_table_is_in_short_password_format= false;
@ -570,8 +571,9 @@ enum enum_acl_lists
COLUMN_PRIVILEGES_HASH, COLUMN_PRIVILEGES_HASH,
PROC_PRIVILEGES_HASH, PROC_PRIVILEGES_HASH,
FUNC_PRIVILEGES_HASH, FUNC_PRIVILEGES_HASH,
ACL_PROXY_USERS PROXY_USERS_ACL
}; };
/* /*
Convert scrambled password to binary form, according to scramble type, Convert scrambled password to binary form, according to scramble type,
Binary form is stored in user.salt. Binary form is stored in user.salt.
@ -2722,7 +2724,13 @@ replace_proxies_priv_table(THD *thd, TABLE *table, const LEX_USER *user,
get_grantor(thd, grantor); get_grantor(thd, grantor);
table->file->ha_index_init(0, 1); if ((error= table->file->ha_index_init(0, 1)))
{
table->file->print_error(error, MYF(0));
DBUG_PRINT("info", ("ha_index_init error"));
DBUG_RETURN(-1);
}
if (table->file->ha_index_read_map(table->record[0], user_key, if (table->file->ha_index_read_map(table->record[0], user_key,
HA_WHOLE_KEY, HA_WHOLE_KEY,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
@ -2964,7 +2972,12 @@ GRANT_TABLE::GRANT_TABLE(TABLE *form, TABLE *col_privs)
key_copy(key, col_privs->record[0], col_privs->key_info, key_prefix_len); key_copy(key, col_privs->record[0], col_privs->key_info, key_prefix_len);
col_privs->field[4]->store("",0, &my_charset_latin1); col_privs->field[4]->store("",0, &my_charset_latin1);
col_privs->file->ha_index_init(0, 1); if (col_privs->file->ha_index_init(0, 1))
{
cols= 0;
return;
}
if (col_privs->file->ha_index_read_map(col_privs->record[0], (uchar*) key, if (col_privs->file->ha_index_read_map(col_privs->record[0], (uchar*) key,
(key_part_map)15, (key_part_map)15,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
@ -3104,7 +3117,7 @@ static int replace_column_table(GRANT_TABLE *g_t,
const char *db, const char *table_name, const char *db, const char *table_name,
ulong rights, bool revoke_grant) ulong rights, bool revoke_grant)
{ {
int error=0,result=0; int result=0;
uchar key[MAX_KEY_LENGTH]; uchar key[MAX_KEY_LENGTH];
uint key_prefix_length; uint key_prefix_length;
KEY_PART_INFO *key_part= table->key_info->key_part; KEY_PART_INFO *key_part= table->key_info->key_part;
@ -3131,7 +3144,13 @@ static int replace_column_table(GRANT_TABLE *g_t,
List_iterator <LEX_COLUMN> iter(columns); List_iterator <LEX_COLUMN> iter(columns);
class LEX_COLUMN *column; class LEX_COLUMN *column;
table->file->ha_index_init(0, 1); int error= table->file->ha_index_init(0, 1);
if (error)
{
table->file->print_error(error, MYF(0));
DBUG_RETURN(-1);
}
while ((column= iter++)) while ((column= iter++))
{ {
ulong privileges= column->rights; ulong privileges= column->rights;
@ -4257,7 +4276,10 @@ static my_bool grant_load_procs_priv(TABLE *p_table)
(void) my_hash_init(&func_priv_hash, &my_charset_utf8_bin, (void) my_hash_init(&func_priv_hash, &my_charset_utf8_bin,
0,0,0, (my_hash_get_key) get_grant_table, 0,0,0, (my_hash_get_key) get_grant_table,
0,0); 0,0);
p_table->file->ha_index_init(0, 1);
if (p_table->file->ha_index_init(0, 1))
DBUG_RETURN(TRUE);
p_table->use_all_columns(); p_table->use_all_columns();
if (!p_table->file->ha_index_first(p_table->record[0])) if (!p_table->file->ha_index_first(p_table->record[0]))
@ -4358,7 +4380,10 @@ static my_bool grant_load(THD *thd, TABLE_LIST *tables)
t_table = tables[0].table; t_table = tables[0].table;
c_table = tables[1].table; c_table = tables[1].table;
t_table->file->ha_index_init(0, 1);
if (t_table->file->ha_index_init(0, 1))
goto end_index_init;
t_table->use_all_columns(); t_table->use_all_columns();
c_table->use_all_columns(); c_table->use_all_columns();
@ -4403,9 +4428,10 @@ static my_bool grant_load(THD *thd, TABLE_LIST *tables)
return_val=0; // Return ok return_val=0; // Return ok
end_unlock: end_unlock:
thd->variables.sql_mode= old_sql_mode;
t_table->file->ha_index_end(); t_table->file->ha_index_end();
my_pthread_setspecific_ptr(THR_MALLOC, save_mem_root_ptr); my_pthread_setspecific_ptr(THR_MALLOC, save_mem_root_ptr);
end_index_init:
thd->variables.sql_mode= old_sql_mode;
DBUG_RETURN(return_val); DBUG_RETURN(return_val);
} }
@ -6098,11 +6124,10 @@ static int handle_grant_table(TABLE_LIST *tables, uint table_no, bool drop,
2 COLUMN_PRIVILEGES_HASH 2 COLUMN_PRIVILEGES_HASH
3 PROC_PRIVILEGES_HASH 3 PROC_PRIVILEGES_HASH
4 FUNC_PRIVILEGES_HASH 4 FUNC_PRIVILEGES_HASH
5 ACL_PROXY_USERS 5 PROXY_USERS_ACL
@retval > 0 At least one element matched. @retval > 0 At least one element matched.
@retval 0 OK, but no element matched. @retval 0 OK, but no element matched.
@retval -1 Wrong arguments to function or Out of Memory
*/ */
static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop, static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
@ -6147,10 +6172,11 @@ static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
grant_name_hash= &func_priv_hash; grant_name_hash= &func_priv_hash;
elements= grant_name_hash->records; elements= grant_name_hash->records;
break; break;
case 5: case PROXY_USERS_ACL:
elements= acl_proxy_users.elements; elements= acl_proxy_users.elements;
break; break;
default: default:
DBUG_ASSERT(0);
return -1; return -1;
} }
@ -6185,7 +6211,7 @@ static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
host= grant_name->host.hostname; host= grant_name->host.hostname;
break; break;
case 5: case PROXY_USERS_ACL:
acl_proxy_user= dynamic_element(&acl_proxy_users, idx, ACL_PROXY_USER*); acl_proxy_user= dynamic_element(&acl_proxy_users, idx, ACL_PROXY_USER*);
user= acl_proxy_user->get_user(); user= acl_proxy_user->get_user();
host= acl_proxy_user->get_host(); host= acl_proxy_user->get_host();
@ -6225,7 +6251,7 @@ static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
my_hash_delete(grant_name_hash, (uchar*) grant_name); my_hash_delete(grant_name_hash, (uchar*) grant_name);
break; break;
case 5: case PROXY_USERS_ACL:
delete_dynamic_element(&acl_proxy_users, idx); delete_dynamic_element(&acl_proxy_users, idx);
break; break;
@ -6297,11 +6323,10 @@ static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
break; break;
} }
case 5: case PROXY_USERS_ACL:
acl_proxy_user->set_user (&mem, user_to->user.str); acl_proxy_user->set_user (&mem, user_to->user.str);
acl_proxy_user->set_host (&mem, user_to->host.str); acl_proxy_user->set_host (&mem, user_to->host.str);
break; break;
} }
} }
else else
@ -6448,7 +6473,7 @@ static int handle_grant_data(TABLE_LIST *tables, bool drop,
/* Handle proxies_priv table. */ /* Handle proxies_priv table. */
if (tables[5].table) if (tables[5].table)
{ {
if ((found= handle_grant_table(tables, ACL_PROXY_USERS, drop, user_from, user_to)) < 0) if ((found= handle_grant_table(tables, 5, drop, user_from, user_to)) < 0)
{ {
/* Handle of table failed, don't touch the in-memory array. */ /* Handle of table failed, don't touch the in-memory array. */
result= -1; result= -1;
@ -6456,7 +6481,7 @@ static int handle_grant_data(TABLE_LIST *tables, bool drop,
else else
{ {
/* Handle proxies_priv array. */ /* Handle proxies_priv array. */
if ((handle_grant_struct(ACL_PROXY_USERS, drop, user_from, user_to) && !result) || if ((handle_grant_struct(PROXY_USERS_ACL, drop, user_from, user_to) && !result) ||
found) found)
result= 1; /* At least one record/element found. */ result= 1; /* At least one record/element found. */
} }
@ -7278,14 +7303,25 @@ acl_check_proxy_grant_access(THD *thd, const char *host, const char *user,
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
/* one can grant proxy to himself to others */ /*
if (!strcmp(thd->security_ctx->user, user) && one can grant proxy for self to others.
Security context in THD contains two pairs of (user,host):
1. (user,host) pair referring to inbound connection.
2. (priv_user,priv_host) pair obtained from mysql.user table after doing
authnetication of incoming connection.
Privileges should be checked wrt (priv_user, priv_host) tuple, because
(user,host) pair obtained from inbound connection may have different
values than what is actually stored in mysql.user table and while granting
or revoking proxy privilege, user is expected to provide entries mentioned
in mysql.user table.
*/
if (!strcmp(thd->security_ctx->priv_user, user) &&
!my_strcasecmp(system_charset_info, host, !my_strcasecmp(system_charset_info, host,
thd->security_ctx->host)) thd->security_ctx->priv_host))
{ {
DBUG_PRINT("info", ("strcmp (%s, %s) my_casestrcmp (%s, %s) equal", DBUG_PRINT("info", ("strcmp (%s, %s) my_casestrcmp (%s, %s) equal",
thd->security_ctx->user, user, thd->security_ctx->priv_user, user,
host, thd->security_ctx->host)); host, thd->security_ctx->priv_host));
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }

View File

@ -846,14 +846,14 @@ retry:
case RFIRST: case RFIRST:
if (keyname) if (keyname)
{ {
table->file->ha_index_or_rnd_end(); if (!(error= table->file->ha_index_or_rnd_end()) &&
table->file->ha_index_init(keyno, 1); !(error= table->file->ha_index_init(keyno, 1)))
error= table->file->ha_index_first(table->record[0]); error= table->file->ha_index_first(table->record[0]);
} }
else else
{ {
table->file->ha_index_or_rnd_end(); if (!(error= table->file->ha_index_or_rnd_end()) &&
if (!(error= table->file->ha_rnd_init(1))) !(error= table->file->ha_rnd_init(1)))
error= table->file->ha_rnd_next(table->record[0]); error= table->file->ha_rnd_next(table->record[0]);
} }
mode= RNEXT; mode= RNEXT;
@ -872,10 +872,10 @@ retry:
/* else fall through */ /* else fall through */
case RLAST: case RLAST:
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
table->file->ha_index_or_rnd_end(); if (!(error= table->file->ha_index_or_rnd_end()) &&
table->file->ha_index_init(keyno, 1); !(error= table->file->ha_index_init(keyno, 1)))
error= table->file->ha_index_last(table->record[0]); error= table->file->ha_index_last(table->record[0]);
mode= RPREV; mode=RPREV;
break; break;
case RNEXT_SAME: case RNEXT_SAME:
/* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */ /* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */
@ -889,13 +889,14 @@ retry:
if (!(key= (uchar*) thd->calloc(ALIGN_SIZE(handler->key_len)))) if (!(key= (uchar*) thd->calloc(ALIGN_SIZE(handler->key_len))))
goto err; goto err;
table->file->ha_index_or_rnd_end(); if ((error= table->file->ha_index_or_rnd_end()))
table->file->ha_index_init(keyno, 1); break;
key_copy(key, table->record[0], table->key_info + keyno, key_copy(key, table->record[0], table->key_info + keyno,
handler->key_len); handler->key_len);
error= table->file->ha_index_read_map(table->record[0], if (!(error= table->file->ha_index_init(keyno, 1)))
key, handler->keypart_map, error= table->file->ha_index_read_map(table->record[0],
ha_rkey_mode); key, handler->keypart_map,
ha_rkey_mode);
mode= rkey_to_rnext[(int)ha_rkey_mode]; mode= rkey_to_rnext[(int)ha_rkey_mode];
break; break;
} }

View File

@ -303,8 +303,14 @@ int get_topics_for_keyword(THD *thd, TABLE *topics, TABLE *relations,
rtopic_id= find_fields[help_relation_help_topic_id].field; rtopic_id= find_fields[help_relation_help_topic_id].field;
rkey_id= find_fields[help_relation_help_keyword_id].field; rkey_id= find_fields[help_relation_help_keyword_id].field;
topics->file->ha_index_init(iindex_topic,1); if (topics->file->ha_index_init(iindex_topic,1) ||
relations->file->ha_index_init(iindex_relations,1); relations->file->ha_index_init(iindex_relations,1))
{
if (topics->file->inited)
topics->file->ha_index_end();
my_message(ER_CORRUPT_HELP_DB, ER(ER_CORRUPT_HELP_DB), MYF(0));
DBUG_RETURN(-1);
}
rkey_id->store((longlong) key_id, TRUE); rkey_id->store((longlong) key_id, TRUE);
rkey_id->get_key_image(buff, rkey_id->pack_length(), Field::itRAW); rkey_id->get_key_image(buff, rkey_id->pack_length(), Field::itRAW);

View File

@ -6121,8 +6121,13 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
ptr->next_name_resolution_table= NULL; ptr->next_name_resolution_table= NULL;
/* Link table in global list (all used tables) */ /* Link table in global list (all used tables) */
lex->add_to_query_tables(ptr); lex->add_to_query_tables(ptr);
ptr->mdl_request.init(MDL_key::TABLE, ptr->db, ptr->table_name, mdl_type,
MDL_TRANSACTION); // Pure table aliases do not need to be locked:
if (!test(table_options & TL_OPTION_ALIAS))
{
ptr->mdl_request.init(MDL_key::TABLE, ptr->db, ptr->table_name, mdl_type,
MDL_TRANSACTION);
}
DBUG_RETURN(ptr); DBUG_RETURN(ptr);
} }

View File

@ -10610,7 +10610,6 @@ void JOIN::cleanup(bool full)
filesort_free_buffers(first_tab->table, full); filesort_free_buffers(first_tab->table, full);
} }
} }
if (full) if (full)
{ {
JOIN_TAB *sort_tab= first_linear_tab(this, WITHOUT_CONST_TABLES); JOIN_TAB *sort_tab= first_linear_tab(this, WITHOUT_CONST_TABLES);
@ -15721,11 +15720,11 @@ do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure)
if (table->group && join->tmp_table_param.sum_func_count && if (table->group && join->tmp_table_param.sum_func_count &&
table->s->keys && !table->file->inited) table->s->keys && !table->file->inited)
{ {
int tmp_error; rc= table->file->ha_index_init(0, 0);
if ((tmp_error= table->file->ha_index_init(0, 0))) if (rc)
{ {
table->file->print_error(tmp_error, MYF(0)); /* purecov: inspected */ table->file->print_error(rc, MYF(0));
DBUG_RETURN(-1); /* purecov: inspected */ DBUG_RETURN(-1);
} }
} }
} }
@ -16751,7 +16750,12 @@ int join_read_key2(THD *thd, JOIN_TAB *tab, TABLE *table, TABLE_REF *table_ref)
int error; int error;
if (!table->file->inited) if (!table->file->inited)
{ {
table->file->ha_index_init(table_ref->key, (tab ? tab->sorted : TRUE)); error= table->file->ha_index_init(table_ref->key, tab ? tab->sorted : TRUE);
if (error)
{
(void) report_error(table, error);
return 1;
}
} }
/* TODO: Why don't we do "Late NULLs Filtering" here? */ /* TODO: Why don't we do "Late NULLs Filtering" here? */
@ -16842,8 +16846,8 @@ join_read_always_key(JOIN_TAB *tab)
{ {
if ((error= table->file->ha_index_init(tab->ref.key, tab->sorted))) if ((error= table->file->ha_index_init(tab->ref.key, tab->sorted)))
{ {
table->file->print_error(error, MYF(0));/* purecov: inspected */ (void) report_error(table, error);
return(1); /* purecov: inspected */ return 1;
} }
} }
@ -16873,14 +16877,13 @@ join_read_last_key(JOIN_TAB *tab)
int error; int error;
TABLE *table= tab->table; TABLE *table= tab->table;
if (!table->file->inited) if (!table->file->inited &&
(error= table->file->ha_index_init(tab->ref.key, tab->sorted)))
{ {
if ((error= table->file->ha_index_init(tab->ref.key, tab->sorted))) (void) report_error(table, error);
{ return 1;
table->file->print_error(error, MYF(0));/* purecov: inspected */
return(1); /* purecov: inspected */
}
} }
if (cp_buffer_from_ref(tab->join->thd, table, &tab->ref)) if (cp_buffer_from_ref(tab->join->thd, table, &tab->ref))
return -1; return -1;
if ((error= table->file->ha_index_read_map(table->record[0], if ((error= table->file->ha_index_read_map(table->record[0],
@ -17091,9 +17094,10 @@ join_ft_read_first(JOIN_TAB *tab)
if (!table->file->inited && if (!table->file->inited &&
(error= table->file->ha_index_init(tab->ref.key, 1))) (error= table->file->ha_index_init(tab->ref.key, 1)))
{ {
table->file->print_error(error, MYF(0)); /* purecov: inspected */ (void) report_error(table, error);
return(1); /* purecov: inspected */ return 1;
} }
table->file->ft_init(); table->file->ft_init();
if ((error= table->file->ha_ft_read(table->record[0]))) if ((error= table->file->ha_ft_read(table->record[0])))
@ -17498,9 +17502,10 @@ end_update(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
/* Change method to update rows */ /* Change method to update rows */
if ((error= table->file->ha_index_init(0, 0))) if ((error= table->file->ha_index_init(0, 0)))
{ {
table->file->print_error(error, MYF(0));/* purecov: inspected */ table->file->print_error(error, MYF(0));
DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ DBUG_RETURN(NESTED_LOOP_ERROR);
} }
join->join_tab[join->top_join_tab_count-1].next_select=end_unique_update; join->join_tab[join->top_join_tab_count-1].next_select=end_unique_update;
} }
join->send_records++; join->send_records++;

View File

@ -5668,7 +5668,13 @@ int fill_schema_proc(THD *thd, TABLE_LIST *tables, COND *cond)
{ {
DBUG_RETURN(1); DBUG_RETURN(1);
} }
proc_table->file->ha_index_init(0, 1);
if (proc_table->file->ha_index_init(0, 1))
{
res= 1;
goto err;
}
if ((res= proc_table->file->ha_index_first(proc_table->record[0]))) if ((res= proc_table->file->ha_index_first(proc_table->record[0])))
{ {
res= (res == HA_ERR_END_OF_FILE) ? 0 : 1; res= (res == HA_ERR_END_OF_FILE) ? 0 : 1;
@ -5694,7 +5700,9 @@ int fill_schema_proc(THD *thd, TABLE_LIST *tables, COND *cond)
} }
err: err:
proc_table->file->ha_index_end(); if (proc_table->file->inited)
(void) proc_table->file->ha_index_end();
close_system_tables(thd, &open_tables_state_backup); close_system_tables(thd, &open_tables_state_backup);
DBUG_RETURN(res); DBUG_RETURN(res);
} }

View File

@ -479,7 +479,7 @@ bool Signal_statement::execute(THD *thd)
bool Resignal_statement::execute(THD *thd) bool Resignal_statement::execute(THD *thd)
{ {
MYSQL_ERROR *signaled; Sql_condition_info *signaled;
int result= TRUE; int result= TRUE;
DBUG_ENTER("Resignal_statement::execute"); DBUG_ENTER("Resignal_statement::execute");
@ -492,15 +492,21 @@ bool Resignal_statement::execute(THD *thd)
DBUG_RETURN(result); DBUG_RETURN(result);
} }
MYSQL_ERROR signaled_err(thd->mem_root);
signaled_err.set(signaled->m_sql_errno,
signaled->m_sql_state,
signaled->m_level,
signaled->m_message);
if (m_cond == NULL) if (m_cond == NULL)
{ {
/* RESIGNAL without signal_value */ /* RESIGNAL without signal_value */
result= raise_condition(thd, signaled); result= raise_condition(thd, &signaled_err);
DBUG_RETURN(result); DBUG_RETURN(result);
} }
/* RESIGNAL with signal_value */ /* RESIGNAL with signal_value */
result= raise_condition(thd, signaled); result= raise_condition(thd, &signaled_err);
DBUG_RETURN(result); DBUG_RETURN(result);
} }

View File

@ -24,7 +24,7 @@
#include "sql_acl.h" // DROP_ACL #include "sql_acl.h" // DROP_ACL
#include "sql_parse.h" // check_one_table_access() #include "sql_parse.h" // check_one_table_access()
#include "sql_truncate.h" #include "sql_truncate.h"
#include "sql_show.h" #include "sql_show.h" //append_identifier()
/** /**

View File

@ -2241,11 +2241,16 @@ err:
} }
err2: err2:
(void) table->file->ha_rnd_end(); if (table->file->inited)
(void) tmp_table->file->ha_rnd_end(); (void) table->file->ha_rnd_end();
if (tmp_table->file->inited)
(void) tmp_table->file->ha_rnd_end();
check_opt_it.rewind(); check_opt_it.rewind();
while (TABLE *tbl= check_opt_it++) while (TABLE *tbl= check_opt_it++)
tbl->file->ha_rnd_end(); {
if (tbl->file->inited)
(void) tbl->file->ha_rnd_end();
}
if (updated != org_updated) if (updated != org_updated)
{ {

View File

@ -11454,11 +11454,19 @@ show_param:
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command= SQLCOM_SHOW_AUTHORS; lex->sql_command= SQLCOM_SHOW_AUTHORS;
push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT,
ER(ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT),
"SHOW AUTHORS");
} }
| CONTRIBUTORS_SYM | CONTRIBUTORS_SYM
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS;
push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT,
ER(ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT),
"SHOW CONTRIBUTORS");
} }
| PRIVILEGES | PRIVILEGES
{ {

View File

@ -1718,14 +1718,11 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
} }
table= tz_tables[0].table; table= tz_tables[0].table;
/*
It is OK to ignore ha_index_init()/ha_index_end() return values since
mysql.time_zone* tables are MyISAM and these operations always succeed
for MyISAM.
*/
(void)table->file->ha_index_init(0, 1);
table->use_all_columns();
if (table->file->ha_index_init(0, 1))
goto end_with_close;
table->use_all_columns();
tz_leapcnt= 0; tz_leapcnt= 0;
res= table->file->ha_index_first(table->record[0]); res= table->file->ha_index_first(table->record[0]);
@ -1913,12 +1910,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
tz_tables= tz_tables->next_local; tz_tables= tz_tables->next_local;
table->field[0]->store(tz_name->ptr(), tz_name->length(), table->field[0]->store(tz_name->ptr(), tz_name->length(),
&my_charset_latin1); &my_charset_latin1);
/* if (table->file->ha_index_init(0, 1))
It is OK to ignore ha_index_init()/ha_index_end() return values since goto end;
mysql.time_zone* tables are MyISAM and these operations always succeed
for MyISAM.
*/
(void)table->file->ha_index_init(0, 1);
if (table->file->ha_index_read_map(table->record[0], table->field[0]->ptr, if (table->file->ha_index_read_map(table->record[0], table->field[0]->ptr,
HA_WHOLE_KEY, HA_READ_KEY_EXACT)) HA_WHOLE_KEY, HA_READ_KEY_EXACT))
@ -1951,7 +1944,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
field->get_key_image(keybuff, field->get_key_image(keybuff,
min(field->key_length(), sizeof(keybuff)), min(field->key_length(), sizeof(keybuff)),
Field::itRAW); Field::itRAW);
(void)table->file->ha_index_init(0, 1); if (table->file->ha_index_init(0, 1))
goto end;
if (table->file->ha_index_read_map(table->record[0], keybuff, if (table->file->ha_index_read_map(table->record[0], keybuff,
HA_WHOLE_KEY, HA_READ_KEY_EXACT)) HA_WHOLE_KEY, HA_READ_KEY_EXACT))
@ -1983,7 +1977,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
field->get_key_image(keybuff, field->get_key_image(keybuff,
min(field->key_length(), sizeof(keybuff)), min(field->key_length(), sizeof(keybuff)),
Field::itRAW); Field::itRAW);
(void)table->file->ha_index_init(0, 1); if (table->file->ha_index_init(0, 1))
goto end;
res= table->file->ha_index_read_map(table->record[0], keybuff, res= table->file->ha_index_read_map(table->record[0], keybuff,
(key_part_map)1, HA_READ_KEY_EXACT); (key_part_map)1, HA_READ_KEY_EXACT);
@ -2053,7 +2048,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
*/ */
table= tz_tables->table; table= tz_tables->table;
table->field[0]->store((longlong) tzid, TRUE); table->field[0]->store((longlong) tzid, TRUE);
(void)table->file->ha_index_init(0, 1); if (table->file->ha_index_init(0, 1))
goto end;
res= table->file->ha_index_read_map(table->record[0], keybuff, res= table->file->ha_index_read_map(table->record[0], keybuff,
(key_part_map)1, HA_READ_KEY_EXACT); (key_part_map)1, HA_READ_KEY_EXACT);
@ -2187,8 +2183,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
end: end:
if (table) if (table && table->file->inited)
(void)table->file->ha_index_end(); (void) table->file->ha_index_end();
DBUG_RETURN(return_val); DBUG_RETURN(return_val);
} }

View File

@ -77,7 +77,10 @@ int unique_intersect_write_to_ptrs(uchar* key, element_count count, Unique *uniq
Unique::Unique(qsort_cmp2 comp_func, void * comp_func_fixed_arg, Unique::Unique(qsort_cmp2 comp_func, void * comp_func_fixed_arg,
uint size_arg, ulonglong max_in_memory_size_arg, uint size_arg, ulonglong max_in_memory_size_arg,
uint min_dupl_count_arg) uint min_dupl_count_arg)
:max_in_memory_size(max_in_memory_size_arg), size(size_arg), elements(0) :max_in_memory_size(max_in_memory_size_arg),
record_pointers(NULL),
size(size_arg),
elements(0)
{ {
min_dupl_count= min_dupl_count_arg; min_dupl_count= min_dupl_count_arg;
full_size= size; full_size= size;
@ -625,6 +628,7 @@ bool Unique::get(TABLE *table)
if (my_b_tell(&file) == 0) if (my_b_tell(&file) == 0)
{ {
/* Whole tree is in memory; Don't use disk if you don't need to */ /* Whole tree is in memory; Don't use disk if you don't need to */
DBUG_ASSERT(table->sort.record_pointers == NULL);
if ((record_pointers=table->sort.record_pointers= (uchar*) if ((record_pointers=table->sort.record_pointers= (uchar*)
my_malloc(size * tree.elements_in_tree, MYF(0)))) my_malloc(size * tree.elements_in_tree, MYF(0))))
{ {
@ -650,6 +654,7 @@ bool Unique::get(TABLE *table)
bool error=1; bool error=1;
/* Open cached file if it isn't open */ /* Open cached file if it isn't open */
DBUG_ASSERT(table->sort.io_cache == NULL);
outfile=table->sort.io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE), outfile=table->sort.io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
MYF(MY_ZEROFILL)); MYF(MY_ZEROFILL));

View File

@ -187,14 +187,16 @@ struct fil_space_struct {
requests on the file */ requests on the file */
ibool stop_new_ops; ibool stop_new_ops;
/*!< we set this TRUE when we start /*!< we set this TRUE when we start
deleting a single-table tablespace */ deleting a single-table tablespace.
ibool is_being_deleted; When this is set following new ops
/*!< this is set to TRUE when we start are not allowed:
deleting a single-table tablespace and its * read IO request
file; when this flag is set no further i/o * ibuf merge
or flush requests can be placed on this space, * file flush
though there may be such requests still being Note that we can still possibly have
processed on this space */ new write operations because we don't
check this flag when doing flush
batches. */
ulint purpose;/*!< FIL_TABLESPACE, FIL_LOG, or ulint purpose;/*!< FIL_TABLESPACE, FIL_LOG, or
FIL_ARCH_LOG */ FIL_ARCH_LOG */
UT_LIST_BASE_NODE_T(fil_node_t) chain; UT_LIST_BASE_NODE_T(fil_node_t) chain;
@ -1286,7 +1288,6 @@ try_again:
space->stop_ios = FALSE; space->stop_ios = FALSE;
space->stop_new_ops = FALSE; space->stop_new_ops = FALSE;
space->is_being_deleted = FALSE;
space->purpose = purpose; space->purpose = purpose;
space->size = 0; space->size = 0;
space->flags = flags; space->flags = flags;
@ -2301,11 +2302,9 @@ try_again:
return(FALSE); return(FALSE);
} }
ut_a(space); ut_a(space->stop_new_ops);
ut_a(space->n_pending_ops == 0); ut_a(space->n_pending_ops == 0);
space->is_being_deleted = TRUE;
ut_a(UT_LIST_GET_LEN(space->chain) == 1); ut_a(UT_LIST_GET_LEN(space->chain) == 1);
node = UT_LIST_GET_FIRST(space->chain); node = UT_LIST_GET_FIRST(space->chain);
@ -2348,13 +2347,26 @@ try_again:
rw_lock_x_lock(&space->latch); rw_lock_x_lock(&space->latch);
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
/* Invalidate in the buffer pool all pages belonging to the /* IMPORTANT: Because we have set space::stop_new_ops there
tablespace. Since we have set space->is_being_deleted = TRUE, readahead can't be any new ibuf merges, reads or flushes. We are here
or ibuf merge can no longer read more pages of this tablespace to the because node::n_pending was zero above. However, it is still
buffer pool. Thus we can clean the tablespace out of the buffer pool possible to have pending read and write requests:
completely and permanently. The flag is_being_deleted also prevents
fil_flush() from being applied to this tablespace. */
A read request can happen because the reader thread has
gone through the ::stop_new_ops check in buf_page_init_for_read()
before the flag was set and has not yet incremented ::n_pending
when we checked it above.
A write request can be issued any time because we don't check
the ::stop_new_ops flag when queueing a block for write.
We deal with pending write requests in the following function
where we'd minimally evict all dirty pages belonging to this
space from the flush_list. Not that if a block is IO-fixed
we'll wait for IO to complete.
To deal with potential read requests by checking the
::stop_new_ops flag in fil_io() */
buf_LRU_flush_or_remove_pages( buf_LRU_flush_or_remove_pages(
id, evict_all id, evict_all
? BUF_REMOVE_ALL_NO_WRITE ? BUF_REMOVE_ALL_NO_WRITE
@ -2364,6 +2376,15 @@ try_again:
mutex_enter(&fil_system->mutex); mutex_enter(&fil_system->mutex);
/* Double check the sanity of pending ops after reacquiring
the fil_system::mutex. */
if (fil_space_get_by_id(id)) {
ut_a(space->n_pending_ops == 0);
ut_a(UT_LIST_GET_LEN(space->chain) == 1);
node = UT_LIST_GET_FIRST(space->chain);
ut_a(node->n_pending == 0);
}
success = fil_space_free(id, TRUE); success = fil_space_free(id, TRUE);
mutex_exit(&fil_system->mutex); mutex_exit(&fil_system->mutex);
@ -2421,7 +2442,7 @@ fil_tablespace_is_being_deleted(
ut_a(space != NULL); ut_a(space != NULL);
is_being_deleted = space->is_being_deleted; is_being_deleted = space->stop_new_ops;
mutex_exit(&fil_system->mutex); mutex_exit(&fil_system->mutex);
@ -3695,7 +3716,7 @@ fil_tablespace_deleted_or_being_deleted_in_mem(
space = fil_space_get_by_id(id); space = fil_space_get_by_id(id);
if (space == NULL || space->is_being_deleted) { if (space == NULL || space->stop_new_ops) {
mutex_exit(&fil_system->mutex); mutex_exit(&fil_system->mutex);
return(TRUE); return(TRUE);
@ -4408,7 +4429,9 @@ fil_io(
space = fil_space_get_by_id(space_id); space = fil_space_get_by_id(space_id);
if (!space) { /* If we are deleting a tablespace we don't allow any read
operations on that. However, we do allow write operations. */
if (!space || (type == OS_FILE_READ && space->stop_new_ops)) {
mutex_exit(&fil_system->mutex); mutex_exit(&fil_system->mutex);
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
@ -4624,7 +4647,7 @@ fil_flush(
space = fil_space_get_by_id(space_id); space = fil_space_get_by_id(space_id);
if (!space || space->is_being_deleted) { if (!space || space->stop_new_ops) {
mutex_exit(&fil_system->mutex); mutex_exit(&fil_system->mutex);
return; return;
@ -4755,7 +4778,7 @@ fil_flush_file_spaces(
space; space;
space = UT_LIST_GET_NEXT(unflushed_spaces, space)) { space = UT_LIST_GET_NEXT(unflushed_spaces, space)) {
if (space->purpose == purpose && !space->is_being_deleted) { if (space->purpose == purpose && !space->stop_new_ops) {
space_ids[n_space_ids++] = space->id; space_ids[n_space_ids++] = space->id;
} }

View File

@ -1009,11 +1009,23 @@ convert_error_code_to_mysql(
case DB_TABLE_NOT_FOUND: case DB_TABLE_NOT_FOUND:
return(HA_ERR_NO_SUCH_TABLE); return(HA_ERR_NO_SUCH_TABLE);
case DB_TOO_BIG_RECORD: case DB_TOO_BIG_RECORD: {
my_error(ER_TOO_BIG_ROWSIZE, MYF(0), /* If prefix is true then a 768-byte prefix is stored
page_get_free_space_of_empty(flags locally for BLOB fields. Refer to dict_table_get_format() */
& DICT_TF_COMPACT) / 2); bool prefix = ((flags & DICT_TF_FORMAT_MASK)
>> DICT_TF_FORMAT_SHIFT) < UNIV_FORMAT_B;
my_printf_error(ER_TOO_BIG_ROWSIZE,
"Row size too large (> %lu). Changing some columns "
"to TEXT or BLOB %smay help. In current row "
"format, BLOB prefix of %d bytes is stored inline.",
MYF(0),
page_get_free_space_of_empty(flags &
DICT_TF_COMPACT) / 2,
prefix ? "or using ROW_FORMAT=DYNAMIC "
"or ROW_FORMAT=COMPRESSED ": "",
prefix ? DICT_MAX_FIXED_COL_LEN : 0);
return(HA_ERR_TO_BIG_ROW); return(HA_ERR_TO_BIG_ROW);
}
case DB_TOO_BIG_INDEX_COL: case DB_TOO_BIG_INDEX_COL:
my_error(ER_INDEX_COLUMN_TOO_LONG, MYF(0), my_error(ER_INDEX_COLUMN_TOO_LONG, MYF(0),
@ -1483,19 +1495,19 @@ innobase_next_autoinc(
*/ */
max_value= (~(ulonglong) 0); max_value= (~(ulonglong) 0);
/* Current value should never be greater than the maximum. */
ut_a(current <= max_value);
/* According to MySQL documentation, if the offset is greater than /* According to MySQL documentation, if the offset is greater than
the step then the offset is ignored. */ the step then the offset is ignored. */
if (offset > block) { if (offset > block) {
offset = 0; offset = 0;
} }
/* Check for overflow. */ /* Check for overflow. Current can be > max_value if the value is
in reality a negative value.The visual studio compilers converts
large double values automatically into unsigned long long datatype
maximum value */
if (block >= max_value if (block >= max_value
|| offset > max_value || offset > max_value
|| current == max_value || current >= max_value
|| max_value - offset <= offset) { || max_value - offset <= offset) {
next_value = max_value; next_value = max_value;

View File

@ -80,12 +80,13 @@ class ha_innobase: public handler
uchar* upd_buf; /*!< buffer used in updates */ uchar* upd_buf; /*!< buffer used in updates */
ulint upd_buf_size; /*!< the size of upd_buf in bytes */ ulint upd_buf_size; /*!< the size of upd_buf in bytes */
uchar srch_key_val1[REC_VERSION_56_MAX_INDEX_COL_LEN + 2]; uchar srch_key_val1[MAX_KEY_LENGTH + MAX_REF_PARTS*2];
uchar srch_key_val2[REC_VERSION_56_MAX_INDEX_COL_LEN + 2]; uchar srch_key_val2[MAX_KEY_LENGTH + MAX_REF_PARTS*2];
/*!< buffers used in converting /*!< buffers used in converting
search key values from MySQL format search key values from MySQL format
to InnoDB format. "+ 2" for the two to InnoDB format. For each column
bytes where the length is stored */ 2 bytes are used to store length,
hence MAX_REF_PARTS*2. */
Table_flags int_table_flags; Table_flags int_table_flags;
uint primary_key; uint primary_key;
ulong start_of_scan; /*!< this is set to 1 when we are ulong start_of_scan; /*!< this is set to 1 when we are

View File

@ -2868,6 +2868,14 @@ ibuf_get_volume_buffered_count_func(
ut_a(len == 1); ut_a(len == 1);
ut_ad(trx_sys_multiple_tablespace_format); ut_ad(trx_sys_multiple_tablespace_format);
if (rec_get_deleted_flag(rec, 0)) {
/* This record has been merged already,
but apparently the system crashed before
the change was discarded from the buffer.
Pretend that the record does not exist. */
return(0);
}
types = rec_get_nth_field_old(rec, IBUF_REC_FIELD_METADATA, &len); types = rec_get_nth_field_old(rec, IBUF_REC_FIELD_METADATA, &len);
switch (UNIV_EXPECT(len % DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE, switch (UNIV_EXPECT(len % DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE,
@ -4176,11 +4184,11 @@ ibuf_delete(
page, 1); page, 1);
} }
#ifdef UNIV_ZIP_DEBUG #ifdef UNIV_ZIP_DEBUG
ut_a(!page_zip || page_zip_validate(page_zip, page)); ut_a(!page_zip || page_zip_validate(page_zip, page, index));
#endif /* UNIV_ZIP_DEBUG */ #endif /* UNIV_ZIP_DEBUG */
page_cur_delete_rec(&page_cur, index, offsets, mtr); page_cur_delete_rec(&page_cur, index, offsets, mtr);
#ifdef UNIV_ZIP_DEBUG #ifdef UNIV_ZIP_DEBUG
ut_a(!page_zip || page_zip_validate(page_zip, page)); ut_a(!page_zip || page_zip_validate(page_zip, page, index));
#endif /* UNIV_ZIP_DEBUG */ #endif /* UNIV_ZIP_DEBUG */
if (page_zip) { if (page_zip) {
@ -4295,7 +4303,7 @@ ibuf_delete_rec(
an assertion failure after crash recovery. */ an assertion failure after crash recovery. */
btr_cur_set_deleted_flag_for_ibuf( btr_cur_set_deleted_flag_for_ibuf(
btr_pcur_get_rec(pcur), NULL, TRUE, mtr); btr_pcur_get_rec(pcur), NULL, TRUE, mtr);
mtr_commit(mtr); ibuf_mtr_commit(mtr);
log_make_checkpoint_at(IB_ULONGLONG_MAX, TRUE); log_make_checkpoint_at(IB_ULONGLONG_MAX, TRUE);
DBUG_SUICIDE(); DBUG_SUICIDE();
} }

View File

@ -28,6 +28,7 @@ Created 12/27/1996 Heikki Tuuri
# include "trx0trx.h" # include "trx0trx.h"
# include "trx0undo.h" # include "trx0undo.h"
# include "row0row.h" # include "row0row.h"
# include "lock0lock.h"
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
#include "page0zip.h" #include "page0zip.h"
@ -171,6 +172,8 @@ row_upd_rec_sys_fields(
#if DATA_TRX_ID + 1 != DATA_ROLL_PTR #if DATA_TRX_ID + 1 != DATA_ROLL_PTR
# error "DATA_TRX_ID + 1 != DATA_ROLL_PTR" # error "DATA_TRX_ID + 1 != DATA_ROLL_PTR"
#endif #endif
ut_ad(lock_check_trx_id_sanity(trx_read_trx_id(rec + offset),
rec, index, offsets, FALSE));
trx_write_trx_id(rec + offset, trx->id); trx_write_trx_id(rec + offset, trx->id);
trx_write_roll_ptr(rec + offset + DATA_TRX_ID_LEN, roll_ptr); trx_write_roll_ptr(rec + offset + DATA_TRX_ID_LEN, roll_ptr);
} }

View File

@ -295,6 +295,24 @@ management to ensure correct alignment for doubles etc. */
======================== ========================
*/ */
/** There are currently two InnoDB file formats which are used to group
features with similar restrictions and dependencies. Using an enum allows
switch statements to give a compiler warning when a new one is introduced. */
enum innodb_file_formats_enum {
/** Antelope File Format: InnoDB/MySQL up to 5.1.
This format includes REDUNDANT and COMPACT row formats */
UNIV_FORMAT_A = 0,
/** Barracuda File Format: Introduced in InnoDB plugin for 5.1:
This format includes COMPRESSED and DYNAMIC row formats. It
includes the ability to create secondary indexes from data that
is not on the clustered index page and the ability to store more
data off the clustered index page. */
UNIV_FORMAT_B = 1
};
typedef enum innodb_file_formats_enum innodb_file_formats_t;
/* The 2-logarithm of UNIV_PAGE_SIZE: */ /* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 14 #define UNIV_PAGE_SIZE_SHIFT 14
/* The universal page size of the database */ /* The universal page size of the database */

View File

@ -1404,7 +1404,6 @@ os_file_create_func(
SetLastError(ERROR_DISK_FULL); SetLastError(ERROR_DISK_FULL);
return((os_file_t) -1); return((os_file_t) -1);
); );
try_again: try_again:
ut_a(name); ut_a(name);
@ -1526,7 +1525,6 @@ try_again:
errno = ENOSPC; errno = ENOSPC;
return((os_file_t) -1); return((os_file_t) -1);
); );
try_again: try_again:
ut_a(name); ut_a(name);

View File

@ -2487,6 +2487,9 @@ row_sel_convert_mysql_key_to_innobase(
dfield++; dfield++;
} }
DBUG_EXECUTE_IF("innodb_srch_key_buffer_full",
ut_a(buf == (original_buf + buf_len)););
ut_a(buf <= original_buf + buf_len); ut_a(buf <= original_buf + buf_len);
/* We set the length of tuple to n_fields: we assume that the memory /* We set the length of tuple to n_fields: we assume that the memory

View File

@ -237,7 +237,8 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
} }
/* sanity check */ /* sanity check */
if (share->base.keystart > 65535 || share->base.rec_reflength > 8) if (share->base.keystart > 65535 ||
share->base.rec_reflength > 8 || share->base.key_reflength > 7)
{ {
my_errno=HA_ERR_CRASHED; my_errno=HA_ERR_CRASHED;
goto err; goto err;

View File

@ -291,12 +291,12 @@ static struct my_option my_long_options[] =
&check_param.write_buffer_length, 0, GET_ULONG, REQUIRED_ARG, &check_param.write_buffer_length, 0, GET_ULONG, REQUIRED_ARG,
(long) READ_BUFFER_INIT, (long) MALLOC_OVERHEAD, (long) READ_BUFFER_INIT, (long) MALLOC_OVERHEAD,
INT_MAX32, (long) MALLOC_OVERHEAD, (long) 1L, 0}, INT_MAX32, (long) MALLOC_OVERHEAD, (long) 1L, 0},
{ "sort_buffer_size", OPT_SORT_BUFFER_SIZE, { "sort_buffer_size", OPT_SORT_BUFFER_SIZE,
"Deprecated. myisam_sort_buffer_size alias is being used", "Deprecated. myisam_sort_buffer_size alias is being used",
&check_param.sort_buffer_length, &check_param.sort_buffer_length,
&check_param.sort_buffer_length, 0, GET_ULONG, REQUIRED_ARG, &check_param.sort_buffer_length, 0, GET_ULL, REQUIRED_ARG,
(long) SORT_BUFFER_INIT, (long) (MIN_SORT_BUFFER + MALLOC_OVERHEAD), (long) SORT_BUFFER_INIT, (long) (MIN_SORT_BUFFER + MALLOC_OVERHEAD),
ULONG_MAX, (long) MALLOC_OVERHEAD, (long) 1L, 0}, SIZE_T_MAX, (long) MALLOC_OVERHEAD, (long) 1L, 0},
{ "myisam_sort_buffer_size", OPT_SORT_BUFFER_SIZE, { "myisam_sort_buffer_size", OPT_SORT_BUFFER_SIZE,
"Alias of sort_buffer_size parameter", "Alias of sort_buffer_size parameter",
&check_param.sort_buffer_length, &check_param.sort_buffer_length,

View File

@ -1,4 +1,4 @@
# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -286,8 +286,9 @@ documentation and the manual for more information.
Summary: MySQL: a very fast and reliable SQL database server Summary: MySQL: a very fast and reliable SQL database server
Group: Applications/Databases Group: Applications/Databases
Requires: %{distro_requires} Requires: %{distro_requires}
Provides: msqlormysql mysql MySQL mysql-server MySQL-server Provides: msqlormysql MySQL MySQL-server
Obsoletes: mysql MySQL mysql-server MySQL-server Conflicts: mysql mysql-server mysql-advanced mysql-server-advanced
Obsoletes: MySQL MySQL-server
Obsoletes: MySQL-server-classic MySQL-server-community MySQL-server-enterprise Obsoletes: MySQL-server-classic MySQL-server-community MySQL-server-enterprise
Obsoletes: MySQL-server-advanced MySQL-server-advanced-gpl MySQL-server-enterprise-gpl Obsoletes: MySQL-server-advanced MySQL-server-advanced-gpl MySQL-server-enterprise-gpl
@ -319,8 +320,9 @@ package "MySQL-client%{product_suffix}" as well!
%package -n MySQL-client%{product_suffix} %package -n MySQL-client%{product_suffix}
Summary: MySQL - Client Summary: MySQL - Client
Group: Applications/Databases Group: Applications/Databases
Provides: mysql-client MySQL-client Provides: MySQL-client
Obsoletes: mysql-client MySQL-client Conflicts: mysql mysql-advanced
Obsoletes: MySQL-client
Obsoletes: MySQL-client-classic MySQL-client-community MySQL-client-enterprise Obsoletes: MySQL-client-classic MySQL-client-community MySQL-client-enterprise
Obsoletes: MySQL-client-advanced MySQL-client-advanced-gpl MySQL-client-enterprise-gpl Obsoletes: MySQL-client-advanced MySQL-client-advanced-gpl MySQL-client-enterprise-gpl
@ -334,8 +336,9 @@ For a description of MySQL see the base MySQL RPM or http://www.mysql.com/
Summary: MySQL - Test suite Summary: MySQL - Test suite
Group: Applications/Databases Group: Applications/Databases
Requires: MySQL-client perl Requires: MySQL-client perl
Provides: mysql-test MySQL-test Provides: MySQL-test
Obsoletes: mysql-test MySQL-test Conflicts: mysql-test mysql-test-advanced
Obsoletes: MySQL-test
Obsoletes: mysql-bench MySQL-bench Obsoletes: mysql-bench MySQL-bench
Obsoletes: MySQL-test-classic MySQL-test-community MySQL-test-enterprise Obsoletes: MySQL-test-classic MySQL-test-community MySQL-test-enterprise
Obsoletes: MySQL-test-advanced MySQL-test-advanced-gpl MySQL-test-enterprise-gpl Obsoletes: MySQL-test-advanced MySQL-test-advanced-gpl MySQL-test-enterprise-gpl
@ -350,8 +353,9 @@ For a description of MySQL see the base MySQL RPM or http://www.mysql.com/
%package -n MySQL-devel%{product_suffix} %package -n MySQL-devel%{product_suffix}
Summary: MySQL - Development header files and libraries Summary: MySQL - Development header files and libraries
Group: Applications/Databases Group: Applications/Databases
Provides: mysql-devel MySQL-devel Provides: MySQL-devel
Obsoletes: mysql-devel MySQL-devel Conflicts: mysql-devel mysql-embedded-devel mysql-devel-advanced mysql-embedded-devel-advanced
Obsoletes: MySQL-devel
Obsoletes: MySQL-devel-classic MySQL-devel-community MySQL-devel-enterprise Obsoletes: MySQL-devel-classic MySQL-devel-community MySQL-devel-enterprise
Obsoletes: MySQL-devel-advanced MySQL-devel-advanced-gpl MySQL-devel-enterprise-gpl Obsoletes: MySQL-devel-advanced MySQL-devel-advanced-gpl MySQL-devel-enterprise-gpl
@ -365,8 +369,9 @@ For a description of MySQL see the base MySQL RPM or http://www.mysql.com/
%package -n MySQL-shared%{product_suffix} %package -n MySQL-shared%{product_suffix}
Summary: MySQL - Shared libraries Summary: MySQL - Shared libraries
Group: Applications/Databases Group: Applications/Databases
Provides: mysql-shared MySQL-shared Provides: MySQL-shared
Obsoletes: mysql-shared MySQL-shared-standard MySQL-shared-pro Conflicts: mysql-libs mysql-libs-advanced
Obsoletes: MySQL-shared-standard MySQL-shared-pro
Obsoletes: MySQL-shared-pro-cert MySQL-shared-pro-gpl Obsoletes: MySQL-shared-pro-cert MySQL-shared-pro-gpl
Obsoletes: MySQL-shared-pro-gpl-cert MySQL-shared Obsoletes: MySQL-shared-pro-gpl-cert MySQL-shared
Obsoletes: MySQL-shared-classic MySQL-shared-community MySQL-shared-enterprise Obsoletes: MySQL-shared-classic MySQL-shared-community MySQL-shared-enterprise
@ -381,8 +386,9 @@ and applications need to dynamically load and use MySQL.
Summary: MySQL - Embedded library Summary: MySQL - Embedded library
Group: Applications/Databases Group: Applications/Databases
Requires: MySQL-devel Requires: MySQL-devel
Provides: mysql-embedded MySQL-embedded Provides: MySQL-embedded
Obsoletes: mysql-embedded MySQL-embedded Conflicts: mysql-embedded mysql-embedded-advanced
Obsoletes: MySQL-embedded
Obsoletes: MySQL-embedded-pro Obsoletes: MySQL-embedded-pro
Obsoletes: MySQL-embedded-classic MySQL-embedded-community MySQL-embedded-enterprise Obsoletes: MySQL-embedded-classic MySQL-embedded-community MySQL-embedded-enterprise
Obsoletes: MySQL-embedded-advanced MySQL-embedded-advanced-gpl MySQL-embedded-enterprise-gpl Obsoletes: MySQL-embedded-advanced MySQL-embedded-advanced-gpl MySQL-embedded-enterprise-gpl
@ -601,8 +607,13 @@ fi
# Check if we can safely upgrade. An upgrade is only safe if it's from one # Check if we can safely upgrade. An upgrade is only safe if it's from one
# of our RPMs in the same version family. # of our RPMs in the same version family.
# Handle both ways of spelling the capability.
installed=`rpm -q --whatprovides mysql-server 2> /dev/null` installed=`rpm -q --whatprovides mysql-server 2> /dev/null`
if [ $? -ne 0 -o -z "$installed" ]; then
installed=`rpm -q --whatprovides MySQL-server 2> /dev/null`
fi
if [ $? -eq 0 -a -n "$installed" ]; then if [ $? -eq 0 -a -n "$installed" ]; then
installed=`echo $installed | sed 's/\([^ ]*\) .*/\1/'` # Tests have shown duplicated package names
vendor=`rpm -q --queryformat='%{VENDOR}' "$installed" 2>&1` vendor=`rpm -q --queryformat='%{VENDOR}' "$installed" 2>&1`
version=`rpm -q --queryformat='%{VERSION}' "$installed" 2>&1` version=`rpm -q --queryformat='%{VERSION}' "$installed" 2>&1`
myoldvendor='%{mysql_old_vendor}' myoldvendor='%{mysql_old_vendor}'
@ -1173,6 +1184,10 @@ echo "=====" >> $STATUS_HISTORY
this can be oveeridden via the command line by adding this can be oveeridden via the command line by adding
--define "runselftest 0" --define "runselftest 0"
Failures of the test suite will NOT make the RPM build fail! Failures of the test suite will NOT make the RPM build fail!
* Mon Jun 11 2012 Joerg Bruehe <joerg.bruehe@oracle.com>
- Make sure newly added "SPECIFIC-ULN/" directory does not disturb packaging.
* Wed Sep 28 2011 Joerg Bruehe <joerg.bruehe@oracle.com> * Wed Sep 28 2011 Joerg Bruehe <joerg.bruehe@oracle.com>