Merge MySQL 5.1.66 -> MariaDB 5.1.65

This commit is contained in:
unknown 2012-11-06 11:52:55 +02:00
commit 7c23d6d0c6
83 changed files with 2888 additions and 429 deletions

View File

@ -437,6 +437,10 @@ IF(WITH_EMBEDDED_SERVER)
ENDIF(WITH_EMBEDDED_SERVER) ENDIF(WITH_EMBEDDED_SERVER)
ADD_SUBDIRECTORY(mysql-test/lib/My/SafeProcess) ADD_SUBDIRECTORY(mysql-test/lib/My/SafeProcess)
IF(EXISTS ${CMAKE_SOURCE_DIR}/internal/CMakeLists.txt)
ADD_SUBDIRECTORY(internal)
ENDIF()
# Set up the installer # Set up the installer
SET(CPACK_PACKAGE_NAME "MariaDB") SET(CPACK_PACKAGE_NAME "MariaDB")
STRING(REPLACE "-MariaDB" "" CPACK_PACKAGE_VERSION ${VERSION}) STRING(REPLACE "-MariaDB" "" CPACK_PACKAGE_VERSION ${VERSION})

View File

@ -31,7 +31,7 @@ also applies.
first. first.
If you run into problems and need to file a bug report, If you run into problems and need to file a bug report,
please report them to: http://bugs.launchpad.net/maria please report them to: http://mariadb.org/jira
See the instructions in Section 1.6, "How to Report Bugs or Problems." See the instructions in Section 1.6, "How to Report Bugs or Problems."

View File

