Merge MariaDB 5.1.66 -> 5.2.12
This commit is contained in:
commit
c5cef4b166
125
CMakeLists.txt
125
CMakeLists.txt
@ -402,5 +402,130 @@ IF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" STREQU
|
|||||||
# CMake bug#11452, only in 2.8.3
|
# CMake bug#11452, only in 2.8.3
|
||||||
SET(CPACK_MONOLITHIC_INSTALL 1 CACHE INTERNAL "")
|
SET(CPACK_MONOLITHIC_INSTALL 1 CACHE INTERNAL "")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(EXISTS ${CMAKE_SOURCE_DIR}/internal/CMakeLists.txt)
|
||||||
|
ADD_SUBDIRECTORY(internal)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
# Set up the installer
|
||||||
|
SET(CPACK_PACKAGE_NAME "MariaDB")
|
||||||
|
STRING(REPLACE "-MariaDB" "" CPACK_PACKAGE_VERSION ${VERSION})
|
||||||
|
SET(CPACK_PACKAGE_VENDOR "Monty Program AB http://www.montyprogram.com")
|
||||||
|
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MariaDB")
|
||||||
|
SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/COPYING)
|
||||||
|
SET(CPACK_GENERATOR NSIS)
|
||||||
|
|
||||||
|
# Use our own NSIS template
|
||||||
|
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/win/cmake" ${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
|
# Installer components and grouping
|
||||||
|
SET(CPACK_COMPONENT_GROUP_SERVER_DESCRIPTION "The files necessary for running the MariaDB server.")
|
||||||
|
SET(CPACK_COMPONENT_GROUP_DEVELOPMENT_DESCRIPTION "Files used in development on the MariaDB server.")
|
||||||
|
SET(CPACK_ALL_INSTALL_TYPES Normal Development)
|
||||||
|
SET(CPACK_COMPONENT_RUNTIME_DISPLAY_NAME "MariaDB server")
|
||||||
|
SET(CPACK_COMPONENT_RUNTIME_DESCRIPTION "The server itself. You want to install this one.")
|
||||||
|
SET(CPACK_COMPONENT_RUNTIME_GROUP "Server")
|
||||||
|
SET(CPACK_COMPONENT_RUNTIME_INSTALL_TYPES Normal Development)
|
||||||
|
SET(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "Development headers")
|
||||||
|
SET(CPACK_COMPONENT_HEADERS_DESCRIPTION "Header files for development on MariaDB.")
|
||||||
|
SET(CPACK_COMPONENT_HEADERS_DEPENDS runtime)
|
||||||
|
SET(CPACK_COMPONENT_HEADERS_GROUP "Development")
|
||||||
|
SET(CPACK_COMPONENT_HEADERS_INSTALL_TYPES Development)
|
||||||
|
SET(CPACK_COMPONENT_EMBEDDED_DISPLAY_NAME "Embedded")
|
||||||
|
SET(CPACK_COMPONENT_EMBEDDED_DESCRIPTION "Files for embedding MariaDB in other projects.")
|
||||||
|
SET(CPACK_COMPONENT_EMBEDDED_DEPENDS headers)
|
||||||
|
SET(CPACK_COMPONENT_EMBEDDED_GROUP "Development")
|
||||||
|
SET(CPACK_COMPONENT_EMBEDDED_INSTALL_TYPES Development)
|
||||||
|
SET(CPACK_COMPONENT_SCRIPTS_DISPLAY_NAME "Server scripts")
|
||||||
|
SET(CPACK_COMPONENT_SCRIPTS_DESCRIPTION "SQL and Perl scripts to control and modify the server. You need a perl installation for some of these to work.")
|
||||||
|
SET(CPACK_COMPONENT_SCRIPTS_DEPENDS runtime)
|
||||||
|
SET(CPACK_COMPONENT_SCRIPTS_GROUP "Server")
|
||||||
|
SET(CPACK_COMPONENT_SCRIPTS_INSTALL_TYPES Normal Development)
|
||||||
|
SET(CPACK_COMPONENT_MYSQLTEST_DISPLAY_NAME "MariaDB test suite")
|
||||||
|
SET(CPACK_COMPONENT_MYSQLTEST_DESCRIPTION "The MariaDB regression test suite.")
|
||||||
|
SET(CPACK_COMPONENT_MYSQLTEST_DEPENDS runtime)
|
||||||
|
SET(CPACK_COMPONENT_MYSQLTEST_GROUP "Testing")
|
||||||
|
SET(CPACK_COMPONENT_MYSQLTEST_INSTALL_TYPES Normal Development)
|
||||||
|
SET(CPACK_COMPONENT_SQLBENCH_DISPLAY_NAME "SQL Bench")
|
||||||
|
SET(CPACK_COMPONENT_SQLBENCH_DESCRIPTION "The MariaDB benchmark suite.")
|
||||||
|
SET(CPACK_COMPONENT_SQLBENCH_DEPENDS runtime)
|
||||||
|
SET(CPACK_COMPONENT_SQLBENCH_GROUP "Testing")
|
||||||
|
SET(CPACK_COMPONENT_SQLBENCH_INSTALL_TYPES Normal Development)
|
||||||
|
|
||||||
|
# Add files to the installer
|
||||||
|
INSTALL(FILES COPYING EXCEPTIONS-CLIENT DESTINATION .)
|
||||||
|
INSTALL(FILES support-files/my-huge.ini support-files/my-innodb-heavy-4G.ini DESTINATION .)
|
||||||
|
INSTALL(FILES support-files/my-large.ini support-files/my-medium.ini DESTINATION .)
|
||||||
|
INSTALL(FILES support-files/my-small.ini DESTINATION .)
|
||||||
|
INSTALL(FILES Docs/INSTALL-BINARY DESTINATION Docs)
|
||||||
|
INSTALL(FILES COPYING DESTINATION Docs)
|
||||||
|
FILE(GLOB headerfiles "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
|
||||||
|
INSTALL(FILES ${headerfiles} DESTINATION include COMPONENT headers)
|
||||||
|
INSTALL(FILES include/mysql/plugin.h DESTINATION include/mysql COMPONENT headers)
|
||||||
|
INSTALL(FILES libmysql/libmysql.def DESTINATION include COMPONENT headers)
|
||||||
|
|
||||||
|
# Handle the database files
|
||||||
|
FILE(GLOB datafiles "${CMAKE_CURRENT_SOURCE_DIR}/win/data/mysql/*")
|
||||||
|
INSTALL(FILES ${datafiles} DESTINATION data/clean/mysql)
|
||||||
|
INSTALL(FILES win/data/maria_log.00000001 win/data/maria_log_control DESTINATION data/clean)
|
||||||
|
INSTALL(DIRECTORY win/data/test DESTINATION data/clean)
|
||||||
|
SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}
|
||||||
|
IfFileExists '$INSTDIR\\\\data\\\\mysql\\\\db.frm' 0 CopyDatabaseFiles
|
||||||
|
MessageBox MB_OK 'There are already database files present in the data directory. Clean database files are not written to the directory'
|
||||||
|
GoTo EndCopyDatabaseFiles
|
||||||
|
CopyDatabaseFiles:
|
||||||
|
CopyFiles '$INSTDIR\\\\data\\\\clean\\\\*' '$INSTDIR\\\\data'
|
||||||
|
EndCopyDatabaseFiles:")
|
||||||
|
SET(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "${CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS}
|
||||||
|
MessageBox MB_OK 'This will not delete the database files in $INSTDIR\\\\data'")
|
||||||
|
|
||||||
|
# Files in the share dir
|
||||||
|
INSTALL(FILES sql/share/errmsg.txt DESTINATION share COMPONENT runtime)
|
||||||
|
FILE(GLOB charsets sql/share/charsets/*)
|
||||||
|
INSTALL(FILES ${charsets} DESTINATION share/charsets COMPONENT runtime)
|
||||||
|
FILE(GLOB share_dirs sql/share/*/errmsg.sys)
|
||||||
|
FOREACH(ERRMSGFILE ${share_dirs})
|
||||||
|
STRING(REPLACE "//" "/" ERRMSGFILE ${ERRMSGFILE}) # Work around a cmake bug
|
||||||
|
FILE(RELATIVE_PATH DIRNAME ${PROJECT_SOURCE_DIR}/sql/share ${ERRMSGFILE})
|
||||||
|
STRING(REPLACE "/errmsg.sys" "" DIRNAME ${DIRNAME})
|
||||||
|
INSTALL(FILES ${ERRMSGFILE} DESTINATION share/${DIRNAME} COMPONENT runtime)
|
||||||
|
ENDFOREACH(ERRMSGFILE ${share_dirs})
|
||||||
|
|
||||||
|
# MTR files
|
||||||
|
FILE(GLOB_RECURSE testfiles mysql-test/*)
|
||||||
|
FOREACH(testfile ${testfiles})
|
||||||
|
FILE(RELATIVE_PATH dirname ${PROJECT_SOURCE_DIR} ${testfile})
|
||||||
|
GET_FILENAME_COMPONENT(dirname ${dirname} PATH)
|
||||||
|
GET_FILENAME_COMPONENT(filename ${testfile} NAME)
|
||||||
|
GET_FILENAME_COMPONENT(ext ${testfile} EXT)
|
||||||
|
SET(ok "yes")
|
||||||
|
IF (NOT "x_${ext}" STREQUAL "x_")
|
||||||
|
# Test if this is one of the extensions we don't want to install
|
||||||
|
STRING(TOLOWER ${ext} ext)
|
||||||
|
IF(${ext} STREQUAL ".dir" OR ${ext} STREQUAL ".vcproj" OR ${ext} STREQUAL ".user" OR ${ext} STREQUAL ".ilk"
|
||||||
|
OR ${ext} STREQUAL ".idb" OR ${ext} STREQUAL ".map" OR ${ext} STREQUAL ".gcov"
|
||||||
|
OR ${ext} STREQUAL ".supp" OR ${ext} STREQUAL ".am" OR ${ext} STREQUAL ".stress")
|
||||||
|
SET(ok "no")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(NOT "x_${ext}" STREQUAL "x_")
|
||||||
|
IF (${ok} STREQUAL "yes")
|
||||||
|
# Message("Dir: ${dirname}. File: ${filename}. Ext: ${ext}")
|
||||||
|
INSTALL(FILES ${testfile} DESTINATION ${dirname} COMPONENT mysqltest)
|
||||||
|
ENDIF(${ok} STREQUAL "yes")
|
||||||
|
ENDFOREACH(testfile ${testfiles})
|
||||||
|
|
||||||
|
# SQL Bench
|
||||||
|
FILE(GLOB_RECURSE benchfiles sql-bench/*)
|
||||||
|
FOREACH(testfile ${testfiles})
|
||||||
|
FILE(RELATIVE_PATH dirname ${PROJECT_SOURCE_DIR} ${testfile})
|
||||||
|
GET_FILENAME_COMPONENT(dirname ${dirname} PATH)
|
||||||
|
GET_FILENAME_COMPONENT(filename ${testfile} NAME)
|
||||||
|
IF(NOT ${dirname} STREQUAL "sql-bench" OR ${filename} STREQUAL "README")
|
||||||
|
INSTALL(FILES ${testfile} DESTINATION ${dirname} COMPONENT sqlbench)
|
||||||
|
ENDIF()
|
||||||
|
ENDFOREACH(testfile ${testfiles})
|
||||||
|
|
||||||
|
INCLUDE(InstallRequiredSystemLibraries)
|
||||||
|
|
||||||
# This must always be the last line
|
# This must always be the last line
|
||||||
INCLUDE(CPack)
|
INCLUDE(CPack)
|
||||||
|
@ -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."
|
||||||
|
|
||||||
|
@ -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 ";"
|
||||||
@ -1179,7 +1180,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);
|
||||||
@ -1614,7 +1615,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);
|
||||||
@ -2836,7 +2837,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;
|
||||||
@ -2851,8 +2852,11 @@ 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)
|
||||||
{
|
{
|
||||||
@ -2921,6 +2925,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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 "9.0"
|
#define ADMIN_VERSION "9.0"
|
||||||
#define MAX_MYSQL_VAR 512
|
#define MAX_MYSQL_VAR 512
|
||||||
@ -704,9 +705,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,\n"
|
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
|
||||||
"2009 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");
|
|
||||||
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));
|
||||||
@ -1159,9 +1158,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,\n"
|
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
|
||||||
"2009 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("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);
|
||||||
|
@ -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
|
||||||
|
|
||||||
/* Needed for Rpl_filter */
|
/* Needed for Rpl_filter */
|
||||||
CHARSET_INFO* system_charset_info= &my_charset_utf8_general_ci;
|
CHARSET_INFO* system_charset_info= &my_charset_utf8_general_ci;
|
||||||
@ -1341,10 +1343,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");
|
||||||
@ -1888,6 +1887,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)))
|
||||||
@ -1897,7 +1897,16 @@ static Exit_status check_header(IO_CACHE* file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pos= my_b_tell(file);
|
pos= my_b_tell(file);
|
||||||
|
|
||||||
|
/* 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);
|
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.");
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
@ -226,13 +226,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.");
|
||||||
|
@ -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
|
||||||
@ -584,8 +586,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);
|
||||||
|
@ -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;
|
||||||
@ -203,7 +205,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\
|
||||||
|
@ -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;
|
||||||
@ -256,9 +257,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\
|
||||||
|
@ -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
|
||||||
@ -709,8 +710,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);
|
||||||
|
@ -55,6 +55,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"
|
||||||
@ -6281,8 +6283,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);
|
||||||
|
@ -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
|
||||||
@ -198,8 +198,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;
|
||||||
@ -215,7 +219,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)
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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@
|
||||||
|
@ -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"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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_ */
|
||||||
|
@ -85,6 +85,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/pbxt/t suite/pbxt/r suite/pbxt \
|
suite/pbxt/t suite/pbxt/r suite/pbxt \
|
||||||
suite/vcol suite/vcol/t suite/vcol/r suite/vcol/inc \
|
suite/vcol suite/vcol/t suite/vcol/r suite/vcol/inc \
|
||||||
suite/oqgraph suite/oqgraph/t suite/oqgraph/r \
|
suite/oqgraph suite/oqgraph/t suite/oqgraph/r \
|
||||||
|
@ -56,9 +56,13 @@ FILES
|
|||||||
GLOBAL_STATUS
|
GLOBAL_STATUS
|
||||||
GLOBAL_VARIABLES
|
GLOBAL_VARIABLES
|
||||||
INDEX_STATISTICS
|
INDEX_STATISTICS
|
||||||
|
INNODB_BUFFER_PAGE
|
||||||
|
INNODB_BUFFER_PAGE_LRU
|
||||||
INNODB_BUFFER_POOL_PAGES
|
INNODB_BUFFER_POOL_PAGES
|
||||||
INNODB_BUFFER_POOL_PAGES_BLOB
|
INNODB_BUFFER_POOL_PAGES_BLOB
|
||||||
INNODB_BUFFER_POOL_PAGES_INDEX
|
INNODB_BUFFER_POOL_PAGES_INDEX
|
||||||
|
INNODB_BUFFER_POOL_STATS
|
||||||
|
INNODB_CHANGED_PAGES
|
||||||
INNODB_CMP
|
INNODB_CMP
|
||||||
INNODB_CMPMEM
|
INNODB_CMPMEM
|
||||||
INNODB_CMPMEM_RESET
|
INNODB_CMPMEM_RESET
|
||||||
@ -94,7 +98,6 @@ USER_PRIVILEGES
|
|||||||
USER_STATISTICS
|
USER_STATISTICS
|
||||||
VIEWS
|
VIEWS
|
||||||
XTRADB_ADMIN_COMMAND
|
XTRADB_ADMIN_COMMAND
|
||||||
XTRADB_ENHANCEMENTS
|
|
||||||
columns_priv
|
columns_priv
|
||||||
db
|
db
|
||||||
event
|
event
|
||||||
@ -872,6 +875,8 @@ COLUMNS TABLE_NAME select
|
|||||||
COLUMN_PRIVILEGES TABLE_NAME select
|
COLUMN_PRIVILEGES TABLE_NAME select
|
||||||
FILES TABLE_NAME select
|
FILES TABLE_NAME select
|
||||||
INDEX_STATISTICS TABLE_NAME select
|
INDEX_STATISTICS TABLE_NAME select
|
||||||
|
INNODB_BUFFER_PAGE TABLE_NAME select
|
||||||
|
INNODB_BUFFER_PAGE_LRU TABLE_NAME select
|
||||||
INNODB_INDEX_STATS table_name select
|
INNODB_INDEX_STATS table_name select
|
||||||
INNODB_TABLE_STATS table_name select
|
INNODB_TABLE_STATS table_name select
|
||||||
KEY_COLUMN_USAGE TABLE_NAME select
|
KEY_COLUMN_USAGE TABLE_NAME select
|
||||||
@ -1258,12 +1263,12 @@ DROP PROCEDURE p1;
|
|||||||
DROP USER mysql_bug20230@localhost;
|
DROP USER mysql_bug20230@localhost;
|
||||||
SELECT MAX(table_name) FROM information_schema.tables WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test');
|
SELECT MAX(table_name) FROM information_schema.tables WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test');
|
||||||
MAX(table_name)
|
MAX(table_name)
|
||||||
XTRADB_ENHANCEMENTS
|
XTRADB_ADMIN_COMMAND
|
||||||
SELECT table_name from information_schema.tables
|
SELECT table_name from information_schema.tables
|
||||||
WHERE table_name=(SELECT MAX(table_name)
|
WHERE table_name=(SELECT MAX(table_name)
|
||||||
FROM information_schema.tables WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test'));
|
FROM information_schema.tables WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test'));
|
||||||
table_name
|
table_name
|
||||||
XTRADB_ENHANCEMENTS
|
XTRADB_ADMIN_COMMAND
|
||||||
DROP TABLE IF EXISTS bug23037;
|
DROP TABLE IF EXISTS bug23037;
|
||||||
DROP FUNCTION IF EXISTS get_value;
|
DROP FUNCTION IF EXISTS get_value;
|
||||||
SELECT COLUMN_NAME, MD5(COLUMN_DEFAULT), LENGTH(COLUMN_DEFAULT) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='bug23037';
|
SELECT COLUMN_NAME, MD5(COLUMN_DEFAULT), LENGTH(COLUMN_DEFAULT) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='bug23037';
|
||||||
|
@ -38,13 +38,13 @@ INNODB_BUFFER_POOL_PAGES
|
|||||||
PBXT_STATISTICS
|
PBXT_STATISTICS
|
||||||
INNODB_CMP
|
INNODB_CMP
|
||||||
INNODB_RSEG
|
INNODB_RSEG
|
||||||
XTRADB_ENHANCEMENTS
|
INNODB_INDEX_STATS
|
||||||
INNODB_BUFFER_POOL_PAGES_INDEX
|
INNODB_BUFFER_POOL_PAGES_INDEX
|
||||||
XTRADB_ADMIN_COMMAND
|
XTRADB_ADMIN_COMMAND
|
||||||
INNODB_TRX
|
INNODB_TRX
|
||||||
INNODB_SYS_TABLES
|
INNODB_SYS_TABLES
|
||||||
INNODB_LOCK_WAITS
|
INNODB_LOCK_WAITS
|
||||||
INNODB_SYS_STATS
|
INNODB_BUFFER_POOL_STATS
|
||||||
INNODB_LOCKS
|
INNODB_LOCKS
|
||||||
INNODB_CMPMEM
|
INNODB_CMPMEM
|
||||||
INNODB_TABLE_STATS
|
INNODB_TABLE_STATS
|
||||||
@ -52,7 +52,10 @@ INNODB_SYS_INDEXES
|
|||||||
INNODB_CMP_RESET
|
INNODB_CMP_RESET
|
||||||
INNODB_BUFFER_POOL_PAGES_BLOB
|
INNODB_BUFFER_POOL_PAGES_BLOB
|
||||||
INNODB_CMPMEM_RESET
|
INNODB_CMPMEM_RESET
|
||||||
INNODB_INDEX_STATS
|
INNODB_BUFFER_PAGE
|
||||||
|
INNODB_CHANGED_PAGES
|
||||||
|
INNODB_SYS_STATS
|
||||||
|
INNODB_BUFFER_PAGE_LRU
|
||||||
SELECT t.table_name, c1.column_name
|
SELECT t.table_name, c1.column_name
|
||||||
FROM information_schema.tables t
|
FROM information_schema.tables t
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
@ -105,13 +108,13 @@ INNODB_BUFFER_POOL_PAGES page_type
|
|||||||
PBXT_STATISTICS ID
|
PBXT_STATISTICS ID
|
||||||
INNODB_CMP page_size
|
INNODB_CMP page_size
|
||||||
INNODB_RSEG rseg_id
|
INNODB_RSEG rseg_id
|
||||||
XTRADB_ENHANCEMENTS name
|
INNODB_INDEX_STATS table_schema
|
||||||
INNODB_BUFFER_POOL_PAGES_INDEX index_id
|
INNODB_BUFFER_POOL_PAGES_INDEX index_id
|
||||||
XTRADB_ADMIN_COMMAND result_message
|
XTRADB_ADMIN_COMMAND result_message
|
||||||
INNODB_TRX trx_id
|
INNODB_TRX trx_id
|
||||||
INNODB_SYS_TABLES SCHEMA
|
INNODB_SYS_TABLES SCHEMA
|
||||||
INNODB_LOCK_WAITS requesting_trx_id
|
INNODB_LOCK_WAITS requesting_trx_id
|
||||||
INNODB_SYS_STATS INDEX_ID
|
INNODB_BUFFER_POOL_STATS POOL_SIZE
|
||||||
INNODB_LOCKS lock_id
|
INNODB_LOCKS lock_id
|
||||||
INNODB_CMPMEM page_size
|
INNODB_CMPMEM page_size
|
||||||
INNODB_TABLE_STATS table_schema
|
INNODB_TABLE_STATS table_schema
|
||||||
@ -119,7 +122,10 @@ INNODB_SYS_INDEXES TABLE_ID
|
|||||||
INNODB_CMP_RESET page_size
|
INNODB_CMP_RESET page_size
|
||||||
INNODB_BUFFER_POOL_PAGES_BLOB space_id
|
INNODB_BUFFER_POOL_PAGES_BLOB space_id
|
||||||
INNODB_CMPMEM_RESET page_size
|
INNODB_CMPMEM_RESET page_size
|
||||||
INNODB_INDEX_STATS table_schema
|
INNODB_BUFFER_PAGE BLOCK_ID
|
||||||
|
INNODB_CHANGED_PAGES space_id
|
||||||
|
INNODB_SYS_STATS INDEX_ID
|
||||||
|
INNODB_BUFFER_PAGE_LRU LRU_POSITION
|
||||||
SELECT t.table_name, c1.column_name
|
SELECT t.table_name, c1.column_name
|
||||||
FROM information_schema.tables t
|
FROM information_schema.tables t
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
@ -172,13 +178,13 @@ INNODB_BUFFER_POOL_PAGES page_type
|
|||||||
PBXT_STATISTICS ID
|
PBXT_STATISTICS ID
|
||||||
INNODB_CMP page_size
|
INNODB_CMP page_size
|
||||||
INNODB_RSEG rseg_id
|
INNODB_RSEG rseg_id
|
||||||
XTRADB_ENHANCEMENTS name
|
INNODB_INDEX_STATS table_schema
|
||||||
INNODB_BUFFER_POOL_PAGES_INDEX index_id
|
INNODB_BUFFER_POOL_PAGES_INDEX index_id
|
||||||
XTRADB_ADMIN_COMMAND result_message
|
XTRADB_ADMIN_COMMAND result_message
|
||||||
INNODB_TRX trx_id
|
INNODB_TRX trx_id
|
||||||
INNODB_SYS_TABLES SCHEMA
|
INNODB_SYS_TABLES SCHEMA
|
||||||
INNODB_LOCK_WAITS requesting_trx_id
|
INNODB_LOCK_WAITS requesting_trx_id
|
||||||
INNODB_SYS_STATS INDEX_ID
|
INNODB_BUFFER_POOL_STATS POOL_SIZE
|
||||||
INNODB_LOCKS lock_id
|
INNODB_LOCKS lock_id
|
||||||
INNODB_CMPMEM page_size
|
INNODB_CMPMEM page_size
|
||||||
INNODB_TABLE_STATS table_schema
|
INNODB_TABLE_STATS table_schema
|
||||||
@ -186,7 +192,10 @@ INNODB_SYS_INDEXES TABLE_ID
|
|||||||
INNODB_CMP_RESET page_size
|
INNODB_CMP_RESET page_size
|
||||||
INNODB_BUFFER_POOL_PAGES_BLOB space_id
|
INNODB_BUFFER_POOL_PAGES_BLOB space_id
|
||||||
INNODB_CMPMEM_RESET page_size
|
INNODB_CMPMEM_RESET page_size
|
||||||
INNODB_INDEX_STATS table_schema
|
INNODB_BUFFER_PAGE BLOCK_ID
|
||||||
|
INNODB_CHANGED_PAGES space_id
|
||||||
|
INNODB_SYS_STATS INDEX_ID
|
||||||
|
INNODB_BUFFER_PAGE_LRU LRU_POSITION
|
||||||
select 1 as f1 from information_schema.tables where "CHARACTER_SETS"=
|
select 1 as f1 from information_schema.tables where "CHARACTER_SETS"=
|
||||||
(select cast(table_name as char) from information_schema.tables
|
(select cast(table_name as char) from information_schema.tables
|
||||||
order by table_name limit 1) limit 1;
|
order by table_name limit 1) limit 1;
|
||||||
@ -220,9 +229,13 @@ FILES information_schema.FILES 1
|
|||||||
GLOBAL_STATUS information_schema.GLOBAL_STATUS 1
|
GLOBAL_STATUS information_schema.GLOBAL_STATUS 1
|
||||||
GLOBAL_VARIABLES information_schema.GLOBAL_VARIABLES 1
|
GLOBAL_VARIABLES information_schema.GLOBAL_VARIABLES 1
|
||||||
INDEX_STATISTICS information_schema.INDEX_STATISTICS 1
|
INDEX_STATISTICS information_schema.INDEX_STATISTICS 1
|
||||||
|
INNODB_BUFFER_PAGE information_schema.INNODB_BUFFER_PAGE 1
|
||||||
|
INNODB_BUFFER_PAGE_LRU information_schema.INNODB_BUFFER_PAGE_LRU 1
|
||||||
INNODB_BUFFER_POOL_PAGES information_schema.INNODB_BUFFER_POOL_PAGES 1
|
INNODB_BUFFER_POOL_PAGES information_schema.INNODB_BUFFER_POOL_PAGES 1
|
||||||
INNODB_BUFFER_POOL_PAGES_BLOB information_schema.INNODB_BUFFER_POOL_PAGES_BLOB 1
|
INNODB_BUFFER_POOL_PAGES_BLOB information_schema.INNODB_BUFFER_POOL_PAGES_BLOB 1
|
||||||
INNODB_BUFFER_POOL_PAGES_INDEX information_schema.INNODB_BUFFER_POOL_PAGES_INDEX 1
|
INNODB_BUFFER_POOL_PAGES_INDEX information_schema.INNODB_BUFFER_POOL_PAGES_INDEX 1
|
||||||
|
INNODB_BUFFER_POOL_STATS information_schema.INNODB_BUFFER_POOL_STATS 1
|
||||||
|
INNODB_CHANGED_PAGES information_schema.INNODB_CHANGED_PAGES 1
|
||||||
INNODB_CMP information_schema.INNODB_CMP 1
|
INNODB_CMP information_schema.INNODB_CMP 1
|
||||||
INNODB_CMPMEM information_schema.INNODB_CMPMEM 1
|
INNODB_CMPMEM information_schema.INNODB_CMPMEM 1
|
||||||
INNODB_CMPMEM_RESET information_schema.INNODB_CMPMEM_RESET 1
|
INNODB_CMPMEM_RESET information_schema.INNODB_CMPMEM_RESET 1
|
||||||
@ -258,7 +271,6 @@ TRIGGERS information_schema.TRIGGERS 1
|
|||||||
USER_PRIVILEGES information_schema.USER_PRIVILEGES 1
|
USER_PRIVILEGES information_schema.USER_PRIVILEGES 1
|
||||||
USER_STATISTICS information_schema.USER_STATISTICS 1
|
USER_STATISTICS information_schema.USER_STATISTICS 1
|
||||||
VIEWS information_schema.VIEWS 1
|
VIEWS information_schema.VIEWS 1
|
||||||
XTRADB_ENHANCEMENTS information_schema.XTRADB_ENHANCEMENTS 1
|
|
||||||
Database: information_schema
|
Database: information_schema
|
||||||
+---------------------------------------+
|
+---------------------------------------+
|
||||||
| Tables |
|
| Tables |
|
||||||
@ -300,13 +312,13 @@ Database: information_schema
|
|||||||
| PBXT_STATISTICS |
|
| PBXT_STATISTICS |
|
||||||
| INNODB_CMP |
|
| INNODB_CMP |
|
||||||
| INNODB_RSEG |
|
| INNODB_RSEG |
|
||||||
| XTRADB_ENHANCEMENTS |
|
| INNODB_INDEX_STATS |
|
||||||
| INNODB_BUFFER_POOL_PAGES_INDEX |
|
| INNODB_BUFFER_POOL_PAGES_INDEX |
|
||||||
| XTRADB_ADMIN_COMMAND |
|
| XTRADB_ADMIN_COMMAND |
|
||||||
| INNODB_TRX |
|
| INNODB_TRX |
|
||||||
| INNODB_SYS_TABLES |
|
| INNODB_SYS_TABLES |
|
||||||
| INNODB_LOCK_WAITS |
|
| INNODB_LOCK_WAITS |
|
||||||
| INNODB_SYS_STATS |
|
| INNODB_BUFFER_POOL_STATS |
|
||||||
| INNODB_LOCKS |
|
| INNODB_LOCKS |
|
||||||
| INNODB_CMPMEM |
|
| INNODB_CMPMEM |
|
||||||
| INNODB_TABLE_STATS |
|
| INNODB_TABLE_STATS |
|
||||||
@ -314,7 +326,10 @@ Database: information_schema
|
|||||||
| INNODB_CMP_RESET |
|
| INNODB_CMP_RESET |
|
||||||
| INNODB_BUFFER_POOL_PAGES_BLOB |
|
| INNODB_BUFFER_POOL_PAGES_BLOB |
|
||||||
| INNODB_CMPMEM_RESET |
|
| INNODB_CMPMEM_RESET |
|
||||||
| INNODB_INDEX_STATS |
|
| INNODB_BUFFER_PAGE |
|
||||||
|
| INNODB_CHANGED_PAGES |
|
||||||
|
| INNODB_SYS_STATS |
|
||||||
|
| INNODB_BUFFER_PAGE_LRU |
|
||||||
+---------------------------------------+
|
+---------------------------------------+
|
||||||
Database: INFORMATION_SCHEMA
|
Database: INFORMATION_SCHEMA
|
||||||
+---------------------------------------+
|
+---------------------------------------+
|
||||||
@ -357,13 +372,13 @@ Database: INFORMATION_SCHEMA
|
|||||||
| PBXT_STATISTICS |
|
| PBXT_STATISTICS |
|
||||||
| INNODB_CMP |
|
| INNODB_CMP |
|
||||||
| INNODB_RSEG |
|
| INNODB_RSEG |
|
||||||
| XTRADB_ENHANCEMENTS |
|
| INNODB_INDEX_STATS |
|
||||||
| INNODB_BUFFER_POOL_PAGES_INDEX |
|
| INNODB_BUFFER_POOL_PAGES_INDEX |
|
||||||
| XTRADB_ADMIN_COMMAND |
|
| XTRADB_ADMIN_COMMAND |
|
||||||
| INNODB_TRX |
|
| INNODB_TRX |
|
||||||
| INNODB_SYS_TABLES |
|
| INNODB_SYS_TABLES |
|
||||||
| INNODB_LOCK_WAITS |
|
| INNODB_LOCK_WAITS |
|
||||||
| INNODB_SYS_STATS |
|
| INNODB_BUFFER_POOL_STATS |
|
||||||
| INNODB_LOCKS |
|
| INNODB_LOCKS |
|
||||||
| INNODB_CMPMEM |
|
| INNODB_CMPMEM |
|
||||||
| INNODB_TABLE_STATS |
|
| INNODB_TABLE_STATS |
|
||||||
@ -371,7 +386,10 @@ Database: INFORMATION_SCHEMA
|
|||||||
| INNODB_CMP_RESET |
|
| INNODB_CMP_RESET |
|
||||||
| INNODB_BUFFER_POOL_PAGES_BLOB |
|
| INNODB_BUFFER_POOL_PAGES_BLOB |
|
||||||
| INNODB_CMPMEM_RESET |
|
| INNODB_CMPMEM_RESET |
|
||||||
| INNODB_INDEX_STATS |
|
| INNODB_BUFFER_PAGE |
|
||||||
|
| INNODB_CHANGED_PAGES |
|
||||||
|
| INNODB_SYS_STATS |
|
||||||
|
| INNODB_BUFFER_PAGE_LRU |
|
||||||
+---------------------------------------+
|
+---------------------------------------+
|
||||||
Wildcard: inf_rmation_schema
|
Wildcard: inf_rmation_schema
|
||||||
+--------------------+
|
+--------------------+
|
||||||
@ -381,5 +399,5 @@ Wildcard: inf_rmation_schema
|
|||||||
+--------------------+
|
+--------------------+
|
||||||
SELECT table_schema, count(*) FROM information_schema.TABLES WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test', 'mysqltest') AND table_name<>'ndb_binlog_index' AND table_name<>'ndb_apply_status' GROUP BY TABLE_SCHEMA;
|
SELECT table_schema, count(*) FROM information_schema.TABLES WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test', 'mysqltest') AND table_name<>'ndb_binlog_index' AND table_name<>'ndb_apply_status' GROUP BY TABLE_SCHEMA;
|
||||||
table_schema count(*)
|
table_schema count(*)
|
||||||
information_schema 52
|
information_schema 50
|
||||||
mysql 22
|
mysql 22
|
||||||
|
@ -3198,7 +3198,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'
|
||||||
|
@ -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 ''
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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'
|
||||||
|
@ -1096,7 +1096,7 @@ PRIMARY KEY (b(10), a), INDEX (c(10))
|
|||||||
INSERT INTO bug12547647 VALUES (5,repeat('khdfo5AlOq',1900),repeat('g',7731));
|
INSERT INTO bug12547647 VALUES (5,repeat('khdfo5AlOq',1900),repeat('g',7731));
|
||||||
COMMIT;
|
COMMIT;
|
||||||
UPDATE bug12547647 SET c = REPEAT('b',16928);
|
UPDATE bug12547647 SET c = REPEAT('b',16928);
|
||||||
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
|
ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
|
||||||
DROP TABLE bug12547647;
|
DROP TABLE bug12547647;
|
||||||
SET @r=REPEAT('a',500);
|
SET @r=REPEAT('a',500);
|
||||||
CREATE TABLE t1(a INT,
|
CREATE TABLE t1(a INT,
|
||||||
|
@ -125,12 +125,12 @@ CREATE TABLE t1(
|
|||||||
c TEXT NOT NULL, d TEXT NOT NULL,
|
c TEXT NOT NULL, d TEXT NOT NULL,
|
||||||
PRIMARY KEY (c(767),d(767)))
|
PRIMARY KEY (c(767),d(767)))
|
||||||
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
|
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
|
||||||
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
|
ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
|
||||||
CREATE TABLE t1(
|
CREATE TABLE t1(
|
||||||
c TEXT NOT NULL, d TEXT NOT NULL,
|
c TEXT NOT NULL, d TEXT NOT NULL,
|
||||||
PRIMARY KEY (c(767),d(767)))
|
PRIMARY KEY (c(767),d(767)))
|
||||||
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 CHARSET=ASCII;
|
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=2 CHARSET=ASCII;
|
||||||
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
|
ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
|
||||||
CREATE TABLE t1(
|
CREATE TABLE t1(
|
||||||
c TEXT NOT NULL, d TEXT NOT NULL,
|
c TEXT NOT NULL, d TEXT NOT NULL,
|
||||||
PRIMARY KEY (c(767),d(767)))
|
PRIMARY KEY (c(767),d(767)))
|
||||||
@ -138,7 +138,7 @@ ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4 CHARSET=ASCII;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE t1(c TEXT, PRIMARY KEY (c(440)))
|
CREATE TABLE t1(c TEXT, PRIMARY KEY (c(440)))
|
||||||
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
|
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
|
||||||
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
|
ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
|
||||||
CREATE TABLE t1(c TEXT, PRIMARY KEY (c(438)))
|
CREATE TABLE t1(c TEXT, PRIMARY KEY (c(438)))
|
||||||
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
|
ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1 CHARSET=ASCII;
|
||||||
INSERT INTO t1 VALUES(REPEAT('A',512)),(REPEAT('B',512));
|
INSERT INTO t1 VALUES(REPEAT('A',512)),(REPEAT('B',512));
|
||||||
|
@ -3151,7 +3151,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'
|
||||||
|
@ -8,7 +8,7 @@ ERROR HY000: Too big row
|
|||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Error 139 Too big row
|
Error 139 Too big row
|
||||||
Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
|
Error 1118 Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
|
||||||
DROP TABLE bug53591;
|
DROP TABLE bug53591;
|
||||||
SET GLOBAL innodb_file_format=Antelope;
|
SET GLOBAL innodb_file_format=Antelope;
|
||||||
SET GLOBAL innodb_file_per_table=0;
|
SET GLOBAL innodb_file_per_table=0;
|
||||||
|
@ -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
|
@ -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.
|
||||||
SET innodb_strict_mode=OFF;
|
SET innodb_strict_mode=OFF;
|
||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
Warnings:
|
Warnings:
|
||||||
|
@ -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;
|
||||||
|
|
@ -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
|
||||||
|
@ -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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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(¶m,(uchar*) sort_keys,buffpek,&maxbuffer,
|
if (merge_many_buff(¶m,(uchar*) sort_keys,buffpek,&maxbuffer,
|
||||||
&tempfile))
|
&tempfile))
|
||||||
|
@ -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 "
|
||||||
|
@ -325,9 +325,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();
|
||||||
|
|
||||||
@ -2664,7 +2662,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);
|
||||||
@ -2681,33 +2678,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
|||||||
name_buffer_ptr= m_name_buffer_ptr;
|
name_buffer_ptr= m_name_buffer_ptr;
|
||||||
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->stored_rec_length;
|
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))
|
||||||
@ -2727,7 +2698,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*);
|
||||||
@ -2805,12 +2776,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
|
||||||
@ -2933,7 +2898,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));
|
||||||
@ -4153,6 +4118,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
|
||||||
|
|
||||||
@ -4194,6 +4231,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
|
||||||
@ -4268,11 +4309,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4985,6 +5026,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;
|
||||||
@ -4995,7 +5037,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];
|
||||||
|
|
||||||
@ -5036,12 +5078,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)
|
||||||
{
|
{
|
||||||
@ -5104,18 +5147,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->ha_index_next(rec_buf(part_id));
|
error= file->ha_index_next(rec_buf);
|
||||||
else
|
else
|
||||||
error= file->ha_index_next_same(rec_buf(part_id), m_start_key.key,
|
error= file->ha_index_next_same(rec_buf, m_start_key.key,
|
||||||
m_start_key.length);
|
m_start_key.length);
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
@ -5158,10 +5202,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->ha_index_prev(rec_buf(part_id))))
|
if ((error= file->ha_index_prev(rec_buf)))
|
||||||
{
|
{
|
||||||
if (error == HA_ERR_END_OF_FILE)
|
if (error == HA_ERR_END_OF_FILE)
|
||||||
{
|
{
|
||||||
|
@ -516,21 +516,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);
|
||||||
|
@ -4521,7 +4521,20 @@ int handler::read_range_first(const key_range *start_key,
|
|||||||
DBUG_RETURN((result == HA_ERR_KEY_NOT_FOUND)
|
DBUG_RETURN((result == HA_ERR_KEY_NOT_FOUND)
|
||||||
? 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4553,7 +4566,20 @@ int handler::read_range_next()
|
|||||||
result= ha_index_next(table->record[0]);
|
result= ha_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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -1171,7 +1171,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)
|
||||||
{
|
{
|
||||||
|
@ -2502,7 +2502,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; }
|
||||||
|
@ -270,6 +270,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
|
||||||
@ -8084,14 +8086,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.");
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -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 */
|
||||||
@ -1468,12 +1464,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) &&
|
||||||
|
@ -3585,8 +3585,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
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2008-2011 Monty Program Ab
|
Copyright (c) 2008-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
|
||||||
@ -251,8 +251,12 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
return realloc_with_extra(arg_length);
|
return realloc_with_extra(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 (ALIGN_SIZE(arg_length+1) < Alloced_length)
|
if (ALIGN_SIZE(arg_length+1) < Alloced_length)
|
||||||
{
|
{
|
||||||
char *new_ptr;
|
char *new_ptr;
|
||||||
@ -268,7 +272,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)
|
||||||
|
@ -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;
|
||||||
|
@ -312,10 +312,10 @@ 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 (!cmp_dtuple_rec(
|
if (btr_pcur_is_on_user_rec(cursor, mtr)
|
||||||
|
&& !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,
|
||||||
@ -338,20 +338,15 @@ btr_pcur_restore_position(
|
|||||||
|
|
||||||
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
|
#ifdef UNIV_DEBUG
|
||||||
|
/* fall through */
|
||||||
|
case BTR_PCUR_BEFORE:
|
||||||
|
case BTR_PCUR_AFTER:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ut_error;
|
ut_error;
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
|
@ -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()));
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
| BTR_NO_UNDO_LOG_FLAG, &cursor, tuple, &rec,
|
||||||
&dummy_big_rec, 0, NULL, mtr);
|
&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);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -336,10 +336,10 @@ 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 (!cmp_dtuple_rec(
|
if (btr_pcur_is_on_user_rec(cursor)
|
||||||
|
&& !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,
|
||||||
@ -361,20 +361,15 @@ btr_pcur_restore_position_func(
|
|||||||
|
|
||||||
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
|
#ifdef UNIV_DEBUG
|
||||||
|
/* fall through */
|
||||||
|
case BTR_PCUR_BEFORE:
|
||||||
|
case BTR_PCUR_AFTER:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ut_error;
|
ut_error;
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
@ -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 */
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
@ -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 @{ */
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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++) {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
@ -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';
|
||||||
|
@ -623,7 +623,7 @@ sub ok
|
|||||||
print " ]" if ($verbose);
|
print " ]" if ($verbose);
|
||||||
print " $test_counter - $com" unless $verbose;
|
print " $test_counter - $com" unless $verbose;
|
||||||
print "\n";
|
print "\n";
|
||||||
if ($verbose && defined($output) && length($output))
|
if (defined($output) && length($output))
|
||||||
{
|
{
|
||||||
print "$output\n";
|
print "$output\n";
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ SET(XTRADB_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c
|
|||||||
ibuf/ibuf0ibuf.c
|
ibuf/ibuf0ibuf.c
|
||||||
pars/lexyy.c pars/pars0grm.c pars/pars0opt.c pars/pars0pars.c pars/pars0sym.c
|
pars/lexyy.c pars/pars0grm.c pars/pars0opt.c pars/pars0pars.c pars/pars0sym.c
|
||||||
lock/lock0lock.c lock/lock0iter.c
|
lock/lock0lock.c lock/lock0iter.c
|
||||||
log/log0log.c log/log0recv.c
|
log/log0log.c log/log0recv.c log/log0online.c
|
||||||
mach/mach0data.c
|
mach/mach0data.c
|
||||||
mem/mem0mem.c mem/mem0pool.c
|
mem/mem0mem.c mem/mem0pool.c
|
||||||
mtr/mtr0log.c mtr/mtr0mtr.c
|
mtr/mtr0log.c mtr/mtr0mtr.c
|
||||||
|
@ -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,
|
||||||
|
@ -101,6 +101,7 @@ noinst_HEADERS= \
|
|||||||
include/lock0types.h \
|
include/lock0types.h \
|
||||||
include/log0log.h \
|
include/log0log.h \
|
||||||
include/log0log.ic \
|
include/log0log.ic \
|
||||||
|
include/log0online.h \
|
||||||
include/log0recv.h \
|
include/log0recv.h \
|
||||||
include/log0recv.ic \
|
include/log0recv.ic \
|
||||||
include/mach0data.h \
|
include/mach0data.h \
|
||||||
@ -226,7 +227,6 @@ noinst_HEADERS= \
|
|||||||
include/ut0vec.h \
|
include/ut0vec.h \
|
||||||
include/ut0vec.ic \
|
include/ut0vec.ic \
|
||||||
include/ut0wqueue.h \
|
include/ut0wqueue.h \
|
||||||
handler/innodb_patch_info.h \
|
|
||||||
mem/mem0dbg.c
|
mem/mem0dbg.c
|
||||||
|
|
||||||
noinst_LTLIBRARIES= @plugin_xtradb_static_target@
|
noinst_LTLIBRARIES= @plugin_xtradb_static_target@
|
||||||
@ -265,6 +265,7 @@ libxtradb_la_SOURCES= \
|
|||||||
lock/lock0iter.c \
|
lock/lock0iter.c \
|
||||||
lock/lock0lock.c \
|
lock/lock0lock.c \
|
||||||
log/log0log.c \
|
log/log0log.c \
|
||||||
|
log/log0online.c \
|
||||||
log/log0recv.c \
|
log/log0recv.c \
|
||||||
mach/mach0data.c \
|
mach/mach0data.c \
|
||||||
mem/mem0mem.c \
|
mem/mem0mem.c \
|
||||||
|
@ -664,6 +664,12 @@ btr_root_fseg_validate(
|
|||||||
{
|
{
|
||||||
ulint offset = mach_read_from_2(seg_header + FSEG_HDR_OFFSET);
|
ulint offset = mach_read_from_2(seg_header + FSEG_HDR_OFFSET);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(srv_pass_corrupt_table)) {
|
||||||
|
return (mach_read_from_4(seg_header + FSEG_HDR_SPACE) == space)
|
||||||
|
&& (offset >= FIL_PAGE_DATA)
|
||||||
|
&& (offset <= UNIV_PAGE_SIZE - FIL_PAGE_DATA_END);
|
||||||
|
}
|
||||||
|
|
||||||
ut_a(mach_read_from_4(seg_header + FSEG_HDR_SPACE) == space);
|
ut_a(mach_read_from_4(seg_header + FSEG_HDR_SPACE) == space);
|
||||||
ut_a(offset >= FIL_PAGE_DATA);
|
ut_a(offset >= FIL_PAGE_DATA);
|
||||||
ut_a(offset <= UNIV_PAGE_SIZE - FIL_PAGE_DATA_END);
|
ut_a(offset <= UNIV_PAGE_SIZE - FIL_PAGE_DATA_END);
|
||||||
@ -704,6 +710,17 @@ btr_root_block_get(
|
|||||||
if (!dict_index_is_ibuf(index)) {
|
if (!dict_index_is_ibuf(index)) {
|
||||||
const page_t* root = buf_block_get_frame(block);
|
const page_t* root = buf_block_get_frame(block);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(srv_pass_corrupt_table)) {
|
||||||
|
if (!btr_root_fseg_validate(FIL_PAGE_DATA
|
||||||
|
+ PAGE_BTR_SEG_LEAF
|
||||||
|
+ root, space))
|
||||||
|
return(NULL);
|
||||||
|
if (!btr_root_fseg_validate(FIL_PAGE_DATA
|
||||||
|
+ PAGE_BTR_SEG_TOP
|
||||||
|
+ root, space))
|
||||||
|
return(NULL);
|
||||||
|
return(block);
|
||||||
|
}
|
||||||
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF
|
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF
|
||||||
+ root, space));
|
+ root, space));
|
||||||
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP
|
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP
|
||||||
@ -1852,6 +1869,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 */
|
||||||
@ -2332,12 +2350,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
|
||||||
|
| BTR_NO_UNDO_LOG_FLAG, &cursor, tuple, &rec,
|
||||||
&dummy_big_rec, 0, NULL, mtr);
|
&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);
|
ut_a(err == DB_SUCCESS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************//**
|
/**************************************************************//**
|
||||||
@ -3262,6 +3288,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
|
||||||
@ -3497,6 +3524,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),
|
||||||
@ -4009,8 +4037,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 (;;) {
|
||||||
@ -4024,6 +4066,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4435,6 +4487,12 @@ btr_validate_index(
|
|||||||
mtr_x_lock(dict_index_get_lock(index), &mtr);
|
mtr_x_lock(dict_index_get_lock(index), &mtr);
|
||||||
|
|
||||||
root = btr_root_get(index, &mtr);
|
root = btr_root_get(index, &mtr);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(srv_pass_corrupt_table && !root)) {
|
||||||
|
mtr_commit(&mtr);
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
n = btr_page_get_level(root, &mtr);
|
n = btr_page_get_level(root, &mtr);
|
||||||
|
|
||||||
for (i = 0; i <= n && !trx_is_interrupted(trx); i++) {
|
for (i = 0; i <= n && !trx_is_interrupted(trx); i++) {
|
||||||
|
@ -1307,7 +1307,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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1443,20 +1448,9 @@ btr_cur_pessimistic_insert(
|
|||||||
ut_ad((thr && thr_get_trx(thr)->fake_changes) || mtr_memo_contains(mtr, btr_cur_get_block(cursor),
|
ut_ad((thr && thr_get_trx(thr)->fake_changes) || 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);
|
||||||
@ -2083,8 +2077,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))
|
||||||
@ -2452,7 +2450,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)
|
||||||
@ -2480,8 +2483,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
|
||||||
@ -3483,6 +3488,8 @@ btr_estimate_n_rows_in_range(
|
|||||||
n_rows = n_rows * 2;
|
n_rows = n_rows * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("bug14007649", return(n_rows););
|
||||||
|
|
||||||
/* Do not estimate the number of rows in the range
|
/* Do not estimate the number of rows in the range
|
||||||
to over 1 / 2 of the estimated rows in the whole
|
to over 1 / 2 of the estimated rows in the whole
|
||||||
table */
|
table */
|
||||||
@ -3582,9 +3589,9 @@ btr_record_not_null_field_in_rec(
|
|||||||
|
|
||||||
for (i = 0; i < n_unique; i++) {
|
for (i = 0; i < n_unique; i++) {
|
||||||
if (rec_offs_nth_sql_null(offsets, i)) {
|
if (rec_offs_nth_sql_null(offsets, i)) {
|
||||||
/* Break if we hit the first NULL value */
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
n_not_null[i]++;
|
n_not_null[i]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,10 +342,10 @@ 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 (!cmp_dtuple_rec(
|
if (btr_pcur_is_on_user_rec(cursor)
|
||||||
|
&& !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,
|
||||||
@ -367,20 +367,15 @@ btr_pcur_restore_position_func(
|
|||||||
|
|
||||||
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
|
#ifdef UNIV_DEBUG
|
||||||
|
/* fall through */
|
||||||
|
case BTR_PCUR_BEFORE:
|
||||||
|
case BTR_PCUR_AFTER:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ut_error;
|
ut_error;
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
|
@ -2123,6 +2123,7 @@ wait_until_unfixed:
|
|||||||
if (mode == BUF_GET_IF_IN_POOL && ibuf_debug) {
|
if (mode == BUF_GET_IF_IN_POOL && ibuf_debug) {
|
||||||
/* Try to evict the block from the buffer pool, to use the
|
/* Try to evict the block from the buffer pool, to use the
|
||||||
insert buffer as much as possible. */
|
insert buffer as much as possible. */
|
||||||
|
ulint page_no = buf_block_get_page_no(block);
|
||||||
|
|
||||||
if (buf_LRU_free_block(&block->page, TRUE, FALSE)) {
|
if (buf_LRU_free_block(&block->page, TRUE, FALSE)) {
|
||||||
//buf_pool_mutex_exit();
|
//buf_pool_mutex_exit();
|
||||||
@ -2131,6 +2132,18 @@ wait_until_unfixed:
|
|||||||
"innodb_change_buffering_debug evict %u %u\n",
|
"innodb_change_buffering_debug evict %u %u\n",
|
||||||
(unsigned) space, (unsigned) offset);
|
(unsigned) space, (unsigned) offset);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
} else if (UNIV_UNLIKELY(buf_block_get_state(block)
|
||||||
|
!= BUF_BLOCK_FILE_PAGE
|
||||||
|
|| (buf_block_get_page_no(block) != page_no)
|
||||||
|
|| (buf_block_get_space(block) != space))) {
|
||||||
|
|
||||||
|
/* buf_LRU_free_block temporarily releases the
|
||||||
|
block mutex, and now block points to something
|
||||||
|
else. */
|
||||||
|
mutex_exit(block_mutex);
|
||||||
|
block = NULL;
|
||||||
|
goto loop2;
|
||||||
|
|
||||||
} else if (buf_flush_page_try(block)) {
|
} else if (buf_flush_page_try(block)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"innodb_change_buffering_debug flush %u %u\n",
|
"innodb_change_buffering_debug flush %u %u\n",
|
||||||
@ -4078,6 +4091,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. */
|
||||||
@ -4108,3 +4248,5 @@ buf_page_init_for_backup_restore(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ Created 11/5/1995 Heikki Tuuri
|
|||||||
#include "page0zip.h"
|
#include "page0zip.h"
|
||||||
#include "log0recv.h"
|
#include "log0recv.h"
|
||||||
#include "srv0srv.h"
|
#include "srv0srv.h"
|
||||||
|
#include "srv0start.h"
|
||||||
|
|
||||||
/** The number of blocks from the LRU_old pointer onward, including
|
/** The number of blocks from the LRU_old pointer onward, including
|
||||||
the block pointed to, must be buf_LRU_old_ratio/BUF_LRU_OLD_RATIO_DIV
|
the block pointed to, must be buf_LRU_old_ratio/BUF_LRU_OLD_RATIO_DIV
|
||||||
@ -1428,13 +1429,12 @@ buf_LRU_make_block_old(
|
|||||||
Try to free a block. If bpage is a descriptor of a compressed-only
|
Try to free a block. If bpage is a descriptor of a compressed-only
|
||||||
page, the descriptor object will be freed as well.
|
page, the descriptor object will be freed as well.
|
||||||
|
|
||||||
NOTE: If this function returns TRUE, it will temporarily
|
NOTE: This will temporarily release buf_pool_mutex. Furthermore, the
|
||||||
release buf_pool_mutex. Furthermore, the page frame will no longer be
|
page frame will no longer be accessible via bpage.
|
||||||
accessible via bpage.
|
|
||||||
|
|
||||||
The caller must hold buf_pool_mutex and buf_page_get_mutex(bpage) and
|
The caller must hold buf_page_get_mutex(bpage) and release this mutex
|
||||||
release these two mutexes after the call. No other
|
after the call. No other buf_page_get_mutex() may be held when
|
||||||
buf_page_get_mutex() may be held when calling this function.
|
calling this function.
|
||||||
@return TRUE if freed, FALSE otherwise. */
|
@return TRUE if freed, FALSE otherwise. */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
ibool
|
ibool
|
||||||
@ -2098,6 +2098,12 @@ func_exit:
|
|||||||
/********************************************************************//**
|
/********************************************************************//**
|
||||||
Dump the LRU page list to the specific file. */
|
Dump the LRU page list to the specific file. */
|
||||||
#define LRU_DUMP_FILE "ib_lru_dump"
|
#define LRU_DUMP_FILE "ib_lru_dump"
|
||||||
|
#define LRU_DUMP_TEMP_FILE "ib_lru_dump.tmp"
|
||||||
|
#define LRU_OS_FILE_WRITE() \
|
||||||
|
os_file_write(LRU_DUMP_FILE, dump_file, buffer, \
|
||||||
|
(buffers << UNIV_PAGE_SIZE_SHIFT) & 0xFFFFFFFFUL, \
|
||||||
|
(buffers >> (32 - UNIV_PAGE_SIZE_SHIFT)), \
|
||||||
|
UNIV_PAGE_SIZE)
|
||||||
|
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
ibool
|
ibool
|
||||||
@ -2109,17 +2115,19 @@ buf_LRU_file_dump(void)
|
|||||||
byte* buffer_base = NULL;
|
byte* buffer_base = NULL;
|
||||||
byte* buffer = NULL;
|
byte* buffer = NULL;
|
||||||
buf_page_t* bpage;
|
buf_page_t* bpage;
|
||||||
|
buf_page_t* first_bpage;
|
||||||
ulint buffers;
|
ulint buffers;
|
||||||
ulint offset;
|
ulint offset;
|
||||||
ibool ret = FALSE;
|
ulint pages_written;
|
||||||
ulint i;
|
ulint i;
|
||||||
|
ulint total_pages;
|
||||||
|
|
||||||
for (i = 0; i < srv_n_data_files; i++) {
|
for (i = 0; i < srv_n_data_files; i++) {
|
||||||
if (strstr(srv_data_file_names[i], LRU_DUMP_FILE) != NULL) {
|
if (strstr(srv_data_file_names[i], LRU_DUMP_FILE) != NULL) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
" InnoDB: The name '%s' seems to be used for"
|
" InnoDB: The name '%s' seems to be used for"
|
||||||
" innodb_data_file_path. Dumping LRU list is not"
|
" innodb_data_file_path. Dumping LRU list is"
|
||||||
" done for safeness.\n", LRU_DUMP_FILE);
|
" not done for safeness.\n", LRU_DUMP_FILE);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2132,7 +2140,7 @@ buf_LRU_file_dump(void)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
dump_file = os_file_create(LRU_DUMP_FILE, OS_FILE_OVERWRITE,
|
dump_file = os_file_create(LRU_DUMP_TEMP_FILE, OS_FILE_OVERWRITE,
|
||||||
OS_FILE_NORMAL, OS_DATA_FILE, &success);
|
OS_FILE_NORMAL, OS_DATA_FILE, &success);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
os_file_get_last_error(TRUE);
|
os_file_get_last_error(TRUE);
|
||||||
@ -2142,12 +2150,21 @@ buf_LRU_file_dump(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mutex_enter(&LRU_list_mutex);
|
mutex_enter(&LRU_list_mutex);
|
||||||
bpage = UT_LIST_GET_LAST(buf_pool->LRU);
|
bpage = first_bpage = UT_LIST_GET_FIRST(buf_pool->LRU);
|
||||||
|
total_pages = UT_LIST_GET_LEN(buf_pool->LRU);
|
||||||
|
|
||||||
buffers = offset = 0;
|
buffers = offset = pages_written = 0;
|
||||||
while (bpage != NULL) {
|
while (bpage != NULL && (pages_written++ < total_pages)) {
|
||||||
if (offset == 0) {
|
|
||||||
memset(buffer, 0, UNIV_PAGE_SIZE);
|
buf_page_t* next_bpage = UT_LIST_GET_NEXT(LRU, bpage);
|
||||||
|
|
||||||
|
if (next_bpage == first_bpage) {
|
||||||
|
mutex_exit(&LRU_list_mutex);
|
||||||
|
success = FALSE;
|
||||||
|
fprintf(stderr,
|
||||||
|
"InnoDB: detected cycle in LRU, skipping "
|
||||||
|
"dump\n");
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
mach_write_to_4(buffer + offset * 4, bpage->space);
|
mach_write_to_4(buffer + offset * 4, bpage->space);
|
||||||
@ -2156,50 +2173,79 @@ buf_LRU_file_dump(void)
|
|||||||
offset++;
|
offset++;
|
||||||
|
|
||||||
if (offset == UNIV_PAGE_SIZE/4) {
|
if (offset == UNIV_PAGE_SIZE/4) {
|
||||||
success = os_file_write(LRU_DUMP_FILE, dump_file, buffer,
|
mutex_t *next_block_mutex = NULL;
|
||||||
(buffers << UNIV_PAGE_SIZE_SHIFT) & 0xFFFFFFFFUL,
|
|
||||||
(buffers >> (32 - UNIV_PAGE_SIZE_SHIFT)),
|
if (srv_shutdown_state != SRV_SHUTDOWN_NONE) {
|
||||||
UNIV_PAGE_SIZE);
|
mutex_exit(&LRU_list_mutex);
|
||||||
|
success = FALSE;
|
||||||
|
fprintf(stderr,
|
||||||
|
" InnoDB: stopped dumping lru pages"
|
||||||
|
" because of server shutdown.\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* while writing file, release buffer pool mutex but
|
||||||
|
keep the next page fixed so we don't worry about
|
||||||
|
our list iterator becoming invalid */
|
||||||
|
if (next_bpage) {
|
||||||
|
next_block_mutex = buf_page_get_mutex(
|
||||||
|
next_bpage);
|
||||||
|
|
||||||
|
mutex_enter(next_block_mutex);
|
||||||
|
next_bpage->buf_fix_count++;
|
||||||
|
mutex_exit(next_block_mutex);
|
||||||
|
}
|
||||||
|
mutex_exit(&LRU_list_mutex);
|
||||||
|
|
||||||
|
success = LRU_OS_FILE_WRITE();
|
||||||
|
|
||||||
|
/* grab this again here so that next_bpage
|
||||||
|
can't be purged when we drop the fix_count */
|
||||||
|
mutex_enter(&LRU_list_mutex);
|
||||||
|
|
||||||
|
if (next_bpage) {
|
||||||
|
mutex_enter(next_block_mutex);
|
||||||
|
next_bpage->buf_fix_count--;
|
||||||
|
mutex_exit(next_block_mutex);
|
||||||
|
}
|
||||||
if (!success) {
|
if (!success) {
|
||||||
mutex_exit(&LRU_list_mutex);
|
mutex_exit(&LRU_list_mutex);
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
" InnoDB: cannot write page %lu of %s\n",
|
" InnoDB: cannot write page"
|
||||||
|
" %lu of %s\n",
|
||||||
buffers, LRU_DUMP_FILE);
|
buffers, LRU_DUMP_FILE);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
buffers++;
|
buffers++;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
bpage = next_bpage;
|
||||||
|
} else {
|
||||||
|
bpage = UT_LIST_GET_NEXT(LRU, bpage);
|
||||||
}
|
}
|
||||||
|
} /* while(bpage ...) */
|
||||||
bpage = UT_LIST_GET_PREV(LRU, bpage);
|
|
||||||
}
|
|
||||||
mutex_exit(&LRU_list_mutex);
|
mutex_exit(&LRU_list_mutex);
|
||||||
|
|
||||||
if (offset == 0) {
|
|
||||||
memset(buffer, 0, UNIV_PAGE_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
mach_write_to_4(buffer + offset * 4, 0xFFFFFFFFUL);
|
mach_write_to_4(buffer + offset * 4, 0xFFFFFFFFUL);
|
||||||
offset++;
|
offset++;
|
||||||
mach_write_to_4(buffer + offset * 4, 0xFFFFFFFFUL);
|
mach_write_to_4(buffer + offset * 4, 0xFFFFFFFFUL);
|
||||||
offset++;
|
offset++;
|
||||||
|
|
||||||
success = os_file_write(LRU_DUMP_FILE, dump_file, buffer,
|
success = LRU_OS_FILE_WRITE();
|
||||||
(buffers << UNIV_PAGE_SIZE_SHIFT) & 0xFFFFFFFFUL,
|
|
||||||
(buffers >> (32 - UNIV_PAGE_SIZE_SHIFT)),
|
|
||||||
UNIV_PAGE_SIZE);
|
|
||||||
if (!success) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
end:
|
end:
|
||||||
if (dump_file != (os_file_t) -1)
|
if (dump_file != (os_file_t) -1) {
|
||||||
|
if (success) {
|
||||||
|
success = os_file_flush(dump_file, TRUE);
|
||||||
|
}
|
||||||
os_file_close(dump_file);
|
os_file_close(dump_file);
|
||||||
|
}
|
||||||
|
if (success) {
|
||||||
|
success = os_file_rename(LRU_DUMP_TEMP_FILE,
|
||||||
|
LRU_DUMP_FILE);
|
||||||
|
}
|
||||||
if (buffer_base)
|
if (buffer_base)
|
||||||
ut_free(buffer_base);
|
ut_free(buffer_base);
|
||||||
|
|
||||||
return(ret);
|
return(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -2241,6 +2287,7 @@ buf_LRU_file_restore(void)
|
|||||||
dump_record_t* records = NULL;
|
dump_record_t* records = NULL;
|
||||||
ulint size;
|
ulint size;
|
||||||
ulint size_high;
|
ulint size_high;
|
||||||
|
ulint recsize = sizeof(dump_record_t);
|
||||||
ulint length;
|
ulint length;
|
||||||
|
|
||||||
dump_file = os_file_create_simple_no_error_handling(
|
dump_file = os_file_create_simple_no_error_handling(
|
||||||
@ -2248,7 +2295,15 @@ buf_LRU_file_restore(void)
|
|||||||
if (!success || !os_file_get_size(dump_file, &size, &size_high)) {
|
if (!success || !os_file_get_size(dump_file, &size, &size_high)) {
|
||||||
os_file_get_last_error(TRUE);
|
os_file_get_last_error(TRUE);
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
" InnoDB: cannot open %s\n", LRU_DUMP_FILE);
|
" InnoDB: cannot open %s,"
|
||||||
|
" buffer pool preload not done\n",
|
||||||
|
LRU_DUMP_FILE);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == 0 || size_high > 0 || size % recsize) {
|
||||||
|
fprintf(stderr, " InnoDB: broken LRU dump file,"
|
||||||
|
" buffer pool preload not done\n");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2332,6 +2387,14 @@ buf_LRU_file_restore(void)
|
|||||||
if (offset % 16 == 15) {
|
if (offset % 16 == 15) {
|
||||||
os_aio_simulated_wake_handler_threads();
|
os_aio_simulated_wake_handler_threads();
|
||||||
buf_flush_free_margin(FALSE);
|
buf_flush_free_margin(FALSE);
|
||||||
|
/* skip loading of the rest of the file if we are
|
||||||
|
terminating anyway*/
|
||||||
|
if (srv_shutdown_state != SRV_SHUTDOWN_NONE) {
|
||||||
|
fprintf(stderr,
|
||||||
|
" InnoDB: stopped loading LRU pages"
|
||||||
|
" because of server shutdown.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zip_size = fil_space_get_zip_size(space_id);
|
zip_size = fil_space_get_zip_size(space_id);
|
||||||
|
@ -236,6 +236,166 @@ dict_hdr_create(
|
|||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************//**
|
||||||
|
Verifies the SYS_STATS table by scanning its clustered index. This
|
||||||
|
function may only be called at InnoDB startup time.
|
||||||
|
|
||||||
|
@return TRUE if SYS_STATS was verified successfully */
|
||||||
|
UNIV_INTERN
|
||||||
|
ibool
|
||||||
|
dict_verify_xtradb_sys_stats(void)
|
||||||
|
/*==============================*/
|
||||||
|
{
|
||||||
|
dict_index_t* sys_stats_index;
|
||||||
|
ulint saved_srv_pass_corrupt_table = srv_pass_corrupt_table;
|
||||||
|
ibool result;
|
||||||
|
|
||||||
|
sys_stats_index = dict_table_get_first_index(dict_sys->sys_stats);
|
||||||
|
|
||||||
|
/* Since this may be called only during server startup, avoid hitting
|
||||||
|
various asserts by using XtraDB pass_corrupt_table option. */
|
||||||
|
srv_pass_corrupt_table = 1;
|
||||||
|
result = btr_validate_index(sys_stats_index, NULL);
|
||||||
|
srv_pass_corrupt_table = saved_srv_pass_corrupt_table;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************//**
|
||||||
|
Creates the B-tree for the SYS_STATS clustered index, adds the XtraDB
|
||||||
|
mark and the id of the index to the dictionary header page. Rewrites
|
||||||
|
both passed args. */
|
||||||
|
static
|
||||||
|
void
|
||||||
|
dict_create_xtradb_sys_stats(
|
||||||
|
/*=========================*/
|
||||||
|
dict_hdr_t** dict_hdr, /*!< in/out: dictionary header */
|
||||||
|
mtr_t* mtr) /*!< in/out: mtr */
|
||||||
|
{
|
||||||
|
ulint root_page_no;
|
||||||
|
|
||||||
|
root_page_no = btr_create(DICT_CLUSTERED | DICT_UNIQUE,
|
||||||
|
DICT_HDR_SPACE, 0, DICT_STATS_ID,
|
||||||
|
dict_ind_redundant, mtr);
|
||||||
|
if (root_page_no == FIL_NULL) {
|
||||||
|
fprintf(stderr, "InnoDB: Warning: failed to create SYS_STATS btr.\n");
|
||||||
|
srv_use_sys_stats_table = FALSE;
|
||||||
|
} else {
|
||||||
|
mlog_write_ulint(*dict_hdr + DICT_HDR_STATS, root_page_no,
|
||||||
|
MLOG_4BYTES, mtr);
|
||||||
|
mlog_write_dulint(*dict_hdr + DICT_HDR_XTRADB_MARK,
|
||||||
|
DICT_HDR_XTRADB_FLAG, mtr);
|
||||||
|
}
|
||||||
|
mtr_commit(mtr);
|
||||||
|
/* restart mtr */
|
||||||
|
mtr_start(mtr);
|
||||||
|
*dict_hdr = dict_hdr_get(mtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************//**
|
||||||
|
Create the table and index structure of SYS_STATS for the dictionary
|
||||||
|
cache and add it there. If called for the first time, also support
|
||||||
|
wrong root page id injection for testing purposes. */
|
||||||
|
static
|
||||||
|
void
|
||||||
|
dict_add_to_cache_xtradb_sys_stats(
|
||||||
|
/*===============================*/
|
||||||
|
ibool first_time __attribute__((unused)),
|
||||||
|
/*!< in: first invocation flag. If
|
||||||
|
TRUE, optionally inject wrong root page
|
||||||
|
id */
|
||||||
|
mem_heap_t* heap, /*!< in: memory heap for table/index
|
||||||
|
allocation */
|
||||||
|
dict_hdr_t* dict_hdr, /*!< in: dictionary header */
|
||||||
|
mtr_t* mtr) /*!< in: mtr */
|
||||||
|
{
|
||||||
|
dict_table_t* table;
|
||||||
|
dict_index_t* index;
|
||||||
|
ulint root_page_id;
|
||||||
|
ulint error;
|
||||||
|
|
||||||
|
table = dict_mem_table_create("SYS_STATS", DICT_HDR_SPACE, 4, 0);
|
||||||
|
table->n_mysql_handles_opened = 1; /* for pin */
|
||||||
|
|
||||||
|
dict_mem_table_add_col(table, heap, "INDEX_ID", DATA_BINARY, 0, 0);
|
||||||
|
dict_mem_table_add_col(table, heap, "KEY_COLS", DATA_INT, 0, 4);
|
||||||
|
dict_mem_table_add_col(table, heap, "DIFF_VALS", DATA_BINARY, 0, 0);
|
||||||
|
dict_mem_table_add_col(table, heap, "NON_NULL_VALS", DATA_BINARY, 0, 0);
|
||||||
|
|
||||||
|
/* The '+ 2' below comes from the fields DB_TRX_ID, DB_ROLL_PTR */
|
||||||
|
#if DICT_SYS_STATS_DIFF_VALS_FIELD != 2 + 2
|
||||||
|
#error "DICT_SYS_STATS_DIFF_VALS_FIELD != 2 + 2"
|
||||||
|
#endif
|
||||||
|
#if DICT_SYS_STATS_NON_NULL_VALS_FIELD != 3 + 2
|
||||||
|
#error "DICT_SYS_STATS_NON_NULL_VALS_FIELD != 3 + 2"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
table->id = DICT_STATS_ID;
|
||||||
|
dict_table_add_to_cache(table, heap);
|
||||||
|
dict_sys->sys_stats = table;
|
||||||
|
mem_heap_empty(heap);
|
||||||
|
|
||||||
|
index = dict_mem_index_create("SYS_STATS", "CLUST_IND",
|
||||||
|
DICT_HDR_SPACE,
|
||||||
|
DICT_UNIQUE | DICT_CLUSTERED, 2);
|
||||||
|
|
||||||
|
dict_mem_index_add_field(index, "INDEX_ID", 0);
|
||||||
|
dict_mem_index_add_field(index, "KEY_COLS", 0);
|
||||||
|
|
||||||
|
index->id = DICT_STATS_ID;
|
||||||
|
|
||||||
|
root_page_id = mtr_read_ulint(dict_hdr + DICT_HDR_STATS, MLOG_4BYTES,
|
||||||
|
mtr);
|
||||||
|
#ifdef UNIV_DEBUG
|
||||||
|
if ((srv_sys_stats_root_page != 0) && first_time)
|
||||||
|
root_page_id = srv_sys_stats_root_page;
|
||||||
|
#endif
|
||||||
|
error = dict_index_add_to_cache(table, index, root_page_id, FALSE);
|
||||||
|
ut_a(error == DB_SUCCESS);
|
||||||
|
|
||||||
|
mem_heap_empty(heap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************//**
|
||||||
|
Discard the existing dictionary cache SYS_STATS information, create and
|
||||||
|
add it there anew. Does not touch the old SYS_STATS tablespace page
|
||||||
|
under the assumption that they are corrupted or overwritten for other
|
||||||
|
purposes. */
|
||||||
|
UNIV_INTERN
|
||||||
|
void
|
||||||
|
dict_recreate_xtradb_sys_stats(void)
|
||||||
|
/*================================*/
|
||||||
|
{
|
||||||
|
mtr_t mtr;
|
||||||
|
dict_hdr_t* dict_hdr;
|
||||||
|
dict_index_t* sys_stats_clust_idx;
|
||||||
|
mem_heap_t* heap;
|
||||||
|
|
||||||
|
heap = mem_heap_create(450);
|
||||||
|
|
||||||
|
mutex_enter(&(dict_sys->mutex));
|
||||||
|
|
||||||
|
sys_stats_clust_idx = dict_table_get_first_index(dict_sys->sys_stats);
|
||||||
|
dict_index_remove_from_cache(dict_sys->sys_stats, sys_stats_clust_idx);
|
||||||
|
|
||||||
|
dict_table_remove_from_cache(dict_sys->sys_stats);
|
||||||
|
|
||||||
|
dict_sys->sys_stats = NULL;
|
||||||
|
|
||||||
|
mtr_start(&mtr);
|
||||||
|
|
||||||
|
dict_hdr = dict_hdr_get(&mtr);
|
||||||
|
|
||||||
|
dict_create_xtradb_sys_stats(&dict_hdr, &mtr);
|
||||||
|
dict_add_to_cache_xtradb_sys_stats(FALSE, heap, dict_hdr, &mtr);
|
||||||
|
|
||||||
|
mem_heap_free(heap);
|
||||||
|
|
||||||
|
mtr_commit(&mtr);
|
||||||
|
|
||||||
|
mutex_exit(&(dict_sys->mutex));
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************//**
|
/*****************************************************************//**
|
||||||
Initializes the data dictionary memory structures when the database is
|
Initializes the data dictionary memory structures when the database is
|
||||||
started. This function is also called when the data dictionary is created. */
|
started. This function is also called when the data dictionary is created. */
|
||||||
@ -251,39 +411,23 @@ dict_boot(void)
|
|||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
ulint error;
|
ulint error;
|
||||||
|
|
||||||
|
heap = mem_heap_create(450);
|
||||||
|
|
||||||
mtr_start(&mtr);
|
mtr_start(&mtr);
|
||||||
|
|
||||||
/* Create the hash tables etc. */
|
/* Create the hash tables etc. */
|
||||||
dict_init();
|
dict_init();
|
||||||
|
|
||||||
heap = mem_heap_create(450);
|
|
||||||
|
|
||||||
mutex_enter(&(dict_sys->mutex));
|
mutex_enter(&(dict_sys->mutex));
|
||||||
|
|
||||||
/* Get the dictionary header */
|
/* Get the dictionary header */
|
||||||
dict_hdr = dict_hdr_get(&mtr);
|
dict_hdr = dict_hdr_get(&mtr);
|
||||||
|
|
||||||
if (ut_dulint_cmp(mtr_read_dulint(dict_hdr + DICT_HDR_XTRADB_MARK, &mtr),
|
if (ut_dulint_cmp(mtr_read_dulint(dict_hdr + DICT_HDR_XTRADB_MARK,
|
||||||
DICT_HDR_XTRADB_FLAG) != 0) {
|
&mtr), DICT_HDR_XTRADB_FLAG) != 0) {
|
||||||
/* not extended yet by XtraDB, need to be extended */
|
|
||||||
ulint root_page_no;
|
|
||||||
|
|
||||||
root_page_no = btr_create(DICT_CLUSTERED | DICT_UNIQUE,
|
/* not extended yet by XtraDB, need to be extended */
|
||||||
DICT_HDR_SPACE, 0, DICT_STATS_ID,
|
dict_create_xtradb_sys_stats(&dict_hdr, &mtr);
|
||||||
dict_ind_redundant, &mtr);
|
|
||||||
if (root_page_no == FIL_NULL) {
|
|
||||||
fprintf(stderr, "InnoDB: Warning: failed to create SYS_STATS btr.\n");
|
|
||||||
srv_use_sys_stats_table = FALSE;
|
|
||||||
} else {
|
|
||||||
mlog_write_ulint(dict_hdr + DICT_HDR_STATS, root_page_no,
|
|
||||||
MLOG_4BYTES, &mtr);
|
|
||||||
mlog_write_dulint(dict_hdr + DICT_HDR_XTRADB_MARK,
|
|
||||||
DICT_HDR_XTRADB_FLAG, &mtr);
|
|
||||||
}
|
|
||||||
mtr_commit(&mtr);
|
|
||||||
/* restart mtr */
|
|
||||||
mtr_start(&mtr);
|
|
||||||
dict_hdr = dict_hdr_get(&mtr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Because we only write new row ids to disk-based data structure
|
/* Because we only write new row ids to disk-based data structure
|
||||||
@ -464,42 +608,7 @@ dict_boot(void)
|
|||||||
FALSE);
|
FALSE);
|
||||||
ut_a(error == DB_SUCCESS);
|
ut_a(error == DB_SUCCESS);
|
||||||
|
|
||||||
/*-------------------------*/
|
dict_add_to_cache_xtradb_sys_stats(TRUE, heap, dict_hdr, &mtr);
|
||||||
table = dict_mem_table_create("SYS_STATS", DICT_HDR_SPACE, 4, 0);
|
|
||||||
table->n_mysql_handles_opened = 1; /* for pin */
|
|
||||||
|
|
||||||
dict_mem_table_add_col(table, heap, "INDEX_ID", DATA_BINARY, 0, 0);
|
|
||||||
dict_mem_table_add_col(table, heap, "KEY_COLS", DATA_INT, 0, 4);
|
|
||||||
dict_mem_table_add_col(table, heap, "DIFF_VALS", DATA_BINARY, 0, 0);
|
|
||||||
dict_mem_table_add_col(table, heap, "NON_NULL_VALS", DATA_BINARY, 0, 0);
|
|
||||||
|
|
||||||
/* The '+ 2' below comes from the fields DB_TRX_ID, DB_ROLL_PTR */
|
|
||||||
#if DICT_SYS_STATS_DIFF_VALS_FIELD != 2 + 2
|
|
||||||
#error "DICT_SYS_STATS_DIFF_VALS_FIELD != 2 + 2"
|
|
||||||
#endif
|
|
||||||
#if DICT_SYS_STATS_NON_NULL_VALS_FIELD != 3 + 2
|
|
||||||
#error "DICT_SYS_STATS_NON_NULL_VALS_FIELD != 3 + 2"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
table->id = DICT_STATS_ID;
|
|
||||||
dict_table_add_to_cache(table, heap);
|
|
||||||
dict_sys->sys_stats = table;
|
|
||||||
mem_heap_empty(heap);
|
|
||||||
|
|
||||||
index = dict_mem_index_create("SYS_STATS", "CLUST_IND",
|
|
||||||
DICT_HDR_SPACE,
|
|
||||||
DICT_UNIQUE | DICT_CLUSTERED, 2);
|
|
||||||
|
|
||||||
dict_mem_index_add_field(index, "INDEX_ID", 0);
|
|
||||||
dict_mem_index_add_field(index, "KEY_COLS", 0);
|
|
||||||
|
|
||||||
index->id = DICT_STATS_ID;
|
|
||||||
error = dict_index_add_to_cache(table, index,
|
|
||||||
mtr_read_ulint(dict_hdr
|
|
||||||
+ DICT_HDR_STATS,
|
|
||||||
MLOG_4BYTES, &mtr),
|
|
||||||
FALSE);
|
|
||||||
ut_a(error == DB_SUCCESS);
|
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
|
@ -4622,12 +4622,6 @@ next_rec:
|
|||||||
}
|
}
|
||||||
btr_pcur_close(&pcur);
|
btr_pcur_close(&pcur);
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
|
|
||||||
if (rests) {
|
|
||||||
fprintf(stderr, "InnoDB: Warning: failed to store %lu stats entries"
|
|
||||||
" of %s/%s to SYS_STATS system table.\n",
|
|
||||||
rests, index->table_name, index->name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*===========================================*/
|
/*===========================================*/
|
||||||
|
|
||||||
@ -5394,6 +5388,28 @@ dict_table_replace_index_in_foreign_list(
|
|||||||
foreign->foreign_index = new_index;
|
foreign->foreign_index = new_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (foreign = UT_LIST_GET_FIRST(table->referenced_list);
|
||||||
|
foreign;
|
||||||
|
foreign = UT_LIST_GET_NEXT(referenced_list, foreign)) {
|
||||||
|
|
||||||
|
dict_index_t* new_index;
|
||||||
|
|
||||||
|
if (foreign->referenced_index == index) {
|
||||||
|
ut_ad(foreign->referenced_table == index->table);
|
||||||
|
|
||||||
|
new_index = dict_foreign_find_index(
|
||||||
|
foreign->referenced_table,
|
||||||
|
foreign->referenced_col_names,
|
||||||
|
foreign->n_fields, index,
|
||||||
|
/*check_charsets=*/TRUE, /*check_null=*/FALSE);
|
||||||
|
ut_ad(new_index || !trx->check_foreigns);
|
||||||
|
ut_ad(!new_index || new_index->table == index->table);
|
||||||
|
|
||||||
|
foreign->referenced_index = new_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************//**
|
/**********************************************************************//**
|
||||||
|
@ -165,7 +165,7 @@ dict_print(void)
|
|||||||
monitor printout */
|
monitor printout */
|
||||||
|
|
||||||
mutex_enter(&kernel_mutex);
|
mutex_enter(&kernel_mutex);
|
||||||
srv_fatal_semaphore_wait_threshold += 7200; /* 2 hours */
|
srv_fatal_semaphore_wait_threshold += SRV_SEMAPHORE_WAIT_EXTENSION;
|
||||||
mutex_exit(&kernel_mutex);
|
mutex_exit(&kernel_mutex);
|
||||||
|
|
||||||
mutex_enter(&(dict_sys->mutex));
|
mutex_enter(&(dict_sys->mutex));
|
||||||
@ -193,7 +193,7 @@ loop:
|
|||||||
/* Restore the fatal semaphore wait timeout */
|
/* Restore the fatal semaphore wait timeout */
|
||||||
|
|
||||||
mutex_enter(&kernel_mutex);
|
mutex_enter(&kernel_mutex);
|
||||||
srv_fatal_semaphore_wait_threshold -= 7200; /* 2 hours */
|
srv_fatal_semaphore_wait_threshold -= SRV_SEMAPHORE_WAIT_EXTENSION;
|
||||||
mutex_exit(&kernel_mutex);
|
mutex_exit(&kernel_mutex);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -1876,7 +1876,7 @@ fil_inc_pending_ops(
|
|||||||
|
|
||||||
if (space == NULL) {
|
if (space == NULL) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"InnoDB: Error: trying to do ibuf merge to a"
|
"InnoDB: Error: trying to do an operation on a"
|
||||||
" dropped tablespace %lu\n",
|
" dropped tablespace %lu\n",
|
||||||
(ulong) id);
|
(ulong) id);
|
||||||
}
|
}
|
||||||
@ -3375,6 +3375,7 @@ skip_info:
|
|||||||
for (offset = 0; offset < free_limit_bytes;
|
for (offset = 0; offset < free_limit_bytes;
|
||||||
offset += zip_size ? zip_size : UNIV_PAGE_SIZE) {
|
offset += zip_size ? zip_size : UNIV_PAGE_SIZE) {
|
||||||
ibool page_is_corrupt;
|
ibool page_is_corrupt;
|
||||||
|
ibool is_descr_page = FALSE;
|
||||||
|
|
||||||
success = os_file_read(file, page,
|
success = os_file_read(file, page,
|
||||||
(ulint)(offset & 0xFFFFFFFFUL),
|
(ulint)(offset & 0xFFFFFFFFUL),
|
||||||
@ -3413,6 +3414,7 @@ skip_info:
|
|||||||
|
|
||||||
/* store as descr page */
|
/* store as descr page */
|
||||||
memcpy(descr_page, page, (zip_size ? zip_size : UNIV_PAGE_SIZE));
|
memcpy(descr_page, page, (zip_size ? zip_size : UNIV_PAGE_SIZE));
|
||||||
|
is_descr_page = TRUE;
|
||||||
|
|
||||||
} else if (descr_is_corrupt) {
|
} else if (descr_is_corrupt) {
|
||||||
/* unknown state of the page */
|
/* unknown state of the page */
|
||||||
@ -3489,7 +3491,8 @@ skip_info:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fil_page_get_type(page) == FIL_PAGE_INDEX) {
|
if (fil_page_get_type(page) ==
|
||||||
|
FIL_PAGE_INDEX && !is_descr_page) {
|
||||||
dulint tmp = mach_read_from_8(page + (PAGE_HEADER + PAGE_INDEX_ID));
|
dulint tmp = mach_read_from_8(page + (PAGE_HEADER + PAGE_INDEX_ID));
|
||||||
|
|
||||||
for (i = 0; i < n_index; i++) {
|
for (i = 0; i < n_index; i++) {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user