Manual merge from mysql-5.1.
This commit is contained in:
commit
c8c2daf15b
@ -15,11 +15,6 @@
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#define COPYRIGHT_NOTICE "\
|
||||
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.\n\
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\
|
||||
and you are welcome to modify and redistribute it under the GPL v2 license\n"
|
||||
|
||||
/* mysql command tool
|
||||
* Commands compatible with mSQL by David J. Hughes
|
||||
*
|
||||
@ -120,6 +115,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "completion_hash.h"
|
||||
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
|
||||
|
||||
#define PROMPT_CHAR '\\'
|
||||
#define DEFAULT_DELIMITER ";"
|
||||
@ -1174,7 +1170,7 @@ int main(int argc,char *argv[])
|
||||
mysql_thread_id(&mysql), server_version_string(&mysql));
|
||||
put_info((char*) glob_buffer.ptr(),INFO_INFO);
|
||||
|
||||
put_info(COPYRIGHT_NOTICE, INFO_INFO);
|
||||
put_info(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"), INFO_INFO);
|
||||
|
||||
#ifdef HAVE_READLINE
|
||||
initialize_readline((char*) my_progname);
|
||||
@ -1593,7 +1589,7 @@ static void usage(int version)
|
||||
|
||||
if (version)
|
||||
return;
|
||||
printf("%s", COPYRIGHT_NOTICE);
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
printf("Usage: %s [OPTIONS] [database]\n", my_progname);
|
||||
my_print_help(my_long_options);
|
||||
print_defaults("my", load_default_groups);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2006, 2011, 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
|
||||
@ -19,6 +19,8 @@
|
||||
#include <sslopt-vars.h>
|
||||
#include "../scripts/mysql_fix_privilege_tables_sql.c"
|
||||
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
||||
#define VER "1.1"
|
||||
|
||||
#ifdef HAVE_SYS_WAIT_H
|
||||
@ -228,6 +230,7 @@ get_one_option(int optid, const struct my_option *opt,
|
||||
switch (optid) {
|
||||
|
||||
case '?':
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
printf("%s Ver %s Distrib %s, for %s (%s)\n",
|
||||
my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
|
||||
puts("MySQL utility for upgrading databases to new MySQL versions.\n");
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <mysql.h>
|
||||
#include <sql_common.h>
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
||||
#define ADMIN_VERSION "8.42"
|
||||
#define MAX_MYSQL_VAR 512
|
||||
@ -692,8 +693,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
|
||||
case ADMIN_VER:
|
||||
new_line=1;
|
||||
print_version();
|
||||
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
|
||||
printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
|
||||
printf("Connection\t\t%s\n",mysql_get_host_info(mysql));
|
||||
@ -1072,8 +1072,7 @@ static void print_version(void)
|
||||
static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
puts("Administration program for the mysqld daemon.");
|
||||
printf("Usage: %s [OPTIONS] command command....\n", my_progname);
|
||||
my_print_help(my_long_options);
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "mysql_priv.h"
|
||||
#include "log_event.h"
|
||||
#include "sql_common.h"
|
||||
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
|
||||
|
||||
#define BIN_LOG_HEADER_SIZE 4
|
||||
#define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4)
|
||||
@ -1249,10 +1250,7 @@ static void print_version()
|
||||
static void usage()
|
||||
{
|
||||
print_version();
|
||||
puts("By Monty and Sasha, for your professional use\n\
|
||||
This software comes with NO WARRANTY: This is free software,\n\
|
||||
and you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
printf("\
|
||||
Dumps a MySQL binary log in a format usable for viewing or for piping to\n\
|
||||
the mysql command line client.\n\n");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2001, 2011, 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
|
||||
@ -15,8 +15,6 @@
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/* By Jani Tolonen, 2001-04-20, MySQL Development Team */
|
||||
|
||||
#define CHECK_VERSION "2.5.0"
|
||||
|
||||
#include "client_priv.h"
|
||||
@ -24,6 +22,7 @@
|
||||
#include <mysql_version.h>
|
||||
#include <mysqld_error.h>
|
||||
#include <sslopt-vars.h>
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
||||
/* Exit codes */
|
||||
|
||||
@ -223,9 +222,7 @@ static void print_version(void)
|
||||
static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("By Jani Tolonen, 2001-04-20, MySQL Development Team.\n");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n");
|
||||
puts("and you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
puts("This program can be used to CHECK (-c, -m, -C), REPAIR (-r), ANALYZE (-a),");
|
||||
puts("or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be");
|
||||
puts("used at the same time. Not all options are supported by all storage engines.");
|
||||
|
@ -54,6 +54,8 @@
|
||||
#include "mysqld_error.h"
|
||||
#include "../sql/ha_ndbcluster_tables.h"
|
||||
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
||||
/* Exit codes */
|
||||
|
||||
#define EX_USAGE 1
|
||||
@ -569,8 +571,7 @@ static void short_usage_sub(void)
|
||||
static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("By Igor Romanenko, Monty, Jani & Sinisa.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
puts("Dumping structure and contents of MySQL databases and tables.");
|
||||
short_usage_sub();
|
||||
print_defaults("my",load_default_groups);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2000, 2011, 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
|
||||
@ -18,14 +18,8 @@
|
||||
/*
|
||||
** mysqlimport.c - Imports all given files
|
||||
** into a table(s).
|
||||
**
|
||||
** *************************
|
||||
** * *
|
||||
** * AUTHOR: Monty & Jani *
|
||||
** * DATE: June 24, 1997 *
|
||||
** * *
|
||||
** *************************
|
||||
*/
|
||||
|
||||
#define IMPORT_VERSION "3.7"
|
||||
|
||||
#include "client_priv.h"
|
||||
@ -42,6 +36,8 @@ pthread_mutex_t counter_mutex;
|
||||
pthread_cond_t count_threshhold;
|
||||
#endif
|
||||
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
||||
static void db_error_with_table(MYSQL *mysql, char *table);
|
||||
static void db_error(MYSQL *mysql);
|
||||
static char *field_escape(char *to,const char *from,uint length);
|
||||
@ -200,8 +196,7 @@ static void print_version(void)
|
||||
static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
printf("\
|
||||
Loads tables from text files in various formats. The base name of the\n\
|
||||
text file must be the name of the table that should be used.\n\
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2000, 2011, 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
|
||||
@ -27,6 +27,7 @@
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <sslopt-vars.h>
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
||||
static char * host=0, *opt_password=0, *user=0;
|
||||
static my_bool opt_show_keys= 0, opt_compress= 0, opt_count=0, opt_status= 0;
|
||||
@ -255,8 +256,7 @@ static void print_version(void)
|
||||
static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011)"));
|
||||
puts("Shows the structure of a MySQL database (databases, tables, and columns).\n");
|
||||
printf("Usage: %s [OPTIONS] [database [table [column]]]\n",my_progname);
|
||||
puts("\n\
|
||||
|
@ -24,13 +24,6 @@
|
||||
http://dev.mysql.com/doc/mysqltest/en/index.html
|
||||
|
||||
Please keep the test framework tools identical in all versions!
|
||||
|
||||
Written by:
|
||||
Sasha Pachev <sasha@mysql.com>
|
||||
Matt Wagner <matt@mysql.com>
|
||||
Monty
|
||||
Jani
|
||||
Holyfoot
|
||||
*/
|
||||
|
||||
#define MTEST_VERSION "3.3"
|
||||
@ -53,6 +46,8 @@
|
||||
#include <signal.h>
|
||||
#include <my_stacktrace.h>
|
||||
|
||||
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
|
||||
|
||||
#ifdef __WIN__
|
||||
#include <crtdbg.h>
|
||||
#define SIGNAL_FMT "exception 0x%x"
|
||||
@ -6125,8 +6120,7 @@ void print_version(void)
|
||||
void usage()
|
||||
{
|
||||
print_version();
|
||||
printf("MySQL AB, by Sasha, Matt, Monty & Jani\n");
|
||||
printf("This software comes with ABSOLUTELY NO WARRANTY\n\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
printf("Runs a test against the mysql server and compares output with a results file.\n\n");
|
||||
printf("Usage: %s [OPTIONS] [database] < test_file\n", my_progname);
|
||||
my_print_help(my_long_options);
|
||||
|
@ -2875,6 +2875,15 @@ AC_CONFIG_COMMANDS_POST(ac_configure_args="$ac_configure_args CFLAGS='$CFLAGS' C
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
# Add warning if user configures with --with-ndbcluster
|
||||
if test X"$with_plugin_ndbcluster" = Xyes ; then
|
||||
echo
|
||||
echo This version of MySQL Cluster is no longer maintained.
|
||||
echo Please use the separate sources provided for MySQL Cluster instead.
|
||||
echo See http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster.html
|
||||
echo for more details.
|
||||
fi
|
||||
|
||||
# The first line "Thank you ..." is checked in ./Do-compile to verify that configure
|
||||
# ended sucessfully - don't remove it.
|
||||
echo
|
||||
|
@ -38,7 +38,7 @@ noinst_HEADERS = config-win.h config-netware.h my_bit.h \
|
||||
my_aes.h my_tree.h my_trie.h hash.h thr_alarm.h \
|
||||
thr_lock.h t_ctype.h violite.h my_md5.h base64.h \
|
||||
my_compare.h my_time.h my_vle.h my_user.h \
|
||||
my_libwrap.h my_stacktrace.h
|
||||
my_libwrap.h my_stacktrace.h welcome_copyright_notice.h
|
||||
|
||||
EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp
|
||||
|
||||
|
31
include/welcome_copyright_notice.h
Normal file
31
include/welcome_copyright_notice.h
Normal file
@ -0,0 +1,31 @@
|
||||
/* Copyright (c) 2011, 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 */
|
||||
|
||||
#ifndef _welcome_copyright_notice_h_
|
||||
#define _welcome_copyright_notice_h_
|
||||
|
||||
/*
|
||||
This define specifies copyright notice which is displayed by every MySQL
|
||||
program on start, or on help screen.
|
||||
*/
|
||||
|
||||
#define ORACLE_WELCOME_COPYRIGHT_NOTICE(years) \
|
||||
"Copyright (c) " years ", Oracle and/or its affiliates. All rights reserved.\n" \
|
||||
"\n" \
|
||||
"Oracle is a registered trademark of Oracle Corporation and/or its\n" \
|
||||
"affiliates. Other names may be trademarks of their respective\n" \
|
||||
"owners.\n"
|
||||
|
||||
#endif /* _welcome_copyright_notice_h_ */
|
@ -23,7 +23,8 @@ main.query_cache_28249 # Bug#12584161 2009-03-25 main.query_ca
|
||||
|
||||
ndb.* # joro : NDB tests marked as experimental as agreed with bochklin
|
||||
|
||||
rpl.rpl_innodb_bug28430 @solaris # Bug#11754425
|
||||
rpl.rpl_innodb_bug28430 # Bug#11754425
|
||||
rpl.rpl_insert # Sven: BUG#12764817
|
||||
rpl.rpl_row_sp011 @solaris # Joro : Bug #11753919
|
||||
rpl.rpl_stop_slave # Sven : BUG#12345981
|
||||
|
||||
|
@ -1426,4 +1426,10 @@ NULL
|
||||
SELECT WEEK(DATE_ADD(FROM_DAYS(1),INTERVAL 1 MONTH), 1);
|
||||
WEEK(DATE_ADD(FROM_DAYS(1),INTERVAL 1 MONTH), 1)
|
||||
NULL
|
||||
#
|
||||
# Bug#12584302 AFTER FIX FOR #12403504: ASSERTION FAILED: DELSUM+(INT) Y/4-TEMP > 0,
|
||||
#
|
||||
DO WEEK((DATE_ADD((CAST(0 AS DATE)), INTERVAL 1 YEAR_MONTH)), 5);
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '0'
|
||||
End of 5.1 tests
|
||||
|
@ -7055,7 +7055,7 @@ DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p5;
|
||||
#
|
||||
# Bug#11840395 (formerly known as bug#60347):
|
||||
# The string "versiondata" seems to be 'leaking' into the schema name space
|
||||
# The string "versiondata" seems
|
||||
# to be 'leaking' into the schema name space
|
||||
#
|
||||
DROP DATABASE IF EXISTS mixedCaseDbName;
|
||||
@ -7068,6 +7068,25 @@ select mixedCaseDbName.tryMyFunc();
|
||||
mixedCaseDbName.tryMyFunc()
|
||||
IT WORKS
|
||||
DROP DATABASE mixedCaseDbName;
|
||||
#
|
||||
# Bug#11766594 59736: SELECT DISTINCT.. INCORRECT RESULT WITH DETERMINISTIC FUNCTION IN WHERE C
|
||||
#
|
||||
CREATE TABLE t1 (a INT, b INT, KEY(b));
|
||||
CREATE TABLE t2 (c INT, d INT, KEY(c));
|
||||
INSERT INTO t1 VALUES (1,1),(1,1),(1,2);
|
||||
INSERT INTO t2 VALUES (1,1),(1,2);
|
||||
CREATE FUNCTION f1() RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
DECLARE a int;
|
||||
-- SQL statement inside
|
||||
SELECT 1 INTO a;
|
||||
RETURN a;
|
||||
END $
|
||||
SELECT COUNT(DISTINCT d) FROM t1, t2 WHERE a = c AND b = f1();
|
||||
COUNT(DISTINCT d)
|
||||
2
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1, t2;
|
||||
# ------------------------------------------------------------------
|
||||
# -- End of 5.1 tests
|
||||
# ------------------------------------------------------------------
|
||||
|
@ -1022,6 +1022,7 @@ v16 VARCHAR(500), v17 VARCHAR(500), v18 VARCHAR(500)
|
||||
CREATE INDEX idx1 ON t1(a,v1);
|
||||
INSERT INTO t1 VALUES(9,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r);
|
||||
UPDATE t1 SET a=1000;
|
||||
DELETE FROM t1;
|
||||
DROP TABLE t1;
|
||||
set global innodb_file_per_table=0;
|
||||
set global innodb_file_format=Antelope;
|
||||
|
@ -62,42 +62,42 @@ row_format=compressed;
|
||||
create table t14(a int primary key) engine=innodb key_block_size=9;
|
||||
Warnings:
|
||||
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=9.
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t0 Compact
|
||||
test t00 Compact
|
||||
test t1 Compact
|
||||
test t10 Dynamic
|
||||
test t11 Compressed
|
||||
test t12 Compressed
|
||||
test t13 Compressed
|
||||
test t14 Compact
|
||||
test t2 Redundant
|
||||
test t3 Compact
|
||||
test t4 Compact
|
||||
test t5 Redundant
|
||||
test t6 Redundant
|
||||
test t7 Redundant
|
||||
test t8 Compact
|
||||
test t9 Compact
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t0 Compact 16384 0
|
||||
test t00 Compact 16384 0
|
||||
test t1 Compact 16384 0
|
||||
test t10 Dynamic 16384 0
|
||||
test t11 Compressed 1024 0
|
||||
test t12 Compressed 1024 0
|
||||
test t13 Compressed 8192 0
|
||||
test t14 Compact 16384 0
|
||||
test t2 Redundant 16384 0
|
||||
test t3 Compact 16384 0
|
||||
test t4 Compact 16384 0
|
||||
test t5 Redundant 16384 0
|
||||
test t6 Redundant 16384 0
|
||||
test t7 Redundant 16384 0
|
||||
test t8 Compact 16384 0
|
||||
test t9 Compact 16384 0
|
||||
drop table t0,t00,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14;
|
||||
alter table t1 key_block_size=0;
|
||||
alter table t1 row_format=dynamic;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t1 Dynamic
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t1 Dynamic 16384 0
|
||||
alter table t1 row_format=compact;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t1 Compact
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t1 Compact 16384 0
|
||||
alter table t1 row_format=redundant;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t1 Redundant
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t1 Redundant 16384 0
|
||||
drop table t1;
|
||||
create table t1(a int not null, b text, index(b(10))) engine=innodb
|
||||
key_block_size=1;
|
||||
@ -114,11 +114,11 @@ rollback;
|
||||
select a,left(b,40) from t1 natural join t2;
|
||||
a left(b,40)
|
||||
1 1abcdefghijklmnopqrstuvwxyzAAAAAAAAAAAAA
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t1 Compressed
|
||||
test t2 Compact
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t1 Compressed 2048 1024
|
||||
test t2 Compact 16384 0
|
||||
drop table t1,t2;
|
||||
SET SESSION innodb_strict_mode = off;
|
||||
CREATE TABLE t1(
|
||||
@ -206,19 +206,19 @@ create table t8 (id int primary key) engine = innodb row_format = compressed;
|
||||
create table t9 (id int primary key) engine = innodb row_format = dynamic;
|
||||
create table t10(id int primary key) engine = innodb row_format = compact;
|
||||
create table t11(id int primary key) engine = innodb row_format = redundant;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t1 Compact
|
||||
test t10 Compact
|
||||
test t11 Redundant
|
||||
test t3 Compressed
|
||||
test t4 Compressed
|
||||
test t5 Compressed
|
||||
test t6 Compressed
|
||||
test t7 Compressed
|
||||
test t8 Compressed
|
||||
test t9 Dynamic
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t1 Compact 16384 0
|
||||
test t10 Compact 16384 0
|
||||
test t11 Redundant 16384 0
|
||||
test t3 Compressed 1024 0
|
||||
test t4 Compressed 2048 0
|
||||
test t5 Compressed 4096 0
|
||||
test t6 Compressed 8192 0
|
||||
test t7 Compressed 16384 0
|
||||
test t8 Compressed 8192 0
|
||||
test t9 Dynamic 16384 0
|
||||
drop table t1, t3, t4, t5, t6, t7, t8, t9, t10, t11;
|
||||
create table t1 (id int primary key) engine = innodb
|
||||
key_block_size = 8 row_format = compressed;
|
||||
@ -245,11 +245,11 @@ Warning 1478 InnoDB: cannot specify ROW_FORMAT = DYNAMIC with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t4' (errno: 1478)
|
||||
create table t5 (id int primary key) engine = innodb
|
||||
key_block_size = 8 row_format = default;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t1 Compressed
|
||||
test t5 Compressed
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t1 Compressed 8192 0
|
||||
test t5 Compressed 8192 0
|
||||
drop table t1, t5;
|
||||
create table t1 (id int primary key) engine = innodb
|
||||
key_block_size = 9 row_format = redundant;
|
||||
@ -275,9 +275,9 @@ Level Code Message
|
||||
Warning 1478 InnoDB: invalid KEY_BLOCK_SIZE = 9. Valid values are [1, 2, 4, 8, 16]
|
||||
Warning 1478 InnoDB: cannot specify ROW_FORMAT = DYNAMIC with KEY_BLOCK_SIZE.
|
||||
Error 1005 Can't create table 'test.t2' (errno: 1478)
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
table_schema table_name row_format data_length index_length
|
||||
set global innodb_file_per_table = off;
|
||||
create table t1 (id int primary key) engine = innodb key_block_size = 1;
|
||||
ERROR HY000: Can't create table 'test.t1' (errno: 1478)
|
||||
@ -323,11 +323,11 @@ Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table.
|
||||
Error 1005 Can't create table 'test.t7' (errno: 1478)
|
||||
create table t8 (id int primary key) engine = innodb row_format = compact;
|
||||
create table t9 (id int primary key) engine = innodb row_format = redundant;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t8 Compact
|
||||
test t9 Redundant
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t8 Compact 16384 0
|
||||
test t9 Redundant 16384 0
|
||||
drop table t8, t9;
|
||||
set global innodb_file_per_table = on;
|
||||
set global innodb_file_format = `0`;
|
||||
@ -375,11 +375,11 @@ Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope.
|
||||
Error 1005 Can't create table 'test.t7' (errno: 1478)
|
||||
create table t8 (id int primary key) engine = innodb row_format = compact;
|
||||
create table t9 (id int primary key) engine = innodb row_format = redundant;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
table_schema table_name row_format
|
||||
test t8 Compact
|
||||
test t9 Redundant
|
||||
table_schema table_name row_format data_length index_length
|
||||
test t8 Compact 16384 0
|
||||
test t9 Redundant 16384 0
|
||||
drop table t8, t9;
|
||||
set global innodb_file_per_table=0;
|
||||
set global innodb_file_format=Antelope;
|
||||
|
@ -475,6 +475,9 @@ CREATE TABLE t1(a INT,
|
||||
CREATE INDEX idx1 ON t1(a,v1);
|
||||
INSERT INTO t1 VALUES(9,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r);
|
||||
UPDATE t1 SET a=1000;
|
||||
DELETE FROM t1;
|
||||
# Let the purge thread clean up this file.
|
||||
-- sleep 10
|
||||
DROP TABLE t1;
|
||||
|
||||
eval set global innodb_file_per_table=$per_table;
|
||||
|
@ -36,19 +36,19 @@ create table t13(a int primary key) engine=innodb
|
||||
row_format=compressed;
|
||||
create table t14(a int primary key) engine=innodb key_block_size=9;
|
||||
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
|
||||
drop table t0,t00,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14;
|
||||
alter table t1 key_block_size=0;
|
||||
alter table t1 row_format=dynamic;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
alter table t1 row_format=compact;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
alter table t1 row_format=redundant;
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
drop table t1;
|
||||
|
||||
@ -81,7 +81,7 @@ connection default;
|
||||
disconnect a;
|
||||
disconnect b;
|
||||
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
drop table t1,t2;
|
||||
|
||||
@ -192,7 +192,7 @@ create table t9 (id int primary key) engine = innodb row_format = dynamic;
|
||||
create table t10(id int primary key) engine = innodb row_format = compact;
|
||||
create table t11(id int primary key) engine = innodb row_format = redundant;
|
||||
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
drop table t1, t3, t4, t5, t6, t7, t8, t9, t10, t11;
|
||||
|
||||
@ -218,7 +218,7 @@ show warnings;
|
||||
create table t5 (id int primary key) engine = innodb
|
||||
key_block_size = 8 row_format = default;
|
||||
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
drop table t1, t5;
|
||||
|
||||
@ -238,7 +238,7 @@ create table t2 (id int primary key) engine = innodb
|
||||
key_block_size = 9 row_format = dynamic;
|
||||
show warnings;
|
||||
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
|
||||
#test valid values with innodb_file_per_table unset
|
||||
@ -268,7 +268,7 @@ show warnings;
|
||||
create table t8 (id int primary key) engine = innodb row_format = compact;
|
||||
create table t9 (id int primary key) engine = innodb row_format = redundant;
|
||||
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
drop table t8, t9;
|
||||
|
||||
@ -300,7 +300,7 @@ show warnings;
|
||||
create table t8 (id int primary key) engine = innodb row_format = compact;
|
||||
create table t9 (id int primary key) engine = innodb row_format = redundant;
|
||||
|
||||
SELECT table_schema, table_name, row_format
|
||||
SELECT table_schema, table_name, row_format, data_length, index_length
|
||||
FROM information_schema.tables WHERE engine='innodb';
|
||||
drop table t8, t9;
|
||||
|
||||
|
49
mysql-test/suite/rpl/r/rpl_row_corruption.result
Normal file
49
mysql-test/suite/rpl/r/rpl_row_corruption.result
Normal file
@ -0,0 +1,49 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
CREATE TABLE t1_11753004 (c1 INT);
|
||||
CREATE TABLE t2_11753004 (c1 INT);
|
||||
INSERT INTO t1_11753004 VALUES (1);
|
||||
INSERT INTO t2_11753004 VALUES (2);
|
||||
call mtr.add_suppression(".*Found table map event mapping table id 0 which was already mapped but with different settings.*");
|
||||
include/stop_slave.inc
|
||||
SET @save_debug= @@global.debug;
|
||||
SET GLOBAL debug="+d,inject_tblmap_same_id_maps_diff_table";
|
||||
include/start_slave.inc
|
||||
UPDATE t1_11753004, t2_11753004 SET t1_11753004.c1=3, t2_11753004.c1=4 WHERE t1_11753004.c1=1 OR t2_11753004.c1=2;
|
||||
include/wait_for_slave_sql_error.inc [errno=1593 ]
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug="-d,inject_tblmap_same_id_maps_diff_table";
|
||||
include/start_slave.inc
|
||||
include/rpl_reset.inc
|
||||
DROP TABLE t1_11753004, t2_11753004;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug="+d,inject_tblmap_same_id_maps_diff_table";
|
||||
include/start_slave.inc
|
||||
include/rpl_reset.inc
|
||||
CREATE TABLE t1_11753004 (c1 INT);
|
||||
CREATE TABLE t2_11753004_ign (c1 INT);
|
||||
INSERT INTO t1_11753004 VALUES (1);
|
||||
INSERT INTO t2_11753004_ign VALUES (2);
|
||||
UPDATE t1_11753004, t2_11753004_ign SET t1_11753004.c1=3, t2_11753004_ign.c1=4 WHERE t1_11753004.c1=1 OR t2_11753004_ign.c1=2;
|
||||
CREATE TABLE t1 (c1 INT);
|
||||
CREATE TABLE t2 (c1 INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
BINLOG '
|
||||
SOgWTg8BAAAAbgAAAHIAAAAAAAQANS42LjMtbTUtZGVidWctbG9nAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAABI6BZOEzgNAAgAEgAEBAQEEgAAVgAEGggAAAAICAgCAAAAAAVAYI8=
|
||||
'/*!*/;
|
||||
SET GLOBAL debug="+d,inject_tblmap_same_id_maps_diff_table";
|
||||
BINLOG '
|
||||
SOgWThMBAAAAKQAAAAYDAAAAAEIAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
SOgWThMBAAAAKQAAAC8DAAAAAEMAAAAAAAEABHRlc3QAAnQyAAEDAAE=
|
||||
SOgWThgBAAAAKAAAAFcDAAAAAEIAAAAAAAAAAf///gEAAAD+AwAAAA==
|
||||
SOgWThgBAAAAKAAAAH8DAAAAAEMAAAAAAAEAAf///gEAAAD+BAAAAA==
|
||||
'/*!*/;
|
||||
ERROR HY000: Fatal error: Found table map event mapping table id 0 which was already mapped but with different settings.
|
||||
DROP TABLE t1,t2;
|
||||
SET GLOBAL debug="-d,inject_tblmap_same_id_maps_diff_table";
|
||||
DROP TABLE t1_11753004;
|
||||
DROP TABLE t2_11753004_ign;
|
||||
SET GLOBAL debug= @save_debug;
|
||||
include/rpl_end.inc
|
1
mysql-test/suite/rpl/t/rpl_row_corruption-slave.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_row_corruption-slave.opt
Normal file
@ -0,0 +1 @@
|
||||
--replicate-ignore-table=test.t2_11753004_ign
|
115
mysql-test/suite/rpl/t/rpl_row_corruption.test
Normal file
115
mysql-test/suite/rpl/t/rpl_row_corruption.test
Normal file
@ -0,0 +1,115 @@
|
||||
#
|
||||
--source include/master-slave.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_binlog_format_row.inc
|
||||
|
||||
# BUG#11753004: 44360: REPLICATION FAILED
|
||||
|
||||
## assert that we get an error when checking the
|
||||
## identifiers at the slave (instead of a crash or
|
||||
## different table being updated)
|
||||
|
||||
--let $t1= t1_11753004
|
||||
--let $t2= t2_11753004
|
||||
--let $t2_ign= t2_11753004_ign
|
||||
|
||||
## test #1: assert that we get an error raised when multiple
|
||||
## tables in the same RBR statement are mapped with the
|
||||
## same identifier
|
||||
|
||||
--eval CREATE TABLE $t1 (c1 INT)
|
||||
--eval CREATE TABLE $t2 (c1 INT)
|
||||
--eval INSERT INTO $t1 VALUES (1)
|
||||
--eval INSERT INTO $t2 VALUES (2)
|
||||
|
||||
--sync_slave_with_master
|
||||
call mtr.add_suppression(".*Found table map event mapping table id 0 which was already mapped but with different settings.*");
|
||||
|
||||
# stop the slave and inject corruption
|
||||
--source include/stop_slave.inc
|
||||
SET @save_debug= @@global.debug;
|
||||
SET GLOBAL debug="+d,inject_tblmap_same_id_maps_diff_table";
|
||||
--source include/start_slave.inc
|
||||
--connection master
|
||||
# both tables get mapped to 0 (in a way, simulating scenario
|
||||
# originated by BUG#56226)
|
||||
--eval UPDATE $t1, $t2 SET $t1.c1=3, $t2.c1=4 WHERE $t1.c1=1 OR $t2.c1=2
|
||||
--connection slave
|
||||
|
||||
# wait for error 1593 (ER_SLAVE_FATAL_ERROR)
|
||||
--let $slave_sql_errno=1593
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
--source include/stop_slave.inc
|
||||
|
||||
# clean up
|
||||
SET GLOBAL debug="-d,inject_tblmap_same_id_maps_diff_table";
|
||||
--source include/start_slave.inc
|
||||
--connection master
|
||||
--source include/rpl_reset.inc
|
||||
--eval DROP TABLE $t1, $t2
|
||||
--sync_slave_with_master
|
||||
|
||||
## test #2: assert that ignored tables that may have been mapped
|
||||
## with the same identifier are skipped, thus no error
|
||||
## is raised.
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
SET GLOBAL debug="+d,inject_tblmap_same_id_maps_diff_table";
|
||||
--source include/start_slave.inc
|
||||
--source include/rpl_reset.inc
|
||||
--connection master
|
||||
--eval CREATE TABLE $t1 (c1 INT)
|
||||
--eval CREATE TABLE $t2_ign (c1 INT)
|
||||
--eval INSERT INTO $t1 VALUES (1)
|
||||
--eval INSERT INTO $t2_ign VALUES (2)
|
||||
--eval UPDATE $t1, $t2_ign SET $t1.c1=3, $t2_ign.c1=4 WHERE $t1.c1=1 OR $t2_ign.c1=2
|
||||
|
||||
# must not raise error as second table is filtered
|
||||
--sync_slave_with_master
|
||||
|
||||
|
||||
## test #3: check that BINLOG statements will also raise an
|
||||
## error if containing table map events mapping different
|
||||
## tables to same table identifier.
|
||||
|
||||
CREATE TABLE t1 (c1 INT);
|
||||
CREATE TABLE t2 (c1 INT);
|
||||
|
||||
INSERT INTO t1 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
|
||||
# FD event
|
||||
BINLOG '
|
||||
SOgWTg8BAAAAbgAAAHIAAAAAAAQANS42LjMtbTUtZGVidWctbG9nAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAABI6BZOEzgNAAgAEgAEBAQEEgAAVgAEGggAAAAICAgCAAAAAAVAYI8=
|
||||
'/*!*/;
|
||||
|
||||
#110708 12:21:44 server id 1 end_log_pos 774 Table_map: `test`.`t1` mapped to number 66
|
||||
# at 774
|
||||
#110708 12:21:44 server id 1 end_log_pos 815 Table_map: `test`.`t2` mapped to number 67
|
||||
# at 815
|
||||
#110708 12:21:44 server id 1 end_log_pos 855 Update_rows: table id 66
|
||||
# at 855
|
||||
#110708 12:21:44 server id 1 end_log_pos 895 Update_rows: table id 67 flags: STMT_END_F
|
||||
SET GLOBAL debug="+d,inject_tblmap_same_id_maps_diff_table";
|
||||
--error ER_SLAVE_FATAL_ERROR
|
||||
BINLOG '
|
||||
SOgWThMBAAAAKQAAAAYDAAAAAEIAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
SOgWThMBAAAAKQAAAC8DAAAAAEMAAAAAAAEABHRlc3QAAnQyAAEDAAE=
|
||||
SOgWThgBAAAAKAAAAFcDAAAAAEIAAAAAAAAAAf///gEAAAD+AwAAAA==
|
||||
SOgWThgBAAAAKAAAAH8DAAAAAEMAAAAAAAEAAf///gEAAAD+BAAAAA==
|
||||
'/*!*/;
|
||||
|
||||
|
||||
# clean up
|
||||
DROP TABLE t1,t2;
|
||||
--connection slave
|
||||
SET GLOBAL debug="-d,inject_tblmap_same_id_maps_diff_table";
|
||||
--connection master
|
||||
--eval DROP TABLE $t1
|
||||
--eval DROP TABLE $t2_ign
|
||||
--sync_slave_with_master
|
||||
SET GLOBAL debug= @save_debug;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -928,4 +928,10 @@ SELECT DATE_FORMAT('0000-00-11', '%w');
|
||||
SELECT MAKEDATE(11111111,1);
|
||||
SELECT WEEK(DATE_ADD(FROM_DAYS(1),INTERVAL 1 MONTH), 1);
|
||||
|
||||
--echo #
|
||||
--echo # Bug#12584302 AFTER FIX FOR #12403504: ASSERTION FAILED: DELSUM+(INT) Y/4-TEMP > 0,
|
||||
--echo #
|
||||
|
||||
DO WEEK((DATE_ADD((CAST(0 AS DATE)), INTERVAL 1 YEAR_MONTH)), 5);
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -8350,9 +8350,10 @@ SET @@GLOBAL.init_connect= @old_init_connect;
|
||||
DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p5;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11840395 (formerly known as bug#60347):
|
||||
--echo # The string "versiondata" seems to be 'leaking' into the schema name space
|
||||
--echo # The string "versiondata" seems
|
||||
--echo # to be 'leaking' into the schema name space
|
||||
--echo #
|
||||
--disable_warnings
|
||||
@ -8368,6 +8369,34 @@ call mixedCaseDbName.tryMyProc();
|
||||
select mixedCaseDbName.tryMyFunc();
|
||||
DROP DATABASE mixedCaseDbName;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11766594 59736: SELECT DISTINCT.. INCORRECT RESULT WITH DETERMINISTIC FUNCTION IN WHERE C
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT, KEY(b));
|
||||
CREATE TABLE t2 (c INT, d INT, KEY(c));
|
||||
INSERT INTO t1 VALUES (1,1),(1,1),(1,2);
|
||||
INSERT INTO t2 VALUES (1,1),(1,2);
|
||||
|
||||
DELIMITER $;
|
||||
|
||||
CREATE FUNCTION f1() RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
DECLARE a int;
|
||||
-- SQL statement inside
|
||||
SELECT 1 INTO a;
|
||||
RETURN a;
|
||||
END $
|
||||
|
||||
DELIMITER ;$
|
||||
|
||||
SELECT COUNT(DISTINCT d) FROM t1, t2 WHERE a = c AND b = f1();
|
||||
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
|
||||
--echo # ------------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests
|
||||
--echo # ------------------------------------------------------------------
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000-2007 MySQL AB, 2009 Sun Microsystems, Inc.
|
||||
Use is subject to license terms.
|
||||
/*
|
||||
Copyright (c) 2000, 2011, 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
|
||||
@ -89,6 +89,8 @@ So, we can read full search-structure as 32-bit word
|
||||
#include "mysql_version.h"
|
||||
#include "lex.h"
|
||||
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
||||
const char *default_dbug_option="d:t:o,/tmp/gen_lex_hash.trace";
|
||||
|
||||
struct my_option my_long_options[] =
|
||||
@ -348,9 +350,7 @@ static void usage(int version)
|
||||
my_progname, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
|
||||
if (version)
|
||||
return;
|
||||
puts("Copyright (C) 2001 MySQL AB, by VVA and Monty");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\
|
||||
and you are welcome to modify and redistribute it under the GPL license\n");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
puts("This program generates a perfect hashing function for the sql_lex.cc");
|
||||
printf("Usage: %s [OPTIONS]\n\n", my_progname);
|
||||
my_print_help(my_long_options);
|
||||
@ -452,24 +452,9 @@ int main(int argc,char **argv)
|
||||
/* Broken up to indicate that it's not advice to you, gentle reader. */
|
||||
printf("/*\n\n Do " "not " "edit " "this " "file " "directly!\n\n*/\n");
|
||||
|
||||
printf("\
|
||||
/* Copyright (C) 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.\n\
|
||||
\n\
|
||||
This program is free software; you can redistribute it and/or modify\n\
|
||||
it under the terms of the GNU General Public License as published by\n\
|
||||
the Free Software Foundation; version 2 of the License.\n\
|
||||
\n\
|
||||
This program is distributed in the hope that it will be useful,\n\
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
|
||||
GNU General Public License for more details.\n\
|
||||
\n\
|
||||
You should have received a copy of the GNU General Public License\n\
|
||||
along with this program; see the file COPYING. If not, write to the\n\
|
||||
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston\n\
|
||||
MA 02110-1301 USA. */\n\
|
||||
\n\
|
||||
");
|
||||
puts("/*");
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
puts("*/");
|
||||
|
||||
/* Broken up to indicate that it's not advice to you, gentle reader. */
|
||||
printf("/* Do " "not " "edit " "this " "file! This is generated by "
|
||||
|
@ -2646,7 +2646,7 @@ String *Item_time_typecast::val_str(String *str)
|
||||
|
||||
bool Item_date_typecast::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
{
|
||||
bool res= get_arg0_date(ltime, TIME_FUZZY_DATE);
|
||||
bool res= get_arg0_date(ltime, fuzzy_date);
|
||||
ltime->hour= ltime->minute= ltime->second= ltime->second_part= 0;
|
||||
ltime->time_type= MYSQL_TIMESTAMP_DATE;
|
||||
return res;
|
||||
|
163
sql/log_event.cc
163
sql/log_event.cc
@ -59,6 +59,11 @@ static int rows_event_stmt_cleanup(Relay_log_info const *rli, THD* thd);
|
||||
|
||||
static const char *HA_ERR(int i)
|
||||
{
|
||||
/*
|
||||
This function should only be called in case of an error
|
||||
was detected
|
||||
*/
|
||||
DBUG_ASSERT(i != 0);
|
||||
switch (i) {
|
||||
case HA_ERR_KEY_NOT_FOUND: return "HA_ERR_KEY_NOT_FOUND";
|
||||
case HA_ERR_FOUND_DUPP_KEY: return "HA_ERR_FOUND_DUPP_KEY";
|
||||
@ -111,7 +116,7 @@ static const char *HA_ERR(int i)
|
||||
case HA_ERR_CORRUPT_EVENT: return "HA_ERR_CORRUPT_EVENT";
|
||||
case HA_ERR_ROWS_EVENT_APPLY : return "HA_ERR_ROWS_EVENT_APPLY";
|
||||
}
|
||||
return 0;
|
||||
return "No Error!";
|
||||
}
|
||||
|
||||
/**
|
||||
@ -132,7 +137,7 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error,
|
||||
TABLE *table, const char * type,
|
||||
const char *log_name, ulong pos)
|
||||
{
|
||||
const char *handler_error= HA_ERR(ha_error);
|
||||
const char *handler_error= (ha_error ? HA_ERR(ha_error) : NULL);
|
||||
char buff[MAX_SLAVE_ERRMSG], *slider;
|
||||
const char *buff_end= buff + sizeof(buff);
|
||||
uint len;
|
||||
@ -7596,7 +7601,8 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
|
||||
error= do_exec_row(rli);
|
||||
|
||||
DBUG_PRINT("info", ("error: %s", HA_ERR(error)));
|
||||
if (error)
|
||||
DBUG_PRINT("info", ("error: %s", HA_ERR(error)));
|
||||
DBUG_ASSERT(error != HA_ERR_RECORD_DELETED);
|
||||
|
||||
table->in_use = old_thd;
|
||||
@ -8222,6 +8228,97 @@ Table_map_log_event::~Table_map_log_event()
|
||||
*/
|
||||
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
|
||||
enum enum_tbl_map_status
|
||||
{
|
||||
/* no duplicate identifier found */
|
||||
OK_TO_PROCESS= 0,
|
||||
|
||||
/* this table map must be filtered out */
|
||||
FILTERED_OUT= 1,
|
||||
|
||||
/* identifier mapping table with different properties */
|
||||
SAME_ID_MAPPING_DIFFERENT_TABLE= 2,
|
||||
|
||||
/* a duplicate identifier was found mapping the same table */
|
||||
SAME_ID_MAPPING_SAME_TABLE= 3
|
||||
};
|
||||
|
||||
/*
|
||||
Checks if this table map event should be processed or not. First
|
||||
it checks the filtering rules, and then looks for duplicate identifiers
|
||||
in the existing list of rli->tables_to_lock.
|
||||
|
||||
It checks that there hasn't been any corruption by verifying that there
|
||||
are no duplicate entries with different properties.
|
||||
|
||||
In some cases, some binary logs could get corrupted, showing several
|
||||
tables mapped to the same table_id, 0 (see: BUG#56226). Thus we do this
|
||||
early sanity check for such cases and avoid that the server crashes
|
||||
later.
|
||||
|
||||
In some corner cases, the master logs duplicate table map events, i.e.,
|
||||
same id, same database name, same table name (see: BUG#37137). This is
|
||||
different from the above as it's the same table that is mapped again
|
||||
to the same identifier. Thus we cannot just check for same ids and
|
||||
assume that the event is corrupted we need to check every property.
|
||||
|
||||
NOTE: in the event that BUG#37137 ever gets fixed, this extra check
|
||||
will still be valid because we would need to support old binary
|
||||
logs anyway.
|
||||
|
||||
@param rli The relay log info reference.
|
||||
@param table_list A list element containing the table to check against.
|
||||
@return OK_TO_PROCESS
|
||||
if there was no identifier already in rli->tables_to_lock
|
||||
|
||||
FILTERED_OUT
|
||||
if the event is filtered according to the filtering rules
|
||||
|
||||
SAME_ID_MAPPING_DIFFERENT_TABLE
|
||||
if the same identifier already maps a different table in
|
||||
rli->tables_to_lock
|
||||
|
||||
SAME_ID_MAPPING_SAME_TABLE
|
||||
if the same identifier already maps the same table in
|
||||
rli->tables_to_lock.
|
||||
*/
|
||||
static enum_tbl_map_status
|
||||
check_table_map(Relay_log_info const *rli, RPL_TABLE_LIST *table_list)
|
||||
{
|
||||
DBUG_ENTER("check_table_map");
|
||||
enum_tbl_map_status res= OK_TO_PROCESS;
|
||||
|
||||
if (rli->sql_thd->slave_thread /* filtering is for slave only */ &&
|
||||
(!rpl_filter->db_ok(table_list->db) ||
|
||||
(rpl_filter->is_on() && !rpl_filter->tables_ok("", table_list))))
|
||||
res= FILTERED_OUT;
|
||||
else
|
||||
{
|
||||
for(RPL_TABLE_LIST *ptr= static_cast<RPL_TABLE_LIST*>(rli->tables_to_lock);
|
||||
ptr;
|
||||
ptr= static_cast<RPL_TABLE_LIST*>(ptr->next_local))
|
||||
{
|
||||
if (ptr->table_id == table_list->table_id)
|
||||
{
|
||||
|
||||
if (strcmp(ptr->db, table_list->db) ||
|
||||
strcmp(ptr->alias, table_list->table_name) ||
|
||||
ptr->lock_type != TL_WRITE) // the ::do_apply_event always sets TL_WRITE
|
||||
res= SAME_ID_MAPPING_DIFFERENT_TABLE;
|
||||
else
|
||||
res= SAME_ID_MAPPING_SAME_TABLE;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DBUG_PRINT("debug", ("check of table map ended up with: %u", res));
|
||||
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
|
||||
int Table_map_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
{
|
||||
RPL_TABLE_LIST *table_list;
|
||||
@ -8248,20 +8345,13 @@ int Table_map_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
table_list->alias= table_list->table_name = tname_mem;
|
||||
table_list->lock_type= TL_WRITE;
|
||||
table_list->next_global= table_list->next_local= 0;
|
||||
table_list->table_id= m_table_id;
|
||||
table_list->table_id= DBUG_EVALUATE_IF("inject_tblmap_same_id_maps_diff_table", 0, m_table_id);
|
||||
table_list->updating= 1;
|
||||
strmov(table_list->db, rpl_filter->get_rewrite_db(m_dbnam, &dummy_len));
|
||||
strmov(table_list->table_name, m_tblnam);
|
||||
|
||||
int error= 0;
|
||||
|
||||
if (rli->sql_thd->slave_thread /* filtering is for slave only */ &&
|
||||
(!rpl_filter->db_ok(table_list->db) ||
|
||||
(rpl_filter->is_on() && !rpl_filter->tables_ok("", table_list))))
|
||||
{
|
||||
my_free(memory, MYF(MY_WME));
|
||||
}
|
||||
else
|
||||
DBUG_PRINT("debug", ("table: %s is mapped to %u", table_list->table_name, table_list->table_id));
|
||||
enum_tbl_map_status tblmap_status= check_table_map(rli, table_list);
|
||||
if (tblmap_status == OK_TO_PROCESS)
|
||||
{
|
||||
DBUG_ASSERT(thd->lex->query_tables != table_list);
|
||||
|
||||
@ -8290,8 +8380,48 @@ int Table_map_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
const_cast<Relay_log_info*>(rli)->tables_to_lock_count++;
|
||||
/* 'memory' is freed in clear_tables_to_lock */
|
||||
}
|
||||
else // FILTERED_OUT, SAME_ID_MAPPING_*
|
||||
{
|
||||
/*
|
||||
If mapped already but with different properties, we raise an
|
||||
error.
|
||||
If mapped already but with same properties we skip the event.
|
||||
If filtered out we skip the event.
|
||||
|
||||
DBUG_RETURN(error);
|
||||
In all three cases, we need to free the memory previously
|
||||
allocated.
|
||||
*/
|
||||
if (tblmap_status == SAME_ID_MAPPING_DIFFERENT_TABLE)
|
||||
{
|
||||
/*
|
||||
Something bad has happened. We need to stop the slave as strange things
|
||||
could happen if we proceed: slave crash, wrong table being updated, ...
|
||||
As a consequence we push an error in this case.
|
||||
*/
|
||||
|
||||
char buf[256];
|
||||
|
||||
my_snprintf(buf, sizeof(buf),
|
||||
"Found table map event mapping table id %u which "
|
||||
"was already mapped but with different settings.",
|
||||
table_list->table_id);
|
||||
|
||||
if (thd->slave_thread)
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER(ER_SLAVE_FATAL_ERROR), buf);
|
||||
else
|
||||
/*
|
||||
For the cases in which a 'BINLOG' statement is set to
|
||||
execute in a user session
|
||||
*/
|
||||
my_printf_error(ER_SLAVE_FATAL_ERROR, ER(ER_SLAVE_FATAL_ERROR),
|
||||
MYF(0), buf);
|
||||
}
|
||||
|
||||
my_free(memory, MYF(0));
|
||||
}
|
||||
|
||||
DBUG_RETURN(tblmap_status == SAME_ID_MAPPING_DIFFERENT_TABLE);
|
||||
}
|
||||
|
||||
Log_event::enum_skip_reason
|
||||
@ -9220,7 +9350,8 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
restart_rnd_next:
|
||||
error= table->file->rnd_next(table->record[0]);
|
||||
|
||||
DBUG_PRINT("info", ("error: %s", HA_ERR(error)));
|
||||
if (error)
|
||||
DBUG_PRINT("info", ("error: %s", HA_ERR(error)));
|
||||
switch (error) {
|
||||
|
||||
case 0:
|
||||
|
@ -279,6 +279,8 @@ extern "C" sig_handler handle_segfault(int sig);
|
||||
|
||||
/* Constants */
|
||||
|
||||
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
|
||||
|
||||
const char *show_comp_option_name[]= {"YES", "NO", "DISABLED"};
|
||||
/*
|
||||
WARNING: When adding new SQL modes don't forget to update the
|
||||
@ -7796,13 +7798,8 @@ static void usage(void)
|
||||
if (!default_collation_name)
|
||||
default_collation_name= (char*) default_charset_info->name;
|
||||
print_version();
|
||||
puts("\
|
||||
Copyright (C) 2000-2008 MySQL AB, by Monty and others.\n\
|
||||
Copyright (C) 2008 Sun Microsystems, Inc.\n\
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\
|
||||
and you are welcome to modify and redistribute it under the GPL license\n\n\
|
||||
Starts the MySQL database server.\n");
|
||||
|
||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000, 2011"));
|
||||
puts("Starts the MySQL database server.\n");
|
||||
printf("Usage: %s [OPTIONS]\n", my_progname);
|
||||
if (!opt_verbose)
|
||||
puts("\nFor more help options (several pages), use mysqld --verbose --help.");
|
||||
|
@ -857,8 +857,8 @@ bool Protocol_text::store(const char *from, size_t length,
|
||||
{
|
||||
CHARSET_INFO *tocs= this->thd->variables.character_set_results;
|
||||
#ifndef DBUG_OFF
|
||||
DBUG_PRINT("info", ("Protocol_text::store field %u (%u): %s", field_pos,
|
||||
field_count, (length == 0? "" : from)));
|
||||
DBUG_PRINT("info", ("Protocol_text::store field %u (%u): %.*s", field_pos,
|
||||
field_count, (int) length, (length == 0 ? "" : from)));
|
||||
DBUG_ASSERT(field_pos < field_count);
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
|
||||
|
@ -7576,7 +7576,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
|
||||
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM &&
|
||||
sum_func_list)
|
||||
item->split_sum_func(thd, ref_pointer_array, *sum_func_list);
|
||||
thd->used_tables|= item->used_tables();
|
||||
thd->lex->used_tables|= item->used_tables();
|
||||
thd->lex->current_select->cur_pos_in_select_list++;
|
||||
}
|
||||
thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
|
||||
@ -7923,7 +7923,7 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
|
||||
views and natural joins this update is performed inside the loop below.
|
||||
*/
|
||||
if (table)
|
||||
thd->used_tables|= table->map;
|
||||
thd->lex->used_tables|= table->map;
|
||||
|
||||
/*
|
||||
Initialize a generic field iterator for the current table reference.
|
||||
@ -8008,7 +8008,7 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
|
||||
field_table= nj_col->table_ref->table;
|
||||
if (field_table)
|
||||
{
|
||||
thd->used_tables|= field_table->map;
|
||||
thd->lex->used_tables|= field_table->map;
|
||||
field_table->covering_keys.intersect(field->part_of_key);
|
||||
field_table->merge_keys.merge(field->part_of_key);
|
||||
field_table->used_fields++;
|
||||
@ -8016,7 +8016,7 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
|
||||
}
|
||||
}
|
||||
else
|
||||
thd->used_tables|= item->used_tables();
|
||||
thd->lex->used_tables|= item->used_tables();
|
||||
thd->lex->current_select->cur_pos_in_select_list++;
|
||||
}
|
||||
/*
|
||||
|
@ -649,7 +649,6 @@ THD::THD()
|
||||
is_slave_error= thread_specific_used= FALSE;
|
||||
hash_clear(&handler_tables_hash);
|
||||
tmp_table=0;
|
||||
used_tables=0;
|
||||
cuted_fields= sent_row_count= row_count= 0L;
|
||||
limit_found_rows= 0;
|
||||
row_count_func= -1;
|
||||
|
@ -1734,13 +1734,6 @@ public:
|
||||
*/
|
||||
ha_rows examined_row_count;
|
||||
|
||||
/*
|
||||
The set of those tables whose fields are referenced in all subqueries
|
||||
of the query.
|
||||
TODO: possibly this it is incorrect to have used tables in THD because
|
||||
with more than one subquery, it is not clear what does the field mean.
|
||||
*/
|
||||
table_map used_tables;
|
||||
USER_CONN *user_connect;
|
||||
CHARSET_INFO *db_charset;
|
||||
/*
|
||||
|
@ -631,7 +631,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
lock_type= table_list->lock_type;
|
||||
|
||||
thd_proc_info(thd, "init");
|
||||
thd->used_tables=0;
|
||||
thd->lex->used_tables=0;
|
||||
values= its++;
|
||||
value_count= values->elements;
|
||||
|
||||
@ -779,7 +779,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
}
|
||||
else
|
||||
{
|
||||
if (thd->used_tables) // Column used in values()
|
||||
if (thd->lex->used_tables) // Column used in values()
|
||||
restore_record(table,s->default_values); // Get empty record
|
||||
else
|
||||
{
|
||||
|
@ -360,6 +360,7 @@ void lex_start(THD *thd)
|
||||
lex->server_options.port= -1;
|
||||
|
||||
lex->is_lex_started= TRUE;
|
||||
lex->used_tables= 0;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -1836,6 +1836,16 @@ typedef struct st_lex : public Query_tables_list
|
||||
uint create_select_pos;
|
||||
bool create_select_in_comment;
|
||||
|
||||
/*
|
||||
The set of those tables whose fields are referenced in all subqueries
|
||||
of the query.
|
||||
TODO: possibly this it is incorrect to have used tables in LEX because
|
||||
with subquery, it is not clear what does the field mean. To fix this
|
||||
we should aggregate used tables information for selected expressions
|
||||
into the select_lex.
|
||||
*/
|
||||
table_map used_tables;
|
||||
|
||||
st_lex();
|
||||
|
||||
virtual ~st_lex()
|
||||
|
@ -1382,7 +1382,7 @@ static int mysql_test_select(Prepared_statement *stmt,
|
||||
if (open_normal_and_derived_tables(thd, tables, 0))
|
||||
goto error;
|
||||
|
||||
thd->used_tables= 0; // Updated by setup_fields
|
||||
thd->lex->used_tables= 0; // Updated by setup_fields
|
||||
|
||||
/*
|
||||
JOIN::prepare calls
|
||||
@ -1551,7 +1551,7 @@ static bool select_like_stmt_test(Prepared_statement *stmt,
|
||||
if (specific_prepare && (*specific_prepare)(thd))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
thd->used_tables= 0; // Updated by setup_fields
|
||||
thd->lex->used_tables= 0; // Updated by setup_fields
|
||||
|
||||
/* Calls JOIN::prepare */
|
||||
DBUG_RETURN(lex->unit.prepare(thd, 0, setup_tables_done_option));
|
||||
|
@ -406,7 +406,7 @@ fix_inner_refs(THD *thd, List<Item> &all_fields, SELECT_LEX *select,
|
||||
|
||||
if (!ref->fixed && ref->fix_fields(thd, 0))
|
||||
return TRUE;
|
||||
thd->used_tables|= item->used_tables();
|
||||
thd->lex->used_tables|= item->used_tables();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -1632,7 +1632,7 @@ JOIN::optimize()
|
||||
|
||||
if (exec_tmp_table1->distinct)
|
||||
{
|
||||
table_map used_tables= thd->used_tables;
|
||||
table_map used_tables= thd->lex->used_tables;
|
||||
JOIN_TAB *last_join_tab= join_tab+tables-1;
|
||||
do
|
||||
{
|
||||
@ -2526,7 +2526,7 @@ mysql_select(THD *thd, Item ***rref_pointer_array,
|
||||
if (!(join= new JOIN(thd, fields, select_options, result)))
|
||||
DBUG_RETURN(TRUE);
|
||||
thd_proc_info(thd, "init");
|
||||
thd->used_tables=0; // Updated by setup_fields
|
||||
thd->lex->used_tables=0; // Updated by setup_fields
|
||||
err= join->prepare(rref_pointer_array, tables, wild_num,
|
||||
conds, og_num, order, group, having, proc_param,
|
||||
select_lex, unit);
|
||||
@ -16949,7 +16949,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
|
||||
need_order=0;
|
||||
extra.append(STRING_WITH_LEN("; Using filesort"));
|
||||
}
|
||||
if (distinct & test_all_bits(used_tables,thd->used_tables))
|
||||
if (distinct & test_all_bits(used_tables, thd->lex->used_tables))
|
||||
extra.append(STRING_WITH_LEN("; Distinct"));
|
||||
|
||||
for (uint part= 0; part < tab->ref.key_parts; part++)
|
||||
|
@ -1,3 +1,16 @@
|
||||
2011-08-08 The InnoDB Team
|
||||
|
||||
* handler/ha_innodb.cc:
|
||||
Fix Bug#12770537 I_S.TABLES.DATA_LENGTH DOES NOT SHOW ON-DISK SIZE
|
||||
FOR COMPRESSED INNODB
|
||||
|
||||
2011-07-19 The InnoDB Team
|
||||
|
||||
* buf/buf0buf.c, buf/buf0rea.c, handler/ha_innodb.cc,
|
||||
include/buf0buf.h, include/buf0buf.ic, include/srv0srv.h,
|
||||
srv/srv0srv.c:
|
||||
Fix Bug#12356373 by reintroducing random readahead
|
||||
|
||||
2011-06-30 The InnoDB Team
|
||||
|
||||
* row/row0row.c:
|
||||
|
@ -3590,12 +3590,16 @@ buf_print_io(
|
||||
|
||||
/* Statistics about read ahead algorithm */
|
||||
fprintf(file, "Pages read ahead %.2f/s,"
|
||||
" evicted without access %.2f/s\n",
|
||||
" evicted without access %.2f/s,"
|
||||
" Random read ahead %.2f/s\n",
|
||||
(buf_pool->stat.n_ra_pages_read
|
||||
- buf_pool->old_stat.n_ra_pages_read)
|
||||
/ time_elapsed,
|
||||
(buf_pool->stat.n_ra_pages_evicted
|
||||
- buf_pool->old_stat.n_ra_pages_evicted)
|
||||
/ time_elapsed,
|
||||
(buf_pool->stat.n_ra_pages_read_rnd
|
||||
- buf_pool->old_stat.n_ra_pages_read_rnd)
|
||||
/ time_elapsed);
|
||||
|
||||
/* Print some values to help us with visualizing what is
|
||||
|
@ -38,6 +38,14 @@ Created 11/5/1995 Heikki Tuuri
|
||||
#include "srv0start.h"
|
||||
#include "srv0srv.h"
|
||||
|
||||
/** The size in blocks of the area where the random read-ahead algorithm counts
|
||||
the accessed pages when deciding whether to read-ahead */
|
||||
#define BUF_READ_AHEAD_RANDOM_AREA BUF_READ_AHEAD_AREA
|
||||
|
||||
/** There must be at least this many pages in buf_pool in the area to start
|
||||
a random read-ahead */
|
||||
#define BUF_READ_AHEAD_RANDOM_THRESHOLD (5 + BUF_READ_AHEAD_RANDOM_AREA / 8)
|
||||
|
||||
/** The linear read-ahead area size */
|
||||
#define BUF_READ_AHEAD_LINEAR_AREA BUF_READ_AHEAD_AREA
|
||||
|
||||
@ -157,6 +165,165 @@ buf_read_page_low(
|
||||
return(1);
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
Applies a random read-ahead in buf_pool if there are at least a threshold
|
||||
value of accessed pages from the random read-ahead area. Does not read any
|
||||
page, not even the one at the position (space, offset), if the read-ahead
|
||||
mechanism is not activated. NOTE 1: the calling thread may own latches on
|
||||
pages: to avoid deadlocks this function must be written such that it cannot
|
||||
end up waiting for these latches! NOTE 2: the calling thread must want
|
||||
access to the page given: this rule is set to prevent unintended read-aheads
|
||||
performed by ibuf routines, a situation which could result in a deadlock if
|
||||
the OS does not support asynchronous i/o.
|
||||
@return number of page read requests issued; NOTE that if we read ibuf
|
||||
pages, it may happen that the page at the given page number does not
|
||||
get read even if we return a positive value! */
|
||||
static
|
||||
ulint
|
||||
buf_read_ahead_random(
|
||||
/*==================*/
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size,/*!< in: compressed page size in bytes, or 0 */
|
||||
ulint offset) /*!< in: page number of a page which the current thread
|
||||
wants to access */
|
||||
{
|
||||
ib_int64_t tablespace_version;
|
||||
ulint recent_blocks = 0;
|
||||
ulint count;
|
||||
ulint ibuf_mode;
|
||||
ulint low, high;
|
||||
ulint err;
|
||||
ulint i;
|
||||
ulint buf_read_ahead_random_area;
|
||||
|
||||
if (!srv_random_read_ahead) {
|
||||
/* Disabled by user */
|
||||
return(0);
|
||||
}
|
||||
|
||||
if (srv_startup_is_before_trx_rollback_phase) {
|
||||
/* No read-ahead to avoid thread deadlocks */
|
||||
return(0);
|
||||
}
|
||||
|
||||
if (ibuf_bitmap_page(zip_size, offset)
|
||||
|| trx_sys_hdr_page(space, offset)) {
|
||||
|
||||
/* If it is an ibuf bitmap page or trx sys hdr, we do
|
||||
no read-ahead, as that could break the ibuf page access
|
||||
order */
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Remember the tablespace version before we ask the tablespace size
|
||||
below: if DISCARD + IMPORT changes the actual .ibd file meanwhile, we
|
||||
do not try to read outside the bounds of the tablespace! */
|
||||
|
||||
tablespace_version = fil_space_get_version(space);
|
||||
|
||||
buf_read_ahead_random_area = BUF_READ_AHEAD_RANDOM_AREA;
|
||||
|
||||
low = (offset / buf_read_ahead_random_area)
|
||||
* buf_read_ahead_random_area;
|
||||
high = (offset / buf_read_ahead_random_area + 1)
|
||||
* buf_read_ahead_random_area;
|
||||
if (high > fil_space_get_size(space)) {
|
||||
|
||||
high = fil_space_get_size(space);
|
||||
}
|
||||
|
||||
buf_pool_mutex_enter();
|
||||
|
||||
if (buf_pool->n_pend_reads
|
||||
> buf_pool->curr_size / BUF_READ_AHEAD_PEND_LIMIT) {
|
||||
buf_pool_mutex_exit();
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Count how many blocks in the area have been recently accessed,
|
||||
that is, reside near the start of the LRU list. */
|
||||
|
||||
for (i = low; i < high; i++) {
|
||||
const buf_page_t* bpage = buf_page_hash_get(space, i);
|
||||
|
||||
if (bpage
|
||||
&& buf_page_is_accessed(bpage)
|
||||
&& buf_page_peek_if_young(bpage)) {
|
||||
|
||||
recent_blocks++;
|
||||
|
||||
if (recent_blocks >= BUF_READ_AHEAD_RANDOM_THRESHOLD) {
|
||||
|
||||
buf_pool_mutex_exit();
|
||||
goto read_ahead;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buf_pool_mutex_exit();
|
||||
/* Do nothing */
|
||||
return(0);
|
||||
|
||||
read_ahead:
|
||||
/* Read all the suitable blocks within the area */
|
||||
|
||||
if (ibuf_inside()) {
|
||||
ibuf_mode = BUF_READ_IBUF_PAGES_ONLY;
|
||||
} else {
|
||||
ibuf_mode = BUF_READ_ANY_PAGE;
|
||||
}
|
||||
|
||||
count = 0;
|
||||
|
||||
for (i = low; i < high; i++) {
|
||||
/* It is only sensible to do read-ahead in the non-sync aio
|
||||
mode: hence FALSE as the first parameter */
|
||||
|
||||
if (!ibuf_bitmap_page(zip_size, i)) {
|
||||
count += buf_read_page_low(
|
||||
&err, FALSE,
|
||||
ibuf_mode | OS_AIO_SIMULATED_WAKE_LATER,
|
||||
space, zip_size, FALSE,
|
||||
tablespace_version, i);
|
||||
if (err == DB_TABLESPACE_DELETED) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: Warning: in random"
|
||||
" readahead trying to access\n"
|
||||
"InnoDB: tablespace %lu page %lu,\n"
|
||||
"InnoDB: but the tablespace does not"
|
||||
" exist or is just being dropped.\n",
|
||||
(ulong) space, (ulong) i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* In simulated aio we wake the aio handler threads only after
|
||||
queuing all aio requests, in native aio the following call does
|
||||
nothing: */
|
||||
|
||||
os_aio_simulated_wake_handler_threads();
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
if (buf_debug_prints && (count > 0)) {
|
||||
fprintf(stderr,
|
||||
"Random read-ahead space %lu offset %lu pages %lu\n",
|
||||
(ulong) space, (ulong) offset,
|
||||
(ulong) count);
|
||||
}
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
/* Read ahead is considered one I/O operation for the purpose of
|
||||
LRU policy decision. */
|
||||
buf_LRU_stat_inc_io();
|
||||
|
||||
buf_pool->stat.n_ra_pages_read_rnd += count;
|
||||
return(count);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************//**
|
||||
High-level function which reads a page asynchronously from a file to the
|
||||
buffer buf_pool if it is not already there. Sets the io_fix flag and sets
|
||||
@ -175,6 +342,9 @@ buf_read_page(
|
||||
ulint count;
|
||||
ulint err;
|
||||
|
||||
count = buf_read_ahead_random(space, zip_size, offset);
|
||||
srv_buf_pool_reads += count;
|
||||
|
||||
tablespace_version = fil_space_get_version(space);
|
||||
|
||||
/* We do the i/o in the synchronous aio mode to save thread
|
||||
|
@ -501,6 +501,8 @@ static SHOW_VAR innodb_status_variables[]= {
|
||||
(char*) &export_vars.innodb_buffer_pool_pages_misc, SHOW_LONG},
|
||||
{"buffer_pool_pages_total",
|
||||
(char*) &export_vars.innodb_buffer_pool_pages_total, SHOW_LONG},
|
||||
{"buffer_pool_read_ahead_rnd",
|
||||
(char*) &export_vars.innodb_buffer_pool_read_ahead_rnd, SHOW_LONG},
|
||||
{"buffer_pool_read_ahead",
|
||||
(char*) &export_vars.innodb_buffer_pool_read_ahead, SHOW_LONG},
|
||||
{"buffer_pool_read_ahead_evicted",
|
||||
@ -7650,6 +7652,8 @@ ha_innobase::info_low(
|
||||
|
||||
if (flag & HA_STATUS_VARIABLE) {
|
||||
|
||||
ulint page_size;
|
||||
|
||||
dict_table_stats_lock(ib_table, RW_S_LATCH);
|
||||
|
||||
n_rows = ib_table->stat_n_rows;
|
||||
@ -7692,14 +7696,19 @@ ha_innobase::info_low(
|
||||
prebuilt->autoinc_last_value = 0;
|
||||
}
|
||||
|
||||
page_size = dict_table_zip_size(ib_table);
|
||||
if (page_size == 0) {
|
||||
page_size = UNIV_PAGE_SIZE;
|
||||
}
|
||||
|
||||
stats.records = (ha_rows)n_rows;
|
||||
stats.deleted = 0;
|
||||
stats.data_file_length = ((ulonglong)
|
||||
ib_table->stat_clustered_index_size)
|
||||
* UNIV_PAGE_SIZE;
|
||||
stats.index_file_length = ((ulonglong)
|
||||
ib_table->stat_sum_of_other_index_sizes)
|
||||
* UNIV_PAGE_SIZE;
|
||||
stats.data_file_length
|
||||
= ((ulonglong) ib_table->stat_clustered_index_size)
|
||||
* page_size;
|
||||
stats.index_file_length =
|
||||
((ulonglong) ib_table->stat_sum_of_other_index_sizes)
|
||||
* page_size;
|
||||
|
||||
dict_table_stats_unlock(ib_table, RW_S_LATCH);
|
||||
|
||||
@ -11027,6 +11036,11 @@ static MYSQL_SYSVAR_UINT(change_buffering_debug, ibuf_debug,
|
||||
NULL, NULL, 0, 0, 1, 0);
|
||||
#endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */
|
||||
|
||||
static MYSQL_SYSVAR_BOOL(random_read_ahead, srv_random_read_ahead,
|
||||
PLUGIN_VAR_NOCMDARG,
|
||||
"Whether to use read ahead for random access within an extent.",
|
||||
NULL, NULL, FALSE);
|
||||
|
||||
static MYSQL_SYSVAR_ULONG(read_ahead_threshold, srv_read_ahead_threshold,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Number of pages that must be accessed sequentially for InnoDB to "
|
||||
@ -11091,6 +11105,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
|
||||
#if defined UNIV_DEBUG || defined UNIV_IBUF_DEBUG
|
||||
MYSQL_SYSVAR(change_buffering_debug),
|
||||
#endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */
|
||||
MYSQL_SYSVAR(random_read_ahead),
|
||||
MYSQL_SYSVAR(read_ahead_threshold),
|
||||
MYSQL_SYSVAR(io_capacity),
|
||||
NULL
|
||||
|
@ -427,6 +427,18 @@ buf_block_get_freed_page_clock(
|
||||
__attribute__((pure));
|
||||
|
||||
/********************************************************************//**
|
||||
Tells if a block is still close enough to the MRU end of the LRU list
|
||||
meaning that it is not in danger of getting evicted and also implying
|
||||
that it has been accessed recently.
|
||||
Note that this is for heuristics only and does not reserve buffer pool
|
||||
mutex.
|
||||
@return TRUE if block is close to MRU end of LRU */
|
||||
UNIV_INLINE
|
||||
ibool
|
||||
buf_page_peek_if_young(
|
||||
/*===================*/
|
||||
const buf_page_t* bpage); /*!< in: block */
|
||||
/********************************************************************//**
|
||||
Recommends a move of a block to the start of the LRU list if there is danger
|
||||
of dropping from the buffer pool. NOTE: does not reserve the buffer pool
|
||||
mutex.
|
||||
@ -1334,6 +1346,8 @@ struct buf_pool_stat_struct{
|
||||
ulint n_pages_written;/*!< number write operations */
|
||||
ulint n_pages_created;/*!< number of pages created
|
||||
in the pool with no read */
|
||||
ulint n_ra_pages_read_rnd;/*!< number of pages read in
|
||||
as part of random read ahead */
|
||||
ulint n_ra_pages_read;/*!< number of pages read in
|
||||
as part of read ahead */
|
||||
ulint n_ra_pages_evicted;/*!< number of read ahead
|
||||
|
@ -61,6 +61,27 @@ buf_block_get_freed_page_clock(
|
||||
return(buf_page_get_freed_page_clock(&block->page));
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
Tells if a block is still close enough to the MRU end of the LRU list
|
||||
meaning that it is not in danger of getting evicted and also implying
|
||||
that it has been accessed recently.
|
||||
Note that this is for heuristics only and does not reserve buffer pool
|
||||
mutex.
|
||||
@return TRUE if block is close to MRU end of LRU */
|
||||
UNIV_INLINE
|
||||
ibool
|
||||
buf_page_peek_if_young(
|
||||
/*===================*/
|
||||
const buf_page_t* bpage) /*!< in: block */
|
||||
{
|
||||
/* FIXME: bpage->freed_page_clock is 31 bits */
|
||||
return((buf_pool->freed_page_clock & ((1UL << 31) - 1))
|
||||
< ((ulint) bpage->freed_page_clock
|
||||
+ (buf_pool->curr_size
|
||||
* (BUF_LRU_OLD_RATIO_DIV - buf_LRU_old_ratio)
|
||||
/ (BUF_LRU_OLD_RATIO_DIV * 4))));
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
Recommends a move of a block to the start of the LRU list if there is danger
|
||||
of dropping from the buffer pool. NOTE: does not reserve the buffer pool
|
||||
@ -89,12 +110,7 @@ buf_page_peek_if_too_old(
|
||||
buf_pool->stat.n_pages_not_made_young++;
|
||||
return(FALSE);
|
||||
} else {
|
||||
/* FIXME: bpage->freed_page_clock is 31 bits */
|
||||
return((buf_pool->freed_page_clock & ((1UL << 31) - 1))
|
||||
> ((ulint) bpage->freed_page_clock
|
||||
+ (buf_pool->curr_size
|
||||
* (BUF_LRU_OLD_RATIO_DIV - buf_LRU_old_ratio)
|
||||
/ (BUF_LRU_OLD_RATIO_DIV * 4))));
|
||||
return(!buf_page_peek_if_young(bpage));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,6 +143,7 @@ extern ulint srv_mem_pool_size;
|
||||
extern ulint srv_lock_table_size;
|
||||
|
||||
extern ulint srv_n_file_io_threads;
|
||||
extern my_bool srv_random_read_ahead;
|
||||
extern ulong srv_read_ahead_threshold;
|
||||
extern ulint srv_n_read_io_threads;
|
||||
extern ulint srv_n_write_io_threads;
|
||||
@ -618,6 +619,7 @@ struct export_var_struct{
|
||||
ulint innodb_buffer_pool_wait_free; /*!< srv_buf_pool_wait_free */
|
||||
ulint innodb_buffer_pool_pages_flushed; /*!< srv_buf_pool_flushed */
|
||||
ulint innodb_buffer_pool_write_requests;/*!< srv_buf_pool_write_requests */
|
||||
ulint innodb_buffer_pool_read_ahead_rnd;/*!< srv_read_ahead_rnd */
|
||||
ulint innodb_buffer_pool_read_ahead; /*!< srv_read_ahead */
|
||||
ulint innodb_buffer_pool_read_ahead_evicted;/*!< srv_read_ahead evicted*/
|
||||
ulint innodb_dblwr_pages_written; /*!< srv_dblwr_pages_written */
|
||||
|
@ -148,22 +148,27 @@ row_build_index_entry(
|
||||
continue;
|
||||
}
|
||||
} else if (dfield_is_ext(dfield)) {
|
||||
/* This table should be in Antelope format
|
||||
(ROW_FORMAT=REDUNDANT or ROW_FORMAT=COMPACT).
|
||||
In that format, the maximum column prefix
|
||||
/* This table is either in Antelope format
|
||||
(ROW_FORMAT=REDUNDANT or ROW_FORMAT=COMPACT)
|
||||
or a purge record where the ordered part of
|
||||
the field is not external.
|
||||
In Antelope, the maximum column prefix
|
||||
index length is 767 bytes, and the clustered
|
||||
index record contains a 768-byte prefix of
|
||||
each off-page column. */
|
||||
ut_a(len >= BTR_EXTERN_FIELD_REF_SIZE);
|
||||
len -= BTR_EXTERN_FIELD_REF_SIZE;
|
||||
dfield_set_len(dfield, len);
|
||||
}
|
||||
|
||||
/* If a column prefix index, take only the prefix. */
|
||||
ut_ad(ind_field->prefix_len);
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ind_field->prefix_len, len, dfield_get_data(dfield));
|
||||
dfield_set_len(dfield, len);
|
||||
if (ind_field->prefix_len) {
|
||||
len = dtype_get_at_most_n_mbchars(
|
||||
col->prtype, col->mbminlen, col->mbmaxlen,
|
||||
ind_field->prefix_len, len,
|
||||
dfield_get_data(dfield));
|
||||
dfield_set_len(dfield, len);
|
||||
}
|
||||
}
|
||||
|
||||
ut_ad(dtuple_check_typed(entry));
|
||||
|
@ -203,6 +203,8 @@ UNIV_INTERN ulint srv_n_file_io_threads = ULINT_MAX;
|
||||
UNIV_INTERN ulint srv_n_read_io_threads = ULINT_MAX;
|
||||
UNIV_INTERN ulint srv_n_write_io_threads = ULINT_MAX;
|
||||
|
||||
/* Switch to enable random read ahead. */
|
||||
UNIV_INTERN my_bool srv_random_read_ahead = FALSE;
|
||||
/* User settable value of the number of pages that must be present
|
||||
in the buffer cache and accessed sequentially for InnoDB to trigger a
|
||||
readahead request. */
|
||||
@ -1906,6 +1908,8 @@ srv_export_innodb_status(void)
|
||||
export_vars.innodb_buffer_pool_wait_free = srv_buf_pool_wait_free;
|
||||
export_vars.innodb_buffer_pool_pages_flushed = srv_buf_pool_flushed;
|
||||
export_vars.innodb_buffer_pool_reads = srv_buf_pool_reads;
|
||||
export_vars.innodb_buffer_pool_read_ahead_rnd
|
||||
= buf_pool->stat.n_ra_pages_read_rnd;
|
||||
export_vars.innodb_buffer_pool_read_ahead
|
||||
= buf_pool->stat.n_ra_pages_read;
|
||||
export_vars.innodb_buffer_pool_read_ahead_evicted
|
||||
|
@ -798,13 +798,12 @@ else
|
||||
fi
|
||||
# echo "Analyzed: SERVER_TO_START=$SERVER_TO_START"
|
||||
if [ ! -d $mysql_datadir/mysql ] ; then
|
||||
mkdir $mysql_datadir/mysql;
|
||||
mkdir $mysql_datadir/mysql $mysql_datadir/test
|
||||
echo "MySQL RPM installation of version $NEW_VERSION" >> $STATUS_FILE
|
||||
else
|
||||
# If the directory exists, we may assume it is an upgrade.
|
||||
echo "MySQL RPM upgrade to version $NEW_VERSION" >> $STATUS_FILE
|
||||
fi
|
||||
if [ ! -d $mysql_datadir/test ] ; then mkdir $mysql_datadir/test; fi
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Make MySQL start/shutdown automatically when the machine does it.
|
||||
@ -837,7 +836,12 @@ chown -R %{mysqld_user}:%{mysqld_group} $mysql_datadir
|
||||
# ----------------------------------------------------------------------
|
||||
# Initiate databases if needed
|
||||
# ----------------------------------------------------------------------
|
||||
%{_bindir}/mysql_install_db --rpm --user=%{mysqld_user}
|
||||
if ! grep '^MySQL RPM upgrade' $STATUS_FILE >/dev/null 2>&1 ; then
|
||||
# Fix bug#45415: no "mysql_install_db" on an upgrade
|
||||
# Do this as a negative to err towards more "install" runs
|
||||
# rather than to miss one.
|
||||
%{_bindir}/mysql_install_db --rpm --user=%{mysqld_user}
|
||||
fi
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Upgrade databases if needed would go here - but it cannot be automated yet
|
||||
@ -1161,6 +1165,12 @@ fi
|
||||
# merging BK trees)
|
||||
##############################################################################
|
||||
%changelog
|
||||
* Thu Jul 07 2011 Joerg Bruehe <joerg.bruehe@oracle.com>
|
||||
|
||||
- Fix bug#45415: "rpm upgrade recreates test database"
|
||||
Let the creation of the "test" database happen only during a new installation,
|
||||
not in an RPM upgrade.
|
||||
This affects both the "mkdir" and the call of "mysql_install_db".
|
||||
|
||||
* Thu Feb 03 2011 Joerg Bruehe <joerg.bruehe@oracle.com>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user