@ -1,6 +1,6 @@
/* Copyright (C) 2000-2009 MySQL AB /*
Copyright 2000, 2010-2011, Oracle and/or its affiliates. Copyright (c) 2000, 2012, Oracle and/or its affiliates.
Copyright 2000-2010 Monty Program Ab Copyright (c) 2009, 2012, Monty Program Ab.
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
@ -119,6 +119,7 @@ extern "C" {
#endif #endif
#include "completion_hash.h" #include "completion_hash.h"
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
#define PROMPT_CHAR '\\' #define PROMPT_CHAR '\\'
#define DEFAULT_DELIMITER ";" #define DEFAULT_DELIMITER ";"
@ -1176,7 +1177,7 @@ int main(int argc,char *argv[])
mysql_thread_id(&mysql), server_version_string(&mysql)); mysql_thread_id(&mysql), server_version_string(&mysql));
put_info((char*) glob_buffer.ptr(),INFO_INFO); put_info((char*) glob_buffer.ptr(),INFO_INFO);
put_info(COPYRIGHT_NOTICE, INFO_INFO); put_info(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"), INFO_INFO);
#ifdef HAVE_READLINE #ifdef HAVE_READLINE
initialize_readline((char*) my_progname); initialize_readline((char*) my_progname);
@ -1604,7 +1605,7 @@ static void usage(int version)
if (version) if (version)
return; return;
printf("%s", COPYRIGHT_NOTICE); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
printf("Usage: %s [OPTIONS] [database]\n", my_progname); printf("Usage: %s [OPTIONS] [database]\n", my_progname);
my_print_help(my_long_options); my_print_help(my_long_options);
print_defaults("my", load_default_groups); print_defaults("my", load_default_groups);
@ -2826,7 +2827,7 @@ static int com_server_help(String *buffer __attribute__((unused)),
char *line __attribute__((unused)), char *help_arg) char *line __attribute__((unused)), char *help_arg)
{ {
MYSQL_ROW cur; MYSQL_ROW cur;
const char *server_cmd= buffer->ptr(); const char *server_cmd;
char cmd_buf[100 + 1]; char cmd_buf[100 + 1];
MYSQL_RES *result; MYSQL_RES *result;
int error; int error;
@ -2841,9 +2842,12 @@ static int com_server_help(String *buffer __attribute__((unused)),
*++end_arg= '\0'; *++end_arg= '\0';
} }
(void) strxnmov(cmd_buf, sizeof(cmd_buf), "help '", help_arg, "'", NullS); (void) strxnmov(cmd_buf, sizeof(cmd_buf), "help '", help_arg, "'", NullS);
server_cmd= cmd_buf;
} }
else
(void) strxnmov(cmd_buf, sizeof(cmd_buf), "help ", help_arg, NullS);
server_cmd= cmd_buf;
if (!status.batch) if (!status.batch)
{ {
old_buffer= *buffer; old_buffer= *buffer;
@ -2911,6 +2915,11 @@ static int com_server_help(String *buffer __attribute__((unused)),
else else
{ {
put_info("\nNothing found", INFO_INFO); put_info("\nNothing found", INFO_INFO);
if (strncasecmp(server_cmd, "help 'contents'", 15) == 0)
{
put_info("\nPlease check if 'help tables' are loaded.\n", INFO_INFO);
goto err;
}
put_info("Please try to run 'help contents' for a list of all accessible topics\n", INFO_INFO); put_info("Please try to run 'help contents' for a list of all accessible topics\n", INFO_INFO);
} }
} }

View File

@ -1,7 +1,5 @@
/* /*
Copyright (C) 2000 MySQL AB Copyright (c) 2006, 2012, Oracle and/or its affiliates.
Copyright (c) 2006, 2011, Oracle and/or its affiliates.
Copyright (C) 2010-2011 Monty Program Ab
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
@ -21,6 +19,8 @@
#include <sslopt-vars.h> #include <sslopt-vars.h>
#include "../scripts/mysql_fix_privilege_tables_sql.c" #include "../scripts/mysql_fix_privilege_tables_sql.c"
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
#define VER "1.2" #define VER "1.2"
#ifdef HAVE_SYS_WAIT_H #ifdef HAVE_SYS_WAIT_H
@ -235,6 +235,7 @@ get_one_option(int optid, const struct my_option *opt,
case '?': case '?':
printf("%s Ver %s Distrib %s, for %s (%s)\n", printf("%s Ver %s Distrib %s, for %s (%s)\n",
my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE); my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
puts("MySQL utility for upgrading databases to new MySQL versions.\n"); puts("MySQL utility for upgrading databases to new MySQL versions.\n");
my_print_help(my_long_options); my_print_help(my_long_options);
exit(0); exit(0);

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates. Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -25,6 +25,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <mysql.h> #include <mysql.h>
#include <sql_common.h> #include <sql_common.h>
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
#define ADMIN_VERSION "8.42" #define ADMIN_VERSION "8.42"
#define MAX_MYSQL_VAR 512 #define MAX_MYSQL_VAR 512
@ -692,8 +693,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
case ADMIN_VER: case ADMIN_VER:
new_line=1; new_line=1;
print_version(); print_version();
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
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");
printf("Server version\t\t%s\n", mysql_get_server_info(mysql)); printf("Server version\t\t%s\n", mysql_get_server_info(mysql));
printf("Protocol version\t%d\n", mysql_get_proto_info(mysql)); printf("Protocol version\t%d\n", mysql_get_proto_info(mysql));
printf("Connection\t\t%s\n",mysql_get_host_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) static void usage(void)
{ {
print_version(); print_version();
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
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("Administration program for the mysqld daemon."); puts("Administration program for the mysqld daemon.");
printf("Usage: %s [OPTIONS] command command....\n", my_progname); printf("Usage: %s [OPTIONS] command command....\n", my_progname);
my_print_help(my_long_options); my_print_help(my_long_options);

View File

@ -36,6 +36,8 @@
#include "mysql_priv.h" #include "mysql_priv.h"
#include "log_event.h" #include "log_event.h"
#include "sql_common.h" #include "sql_common.h"
#include "my_dir.h"
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
#define BIN_LOG_HEADER_SIZE 4 #define BIN_LOG_HEADER_SIZE 4
#define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4) #define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4)
@ -1273,10 +1275,7 @@ static void print_version()
static void usage() static void usage()
{ {
print_version(); print_version();
puts("By Monty and Sasha, for your professional use\n\ puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
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");
printf("\ printf("\
Dumps a MySQL binary log in a format usable for viewing or for piping to\n\ Dumps a MySQL binary log in a format usable for viewing or for piping to\n\
the mysql command line client.\n\n"); the mysql command line client.\n\n");
@ -1773,6 +1772,7 @@ static Exit_status check_header(IO_CACHE* file,
uchar header[BIN_LOG_HEADER_SIZE]; uchar header[BIN_LOG_HEADER_SIZE];
uchar buf[PROBE_HEADER_LEN]; uchar buf[PROBE_HEADER_LEN];
my_off_t tmp_pos, pos; my_off_t tmp_pos, pos;
MY_STAT my_file_stat;
delete glob_description_event; delete glob_description_event;
if (!(glob_description_event= new Format_description_log_event(3))) if (!(glob_description_event= new Format_description_log_event(3)))
@ -1782,7 +1782,16 @@ static Exit_status check_header(IO_CACHE* file,
} }
pos= my_b_tell(file); pos= my_b_tell(file);
my_b_seek(file, (my_off_t)0);
/* fstat the file to check if the file is a regular file. */
if (my_fstat(file->file, &my_file_stat, MYF(0)) == -1)
{
error("Unable to stat the file.");
return ERROR_STOP;
}
if ((my_file_stat.st_mode & S_IFMT) == S_IFREG)
my_b_seek(file, (my_off_t)0);
if (my_b_read(file, header, sizeof(header))) if (my_b_read(file, header, sizeof(header)))
{ {
error("Failed reading header; probably an empty file."); error("Failed reading header; probably an empty file.");

View File

@ -1,6 +1,5 @@
/* Copyright (C) 2000 MySQL AB & Jani Tolonen /*
Copyright (c) 2001, 2011, Oracle and/or its affiliates. Copyright (c) 2001, 2012, Oracle and/or its affiliates.
Copyright (C) 2010- 2011 Monty Program Ab
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
@ -23,6 +22,7 @@
#include <mysql_version.h> #include <mysql_version.h>
#include <mysqld_error.h> #include <mysqld_error.h>
#include <sslopt-vars.h> #include <sslopt-vars.h>
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
/* Exit codes */ /* Exit codes */
@ -222,13 +222,7 @@ static void print_version(void)
static void usage(void) static void usage(void)
{ {
print_version(); print_version();
puts("By Jani Tolonen, 2001-04-20, MySQL Development Team.\n"); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,");
puts("and you are welcome to modify and redistribute it under the GPL license.\n");
printf("Usage: %s [OPTIONS] database [tables]\n", my_progname);
printf("OR %s [OPTIONS] --databases DB1 [DB2 DB3...]\n",
my_progname);
printf("OR %s [OPTIONS] --all-databases\n\n", my_progname);
puts("This program can be used to CHECK (-c, -m, -C), REPAIR (-r), ANALYZE (-a),"); 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("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."); puts("used at the same time. Not all options are supported by all storage engines.");

View File

@ -54,6 +54,8 @@
#include "mysqld_error.h" #include "mysqld_error.h"
#include "../sql/ha_ndbcluster_tables.h" #include "../sql/ha_ndbcluster_tables.h"
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
/* Exit codes */ /* Exit codes */
#define EX_USAGE 1 #define EX_USAGE 1
@ -583,8 +585,7 @@ static void short_usage_sub(void)
static void usage(void) static void usage(void)
{ {
print_version(); print_version();
puts("By Igor Romanenko, Monty, Jani & Sinisa and others."); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
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("Dumping structure and contents of MySQL databases and tables."); puts("Dumping structure and contents of MySQL databases and tables.");
short_usage_sub(); short_usage_sub();
print_defaults("my",load_default_groups); print_defaults("my",load_default_groups);

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates. Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -34,6 +34,8 @@
#include <my_pthread.h> #include <my_pthread.h>
#endif #endif
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
/* Global Thread counter */ /* Global Thread counter */
uint counter; uint counter;
@ -202,7 +204,8 @@ static void usage(void)
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
puts("Copyright 2008-2011 Oracle and Monty Program Ab."); puts("Copyright 2008-2011 Oracle and Monty Program Ab.");
print_version(); print_version();
printf("\n\ puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
printf("\
Loads tables from text files in various formats. The base name of the\n\ 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\ text file must be the name of the table that should be used.\n\
If one uses sockets to connect to the MySQL server, the server will open and\n\ If one uses sockets to connect to the MySQL server, the server will open and\n\

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates. Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -27,6 +27,7 @@
#include <signal.h> #include <signal.h>
#include <stdarg.h> #include <stdarg.h>
#include <sslopt-vars.h> #include <sslopt-vars.h>
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
static char * host=0, *opt_password=0, *user=0; 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; static my_bool opt_show_keys= 0, opt_compress= 0, opt_count=0, opt_status= 0;
@ -255,9 +256,7 @@ static void print_version(void)
static void usage(void) static void usage(void)
{ {
print_version(); print_version();
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc."); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
puts("Copyright 2008-2011 Oracle and Monty Program Ab.");
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("Shows the structure of a MySQL database (databases, tables, and columns).\n"); puts("Shows the structure of a MySQL database (databases, tables, and columns).\n");
printf("Usage: %s [OPTIONS] [database [table [column]]]\n",my_progname); printf("Usage: %s [OPTIONS] [database [table [column]]]\n",my_progname);
puts("\n\ puts("\n\

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2005, 2011, Oracle and/or its affiliates. Copyright (c) 2005, 2012, Oracle and/or its affiliates.
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
@ -95,6 +95,7 @@ TODO:
#include <sys/wait.h> #include <sys/wait.h>
#endif #endif
#include <ctype.h> #include <ctype.h>
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
#ifdef __WIN__ #ifdef __WIN__
#define srandom srand #define srandom srand
@ -708,8 +709,7 @@ static void print_version(void)
static void usage(void) static void usage(void)
{ {
print_version(); print_version();
puts("Copyright (C) 2005 MySQL AB"); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2005"));
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("Run a query multiple times against the server.\n"); puts("Run a query multiple times against the server.\n");
printf("Usage: %s [OPTIONS]\n",my_progname); printf("Usage: %s [OPTIONS]\n",my_progname);
print_defaults("my",load_default_groups); print_defaults("my",load_default_groups);

View File

@ -54,6 +54,8 @@
#include <signal.h> #include <signal.h>
#include <my_stacktrace.h> #include <my_stacktrace.h>
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
#ifdef __WIN__ #ifdef __WIN__
#include <crtdbg.h> #include <crtdbg.h>
#define SIGNAL_FMT "exception 0x%x" #define SIGNAL_FMT "exception 0x%x"
@ -6237,8 +6239,7 @@ void print_version(void)
void usage() void usage()
{ {
print_version(); print_version();
printf("MySQL AB, by Sasha, Matt, Monty & Jani and others\n"); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
printf("This software comes with ABSOLUTELY NO WARRANTY\n\n");
printf("Runs a test against the mysql server and compares output with a results file.\n\n"); 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); printf("Usage: %s [OPTIONS] [database] < test_file\n", my_progname);
my_print_help(my_long_options); my_print_help(my_long_options);

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2010, Oracle and/or its affiliates Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -195,8 +195,12 @@ public:
} }
bool real_alloc(uint32 arg_length); // Empties old string bool real_alloc(uint32 arg_length); // Empties old string
bool realloc(uint32 arg_length); bool realloc(uint32 arg_length);
inline void shrink(uint32 arg_length) // Shrink buffer
// Shrink the buffer, but only if it is allocated on the heap.
inline void shrink(uint32 arg_length)
{ {
if (!is_alloced())
return;
if (arg_length < Alloced_length) if (arg_length < Alloced_length)
{ {
char *new_ptr; char *new_ptr;
@ -212,7 +216,7 @@ public:
} }
} }
} }
bool is_alloced() { return alloced; } bool is_alloced() const { return alloced; }
inline String& operator = (const String &s) inline String& operator = (const String &s)
{ {
if (&s != this) if (&s != this)

View File

@ -12,7 +12,7 @@ dnl
dnl When changing the major version number please also check the switch dnl When changing the major version number please also check the switch
dnl statement in mysqlbinlog::check_master_version(). You may also need dnl statement in mysqlbinlog::check_master_version(). You may also need
dnl to update version.c in ndb. dnl to update version.c in ndb.
AC_INIT([MariaDB Server], [5.1.65-MariaDB], [], [mysql]) AC_INIT([MariaDB Server], [5.1.66-MariaDB], [], [mysql])
AC_CONFIG_SRCDIR([sql/mysqld.cc]) AC_CONFIG_SRCDIR([sql/mysqld.cc])
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -29,6 +29,7 @@
#include "../storage/ndb/src/kernel/error/ndbd_exit_codes.c" #include "../storage/ndb/src/kernel/error/ndbd_exit_codes.c"
#include "../storage/ndb/include/mgmapi/mgmapi_error.h" #include "../storage/ndb/include/mgmapi/mgmapi_error.h"
#endif #endif
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
static my_bool verbose, print_all_codes; static my_bool verbose, print_all_codes;
@ -115,7 +116,7 @@ static void print_version(void)
static void usage(void) static void usage(void)
{ {
print_version(); print_version();
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"));
printf("Print a description for a system error code or a MySQL error code.\n"); printf("Print a description for a system error code or a MySQL error code.\n");
printf("If you want to get the error for a negative error code, you should use\n-- before the first error code to tell perror that there was no more options.\n\n"); printf("If you want to get the error for a negative error code, you should use\n-- before the first error code to tell perror that there was no more options.\n\n");
printf("Usage: %s [OPTIONS] [ERRORCODE [ERRORCODE...]]\n",my_progname); printf("Usage: %s [OPTIONS] [ERRORCODE [ERRORCODE...]]\n",my_progname);

View File

@ -747,7 +747,7 @@ void SSL_CTX_set_verify(SSL_CTX* ctx, int mode, VerifyCallback vc)
int SSL_CTX_load_verify_locations(SSL_CTX* ctx, const char* file, int SSL_CTX_load_verify_locations(SSL_CTX* ctx, const char* file,
const char* path) const char* path)
{ {
int ret = SSL_SUCCESS; int ret = SSL_FAILURE;
const int HALF_PATH = 128; const int HALF_PATH = 128;
if (file) ret = read_file(ctx, file, SSL_FILETYPE_PEM, CA); if (file) ret = read_file(ctx, file, SSL_FILETYPE_PEM, CA);

View File

@ -6,7 +6,7 @@ libtaocrypt_la_SOURCES = aes.cpp aestables.cpp algebra.cpp arc4.cpp \
asn.cpp bftables.cpp blowfish.cpp coding.cpp des.cpp dh.cpp \ asn.cpp bftables.cpp blowfish.cpp coding.cpp des.cpp dh.cpp \
dsa.cpp file.cpp hash.cpp integer.cpp md2.cpp md4.cpp md5.cpp misc.cpp \ dsa.cpp file.cpp hash.cpp integer.cpp md2.cpp md4.cpp md5.cpp misc.cpp \
random.cpp ripemd.cpp rsa.cpp sha.cpp template_instnt.cpp \ random.cpp ripemd.cpp rsa.cpp sha.cpp template_instnt.cpp \
tftables.cpp twofish.cpp crypto.cpp rabbit.cpp hc128.cpp tftables.cpp twofish.cpp rabbit.cpp hc128.cpp
libtaocrypt_la_CXXFLAGS = @yassl_taocrypt_extra_cxxflags@ -DYASSL_PURE_C \ libtaocrypt_la_CXXFLAGS = @yassl_taocrypt_extra_cxxflags@ -DYASSL_PURE_C \
@yassl_thread_cxxflags@ @yassl_thread_cxxflags@

View File

@ -1,37 +0,0 @@
/*
Copyright (C) 2000-2007 MySQL AB
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; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301 USA.
*/
/* put features that other apps expect from OpenSSL type crypto */
extern "C" {
// for libcurl configure test, these are the signatures they use
// locking handled internally by library
char CRYPTO_lock() { return 0;}
char CRYPTO_add_lock() { return 0;}
// for openvpn, test are the signatures they use
char EVP_CIPHER_CTX_init() { return 0; }
char CRYPTO_mem_ctrl() { return 0; }
} // extern "C"

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2011, Oracle and/or its affiliates. /* Copyright (c) 2011, 2012, Oracle and/or its affiliates.
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
@ -16,12 +16,14 @@
#ifndef _welcome_copyright_notice_h_ #ifndef _welcome_copyright_notice_h_
#define _welcome_copyright_notice_h_ #define _welcome_copyright_notice_h_
#define COPYRIGHT_NOTICE_CURRENT_YEAR "2012"
/* /*
This define specifies copyright notice which is displayed by every MySQL This define specifies copyright notice which is displayed by every MySQL
program on start, or on help screen. program on start, or on help screen.
*/ */
#define ORACLE_WELCOME_COPYRIGHT_NOTICE(first_year) \
#define ORACLE_WELCOME_COPYRIGHT_NOTICE(years) \ "Copyright (c) " first_year ", " COPYRIGHT_NOTICE_CURRENT_YEAR \
"Copyright (c) " years ", Oracle, Monty Program Ab and others.\n" ", Oracle, Monty Program Ab and others.\n"
#endif /* _welcome_copyright_notice_h_ */ #endif /* _welcome_copyright_notice_h_ */

View File

@ -83,6 +83,7 @@ TEST_DIRS = t r include std_data std_data/parts collections \
extra/binlog_tests/ extra/rpl_tests \ extra/binlog_tests/ extra/rpl_tests \
suite/binlog suite/binlog/t suite/binlog/r suite/binlog/std_data \ suite/binlog suite/binlog/t suite/binlog/r suite/binlog/std_data \
suite/federated \ suite/federated \
suite/federated/include \
suite/funcs_1 suite/funcs_1/bitdata \ suite/funcs_1 suite/funcs_1/bitdata \
suite/funcs_1/include suite/funcs_1/lib suite/funcs_1/r \ suite/funcs_1/include suite/funcs_1/lib suite/funcs_1/r \
suite/funcs_1/t suite/funcs_1/views suite/funcs_1/cursors \ suite/funcs_1/t suite/funcs_1/views suite/funcs_1/cursors \

View File

@ -44,9 +44,9 @@ ERROR 42000: DELETE command denied to user 'ssl_user4'@'localhost' for table 't1
drop user ssl_user1@localhost, ssl_user2@localhost, drop user ssl_user1@localhost, ssl_user2@localhost,
ssl_user3@localhost, ssl_user4@localhost, ssl_user5@localhost; ssl_user3@localhost, ssl_user4@localhost, ssl_user5@localhost;
drop table t1; drop table t1;
mysqltest: Could not open connection 'default': 2026 SSL error: ASN: bad other signature confirmation mysqltest: Could not open connection 'default': 2026 SSL connection error: xxxx
mysqltest: Could not open connection 'default': 2026 SSL error: ASN: bad other signature confirmation mysqltest: Could not open connection 'default': 2026 SSL connection error: xxxx
mysqltest: Could not open connection 'default': 2026 SSL error: ASN: bad other signature confirmation mysqltest: Could not open connection 'default': 2026 SSL connection error: xxxx
SSL error: Unable to get private key from '' SSL error: Unable to get private key from ''
mysqltest: Could not open connection 'default': 2026 SSL connection error mysqltest: Could not open connection 'default': 2026 SSL connection error
SSL error: Unable to get certificate from '' SSL error: Unable to get certificate from ''

View File

@ -4555,8 +4555,6 @@ SELECT * FROM t1
WHERE EXISTS (SELECT DISTINCT a FROM t2 WHERE t1.a < t2.a ORDER BY b); WHERE EXISTS (SELECT DISTINCT a FROM t2 WHERE t1.a < t2.a ORDER BY b);
pk a pk a
1 10 1 10
3 30
2 20
DROP TABLE t1,t2; DROP TABLE t1,t2;
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a), KEY b (b)); CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a), KEY b (b));
INSERT INTO t1 VALUES (1,NULL), (9,NULL); INSERT INTO t1 VALUES (1,NULL), (9,NULL);

View File

@ -1,5 +1,5 @@
source include/have_archive.inc; source include/have_archive.inc;
source federated.inc; source suite/federated/include/federated.inc;
connection slave; connection slave;
@ -54,5 +54,5 @@ connection slave;
DROP TABLE federated.archive_table; DROP TABLE federated.archive_table;
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -1,4 +1,4 @@
source federated.inc; source suite/federated/include/federated.inc;
connection slave; connection slave;
--disable_warnings --disable_warnings
@ -37,5 +37,5 @@ connection slave;
DROP TABLE federated.bug_13118_table; DROP TABLE federated.bug_13118_table;
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -4,7 +4,7 @@ if (`select LENGTH("$MYSQL_BUG25714") = 0`)
skip Need bug25714 test program; skip Need bug25714 test program;
} }
source federated.inc; source suite/federated/include/federated.inc;
connection master; connection master;
# Disable concurrent inserts to avoid test failures when reading # Disable concurrent inserts to avoid test failures when reading
@ -59,4 +59,4 @@ SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT;
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -1,4 +1,4 @@
source federated.inc; source include/federated.inc;
--echo # --echo #
--echo # Bug #32426: FEDERATED query returns corrupt results for ORDER BY --echo # Bug #32426: FEDERATED query returns corrupt results for ORDER BY
@ -21,4 +21,4 @@ DROP TABLE federated.t1;
connection default; connection default;
source federated_cleanup.inc; source include/federated_cleanup.inc;

View File

@ -9,7 +9,7 @@
--echo # to complete while still indicating a problem. This fix applies to any non-fatal system --echo # to complete while still indicating a problem. This fix applies to any non-fatal system
--echo # error that occurs during a query against I_S.TABLES.de --echo # error that occurs during a query against I_S.TABLES.de
--source federated.inc --source suite/federated/include/federated.inc
--disable_warnings --disable_warnings
# Federated database exists # Federated database exists
@ -74,4 +74,4 @@ DROP TABLE t1;
--echo # Cleanup --echo # Cleanup
--echo # --echo #
--source federated_cleanup.inc --source suite/federated/include/federated_cleanup.inc

View File

@ -1,4 +1,4 @@
source federated.inc; source include/federated.inc;
--echo # --echo #
--echo # Bug #585688: maridb crashes in federatedx code --echo # Bug #585688: maridb crashes in federatedx code
@ -49,5 +49,5 @@ DROP TABLE federated.t1;
connection default; connection default;
source federated_cleanup.inc; source include/federated_cleanup.inc;

View File

@ -1,6 +1,6 @@
--source include/have_debug.inc --source include/have_debug.inc
--source include/long_test.inc --source include/long_test.inc
--source federated.inc --source include/federated.inc
--echo # --echo #
--echo # Bug#47525: MySQL crashed (Federated) --echo # Bug#47525: MySQL crashed (Federated)
@ -37,4 +37,4 @@ DROP TABLE t1;
connection default; connection default;
--echo # Federated cleanup --echo # Federated cleanup
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -4,7 +4,7 @@
# See Bug #40645 Test main.federated_innodb does not always clean up after itself # See Bug #40645 Test main.federated_innodb does not always clean up after itself
source include/have_innodb.inc; source include/have_innodb.inc;
source federated.inc; source suite/federated/include/federated.inc;
# #
# Bug#25513 Federated transaction failures # Bug#25513 Federated transaction failures
@ -36,4 +36,4 @@ connection slave;
drop table federated.t1; drop table federated.t1;
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -4,7 +4,7 @@
source have_federatedx.inc; source have_federatedx.inc;
source include/have_partition.inc; source include/have_partition.inc;
source include/have_innodb.inc; source include/have_innodb.inc;
source federated.inc; source include/federated.inc;
disable_warnings; disable_warnings;
drop table if exists t1; drop table if exists t1;
@ -50,4 +50,4 @@ drop table federated.t1_2;
--echo End of 5.1 tests --echo End of 5.1 tests
source federated_cleanup.inc; source include/federated_cleanup.inc;

View File

@ -4,7 +4,7 @@
# Slow test, don't run during staging part # Slow test, don't run during staging part
-- source include/not_staging.inc -- source include/not_staging.inc
-- source include/big_test.inc -- source include/big_test.inc
-- source federated.inc -- source include/federated.inc
connection slave; connection slave;
create database first_db; create database first_db;
@ -343,4 +343,4 @@ drop procedure p1;
drop server if exists s; drop server if exists s;
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -1,6 +1,6 @@
source have_federatedx.inc; source have_federatedx.inc;
source include/have_innodb.inc; source include/have_innodb.inc;
source federated.inc; source suite/federated/include/federated.inc;
connection slave; connection slave;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
@ -36,4 +36,4 @@ INSERT INTO federated.t1 (id, name) VALUES (6, 'fig');
SELECT * FROM federated.t1; SELECT * FROM federated.t1;
DELETE FROM federated.t1; DELETE FROM federated.t1;
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -6,7 +6,7 @@
# should work with embedded server after mysqltest is fixed # should work with embedded server after mysqltest is fixed
--source include/not_embedded.inc --source include/not_embedded.inc
--source federated.inc --source include/federated.inc
--source have_federatedx.inc --source have_federatedx.inc
connection default; connection default;
@ -2001,4 +2001,4 @@ connection slave;
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT; SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT;
connection default; connection default;
source federated_cleanup.inc; source suite/federated/include/federated_cleanup.inc;

View File

@ -774,7 +774,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

@ -0,0 +1,127 @@
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS;
SELECT count(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS;
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE;
SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE;
CREATE TABLE infoschema_buffer_test (col1 INT) ENGINE = INNODB;
INSERT INTO infoschema_buffer_test VALUES(9);
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test"
and PAGE_STATE="file_page" and PAGE_TYPE="index";
TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE PAGE_STATE PAGE_TYPE
test/infoschema_buffer_test GEN_CLUST_INDEX 1 29 FILE_PAGE INDEX
INSERT INTO infoschema_buffer_test VALUES(19);
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test"
and PAGE_STATE="file_page" and PAGE_TYPE="index";
TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE PAGE_STATE PAGE_TYPE
test/infoschema_buffer_test GEN_CLUST_INDEX 2 58 FILE_PAGE INDEX
CREATE INDEX idx ON infoschema_buffer_test(col1);
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test"
and PAGE_STATE="file_page" and INDEX_NAME = "idx" and PAGE_TYPE="index";
TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE PAGE_STATE PAGE_TYPE
test/infoschema_buffer_test idx 2 32 FILE_PAGE INDEX
DROP TABLE infoschema_buffer_test;
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test";
TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE PAGE_STATE PAGE_TYPE
CREATE TABLE infoschema_parent (id INT NOT NULL, PRIMARY KEY (id))
ENGINE=INNODB;
CREATE TABLE infoschema_child (id INT, parent_id INT, INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES infoschema_parent(id)
ON DELETE CASCADE)
ENGINE=INNODB;
SELECT count(*)
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_child" and PAGE_STATE="file_page"
and PAGE_TYPE="index";
count(*)
2
DROP TABLE infoschema_child;
DROP TABLE infoschema_parent;
show create table information_schema.innodb_buffer_page;
Table Create Table
INNODB_BUFFER_PAGE CREATE TEMPORARY TABLE `INNODB_BUFFER_PAGE` (
`BLOCK_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
`SPACE` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGE_NUMBER` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGE_TYPE` varchar(64) DEFAULT NULL,
`FLUSH_TYPE` bigint(21) unsigned NOT NULL DEFAULT '0',
`FIX_COUNT` bigint(21) unsigned NOT NULL DEFAULT '0',
`IS_HASHED` varchar(3) DEFAULT NULL,
`NEWEST_MODIFICATION` bigint(21) unsigned NOT NULL DEFAULT '0',
`OLDEST_MODIFICATION` bigint(21) unsigned NOT NULL DEFAULT '0',
`ACCESS_TIME` bigint(21) unsigned NOT NULL DEFAULT '0',
`TABLE_NAME` varchar(1024) DEFAULT NULL,
`INDEX_NAME` varchar(1024) DEFAULT NULL,
`NUMBER_RECORDS` bigint(21) unsigned NOT NULL DEFAULT '0',
`DATA_SIZE` bigint(21) unsigned NOT NULL DEFAULT '0',
`COMPRESSED_SIZE` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGE_STATE` varchar(64) DEFAULT NULL,
`IO_FIX` varchar(64) DEFAULT NULL,
`IS_OLD` varchar(3) DEFAULT NULL,
`FREE_PAGE_CLOCK` bigint(21) unsigned NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8
show create table information_schema.innodb_buffer_page_lru;
Table Create Table
INNODB_BUFFER_PAGE_LRU CREATE TEMPORARY TABLE `INNODB_BUFFER_PAGE_LRU` (
`LRU_POSITION` bigint(21) unsigned NOT NULL DEFAULT '0',
`SPACE` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGE_NUMBER` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGE_TYPE` varchar(64) DEFAULT NULL,
`FLUSH_TYPE` bigint(21) unsigned NOT NULL DEFAULT '0',
`FIX_COUNT` bigint(21) unsigned NOT NULL DEFAULT '0',
`IS_HASHED` varchar(3) DEFAULT NULL,
`NEWEST_MODIFICATION` bigint(21) unsigned NOT NULL DEFAULT '0',
`OLDEST_MODIFICATION` bigint(21) unsigned NOT NULL DEFAULT '0',
`ACCESS_TIME` bigint(21) unsigned NOT NULL DEFAULT '0',
`TABLE_NAME` varchar(1024) DEFAULT NULL,
`INDEX_NAME` varchar(1024) DEFAULT NULL,
`NUMBER_RECORDS` bigint(21) unsigned NOT NULL DEFAULT '0',
`DATA_SIZE` bigint(21) unsigned NOT NULL DEFAULT '0',
`COMPRESSED_SIZE` bigint(21) unsigned NOT NULL DEFAULT '0',
`COMPRESSED` varchar(3) DEFAULT NULL,
`IO_FIX` varchar(64) DEFAULT NULL,
`IS_OLD` varchar(3) DEFAULT NULL,
`FREE_PAGE_CLOCK` bigint(21) unsigned NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8
show create table information_schema.innodb_buffer_pool_stats;
Table Create Table
INNODB_BUFFER_POOL_STATS CREATE TEMPORARY TABLE `INNODB_BUFFER_POOL_STATS` (
`POOL_SIZE` bigint(21) unsigned NOT NULL DEFAULT '0',
`FREE_BUFFERS` bigint(21) unsigned NOT NULL DEFAULT '0',
`DATABASE_PAGES` bigint(21) unsigned NOT NULL DEFAULT '0',
`OLD_DATABASE_PAGES` bigint(21) unsigned NOT NULL DEFAULT '0',
`MODIFIED_DATABASE_PAGES` bigint(21) unsigned NOT NULL DEFAULT '0',
`PENDING_DECOMPRESS` bigint(21) unsigned NOT NULL DEFAULT '0',
`PENDING_READS` bigint(21) unsigned NOT NULL DEFAULT '0',
`PENDING_FLUSH_LRU` bigint(21) unsigned NOT NULL DEFAULT '0',
`PENDING_FLUSH_LIST` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGES_MADE_YOUNG` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGES_NOT_MADE_YOUNG` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGES_MADE_YOUNG_RATE` double NOT NULL DEFAULT '0',
`PAGES_MADE_NOT_YOUNG_RATE` double NOT NULL DEFAULT '0',
`NUMBER_PAGES_READ` bigint(21) unsigned NOT NULL DEFAULT '0',
`NUMBER_PAGES_CREATED` bigint(21) unsigned NOT NULL DEFAULT '0',
`NUMBER_PAGES_WRITTEN` bigint(21) unsigned NOT NULL DEFAULT '0',
`PAGES_READ_RATE` double NOT NULL DEFAULT '0',
`PAGES_CREATE_RATE` double NOT NULL DEFAULT '0',
`PAGES_WRITTEN_RATE` double NOT NULL DEFAULT '0',
`NUMBER_PAGES_GET` bigint(21) unsigned NOT NULL DEFAULT '0',
`HIT_RATE` bigint(21) unsigned NOT NULL DEFAULT '0',
`YOUNG_MAKE_PER_THOUSAND_GETS` bigint(21) unsigned NOT NULL DEFAULT '0',
`NOT_YOUNG_MAKE_PER_THOUSAND_GETS` bigint(21) unsigned NOT NULL DEFAULT '0',
`NUMBER_PAGES_READ_AHEAD` bigint(21) unsigned NOT NULL DEFAULT '0',
`NUMBER_READ_AHEAD_EVICTED` bigint(21) unsigned NOT NULL DEFAULT '0',
`READ_AHEAD_RATE` double NOT NULL DEFAULT '0',
`READ_AHEAD_EVICTED_RATE` double NOT NULL DEFAULT '0',
`LRU_IO_TOTAL` bigint(21) unsigned NOT NULL DEFAULT '0',
`LRU_IO_CURRENT` bigint(21) unsigned NOT NULL DEFAULT '0',
`UNCOMPRESS_TOTAL` bigint(21) unsigned NOT NULL DEFAULT '0',
`UNCOMPRESS_CURRENT` bigint(21) unsigned NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8

View File

@ -0,0 +1,76 @@
# Exercise the code path for INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS
# and INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
-- source include/have_innodb_plugin.inc
-- disable_result_log
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS;
# How many buffer pools we have
SELECT count(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS;
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE;
# This gives the over all buffer pool size
SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE;
-- enable_result_log
# Create a table and check its page info behave correctly in the pool
CREATE TABLE infoschema_buffer_test (col1 INT) ENGINE = INNODB;
INSERT INTO infoschema_buffer_test VALUES(9);
# We should be able to see this table in the buffer pool if we check
# right away
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test"
and PAGE_STATE="file_page" and PAGE_TYPE="index";
# The NUMBER_RECORDS and DATA_SIZE should check with each insertion
INSERT INTO infoschema_buffer_test VALUES(19);
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test"
and PAGE_STATE="file_page" and PAGE_TYPE="index";
CREATE INDEX idx ON infoschema_buffer_test(col1);
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test"
and PAGE_STATE="file_page" and INDEX_NAME = "idx" and PAGE_TYPE="index";
# Check the buffer after dropping the table
DROP TABLE infoschema_buffer_test;
SELECT TABLE_NAME, INDEX_NAME, NUMBER_RECORDS, DATA_SIZE, PAGE_STATE, PAGE_TYPE
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_buffer_test";
# Do one more test
#--replace_regex /'*[0-9]*'/'NUM'/
CREATE TABLE infoschema_parent (id INT NOT NULL, PRIMARY KEY (id))
ENGINE=INNODB;
CREATE TABLE infoschema_child (id INT, parent_id INT, INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES infoschema_parent(id)
ON DELETE CASCADE)
ENGINE=INNODB;
SELECT count(*)
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE TABLE_NAME like "%infoschema_child" and PAGE_STATE="file_page"
and PAGE_TYPE="index";
DROP TABLE infoschema_child;
DROP TABLE infoschema_parent;
show create table information_schema.innodb_buffer_page;
show create table information_schema.innodb_buffer_page_lru;
show create table information_schema.innodb_buffer_pool_stats;

View File

@ -74,25 +74,31 @@ drop table t1;
# #
--exec echo "this query should not execute;" > $MYSQLTEST_VARDIR/tmp/test.sql --exec echo "this query should not execute;" > $MYSQLTEST_VARDIR/tmp/test.sql
# Handle that openssl gives different error messages from YaSSL. # Handle that openssl gives different error messages from YaSSL.
--replace_regex /error:00000005:lib\(0\):func\(0\):DH lib/ASN: bad other signature confirmation/ #--replace_regex /error:00000005:lib\(0\):func\(0\):DH lib/ASN: bad other signature confirmation/
--replace_regex /2026 SSL error.*/2026 SSL connection error: xxxx/
--error 1 --error 1
--exec $MYSQL_TEST --ssl-ca=$MYSQL_TEST_DIR/std_data/untrusted-cacert.pem --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1 --exec $MYSQL_TEST --ssl-ca=$MYSQL_TEST_DIR/std_data/untrusted-cacert.pem --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1
--echo
# #
# Test that we can't open connection to server if we are using # Test that we can't open connection to server if we are using
# a blank ca # a blank ca
# #
--replace_regex /error:00000005:lib\(0\):func\(0\):DH lib/ASN: bad other signature confirmation/ #--replace_regex /error:00000005:lib\(0\):func\(0\):DH lib/ASN: bad other signature confirmation/
--replace_regex /2026 SSL error.*/2026 SSL connection error: xxxx/
--error 1 --error 1
--exec $MYSQL_TEST --ssl-ca= --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1 --exec $MYSQL_TEST --ssl-ca= --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1
--echo
# #
# Test that we can't open connection to server if we are using # Test that we can't open connection to server if we are using
# a nonexistent ca file # a nonexistent ca file
# #
--replace_regex /error:00000005:lib\(0\):func\(0\):DH lib/ASN: bad other signature confirmation/ #--replace_regex /error:00000005:lib\(0\):func\(0\):DH lib/ASN: bad other signature confirmation/
--replace_regex /2026 SSL error.*/2026 SSL connection error: xxxx/
--error 1 --error 1
--exec $MYSQL_TEST --ssl-ca=nonexisting_file.pem --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1 --exec $MYSQL_TEST --ssl-ca=nonexisting_file.pem --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1
--echo
# #
# Test that we can't open connection to server if we are using # Test that we can't open connection to server if we are using

View File

@ -1,7 +1,7 @@
#!/usr/bin/perl #!/usr/bin/perl
# -*- cperl -*- # -*- cperl -*-
# #
# Copyright (c) 2007, 2010, Oracle and/or its affiliates # Copyright (c) 2007, 2012, Oracle and/or its affiliates.
# #
# 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
@ -28,7 +28,7 @@ my $mysql; # How to call the mysql client
my $rootpass = ""; my $rootpass = "";
$SIG{QUIT} = $SIG{INT} = sub { $SIG{QUIT} = $SIG{INT} = $SIG{TERM} = $SIG{ABRT} = $SIG{HUP} = sub {
print "\nAborting!\n\n"; print "\nAborting!\n\n";
echo_on(); echo_on();
cleanup(); cleanup();
@ -242,7 +242,11 @@ sub reload_privilege_tables {
} }
sub cleanup { sub cleanup {
unlink($config,$command); print "Cleaning up...\n";
foreach my $file ($config, $command) {
unlink $file or warn "Warning: Could not unlink $file: $!\n";
}
} }

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2002, 2010, Oracle and/or its affiliates # Copyright (c) 2002, 2012, Oracle and/or its affiliates.
# #
# 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
@ -18,7 +18,7 @@
config=".my.cnf.$$" config=".my.cnf.$$"
command=".mysql.$$" command=".mysql.$$"
trap "interrupt" 2 trap "interrupt" 1 2 3 6 15
rootpass="" rootpass=""
echo_n= echo_n=
@ -286,13 +286,16 @@ set_root_password() {
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "Password updated successfully!" echo "Password updated successfully!"
echo "Reloading privilege tables.." echo "Reloading privilege tables.."
reload_privilege_tables || exit 1 reload_privilege_tables
if [ $? -eq 1 ]; then
clean_and_exit
fi
echo echo
rootpass=$password1 rootpass=$password1
make_config make_config
else else
echo "Password update failed!" echo "Password update failed!"
exit 1 clean_and_exit
fi fi
return 0 return 0
@ -304,7 +307,7 @@ remove_anonymous_users() {
echo " ... Success!" echo " ... Success!"
else else
echo " ... Failed!" echo " ... Failed!"
exit 1 clean_and_exit
fi fi
return 0 return 0
@ -364,6 +367,11 @@ cleanup() {
rm -f $config $command rm -f $config $command
} }
# Remove the files before exiting.
clean_and_exit() {
cleanup
exit 1
}
# The actual script starts here # The actual script starts here

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates. Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -296,8 +296,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
Use also the space previously used by string pointers in sort_buffer Use also the space previously used by string pointers in sort_buffer
for temporary key storage. for temporary key storage.
*/ */
param.keys=((param.keys*(param.rec_length+sizeof(char*))) / param.keys= table_sort.sort_keys_size / param.rec_length;
param.rec_length-1);
maxbuffer--; // Offset from 0 maxbuffer--; // Offset from 0
if (merge_many_buff(&param,(uchar*) sort_keys,buffpek,&maxbuffer, if (merge_many_buff(&param,(uchar*) sort_keys,buffpek,&maxbuffer,
&tempfile)) &tempfile))

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates. Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -89,6 +89,8 @@ So, we can read full search-structure as 32-bit word
#include "mysql_version.h" #include "mysql_version.h"
#include "lex.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"; const char *default_dbug_option="d:t:o,/tmp/gen_lex_hash.trace";
struct my_option my_long_options[] = struct my_option my_long_options[] =
@ -348,10 +350,7 @@ static void usage(int version)
my_progname, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE); my_progname, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
if (version) if (version)
return; return;
puts("Copyright (C) 2001 MySQL AB, by VVA and Monty"); puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
puts("Copyright (C) 2011 Oracle");
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("This program generates a perfect hashing function for the sql_lex.cc"); puts("This program generates a perfect hashing function for the sql_lex.cc");
printf("Usage: %s [OPTIONS]\n\n", my_progname); printf("Usage: %s [OPTIONS]\n\n", my_progname);
my_print_help(my_long_options); my_print_help(my_long_options);
@ -453,25 +452,9 @@ int main(int argc,char **argv)
/* Broken up to indicate that it's not advice to you, gentle reader. */ /* 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("/*\n\n Do " "not " "edit " "this " "file " "directly!\n\n*/\n");
printf("\ puts("/*");
/* Copyright (C) 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.\n\ puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
Copyright (C) 2008-2011 Oracle\n\ puts("*/");
\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\
");
/* Broken up to indicate that it's not advice to you, gentle reader. */ /* Broken up to indicate that it's not advice to you, gentle reader. */
printf("/* Do " "not " "edit " "this " "file! This is generated by " printf("/* Do " "not " "edit " "this " "file! This is generated by "

View File

@ -324,9 +324,7 @@ ha_partition::~ha_partition()
for (i= 0; i < m_tot_parts; i++) for (i= 0; i < m_tot_parts; i++)
delete m_file[i]; delete m_file[i];
} }
destroy_record_priority_queue();
my_free(m_ordered_rec_buffer, MYF(MY_ALLOW_ZERO_PTR));
m_ordered_rec_buffer= NULL;
clear_handler_file(); clear_handler_file();
@ -2659,7 +2657,6 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
{ {
char *name_buffer_ptr; char *name_buffer_ptr;
int error= HA_ERR_INITIALIZATION; int error= HA_ERR_INITIALIZATION;
uint alloc_len;
handler **file; handler **file;
char name_buff[FN_REFLEN]; char name_buff[FN_REFLEN];
bool is_not_tmp_table= (table_share->tmp_table == NO_TMP_TABLE); bool is_not_tmp_table= (table_share->tmp_table == NO_TMP_TABLE);
@ -2677,32 +2674,6 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
m_start_key.length= 0; m_start_key.length= 0;
m_rec0= table->record[0]; m_rec0= table->record[0];
m_rec_length= table_share->reclength; m_rec_length= table_share->reclength;
alloc_len= m_tot_parts * (m_rec_length + PARTITION_BYTES_IN_POS);
alloc_len+= table_share->max_key_length;
if (!m_ordered_rec_buffer)
{
if (!(m_ordered_rec_buffer= (uchar*)my_malloc(alloc_len, MYF(MY_WME))))
{
DBUG_RETURN(error);
}
{
/*
We set-up one record per partition and each record has 2 bytes in
front where the partition id is written. This is used by ordered
index_read.
We also set-up a reference to the first record for temporary use in
setting up the scan.
*/
char *ptr= (char*)m_ordered_rec_buffer;
uint i= 0;
do
{
int2store(ptr, i);
ptr+= m_rec_length + PARTITION_BYTES_IN_POS;
} while (++i < m_tot_parts);
m_start_key.key= (const uchar*)ptr;
}
}
/* Initialize the bitmap we use to minimize ha_start_bulk_insert calls */ /* Initialize the bitmap we use to minimize ha_start_bulk_insert calls */
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))
@ -2722,7 +2693,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
if (m_is_clone_of) if (m_is_clone_of)
{ {
uint i; uint i, alloc_len;
DBUG_ASSERT(m_clone_mem_root); DBUG_ASSERT(m_clone_mem_root);
/* Allocate an array of handler pointers for the partitions handlers. */ /* Allocate an array of handler pointers for the partitions handlers. */
alloc_len= (m_tot_parts + 1) * sizeof(handler*); alloc_len= (m_tot_parts + 1) * sizeof(handler*);
@ -2800,12 +2771,6 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
being opened once. being opened once.
*/ */
clear_handler_file(); clear_handler_file();
/*
Initialize priority queue, initialized to reading forward.
*/
if ((error= init_queue(&m_queue, m_tot_parts, (uint) PARTITION_BYTES_IN_POS,
0, key_rec_cmp, (void*)this)))
goto err_handler;
/* /*
Use table_share->ha_data to share auto_increment_value among all handlers Use table_share->ha_data to share auto_increment_value among all handlers
@ -2928,7 +2893,7 @@ int ha_partition::close(void)
DBUG_ENTER("ha_partition::close"); DBUG_ENTER("ha_partition::close");
DBUG_ASSERT(table->s == table_share); DBUG_ASSERT(table->s == table_share);
delete_queue(&m_queue); destroy_record_priority_queue();
bitmap_free(&m_bulk_insert_started); bitmap_free(&m_bulk_insert_started);
if (!m_is_clone_of) if (!m_is_clone_of)
bitmap_free(&(m_part_info->used_partitions)); bitmap_free(&(m_part_info->used_partitions));
@ -4146,6 +4111,78 @@ int ha_partition::rnd_pos_by_record(uchar *record)
subset of the partitions are used, then only use those partitions. subset of the partitions are used, then only use those partitions.
*/ */
/**
Setup the ordered record buffer and the priority queue.
*/
bool ha_partition::init_record_priority_queue()
{
DBUG_ENTER("ha_partition::init_record_priority_queue");
DBUG_ASSERT(!m_ordered_rec_buffer);
/*
Initialize the ordered record buffer.
*/
if (!m_ordered_rec_buffer)
{
uint alloc_len;
uint used_parts= bitmap_bits_set(&m_part_info->used_partitions);
/* Allocate record buffer for each used partition. */
alloc_len= used_parts * (m_rec_length + PARTITION_BYTES_IN_POS);
/* Allocate a key for temporary use when setting up the scan. */
alloc_len+= table_share->max_key_length;
if (!(m_ordered_rec_buffer= (uchar*)my_malloc(alloc_len, MYF(MY_WME))))
DBUG_RETURN(true);
/*
We set-up one record per partition and each record has 2 bytes in
front where the partition id is written. This is used by ordered
index_read.
We also set-up a reference to the first record for temporary use in
setting up the scan.
*/
char *ptr= (char*) m_ordered_rec_buffer;
uint16 i= 0;
do
{
if (bitmap_is_set(&m_part_info->used_partitions, i))
{
int2store(ptr, i);
ptr+= m_rec_length + PARTITION_BYTES_IN_POS;
}
} while (++i < m_tot_parts);
m_start_key.key= (const uchar*)ptr;
/* Initialize priority queue, initialized to reading forward. */
if (init_queue(&m_queue, used_parts, (uint) PARTITION_BYTES_IN_POS,
0, key_rec_cmp, (void*)m_curr_key_info))
{
my_free(m_ordered_rec_buffer, MYF(0));
m_ordered_rec_buffer= NULL;
DBUG_RETURN(true);
}
}
DBUG_RETURN(false);
}
/**
Destroy the ordered record buffer and the priority queue.
*/
void ha_partition::destroy_record_priority_queue()
{
DBUG_ENTER("ha_partition::destroy_record_priority_queue");
if (m_ordered_rec_buffer)
{
delete_queue(&m_queue);
my_free(m_ordered_rec_buffer, MYF(0));
m_ordered_rec_buffer= NULL;
}
DBUG_VOID_RETURN;
}
/* /*
Initialize handler before start of index scan Initialize handler before start of index scan
@ -4187,6 +4224,10 @@ int ha_partition::index_init(uint inx, bool sorted)
} }
else else
m_curr_key_info[1]= NULL; m_curr_key_info[1]= NULL;
if (init_record_priority_queue())
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
/* /*
Some handlers only read fields as specified by the bitmap for the Some handlers only read fields as specified by the bitmap for the
read set. For partitioned handlers we always require that the read set. For partitioned handlers we always require that the
@ -4261,11 +4302,11 @@ int ha_partition::index_end()
do do
{ {
int tmp; int tmp;
/* TODO RONM: Change to index_end() when code is stable */
if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file))) if (bitmap_is_set(&(m_part_info->used_partitions), (file - m_file)))
if ((tmp= (*file)->ha_index_end())) if ((tmp= (*file)->ha_index_end()))
error= tmp; error= tmp;
} while (*(++file)); } while (*(++file));
destroy_record_priority_queue();
DBUG_RETURN(error); DBUG_RETURN(error);
} }
@ -5005,6 +5046,7 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
uint i; uint i;
uint j= 0; uint j= 0;
bool found= FALSE; bool found= FALSE;
uchar *part_rec_buf_ptr= m_ordered_rec_buffer;
DBUG_ENTER("ha_partition::handle_ordered_index_scan"); DBUG_ENTER("ha_partition::handle_ordered_index_scan");
m_top_entry= NO_CURRENT_PART_ID; m_top_entry= NO_CURRENT_PART_ID;
@ -5015,7 +5057,7 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
{ {
if (!(bitmap_is_set(&(m_part_info->used_partitions), i))) if (!(bitmap_is_set(&(m_part_info->used_partitions), i)))
continue; continue;
uchar *rec_buf_ptr= rec_buf(i); uchar *rec_buf_ptr= part_rec_buf_ptr + PARTITION_BYTES_IN_POS;
int error; int error;
handler *file= m_file[i]; handler *file= m_file[i];
@ -5062,12 +5104,13 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
/* /*
Initialize queue without order first, simply insert Initialize queue without order first, simply insert
*/ */
queue_element(&m_queue, j++)= (uchar*)queue_buf(i); queue_element(&m_queue, j++)= part_rec_buf_ptr;
} }
else if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) else if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
{ {
DBUG_RETURN(error); DBUG_RETURN(error);
} }
part_rec_buf_ptr+= m_rec_length + PARTITION_BYTES_IN_POS;
} }
if (found) if (found)
{ {
@ -5130,18 +5173,19 @@ 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;
handler *file= m_file[part_id]; handler *file= m_file[part_id];
DBUG_ENTER("ha_partition::handle_ordered_next"); DBUG_ENTER("ha_partition::handle_ordered_next");
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();
memcpy(rec_buf(part_id), table->record[0], m_rec_length); memcpy(rec_buf, table->record[0], m_rec_length);
} }
else if (!is_next_same) else if (!is_next_same)
error= file->index_next(rec_buf(part_id)); error= file->index_next(rec_buf);
else else
error= file->index_next_same(rec_buf(part_id), m_start_key.key, error= file->index_next_same(rec_buf, m_start_key.key,
m_start_key.length); m_start_key.length);
if (error) if (error)
{ {
@ -5184,10 +5228,11 @@ int ha_partition::handle_ordered_prev(uchar *buf)
{ {
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;
handler *file= m_file[part_id]; handler *file= m_file[part_id];
DBUG_ENTER("ha_partition::handle_ordered_prev"); DBUG_ENTER("ha_partition::handle_ordered_prev");
if ((error= file->index_prev(rec_buf(part_id)))) if ((error= file->index_prev(rec_buf)))
{ {
if (error == HA_ERR_END_OF_FILE) if (error == HA_ERR_END_OF_FILE)
{ {

View File

@ -519,21 +519,13 @@ public:
virtual int read_range_next(); virtual int read_range_next();
private: private:
bool init_record_priority_queue();
void destroy_record_priority_queue();
int common_index_read(uchar * buf, bool have_start_key); int common_index_read(uchar * buf, bool have_start_key);
int common_first_last(uchar * buf); int common_first_last(uchar * buf);
int partition_scan_set_up(uchar * buf, bool idx_read_flag); int partition_scan_set_up(uchar * buf, bool idx_read_flag);
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);
uchar *queue_buf(uint part_id)
{
return (m_ordered_rec_buffer +
(part_id * (m_rec_length + PARTITION_BYTES_IN_POS)));
}
uchar *rec_buf(uint part_id)
{
return (queue_buf(part_id) +
PARTITION_BYTES_IN_POS);
}
int handle_ordered_index_scan(uchar * buf, bool reverse_order); int handle_ordered_index_scan(uchar * buf, bool reverse_order);
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);

View File

@ -4352,7 +4352,19 @@ int handler::read_range_first(const key_range *start_key,
? HA_ERR_END_OF_FILE ? HA_ERR_END_OF_FILE
: result); : result);
DBUG_RETURN (compare_key(end_range) <= 0 ? 0 : HA_ERR_END_OF_FILE); if (compare_key(end_range) <= 0)
{
DBUG_RETURN(0);
}
else
{
/*
The last read row does not fall in the range. So request
storage engine to release row lock if possible.
*/
unlock_row();
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
} }
@ -4384,7 +4396,20 @@ int handler::read_range_next()
result= index_next(table->record[0]); result= index_next(table->record[0]);
if (result) if (result)
DBUG_RETURN(result); DBUG_RETURN(result);
DBUG_RETURN(compare_key(end_range) <= 0 ? 0 : HA_ERR_END_OF_FILE);
if (compare_key(end_range) <= 0)
{
DBUG_RETURN(0);
}
else
{
/*
The last read row does not fall in the range. So request
storage engine to release row lock if possible.
*/
unlock_row();
DBUG_RETURN(HA_ERR_END_OF_FILE);
}
} }

View File

@ -3049,23 +3049,21 @@ err:
String* Item_func_export_set::val_str(String* str) String* Item_func_export_set::val_str(String* str)
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
ulonglong the_set = (ulonglong) args[0]->val_int(); String yes_buf, no_buf, sep_buf;
String yes_buf, *yes; const ulonglong the_set = (ulonglong) args[0]->val_int();
yes = args[1]->val_str(&yes_buf); const String *yes= args[1]->val_str(&yes_buf);
String no_buf, *no; const String *no= args[2]->val_str(&no_buf);
no = args[2]->val_str(&no_buf); const String *sep= NULL;
String *sep = NULL, sep_buf ;
uint num_set_values = 64; uint num_set_values = 64;
ulonglong mask = 0x1;
str->length(0); str->length(0);
str->set_charset(collation.collation); str->set_charset(collation.collation);
/* Check if some argument is a NULL value */ /* Check if some argument is a NULL value */
if (args[0]->null_value || args[1]->null_value || args[2]->null_value) if (args[0]->null_value || args[1]->null_value || args[2]->null_value)
{ {
null_value=1; null_value= true;
return 0; return NULL;
} }
/* /*
Arg count can only be 3, 4 or 5 here. This is guaranteed from the Arg count can only be 3, 4 or 5 here. This is guaranteed from the
@ -3078,37 +3076,56 @@ String* Item_func_export_set::val_str(String* str)
num_set_values=64; num_set_values=64;
if (args[4]->null_value) if (args[4]->null_value)
{ {
null_value=1; null_value= true;
return 0; return NULL;
} }
/* Fall through */ /* Fall through */
case 4: case 4:
if (!(sep = args[3]->val_str(&sep_buf))) // Only true if NULL if (!(sep = args[3]->val_str(&sep_buf))) // Only true if NULL
{ {
null_value=1; null_value= true;
return 0; return NULL;
} }
break; break;
case 3: case 3:
{ {
/* errors is not checked - assume "," can always be converted */ /* errors is not checked - assume "," can always be converted */
uint errors; uint errors;
sep_buf.copy(STRING_WITH_LEN(","), &my_charset_bin, collation.collation, &errors); sep_buf.copy(STRING_WITH_LEN(","), &my_charset_bin,
collation.collation, &errors);
sep = &sep_buf; sep = &sep_buf;
} }
break; break;
default: default:
DBUG_ASSERT(0); // cannot happen DBUG_ASSERT(0); // cannot happen
} }
null_value=0; null_value= false;
for (uint i = 0; i < num_set_values; i++, mask = (mask << 1)) const ulong max_allowed_packet= current_thd->variables.max_allowed_packet;
const uint num_separators= num_set_values > 0 ? num_set_values - 1 : 0;
const ulonglong max_total_length=
num_set_values * max(yes->length(), no->length()) +
num_separators * sep->length();
if (unlikely(max_total_length > max_allowed_packet))
{
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
func_name(), max_allowed_packet);
null_value= true;
return NULL;
}
uint ix;
ulonglong mask;
for (ix= 0, mask=0x1; ix < num_set_values; ++ix, mask = (mask << 1))
{ {
if (the_set & mask) if (the_set & mask)
str->append(*yes); str->append(*yes);
else else
str->append(*no); str->append(*no);
if (i != num_set_values - 1) if (ix != num_separators)
str->append(*sep); str->append(*sep);
} }
return str; return str;

View File

@ -1160,7 +1160,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
} }
else else
{ {
Item *item= (Item*) select_lex->item_list.head(); Item *item= (Item*) select_lex->item_list.head()->real_item();
if (select_lex->table_list.elements) if (select_lex->table_list.elements)
{ {

View File

@ -2490,7 +2490,7 @@ public:
User_var_log_event(THD* thd_arg, char *name_arg, uint name_len_arg, User_var_log_event(THD* thd_arg, char *name_arg, uint name_len_arg,
char *val_arg, ulong val_len_arg, Item_result type_arg, char *val_arg, ulong val_len_arg, Item_result type_arg,
uint charset_number_arg) uint charset_number_arg)
:Log_event(), name(name_arg), name_len(name_len_arg), val(val_arg), :Log_event(thd_arg,0,0), name(name_arg), name_len(name_len_arg), val(val_arg),
val_len(val_len_arg), type(type_arg), charset_number(charset_number_arg), val_len(val_len_arg), type(type_arg), charset_number(charset_number_arg),
deferred(false) deferred(false)
{ is_null= !val; } { is_null= !val; }

View File

@ -269,6 +269,8 @@ extern "C" sig_handler handle_fatal_signal(int sig);
/* Constants */ /* Constants */
#include <welcome_copyright_notice.h> // ORACLE_WELCOME_COPYRIGHT_NOTICE
const char *show_comp_option_name[]= {"YES", "NO", "DISABLED"}; const char *show_comp_option_name[]= {"YES", "NO", "DISABLED"};
/* /*
WARNING: When adding new SQL modes don't forget to update the WARNING: When adding new SQL modes don't forget to update the
@ -7920,14 +7922,8 @@ static void usage(void)
if (!default_collation_name) if (!default_collation_name)
default_collation_name= (char*) default_charset_info->name; default_collation_name= (char*) default_charset_info->name;
print_version(); print_version();
puts("\ puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
Copyright (C) 2000-2008 MySQL AB, by Monty and others.\n\ puts("Starts the MariaDB database server.\n");
Copyright (C) 2000, 2011 Oracle.\n\
Copyright (C) 2009-2011 Monty Program Ab.\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 MariaDB database server.\n");
printf("Usage: %s [OPTIONS]\n", my_progname); printf("Usage: %s [OPTIONS]\n", my_progname);
if (!opt_verbose) if (!opt_verbose)
puts("\nFor more help options (several pages), use mysqld --verbose --help."); puts("\nFor more help options (several pages), use mysqld --verbose --help.");

View File

@ -3,7 +3,7 @@
<charsets max-id="99"> <charsets max-id="99">
<copyright> <copyright>
Copyright (C) 2003 MySQL AB Copyright (c) 2003, 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

View File

@ -525,12 +525,13 @@ uint Gis_line_string::init_from_wkb(const char *wkb, uint len,
const char *wkb_end; const char *wkb_end;
Gis_point p; Gis_point p;
if (len < 4) if (len < 4 ||
(n_points= wkb_get_uint(wkb, bo)) < 1 ||
n_points > max_n_points)
return 0; return 0;
n_points= wkb_get_uint(wkb, bo);
proper_length= 4 + n_points * POINT_DATA_SIZE; proper_length= 4 + n_points * POINT_DATA_SIZE;
if (!n_points || len < proper_length || res->reserve(proper_length)) if (len < proper_length || res->reserve(proper_length))
return 0; return 0;
res->q_append(n_points); res->q_append(n_points);
@ -1072,9 +1073,9 @@ uint Gis_multi_point::init_from_wkb(const char *wkb, uint len, wkbByteOrder bo,
Gis_point p; Gis_point p;
const char *wkb_end; const char *wkb_end;
if (len < 4) if (len < 4 ||
(n_points= wkb_get_uint(wkb, bo)) > max_n_points)
return 0; return 0;
n_points= wkb_get_uint(wkb, bo);
proper_size= 4 + n_points * (WKB_HEADER_SIZE + POINT_DATA_SIZE); proper_size= 4 + n_points * (WKB_HEADER_SIZE + POINT_DATA_SIZE);
if (len < proper_size || res->reserve(proper_size)) if (len < proper_size || res->reserve(proper_size))

View File

@ -379,6 +379,10 @@ public:
class Gis_line_string: public Geometry class Gis_line_string: public Geometry
{ {
// Maximum number of points in LineString that can fit into String
static const uint32 max_n_points=
(uint32) (UINT_MAX32 - WKB_HEADER_SIZE - 4 /* n_points */) /
POINT_DATA_SIZE;
public: public:
Gis_line_string() {} /* Remove gcc warning */ Gis_line_string() {} /* Remove gcc warning */
virtual ~Gis_line_string() {} /* Remove gcc warning */ virtual ~Gis_line_string() {} /* Remove gcc warning */
@ -435,6 +439,10 @@ public:
class Gis_multi_point: public Geometry class Gis_multi_point: public Geometry
{ {
// Maximum number of points in MultiPoint that can fit into String
static const uint32 max_n_points=
(uint32) (UINT_MAX32 - WKB_HEADER_SIZE - 4 /* n_points */) /
(WKB_HEADER_SIZE + POINT_DATA_SIZE);
public: public:
Gis_multi_point() {} /* Remove gcc warning */ Gis_multi_point() {} /* Remove gcc warning */
virtual ~Gis_multi_point() {} /* Remove gcc warning */ virtual ~Gis_multi_point() {} /* Remove gcc warning */

View File

@ -786,6 +786,14 @@ static bool insert_params_with_log(Prepared_statement *stmt, uchar *null_array,
param->set_param_func(param, &read_pos, (uint) (data_end - read_pos)); param->set_param_func(param, &read_pos, (uint) (data_end - read_pos));
if (param->state == Item_param::NO_VALUE) if (param->state == Item_param::NO_VALUE)
DBUG_RETURN(1); DBUG_RETURN(1);
if (param->limit_clause_param && param->item_type != Item::INT_ITEM)
{
param->set_int(param->val_int(), MY_INT64_NUM_DECIMAL_DIGITS);
param->item_type= Item::INT_ITEM;
if (!param->unsigned_flag && param->value.integer < 0)
DBUG_RETURN(1);
}
} }
} }
/* /*

View File

@ -538,8 +538,6 @@ JOIN::prepare(Item ***rref_pointer_array,
if (having) if (having)
{ {
Query_arena backup, *arena;
arena= thd->activate_stmt_arena_if_needed(&backup);
nesting_map save_allow_sum_func= thd->lex->allow_sum_func; nesting_map save_allow_sum_func= thd->lex->allow_sum_func;
thd->where="having clause"; thd->where="having clause";
thd->lex->allow_sum_func|= 1 << select_lex_arg->nest_level; thd->lex->allow_sum_func|= 1 << select_lex_arg->nest_level;
@ -549,8 +547,6 @@ JOIN::prepare(Item ***rref_pointer_array,
having->check_cols(1))); having->check_cols(1)));
select_lex->having_fix_field= 0; select_lex->having_fix_field= 0;
select_lex->having= having; select_lex->having= having;
if (arena)
thd->restore_active_arena(arena, &backup);
if (having_fix_rc || thd->is_error()) if (having_fix_rc || thd->is_error())
DBUG_RETURN(-1); /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */
@ -1467,12 +1463,19 @@ JOIN::optimize()
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
/*
Calculate a possible 'limit' of table rows for 'GROUP BY': 'need_tmp'
implies that there will be more postprocessing so the specified
'limit' should not be enforced yet in the call to
'test_if_skip_sort_order'.
*/
const ha_rows limit = need_tmp ? HA_POS_ERROR : unit->select_limit_cnt;
if (!(select_options & SELECT_BIG_RESULT) && if (!(select_options & SELECT_BIG_RESULT) &&
((group_list && ((group_list &&
(!simple_group || (!simple_group ||
!test_if_skip_sort_order(&join_tab[const_tables], group_list, !test_if_skip_sort_order(&join_tab[const_tables], group_list,
unit->select_limit_cnt, 0, limit, 0,
&join_tab[const_tables].table-> &join_tab[const_tables].table->
keys_in_use_for_group_by))) || keys_in_use_for_group_by))) ||
select_distinct) && select_distinct) &&

View File

@ -3202,8 +3202,9 @@ end:
/* Restore original LEX value, statement's arena and THD arena values. */ /* Restore original LEX value, statement's arena and THD arena values. */
lex_end(thd->lex); lex_end(thd->lex);
if (i_s_arena.free_list) // Free items, before restoring backup_arena below.
i_s_arena.free_items(); DBUG_ASSERT(i_s_arena.free_list == NULL);
thd->free_items();
/* /*
For safety reset list of open temporary tables before closing For safety reset list of open temporary tables before closing

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates. Copyright (c) 2000, 2012, Oracle and/or its affiliates.
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
@ -230,8 +230,12 @@ public:
} }
bool real_alloc(uint32 arg_length); // Empties old string bool real_alloc(uint32 arg_length); // Empties old string
bool realloc(uint32 arg_length); bool realloc(uint32 arg_length);
inline void shrink(uint32 arg_length) // Shrink buffer
// Shrink the buffer, but only if it is allocated on the heap.
inline void shrink(uint32 arg_length)
{ {
if (!is_alloced())
return;
if (arg_length < Alloced_length) if (arg_length < Alloced_length)
{ {
char *new_ptr; char *new_ptr;
@ -247,7 +251,7 @@ public:
} }
} }
} }
bool is_alloced() { return alloced; } bool is_alloced() const { return alloced; }
inline String& operator = (const String &s) inline String& operator = (const String &s)
{ {
if (&s != this) if (&s != this)

View File

@ -1364,7 +1364,7 @@ bool ha_federated::create_where_from_key(String *to,
break; break;
} }
DBUG_PRINT("info", ("federated HA_READ_AFTER_KEY %d", i)); DBUG_PRINT("info", ("federated HA_READ_AFTER_KEY %d", i));
if (store_length >= length) /* end key */ if ((store_length >= length) || (i > 0)) /* for all parts of end key*/
{ {
if (emit_key_part_name(&tmp, key_part)) if (emit_key_part_name(&tmp, key_part))
goto err; goto err;

View File

@ -312,45 +312,40 @@ btr_pcur_restore_position(
/* Restore the old search mode */ /* Restore the old search mode */
cursor->search_mode = old_mode; cursor->search_mode = old_mode;
if (btr_pcur_is_on_user_rec(cursor, mtr)) { switch (cursor->rel_pos) {
switch (cursor->rel_pos) { case BTR_PCUR_ON:
case BTR_PCUR_ON: if (btr_pcur_is_on_user_rec(cursor, mtr)
if (!cmp_dtuple_rec( && !cmp_dtuple_rec(
tuple, btr_pcur_get_rec(cursor), tuple, btr_pcur_get_rec(cursor),
rec_get_offsets(btr_pcur_get_rec(cursor), rec_get_offsets(btr_pcur_get_rec(cursor),
index, NULL, index, NULL,
ULINT_UNDEFINED, &heap))) { ULINT_UNDEFINED, &heap))) {
/* We have to store the NEW value for /* We have to store the NEW value for
the modify clock, since the cursor can the modify clock, since the cursor can
now be on a different page! But we can now be on a different page! But we can
retain the value of old_rec */ retain the value of old_rec */
cursor->block_when_stored = cursor->block_when_stored =
buf_block_align( buf_block_align(
btr_pcur_get_page(cursor)); btr_pcur_get_page(cursor));
cursor->modify_clock = cursor->modify_clock =
buf_block_get_modify_clock( buf_block_get_modify_clock(
cursor->block_when_stored); cursor->block_when_stored);
cursor->old_stored = BTR_PCUR_OLD_STORED; cursor->old_stored = BTR_PCUR_OLD_STORED;
mem_heap_free(heap); mem_heap_free(heap);
return(TRUE); return(TRUE);
}
break;
case BTR_PCUR_BEFORE:
page_cur_move_to_next(btr_pcur_get_page_cur(cursor));
break;
case BTR_PCUR_AFTER:
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
break;
#ifdef UNIV_DEBUG
default:
ut_error;
#endif /* UNIV_DEBUG */
} }
#ifdef UNIV_DEBUG
/* fall through */
case BTR_PCUR_BEFORE:
case BTR_PCUR_AFTER:
break;
default:
ut_error;
#endif /* UNIV_DEBUG */
} }
mem_heap_free(heap); mem_heap_free(heap);

View File

@ -6380,7 +6380,6 @@ ha_innobase::records_in_range(
void* heap2; void* heap2;
DBUG_ENTER("records_in_range"); DBUG_ENTER("records_in_range");
DBUG_ASSERT(min_key || max_key);
ut_a(prebuilt->trx == thd_to_trx(ha_thd())); ut_a(prebuilt->trx == thd_to_trx(ha_thd()));

View File

@ -1,3 +1,32 @@
2012-08-29 The InnoDB Team
* btr/btr0btr.c, page/page0cur.c, page/page0page.c:
Fix Bug#14554000 CRASH IN PAGE_REC_GET_NTH_CONST(NTH=0)
DURING COMPRESSED PAGE SPLIT
2012-08-16 The InnoDB Team
* btr/btr0cur.c:
Fix Bug#12595091 POSSIBLY INVALID ASSERTION IN
BTR_CUR_PESSIMISTIC_UPDATE()
2012-08-16 The InnoDB Team
* btr/btr0btr.c, btr/btr0cur.c:
Fix Bug#12845774 OPTIMISTIC INSERT/UPDATE USES WRONG HEURISTICS FOR
COMPRESSED PAGE SIZE
2012-08-16 The InnoDB Team
* btr/btr0cur.c, page/page0page.c:
Fix Bug#13523839 ASSERTION FAILURES ON COMPRESSED INNODB TABLES
2012-08-07 The InnoDB Team
* btr/btr0pcur.c, row/row0merge.c:
Fix Bug#14399148 INNODB TABLES UNDER LOAD PRODUCE DUPLICATE COPIES
OF ROWS IN QUERIES
2012-03-15 The InnoDB Team 2012-03-15 The InnoDB Team
* fil/fil0fil.c, ibuf/ibuf0ibuf.c, include/fil0fil.h, * fil/fil0fil.c, ibuf/ibuf0ibuf.c, include/fil0fil.h,

View File

@ -1822,6 +1822,7 @@ btr_root_raise_and_insert(
root = btr_cur_get_page(cursor); root = btr_cur_get_page(cursor);
root_block = btr_cur_get_block(cursor); root_block = btr_cur_get_block(cursor);
root_page_zip = buf_block_get_page_zip(root_block); root_page_zip = buf_block_get_page_zip(root_block);
ut_ad(page_get_n_recs(root) > 0);
#ifdef UNIV_ZIP_DEBUG #ifdef UNIV_ZIP_DEBUG
ut_a(!root_page_zip || page_zip_validate(root_page_zip, root)); ut_a(!root_page_zip || page_zip_validate(root_page_zip, root));
#endif /* UNIV_ZIP_DEBUG */ #endif /* UNIV_ZIP_DEBUG */
@ -2302,12 +2303,20 @@ btr_insert_on_non_leaf_level_func(
BTR_CONT_MODIFY_TREE, BTR_CONT_MODIFY_TREE,
&cursor, 0, file, line, mtr); &cursor, 0, file, line, mtr);
err = btr_cur_pessimistic_insert(BTR_NO_LOCKING_FLAG ut_ad(cursor.flag == BTR_CUR_BINARY);
| BTR_KEEP_SYS_FLAG
| BTR_NO_UNDO_LOG_FLAG, err = btr_cur_optimistic_insert(
&cursor, tuple, &rec, BTR_NO_LOCKING_FLAG | BTR_KEEP_SYS_FLAG
&dummy_big_rec, 0, NULL, mtr); | BTR_NO_UNDO_LOG_FLAG, &cursor, tuple, &rec,
ut_a(err == DB_SUCCESS); &dummy_big_rec, 0, NULL, mtr);
if (err == DB_FAIL) {
err = btr_cur_pessimistic_insert(
BTR_NO_LOCKING_FLAG | BTR_KEEP_SYS_FLAG
| BTR_NO_UNDO_LOG_FLAG,
&cursor, tuple, &rec, &dummy_big_rec, 0, NULL, mtr);
ut_a(err == DB_SUCCESS);
}
} }
/**************************************************************//** /**************************************************************//**
@ -3232,6 +3241,7 @@ btr_compress(
if (adjust) { if (adjust) {
nth_rec = page_rec_get_n_recs_before(btr_cur_get_rec(cursor)); nth_rec = page_rec_get_n_recs_before(btr_cur_get_rec(cursor));
ut_ad(nth_rec > 0);
} }
/* Decide the page to which we try to merge and which will inherit /* Decide the page to which we try to merge and which will inherit
@ -3467,6 +3477,7 @@ func_exit:
mem_heap_free(heap); mem_heap_free(heap);
if (adjust) { if (adjust) {
ut_ad(nth_rec > 0);
btr_cur_position( btr_cur_position(
index, index,
page_rec_get_nth(merge_block->frame, nth_rec), page_rec_get_nth(merge_block->frame, nth_rec),
@ -3979,8 +3990,22 @@ btr_index_page_validate(
{ {
page_cur_t cur; page_cur_t cur;
ibool ret = TRUE; ibool ret = TRUE;
#ifndef DBUG_OFF
ulint nth = 1;
#endif /* !DBUG_OFF */
page_cur_set_before_first(block, &cur); page_cur_set_before_first(block, &cur);
/* Directory slot 0 should only contain the infimum record. */
DBUG_EXECUTE_IF("check_table_rec_next",
ut_a(page_rec_get_nth_const(
page_cur_get_page(&cur), 0)
== cur.rec);
ut_a(page_dir_slot_get_n_owned(
page_dir_get_nth_slot(
page_cur_get_page(&cur), 0))
== 1););
page_cur_move_to_next(&cur); page_cur_move_to_next(&cur);
for (;;) { for (;;) {
@ -3994,6 +4019,16 @@ btr_index_page_validate(
return(FALSE); return(FALSE);
} }
/* Verify that page_rec_get_nth_const() is correctly
retrieving each record. */
DBUG_EXECUTE_IF("check_table_rec_next",
ut_a(cur.rec == page_rec_get_nth_const(
page_cur_get_page(&cur),
page_rec_get_n_recs_before(
cur.rec)));
ut_a(nth++ == page_rec_get_n_recs_before(
cur.rec)););
page_cur_move_to_next(&cur); page_cur_move_to_next(&cur);
} }

View File

@ -1220,7 +1220,12 @@ fail_err:
if (UNIV_UNLIKELY(reorg)) { if (UNIV_UNLIKELY(reorg)) {
ut_a(zip_size); ut_a(zip_size);
ut_a(*rec); /* It's possible for rec to be NULL if the
page is compressed. This is because a
reorganized page may become incompressible. */
if (!*rec) {
goto fail;
}
} }
} }
@ -1356,20 +1361,9 @@ btr_cur_pessimistic_insert(
ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor), ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor),
MTR_MEMO_PAGE_X_FIX)); MTR_MEMO_PAGE_X_FIX));
/* Try first an optimistic insert; reset the cursor flag: we do not
assume anything of how it was positioned */
cursor->flag = BTR_CUR_BINARY; cursor->flag = BTR_CUR_BINARY;
err = btr_cur_optimistic_insert(flags, cursor, entry, rec, /* Check locks and write to undo log, if specified */
big_rec, n_ext, thr, mtr);
if (err != DB_FAIL) {
return(err);
}
/* Retry with a pessimistic insert. Check locks and write to undo log,
if specified */
err = btr_cur_ins_lock_and_undo(flags, cursor, entry, err = btr_cur_ins_lock_and_undo(flags, cursor, entry,
thr, mtr, &dummy_inh); thr, mtr, &dummy_inh);
@ -1973,8 +1967,12 @@ any_extern:
goto err_exit; goto err_exit;
} }
max_size = old_rec_size /* We do not attempt to reorganize if the page is compressed.
+ page_get_max_insert_size_after_reorganize(page, 1); This is because the page may fail to compress after reorganization. */
max_size = page_zip
? page_get_max_insert_size(page, 1)
: (old_rec_size
+ page_get_max_insert_size_after_reorganize(page, 1));
if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT) if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT)
&& (max_size >= new_rec_size)) && (max_size >= new_rec_size))
@ -2328,7 +2326,12 @@ make_external:
err = DB_SUCCESS; err = DB_SUCCESS;
goto return_after_reservations; goto return_after_reservations;
} else { } else {
ut_a(optim_err != DB_UNDERFLOW); /* If the page is compressed and it initially
compresses very well, and there is a subsequent insert
of a badly-compressing record, it is possible for
btr_cur_optimistic_update() to return DB_UNDERFLOW and
btr_cur_insert_if_possible() to return FALSE. */
ut_a(page_zip || optim_err != DB_UNDERFLOW);
/* Out of space: reset the free bits. */ /* Out of space: reset the free bits. */
if (!dict_index_is_clust(index) if (!dict_index_is_clust(index)
@ -2356,8 +2359,10 @@ make_external:
record on its page? */ record on its page? */
was_first = page_cur_is_before_first(page_cursor); was_first = page_cur_is_before_first(page_cursor);
/* The first parameter means that no lock checking and undo logging /* Lock checks and undo logging were already performed by
is made in the insert */ btr_cur_upd_lock_and_undo(). We do not try
btr_cur_optimistic_insert() because
btr_cur_insert_if_possible() already failed above. */
err = btr_cur_pessimistic_insert(BTR_NO_UNDO_LOG_FLAG err = btr_cur_pessimistic_insert(BTR_NO_UNDO_LOG_FLAG
| BTR_NO_LOCKING_FLAG | BTR_NO_LOCKING_FLAG

View File

@ -336,44 +336,39 @@ btr_pcur_restore_position_func(
/* Restore the old search mode */ /* Restore the old search mode */
cursor->search_mode = old_mode; cursor->search_mode = old_mode;
if (btr_pcur_is_on_user_rec(cursor)) { switch (cursor->rel_pos) {
switch (cursor->rel_pos) { case BTR_PCUR_ON:
case BTR_PCUR_ON: if (btr_pcur_is_on_user_rec(cursor)
if (!cmp_dtuple_rec( && !cmp_dtuple_rec(
tuple, btr_pcur_get_rec(cursor), tuple, btr_pcur_get_rec(cursor),
rec_get_offsets(btr_pcur_get_rec(cursor), rec_get_offsets(btr_pcur_get_rec(cursor),
index, NULL, index, NULL,
ULINT_UNDEFINED, &heap))) { ULINT_UNDEFINED, &heap))) {
/* We have to store the NEW value for /* We have to store the NEW value for
the modify clock, since the cursor can the modify clock, since the cursor can
now be on a different page! But we can now be on a different page! But we can
retain the value of old_rec */ retain the value of old_rec */
cursor->block_when_stored = cursor->block_when_stored =
btr_pcur_get_block(cursor); btr_pcur_get_block(cursor);
cursor->modify_clock = cursor->modify_clock =
buf_block_get_modify_clock( buf_block_get_modify_clock(
cursor->block_when_stored); cursor->block_when_stored);
cursor->old_stored = BTR_PCUR_OLD_STORED; cursor->old_stored = BTR_PCUR_OLD_STORED;
mem_heap_free(heap); mem_heap_free(heap);
return(TRUE); return(TRUE);
}
break;
case BTR_PCUR_BEFORE:
page_cur_move_to_next(btr_pcur_get_page_cur(cursor));
break;
case BTR_PCUR_AFTER:
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
break;
#ifdef UNIV_DEBUG
default:
ut_error;
#endif /* UNIV_DEBUG */
} }
#ifdef UNIV_DEBUG
/* fall through */
case BTR_PCUR_BEFORE:
case BTR_PCUR_AFTER:
break;
default:
ut_error;
#endif /* UNIV_DEBUG */
} }
mem_heap_free(heap); mem_heap_free(heap);

View File

@ -269,14 +269,6 @@ read-ahead or flush occurs */
UNIV_INTERN ibool buf_debug_prints = FALSE; UNIV_INTERN ibool buf_debug_prints = FALSE;
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
/** A chunk of buffers. The buffer pool is allocated in chunks. */
struct buf_chunk_struct{
ulint mem_size; /*!< allocated size of the chunk */
ulint size; /*!< size of frames[] and blocks[] */
void* mem; /*!< pointer to the memory area which
was allocated for the frames */
buf_block_t* blocks; /*!< array of buffer control blocks */
};
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
/********************************************************************//** /********************************************************************//**
@ -3623,6 +3615,133 @@ buf_get_free_list_len(void)
return(len); return(len);
} }
/*******************************************************************//**
Collect buffer pool stats information for a buffer pool. Also
record aggregated stats if there are more than one buffer pool
in the server */
UNIV_INTERN
void
buf_stats_get_pool_info(
/*====================*/
buf_pool_info_t* pool_info) /*!< in/out: buffer pool info
to fill */
{
time_t current_time;
double time_elapsed;
buf_pool_mutex_enter();
pool_info->pool_size = buf_pool->curr_size;
pool_info->lru_len = UT_LIST_GET_LEN(buf_pool->LRU);
pool_info->old_lru_len = buf_pool->LRU_old_len;
pool_info->free_list_len = UT_LIST_GET_LEN(buf_pool->free);
pool_info->flush_list_len = UT_LIST_GET_LEN(buf_pool->flush_list);
pool_info->n_pend_unzip = UT_LIST_GET_LEN(buf_pool->unzip_LRU);
pool_info->n_pend_reads = buf_pool->n_pend_reads;
pool_info->n_pending_flush_lru =
(buf_pool->n_flush[BUF_FLUSH_LRU]
+ buf_pool->init_flush[BUF_FLUSH_LRU]);
pool_info->n_pending_flush_list =
(buf_pool->n_flush[BUF_FLUSH_LIST]
+ buf_pool->init_flush[BUF_FLUSH_LIST]);
pool_info->n_pending_flush_single_page =
(buf_pool->n_flush[BUF_FLUSH_SINGLE_PAGE]
+ buf_pool->init_flush[BUF_FLUSH_SINGLE_PAGE]);
current_time = time(NULL);
time_elapsed = 0.001 + difftime(current_time,
buf_pool->last_printout_time);
pool_info->n_pages_made_young = buf_pool->stat.n_pages_made_young;
pool_info->n_pages_not_made_young =
buf_pool->stat.n_pages_not_made_young;
pool_info->n_pages_read = buf_pool->stat.n_pages_read;
pool_info->n_pages_created = buf_pool->stat.n_pages_created;
pool_info->n_pages_written = buf_pool->stat.n_pages_written;
pool_info->n_page_gets = buf_pool->stat.n_page_gets;
pool_info->n_ra_pages_read_rnd = buf_pool->stat.n_ra_pages_read_rnd;
pool_info->n_ra_pages_read = buf_pool->stat.n_ra_pages_read;
pool_info->n_ra_pages_evicted = buf_pool->stat.n_ra_pages_evicted;
pool_info->page_made_young_rate =
(buf_pool->stat.n_pages_made_young
- buf_pool->old_stat.n_pages_made_young) / time_elapsed;
pool_info->page_not_made_young_rate =
(buf_pool->stat.n_pages_not_made_young
- buf_pool->old_stat.n_pages_not_made_young) / time_elapsed;
pool_info->pages_read_rate =
(buf_pool->stat.n_pages_read
- buf_pool->old_stat.n_pages_read) / time_elapsed;
pool_info->pages_created_rate =
(buf_pool->stat.n_pages_created
- buf_pool->old_stat.n_pages_created) / time_elapsed;
pool_info->pages_written_rate =
(buf_pool->stat.n_pages_written
- buf_pool->old_stat.n_pages_written) / time_elapsed;
pool_info->n_page_get_delta = buf_pool->stat.n_page_gets
- buf_pool->old_stat.n_page_gets;
if (pool_info->n_page_get_delta) {
pool_info->page_read_delta = buf_pool->stat.n_pages_read
- buf_pool->old_stat.n_pages_read;
pool_info->young_making_delta =
buf_pool->stat.n_pages_made_young
- buf_pool->old_stat.n_pages_made_young;
pool_info->not_young_making_delta =
buf_pool->stat.n_pages_not_made_young
- buf_pool->old_stat.n_pages_not_made_young;
}
pool_info->pages_readahead_rnd_rate =
(buf_pool->stat.n_ra_pages_read_rnd
- buf_pool->old_stat.n_ra_pages_read_rnd) / time_elapsed;
pool_info->pages_readahead_rate =
(buf_pool->stat.n_ra_pages_read
- buf_pool->old_stat.n_ra_pages_read) / time_elapsed;
pool_info->pages_evicted_rate =
(buf_pool->stat.n_ra_pages_evicted
- buf_pool->old_stat.n_ra_pages_evicted) / time_elapsed;
pool_info->unzip_lru_len = UT_LIST_GET_LEN(buf_pool->unzip_LRU);
pool_info->io_sum = buf_LRU_stat_sum.io;
pool_info->io_cur = buf_LRU_stat_cur.io;
pool_info->unzip_sum = buf_LRU_stat_sum.unzip;
pool_info->unzip_cur = buf_LRU_stat_cur.unzip;
buf_refresh_io_stats();
buf_pool_mutex_exit();
}
#else /* !UNIV_HOTBACKUP */ #else /* !UNIV_HOTBACKUP */
/********************************************************************//** /********************************************************************//**
Inits a page to the buffer buf_pool, for use in ibbackup --restore. */ Inits a page to the buffer buf_pool, for use in ibbackup --restore. */
@ -3653,3 +3772,5 @@ buf_page_init_for_backup_restore(
} }
} }
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */

View File

@ -877,11 +877,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_INDEX_COL_LEN : 0);
return(HA_ERR_TO_BIG_ROW); return(HA_ERR_TO_BIG_ROW);
}
case DB_NO_SAVEPOINT: case DB_NO_SAVEPOINT:
return(HA_ERR_NO_SAVEPOINT); return(HA_ERR_NO_SAVEPOINT);
@ -7439,7 +7451,6 @@ ha_innobase::records_in_range(
mem_heap_t* heap; mem_heap_t* heap;
DBUG_ENTER("records_in_range"); DBUG_ENTER("records_in_range");
DBUG_ASSERT(min_key || max_key);
ut_a(prebuilt->trx == thd_to_trx(ha_thd())); ut_a(prebuilt->trx == thd_to_trx(ha_thd()));
@ -11342,7 +11353,10 @@ i_s_innodb_lock_waits,
i_s_innodb_cmp, i_s_innodb_cmp,
i_s_innodb_cmp_reset, i_s_innodb_cmp_reset,
i_s_innodb_cmpmem, i_s_innodb_cmpmem,
i_s_innodb_cmpmem_reset i_s_innodb_cmpmem_reset,
i_s_innodb_buffer_page,
i_s_innodb_buffer_page_lru,
i_s_innodb_buffer_stats
mysql_declare_plugin_end; mysql_declare_plugin_end;
/** @brief Initialize the default value of innodb_commit_concurrency. /** @brief Initialize the default value of innodb_commit_concurrency.

File diff suppressed because it is too large Load Diff

View File

@ -33,5 +33,8 @@ extern struct st_mysql_plugin i_s_innodb_cmp;
extern struct st_mysql_plugin i_s_innodb_cmp_reset; extern struct st_mysql_plugin i_s_innodb_cmp_reset;
extern struct st_mysql_plugin i_s_innodb_cmpmem; extern struct st_mysql_plugin i_s_innodb_cmpmem;
extern struct st_mysql_plugin i_s_innodb_cmpmem_reset; extern struct st_mysql_plugin i_s_innodb_cmpmem_reset;
extern struct st_mysql_plugin i_s_innodb_buffer_page;
extern struct st_mysql_plugin i_s_innodb_buffer_page_lru;
extern struct st_mysql_plugin i_s_innodb_buffer_stats;
#endif /* i_s_h */ #endif /* i_s_h */

View File

@ -2752,11 +2752,19 @@ ibuf_insert_low(
root = ibuf_tree_root_get(&mtr); root = ibuf_tree_root_get(&mtr);
err = btr_cur_pessimistic_insert(BTR_NO_LOCKING_FLAG err = btr_cur_optimistic_insert(
| BTR_NO_UNDO_LOG_FLAG, BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
cursor, cursor, ibuf_entry, &ins_rec,
ibuf_entry, &ins_rec, &dummy_big_rec, 0, thr, &mtr);
&dummy_big_rec, 0, thr, &mtr);
if (err == DB_FAIL) {
err = btr_cur_pessimistic_insert(
BTR_NO_LOCKING_FLAG
| BTR_NO_UNDO_LOG_FLAG,
cursor, ibuf_entry, &ins_rec,
&dummy_big_rec, 0, thr, &mtr);
}
if (err == DB_SUCCESS) { if (err == DB_SUCCESS) {
/* Update the page max trx id field */ /* Update the page max trx id field */
page_update_max_trx_id(btr_cur_get_block(cursor), NULL, page_update_max_trx_id(btr_cur_get_block(cursor), NULL,

View File

@ -103,6 +103,81 @@ enum buf_page_state {
before putting to the free list */ before putting to the free list */
}; };
/** This structure defines information we will fetch from each buffer pool. It
will be used to print table IO stats */
struct buf_pool_info_struct{
/* General buffer pool info */
ulint pool_size; /*!< Buffer Pool size in pages */
ulint lru_len; /*!< Length of buf_pool->LRU */
ulint old_lru_len; /*!< buf_pool->LRU_old_len */
ulint free_list_len; /*!< Length of buf_pool->free list */
ulint flush_list_len; /*!< Length of buf_pool->flush_list */
ulint n_pend_unzip; /*!< buf_pool->n_pend_unzip, pages
pending decompress */
ulint n_pend_reads; /*!< buf_pool->n_pend_reads, pages
pending read */
ulint n_pending_flush_lru; /*!< Pages pending flush in LRU */
ulint n_pending_flush_single_page;/*!< Pages pending to be
flushed as part of single page
flushes issued by various user
threads */
ulint n_pending_flush_list; /*!< Pages pending flush in FLUSH
LIST */
ulint n_pages_made_young; /*!< number of pages made young */
ulint n_pages_not_made_young; /*!< number of pages not made young */
ulint n_pages_read; /*!< buf_pool->n_pages_read */
ulint n_pages_created; /*!< buf_pool->n_pages_created */
ulint n_pages_written; /*!< buf_pool->n_pages_written */
ulint n_page_gets; /*!< buf_pool->n_page_gets */
ulint n_ra_pages_read_rnd; /*!< buf_pool->n_ra_pages_read_rnd,
number of pages readahead */
ulint n_ra_pages_read; /*!< buf_pool->n_ra_pages_read, number
of pages readahead */
ulint n_ra_pages_evicted; /*!< buf_pool->n_ra_pages_evicted,
number of readahead pages evicted
without access */
ulint n_page_get_delta; /*!< num of buffer pool page gets since
last printout */
/* Buffer pool access stats */
double page_made_young_rate; /*!< page made young rate in pages
per second */
double page_not_made_young_rate;/*!< page not made young rate
in pages per second */
double pages_read_rate; /*!< num of pages read per second */
double pages_created_rate; /*!< num of pages create per second */
double pages_written_rate; /*!< num of pages written per second */
ulint page_read_delta; /*!< num of pages read since last
printout */
ulint young_making_delta; /*!< num of pages made young since
last printout */
ulint not_young_making_delta; /*!< num of pages not make young since
last printout */
/* Statistics about read ahead algorithm. */
double pages_readahead_rnd_rate;/*!< random readahead rate in pages per
second */
double pages_readahead_rate; /*!< readahead rate in pages per
second */
double pages_evicted_rate; /*!< rate of readahead page evicted
without access, in pages per second */
/* Stats about LRU eviction */
ulint unzip_lru_len; /*!< length of buf_pool->unzip_LRU
list */
/* Counters for LRU policy */
ulint io_sum; /*!< buf_LRU_stat_sum.io */
ulint io_cur; /*!< buf_LRU_stat_cur.io, num of IO
for current interval */
ulint unzip_sum; /*!< buf_LRU_stat_sum.unzip */
ulint unzip_cur; /*!< buf_LRU_stat_cur.unzip, num
pages decompressed in current
interval */
};
typedef struct buf_pool_info_struct buf_pool_info_t;
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
/********************************************************************//** /********************************************************************//**
Creates the buffer pool. Creates the buffer pool.
@ -618,6 +693,16 @@ void
buf_print_io( buf_print_io(
/*=========*/ /*=========*/
FILE* file); /*!< in: file where to print */ FILE* file); /*!< in: file where to print */
/*******************************************************************//**
Collect buffer pool stats information for a buffer pool. Also
record aggregated stats if there are more than one buffer pool
in the server */
UNIV_INTERN
void
buf_stats_get_pool_info(
/*====================*/
buf_pool_info_t* pool_info); /*!< in/out: buffer pool info
to fill */
/*********************************************************************//** /*********************************************************************//**
Returns the ratio in percents of modified pages in the buffer pool / Returns the ratio in percents of modified pages in the buffer pool /
database pages in the buffer pool. database pages in the buffer pool.
@ -1037,12 +1122,27 @@ UNIV_INTERN
ulint ulint
buf_get_free_list_len(void); buf_get_free_list_len(void);
/*=======================*/ /*=======================*/
/*********************************************************************//**
Get the nth chunk's buffer block in the specified buffer pool.
@return the nth chunk's buffer block. */
UNIV_INLINE
buf_block_t*
buf_get_nth_chunk_block(
/*====================*/
const buf_pool_t* buf_pool, /*!< in: buffer pool instance */
ulint n, /*!< in: nth chunk in the buffer pool */
ulint* chunk_size); /*!< in: chunk size */
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
/** The common buffer control block structure /** The common buffer control block structure
for compressed and uncompressed frames */ for compressed and uncompressed frames */
/** Number of bits used for buffer page states. */
#define BUF_PAGE_STATE_BITS 3
struct buf_page_struct{ struct buf_page_struct{
/** @name General fields /** @name General fields
None of these bit-fields must be modified without holding None of these bit-fields must be modified without holding
@ -1057,7 +1157,8 @@ struct buf_page_struct{
unsigned offset:32; /*!< page number; also protected unsigned offset:32; /*!< page number; also protected
by buf_pool_mutex. */ by buf_pool_mutex. */
unsigned state:3; /*!< state of the control block; also unsigned state:BUF_PAGE_STATE_BITS;
/*!< state of the control block; also
protected by buf_pool_mutex. protected by buf_pool_mutex.
State transitions from State transitions from
BUF_BLOCK_READY_FOR_USE to BUF_BLOCK_READY_FOR_USE to

View File

@ -36,6 +36,16 @@ Created 11/5/1995 Heikki Tuuri
#include "buf0lru.h" #include "buf0lru.h"
#include "buf0rea.h" #include "buf0rea.h"
/** A chunk of buffers. The buffer pool is allocated in chunks. */
struct buf_chunk_struct{
ulint mem_size; /*!< allocated size of the chunk */
ulint size; /*!< size of frames[] and blocks[] */
void* mem; /*!< pointer to the memory area which
was allocated for the frames */
buf_block_t* blocks; /*!< array of buffer control blocks */
};
/********************************************************************//** /********************************************************************//**
Reads the freed_page_clock of a buffer block. Reads the freed_page_clock of a buffer block.
@return freed_page_clock */ @return freed_page_clock */
@ -1106,4 +1116,23 @@ buf_block_dbg_add_level(
sync_thread_add_level(&block->lock, level, FALSE); sync_thread_add_level(&block->lock, level, FALSE);
} }
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
/*********************************************************************//**
Get the nth chunk's buffer block in the specified buffer pool.
@return the nth chunk's buffer block. */
UNIV_INLINE
buf_block_t*
buf_get_nth_chunk_block(
/*====================*/
const buf_pool_t* buf_pool, /*!< in: buffer pool instance */
ulint n, /*!< in: nth chunk in the buffer pool */
ulint* chunk_size) /*!< in: chunk size */
{
const buf_chunk_t* chunk;
chunk = buf_pool->chunks + n;
*chunk_size = chunk->size;
return(chunk->blocks);
}
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */

View File

@ -141,6 +141,8 @@ extern fil_addr_t fil_addr_null;
#define FIL_PAGE_TYPE_BLOB 10 /*!< Uncompressed BLOB page */ #define FIL_PAGE_TYPE_BLOB 10 /*!< Uncompressed BLOB page */
#define FIL_PAGE_TYPE_ZBLOB 11 /*!< First compressed BLOB page */ #define FIL_PAGE_TYPE_ZBLOB 11 /*!< First compressed BLOB page */
#define FIL_PAGE_TYPE_ZBLOB2 12 /*!< Subsequent compressed BLOB page */ #define FIL_PAGE_TYPE_ZBLOB2 12 /*!< Subsequent compressed BLOB page */
#define FIL_PAGE_TYPE_LAST FIL_PAGE_TYPE_ZBLOB2
/*!< Last page type */
/* @} */ /* @} */
/** Space types @{ */ /** Space types @{ */

View File

@ -41,6 +41,9 @@ Created 12/9/1995 Heikki Tuuri
#include "sync0rw.h" #include "sync0rw.h"
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
/* Type used for all log sequence number storage and arithmetics */
typedef ib_uint64_t lsn_t;
/** Redo log buffer */ /** Redo log buffer */
typedef struct log_struct log_t; typedef struct log_struct log_t;
/** Redo log group */ /** Redo log group */

View File

@ -267,6 +267,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

@ -1902,6 +1902,7 @@ page_cur_delete_rec(
/* Save to local variables some data associated with current_rec */ /* Save to local variables some data associated with current_rec */
cur_slot_no = page_dir_find_owner_slot(current_rec); cur_slot_no = page_dir_find_owner_slot(current_rec);
ut_ad(cur_slot_no > 0);
cur_dir_slot = page_dir_get_nth_slot(page, cur_slot_no); cur_dir_slot = page_dir_get_nth_slot(page, cur_slot_no);
cur_n_owned = page_dir_slot_get_n_owned(cur_dir_slot); cur_n_owned = page_dir_slot_get_n_owned(cur_dir_slot);

View File

@ -780,17 +780,23 @@ page_copy_rec_list_start(
if (UNIV_LIKELY_NULL(new_page_zip)) { if (UNIV_LIKELY_NULL(new_page_zip)) {
mtr_set_log_mode(mtr, log_mode); mtr_set_log_mode(mtr, log_mode);
DBUG_EXECUTE_IF("page_copy_rec_list_start_compress_fail",
goto zip_reorganize;);
if (UNIV_UNLIKELY if (UNIV_UNLIKELY
(!page_zip_compress(new_page_zip, new_page, index, mtr))) { (!page_zip_compress(new_page_zip, new_page, index, mtr))) {
ulint ret_pos;
#ifndef DBUG_OFF
zip_reorganize:
#endif /* DBUG_OFF */
/* Before trying to reorganize the page, /* Before trying to reorganize the page,
store the number of preceding records on the page. */ store the number of preceding records on the page. */
ulint ret_pos ret_pos = page_rec_get_n_recs_before(ret);
= page_rec_get_n_recs_before(ret);
/* Before copying, "ret" was the predecessor /* Before copying, "ret" was the predecessor
of the predefined supremum record. If it was of the predefined supremum record. If it was
the predefined infimum record, then it would the predefined infimum record, then it would
still be the infimum. Thus, the assertion still be the infimum, and we would have
ut_a(ret_pos > 0) would fail here. */ ret_pos == 0. */
if (UNIV_UNLIKELY if (UNIV_UNLIKELY
(!page_zip_reorganize(new_block, index, mtr))) { (!page_zip_reorganize(new_block, index, mtr))) {
@ -806,15 +812,10 @@ page_copy_rec_list_start(
btr_blob_dbg_add(new_page, index, btr_blob_dbg_add(new_page, index,
"copy_start_reorg_fail"); "copy_start_reorg_fail");
return(NULL); return(NULL);
} else {
/* The page was reorganized:
Seek to ret_pos. */
ret = new_page + PAGE_NEW_INFIMUM;
do {
ret = rec_get_next_ptr(ret, TRUE);
} while (--ret_pos);
} }
/* The page was reorganized: Seek to ret_pos. */
ret = page_rec_get_nth(new_page, ret_pos);
} }
} }
@ -1050,6 +1051,7 @@ page_delete_rec_list_end(
n_owned = rec_get_n_owned_new(rec2) - count; n_owned = rec_get_n_owned_new(rec2) - count;
slot_index = page_dir_find_owner_slot(rec2); slot_index = page_dir_find_owner_slot(rec2);
ut_ad(slot_index > 0);
slot = page_dir_get_nth_slot(page, slot_index); slot = page_dir_get_nth_slot(page, slot_index);
} else { } else {
rec_t* rec2 = rec; rec_t* rec2 = rec;
@ -1065,6 +1067,7 @@ page_delete_rec_list_end(
n_owned = rec_get_n_owned_old(rec2) - count; n_owned = rec_get_n_owned_old(rec2) - count;
slot_index = page_dir_find_owner_slot(rec2); slot_index = page_dir_find_owner_slot(rec2);
ut_ad(slot_index > 0);
slot = page_dir_get_nth_slot(page, slot_index); slot = page_dir_get_nth_slot(page, slot_index);
} }
@ -1491,6 +1494,10 @@ page_rec_get_nth_const(
ulint n_owned; ulint n_owned;
const rec_t* rec; const rec_t* rec;
if (nth == 0) {
return(page_get_infimum_rec(page));
}
ut_ad(nth < UNIV_PAGE_SIZE / (REC_N_NEW_EXTRA_BYTES + 1)); ut_ad(nth < UNIV_PAGE_SIZE / (REC_N_NEW_EXTRA_BYTES + 1));
for (i = 0;; i++) { for (i = 0;; i++) {

View File

@ -2179,9 +2179,16 @@ row_ins_index_entry_low(
goto function_exit; goto function_exit;
} }
err = btr_cur_pessimistic_insert(
err = btr_cur_optimistic_insert(
0, &cursor, entry, &insert_rec, &big_rec, 0, &cursor, entry, &insert_rec, &big_rec,
n_ext, thr, &mtr); n_ext, thr, &mtr);
if (err == DB_FAIL) {
err = btr_cur_pessimistic_insert(
0, &cursor, entry, &insert_rec,
&big_rec, n_ext, thr, &mtr);
}
} }
} }

View File

@ -1214,11 +1214,25 @@ row_merge_read_clustered_index(
goto err_exit; goto err_exit;
} }
/* Store the cursor position on the last user
record on the page. */
btr_pcur_move_to_prev_on_page(&pcur);
/* Leaf pages must never be empty, unless
this is the only page in the index tree. */
ut_ad(btr_pcur_is_on_user_rec(&pcur)
|| buf_block_get_page_no(
btr_pcur_get_block(&pcur))
== clust_index->page);
btr_pcur_store_position(&pcur, &mtr); btr_pcur_store_position(&pcur, &mtr);
mtr_commit(&mtr); mtr_commit(&mtr);
mtr_start(&mtr); mtr_start(&mtr);
/* Restore position on the record, or its
predecessor if the record was purged
meanwhile. */
btr_pcur_restore_position(BTR_SEARCH_LEAF, btr_pcur_restore_position(BTR_SEARCH_LEAF,
&pcur, &mtr); &pcur, &mtr);
/* Move to the successor of the original record. */
has_next = btr_pcur_move_to_next_user_rec(&pcur, &mtr); has_next = btr_pcur_move_to_next_user_rec(&pcur, &mtr);
} }

View File

@ -7,3 +7,6 @@ INSTALL PLUGIN innodb_cmp SONAME 'ha_innodb.so';
INSTALL PLUGIN innodb_cmp_reset SONAME 'ha_innodb.so'; INSTALL PLUGIN innodb_cmp_reset SONAME 'ha_innodb.so';
INSTALL PLUGIN innodb_cmpmem SONAME 'ha_innodb.so'; INSTALL PLUGIN innodb_cmpmem SONAME 'ha_innodb.so';
INSTALL PLUGIN innodb_cmpmem_reset SONAME 'ha_innodb.so'; INSTALL PLUGIN innodb_cmpmem_reset SONAME 'ha_innodb.so';
INSTALL PLUGIN innodb_buffer_pool_stats SONAME 'ha_innodb.so';
INSTALL PLUGIN innodb_buffer_page SONAME 'ha_innodb.so';
INSTALL PLUGIN innodb_buffer_page_lru SONAME 'ha_innodb.so';

View File

@ -7,3 +7,6 @@ INSTALL PLUGIN innodb_cmp SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_cmp_reset SONAME 'ha_innodb.dll'; INSTALL PLUGIN innodb_cmp_reset SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_cmpmem SONAME 'ha_innodb.dll'; INSTALL PLUGIN innodb_cmpmem SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_cmpmem_reset SONAME 'ha_innodb.dll'; INSTALL PLUGIN innodb_cmpmem_reset SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_buffer_pool_stats SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_buffer_page SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_buffer_page_lru SONAME 'ha_innodb.dll';

View File

@ -390,7 +390,7 @@ CXXFLAGS=${CXXFLAGS:-$RPM_OPT_FLAGS -felide-constructors -fno-exceptions -fno-rt
# Evaluate current setting of $DEBUG # Evaluate current setting of $DEBUG
if [ $DEBUG -gt 0 ] ; then if [ $DEBUG -gt 0 ] ; then
OPT_COMMENT='--with-comment="%{debug_comment}"' OPT_COMMENT='--with-comment="%{debug_comment}"'
OPT_DEBUG='--with-debug' OPT_DEBUG='--with-debug --enable-mysql-maintainer-mode=no'
CFLAGS=`echo " $CFLAGS " | \ CFLAGS=`echo " $CFLAGS " | \
sed -e 's/ -O[0-9]* / /' -e 's/ -unroll2 / /' -e 's/ -ip / /' \ sed -e 's/ -O[0-9]* / /' -e 's/ -unroll2 / /' -e 's/ -ip / /' \
-e 's/^ //' -e 's/ $//'` -e 's/^ //' -e 's/ $//'`
@ -1226,6 +1226,11 @@ fi
# merging BK trees) # merging BK trees)
############################################################################## ##############################################################################
%changelog %changelog
* Tue Sep 11 2012 Joerg Bruehe <joerg.bruehe@oracle.com>
- Disable "maintainer mode" in debug builds, there is a cast ulonglong -> int
in the sources (since 2007) that would cause builds to fail.
* Wed Sep 14 2011 Joerg Bruehe <joerg.bruehe@oracle.com> * Wed Sep 14 2011 Joerg Bruehe <joerg.bruehe@oracle.com>
- Let the RPM capabilities ("obsoletes" etc) ensure that an upgrade may replace - Let the RPM capabilities ("obsoletes" etc) ensure that an upgrade may replace

View File

@ -101,47 +101,51 @@ vio_set_cert_stuff(SSL_CTX *ctx, const char *cert_file, const char *key_file,
DBUG_ENTER("vio_set_cert_stuff"); DBUG_ENTER("vio_set_cert_stuff");
DBUG_PRINT("enter", ("ctx: 0x%lx cert_file: %s key_file: %s", DBUG_PRINT("enter", ("ctx: 0x%lx cert_file: %s key_file: %s",
(long) ctx, cert_file, key_file)); (long) ctx, cert_file, key_file));
if (cert_file)
if (!cert_file && key_file)
cert_file= key_file;
if (!key_file && cert_file)
key_file= cert_file;
if (cert_file &&
SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0)
{ {
if (SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) *error= SSL_INITERR_CERT;
{ DBUG_PRINT("error",("%s from file '%s'", sslGetErrString(*error), cert_file));
*error= SSL_INITERR_CERT; DBUG_EXECUTE("error", ERR_print_errors_fp(DBUG_FILE););
DBUG_PRINT("error",("%s from file '%s'", sslGetErrString(*error), cert_file)); fprintf(stderr, "SSL error: %s from '%s'\n", sslGetErrString(*error),
DBUG_EXECUTE("error", ERR_print_errors_fp(DBUG_FILE);); cert_file);
fprintf(stderr, "SSL error: %s from '%s'\n", sslGetErrString(*error), fflush(stderr);
cert_file); DBUG_RETURN(1);
fflush(stderr);
DBUG_RETURN(1);
}
if (!key_file)
key_file= cert_file;
if (SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0)
{
*error= SSL_INITERR_KEY;
DBUG_PRINT("error", ("%s from file '%s'", sslGetErrString(*error), key_file));
DBUG_EXECUTE("error", ERR_print_errors_fp(DBUG_FILE););
fprintf(stderr, "SSL error: %s from '%s'\n", sslGetErrString(*error),
key_file);
fflush(stderr);
DBUG_RETURN(1);
}
/*
If we are using DSA, we can copy the parameters from the private key
Now we know that a key and cert have been set against the SSL context
*/
if (!SSL_CTX_check_private_key(ctx))
{
*error= SSL_INITERR_NOMATCH;
DBUG_PRINT("error", ("%s",sslGetErrString(*error)));
DBUG_EXECUTE("error", ERR_print_errors_fp(DBUG_FILE););
fprintf(stderr, "SSL error: %s\n", sslGetErrString(*error));
fflush(stderr);
DBUG_RETURN(1);
}
} }
if (key_file &&
SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0)
{
*error= SSL_INITERR_KEY;
DBUG_PRINT("error", ("%s from file '%s'", sslGetErrString(*error), key_file));
DBUG_EXECUTE("error", ERR_print_errors_fp(DBUG_FILE););
fprintf(stderr, "SSL error: %s from '%s'\n", sslGetErrString(*error),
key_file);
fflush(stderr);
DBUG_RETURN(1);
}
/*
If we are using DSA, we can copy the parameters from the private key
Now we know that a key and cert have been set against the SSL context
*/
if (cert_file && !SSL_CTX_check_private_key(ctx))
{
*error= SSL_INITERR_NOMATCH;
DBUG_PRINT("error", ("%s",sslGetErrString(*error)));
DBUG_EXECUTE("error", ERR_print_errors_fp(DBUG_FILE););
fprintf(stderr, "SSL error: %s\n", sslGetErrString(*error));
fflush(stderr);
DBUG_RETURN(1);
}
DBUG_RETURN(0); DBUG_RETURN(0);
} }
@ -253,6 +257,20 @@ new_VioSSLFd(const char *key_file, const char *cert_file,
if (SSL_CTX_load_verify_locations(ssl_fd->ssl_context, ca_file, ca_path) == 0) if (SSL_CTX_load_verify_locations(ssl_fd->ssl_context, ca_file, ca_path) == 0)
{ {
DBUG_PRINT("warning", ("SSL_CTX_load_verify_locations failed")); DBUG_PRINT("warning", ("SSL_CTX_load_verify_locations failed"));
if (ca_file || ca_path)
{
/* fail only if ca file or ca path were supplied and looking into
them fails. */
*error= SSL_INITERR_BAD_PATHS;
DBUG_PRINT("error", ("SSL_CTX_load_verify_locations failed : %s",
sslGetErrString(*error)));
report_errors();
SSL_CTX_free(ssl_fd->ssl_context);
my_free((void*)ssl_fd,MYF(0));
DBUG_RETURN(0);
}
/* otherwise go use the defaults */
if (SSL_CTX_set_default_verify_paths(ssl_fd->ssl_context) == 0) if (SSL_CTX_set_default_verify_paths(ssl_fd->ssl_context) == 0)
{ {
*error= SSL_INITERR_BAD_PATHS; *error= SSL_INITERR_BAD_PATHS;