2705 Rafal Somla 2008-10-09
Disabling tests affected by BUG#17823.
modified:
mysql-test/suite/backup/t/disabled.def
2704 Rafal Somla 2008-10-09 [merge]
Auto merge of a new cset from 6.0-backup tree.
modified:
mysql-test/lib/mtr_report.pl
=== modified file 'configure.in'
--- a/configure.in 2008-09-11 18:36:05 +0000
+++ b/configure.in 2008-09-23 10:37:16 +0000
@@ -1,12 +1,13 @@
dnl -*- ksh -*-
dnl Process this file with autoconf to produce a configure script.
-AC_PREREQ(2.52)dnl Minimum Autoconf version required.
+# Minimum Autoconf version required.
+AC_PREREQ(2.52)
AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line!
-# remember to also update version.c in ndb
+# remember to also update version.c in ndb.
# When changing major version number please also check switch statement
# in mysqlbinlog::check_master_version().
AM_INIT_AUTOMAKE(mysql, 6.0.8-alpha)
=== modified file 'include/mysql/plugin.h'
--- a/include/mysql/plugin.h 2008-06-28 11:00:59 +0000
+++ b/include/mysql/plugin.h 2008-09-23 14:33:18 +0000
@@ -16,6 +16,11 @@
#ifndef _my_plugin_h
#define _my_plugin_h
+/* size_t */
+#include <stdlib.h>
+
+typedef struct st_mysql MYSQL;
+
#ifdef __cplusplus
class THD;
class Item;
@@ -66,7 +71,8 @@ typedef struct st_mysql_xid MYSQL_XID;
#define MYSQL_DAEMON_PLUGIN 3 /* The daemon/raw plugin type */
#define MYSQL_INFORMATION_SCHEMA_PLUGIN 4 /* The I_S plugin type */
#define MYSQL_AUDIT_PLUGIN 5 /* The Audit plugin type */
-#define MYSQL_MAX_PLUGIN_TYPE_NUM 6 /* The number of plugin types */
+#define MYSQL_REPLICATION_PLUGIN 6 /* The replication plugin type */
+#define MYSQL_MAX_PLUGIN_TYPE_NUM 7 /* The number of plugin types */
/* We use the following strings to define licenses for plugins */
#define PLUGIN_LICENSE_PROPRIETARY 0
@@ -461,6 +467,19 @@ struct handlerton;
/*************************************************************************
+ API for Replication plugin. (MYSQL_REPLICATION_PLUGIN)
+*/
+#define MYSQL_REPLICATION_INTERFACE_VERSION 0x0100
+
+/**
+ Replication plugin descriptor
+*/
+struct Mysql_replication {
+ int interface_version;
+};
+
+
+/*************************************************************************
st_mysql_value struct for reading values from mysqld.
Used by server variables framework to parse user-provided values.
Will be used for arguments when implementing UDFs.
@@ -613,6 +632,64 @@ void mysql_query_cache_invalidate4(MYSQL
const char *key, unsigned int key_length,
int using_trx);
+/**
+ Get the value of user variable as an integer.
+
+ This function will return the value of variable @a name as an
+ integer. If the original value of the variable is not an integer,
+ the value will be converted into an integer.
+
+ @param name user variable name
+ @param value pointer to return the value
+ @param null_value if not NULL, the function will set it to true if
+ the value of variable is null, set to false if not
+
+ @retval 0 Success
+ @retval 1 Variable not found
+*/
+int get_user_var_int(const char *name,
+ long long int *value, int *null_value);
+
+/**
+ Get the value of user variable as a double precision float number.
+
+ This function will return the value of variable @a name as real
+ number. If the original value of the variable is not a real number,
+ the value will be converted into a real number.
+
+ @param name user variable name
+ @param value pointer to return the value
+ @param null_value if not NULL, the function will set it to true if
+ the value of variable is null, set to false if not
+
+ @retval 0 Success
+ @retval 1 Variable not found
+*/
+int get_user_var_real(const char *name,
+ double *value, int *null_value);
+
+/**
+ Get the value of user variable as a string.
+
+ This function will return the value of variable @a name as
+ string. If the original value of the variable is not a string,
+ the value will be converted into a string.
+
+ @param name user variable name
+ @param value pointer to the value buffer
+ @param len length of the value buffer
+ @param precision precision of the value if it is a float number
+ @param null_value if not NULL, the function will set it to true if
+ the value of variable is null, set to false if not
+
+ @retval 0 Success
+ @retval 1 Variable not found
+*/
+int get_user_var_str(const char *name,
+ char *value, unsigned long len,
+ unsigned int precision, int *null_value);
+
+
#ifdef __cplusplus
}
#endif
=== modified file 'include/mysql/plugin.h.pp'
--- a/include/mysql/plugin.h.pp 2008-07-11 12:09:05 +0000
+++ b/include/mysql/plugin.h.pp 2008-09-23 14:33:18 +0000
@@ -1,3 +1,5 @@
+#include <stdlib.h>
+typedef struct st_mysql MYSQL;
struct st_mysql_lex_string
{
char *str;
@@ -106,6 +108,9 @@ struct st_mysql_storage_engine
int interface_version;
};
struct handlerton;
+struct Mysql_replication {
+ int interface_version;
+};
struct st_mysql_value
{
int (*value_type)(struct st_mysql_value *);
@@ -139,3 +144,10 @@ void thd_get_xid(const void* thd, MYSQL_
void mysql_query_cache_invalidate4(void* thd,
const char *key, unsigned int key_length,
int using_trx);
+int get_user_var_int(const char *name,
+ long long int *value, int *null_value);
+int get_user_var_real(const char *name,
+ double *value, int *null_value);
+int get_user_var_str(const char *name,
+ char *value, unsigned long len,
+ unsigned int precision, int *null_value);
=== modified file 'libmysql/CMakeLists.txt'
--- a/libmysql/CMakeLists.txt 2008-08-26 18:57:58 +0000
+++ b/libmysql/CMakeLists.txt 2008-09-29 17:47:27 +0000
@@ -119,7 +119,7 @@ ADD_LIBRARY(mysqlclient_notls STATIC ${C
ADD_DEPENDENCIES(mysqlclient_notls GenError)
TARGET_LINK_LIBRARIES(mysqlclient_notls)
-ADD_LIBRARY(libmysql SHARED ${CLIENT_SOURCES} dll.c libmysql.def)
+ADD_LIBRARY(libmysql SHARED ${CLIENT_SOURCES} libmysql.def)
IF(WIN32)
SET_TARGET_PROPERTIES(libmysql mysqlclient PROPERTIES COMPILE_FLAGS "-DUSE_TLS")
ENDIF(WIN32)
=== modified file 'libmysql/Makefile.am'
--- a/libmysql/Makefile.am 2007-11-22 11:39:07 +0000
+++ b/libmysql/Makefile.am 2008-09-29 17:47:27 +0000
@@ -31,7 +31,7 @@ include $(srcdir)/Makefile.shared
libmysqlclient_la_SOURCES = $(target_sources)
libmysqlclient_la_LIBADD = $(target_libadd) $(yassl_las)
libmysqlclient_la_LDFLAGS = $(target_ldflags)
-EXTRA_DIST = Makefile.shared libmysql.def dll.c CMakeLists.txt
+EXTRA_DIST = Makefile.shared libmysql.def CMakeLists.txt
noinst_HEADERS = client_settings.h
link_sources:
=== removed file 'libmysql/dll.c'
--- a/libmysql/dll.c 2008-09-01 22:30:06 +0000
+++ b/libmysql/dll.c 1970-01-01 00:00:00 +0000
@@ -1,125 +0,0 @@
-/* Copyright (C) 2000-2004 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.
-
- There are special exceptions to the terms and conditions of the GPL as it
- is applied to this software. View the full text of the exception in file
- EXCEPTIONS-CLIENT in the directory of this software distribution.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-/*
-** Handling initialization of the dll library
-*/
-
-#include <my_global.h>
-#include <my_sys.h>
-#include <my_pthread.h>
-
-static my_bool libmysql_inited=0;
-
-void libmysql_init(void)
-{
- if (libmysql_inited)
- return;
- libmysql_inited=1;
- my_init();
- {
- DBUG_ENTER("libmysql_init");
-#ifdef LOG_ALL
- DBUG_PUSH("d:t:S:O,c::\\tmp\\libmysql.log");
-#else
- if (getenv("LIBMYSQL_LOG") != NULL)
- DBUG_PUSH(getenv("LIBMYSQL_LOG"));
-#endif
- DBUG_VOID_RETURN;
- }
-}
-
-#ifdef __WIN__
-
-static int inited=0,threads=0;
-HINSTANCE NEAR s_hModule; /* Saved module handle */
-DWORD main_thread;
-
-BOOL APIENTRY LibMain(HANDLE hInst,DWORD ul_reason_being_called,
- LPVOID lpReserved)
-{
- switch (ul_reason_being_called) {
- case DLL_PROCESS_ATTACH: /* case of libentry call in win 3.x */
- if (!inited++)
- {
- s_hModule=hInst;
- libmysql_init();
- main_thread=GetCurrentThreadId();
- }
- break;
- case DLL_THREAD_ATTACH:
- threads++;
- my_thread_init();
- break;
- case DLL_PROCESS_DETACH: /* case of wep call in win 3.x */
- if (!--inited) /* Safety */
- {
- /* my_thread_init() */ /* This may give extra safety */
- my_end(0);
- }
- break;
- case DLL_THREAD_DETACH:
- /* Main thread will free by my_end() */
- threads--;
- if (main_thread != GetCurrentThreadId())
- my_thread_end();
- break;
- default:
- break;
- } /* switch */
-
- return TRUE;
-
- UNREFERENCED_PARAMETER(lpReserved);
-} /* LibMain */
-
-
-static BOOL do_libmain;
-int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved)
-{
- /*
- Unless environment variable LIBMYSQL_DLLINIT is set, do nothing.
- The environment variable is checked once, during the first call to DllMain()
- (in DLL_PROCESS_ATTACH hook).
- */
- if (ul_reason_being_called == DLL_PROCESS_ATTACH)
- do_libmain = (getenv("LIBMYSQL_DLLINIT") != NULL);
- if (do_libmain)
- return LibMain(hInst,ul_reason_being_called,lpReserved);
- return TRUE;
-}
-
-#elif defined(WINDOWS)
-
-/****************************************************************************
-** This routine is called by LIBSTART.ASM at module load time. All it
-** does in this sample is remember the DLL module handle. The module
-** handle is needed if you want to do things like load stuff from the
-** resource file (for instance string resources).
-****************************************************************************/
-
-int _export FAR PASCAL libmain(HANDLE hModule,short cbHeapSize,
- UCHAR FAR *lszCmdLine)
-{
- s_hModule = hModule;
- libmysql_init();
- return TRUE;
-}
-
-#endif
=== modified file 'libmysqld/CMakeLists.txt'
--- a/libmysqld/CMakeLists.txt 2008-08-08 01:33:43 +0000
+++ b/libmysqld/CMakeLists.txt 2008-09-23 14:33:18 +0000
@@ -204,6 +204,7 @@ SET(LIBMYSQLD_SOURCES emb_qcache.cc libm
../sql/ddl_blocker.cc ../sql/si_objects.cc
../sql/event_parse_data.cc ../sql/mdl.cc
../sql/transaction.cc
+ ../sql/rpl_handler.cc
${GEN_SOURCES}
${LIB_SOURCES})
=== modified file 'libmysqld/Makefile.am'
--- a/libmysqld/Makefile.am 2008-08-08 01:33:43 +0000
+++ b/libmysqld/Makefile.am 2008-09-23 14:33:18 +0000
@@ -81,7 +81,8 @@ sqlsources = derror.cc field.cc field_co
debug_sync.cc sql_tablespace.cc transaction.cc \
rpl_injector.cc my_user.c partition_info.cc \
sql_servers.cc ddl_blocker.cc si_objects.cc sql_audit.cc \
- event_parse_data.cc mdl.cc
+ event_parse_data.cc mdl.cc \
+ rpl_handler.cc
libmysqld_int_a_SOURCES= $(libmysqld_sources)
nodist_libmysqld_int_a_SOURCES= $(libmysqlsources) $(sqlsources)
=== modified file 'mysql-test/mysql-test-run.pl'
--- a/mysql-test/mysql-test-run.pl 2008-08-25 18:23:18 +0000
+++ b/mysql-test/mysql-test-run.pl 2008-10-02 16:43:44 +0000
@@ -3405,7 +3405,16 @@ sub run_testcase ($) {
{
mtr_timer_stop_all($glob_timers);
mtr_report("\nServers started, exiting");
- exit(0);
+ if ($glob_win32_perl)
+ {
+ #ActiveState perl hangs when using normal exit, use POSIX::_exit instead
+ use POSIX qw[ _exit ];
+ POSIX::_exit(0);
+ }
+ else
+ {
+ exit(0);
+ }
}
{
=== modified file 'mysql-test/r/information_schema.result'
--- a/mysql-test/r/information_schema.result 2008-09-19 09:55:21 +0000
+++ b/mysql-test/r/information_schema.result 2008-09-29 06:50:26 +0000
@@ -1419,7 +1419,7 @@ SELECT *
FROM tables ta
JOIN collations co ON ( co.collation_name = ta.table_catalog )
JOIN character_sets cs ON ( cs.character_set_name = ta.table_catalog );
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT COLLATION_NAME CHARACTER_SET_NAME ID IS_DEFAULT IS_COMPILED SORTLEN CHARACTER_SET_NAME DEFAULT_COLLATE_NAME DESCRIPTION MAXLEN
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME COLLATION_NAME CHARACTER_SET_NAME ID IS_DEFAULT IS_COMPILED SORTLEN CHARACTER_SET_NAME DEFAULT_COLLATE_NAME DESCRIPTION MAXLEN
DROP TABLE test.t1;
SET max_heap_table_size = DEFAULT;
USE test;
@@ -1503,7 +1503,7 @@ AS SELECT *
FROM information_schema.tables;
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS where TABLE_NAME = 'v1';
VIEW_DEFINITION
-select `tables`.`TABLE_CATALOG` AS `TABLE_CATALOG`,`tables`.`TABLE_SCHEMA` AS `TABLE_SCHEMA`,`tables`.`TABLE_NAME` AS `TABLE_NAME`,`tables`.`TABLE_TYPE` AS `TABLE_TYPE`,`tables`.`ENGINE` AS `ENGINE`,`tables`.`VERSION` AS `VERSION`,`tables`.`ROW_FORMAT` AS `ROW_FORMAT`,`tables`.`TABLE_ROWS` AS `TABLE_ROWS`,`tables`.`AVG_ROW_LENGTH` AS `AVG_ROW_LENGTH`,`tables`.`DATA_LENGTH` AS `DATA_LENGTH`,`tables`.`MAX_DATA_LENGTH` AS `MAX_DATA_LENGTH`,`tables`.`INDEX_LENGTH` AS `INDEX_LENGTH`,`tables`.`DATA_FREE` AS `DATA_FREE`,`tables`.`AUTO_INCREMENT` AS `AUTO_INCREMENT`,`tables`.`CREATE_TIME` AS `CREATE_TIME`,`tables`.`UPDATE_TIME` AS `UPDATE_TIME`,`tables`.`CHECK_TIME` AS `CHECK_TIME`,`tables`.`TABLE_COLLATION` AS `TABLE_COLLATION`,`tables`.`CHECKSUM` AS `CHECKSUM`,`tables`.`CREATE_OPTIONS` AS `CREATE_OPTIONS`,`tables`.`TABLE_COMMENT` AS `TABLE_COMMENT` from `information_schema`.`tables`
+select `tables`.`TABLE_CATALOG` AS `TABLE_CATALOG`,`tables`.`TABLE_SCHEMA` AS `TABLE_SCHEMA`,`tables`.`TABLE_NAME` AS `TABLE_NAME`,`tables`.`TABLE_TYPE` AS `TABLE_TYPE`,`tables`.`ENGINE` AS `ENGINE`,`tables`.`VERSION` AS `VERSION`,`tables`.`ROW_FORMAT` AS `ROW_FORMAT`,`tables`.`TABLE_ROWS` AS `TABLE_ROWS`,`tables`.`AVG_ROW_LENGTH` AS `AVG_ROW_LENGTH`,`tables`.`DATA_LENGTH` AS `DATA_LENGTH`,`tables`.`MAX_DATA_LENGTH` AS `MAX_DATA_LENGTH`,`tables`.`INDEX_LENGTH` AS `INDEX_LENGTH`,`tables`.`DATA_FREE` AS `DATA_FREE`,`tables`.`AUTO_INCREMENT` AS `AUTO_INCREMENT`,`tables`.`CREATE_TIME` AS `CREATE_TIME`,`tables`.`UPDATE_TIME` AS `UPDATE_TIME`,`tables`.`CHECK_TIME` AS `CHECK_TIME`,`tables`.`TABLE_COLLATION` AS `TABLE_COLLATION`,`tables`.`CHECKSUM` AS `CHECKSUM`,`tables`.`CREATE_OPTIONS` AS `CREATE_OPTIONS`,`tables`.`TABLE_COMMENT` AS `TABLE_COMMENT`,`tables`.`TABLESPACE_NAME` AS `TABLESPACE_NAME` from `information_schema`.`tables`
DROP VIEW v1;
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME ='information_schema';
@@ -1536,11 +1536,11 @@ TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NO
select * from `information_schema`.`STATISTICS` where `TABLE_NAME` = NULL;
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT INDEX_COMMENT
select * from information_schema.tables where table_schema = NULL;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME
select * from information_schema.tables where table_catalog = NULL;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME
select * from information_schema.tables where table_name = NULL;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME
select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_SCHEMA` = NULL;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE
select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_NAME` = NULL;
@@ -1622,7 +1622,7 @@ CREATE TABLE t1 (c1 int);
CREATE TABLE t2 (c2 int);
GRANT SELECT ON testdb1.t1 TO mysqluser_35955@localhost;
SELECT * FROM INFORMATION_SCHEMA.tables, t1;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT c1
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME c1
SELECT * FROM t2;
ERROR 42000: SELECT command denied to user 'mysqluser_35955'@'localhost' for table 't2'
SELECT * FROM t2, INFORMATION_SCHEMA.tables;
=== modified file 'mysql-test/suite/backup/t/backup_no_data.test'
--- a/mysql-test/suite/backup/t/backup_no_data.test 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/t/backup_no_data.test 2008-10-09 09:55:08 +0000
@@ -1,6 +1,8 @@
--source include/not_embedded.inc
--disable_warnings
+--rmdir $MYSQLTEST_VARDIR/master-data/test
+--mkdir $MYSQLTEST_VARDIR/master-data/test
DROP DATABASE IF EXISTS empty_db;
DROP DATABASE IF EXISTS other_db;
--enable_warnings
=== modified file 'mysql-test/suite/backup/t/disabled.def'
--- a/mysql-test/suite/backup/t/disabled.def 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/t/disabled.def 2008-10-09 11:45:40 +0000
@@ -12,3 +12,5 @@
backup_no_engine : Bug#36021 2008-04-13 rsomla server crashes when openning table with unknown storage engine
backup_triggers_and_events : Bug#37762 2008-07-01 rafal Test fails on remove_file for unknown reasons
backup_no_be : Bug#38023 2008-07-16 rafal Test triggers valgrind warnings described in the bug
+backup_no_data : Bug#17823 2008-10-09 rafal Tests in main suite leave undeleted files causing this test to fail
+backup_ddl_blocker : Bug#17823 2008-10-09 rafal Tests in main suite leave undeleted files causing this test to fail
=== modified file 'mysql-test/suite/falcon/r/falcon_bug_22154-big.result'
--- a/mysql-test/suite/falcon/r/falcon_bug_22154-big.result 2008-04-25 10:46:09 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_22154-big.result 2008-09-19 09:12:48 +0000
@@ -7,7 +7,6 @@ create procedure pj9 ()
begin
declare v int default 1;
while v < 500 do
-select 'alter',v;
set @v = concat('alter table tj9 add column s',v,' char(64) default ''Hello World''');
prepare stmt1 from @v;
execute stmt1;
@@ -15,13 +14,11 @@ set v = v + 1;
end while;
set v = 1;
while v < 500 do
-select 'insert',v;
insert into tj9 (s1) values (v);
set v = v + 1;
end while;
set v = 1;
while v < 500 do
-select 'update',v;
set @v = concat('update tj9 set s',v,'=concat(s2,s1)');
prepare stmt1 from @v;
execute stmt1;
@@ -29,3002 +26,8 @@ set v = v + 1;
end while;
end//
call pj9();
-alter v
-alter 1
-alter v
-alter 2
-alter v
-alter 3
-alter v
-alter 4
-alter v
-alter 5
-alter v
-alter 6
-alter v
-alter 7
-alter v
-alter 8
-alter v
-alter 9
-alter v
-alter 10
-alter v
-alter 11
-alter v
-alter 12
-alter v
-alter 13
-alter v
-alter 14
-alter v
-alter 15
-alter v
-alter 16
-alter v
-alter 17
-alter v
-alter 18
-alter v
-alter 19
-alter v
-alter 20
-alter v
-alter 21
-alter v
-alter 22
-alter v
-alter 23
-alter v
-alter 24
-alter v
-alter 25
-alter v
-alter 26
-alter v
-alter 27
-alter v
-alter 28
-alter v
-alter 29
-alter v
-alter 30
-alter v
-alter 31
-alter v
-alter 32
-alter v
-alter 33
-alter v
-alter 34
-alter v
-alter 35
-alter v
-alter 36
-alter v
-alter 37
-alter v
-alter 38
-alter v
-alter 39
-alter v
-alter 40
-alter v
-alter 41
-alter v
-alter 42
-alter v
-alter 43
-alter v
-alter 44
-alter v
-alter 45
-alter v
-alter 46
-alter v
-alter 47
-alter v
-alter 48
-alter v
-alter 49
-alter v
-alter 50
-alter v
-alter 51
-alter v
-alter 52
-alter v
-alter 53
-alter v
-alter 54
-alter v
-alter 55
-alter v
-alter 56
-alter v
-alter 57
-alter v
-alter 58
-alter v
-alter 59
-alter v
-alter 60
-alter v
-alter 61
-alter v
-alter 62
-alter v
-alter 63
-alter v
-alter 64
-alter v
-alter 65
-alter v
-alter 66
-alter v
-alter 67
-alter v
-alter 68
-alter v
-alter 69
-alter v
-alter 70
-alter v
-alter 71
-alter v
-alter 72
-alter v
-alter 73
-alter v
-alter 74
-alter v
-alter 75
-alter v
-alter 76
-alter v
-alter 77
-alter v
-alter 78
-alter v
-alter 79
-alter v
-alter 80
-alter v
-alter 81
-alter v
-alter 82
-alter v
-alter 83
-alter v
-alter 84
-alter v
-alter 85
-alter v
-alter 86
-alter v
-alter 87
-alter v
-alter 88
-alter v
-alter 89
-alter v
-alter 90
-alter v
-alter 91
-alter v
-alter 92
-alter v
-alter 93
-alter v
-alter 94
-alter v
-alter 95
-alter v
-alter 96
-alter v
-alter 97
-alter v
-alter 98
-alter v
-alter 99
-alter v
-alter 100
-alter v
-alter 101
-alter v
-alter 102
-alter v
-alter 103
-alter v
-alter 104
-alter v
-alter 105
-alter v
-alter 106
-alter v
-alter 107
-alter v
-alter 108
-alter v
-alter 109
-alter v
-alter 110
-alter v
-alter 111
-alter v
-alter 112
-alter v
-alter 113
-alter v
-alter 114
-alter v
-alter 115
-alter v
-alter 116
-alter v
-alter 117
-alter v
-alter 118
-alter v
-alter 119
-alter v
-alter 120
-alter v
-alter 121
-alter v
-alter 122
-alter v
-alter 123
-alter v
-alter 124
-alter v
-alter 125
-alter v
-alter 126
-alter v
-alter 127
-alter v
-alter 128
-alter v
-alter 129
-alter v
-alter 130
-alter v
-alter 131
-alter v
-alter 132
-alter v
-alter 133
-alter v
-alter 134
-alter v
-alter 135
-alter v
-alter 136
-alter v
-alter 137
-alter v
-alter 138
-alter v
-alter 139
-alter v
-alter 140
-alter v
-alter 141
-alter v
-alter 142
-alter v
-alter 143
-alter v
-alter 144
-alter v
-alter 145
-alter v
-alter 146
-alter v
-alter 147
-alter v
-alter 148
-alter v
-alter 149
-alter v
-alter 150
-alter v
-alter 151
-alter v
-alter 152
-alter v
-alter 153
-alter v
-alter 154
-alter v
-alter 155
-alter v
-alter 156
-alter v
-alter 157
-alter v
-alter 158
-alter v
-alter 159
-alter v
-alter 160
-alter v
-alter 161
-alter v
-alter 162
-alter v
-alter 163
-alter v
-alter 164
-alter v
-alter 165
-alter v
-alter 166
-alter v
-alter 167
-alter v
-alter 168
-alter v
-alter 169
-alter v
-alter 170
-alter v
-alter 171
-alter v
-alter 172
-alter v
-alter 173
-alter v
-alter 174
-alter v
-alter 175
-alter v
-alter 176
-alter v
-alter 177
-alter v
-alter 178
-alter v
-alter 179
-alter v
-alter 180
-alter v
-alter 181
-alter v
-alter 182
-alter v
-alter 183
-alter v
-alter 184
-alter v
-alter 185
-alter v
-alter 186
-alter v
-alter 187
-alter v
-alter 188
-alter v
-alter 189
-alter v
-alter 190
-alter v
-alter 191
-alter v
-alter 192
-alter v
-alter 193
-alter v
-alter 194
-alter v
-alter 195
-alter v
-alter 196
-alter v
-alter 197
-alter v
-alter 198
-alter v
-alter 199
-alter v
-alter 200
-alter v
-alter 201
-alter v
-alter 202
-alter v
-alter 203
-alter v
-alter 204
-alter v
-alter 205
-alter v
-alter 206
-alter v
-alter 207
-alter v
-alter 208
-alter v
-alter 209
-alter v
-alter 210
-alter v
-alter 211
-alter v
-alter 212
-alter v
-alter 213
-alter v
-alter 214
-alter v
-alter 215
-alter v
-alter 216
-alter v
-alter 217
-alter v
-alter 218
-alter v
-alter 219
-alter v
-alter 220
-alter v
-alter 221
-alter v
-alter 222
-alter v
-alter 223
-alter v
-alter 224
-alter v
-alter 225
-alter v
-alter 226
-alter v
-alter 227
-alter v
-alter 228
-alter v
-alter 229
-alter v
-alter 230
-alter v
-alter 231
-alter v
-alter 232
-alter v
-alter 233
-alter v
-alter 234
-alter v
-alter 235
-alter v
-alter 236
-alter v
-alter 237
-alter v
-alter 238
-alter v
-alter 239
-alter v
-alter 240
-alter v
-alter 241
-alter v
-alter 242
-alter v
-alter 243
-alter v
-alter 244
-alter v
-alter 245
-alter v
-alter 246
-alter v
-alter 247
-alter v
-alter 248
-alter v
-alter 249
-alter v
-alter 250
-alter v
-alter 251
-alter v
-alter 252
-alter v
-alter 253
-alter v
-alter 254
-alter v
-alter 255
-alter v
-alter 256
-alter v
-alter 257
-alter v
-alter 258
-alter v
-alter 259
-alter v
-alter 260
-alter v
-alter 261
-alter v
-alter 262
-alter v
-alter 263
-alter v
-alter 264
-alter v
-alter 265
-alter v
-alter 266
-alter v
-alter 267
-alter v
-alter 268
-alter v
-alter 269
-alter v
-alter 270
-alter v
-alter 271
-alter v
-alter 272
-alter v
-alter 273
-alter v
-alter 274
-alter v
-alter 275
-alter v
-alter 276
-alter v
-alter 277
-alter v
-alter 278
-alter v
-alter 279
-alter v
-alter 280
-alter v
-alter 281
-alter v
-alter 282
-alter v
-alter 283
-alter v
-alter 284
-alter v
-alter 285
-alter v
-alter 286
-alter v
-alter 287
-alter v
-alter 288
-alter v
-alter 289
-alter v
-alter 290
-alter v
-alter 291
-alter v
-alter 292
-alter v
-alter 293
-alter v
-alter 294
-alter v
-alter 295
-alter v
-alter 296
-alter v
-alter 297
-alter v
-alter 298
-alter v
-alter 299
-alter v
-alter 300
-alter v
-alter 301
-alter v
-alter 302
-alter v
-alter 303
-alter v
-alter 304
-alter v
-alter 305
-alter v
-alter 306
-alter v
-alter 307
-alter v
-alter 308
-alter v
-alter 309
-alter v
-alter 310
-alter v
-alter 311
-alter v
-alter 312
-alter v
-alter 313
-alter v
-alter 314
-alter v
-alter 315
-alter v
-alter 316
-alter v
-alter 317
-alter v
-alter 318
-alter v
-alter 319
-alter v
-alter 320
-alter v
-alter 321
-alter v
-alter 322
-alter v
-alter 323
-alter v
-alter 324
-alter v
-alter 325
-alter v
-alter 326
-alter v
-alter 327
-alter v
-alter 328
-alter v
-alter 329
-alter v
-alter 330
-alter v
-alter 331
-alter v
-alter 332
-alter v
-alter 333
-alter v
-alter 334
-alter v
-alter 335
-alter v
-alter 336
-alter v
-alter 337
-alter v
-alter 338
-alter v
-alter 339
-alter v
-alter 340
-alter v
-alter 341
-alter v
-alter 342
-alter v
-alter 343
-alter v
-alter 344
-alter v
-alter 345
-alter v
-alter 346
-alter v
-alter 347
-alter v
-alter 348
-alter v
-alter 349
-alter v
-alter 350
-alter v
-alter 351
-alter v
-alter 352
-alter v
-alter 353
-alter v
-alter 354
-alter v
-alter 355
-alter v
-alter 356
-alter v
-alter 357
-alter v
-alter 358
-alter v
-alter 359
-alter v
-alter 360
-alter v
-alter 361
-alter v
-alter 362
-alter v
-alter 363
-alter v
-alter 364
-alter v
-alter 365
-alter v
-alter 366
-alter v
-alter 367
-alter v
-alter 368
-alter v
-alter 369
-alter v
-alter 370
-alter v
-alter 371
-alter v
-alter 372
-alter v
-alter 373
-alter v
-alter 374
-alter v
-alter 375
-alter v
-alter 376
-alter v
-alter 377
-alter v
-alter 378
-alter v
-alter 379
-alter v
-alter 380
-alter v
-alter 381
-alter v
-alter 382
-alter v
-alter 383
-alter v
-alter 384
-alter v
-alter 385
-alter v
-alter 386
-alter v
-alter 387
-alter v
-alter 388
-alter v
-alter 389
-alter v
-alter 390
-alter v
-alter 391
-alter v
-alter 392
-alter v
-alter 393
-alter v
-alter 394
-alter v
-alter 395
-alter v
-alter 396
-alter v
-alter 397
-alter v
-alter 398
-alter v
-alter 399
-alter v
-alter 400
-alter v
-alter 401
-alter v
-alter 402
-alter v
-alter 403
-alter v
-alter 404
-alter v
-alter 405
-alter v
-alter 406
-alter v
-alter 407
-alter v
-alter 408
-alter v
-alter 409
-alter v
-alter 410
-alter v
-alter 411
-alter v
-alter 412
-alter v
-alter 413
-alter v
-alter 414
-alter v
-alter 415
-alter v
-alter 416
-alter v
-alter 417
-alter v
-alter 418
-alter v
-alter 419
-alter v
-alter 420
-alter v
-alter 421
-alter v
-alter 422
-alter v
-alter 423
-alter v
-alter 424
-alter v
-alter 425
-alter v
-alter 426
-alter v
-alter 427
-alter v
-alter 428
-alter v
-alter 429
-alter v
-alter 430
-alter v
-alter 431
-alter v
-alter 432
-alter v
-alter 433
-alter v
-alter 434
-alter v
-alter 435
-alter v
-alter 436
-alter v
-alter 437
-alter v
-alter 438
-alter v
-alter 439
-alter v
-alter 440
-alter v
-alter 441
-alter v
-alter 442
-alter v
-alter 443
-alter v
-alter 444
-alter v
-alter 445
-alter v
-alter 446
-alter v
-alter 447
-alter v
-alter 448
-alter v
-alter 449
-alter v
-alter 450
-alter v
-alter 451
-alter v
-alter 452
-alter v
-alter 453
-alter v
-alter 454
-alter v
-alter 455
-alter v
-alter 456
-alter v
-alter 457
-alter v
-alter 458
-alter v
-alter 459
-alter v
-alter 460
-alter v
-alter 461
-alter v
-alter 462
-alter v
-alter 463
-alter v
-alter 464
-alter v
-alter 465
-alter v
-alter 466
-alter v
-alter 467
-alter v
-alter 468
-alter v
-alter 469
-alter v
-alter 470
-alter v
-alter 471
-alter v
-alter 472
-alter v
-alter 473
-alter v
-alter 474
-alter v
-alter 475
-alter v
-alter 476
-alter v
-alter 477
-alter v
-alter 478
-alter v
-alter 479
-alter v
-alter 480
-alter v
-alter 481
-alter v
-alter 482
-alter v
-alter 483
-alter v
-alter 484
-alter v
-alter 485
-alter v
-alter 486
-alter v
-alter 487
-alter v
-alter 488
-alter v
-alter 489
-alter v
-alter 490
-alter v
-alter 491
-alter v
-alter 492
-alter v
-alter 493
-alter v
-alter 494
-alter v
-alter 495
-alter v
-alter 496
-alter v
-alter 497
-alter v
-alter 498
-alter v
-alter 499
-insert v
-insert 1
-insert v
-insert 2
-insert v
-insert 3
-insert v
-insert 4
-insert v
-insert 5
-insert v
-insert 6
-insert v
-insert 7
-insert v
-insert 8
-insert v
-insert 9
-insert v
-insert 10
-insert v
-insert 11
-insert v
-insert 12
-insert v
-insert 13
-insert v
-insert 14
-insert v
-insert 15
-insert v
-insert 16
-insert v
-insert 17
-insert v
-insert 18
-insert v
-insert 19
-insert v
-insert 20
-insert v
-insert 21
-insert v
-insert 22
-insert v
-insert 23
-insert v
-insert 24
-insert v
-insert 25
-insert v
-insert 26
-insert v
-insert 27
-insert v
-insert 28
-insert v
-insert 29
-insert v
-insert 30
-insert v
-insert 31
-insert v
-insert 32
-insert v
-insert 33
-insert v
-insert 34
-insert v
-insert 35
-insert v
-insert 36
-insert v
-insert 37
-insert v
-insert 38
-insert v
-insert 39
-insert v
-insert 40
-insert v
-insert 41
-insert v
-insert 42
-insert v
-insert 43
-insert v
-insert 44
-insert v
-insert 45
-insert v
-insert 46
-insert v
-insert 47
-insert v
-insert 48
-insert v
-insert 49
-insert v
-insert 50
-insert v
-insert 51
-insert v
-insert 52
-insert v
-insert 53
-insert v
-insert 54
-insert v
-insert 55
-insert v
-insert 56
-insert v
-insert 57
-insert v
-insert 58
-insert v
-insert 59
-insert v
-insert 60
-insert v
-insert 61
-insert v
-insert 62
-insert v
-insert 63
-insert v
-insert 64
-insert v
-insert 65
-insert v
-insert 66
-insert v
-insert 67
-insert v
-insert 68
-insert v
-insert 69
-insert v
-insert 70
-insert v
-insert 71
-insert v
-insert 72
-insert v
-insert 73
-insert v
-insert 74
-insert v
-insert 75
-insert v
-insert 76
-insert v
-insert 77
-insert v
-insert 78
-insert v
-insert 79
-insert v
-insert 80
-insert v
-insert 81
-insert v
-insert 82
-insert v
-insert 83
-insert v
-insert 84
-insert v
-insert 85
-insert v
-insert 86
-insert v
-insert 87
-insert v
-insert 88
-insert v
-insert 89
-insert v
-insert 90
-insert v
-insert 91
-insert v
-insert 92
-insert v
-insert 93
-insert v
-insert 94
-insert v
-insert 95
-insert v
-insert 96
-insert v
-insert 97
-insert v
-insert 98
-insert v
-insert 99
-insert v
-insert 100
-insert v
-insert 101
-insert v
-insert 102
-insert v
-insert 103
-insert v
-insert 104
-insert v
-insert 105
-insert v
-insert 106
-insert v
-insert 107
-insert v
-insert 108
-insert v
-insert 109
-insert v
-insert 110
-insert v
-insert 111
-insert v
-insert 112
-insert v
-insert 113
-insert v
-insert 114
-insert v
-insert 115
-insert v
-insert 116
-insert v
-insert 117
-insert v
-insert 118
-insert v
-insert 119
-insert v
-insert 120
-insert v
-insert 121
-insert v
-insert 122
-insert v
-insert 123
-insert v
-insert 124
-insert v
-insert 125
-insert v
-insert 126
-insert v
-insert 127
-insert v
-insert 128
-insert v
-insert 129
-insert v
-insert 130
-insert v
-insert 131
-insert v
-insert 132
-insert v
-insert 133
-insert v
-insert 134
-insert v
-insert 135
-insert v
-insert 136
-insert v
-insert 137
-insert v
-insert 138
-insert v
-insert 139
-insert v
-insert 140
-insert v
-insert 141
-insert v
-insert 142
-insert v
-insert 143
-insert v
-insert 144
-insert v
-insert 145
-insert v
-insert 146
-insert v
-insert 147
-insert v
-insert 148
-insert v
-insert 149
-insert v
-insert 150
-insert v
-insert 151
-insert v
-insert 152
-insert v
-insert 153
-insert v
-insert 154
-insert v
-insert 155
-insert v
-insert 156
-insert v
-insert 157
-insert v
-insert 158
-insert v
-insert 159
-insert v
-insert 160
-insert v
-insert 161
-insert v
-insert 162
-insert v
-insert 163
-insert v
-insert 164
-insert v
-insert 165
-insert v
-insert 166
-insert v
-insert 167
-insert v
-insert 168
-insert v
-insert 169
-insert v
-insert 170
-insert v
-insert 171
-insert v
-insert 172
-insert v
-insert 173
-insert v
-insert 174
-insert v
-insert 175
-insert v
-insert 176
-insert v
-insert 177
-insert v
-insert 178
-insert v
-insert 179
-insert v
-insert 180
-insert v
-insert 181
-insert v
-insert 182
-insert v
-insert 183
-insert v
-insert 184
-insert v
-insert 185
-insert v
-insert 186
-insert v
-insert 187
-insert v
-insert 188
-insert v
-insert 189
-insert v
-insert 190
-insert v
-insert 191
-insert v
-insert 192
-insert v
-insert 193
-insert v
-insert 194
-insert v
-insert 195
-insert v
-insert 196
-insert v
-insert 197
-insert v
-insert 198
-insert v
-insert 199
-insert v
-insert 200
-insert v
-insert 201
-insert v
-insert 202
-insert v
-insert 203
-insert v
-insert 204
-insert v
-insert 205
-insert v
-insert 206
-insert v
-insert 207
-insert v
-insert 208
-insert v
-insert 209
-insert v
-insert 210
-insert v
-insert 211
-insert v
-insert 212
-insert v
-insert 213
-insert v
-insert 214
-insert v
-insert 215
-insert v
-insert 216
-insert v
-insert 217
-insert v
-insert 218
-insert v
-insert 219
-insert v
-insert 220
-insert v
-insert 221
-insert v
-insert 222
-insert v
-insert 223
-insert v
-insert 224
-insert v
-insert 225
-insert v
-insert 226
-insert v
-insert 227
-insert v
-insert 228
-insert v
-insert 229
-insert v
-insert 230
-insert v
-insert 231
-insert v
-insert 232
-insert v
-insert 233
-insert v
-insert 234
-insert v
-insert 235
-insert v
-insert 236
-insert v
-insert 237
-insert v
-insert 238
-insert v
-insert 239
-insert v
-insert 240
-insert v
-insert 241
-insert v
-insert 242
-insert v
-insert 243
-insert v
-insert 244
-insert v
-insert 245
-insert v
-insert 246
-insert v
-insert 247
-insert v
-insert 248
-insert v
-insert 249
-insert v
-insert 250
-insert v
-insert 251
-insert v
-insert 252
-insert v
-insert 253
-insert v
-insert 254
-insert v
-insert 255
-insert v
-insert 256
-insert v
-insert 257
-insert v
-insert 258
-insert v
-insert 259
-insert v
-insert 260
-insert v
-insert 261
-insert v
-insert 262
-insert v
-insert 263
-insert v
-insert 264
-insert v
-insert 265
-insert v
-insert 266
-insert v
-insert 267
-insert v
-insert 268
-insert v
-insert 269
-insert v
-insert 270
-insert v
-insert 271
-insert v
-insert 272
-insert v
-insert 273
-insert v
-insert 274
-insert v
-insert 275
-insert v
-insert 276
-insert v
-insert 277
-insert v
-insert 278
-insert v
-insert 279
-insert v
-insert 280
-insert v
-insert 281
-insert v
-insert 282
-insert v
-insert 283
-insert v
-insert 284
-insert v
-insert 285
-insert v
-insert 286
-insert v
-insert 287
-insert v
-insert 288
-insert v
-insert 289
-insert v
-insert 290
-insert v
-insert 291
-insert v
-insert 292
-insert v
-insert 293
-insert v
-insert 294
-insert v
-insert 295
-insert v
-insert 296
-insert v
-insert 297
-insert v
-insert 298
-insert v
-insert 299
-insert v
-insert 300
-insert v
-insert 301
-insert v
-insert 302
-insert v
-insert 303
-insert v
-insert 304
-insert v
-insert 305
-insert v
-insert 306
-insert v
-insert 307
-insert v
-insert 308
-insert v
-insert 309
-insert v
-insert 310
-insert v
-insert 311
-insert v
-insert 312
-insert v
-insert 313
-insert v
-insert 314
-insert v
-insert 315
-insert v
-insert 316
-insert v
-insert 317
-insert v
-insert 318
-insert v
-insert 319
-insert v
-insert 320
-insert v
-insert 321
-insert v
-insert 322
-insert v
-insert 323
-insert v
-insert 324
-insert v
-insert 325
-insert v
-insert 326
-insert v
-insert 327
-insert v
-insert 328
-insert v
-insert 329
-insert v
-insert 330
-insert v
-insert 331
-insert v
-insert 332
-insert v
-insert 333
-insert v
-insert 334
-insert v
-insert 335
-insert v
-insert 336
-insert v
-insert 337
-insert v
-insert 338
-insert v
-insert 339
-insert v
-insert 340
-insert v
-insert 341
-insert v
-insert 342
-insert v
-insert 343
-insert v
-insert 344
-insert v
-insert 345
-insert v
-insert 346
-insert v
-insert 347
-insert v
-insert 348
-insert v
-insert 349
-insert v
-insert 350
-insert v
-insert 351
-insert v
-insert 352
-insert v
-insert 353
-insert v
-insert 354
-insert v
-insert 355
-insert v
-insert 356
-insert v
-insert 357
-insert v
-insert 358
-insert v
-insert 359
-insert v
-insert 360
-insert v
-insert 361
-insert v
-insert 362
-insert v
-insert 363
-insert v
-insert 364
-insert v
-insert 365
-insert v
-insert 366
-insert v
-insert 367
-insert v
-insert 368
-insert v
-insert 369
-insert v
-insert 370
-insert v
-insert 371
-insert v
-insert 372
-insert v
-insert 373
-insert v
-insert 374
-insert v
-insert 375
-insert v
-insert 376
-insert v
-insert 377
-insert v
-insert 378
-insert v
-insert 379
-insert v
-insert 380
-insert v
-insert 381
-insert v
-insert 382
-insert v
-insert 383
-insert v
-insert 384
-insert v
-insert 385
-insert v
-insert 386
-insert v
-insert 387
-insert v
-insert 388
-insert v
-insert 389
-insert v
-insert 390
-insert v
-insert 391
-insert v
-insert 392
-insert v
-insert 393
-insert v
-insert 394
-insert v
-insert 395
-insert v
-insert 396
-insert v
-insert 397
-insert v
-insert 398
-insert v
-insert 399
-insert v
-insert 400
-insert v
-insert 401
-insert v
-insert 402
-insert v
-insert 403
-insert v
-insert 404
-insert v
-insert 405
-insert v
-insert 406
-insert v
-insert 407
-insert v
-insert 408
-insert v
-insert 409
-insert v
-insert 410
-insert v
-insert 411
-insert v
-insert 412
-insert v
-insert 413
-insert v
-insert 414
-insert v
-insert 415
-insert v
-insert 416
-insert v
-insert 417
-insert v
-insert 418
-insert v
-insert 419
-insert v
-insert 420
-insert v
-insert 421
-insert v
-insert 422
-insert v
-insert 423
-insert v
-insert 424
-insert v
-insert 425
-insert v
-insert 426
-insert v
-insert 427
-insert v
-insert 428
-insert v
-insert 429
-insert v
-insert 430
-insert v
-insert 431
-insert v
-insert 432
-insert v
-insert 433
-insert v
-insert 434
-insert v
-insert 435
-insert v
-insert 436
-insert v
-insert 437
-insert v
-insert 438
-insert v
-insert 439
-insert v
-insert 440
-insert v
-insert 441
-insert v
-insert 442
-insert v
-insert 443
-insert v
-insert 444
-insert v
-insert 445
-insert v
-insert 446
-insert v
-insert 447
-insert v
-insert 448
-insert v
-insert 449
-insert v
-insert 450
-insert v
-insert 451
-insert v
-insert 452
-insert v
-insert 453
-insert v
-insert 454
-insert v
-insert 455
-insert v
-insert 456
-insert v
-insert 457
-insert v
-insert 458
-insert v
-insert 459
-insert v
-insert 460
-insert v
-insert 461
-insert v
-insert 462
-insert v
-insert 463
-insert v
-insert 464
-insert v
-insert 465
-insert v
-insert 466
-insert v
-insert 467
-insert v
-insert 468
-insert v
-insert 469
-insert v
-insert 470
-insert v
-insert 471
-insert v
-insert 472
-insert v
-insert 473
-insert v
-insert 474
-insert v
-insert 475
-insert v
-insert 476
-insert v
-insert 477
-insert v
-insert 478
-insert v
-insert 479
-insert v
-insert 480
-insert v
-insert 481
-insert v
-insert 482
-insert v
-insert 483
-insert v
-insert 484
-insert v
-insert 485
-insert v
-insert 486
-insert v
-insert 487
-insert v
-insert 488
-insert v
-insert 489
-insert v
-insert 490
-insert v
-insert 491
-insert v
-insert 492
-insert v
-insert 493
-insert v
-insert 494
-insert v
-insert 495
-insert v
-insert 496
-insert v
-insert 497
-insert v
-insert 498
-insert v
-insert 499
-update v
-update 1
-update v
-update 2
-update v
-update 3
-update v
-update 4
-update v
-update 5
-update v
-update 6
-update v
-update 7
-update v
-update 8
-update v
-update 9
-update v
-update 10
-update v
-update 11
-update v
-update 12
-update v
-update 13
-update v
-update 14
-update v
-update 15
-update v
-update 16
-update v
-update 17
-update v
-update 18
-update v
-update 19
-update v
-update 20
-update v
-update 21
-update v
-update 22
-update v
-update 23
-update v
-update 24
-update v
-update 25
-update v
-update 26
-update v
-update 27
-update v
-update 28
-update v
-update 29
-update v
-update 30
-update v
-update 31
-update v
-update 32
-update v
-update 33
-update v
-update 34
-update v
-update 35
-update v
-update 36
-update v
-update 37
-update v
-update 38
-update v
-update 39
-update v
-update 40
-update v
-update 41
-update v
-update 42
-update v
-update 43
-update v
-update 44
-update v
-update 45
-update v
-update 46
-update v
-update 47
-update v
-update 48
-update v
-update 49
-update v
-update 50
-update v
-update 51
-update v
-update 52
-update v
-update 53
-update v
-update 54
-update v
-update 55
-update v
-update 56
-update v
-update 57
-update v
-update 58
-update v
-update 59
-update v
-update 60
-update v
-update 61
-update v
-update 62
-update v
-update 63
-update v
-update 64
-update v
-update 65
-update v
-update 66
-update v
-update 67
-update v
-update 68
-update v
-update 69
-update v
-update 70
-update v
-update 71
-update v
-update 72
-update v
-update 73
-update v
-update 74
-update v
-update 75
-update v
-update 76
-update v
-update 77
-update v
-update 78
-update v
-update 79
-update v
-update 80
-update v
-update 81
-update v
-update 82
-update v
-update 83
-update v
-update 84
-update v
-update 85
-update v
-update 86
-update v
-update 87
-update v
-update 88
-update v
-update 89
-update v
-update 90
-update v
-update 91
-update v
-update 92
-update v
-update 93
-update v
-update 94
-update v
-update 95
-update v
-update 96
-update v
-update 97
-update v
-update 98
-update v
-update 99
-update v
-update 100
-update v
-update 101
-update v
-update 102
-update v
-update 103
-update v
-update 104
-update v
-update 105
-update v
-update 106
-update v
-update 107
-update v
-update 108
-update v
-update 109
-update v
-update 110
-update v
-update 111
-update v
-update 112
-update v
-update 113
-update v
-update 114
-update v
-update 115
-update v
-update 116
-update v
-update 117
-update v
-update 118
-update v
-update 119
-update v
-update 120
-update v
-update 121
-update v
-update 122
-update v
-update 123
-update v
-update 124
-update v
-update 125
-update v
-update 126
-update v
-update 127
-update v
-update 128
-update v
-update 129
-update v
-update 130
-update v
-update 131
-update v
-update 132
-update v
-update 133
-update v
-update 134
-update v
-update 135
-update v
-update 136
-update v
-update 137
-update v
-update 138
-update v
-update 139
-update v
-update 140
-update v
-update 141
-update v
-update 142
-update v
-update 143
-update v
-update 144
-update v
-update 145
-update v
-update 146
-update v
-update 147
-update v
-update 148
-update v
-update 149
-update v
-update 150
-update v
-update 151
-update v
-update 152
-update v
-update 153
-update v
-update 154
-update v
-update 155
-update v
-update 156
-update v
-update 157
-update v
-update 158
-update v
-update 159
-update v
-update 160
-update v
-update 161
-update v
-update 162
-update v
-update 163
-update v
-update 164
-update v
-update 165
-update v
-update 166
-update v
-update 167
-update v
-update 168
-update v
-update 169
-update v
-update 170
-update v
-update 171
-update v
-update 172
-update v
-update 173
-update v
-update 174
-update v
-update 175
-update v
-update 176
-update v
-update 177
-update v
-update 178
-update v
-update 179
-update v
-update 180
-update v
-update 181
-update v
-update 182
-update v
-update 183
-update v
-update 184
-update v
-update 185
-update v
-update 186
-update v
-update 187
-update v
-update 188
-update v
-update 189
-update v
-update 190
-update v
-update 191
-update v
-update 192
-update v
-update 193
-update v
-update 194
-update v
-update 195
-update v
-update 196
-update v
-update 197
-update v
-update 198
-update v
-update 199
-update v
-update 200
-update v
-update 201
-update v
-update 202
-update v
-update 203
-update v
-update 204
-update v
-update 205
-update v
-update 206
-update v
-update 207
-update v
-update 208
-update v
-update 209
-update v
-update 210
-update v
-update 211
-update v
-update 212
-update v
-update 213
-update v
-update 214
-update v
-update 215
-update v
-update 216
-update v
-update 217
-update v
-update 218
-update v
-update 219
-update v
-update 220
-update v
-update 221
-update v
-update 222
-update v
-update 223
-update v
-update 224
-update v
-update 225
-update v
-update 226
-update v
-update 227
-update v
-update 228
-update v
-update 229
-update v
-update 230
-update v
-update 231
-update v
-update 232
-update v
-update 233
-update v
-update 234
-update v
-update 235
-update v
-update 236
-update v
-update 237
-update v
-update 238
-update v
-update 239
-update v
-update 240
-update v
-update 241
-update v
-update 242
-update v
-update 243
-update v
-update 244
-update v
-update 245
-update v
-update 246
-update v
-update 247
-update v
-update 248
-update v
-update 249
-update v
-update 250
-update v
-update 251
-update v
-update 252
-update v
-update 253
-update v
-update 254
-update v
-update 255
-update v
-update 256
-update v
-update 257
-update v
-update 258
-update v
-update 259
-update v
-update 260
-update v
-update 261
-update v
-update 262
-update v
-update 263
-update v
-update 264
-update v
-update 265
-update v
-update 266
-update v
-update 267
-update v
-update 268
-update v
-update 269
-update v
-update 270
-update v
-update 271
-update v
-update 272
-update v
-update 273
-update v
-update 274
-update v
-update 275
-update v
-update 276
-update v
-update 277
-update v
-update 278
-update v
-update 279
-update v
-update 280
-update v
-update 281
-update v
-update 282
-update v
-update 283
-update v
-update 284
-update v
-update 285
-update v
-update 286
-update v
-update 287
-update v
-update 288
-update v
-update 289
-update v
-update 290
-update v
-update 291
-update v
-update 292
-update v
-update 293
-update v
-update 294
-update v
-update 295
-update v
-update 296
-update v
-update 297
-update v
-update 298
-update v
-update 299
-update v
-update 300
-update v
-update 301
-update v
-update 302
-update v
-update 303
-update v
-update 304
-update v
-update 305
-update v
-update 306
-update v
-update 307
-update v
-update 308
-update v
-update 309
-update v
-update 310
-update v
-update 311
-update v
-update 312
-update v
-update 313
-update v
-update 314
-update v
-update 315
-update v
-update 316
-update v
-update 317
-update v
-update 318
-update v
-update 319
-update v
-update 320
-update v
-update 321
-update v
-update 322
-update v
-update 323
-update v
-update 324
-update v
-update 325
-update v
-update 326
-update v
-update 327
-update v
-update 328
-update v
-update 329
-update v
-update 330
-update v
-update 331
-update v
-update 332
-update v
-update 333
-update v
-update 334
-update v
-update 335
-update v
-update 336
-update v
-update 337
-update v
-update 338
-update v
-update 339
-update v
-update 340
-update v
-update 341
-update v
-update 342
-update v
-update 343
-update v
-update 344
-update v
-update 345
-update v
-update 346
-update v
-update 347
-update v
-update 348
-update v
-update 349
-update v
-update 350
-update v
-update 351
-update v
-update 352
-update v
-update 353
-update v
-update 354
-update v
-update 355
-update v
-update 356
-update v
-update 357
-update v
-update 358
-update v
-update 359
-update v
-update 360
-update v
-update 361
-update v
-update 362
-update v
-update 363
-update v
-update 364
-update v
-update 365
-update v
-update 366
-update v
-update 367
-update v
-update 368
-update v
-update 369
-update v
-update 370
-update v
-update 371
-update v
-update 372
-update v
-update 373
-update v
-update 374
-update v
-update 375
-update v
-update 376
-update v
-update 377
-update v
-update 378
-update v
-update 379
-update v
-update 380
-update v
-update 381
-update v
-update 382
-update v
-update 383
-update v
-update 384
-update v
-update 385
-update v
-update 386
-update v
-update 387
-update v
-update 388
-update v
-update 389
-update v
-update 390
-update v
-update 391
-update v
-update 392
-update v
-update 393
-update v
-update 394
-update v
-update 395
-update v
-update 396
-update v
-update 397
-update v
-update 398
-update v
-update 399
-update v
-update 400
-update v
-update 401
-update v
-update 402
-update v
-update 403
-update v
-update 404
-update v
-update 405
-update v
-update 406
-update v
-update 407
-update v
-update 408
-update v
-update 409
-update v
-update 410
-update v
-update 411
-update v
-update 412
-update v
-update 413
-update v
-update 414
-update v
-update 415
-update v
-update 416
-update v
-update 417
-update v
-update 418
-update v
-update 419
-update v
-update 420
-update v
-update 421
-update v
-update 422
-update v
-update 423
-update v
-update 424
-update v
-update 425
-update v
-update 426
-update v
-update 427
-update v
-update 428
-update v
-update 429
-update v
-update 430
-update v
-update 431
-update v
-update 432
-update v
-update 433
-update v
-update 434
-update v
-update 435
-update v
-update 436
-update v
-update 437
-update v
-update 438
-update v
-update 439
-update v
-update 440
-update v
-update 441
-update v
-update 442
-update v
-update 443
-update v
-update 444
-update v
-update 445
-update v
-update 446
-update v
-update 447
-update v
-update 448
-update v
-update 449
-update v
-update 450
-update v
-update 451
-update v
-update 452
-update v
-update 453
-update v
-update 454
-update v
-update 455
-update v
-update 456
-update v
-update 457
-update v
-update 458
-update v
-update 459
-update v
-update 460
-update v
-update 461
-update v
-update 462
-update v
-update 463
-update v
-update 464
-update v
-update 465
-update v
-update 466
-update v
-update 467
-update v
-update 468
-update v
-update 469
-update v
-update 470
-update v
-update 471
-update v
-update 472
-update v
-update 473
-update v
-update 474
-update v
-update 475
-update v
-update 476
-update v
-update 477
-update v
-update 478
-update v
-update 479
-update v
-update 480
-update v
-update 481
-update v
-update 482
-update v
-update 483
-update v
-update 484
-update v
-update 485
-update v
-update 486
-update v
-update 487
-update v
-update 488
-update v
-update 489
-update v
-update 490
-update v
-update 491
-update v
-update 492
-update v
-update 493
-update v
-update 494
-update v
-update 495
-update v
-update 496
-update v
-update 497
-update v
-update 498
-update v
-update 499
-SELECT count(*) FROM t1;
+SELECT count(*) FROM tj9;
count(*)
-500
+499
DROP TABLE tj9;
DROP PROCEDURE pj9;
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_23189.result' => 'mysql-test/suite/falcon/r/falcon_bug_23189.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_23189.result 2008-07-02 11:20:15 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_23189.result 2008-09-15 12:07:42 +0000
@@ -1,5 +1,5 @@
-SET STORAGE_ENGINE = Falcon;
*** Bug #23189 ***
+SET @@storage_engine = 'Falcon';
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1 (a varchar(1100));
@@ -11,6 +11,11 @@ CREATE INDEX i ON t2 (a);
Warnings:
Warning 1071 Specified key was too long; max key length is 1100 bytes
Warning 1071 Specified key was too long; max key length is 1100 bytes
-Warning 1071 Specified key was too long; max key length is 1100 bytes
+SELECT count(*) FROM t1;
+count(*)
+1
+SELECT count(*) FROM t2;
+count(*)
+1
DROP TABLE t1;
DROP TABLE t2;
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_23945.result' => 'mysql-test/suite/falcon/r/falcon_bug_23945.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_23945.result 2008-09-09 08:30:18 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_23945.result 2008-10-02 10:37:27 +0000
@@ -15,3 +15,5 @@ SELECT * FROM t1;
ERROR 42S02: Table 'test.t1' doesn't exist
DROP TABLE t1;
ERROR 42S02: Unknown table 't1'
+CREATE TABLE t1(a INT);
+DROP TABLE t1;
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_30282.result' => 'mysql-test/suite/falcon/r/falcon_bug_30282.result'
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_30480_A.result' => 'mysql-test/suite/falcon/r/falcon_bug_30480_A.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_30480_A.result 2008-04-23 08:50:47 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_30480_A.result 2008-09-12 23:28:15 +0000
@@ -1,21 +1,18 @@
-SET storage_engine = Falcon;
*** Bug #30480 ***
+SET @@storage_engine = 'Falcon';
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
-CREATE TABLE t1 (s1 varchar(5) CHARACTER SET latin1);
SET NAMES utf8;
-CREATE INDEX id on t1 (s1);
+CREATE TABLE t1 (s1 varchar(5) CHARACTER SET latin1, INDEX id (s1));
+CREATE TABLE t2 (s1 varchar(5) CHARACTER SET latin1, INDEX id (s1)) partition by key(s1);
INSERT INTO t1 VALUES (0x8e);
INSERT INTO t1 VALUES ('AA');
+INSERT INTO t2 VALUES (0x8e);
+INSERT INTO t2 VALUES ('AA');
SELECT s1, HEX(s1) FROM t1;
s1 HEX(s1)
Ž 8E
AA 4141
-CREATE TABLE t2 (s1 varchar(5) CHARACTER SET latin1) partition by key(s1);
-SET NAMES utf8;
-CREATE INDEX id on t2 (s1);
-INSERT INTO t2 VALUES (0x8e);
-INSERT INTO t2 VALUES ('AA');
SELECT s1, HEX(s1) FROM t2;
s1 HEX(s1)
Ž 8E
@@ -26,4 +23,11 @@ AA 4141
SELECT s1, HEX(s1) FROM t2 WHERE s1 like 'A%';
s1 HEX(s1)
AA 4141
+SELECT count(*) FROM t1;
+count(*)
+2
+SELECT count(*) FROM t2;
+count(*)
+2
DROP TABLE t1;
+DROP TABLE t2;
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_30480_B.result' => 'mysql-test/suite/falcon/r/falcon_bug_30480_B.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_30480_B.result 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_30480_B.result 2008-09-12 23:44:47 +0000
@@ -1,11 +1,12 @@
-SET storage_engine = Falcon;
*** Bug #30480 ***
+SET @@storage_engine = 'Falcon';
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
-CREATE TABLE t1 (s1 varchar(5) CHARACTER SET ucs2);
-CREATE INDEX i1 on t1 (s1);
-INSERT INTO t1 VALUES ('c'),('c'),(0x00c3);
SET NAMES utf8;
+CREATE TABLE t1 (s1 varchar(5) CHARACTER SET ucs2, INDEX i1 (s1));
+CREATE TABLE t2 (s1 varchar(5) CHARACTER SET ucs2, INDEX i1 (s1)) partition by key(s1);
+INSERT INTO t1 VALUES ('c'),('c'),(0x00c3);
+INSERT INTO t2 VALUES ('c'),('c'),(0x00c3);
SELECT s1, HEX(s1) FROM t1;
s1 HEX(s1)
c 0063
@@ -17,10 +18,6 @@ s1 HEX(s1)
SELECT s1, HEX(s1) FROM t1 WHERE s1 = 'Ã';
s1 HEX(s1)
à 00C3
-CREATE TABLE t2 (s1 varchar(5) CHARACTER SET ucs2) partition by key(s1);
-CREATE INDEX i1 on t2 (s1);
-INSERT INTO t2 VALUES ('c'),('c'),(0x00c3);
-SET NAMES utf8;
SELECT s1, HEX(s1) FROM t2;
s1 HEX(s1)
c 0063
@@ -32,5 +29,11 @@ s1 HEX(s1)
SELECT s1, HEX(s1) FROM t2 WHERE s1 = 'Ã';
s1 HEX(s1)
ount(*) FROM t2;
+count(*)
+3
DROP TABLE t1;
DROP TABLE t2;
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_30826.result' => 'mysql-test/suite/falcon/r/falcon_bug_30826.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_30826.result 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_30826.result 2008-09-14 14:09:45 +0000
@@ -1,20 +1,27 @@
*** Bug #30826 ***
-SET @@storage_engine = Falcon;
+SET @@storage_engine = 'Falcon';
DROP TABLE IF EXISTS t1;
------- Test 1 - optimize with records -------
-CREATE TABLE t1 (PRIMARY KEY (`id`),
-`id` BIGINT NOT NULL AUTO_INCREMENT ,
-`field1` CHAR(50) NOT NULL)ENGINE = FALCON
+CREATE TABLE t1 (
+`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+`field1` CHAR(50) NOT NULL)
PARTITION BY Hash (id) PARTITIONS 4;
INSERT INTO t1 (`id`, `field1`) VALUES('3','value3');
INSERT INTO t1 (`id`, `field1`) VALUES('5','value5');
INSERT INTO t1 (`id`, `field1`) VALUES('7','value7');
ALTER TABLE t1 OPTIMIZE PARTITION `p1`;
+Table Op Msg_type Msg_text
+test.t1 optimize status OK
+SELECT count(*) FROM t1;
+count(*)
+3
------- Test 2 - optimize without records ------
DROP TABLE t1;
-CREATE TABLE t1 (PRIMARY KEY (`id`),
-`id` BIGINT NOT NULL AUTO_INCREMENT ,
-`field1` CHAR(50) NOT NULL)ENGINE = FALCON
+CREATE TABLE t1 (
+`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+`field1` CHAR(50) NOT NULL)
PARTITION BY Hash (id) PARTITIONS 4;
ALTER TABLE t1 OPTIMIZE PARTITION `p1`;
+Table Op Msg_type Msg_text
+test.t1 optimize status OK
DROP TABLE t1;
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_34351_C.result' => 'mysql-test/suite/falcon/r/falcon_bug_34351_C.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_34351_C.result 2008-04-24 04:09:39 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_34351_C.result 2008-09-28 08:07:30 +0000
@@ -35,7 +35,5 @@ CALL p1();
CALL p1();
# Switch to connection default
# Pull the results of the preceeding call p1()
-SELECT count(*) FROM t1;
-count(*)
-0
DROP PROCEDURE p1;
+DROP TABLE t1;
=== modified file 'mysql-test/suite/falcon/r/falcon_bug_34890.result'
--- a/mysql-test/suite/falcon/r/falcon_bug_34890.result 2008-03-27 16:50:16 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_34890.result 2008-10-06 19:17:21 +0000
@@ -16,7 +16,7 @@ CREATE TABLE t1 (
t1_autoinc INTEGER NOT NULL AUTO_INCREMENT,
t1_uuid CHAR(36),
PRIMARY KEY (t1_autoinc)
-) ENGINE = Falcon;
+);
CREATE PROCEDURE p1 ()
begin
DECLARE my_count INT DEFAULT 0;
=== renamed file 'mysql-test/suite/falcon_team/r/falcon_bug_34892.result' => 'mysql-test/suite/falcon/r/falcon_bug_34892.result'
=== added file 'mysql-test/suite/falcon/r/falcon_bug_39692.result'
--- a/mysql-test/suite/falcon/r/falcon_bug_39692.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_39692.result 2008-09-27 06:35:07 +0000
@@ -0,0 +1,8 @@
+*** Bug #39692 ***
+SET @@storage_engine = 'Falcon';
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (a int);
+SELECT file FROM information_schema.falcon_system_memory_detail
+WHERE file = 'SectorCache.cpp';
+file
+DROP TABLE t1;
=== modified file 'mysql-test/suite/falcon/r/falcon_online_index.result'
--- a/mysql-test/suite/falcon/r/falcon_online_index.result 2008-09-10 15:08:56 +0000
+++ b/mysql-test/suite/falcon/r/falcon_online_index.result 2008-10-03 05:15:40 +0000
@@ -72,14 +72,14 @@ affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
#-------- Testing implicit OFFLINE --------#
ALTER TABLE t3 ADD INDEX ix_c (c);
-affected rows: 1000
-info: Records: 1000 Duplicates: 0 Warnings: 0
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
DROP INDEX ix_c ON t3;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE t3 ADD INDEX ix_cd (c, d);
-affected rows: 1000
-info: Records: 1000 Duplicates: 0 Warnings: 0
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
DROP INDEX ix_cd ON t3;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
@@ -108,10 +108,8 @@ a b c d e
ALTER ONLINE TABLE t3 DROP INDEX ix_b;
#-------- ONLINE: ALTER ADD not-null with default --------#
ALTER ONLINE TABLE t3 ADD INDEX ix_c (c);
-ERROR 42000: This version of MySQL doesn't yet support 'ALTER ONLINE TABLE t3 ADD INDEX ix_c (c)'
#-------- ONLINE: ALTER ADD not-null --------#
ALTER ONLINE TABLE t3 ADD INDEX ix_d (d);
-ERROR 42000: This version of MySQL doesn't yet support 'ALTER ONLINE TABLE t3 ADD INDEX ix_d (d)'
#-------- ONLINE: ALTER ADD same key multiple times --------#
ALTER ONLINE TABLE t1 ADD INDEX index_c (c);
ALTER ONLINE TABLE t1 ADD INDEX index_c (c);
@@ -171,6 +169,8 @@ ALTER ONLINE TABLE t3 ADD INDEX ix_asc_b
SHOW INDEXES FROM t3;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_Comment
t3 0 PRIMARY 1 a NULL 500 NULL NULL BTREE
+t3 1 ix_c 1 c NULL 500 NULL NULL BTREE
+t3 1 ix_d 1 d NULL 500 NULL NULL BTREE
t3 1 ix_desc_b 1 b NULL 500 NULL NULL YES BTREE
t3 1 ix_asc_b 1 b NULL 500 NULL NULL YES BTREE
DROP ONLINE INDEX ix_desc_b ON t3;
@@ -265,6 +265,8 @@ t1 1 index_int 1 c NULL 10 NULL NULL YES
SHOW INDEXES FROM t3;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_Comment
t3 0 PRIMARY 1 a NULL 500 NULL NULL BTREE
+t3 1 ix_c 1 c NULL 500 NULL NULL BTREE
+t3 1 ix_d 1 d NULL 500 NULL NULL BTREE
t3 1 index_int 1 b NULL 500 NULL NULL YES BTREE
t3 1 index_multi 1 b NULL 250 NULL NULL YES BTREE
t3 1 index_multi 2 e NULL 500 NULL NULL YES BTREE
@@ -283,6 +285,8 @@ t1 0 PRIMARY 1 a NULL 10 NULL NULL BTRE
SHOW INDEXES FROM t3;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_Comment
t3 0 PRIMARY 1 a NULL 500 NULL NULL BTREE
+t3 1 ix_c 1 c NULL 500 NULL NULL BTREE
+t3 1 ix_d 1 d NULL 500 NULL NULL BTREE
#-------- Test: Combined ADD/DROP INDEX in a single statement --------#
ALTER TABLE t1 ADD INDEX index_int (c);
ALTER TABLE t1 ADD INDEX index_char (d), DROP INDEX index_int;
@@ -344,7 +348,7 @@ a b c d a b c d
16 TestRow16 32 Char16 31 62 32 SomeString 31 for testing
EXPLAIN SELECT * FROM t1, t3 WHERE t3.b=2 AND (t1.c = t3.c OR t1.a=t3.d);
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t3 ref ix_b ix_b 5 const 100
+1 SIMPLE t3 ref ix_c,ix_d,ix_b ix_b 5 const 100
1 SIMPLE t1 ALL PRIMARY,ix_a,ix_c NULL NULL NULL 20 Range checked for each record (index map: 0xB)
SELECT * FROM t1, t3 WHERE t3.b=2 AND (t1.c = t3.c OR t1.a=t3.d);
a b c d a b c d e
@@ -367,6 +371,8 @@ t2 0 PRIMARY 1 a NULL 16 NULL NULL BTRE
SHOW INDEXES FROM t3;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_Comment
t3 0 PRIMARY 1 a NULL 500 NULL NULL BTREE
+t3 1 ix_c 1 c NULL 500 NULL NULL BTREE
+t3 1 ix_d 1 d NULL 500 NULL NULL BTREE
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
=== renamed file 'mysql-test/suite/falcon_team/r/ps_8falcon.result' => 'mysql-test/suite/falcon/r/ps_8falcon.result'
--- a/mysql-test/suite/falcon_team/r/ps_8falcon.result 2008-04-23 08:50:47 +0000
+++ b/mysql-test/suite/falcon/r/ps_8falcon.result 2008-09-19 09:12:48 +0000
@@ -1738,7 +1738,7 @@ set @arg14= 'abc';
set @arg14= NULL ;
set @arg15= CAST('abc' as binary) ;
set @arg15= NULL ;
-create table t5 as select
+create table t5 engine = MyISAM as select
8 as const01, @arg01 as param01,
8.0 as const02, @arg02 as param02,
80.00000000000e-1 as const03, @arg03 as param03,
=== modified file 'mysql-test/suite/falcon/t/falcon_bug_22154-big.test'
--- a/mysql-test/suite/falcon/t/falcon_bug_22154-big.test 2008-04-25 10:46:09 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_22154-big.test 2008-09-19 09:12:48 +0000
@@ -1,5 +1,6 @@
--source include/have_falcon.inc
--source include/big_test.inc
+
#
# Bug #22154: Crash after 500 alters, 500 inserts, and a few updates
#
@@ -23,7 +24,6 @@ create procedure pj9 ()
begin
declare v int default 1;
while v < 500 do
- select 'alter',v;
set @v = concat('alter table tj9 add column s',v,' char(64) default ''Hello World''');
prepare stmt1 from @v;
execute stmt1;
@@ -31,13 +31,11 @@ begin
end while;
set v = 1;
while v < 500 do
- select 'insert',v;
insert into tj9 (s1) values (v);
set v = v + 1;
end while;
set v = 1;
while v < 500 do
- select 'update',v;
set @v = concat('update tj9 set s',v,'=concat(s2,s1)');
prepare stmt1 from @v;
execute stmt1;
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_23189.test' => 'mysql-test/suite/falcon/t/falcon_bug_23189.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_23189.test 2008-07-02 11:20:15 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_23189.test 2008-09-15 12:07:42 +0000
@@ -1,14 +1,25 @@
--source include/have_falcon.inc
-SET STORAGE_ENGINE = Falcon;
+
#
# Bug #23189 Falcon: crash if create index for long varchar
#
--echo *** Bug #23189 ***
+
+# ----------------------------------------------------- #
+# --- Initialisation --- #
+# ----------------------------------------------------- #
+let $engine = 'Falcon';
+eval SET @@storage_engine = $engine;
+
--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
--enable_warnings
+# ----------------------------------------------------- #
+# --- Test --- #
+# ----------------------------------------------------- #
+
CREATE TABLE t1 (a varchar(1100));
INSERT INTO t1 VALUES (repeat('r',1100));
CREATE INDEX i ON t1 (a);
@@ -17,6 +28,14 @@ CREATE TABLE t2 (a varchar(20000));
INSERT INTO t2 VALUES (repeat('r',20000));
CREATE INDEX i ON t2 (a);
-# Final cleanup.
+# ----------------------------------------------------- #
+# --- Check --- #
+# ----------------------------------------------------- #
+SELECT count(*) FROM t1;
+SELECT count(*) FROM t2;
+
+# ----------------------------------------------------- #
+# --- Final cleanup --- #
+# ----------------------------------------------------- #
DROP TABLE t1;
DROP TABLE t2;
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_23945.test' => 'mysql-test/suite/falcon/t/falcon_bug_23945.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_23945.test 2008-09-09 08:30:18 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_23945.test 2008-10-02 10:37:27 +0000
@@ -36,6 +36,9 @@ SELECT * FROM t1;
--error ER_BAD_TABLE_ERROR
DROP TABLE t1;
+CREATE TABLE t1(a INT);
+DROP TABLE t1;
+
# ----------------------------------------------------- #
# --- Check --- #
# ----------------------------------------------------- #
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_30282.test' => 'mysql-test/suite/falcon/t/falcon_bug_30282.test'
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_30480_A.test' => 'mysql-test/suite/falcon/t/falcon_bug_30480_A.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_30480_A.test 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_30480_A.test 2008-09-15 01:36:19 +0000
@@ -1,45 +1,47 @@
--source include/have_falcon.inc
---disable_abort_on_error
-SET storage_engine = Falcon;
+--source include/have_partition.inc
+
#
# Bug #30480: Falcon: searches fail if LIKE and key partition
#
--echo *** Bug #30480 ***
+
+# ----------------------------------------------------- #
+# --- Initialisation --- #
+# ----------------------------------------------------- #
+let $engine = 'Falcon';
+eval SET @@storage_engine = $engine;
+
--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
--enable_warnings
-###########################################################################
-# Description:
-# create a Falcon table with a latin1 column with a default collation.
-# The table is partitioned and indexed.
-# insert two rows, containing 'Ä' and 'AA'.
-# search for LIKE 'A%'.
-# get no rows, even though I inserted 'AA'.
-#
-# The result is similar to Bug#28527
-# But Bug#28527 requires an ascii() function, which should soon be
-# illegal, so it will probably disappear.
-# This is different: a key partition, no
-# ascii() function, a non-ASCII value, and a default collation.
-
-CREATE TABLE t1 (s1 varchar(5) CHARACTER SET latin1);
SET NAMES utf8;
-CREATE INDEX id on t1 (s1);
+CREATE TABLE t1 (s1 varchar(5) CHARACTER SET latin1, INDEX id (s1));
+CREATE TABLE t2 (s1 varchar(5) CHARACTER SET latin1, INDEX id (s1)) partition by key(s1);
INSERT INTO t1 VALUES (0x8e);
INSERT INTO t1 VALUES ('AA');
-SELECT s1, HEX(s1) FROM t1;
-
-CREATE TABLE t2 (s1 varchar(5) CHARACTER SET latin1) partition by key(s1);
-SET NAMES utf8;
-CREATE INDEX id on t2 (s1);
INSERT INTO t2 VALUES (0x8e);
INSERT INTO t2 VALUES ('AA');
+
+# ----------------------------------------------------- #
+# --- Test --- #
+# ----------------------------------------------------- #
+SELECT s1, HEX(s1) FROM t1;
SELECT s1, HEX(s1) FROM t2;
SELECT s1, HEX(s1) FROM t1 WHERE s1 like 'A%';
SELECT s1, HEX(s1) FROM t2 WHERE s1 like 'A%';
-# Final cleanup.
+# ----------------------------------------------------- #
+# --- Check --- #
+# ----------------------------------------------------- #
+SELECT count(*) FROM t1;
+SELECT count(*) FROM t2;
+
+# ----------------------------------------------------- #
+# --- Final cleanup --- #
+# ----------------------------------------------------- #
DROP TABLE t1;
+DROP TABLE t2;
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_30480_B.test' => 'mysql-test/suite/falcon/t/falcon_bug_30480_B.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_30480_B.test 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_30480_B.test 2008-09-15 01:36:19 +0000
@@ -1,36 +1,47 @@
--source include/have_falcon.inc
---disable_abort_on_error
-SET storage_engine = Falcon;
+--source include/have_partition.inc
+
#
# Bug #30480: Falcon: searches fail if LIKE and key partition
#
--echo *** Bug #30480 ***
+
+# ----------------------------------------------------- #
+# --- Initialisation --- #
+# ----------------------------------------------------- #
+let $engine = 'Falcon';
+eval SET @@storage_engine = $engine;
+
--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
--enable_warnings
-###########################################################################
-# Here is another test case, this time with a ucs2 column.
-# The character 'A with tilde', 'Ã', is U+00C3.
-# Both selects should return 0x00c3.
-
-CREATE TABLE t1 (s1 varchar(5) CHARACTER SET ucs2);
-CREATE INDEX i1 on t1 (s1);
-INSERT INTO t1 VALUES ('c'),('c'),(0x00c3);
SET NAMES utf8;
+CREATE TABLE t1 (s1 varchar(5) CHARACTER SET ucs2, INDEX i1 (s1));
+CREATE TABLE t2 (s1 varchar(5) CHARACTER SET ucs2, INDEX i1 (s1)) partition by key(s1);
+INSERT INTO t1 VALUES ('c'),('c'),(0x00c3);
+INSERT INTO t2 VALUES ('c'),('c'),(0x00c3);
+
+# ----------------------------------------------------- #
+# --- Test --- #
+# ----------------------------------------------------- #
SELECT s1, HEX(s1) FROM t1;
SELECT s1, HEX(s1) FROM t1 WHERE s1 like 'Ã%';
SELECT s1, HEX(s1) FROM t1 WHERE s1 = 'Ã';
-CREATE TABLE t2 (s1 varchar(5) CHARACTER SET ucs2) partition by key(s1);
-CREATE INDEX i1 on t2 (s1);
-INSERT INTO t2 VALUES ('c'),('c'),(0x00c3);
-SET NAMES utf8;
SELECT s1, HEX(s1) FROM t2;
SELECT s1, HEX(s1) FROM t2 WHERE s1 like 'Ã%';
SELECT s1, HEX(s1) FROM t2 WHERE s1 = 'Ã';
-# Final cleanup.
+# ----------------------------------------------------- #
+# --- Check --- #
+# ----------------------------------------------------- #
+SELECT count(*) FROM t1;
+SELECT count(*) FROM t2;
+
+# ----------------------------------------------------- #
+# --- Final cleanup --- #
+# ----------------------------------------------------- #
DROP TABLE t1;
DROP TABLE t2;
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_30826.test' => 'mysql-test/suite/falcon/t/falcon_bug_30826.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_30826.test 2008-04-28 21:07:04 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_30826.test 2008-09-14 14:09:45 +0000
@@ -1,5 +1,6 @@
--source include/have_falcon.inc
--source include/have_partition.inc
+
#
# Bug #30826: Falcon: crash if OPTIMIZE PARTITION and no records
#
@@ -8,7 +9,7 @@
# ----------------------------------------------------- #
# --- Initialisation --- #
# ----------------------------------------------------- #
-SET @@storage_engine = Falcon;
+SET @@storage_engine = 'Falcon';
--disable_warnings
DROP TABLE IF EXISTS t1;
@@ -18,37 +19,29 @@ DROP TABLE IF EXISTS t1;
# --- Test 1 - optimize with records --- #
# ----------------------------------------------------- #
--echo ------- Test 1 - optimize with records -------
-CREATE TABLE t1 (PRIMARY KEY (`id`),
- `id` BIGINT NOT NULL AUTO_INCREMENT ,
- `field1` CHAR(50) NOT NULL)ENGINE = FALCON
+CREATE TABLE t1 (
+ `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ `field1` CHAR(50) NOT NULL)
PARTITION BY Hash (id) PARTITIONS 4;
INSERT INTO t1 (`id`, `field1`) VALUES('3','value3');
INSERT INTO t1 (`id`, `field1`) VALUES('5','value5');
INSERT INTO t1 (`id`, `field1`) VALUES('7','value7');
-#at the moment, alter table returns not implemented, will return 0 after WL#4176 is done
---disable_result_log
---error 0,ER_CHECK_NOT_IMPLEMENTED
ALTER TABLE t1 OPTIMIZE PARTITION `p1`;
---enable_result_log
+SELECT count(*) FROM t1;
# ----------------------------------------------------- #
-# --- Test 2 - optimize without records --- #
+# --- Test 2 - optimize without records --- #
# ----------------------------------------------------- #
--echo ------- Test 2 - optimize without records ------
DROP TABLE t1;
-CREATE TABLE t1 (PRIMARY KEY (`id`),
- `id` BIGINT NOT NULL AUTO_INCREMENT ,
- `field1` CHAR(50) NOT NULL)ENGINE = FALCON
+CREATE TABLE t1 (
+ `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ `field1` CHAR(50) NOT NULL)
PARTITION BY Hash (id) PARTITIONS 4;
-# This caused Falcon to crash...
-#at the moment, alter table returns not implemented, will return 0 after WL#4176 is done
---disable_result_log
---error 0,ER_CHECK_NOT_IMPLEMENTED
ALTER TABLE t1 OPTIMIZE PARTITION `p1`;
---enable_result_log
# ----------------------------------------------------- #
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_34351_C.test' => 'mysql-test/suite/falcon/t/falcon_bug_34351_C.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_34351_C.test 2008-04-24 04:09:39 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_34351_C.test 2008-09-28 08:07:30 +0000
@@ -1,4 +1,5 @@
--source include/have_falcon.inc
+
#
# Bug #34351_C: Update Conflict on non-overlapping transactions
# This test works because it uses FALCON_CONSISTENT_READ=OFF
@@ -30,8 +31,6 @@ CREATE TABLE t1 (
PRIMARY KEY (t1_autoinc), key(t1_uuid)
) ENGINE = Falcon;
-# declare continue handler for sqlexception
-
delimiter //;
CREATE PROCEDURE p1 ()
begin
@@ -77,14 +76,14 @@ connection default;
--echo # Pull the results of the preceeding call p1()
--reap
-
# ----------------------------------------------------- #
# --- Check --- #
# ----------------------------------------------------- #
# Checking row count is not applicable here.
-SELECT count(*) FROM t1;
+#SELECT count(*) FROM t1;
# ----------------------------------------------------- #
# --- Final cleanup --- #
# ----------------------------------------------------- #
DROP PROCEDURE p1;
+DROP TABLE t1;
=== modified file 'mysql-test/suite/falcon/t/falcon_bug_34890.test'
--- a/mysql-test/suite/falcon/t/falcon_bug_34890.test 2008-03-27 16:50:16 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_34890.test 2008-10-06 19:17:21 +0000
@@ -1,9 +1,10 @@
--source include/have_falcon.inc
+
#
# Bug #34890: Update Conflict on non-overlapping transactions
-# This test works because it uses FALCON_CONSISTENT_READ=OFF
-# This test is different from 34351_C in that there is no index
-# on t1_uuid.
+# This test works because it uses FALCON_CONSISTENT_READ=OFF
+# This test is different from 34351_C in that there is no index
+# on t1_uuid.
#
--echo *** Bug #34890 ***
@@ -42,9 +43,7 @@ CREATE TABLE t1 (
t1_autoinc INTEGER NOT NULL AUTO_INCREMENT,
t1_uuid CHAR(36),
PRIMARY KEY (t1_autoinc)
-) ENGINE = Falcon;
-
-# declare continue handler for sqlexception
+);
delimiter //;
CREATE PROCEDURE p1 ()
@@ -64,7 +63,6 @@ delimiter ;//
# ----------------------------------------------------- #
# --- Test --- #
# ----------------------------------------------------- #
-
--echo # Switch to connection conn1
connection conn1;
--echo # Send call p1() to the server but do not pull the results
@@ -110,11 +108,9 @@ connection conn4;
--echo # Pull the results of the preceeding call p1() by conn4
--reap
-
--echo # Switch to connection default
connection default;
-
# ----------------------------------------------------- #
# --- Check --- #
# ----------------------------------------------------- #
=== renamed file 'mysql-test/suite/falcon_team/t/falcon_bug_34892.test' => 'mysql-test/suite/falcon/t/falcon_bug_34892.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_34892.test 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_34892.test 2008-10-06 19:17:21 +0000
@@ -1,6 +1,7 @@
--source include/have_falcon.inc
+
#
-# Bug #34892: Some falcon tests fail sporadically
+# Bug #34892: Transaction handling in select_create::abort let's Falcon fail
#
--echo *** Bug #34892 ***
@@ -21,8 +22,6 @@ SET @@autocommit = 0;
--error ER_DUP_ENTRY
CREATE TABLE t1 (PRIMARY KEY (a)) SELECT 1 AS a UNION ALL SELECT 1;
-# This CREATE TABLE provokes a
-# 1005: Can't create table 'test.t1' (errno: 156).
CREATE TABLE t1 (a int);
# ----------------------------------------------------- #
=== added file 'mysql-test/suite/falcon/t/falcon_bug_39692.test'
--- a/mysql-test/suite/falcon/t/falcon_bug_39692.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_39692.test 2008-09-27 18:04:19 +0000
@@ -0,0 +1,36 @@
+--source include/have_falcon.inc
+--source include/have_debug.inc
+
+#
+# Bug #39692: Falcon allocates SectorCache even if falcon_use_sectorcache is OFF
+#
+--echo *** Bug #39692 ***
+
+# ----------------------------------------------------- #
+# --- Initialisation --- #
+# ----------------------------------------------------- #
+let $engine = 'Falcon';
+eval SET @@storage_engine = $engine;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+CREATE TABLE t1 (a int);
+
+# ----------------------------------------------------- #
+# --- Test --- #
+# ----------------------------------------------------- #
+SELECT file FROM information_schema.falcon_system_memory_detail
+ WHERE file = 'SectorCache.cpp';
+
+# ----------------------------------------------------- #
+# --- Check --- #
+# ----------------------------------------------------- #
+# Check not applicable in this test.
+#SELECT count(*) FROM t1;
+
+# ----------------------------------------------------- #
+# --- Final cleanup --- #
+# ----------------------------------------------------- #
+DROP TABLE t1;
=== modified file 'mysql-test/suite/falcon/t/falcon_online_index.test'
--- a/mysql-test/suite/falcon/t/falcon_online_index.test 2008-09-10 15:08:56 +0000
+++ b/mysql-test/suite/falcon/t/falcon_online_index.test 2008-10-03 05:15:40 +0000
@@ -163,14 +163,12 @@ ALTER ONLINE TABLE t3 DROP INDEX ix_b;
--echo #-------- ONLINE: ALTER ADD not-null with default --------#
-# Test that ALTER ONLINE ... ADD INDEX fails with ONLINE for non-nullable column having default value
---error ER_NOT_SUPPORTED_YET
+# Test that ALTER ONLINE ... ADD INDEX succeeds with ONLINE for non-nullable column having default value
ALTER ONLINE TABLE t3 ADD INDEX ix_c (c);
--echo #-------- ONLINE: ALTER ADD not-null --------#
-# Test that ALTER ONLINE ... ADD INDEX fails with ONLINE for non-nullable columns
---error ER_NOT_SUPPORTED_YET
+# Test that ALTER ONLINE ... ADD INDEX succeeds with ONLINE for non-nullable columns
ALTER ONLINE TABLE t3 ADD INDEX ix_d (d);
--echo #-------- ONLINE: ALTER ADD same key multiple times --------#
=== removed file 'mysql-test/suite/falcon/t/falcon_page_size_1-master.opt'
--- a/mysql-test/suite/falcon/t/falcon_page_size_1-master.opt 2007-11-28 18:46:31 +0000
+++ b/mysql-test/suite/falcon/t/falcon_page_size_1-master.opt 1970-01-01 00:00:00 +0000
@@ -1 +0,0 @@
---loose-falcon_page_size=1024
=== renamed file 'mysql-test/suite/falcon_team/t/ps_8falcon.test' => 'mysql-test/suite/falcon/t/ps_8falcon.test'
--- a/mysql-test/suite/falcon_team/t/ps_8falcon.test 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon/t/ps_8falcon.test 2008-09-19 09:12:48 +0000
@@ -4,23 +4,21 @@
# #
###############################################
-#
+#
# NOTE: PLEASE SEE ps_1general.test (bottom)
# BEFORE ADDING NEW TEST CASES HERE !!!
use test;
--- source include/have_falcon.inc
+--source include/have_falcon.inc
let $type= 'Falcon' ;
--- source include/ps_create.inc
--- source include/ps_renew.inc
+--source include/ps_create.inc
+--source include/ps_renew.inc
--- source include/ps_query.inc
--- source include/ps_modify.inc
--- source include/ps_modify1.inc
--- source include/ps_conv.inc
+--source include/ps_query.inc
+--source include/ps_modify.inc
+--source include/ps_modify1.inc
+--source include/ps_conv.inc
drop table t1, t9;
-
-# End of 4.1 tests
=== removed file 'mysql-test/suite/falcon_team/r/falcon_bug_23692.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_23692.result 2008-04-28 21:07:04 +0000
+++ b/mysql-test/suite/falcon_team/r/falcon_bug_23692.result 1970-01-01 00:00:00 +0000
@@ -1,78 +0,0 @@
-SET @@storage_engine = Falcon;
-*** Bug #23692 ***
-DROP TABLE IF EXISTS t1;
-DROP TABLE IF EXISTS t2;
-DROP TABLE IF EXISTS t3;
-DROP TABLE IF EXISTS t4;
-CREATE TABLE t1 (a char(1), key (a));
-INSERT INTO t1 VALUES (0x00);
-SELECT count(*) FROM t1 WHERE a < '';
-count(*)
-1
-SELECT count(*) FROM t1 WHERE a = '';
-count(*)
-0
-SELECT count(*) FROM t1 WHERE a > '';
-count(*)
-0
-CREATE TABLE t2 (a varbinary(5));
-CREATE INDEX i ON t2 (a);
-INSERT INTO t2 VALUES (0x02), (0x0202);
-SELECT count(*) FROM t2 WHERE a >= 0x02 OR a = 0x0202;
-count(*)
-2
-SELECT hex(a) FROM t2 WHERE a < 0x02;
-hex(a)
-SELECT hex(a) FROM t2 WHERE a = 0x02;
-hex(a)
-02
-SELECT hex(a) FROM t2 WHERE a > 0x02;
-hex(a)
-0202
-CREATE TABLE t3 (a char(5));
-CREATE INDEX i ON t3 (a);
-INSERT INTO t3 VALUES (0x4200), (0x4209), (0x42), (0x4220), (0x4242);
-SELECT hex(a) FROM t3 WHERE a < 0x42;
-hex(a)
-4200
-4209
-SELECT hex(a) FROM t3 WHERE a = 0x42;
-hex(a)
-42
-4220
-SELECT hex(a) FROM t3 WHERE a > 0x42;
-hex(a)
-4242
-SELECT hex(a) FROM t3 WHERE a LIKE 'a%';
-hex(a)
-4200
-4209
-42
-4220
-4242
-CREATE TABLE t4 (a varchar(5) character set ucs2, key(a)) engine=falcon;
-INSERT INTO t4 VALUES (0x00420000), (0x00420009), (0x0041001f), (0x0042), (0x00420020), (0x00420042);
-SELECT hex(a) FROM t4 WHERE a < 'a';
-hex(a)
-00420000
-00420009
-0042001f
-SELECT hex(a) FROM t4 WHERE a = 'a';
-hex(a)
-0042
-00400220
-SELECT hex(a) FROM t4 WHERE a > 'a';
-hex(a)
-00420042
-SELECT hex(a) FROM t4 WHERE a LIKE 'a%';
-hex(a)
-00420000
-00420009
-0042001f
-0042
-00420020
-00420042
-DROP TABLE t1;
-DROP TABLE t2;
-DROP TABLE t3;
-DROP TABLE t4;
=== modified file 'mysql-test/suite/falcon_team/r/falcon_bug_36294.result'
--- a/mysql-test/suite/falcon_team/r/falcon_bug_36294.result 2008-04-25 09:44:03 +0000
+++ b/mysql-test/suite/falcon_team/r/falcon_bug_36294.result 2008-09-27 22:01:35 +0000
@@ -1 +1,8 @@
-hello,world
+*** Bug #36294 ***
+SET @@storage_engine = 'Falcon';
+DROP TABLE IF EXISTS ftest;
+CREATE TABLESPACE gimdata ADD DATAFILE 'gimdata.fts' ENGINE 'Falcon';
+CREATE TABLE ftest (id serial, col1 varchar(500)) ENGINE 'Falcon' TABLESPACE gimdata;
+Hello, world!
+DROP TABLE ftest;
+DROP TABLESPACE gimdata ENGINE 'Falcon';
=== removed file 'mysql-test/suite/falcon_team/r/read_many_rows_falcon.result'
--- a/mysql-test/suite/falcon_team/r/read_many_rows_falcon.result 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon_team/r/read_many_rows_falcon.result 1970-01-01 00:00:00 +0000
@@ -1,35 +0,0 @@
-SET SESSION STORAGE_ENGINE = Falcon;
-DROP TABLE IF EXISTS t1, t2, t3, t4;
-CREATE TABLE t1 (id INTEGER) ENGINE=MyISAM;
-CREATE TABLE t2 (id INTEGER PRIMARY KEY);
-CREATE TABLE t3 (a CHAR(32) PRIMARY KEY,id INTEGER);
-CREATE TABLE t4 (a CHAR(32) PRIMARY KEY,id INTEGER) ENGINE=MyISAM;
-INSERT INTO t1 (id) VALUES (1);
-INSERT INTO t1 SELECT id+1 FROM t1;
-INSERT INTO t1 SELECT id+2 FROM t1;
-INSERT INTO t1 SELECT id+4 FROM t1;
-INSERT INTO t1 SELECT id+8 FROM t1;
-INSERT INTO t1 SELECT id+16 FROM t1;
-INSERT INTO t1 SELECT id+32 FROM t1;
-INSERT INTO t1 SELECT id+64 FROM t1;
-INSERT INTO t1 SELECT id+128 FROM t1;
-INSERT INTO t1 SELECT id+256 FROM t1;
-INSERT INTO t1 SELECT id+512 FROM t1;
-INSERT INTO t1 SELECT id+1024 FROM t1;
-INSERT INTO t1 SELECT id+2048 FROM t1;
-INSERT INTO t1 SELECT id+4096 FROM t1;
-INSERT INTO t1 SELECT id+8192 FROM t1;
-INSERT INTO t1 SELECT id+16384 FROM t1;
-INSERT INTO t1 SELECT id+32768 FROM t1;
-INSERT INTO t1 SELECT id+65536 FROM t1;
-INSERT INTO t1 SELECT id+131072 FROM t1;
-INSERT INTO t1 SELECT id+262144 FROM t1;
-INSERT INTO t1 SELECT id+524288 FROM t1;
-INSERT INTO t1 SELECT id+1048576 FROM t1;
-INSERT INTO t2 SELECT * FROM t1;
-INSERT INTO t3 SELECT CONCAT(id),id FROM t2 ORDER BY -id;
-INSERT INTO t4 SELECT * FROM t3 ORDER BY CONCAT(a);
-SELECT SUM(id) FROM t3;
-SUM(id)
-2199024304128
-DROP TABLE t1,t2,t3,t4;
=== modified file 'mysql-test/suite/falcon_team/t/disabled.def'
--- a/mysql-test/suite/falcon_team/t/disabled.def 2008-09-10 22:35:51 +0000
+++ b/mysql-test/suite/falcon_team/t/disabled.def 2008-10-02 10:37:27 +0000
@@ -17,4 +17,3 @@
# which should probably be attached to a bug report instead.
# Also please keep the list sorted.
-falcon_bug_23945 : Bug#34892 2008-09-10 hky Test failure brings Falcon's data dictionary out of sync
=== removed file 'mysql-test/suite/falcon_team/t/falcon_bug_23692.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_23692.test 2008-04-28 21:07:04 +0000
+++ b/mysql-test/suite/falcon_team/t/falcon_bug_23692.test 1970-01-01 00:00:00 +0000
@@ -1,47 +0,0 @@
---source include/have_falcon.inc
-SET @@storage_engine = Falcon;
-#
-# Bug #23692: Falcon: searches fail if data is 0x00
-#
---echo *** Bug #23692 ***
---disable_warnings
-DROP TABLE IF EXISTS t1;
-DROP TABLE IF EXISTS t2;
-DROP TABLE IF EXISTS t3;
-DROP TABLE IF EXISTS t4;
---enable_warnings
-
-CREATE TABLE t1 (a char(1), key (a));
-INSERT INTO t1 VALUES (0x00);
-SELECT count(*) FROM t1 WHERE a < '';
-SELECT count(*) FROM t1 WHERE a = '';
-SELECT count(*) FROM t1 WHERE a > '';
-
-CREATE TABLE t2 (a varbinary(5));
-CREATE INDEX i ON t2 (a);
-INSERT INTO t2 VALUES (0x02), (0x0202);
-SELECT count(*) FROM t2 WHERE a >= 0x02 OR a = 0x0202;
-SELECT hex(a) FROM t2 WHERE a < 0x02;
-SELECT hex(a) FROM t2 WHERE a = 0x02;
-SELECT hex(a) FROM t2 WHERE a > 0x02;
-
-CREATE TABLE t3 (a char(5));
-CREATE INDEX i ON t3 (a);
-INSERT INTO t3 VALUES (0x4200), (0x4209), (0x42), (0x4220), (0x4242);
-SELECT hex(a) FROM t3 WHERE a < 0x42;
-SELECT hex(a) FROM t3 WHERE a = 0x42;
-SELECT hex(a) FROM t3 WHERE a > 0x42;
-SELECT hex(a) FROM t3 WHERE a LIKE 'a%';
-
-CREATE TABLE t4 (a varchar(5) character set ucs2, key(a)) engine=falcon;
-INSERT INTO t4 VALUES (0x00420000), (0x00420009), (0x0041001f), (0x0042), (0x00420020), (0x00420042);
-SELECT hex(a) FROM t4 WHERE a < 'a';
-SELECT hex(a) FROM t4 WHERE a = 'a';
-SELECT hex(a) FROM t4 WHERE a > 'a';
-SELECT hex(a) FROM t4 WHERE a LIKE 'a%';
-
-# Final cleanup.
-DROP TABLE t1;
-DROP TABLE t2;
-DROP TABLE t3;
-DROP TABLE t4;
=== modified file 'mysql-test/suite/falcon_team/t/falcon_bug_36294.test'
--- a/mysql-test/suite/falcon_team/t/falcon_bug_36294.test 2008-04-27 01:34:10 +0000
+++ b/mysql-test/suite/falcon_team/t/falcon_bug_36294.test 2008-09-27 22:01:35 +0000
@@ -1,52 +1,66 @@
--source include/have_falcon.inc
+
#
# Bug#36294: Assertion in Cache::writePage
# This test produces no output. It is only here to crash the server
# once insert/select runs into error 305 (record memory exhaused).
# Exact point of crash is generally unpredictable.
#
+--echo *** Bug #36294 ***
+
+# ----------------------------------------------------- #
+# --- Initialisation --- #
+# ----------------------------------------------------- #
let $engine = 'Falcon';
eval SET @@storage_engine = $engine;
+--disable_warnings
+DROP TABLE IF EXISTS ftest;
+--enable_warnings
+
+eval CREATE TABLESPACE gimdata ADD DATAFILE 'gimdata.fts' ENGINE $engine;
+eval CREATE TABLE ftest (id serial, col1 varchar(500)) ENGINE $engine TABLESPACE gimdata;
+
+# ----------------------------------------------------- #
+# --- Test --- #
+# ----------------------------------------------------- #
--disable_abort_on_error
--disable_warnings
--disable_query_log
-drop table if exists ftest;
-create tablespace gimdata add datafile 'gimdata.fts' engine=$engine;
-create table ftest (id serial, col1 varchar(500)) engine=$engine tablespace gimdata;
-insert into ftest values (null,repeat("a",500));
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-insert into ftest(col1) select col1 from ftest;
-drop table ftest;
-drop tablespace gimdata engine=$engine;
+INSERT INTO ftest VALUES (null,repeat("a",500));
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
+INSERT INTO ftest(col1) SELECT col1 FROM ftest;
--enable_warnings
--enable_abort_on_error
--enable_query_log
+
# ----------------------------------------------------- #
# --- Check --- #
# ----------------------------------------------------- #
---echo hello,world
+--echo Hello, world!
# ----------------------------------------------------- #
# --- Final cleanup --- #
# ----------------------------------------------------- #
+DROP TABLE ftest;
+eval DROP TABLESPACE gimdata ENGINE $engine;
=== removed file 'mysql-test/suite/falcon_team/t/read_many_rows_falcon.test'
--- a/mysql-test/suite/falcon_team/t/read_many_rows_falcon.test 2008-04-20 00:05:17 +0000
+++ b/mysql-test/suite/falcon_team/t/read_many_rows_falcon.test 1970-01-01 00:00:00 +0000
@@ -1,15 +0,0 @@
-# t/read_many_rows_falcon.test
-#
-# Check how filesort and buffered-record-reads works with InnoDB.
-# This test takes a long time.
-#
-# Last update:
-# 2006-08-30 ML create this test
-#
-
-
---source include/have_falcon.inc
-let $engine_type= Falcon;
-let $other_engine_type= MyISAM;
-
---source include/read_many_rows.inc
=== added file 'mysql-test/suite/falcon_team/t/test2bug.def'
--- a/mysql-test/suite/falcon_team/t/test2bug.def 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/falcon_team/t/test2bug.def 2008-10-02 10:37:27 +0000
@@ -0,0 +1,23 @@
+#
+# The falcon_team test suite is intended for unstable or otherwise
+# intermittently failing Falcon-related tests.
+# Stable Falcon tests are located in the falcon test suite.
+#
+# All tests in the falcon_team test suite should be associated with
+# a bug report describing the test failure or issue related to the test.
+#
+# Note that a separate bug report is usually needed for this, it is
+# not sufficient to list the ID of the bug whose fix this test is
+# supposed to verify.
+#
+# Format:
+# Test case: BugId - BugDescription
+#
+# Do not use TAB characters for whitespace.
+# Keep the list sorted by test name.
+#
+
+falcon_bug_23945: Bug#34892 - Transaction handling in select_create::abort let's Falcon fail
+falcon_bug_26433: Bug#39314 - falcon_bug_26433 fails with an offset of 1 in row numbers in expected warnings
+falcon_bug_28048: Bug#36700 - Running falcon_bug_28048 shows increasing memory usage and run time
+falcon_deadlock: Bug#34182 - SELECT ... FOR UPDATE does not lock when in subquery
=== modified file 'mysql-test/suite/funcs_1/datadict/tables2.inc'
--- a/mysql-test/suite/funcs_1/datadict/tables2.inc 2008-07-04 08:28:36 +0000
+++ b/mysql-test/suite/funcs_1/datadict/tables2.inc 2008-09-23 08:39:48 +0000
@@ -32,7 +32,7 @@ let $ndb_pattern = 'number_of_replica
# We do not unify the engine name here, because the rowformat is
# specific to the engine.
--replace_result Dynamic DYNAMIC_OR_PAGE Page DYNAMIC_OR_PAGE MyISAM MYISAM_OR_MARIA MARIA MYISAM_OR_MARIA
---replace_column 8 "#TBLR#" 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "#CRT#" 16 "#UT#" 17 "#CT#" 20 "#CO#" 21 "#TC#"
+--replace_column 8 "#TBLR#" 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "#CRT#" 16 "#UT#" 17 "#CT#" 20 "#CO#" 21 "#TC#" 22 "#TN#"
eval
SELECT *,
LEFT( table_comment,
=== modified file 'mysql-test/suite/funcs_1/r/is_columns_is.result'
--- a/mysql-test/suite/funcs_1/r/is_columns_is.result 2008-08-02 18:22:09 +0000
+++ b/mysql-test/suite/funcs_1/r/is_columns_is.result 2008-09-23 08:39:48 +0000
@@ -268,6 +268,7 @@ NULL information_schema TABLES ENGINE 5
NULL information_schema TABLES INDEX_LENGTH 12 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) unsigned select Default Default
NULL information_schema TABLES MAX_DATA_LENGTH 11 NULL YES bigint NULL NULL 19 0 NULL NULL bigint(21) unsigned select Default Default
NULL information_schema TABLES ROW_FORMAT 7 NULL YES varchar 10 40 NULL NULL utf8 utf8_general_ci varchar(10) select Default Default
+NULL information_schema TABLES TABLESPACE_NAME 22 NULL YES varchar 64 256 NULL NULL utf8 utf8_general_ci varchar(64) select Default Default
NULL information_schema TABLES TABLE_CATALOG 1 NULL YES varchar 512 2048 NULL NULL utf8 utf8_general_ci varchar(512) select Default Default
NULL information_schema TABLES TABLE_COLLATION 18 NULL YES varchar 64 256 NULL NULL utf8 utf8_general_ci varchar(64) select Default Default
NULL information_schema TABLES TABLE_COMMENT 21 NO varchar 2048 8192 NULL NULL utf8 utf8_general_ci varchar(2048) select Default Default
@@ -666,6 +667,7 @@ NULL information_schema TABLES CHECK_TIM
NULL information_schema TABLES CHECKSUM bigint NULL NULL NULL NULL bigint(21) unsigned
4.0000 information_schema TABLES CREATE_OPTIONS varchar 255 1020 utf8 utf8_general_ci varchar(255)
4.0000 information_schema TABLES TABLE_COMMENT varchar 2048 8192 utf8 utf8_general_ci varchar(2048)
+4.0000 information_schema TABLES TABLESPACE_NAME varchar 64 256 utf8 utf8_general_ci varchar(64)
4.0000 information_schema TABLESPACES TABLESPACE_NAME varchar 64 256 utf8 utf8_general_ci varchar(64)
4.0000 information_schema TABLESPACES ENGINE varchar 64 256 utf8 utf8_general_ci varchar(64)
4.0000 information_schema TABLESPACES TABLESPACE_TYPE varchar 64 256 utf8 utf8_general_ci varchar(64)
=== modified file 'mysql-test/suite/funcs_1/r/is_tables.result'
--- a/mysql-test/suite/funcs_1/r/is_tables.result 2008-03-10 19:00:02 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables.result 2008-09-23 08:39:48 +0000
@@ -49,6 +49,7 @@ TABLE_COLLATION varchar(64) YES NULL
CHECKSUM bigint(21) unsigned YES NULL
CREATE_OPTIONS varchar(255) YES NULL
TABLE_COMMENT varchar(2048) NO
+TABLESPACE_NAME varchar(64) YES NULL
SHOW CREATE TABLE information_schema.TABLES;
Table Create Table
TABLES CREATE TEMPORARY TABLE `TABLES` (
@@ -72,7 +73,8 @@ TABLES CREATE TEMPORARY TABLE `TABLES` (
`TABLE_COLLATION` varchar(64) DEFAULT NULL,
`CHECKSUM` bigint(21) unsigned DEFAULT NULL,
`CREATE_OPTIONS` varchar(255) DEFAULT NULL,
- `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT ''
+ `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT '',
+ `TABLESPACE_NAME` varchar(64) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW COLUMNS FROM information_schema.TABLES;
Field Type Null Key Default Extra
@@ -97,6 +99,7 @@ TABLE_COLLATION varchar(64) YES NULL
CHECKSUM bigint(21) unsigned YES NULL
CREATE_OPTIONS varchar(255) YES NULL
TABLE_COMMENT varchar(2048) NO
+TABLESPACE_NAME varchar(64) YES NULL
SELECT table_catalog, table_schema, table_name
FROM information_schema.tables WHERE table_catalog IS NOT NULL;
table_catalog table_schema table_name
@@ -128,11 +131,11 @@ CREATE VIEW v3 AS SELECT * FROM tb3;
GRANT SELECT ON db_datadict.v3 to 'testuser3'@'localhost';
SELECT * FROM information_schema.tables
WHERE table_schema = 'db_datadict' ORDER BY table_name;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
-NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME
+NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW NULL
SHOW TABLES FROM db_datadict;
Tables_in_db_datadict
tb1
@@ -142,9 +145,9 @@ v3
# Establish connection testuser2 (user=testuser2)
SELECT * FROM information_schema.tables
WHERE table_schema = 'db_datadict' ORDER BY table_name;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
-NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME
+NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
SHOW TABLES FROM db_datadict;
Tables_in_db_datadict
tb1
@@ -152,9 +155,9 @@ tb3
# Establish connection testuser3 (user=testuser3)
SELECT * FROM information_schema.tables
WHERE table_schema = 'db_datadict' ORDER BY table_name;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
-NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME
+NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW NULL
SHOW TABLES FROM db_datadict;
Tables_in_db_datadict
tb3
@@ -162,11 +165,11 @@ v3
# Switch to connection default (user=root)
SELECT * FROM information_schema.tables
WHERE table_schema = 'db_datadict' ORDER BY table_name;
-TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
-NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS#
-NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW
+TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT TABLESPACE_NAME
+NULL db_datadict tb1 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict tb2 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict tb3 BASE TABLE #ENG# 10 #RF# 0 #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# latin1_swedish_ci #CS# NULL
+NULL db_datadict v3 VIEW #ENG# NULL #RF# NULL #ARL# #DL# #MDL# #IL# #DF# NULL #CRT #UT# #CT# NULL #CS# NULL VIEW NULL
SHOW TABLES FROM db_datadict;
Tables_in_db_datadict
tb1
@@ -213,6 +216,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM #CS#
CREATE_OPTIONS
TABLE_COMMENT Initial Comment
+TABLESPACE_NAME NULL
SELECT table_name FROM information_schema.tables
WHERE table_name LIKE 't1_my_table%';
table_name
@@ -365,6 +369,7 @@ TABLE_COLLATION NULL
CHECKSUM NULL
CREATE_OPTIONS NULL
TABLE_COMMENT VIEW
+TABLESPACE_NAME NULL
DROP VIEW test.t1_my_tablex;
SELECT table_name FROM information_schema.tables
WHERE table_name = 't1_my_tablex';
=== modified file 'mysql-test/suite/funcs_1/r/is_tables_innodb.result'
--- a/mysql-test/suite/funcs_1/r/is_tables_innodb.result 2008-06-16 18:39:58 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables_innodb.result 2008-09-23 08:39:48 +0000
@@ -38,6 +38,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -61,6 +62,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -84,6 +86,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
@@ -130,6 +133,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -153,6 +157,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
=== modified file 'mysql-test/suite/funcs_1/r/is_tables_is.result'
--- a/mysql-test/suite/funcs_1/r/is_tables_is.result 2008-08-02 18:22:09 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables_is.result 2008-09-23 08:39:48 +0000
@@ -34,6 +34,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -57,6 +58,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -80,6 +82,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -103,6 +106,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -126,6 +130,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -149,6 +154,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -172,6 +178,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -195,6 +202,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -218,6 +226,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -241,6 +250,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -264,6 +274,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -287,6 +298,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -310,6 +322,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -333,6 +346,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -356,6 +370,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -379,6 +394,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -402,6 +418,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -425,6 +442,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -448,6 +466,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -471,6 +490,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -494,6 +514,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -517,6 +538,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -540,6 +562,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -563,6 +586,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -586,6 +610,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -609,6 +634,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -632,6 +658,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -655,6 +682,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -678,6 +706,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
DROP USER testuser1@localhost;
@@ -718,6 +747,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -741,6 +771,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -764,6 +795,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -787,6 +819,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -810,6 +843,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -833,6 +867,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -856,6 +891,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -879,6 +915,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -902,6 +939,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -925,6 +963,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -948,6 +987,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -971,6 +1011,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -994,6 +1035,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1017,6 +1059,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1040,6 +1083,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1063,6 +1107,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1086,6 +1131,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1109,6 +1155,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1132,6 +1179,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1155,6 +1203,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1178,6 +1227,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1201,6 +1251,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1224,6 +1275,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1247,6 +1299,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1270,6 +1323,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1293,6 +1347,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1316,6 +1371,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1339,6 +1395,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -1362,6 +1419,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
# Switch to connection default and close connection testuser1
=== modified file 'mysql-test/suite/funcs_1/r/is_tables_is_falcon.result'
--- a/mysql-test/suite/funcs_1/r/is_tables_is_falcon.result 2008-09-03 09:00:56 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables_is_falcon.result 2008-09-23 08:39:48 +0000
@@ -34,6 +34,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -57,6 +58,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -80,6 +82,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -103,6 +106,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -126,6 +130,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -149,6 +154,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -172,6 +178,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -195,6 +202,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -218,6 +226,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -241,6 +250,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
DROP USER testuser1@localhost;
@@ -281,6 +291,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -304,6 +315,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -327,6 +339,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -350,6 +363,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -373,6 +387,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -396,6 +411,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -419,6 +435,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -442,6 +459,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -465,6 +483,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -488,6 +507,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
# Switch to connection default and close connection testuser1
=== modified file 'mysql-test/suite/funcs_1/r/is_tables_memory.result'
--- a/mysql-test/suite/funcs_1/r/is_tables_memory.result 2008-06-16 18:39:58 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables_memory.result 2008-09-23 08:39:48 +0000
@@ -39,6 +39,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -62,6 +63,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -85,6 +87,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
@@ -131,6 +134,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -154,6 +158,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
=== modified file 'mysql-test/suite/funcs_1/r/is_tables_myisam.result'
--- a/mysql-test/suite/funcs_1/r/is_tables_myisam.result 2008-07-04 08:28:36 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables_myisam.result 2008-09-23 08:39:48 +0000
@@ -39,6 +39,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -62,6 +63,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -85,6 +87,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
@@ -131,6 +134,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -154,6 +158,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
=== modified file 'mysql-test/suite/funcs_1/r/is_tables_mysql.result'
--- a/mysql-test/suite/funcs_1/r/is_tables_mysql.result 2008-09-04 09:58:22 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables_mysql.result 2008-09-29 06:50:26 +0000
@@ -33,6 +33,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -56,6 +57,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -79,6 +81,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Column privileges
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -102,6 +105,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Database privileges
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -125,6 +129,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Events
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -148,6 +153,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment User defined functions
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -171,6 +177,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment General log
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -194,6 +201,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment help categories
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -217,6 +225,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment help keywords
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -240,6 +249,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment keyword-topic relation
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -263,6 +273,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment help topics
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -286,6 +297,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Host privileges; Merged with database privileges
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -309,6 +321,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -332,6 +345,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment MySQL plugins
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -355,6 +369,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Stored Procedures
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -378,6 +393,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Procedure privileges
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -401,6 +417,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment MySQL Foreign Servers table
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -424,6 +441,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Slow log
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -447,6 +465,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Table privileges
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -470,6 +489,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Time zones
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -493,6 +513,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Leap seconds information for time zones
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -516,6 +537,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Time zone names
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -539,6 +561,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Time zone transitions
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -562,6 +585,7 @@ TABLE_COLLATION utf8_general_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Time zone transition types
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -585,6 +609,7 @@ TABLE_COLLATION utf8_bin
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment Users and global privileges
Separator -----------------------------------------------------
DROP USER testuser1@localhost;
=== modified file 'mysql-test/suite/funcs_1/r/is_tables_ndb.result'
--- a/mysql-test/suite/funcs_1/r/is_tables_ndb.result 2008-06-28 09:54:53 +0000
+++ b/mysql-test/suite/funcs_1/r/is_tables_ndb.result 2008-09-23 08:39:48 +0000
@@ -38,6 +38,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -61,6 +62,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -84,6 +86,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
@@ -130,6 +133,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
TABLE_CATALOG NULL
@@ -153,6 +157,7 @@ TABLE_COLLATION latin1_swedish_ci
CHECKSUM NULL
CREATE_OPTIONS #CO#
TABLE_COMMENT #TC#
+TABLESPACE_NAME #TN#
user_comment
Separator -----------------------------------------------------
SHOW TABLES FROM test1;
=== modified file 'mysql-test/t/ps.test'
--- a/mysql-test/t/ps.test 2008-08-07 17:52:43 +0000
+++ b/mysql-test/t/ps.test 2008-10-09 10:58:51 +0000
@@ -3195,6 +3195,15 @@ SELECT @a;
DROP PROCEDURE p1;
DROP PROCEDURE p2;
+#
+# Additional cleanup.
+#
+# Delete files which were created by "select ... into outfile ...".
+#
+
+let $datadir= `select @@datadir`;
+--remove_file $datadir/test/f1.txt
+
--echo
--echo # End of WL#4435.
=== modified file 'mysql-test/t/ps_1general.test'
--- a/mysql-test/t/ps_1general.test 2008-05-21 10:17:29 +0000
+++ b/mysql-test/t/ps_1general.test 2008-10-09 10:58:51 +0000
@@ -445,6 +445,8 @@ prepare stmt1 from ' load data infile ''
into table t1 fields terminated by ''\t'' ';
prepare stmt1 from ' select * into outfile ''data.txt'' from t1 ';
execute stmt1 ;
+let $datadir=`select @@datadir`;
+--remove_file $datadir/test/data.txt
##
prepare stmt1 from ' optimize table t1 ' ;
prepare stmt1 from ' analyze table t1 ' ;
=== modified file 'mysql-test/t/query_cache.test'
--- a/mysql-test/t/query_cache.test 2008-06-17 20:04:19 +0000
+++ b/mysql-test/t/query_cache.test 2008-10-09 10:58:51 +0000
@@ -427,6 +427,9 @@ select * from t1 into outfile "query_cac
select * from t1 limit 1 into dumpfile "query_cache.dump.file";
show status like "Qcache_queries_in_cache";
drop table t1;
+let $datadir=`select @@datadir`;
+--remove_file $datadir/test/query_cache.dump.file
+--remove_file $datadir/test/query_cache.out.file
#
# test of SQL_SELECT_LIMIT
=== modified file 'mysql-test/t/subselect3.test'
--- a/mysql-test/t/subselect3.test 2008-08-20 01:52:25 +0000
+++ b/mysql-test/t/subselect3.test 2008-10-09 10:58:51 +0000
@@ -629,6 +629,8 @@ delete from t1;
load data infile "subselect.out.file.1" into table t1;
select * from t1;
drop table t1;
+let $datadir=`select @@datadir`;
+--remove_file $datadir/test/subselect.out.file.1
--echo End of 5.0 tests
=== modified file 'mysys/stacktrace.c'
--- a/mysys/stacktrace.c 2008-09-05 00:35:12 +0000
+++ b/mysys/stacktrace.c 2008-09-26 11:24:20 +0000
@@ -314,6 +314,7 @@ void my_write_core(int sig)
#else /* __WIN__*/
#include <dbghelp.h>
+#include <tlhelp32.h>
/*
Stack tracing on Windows is implemented using Debug Helper library(dbghelp.dll)
@@ -406,6 +407,68 @@ void my_set_exception_pointers(EXCEPTION
exception_ptrs = ep;
}
+
+/*
+ Get symbol path - semicolon-separated list of directories to search for debug
+ symbols. We expect PDB in the same directory as corresponding exe or dll,
+ so the path is build from directories of the loaded modules. If environment
+ variable _NT_SYMBOL_PATH is set, it's value appended to the symbol search path
+*/
+static void get_symbol_path(char *path, size_t size)
+{
+ HANDLE hSnap;
+ char *envvar;
+
+ path[0]= '\0';
+ /*
+ Enumerate all modules, and add their directories to the path.
+ Avoid duplicate entries.
+ */
+ hSnap= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
+ if (hSnap != INVALID_HANDLE_VALUE)
+ {
+ BOOL ret;
+ MODULEENTRY32 mod;
+ mod.dwSize= sizeof(MODULEENTRY32);
+ for (ret= Module32First(hSnap, &mod); ret; ret= Module32Next(hSnap, &mod))
+ {
+ char *module_dir= mod.szExePath;
+ char *p= strrchr(module_dir,'\\');
+ if (!p)
+ {
+ /*
+ Path separator was not found. Not known to happen, if ever happens,
+ will indicate current directory.
+ */
+ module_dir[0]= '.';
+ p= module_dir + 1;
+ }
+ *p++= ';';
+ *p= '\0';
+
+ if (!strstr(path, module_dir))
+ {
+ size_t dir_len = strlen(module_dir);
+ if (size > dir_len)
+ {
+ strncat(path, module_dir, size-1);
+ size -= dir_len;
+ }
+ }
+ }
+ CloseHandle(hSnap);
+ }
+
+ /* Add _NT_SYMBOL_PATH, if present. */
+ envvar= getenv("_NT_SYMBOL_PATH");
+ if(envvar && size)
+ {
+ strncat(path, envvar, size-1);
+ }
+}
+
+#define MAX_SYMBOL_PATH 32768
+
/* Platform SDK in VS2003 does not have definition for SYMOPT_NO_PROMPTS*/
#ifndef SYMOPT_NO_PROMPTS
#define SYMOPT_NO_PROMPTS 0
@@ -422,6 +485,7 @@ void my_print_stacktrace(uchar* unused1,
int i;
CONTEXT context;
STACKFRAME64 frame={0};
+ static char symbol_path[MAX_SYMBOL_PATH];
if(!exception_ptrs || !init_dbghelp_functions())
return;
@@ -430,7 +494,8 @@ void my_print_stacktrace(uchar* unused1,
context = *(exception_ptrs->ContextRecord);
/*Initialize symbols.*/
pSymSetOptions(SYMOPT_LOAD_LINES|SYMOPT_NO_PROMPTS|SYMOPT_DEFERRED_LOADS|SYMOPT_DEBUG);
- pSymInitialize(hProcess,NULL,TRUE);
+ get_symbol_path(symbol_path, sizeof(symbol_path));
+ pSymInitialize(hProcess, symbol_path, TRUE);
/*Prepare stackframe for the first StackWalk64 call*/
frame.AddrFrame.Mode= frame.AddrPC.Mode= frame.AddrStack.Mode= AddrModeFlat;
=== modified file 'sql/CMakeLists.txt'
--- a/sql/CMakeLists.txt 2008-09-16 08:34:30 +0000
+++ b/sql/CMakeLists.txt 2008-09-26 16:30:56 +0000
@@ -78,6 +78,7 @@ ADD_EXECUTABLE(mysqld
sql_connect.cc scheduler.cc transaction.cc
ddl_blocker.cc si_objects.cc si_logs.cc
sql_profile.cc event_parse_data.cc mdl.cc
+ rpl_handler.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
${PROJECT_SOURCE_DIR}/include/mysqld_error.h
=== modified file 'sql/Makefile.am'
--- a/sql/Makefile.am 2008-09-16 08:34:30 +0000
+++ b/sql/Makefile.am 2008-10-01 12:09:26 +0000
@@ -89,7 +89,8 @@ noinst_HEADERS = item.h item_func.h item
sql_partition.h partition_info.h partition_element.h \
probes.h sql_audit.h transaction.h \
contributors.h sql_servers.h ddl_blocker.h \
- si_objects.h si_logs.h sql_plist.h mdl.h records.h
+ si_objects.h si_logs.h sql_plist.h mdl.h records.h \
+ rpl_handler.h replication.h
mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
item.cc item_sum.cc item_buff.cc item_func.cc \
@@ -135,8 +136,9 @@ mysqld_SOURCES = sql_lex.cc sql_handler.
sql_plugin.cc sql_binlog.cc \
sql_builtin.cc sql_tablespace.cc partition_info.cc \
sql_servers.cc sql_audit.cc sha2.cc \
- ddl_blocker.cc si_objects.cc si_logs.cc \
- event_parse_data.cc mdl.cc transaction.cc
+ ddl_blocker.cc si_objects.cc si_logs.cc \
+ event_parse_data.cc mdl.cc transaction.cc \
+ rpl_handler.cc
if HAVE_DTRACE
mysqld_SOURCES += probes.d
=== modified file 'sql/backup/kernel.cc'
--- a/sql/backup/kernel.cc 2008-09-30 07:51:48 +0000
+++ b/sql/backup/kernel.cc 2008-10-09 09:55:08 +0000
@@ -176,6 +176,7 @@ execute_backup_command(THD *thd, LEX *le
DBUG_RETURN(send_error(context, ER_BACKUP_BACKUP_PREPARE));
DEBUG_SYNC(thd, "after_backup_start_backup");
+ context.report_state(BUP_ERRORS);
// select objects to backup
=== modified file 'sql/log.cc'
--- a/sql/log.cc 2008-09-29 18:41:59 +0000
+++ b/sql/log.cc 2008-10-09 09:55:08 +0000
@@ -39,6 +39,7 @@
#endif
#include <mysql/plugin.h>
+#include "rpl_handler.h"
#include "si_logs.h"
/* max size of the log message */
@@ -4915,9 +4916,11 @@ err:
}
-bool MYSQL_BIN_LOG::flush_and_sync()
+bool MYSQL_BIN_LOG::flush_and_sync(bool *synced)
{
int err=0, fd=log_file.file;
+ if (synced)
+ *synced= 0;
safe_mutex_assert_owner(&LOCK_log);
if (flush_io_cache(&log_file))
return 1;
@@ -4925,6 +4928,8 @@ bool MYSQL_BIN_LOG::flush_and_sync()
{
sync_binlog_counter= 0;
err=my_sync(fd, MYF(MY_WME));
+ if (synced)
+ *synced= 1;
}
return err;
}
@@ -5189,7 +5194,7 @@ MYSQL_BIN_LOG::flush_and_set_pending_row
if (file == &log_file)
{
- error= flush_and_sync();
+ error= flush_and_sync(0);
if (!error)
{
signal_update();
@@ -5377,8 +5382,15 @@ bool MYSQL_BIN_LOG::write(Log_event *eve
if (file == &log_file) // we are writing to the real log (disk)
{
- if (flush_and_sync())
+ bool synced;
+ if (flush_and_sync(&synced))
goto err;
+
+ if (RUN_HOOK(binlog_storage, after_flush,
+ (thd, log_file_name, file->pos_in_file, synced))) {
+ goto err;
+ }
+
signal_update();
rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED);
}
@@ -5639,7 +5651,7 @@ int MYSQL_BIN_LOG::write_cache(IO_CACHE
DBUG_ASSERT(carry == 0);
if (sync_log)
- flush_and_sync();
+ flush_and_sync(0);
return 0; // All OK
}
@@ -5725,7 +5737,9 @@ bool MYSQL_BIN_LOG::write(THD *thd, IO_C
if (commit_event && commit_event->write(&log_file))
goto err;
- if (flush_and_sync())
+
+ bool synced;
+ if (flush_and_sync(&synced))
goto err;
DBUG_EXECUTE_IF("half_binlogged_transaction", DBUG_ABORT(););
if (cache->error) // Error on read
@@ -5734,6 +5748,11 @@ bool MYSQL_BIN_LOG::write(THD *thd, IO_C
write_error=1; // Don't give more errors
goto err;
}
+
+ if (RUN_HOOK(binlog_storage, after_flush,
+ (thd, log_file_name, log_file.pos_in_file, synced)))
+ goto err;
+
signal_update();
}
=== modified file 'sql/log.h'
--- a/sql/log.h 2008-08-27 17:30:49 +0000
+++ b/sql/log.h 2008-09-26 16:30:56 +0000
@@ -458,7 +458,21 @@ public:
bool is_active(const char* log_file_name);
int update_log_index(LOG_INFO* linfo, bool need_update_threads);
void rotate_and_purge(uint flags);
- bool flush_and_sync();
+
+ /**
+ Flush binlog cache and synchronize to disk.
+
+ This function flushes events in binlog cache to binary log file,
+ it will do synchronizing according to the setting of system
+ variable 'sync_binlog'. If file is synchronized, @c synced will
+ be set to 1, otherwise 0.
+
+ @param[out] synced if not NULL, set to 1 if file is synchronized, otherwise 0
+
+ @retval 0 Success
+ @retval other Failure
+ */
+ bool flush_and_sync(bool *synced);
int purge_logs(const char *to_log, bool included,
bool need_mutex, bool need_update_threads,
ulonglong *decrease_log_space);
=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc 2008-09-08 11:05:26 +0000
+++ b/sql/mysqld.cc 2008-09-26 16:30:56 +0000
@@ -33,6 +33,8 @@
#include "rpl_injector.h"
+#include "rpl_handler.h"
+
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif
@@ -1354,6 +1356,7 @@ void clean_up(bool print_message)
ha_end();
if (tc_log)
tc_log->close();
+ delegates_destroy();
xid_cache_free();
delete_elements(&key_caches, (void (*)(const char*, uchar*)) free_key_cache);
multi_keycache_free();
@@ -3948,6 +3951,13 @@ static int init_server_components()
unireg_abort(1);
}
+ /* initialize delegates for extension observers */
+ if (delegates_init())
+ {
+ sql_print_error("Initialize extension delegates failed");
+ unireg_abort(1);
+ }
+
/* need to configure logging before initializing storage engines */
if (opt_update_log)
{
=== added file 'sql/replication.h'
--- a/sql/replication.h 1970-01-01 00:00:00 +0000
+++ b/sql/replication.h 2008-09-23 15:06:18 +0000
@@ -0,0 +1,461 @@
+/* Copyright (C) 2008 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; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef REPLICATION_H
+#define REPLICATION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ Transaction observer flags.
+*/
+enum Trans_flags {
+ /** Transaction is a real transaction */
+ TRANS_IS_REAL_TRANS = 1
+};
+
+/**
+ Transaction observer parameter
+*/
+typedef struct Trans_param {
+ uint32 server_id;
+ uint32 flags;
+
+ /*
+ The latest binary log file name and position written by current
+ transaction, if binary log is disabled or no log event has been
+ written into binary log file by current transaction (events
+ written into transaction log cache are not counted), these two
+ member will be zero.
+ */
+ const char *log_file;
+ my_off_t log_pos;
+} Trans_param;
+
+/**
+ Observes and extends transaction execution
+*/
+typedef struct Trans_observer {
+ uint32 len;
+
+ /**
+ This callback is called after transaction commit
+
+ This callback is called right after commit to storage engines for
+ transactional tables.
+
+ For non-transactional tables, this is called at the end of the
+ statement, before sending statement status, if the statement
+ succeeded.
+
+ @note The return value is currently ignored by the server.
+
+ @param param The parameter for transaction observers
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_commit)(Trans_param *param);
+
+ /**
+ This callback is called after transaction rollback
+
+ This callback is called right after rollback to storage engines
+ for transactional tables.
+
+ For non-transactional tables, this is called at the end of the
+ statement, before sending statement status, if the statement
+ failed.
+
+ @note The return value is currently ignored by the server.
+
+ @param param The parameter for transaction observers
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_rollback)(Trans_param *param);
+} Trans_observer;
+
+/**
+ Binlog storage flags
+*/
+enum Binlog_storage_flags {
+ /** Binary log was sync:ed */
+ BINLOG_STORAGE_IS_SYNCED = 1
+};
+
+/**
+ Binlog storage observer parameters
+ */
+typedef struct Binlog_storage_param {
+ uint32 server_id;
+} Binlog_storage_param;
+
+/**
+ Observe binlog logging storage
+*/
+typedef struct Binlog_storage_observer {
+ uint32 len;
+
+ /**
+ This callback is called after binlog has been flushed
+
+ This callback is called after cached events have been flushed to
+ binary log file. Whether the binary log file is synchronized to
+ disk is indicated by the bit BINLOG_STORAGE_IS_SYNCED in @a flags.
+
+ @param param Observer common parameter
+ @param log_file Binlog file name been updated
+ @param log_pos Binlog position after update
+ @param flags flags for binlog storage
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_flush)(Binlog_storage_param *param,
+ const char *log_file, my_off_t log_pos,
+ uint32 flags);
+} Binlog_storage_observer;
+
+/**
+ Replication binlog transmitter (binlog dump) observer parameter.
+*/
+typedef struct Binlog_transmit_param {
+ uint32 server_id;
+ uint32 flags;
+} Binlog_transmit_param;
+
+/**
+ Observe and extends the binlog dumping thread.
+*/
+typedef struct Binlog_transmit_observer {
+ uint32 len;
+
+ /**
+ This callback is called when binlog dumping starts
+
+
+ @param param Observer common parameter
+ @param log_file Binlog file name to transmit from
+ @param log_pos Binlog position to transmit from
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*transmit_start)(Binlog_transmit_param *param,
+ const char *log_file, my_off_t log_pos);
+
+ /**
+ This callback is called when binlog dumping stops
+
+ @param param Observer common parameter
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*transmit_stop)(Binlog_transmit_param *param);
+
+ /**
+ This callback is called to reserve bytes in packet header for event transmission
+
+ This callback is called when resetting transmit packet header to
+ reserve bytes for this observer in packet header.
+
+ The @a header buffer is allocated by the server code, and @a size
+ is the size of the header buffer. Each observer can only reserve
+ a maximum size of @a size in the header.
+
+ @param param Observer common parameter
+ @param header Pointer of the header buffer
+ @param size Size of the header buffer
+ @param len Header length reserved by this observer
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*reserve_header)(Binlog_transmit_param *param,
+ unsigned char *header,
+ unsigned long size,
+ unsigned long *len);
+
+ /**
+ This callback is called before sending an event packet to slave
+
+ @param param Observer common parameter
+ @param packet Binlog event packet to send
+ @param len Length of the event packet
+ @param log_file Binlog file name of the event packet to send
+ @param log_pos Binlog position of the event packet to send
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*before_send_event)(Binlog_transmit_param *param,
+ unsigned char *packet, unsigned long len,
+ const char *log_file, my_off_t log_pos );
+
+ /**
+ This callback is called after sending an event packet to slave
+
+ @param param Observer common parameter
+ @param event_buf Binlog event packet buffer sent
+ @param len length of the event packet buffer
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_send_event)(Binlog_transmit_param *param,
+ const char *event_buf, unsigned long len);
+
+ /**
+ This callback is called after resetting master status
+
+ This is called when executing the command RESET MASTER, and is
+ used to reset status variables added by observers.
+
+ @param param Observer common parameter
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_reset_master)(Binlog_transmit_param *param);
+} Binlog_transmit_observer;
+
+/**
+ Binlog relay IO flags
+*/
+enum Binlog_relay_IO_flags {
+ /** Binary relay log was sync:ed */
+ BINLOG_RELAY_IS_SYNCED = 1
+};
+
+
+/**
+ Replication binlog relay IO observer parameter
+*/
+typedef struct Binlog_relay_IO_param {
+ uint32 server_id;
+
+ /* Master host, user and port */
+ char *host;
+ char *user;
+ unsigned int port;
+
+ char *master_log_name;
+ my_off_t master_log_pos;
+
+ MYSQL *mysql; /* the connection to master */
+} Binlog_relay_IO_param;
+
+/**
+ Observes and extends the service of slave IO thread.
+*/
+typedef struct Binlog_relay_IO_observer {
+ uint32 len;
+
+ /**
+ This callback is called when slave IO thread starts
+
+ @param param Observer common parameter
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*thread_start)(Binlog_relay_IO_param *param);
+
+ /**
+ This callback is called when slave IO thread stops
+
+ @param param Observer common parameter
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*thread_stop)(Binlog_relay_IO_param *param);
+
+ /**
+ This callback is called before slave requesting binlog transmission from master
+
+ This is called before slave issuing BINLOG_DUMP command to master
+ to request binlog.
+
+ @param param Observer common parameter
+ @param flags binlog dump flags
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*before_request_transmit)(Binlog_relay_IO_param *param, uint32 flags);
+
+ /**
+ This callback is called after read an event packet from master
+
+ @param param Observer common parameter
+ @param packet The event packet read from master
+ @param len Length of the event packet read from master
+ @param event_buf The event packet return after process
+ @param event_len The length of event packet return after process
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_read_event)(Binlog_relay_IO_param *param,
+ const char *packet, unsigned long len,
+ const char **event_buf, unsigned long *event_len);
+
+ /**
+ This callback is called after written an event packet to relay log
+
+ @param param Observer common parameter
+ @param event_buf Event packet written to relay log
+ @param event_len Length of the event packet written to relay log
+ @param flags flags for relay log
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_queue_event)(Binlog_relay_IO_param *param,
+ const char *event_buf, unsigned long event_len,
+ uint32 flags);
+
+ /**
+ This callback is called after reset slave relay log IO status
+
+ @param param Observer common parameter
+
+ @retval 0 Sucess
+ @retval 1 Failure
+ */
+ int (*after_reset_slave)(Binlog_relay_IO_param *param);
+} Binlog_relay_IO_observer;
+
+
+/**
+ Register a transaction observer
+
+ @param observer The transaction observer to register
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer already exists
+*/
+int register_trans_observer(Trans_observer *observer, void *p);
+
+/**
+ Unregister a transaction observer
+
+ @param observer The transaction observer to unregister
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer not exists
+*/
+int unregister_trans_observer(Trans_observer *observer, void *p);
+
+/**
+ Register a binlog storage observer
+
+ @param observer The binlog storage observer to register
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer already exists
+*/
+int register_binlog_storage_observer(Binlog_storage_observer *observer, void *p);
+
+/**
+ Unregister a binlog storage observer
+
+ @param observer The binlog storage observer to unregister
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer not exists
+*/
+int unregister_binlog_storage_observer(Binlog_storage_observer *observer, void *p);
+
+/**
+ Register a binlog transmit observer
+
+ @param observer The binlog transmit observer to register
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer already exists
+*/
+int register_binlog_transmit_observer(Binlog_transmit_observer *observer, void *p);
+
+/**
+ Unregister a binlog transmit observer
+
+ @param observer The binlog transmit observer to unregister
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer not exists
+*/
+int unregister_binlog_transmit_observer(Binlog_transmit_observer *observer, void *p);
+
+/**
+ Register a binlog relay IO (slave IO thread) observer
+
+ @param observer The binlog relay IO observer to register
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer already exists
+*/
+int register_binlog_relay_io_observer(Binlog_relay_IO_observer *observer, void *p);
+
+/**
+ Unregister a binlog relay IO (slave IO thread) observer
+
+ @param observer The binlog relay IO observer to unregister
+ @param p pointer to the internal plugin structure
+
+ @retval 0 Sucess
+ @retval 1 Observer not exists
+*/
+int unregister_binlog_relay_io_observer(Binlog_relay_IO_observer *observer, void *p);
+
+/**
+ Connect to master
+
+ This function can only used in the slave I/O thread context, and
+ will use the same master information to do the connection.
+
+ @code
+ MYSQL *mysql = mysql_init(NULL);
+ if (rpl_connect_master(mysql))
+ {
+ // do stuff with the connection
+ }
+ mysql_close(mysql); // close the connection
+ @endcode
+
+ @param mysql address of MYSQL structure to use, pass NULL will
+ create a new one
+
+ @return address of MYSQL structure on success, NULL on failure
+*/
+MYSQL *rpl_connect_master(MYSQL *mysql);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* REPLICATION_H */
=== added file 'sql/rpl_handler.cc'
--- a/sql/rpl_handler.cc 1970-01-01 00:00:00 +0000
+++ b/sql/rpl_handler.cc 2008-09-23 15:06:18 +0000
@@ -0,0 +1,485 @@
+/* Copyright (C) 2008 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; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include "mysql_priv.h"
+
+#include "rpl_mi.h"
+#include "sql_repl.h"
+#include "log_event.h"
+#include "rpl_filter.h"
+#include <my_dir.h>
+#include "rpl_handler.h"
+
+Trans_delegate *transaction_delegate;
+Binlog_storage_delegate *binlog_storage_delegate;
+#ifdef HAVE_REPLICATION
+Binlog_transmit_delegate *binlog_transmit_delegate;
+Binlog_relay_IO_delegate *binlog_relay_io_delegate;
+#endif /* HAVE_REPLICATION */
+
+/*
+ structure to save transaction log filename and position
+*/
+typedef struct Trans_binlog_info {
+ my_off_t log_pos;
+ char log_file[FN_REFLEN];
+} Trans_binlog_info;
+
+static pthread_key(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO);
+
+int get_user_var_int(const char *name,
+ long long int *value, int *null_value)
+{
+ my_bool null_val;
+ user_var_entry *entry=
+ (user_var_entry*) hash_search(¤t_thd->user_vars,
+ (uchar*) name, strlen(name));
+ if (!entry)
+ return 1;
+ *value= entry->val_int(&null_val);
+ if (null_value)
+ *null_value= null_val;
+ return 0;
+}
+
+int get_user_var_real(const char *name,
+ double *value, int *null_value)
+{
+ my_bool null_val;
+ user_var_entry *entry=
+ (user_var_entry*) hash_search(¤t_thd->user_vars,
+ (uchar*) name, strlen(name));
+ if (!entry)
+ return 1;
+ *value= entry->val_real(&null_val);
+ if (null_value)
+ *null_value= null_val;
+ return 0;
+}
+
+int get_user_var_str(const char *name, char *value,
+ size_t len, unsigned int precision, int *null_value)
+{
+ String str;
+ my_bool null_val;
+ user_var_entry *entry=
+ (user_var_entry*) hash_search(¤t_thd->user_vars,
+ (uchar*) name, strlen(name));
+ if (!entry)
+ return 1;
+ entry->val_str(&null_val, &str, precision);
+ strncpy(value, str.c_ptr(), len);
+ if (null_value)
+ *null_value= null_val;
+ return 0;
+}
+
+int delegates_init()
+{
+ static unsigned char trans_mem[sizeof(Trans_delegate)];
+ static unsigned char storage_mem[sizeof(Binlog_storage_delegate)];
+#ifdef HAVE_REPLICATION
+ static unsigned char transmit_mem[sizeof(Binlog_transmit_delegate)];
+ static unsigned char relay_io_mem[sizeof(Binlog_relay_IO_delegate)];
+#endif
+
+ if (!(transaction_delegate= new (trans_mem) Trans_delegate)
+ || (!transaction_delegate->is_inited())
+ || !(binlog_storage_delegate= new (storage_mem) Binlog_storage_delegate)
+ || (!binlog_storage_delegate->is_inited())
+#ifdef HAVE_REPLICATION
+ || !(binlog_transmit_delegate= new (transmit_mem) Binlog_transmit_delegate)
+ || (!binlog_transmit_delegate->is_inited())
+ || !(binlog_relay_io_delegate= new (relay_io_mem) Binlog_relay_IO_delegate)
+ || (!binlog_relay_io_delegate->is_inited())
+#endif /* HAVE_REPLICATION */
+ )
+ return 1;
+
+ if (pthread_key_create(&RPL_TRANS_BINLOG_INFO, NULL))
+ return 1;
+ return 0;
+}
+
+void delegates_destroy()
+{
+ transaction_delegate->~Trans_delegate();
+ binlog_storage_delegate->~Binlog_storage_delegate();
+#ifdef HAVE_REPLICATION
+ binlog_transmit_delegate->~Binlog_transmit_delegate();
+ binlog_relay_io_delegate->~Binlog_relay_IO_delegate();
+#endif /* HAVE_REPLICATION */
+}
+
+/*
+ This macro is used by almost all the Delegate methods to iterate
+ over all the observers running given callback function of the
+ delegate .
+
+ Add observer plugins to the thd->lex list, after each statement, all
+ plugins add to thd->lex will be automatically unlocked.
+ */
+#define FOREACH_OBSERVER(r, f, thd, args) \
+ param.server_id= thd->server_id; \
+ read_lock(); \
+ Observer_info_iterator iter= observer_info_iter(); \
+ Observer_info *info= iter++; \
+ for (; info; info= iter++) \
+ { \
+ plugin_ref plugin= \
+ my_plugin_lock(thd, &info->plugin); \
+ if (!plugin) \
+ { \
+ r= 1; \
+ break; \
+ } \
+ if (((Observer *)info->observer)->f \
+ && ((Observer *)info->observer)->f args) \
+ { \
+ r= 1; \
+ break; \
+ } \
+ } \
+ unlock()
+
+
+int Trans_delegate::after_commit(THD *thd, bool all)
+{
+ Trans_param param;
+ bool is_real_trans= (all || thd->transaction.all.ha_list == 0);
+ if (is_real_trans)
+ param.flags |= TRANS_IS_REAL_TRANS;
+
+ Trans_binlog_info *log_info=
+ my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO);
+
+ param.log_file= log_info ? log_info->log_file : 0;
+ param.log_pos= log_info ? log_info->log_pos : 0;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_commit, thd, (¶m));
+
+ /*
+ This is the end of a real transaction or autocommit statement, we
+ can free the memory allocated for binlog file and position.
+ */
+ if (is_real_trans && log_info)
+ {
+ my_pthread_setspecific_ptr(RPL_TRANS_BINLOG_INFO, NULL);
+ my_free(log_info, MYF(0));
+ }
+ return ret;
+}
+
+int Trans_delegate::after_rollback(THD *thd, bool all)
+{
+ Trans_param param;
+ bool is_real_trans= (all || thd->transaction.all.ha_list == 0);
+ if (is_real_trans)
+ param.flags |= TRANS_IS_REAL_TRANS;
+
+ Trans_binlog_info *log_info=
+ my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO);
+
+ param.log_file= log_info ? log_info->log_file : 0;
+ param.log_pos= log_info ? log_info->log_pos : 0;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_commit, thd, (¶m));
+
+ /*
+ This is the end of a real transaction or autocommit statement, we
+ can free the memory allocated for binlog file and position.
+ */
+ if (is_real_trans && log_info)
+ {
+ my_pthread_setspecific_ptr(RPL_TRANS_BINLOG_INFO, NULL);
+ my_free(log_info, MYF(0));
+ }
+ return ret;
+}
+
+int Binlog_storage_delegate::after_flush(THD *thd,
+ const char *log_file,
+ my_off_t log_pos,
+ bool synced)
+{
+ Binlog_storage_param param;
+ uint32 flags=0;
+ if (synced)
+ flags |= BINLOG_STORAGE_IS_SYNCED;
+
+ Trans_binlog_info *log_info=
+ my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO);
+
+ if (!log_info)
+ {
+ if(!(log_info=
+ (Trans_binlog_info *)my_malloc(sizeof(Trans_binlog_info), MYF(0))))
+ return 1;
+ my_pthread_setspecific_ptr(RPL_TRANS_BINLOG_INFO, log_info);
+ }
+
+ strcpy(log_info->log_file, log_file+dirname_length(log_file));
+ log_info->log_pos = log_pos;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_flush, thd,
+ (¶m, log_info->log_file, log_info->log_pos, flags));
+ return ret;
+}
+
+#ifdef HAVE_REPLICATION
+int Binlog_transmit_delegate::transmit_start(THD *thd, ushort flags,
+ const char *log_file,
+ my_off_t log_pos)
+{
+ Binlog_transmit_param param;
+ param.flags= flags;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, transmit_start, thd, (¶m, log_file, log_pos));
+ return ret;
+}
+
+int Binlog_transmit_delegate::transmit_stop(THD *thd, ushort flags)
+{
+ Binlog_transmit_param param;
+ param.flags= flags;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, transmit_stop, thd, (¶m));
+ return ret;
+}
+
+int Binlog_transmit_delegate::reserve_header(THD *thd, ushort flags,
+ String *packet)
+{
+ /* NOTE2ME: Maximum extra header size for each observer, I hope 32
+ bytes should be enough for each Observer to reserve their extra
+ header. If later found this is not enough, we can increase this
+ /HEZX
+ */
+#define RESERVE_HEADER_SIZE 32
+ unsigned char header[RESERVE_HEADER_SIZE];
+ ulong hlen;
+ Binlog_transmit_param param;
+ param.flags= flags;
+ param.server_id= thd->server_id;
+
+ int ret= 0;
+ read_lock();
+ Observer_info_iterator iter= observer_info_iter();
+ Observer_info *info= iter++;
+ for (; info; info= iter++)
+ {
+ plugin_ref plugin=
+ my_plugin_lock(thd, &info->plugin);
+ if (!plugin)
+ {
+ ret= 1;
+ break;
+ }
+ hlen= 0;
+ if (((Observer *)info->observer)->reserve_header
+ && ((Observer *)info->observer)->reserve_header(¶m,
+ header,
+ RESERVE_HEADER_SIZE,
+ &hlen))
+ {
+ ret= 1;
+ break;
+ }
+ if (hlen == 0)
+ continue;
+ if (hlen > RESERVE_HEADER_SIZE || packet->append((char *)header, hlen))
+ {
+ ret= 1;
+ break;
+ }
+ }
+ unlock();
+ return ret;
+}
+
+int Binlog_transmit_delegate::before_send_event(THD *thd, ushort flags,
+ String *packet,
+ const char *log_file,
+ my_off_t log_pos)
+{
+ Binlog_transmit_param param;
+ param.flags= flags;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, before_send_event, thd,
+ (¶m, (uchar *)packet->c_ptr(),
+ packet->length(),
+ log_file+dirname_length(log_file), log_pos));
+ return ret;
+}
+
+int Binlog_transmit_delegate::after_send_event(THD *thd, ushort flags,
+ String *packet)
+{
+ Binlog_transmit_param param;
+ param.flags= flags;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_send_event, thd,
+ (¶m, packet->c_ptr(), packet->length()));
+ return ret;
+}
+
+int Binlog_transmit_delegate::after_reset_master(THD *thd, ushort flags)
+
+{
+ Binlog_transmit_param param;
+ param.flags= flags;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_reset_master, thd, (¶m));
+ return ret;
+}
+
+void Binlog_relay_IO_delegate::init_param(Binlog_relay_IO_param *param,
+ Master_info *mi)
+{
+ param->mysql= mi->mysql;
+ param->user= mi->user;
+ param->host= mi->host;
+ param->port= mi->port;
+ param->master_log_name= mi->master_log_name;
+ param->master_log_pos= mi->master_log_pos;
+}
+
+int Binlog_relay_IO_delegate::thread_start(THD *thd, Master_info *mi)
+{
+ Binlog_relay_IO_param param;
+ init_param(¶m, mi);
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, thread_start, thd, (¶m));
+ return ret;
+}
+
+
+int Binlog_relay_IO_delegate::thread_stop(THD *thd, Master_info *mi)
+{
+
+ Binlog_relay_IO_param param;
+ init_param(¶m, mi);
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, thread_stop, thd, (¶m));
+ return ret;
+}
+
+int Binlog_relay_IO_delegate::before_request_transmit(THD *thd,
+ Master_info *mi,
+ ushort flags)
+{
+ Binlog_relay_IO_param param;
+ init_param(¶m, mi);
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, before_request_transmit, thd, (¶m, (uint32)flags));
+ return ret;
+}
+
+int Binlog_relay_IO_delegate::after_read_event(THD *thd, Master_info *mi,
+ const char *packet, ulong len,
+ const char **event_buf,
+ ulong *event_len)
+{
+ Binlog_relay_IO_param param;
+ init_param(¶m, mi);
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_read_event, thd,
+ (¶m, packet, len, event_buf, event_len));
+ return ret;
+}
+
+int Binlog_relay_IO_delegate::after_queue_event(THD *thd, Master_info *mi,
+ const char *event_buf,
+ ulong event_len,
+ bool synced)
+{
+ Binlog_relay_IO_param param;
+ init_param(¶m, mi);
+
+ uint32 flags=0;
+ if (synced)
+ flags |= BINLOG_STORAGE_IS_SYNCED;
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_queue_event, thd,
+ (¶m, event_buf, event_len, flags));
+ return ret;
+}
+
+int Binlog_relay_IO_delegate::after_reset_slave(THD *thd, Master_info *mi)
+
+{
+ Binlog_relay_IO_param param;
+ init_param(¶m, mi);
+
+ int ret= 0;
+ FOREACH_OBSERVER(ret, after_reset_slave, thd, (¶m));
+ return ret;
+}
+#endif /* HAVE_REPLICATION */
+
+int register_trans_observer(Trans_observer *observer, void *p)
+{
+ return transaction_delegate->add_observer(observer, (st_plugin_int *)p);
+}
+
+int unregister_trans_observer(Trans_observer *observer, void *p)
+{
+ return transaction_delegate->remove_observer(observer, (st_plugin_int *)p);
+}
+
+int register_binlog_storage_observer(Binlog_storage_observer *observer, void *p)
+{
+ return binlog_storage_delegate->add_observer(observer, (st_plugin_int *)p);
+}
+
+int unregister_binlog_storage_observer(Binlog_storage_observer *observer, void *p)
+{
+ return binlog_storage_delegate->remove_observer(observer, (st_plugin_int *)p);
+}
+
+#ifdef HAVE_REPLICATION
+int register_binlog_transmit_observer(Binlog_transmit_observer *observer, void *p)
+{
+ return binlog_transmit_delegate->add_observer(observer, (st_plugin_int *)p);
+}
+
+int unregister_binlog_transmit_observer(Binlog_transmit_observer *observer, void *p)
+{
+ return binlog_transmit_delegate->remove_observer(observer, (st_plugin_int *)p);
+}
+
+int register_binlog_relay_io_observer(Binlog_relay_IO_observer *observer, void *p)
+{
+ return binlog_relay_io_delegate->add_observer(observer, (st_plugin_int *)p);
+}
+
+int unregister_binlog_relay_io_observer(Binlog_relay_IO_observer *observer, void *p)
+{
+ return binlog_relay_io_delegate->remove_observer(observer, (st_plugin_int *)p);
+}
+#endif /* HAVE_REPLICATION */
=== added file 'sql/rpl_handler.h'
--- a/sql/rpl_handler.h 1970-01-01 00:00:00 +0000
+++ b/sql/rpl_handler.h 2008-09-23 15:06:18 +0000
@@ -0,0 +1,213 @@
+/* Copyright (C) 2008 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; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef RPL_HANDLER_H
+#define RPL_HANDLER_H
+
+#include "mysql_priv.h"
+#include "rpl_mi.h"
+#include "rpl_rli.h"
+#include "sql_plugin.h"
+#include "replication.h"
+
+class Observer_info {
+public:
+ void *observer;
+ st_plugin_int *plugin_int;
+ plugin_ref plugin;
+
+ Observer_info(void *ob, st_plugin_int *p)
+ :observer(ob), plugin_int(p)
+ {
+ plugin= plugin_int_to_ref(plugin_int);
+ }
+};
+
+class Delegate {
+public:
+ typedef List<Observer_info> Observer_info_list;
+ typedef List_iterator<Observer_info> Observer_info_iterator;
+
+ int add_observer(void *observer, st_plugin_int *plugin)
+ {
+ int ret= FALSE;
+ if (!inited)
+ return TRUE;
+ write_lock();
+ Observer_info_iterator iter(observer_info_list);
+ Observer_info *info= iter++;
+ while (info && info->observer != observer)
+ info= iter++;
+ if (!info)
+ {
+ info= new Observer_info(observer, plugin);
+ if (!info || observer_info_list.push_back(info, &memroot))
+ ret= TRUE;
+ }
+ else
+ ret= TRUE;
+ unlock();
+ return ret;
+ }
+
+ int remove_observer(void *observer, st_plugin_int *plugin)
+ {
+ int ret= FALSE;
+ if (!inited)
+ return TRUE;
+ write_lock();
+ Observer_info_iterator iter(observer_info_list);
+ Observer_info *info= iter++;
+ while (info && info->observer != observer)
+ info= iter++;
+ if (info)
+ iter.remove();
+ else
+ ret= TRUE;
+ unlock();
+ return ret;
+ }
+
+ inline Observer_info_iterator observer_info_iter()
+ {
+ return Observer_info_iterator(observer_info_list);
+ }
+
+ inline bool is_empty()
+ {
+ return observer_info_list.is_empty();
+ }
+
+ inline int read_lock()
+ {
+ if (!inited)
+ return TRUE;
+ return rw_rdlock(&lock);
+ }
+
+ inline int write_lock()
+ {
+ if (!inited)
+ return TRUE;
+ return rw_wrlock(&lock);
+ }
+
+ inline int unlock()
+ {
+ if (!inited)
+ return TRUE;
+ return rw_unlock(&lock);
+ }
+
+ inline bool is_inited()
+ {
+ return inited;
+ }
+
+ Delegate()
+ {
+ inited= FALSE;
+ if (my_rwlock_init(&lock, NULL))
+ return;
+ init_sql_alloc(&memroot, 1024, 0);
+ inited= TRUE;
+ }
+ ~Delegate()
+ {
+ inited= FALSE;
+ rwlock_destroy(&lock);
+ free_root(&memroot, MYF(0));
+ }
+
+private:
+ Observer_info_list observer_info_list;
+ rw_lock_t lock;
+ MEM_ROOT memroot;
+ bool inited;
+};
+
+class Trans_delegate
+ :public Delegate {
+public:
+ typedef Trans_observer Observer;
+ int before_commit(THD *thd, bool all);
+ int before_rollback(THD *thd, bool all);
+ int after_commit(THD *thd, bool all);
+ int after_rollback(THD *thd, bool all);
+};
+
+class Binlog_storage_delegate
+ :public Delegate {
+public:
+ typedef Binlog_storage_observer Observer;
+ int after_flush(THD *thd, const char *log_file,
+ my_off_t log_pos, bool synced);
+};
+
+#ifdef HAVE_REPLICATION
+class Binlog_transmit_delegate
+ :public Delegate {
+public:
+ typedef Binlog_transmit_observer Observer;
+ int transmit_start(THD *thd, ushort flags,
+ const char *log_file, my_off_t log_pos);
+ int transmit_stop(THD *thd, ushort flags);
+ int reserve_header(THD *thd, ushort flags, String *packet);
+ int before_send_event(THD *thd, ushort flags,
+ String *packet, const
+ char *log_file, my_off_t log_pos );
+ int after_send_event(THD *thd, ushort flags,
+ String *packet);
+ int after_reset_master(THD *thd, ushort flags);
+};
+
+class Binlog_relay_IO_delegate
+ :public Delegate {
+public:
+ typedef Binlog_relay_IO_observer Observer;
+ int thread_start(THD *thd, Master_info *mi);
+ int thread_stop(THD *thd, Master_info *mi);
+ int before_request_transmit(THD *thd, Master_info *mi, ushort flags);
+ int after_read_event(THD *thd, Master_info *mi,
+ const char *packet, ulong len,
+ const char **event_buf, ulong *event_len);
+ int after_queue_event(THD *thd, Master_info *mi,
+ const char *event_buf, ulong event_len,
+ bool synced);
+ int after_reset_slave(THD *thd, Master_info *mi);
+private:
+ void init_param(Binlog_relay_IO_param *param, Master_info *mi);
+};
+#endif /* HAVE_REPLICATION */
+
+int delegates_init();
+void delegates_destroy();
+
+extern Trans_delegate *transaction_delegate;
+extern Binlog_storage_delegate *binlog_storage_delegate;
+#ifdef HAVE_REPLICATION
+extern Binlog_transmit_delegate *binlog_transmit_delegate;
+extern Binlog_relay_IO_delegate *binlog_relay_io_delegate;
+#endif /* HAVE_REPLICATION */
+
+/*
+ if there is no observers in the delegate, we can return 0
+ immediately.
+*/
+#define RUN_HOOK(group, hook, args) \
+ (group ##_delegate->is_empty() ? \
+ 0 : group ##_delegate->hook args)
+
+#endif /* RPL_HANDLER_H */
=== modified file 'sql/slave.cc'
--- a/sql/slave.cc 2008-08-08 01:39:23 +0000
+++ b/sql/slave.cc 2008-09-26 14:05:38 +0000
@@ -40,6 +40,7 @@
#include <sql_common.h>
#include <errmsg.h>
#include <mysys_err.h>
+#include "rpl_handler.h"
#ifdef HAVE_REPLICATION
@@ -68,6 +69,8 @@ ulonglong relay_log_space_limit = 0;
int disconnect_slave_event_count = 0, abort_slave_event_count = 0;
int events_till_abort = -1;
+static pthread_key(Master_info*, RPL_MASTER_INFO);
+
enum enum_slave_reconnect_actions
{
SLAVE_RECON_ACT_REG= 0,
@@ -226,6 +229,10 @@ int init_slave()
TODO: re-write this to interate through the list of files
for multi-master
*/
+
+ if (pthread_key_create(&RPL_MASTER_INFO, NULL))
+ goto err;
+
active_mi= new Master_info;
/*
@@ -1500,17 +1507,22 @@ static int safe_sleep(THD* thd, int sec,
}
-static int request_dump(MYSQL* mysql, Master_info* mi,
- bool *suppress_warnings)
+static int request_dump(THD *thd, MYSQL* mysql, Master_info* mi,
+ bool *suppress_warnings)
{
uchar buf[FN_REFLEN + 10];
int len;
- int binlog_flags = 0; // for now
+ ushort binlog_flags = 0; // for now
char* logname = mi->master_log_name;
DBUG_ENTER("request_dump");
*suppress_warnings= FALSE;
+ if (RUN_HOOK(binlog_relay_io,
+ before_request_transmit,
+ (thd, mi, binlog_flags)))
+ DBUG_RETURN(1);
+
// TODO if big log files: Change next to int8store()
int4store(buf, (ulong) mi->master_log_pos);
int2store(buf + 4, binlog_flags);
@@ -2135,6 +2147,12 @@ pthread_handler_t handle_slave_io(void *
mi->master_log_name,
llstr(mi->master_log_pos,llbuff)));
+ /* This must be called before run any binlog_relay_io hooks */
+ my_pthread_setspecific_ptr(RPL_MASTER_INFO, mi);
+
+ if (RUN_HOOK(binlog_relay_io, thread_start, (thd, mi)))
+ goto err;
+
if (!(mi->mysql = mysql = mysql_init(NULL)))
{
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
@@ -2209,7 +2227,7 @@ connected:
while (!io_slave_killed(thd,mi))
{
thd_proc_info(thd, "Requesting binlog dump");
- if (request_dump(mysql, mi, &suppress_warnings))
+ if (request_dump(thd, mysql, mi, &suppress_warnings))
{
sql_print_error("Failed on request_dump()");
if (check_io_slave_killed(thd, mi, "Slave I/O thread killed while \
@@ -2229,6 +2247,7 @@ requesting master dump") ||
goto err;
goto connected;
});
+ const char *event_buf;
while (!io_slave_killed(thd,mi))
{
@@ -2284,10 +2303,27 @@ Stopping slave I/O thread due to out-of-
retry_count=0; // ok event, reset retry counter
thd_proc_info(thd, "Queueing master event to the relay log");
- if (queue_event(mi,(const char*)mysql->net.read_pos + 1, event_len))
+ event_buf= (const char*)mysql->net.read_pos + 1;
+ if (RUN_HOOK(binlog_relay_io, after_read_event,
+ (thd, mi,(const char*)mysql->net.read_pos + 1,
+ event_len, &event_buf, &event_len)))
+ {
+ sql_print_error("Failed to run 'after_read_event' hook");
+ goto err;
+ }
+
+ /* XXX: 'synced' should be updated by queue_event to indicate
+ whether event has been synced to disk */
+ bool synced= 0;
+ if (queue_event(mi, event_buf, event_len))
{
goto err;
}
+
+ if (RUN_HOOK(binlog_relay_io, after_queue_event,
+ (thd, mi, event_buf, event_len, synced)))
+ goto err;
+
if (flush_master_info(mi, 1))
{
sql_print_error("Failed to flush master info file");
@@ -2334,6 +2370,7 @@ err:
sql_print_information("Slave I/O thread exiting, read up to log '%s', position %s",
IO_RPL_LOG_NAME, llstr(mi->master_log_pos,llbuff));
pthread_mutex_lock(&LOCK_thread_count);
+ RUN_HOOK(binlog_relay_io, thread_stop, (thd, mi));
thd->query = thd->db = 0; // extra safety
thd->query_length= thd->db_length= 0;
pthread_mutex_unlock(&LOCK_thread_count);
@@ -3454,6 +3491,64 @@ static int safe_reconnect(THD* thd, MYSQ
}
+MYSQL *rpl_connect_master(MYSQL *mysql)
+{
+ THD *thd= current_thd;
+ Master_info *mi= my_pthread_getspecific_ptr(Master_info*, RPL_MASTER_INFO);
+ if (!mi)
+ {
+ sql_print_error("'rpl_connect_master' must be called in slave I/O thread context.");
+ return NULL;
+ }
+
+ bool allocated= false;
+
+ if (!mysql)
+ {
+ if(!(mysql= mysql_init(NULL)))
+ return NULL;
+ allocated= true;
+ }
+
+ /*
+ XXX: copied from connect_to_master, this function should not
+ change the slave status, so we cannot use connect_to_master
+ directly
+
+ TODO: make this part a seperate function to eliminate duplication
+ */
+ mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (char *) &slave_net_timeout);
+ mysql_options(mysql, MYSQL_OPT_READ_TIMEOUT, (char *) &slave_net_timeout);
+
+#ifdef HAVE_OPENSSL
+ if (mi->ssl)
+ {
+ mysql_ssl_set(mysql,
+ mi->ssl_key[0]?mi->ssl_key:0,
+ mi->ssl_cert[0]?mi->ssl_cert:0,
+ mi->ssl_ca[0]?mi->ssl_ca:0,
+ mi->ssl_capath[0]?mi->ssl_capath:0,
+ mi->ssl_cipher[0]?mi->ssl_cipher:0);
+ mysql_options(mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
+ &mi->ssl_verify_server_cert);
+ }
+#endif
+
+ mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset_info->csname);
+ /* This one is not strictly needed but we have it here for completeness */
+ mysql_options(mysql, MYSQL_SET_CHARSET_DIR, (char *) charsets_dir);
+
+ if (io_slave_killed(thd, mi)
+ || !mysql_real_connect(mysql, mi->host, mi->user, mi->password, 0,
+ mi->port, 0, 0))
+ {
+ if (allocated)
+ mysql_close(mysql); // this will free the object
+ return NULL;
+ }
+ return mysql;
+}
+
/*
Store the file and position where the execute-slave thread are in the
relay log.
=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc 2008-09-16 17:58:49 +0000
+++ b/sql/sql_insert.cc 2008-10-02 10:37:27 +0000
@@ -3788,10 +3788,10 @@ void select_create::abort()
DBUG_ENTER("select_create::abort");
/*
- In select_insert::abort() we roll back the statement, including
- truncating the transaction cache of the binary log. To do this, we
- pretend that the statement is transactional, even though it might
- be the case that it was not.
+ We roll back the statement here, including truncating the
+ transaction cache of the binary log. To do this, we pretend that
+ the statement is transactional, even though it might be the case
+ that it was not.
We roll back the statement prior to deleting the table and prior
to releasing the lock on the table, since there might be potential
@@ -3805,6 +3805,7 @@ void select_create::abort()
tmp_disable_binlog(thd);
select_insert::abort();
thd->transaction.stmt.modified_non_trans_table= FALSE;
+ trans_rollback_stmt(thd);
reenable_binlog(thd);
thd->binlog_flush_pending_rows_event(TRUE);
=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc 2008-09-16 08:34:30 +0000
+++ b/sql/sql_parse.cc 2008-09-26 16:30:56 +0000
@@ -21,6 +21,7 @@
#include <m_ctype.h>
#include <myisam.h>
#include <my_dir.h>
+#include "rpl_handler.h"
#include "sp_head.h"
#include "sp.h"
=== modified file 'sql/sql_plugin.cc'
--- a/sql/sql_plugin.cc 2008-08-19 15:58:48 +0000
+++ b/sql/sql_plugin.cc 2008-09-23 14:33:18 +0000
@@ -20,14 +20,6 @@
#define REPORT_TO_LOG 1
#define REPORT_TO_USER 2
-#ifdef DBUG_OFF
-#define plugin_ref_to_int(A) A
-#define plugin_int_to_ref(A) A
-#else
-#define plugin_ref_to_int(A) (A ? A[0] : NULL)
-#define plugin_int_to_ref(A) &(A)
-#endif
-
extern struct st_mysql_plugin *mysqld_builtins[];
char *opt_plugin_load= NULL;
@@ -44,7 +36,8 @@ const LEX_STRING plugin_type_names[MYSQL
{ C_STRING_WITH_LEN("FTPARSER") },
{ C_STRING_WITH_LEN("DAEMON") },
{ C_STRING_WITH_LEN("INFORMATION SCHEMA") },
- { C_STRING_WITH_LEN("AUDIT") }
+ { C_STRING_WITH_LEN("AUDIT") },
+ { C_STRING_WITH_LEN("REPLICATION") },
};
extern int initialize_schema_table(st_plugin_int *plugin);
@@ -89,7 +82,8 @@ static int min_plugin_info_interface_ver
MYSQL_FTPARSER_INTERFACE_VERSION,
MYSQL_DAEMON_INTERFACE_VERSION,
MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION,
- MYSQL_AUDIT_INTERFACE_VERSION
+ MYSQL_AUDIT_INTERFACE_VERSION,
+ MYSQL_REPLICATION_INTERFACE_VERSION
};
static int cur_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]=
{
@@ -98,7 +92,8 @@ static int cur_plugin_info_interface_ver
MYSQL_FTPARSER_INTERFACE_VERSION,
MYSQL_DAEMON_INTERFACE_VERSION,
MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION,
- MYSQL_AUDIT_INTERFACE_VERSION
+ MYSQL_AUDIT_INTERFACE_VERSION,
+ MYSQL_REPLICATION_INTERFACE_VERSION
};
static bool initialized= 0;
=== modified file 'sql/sql_plugin.h'
--- a/sql/sql_plugin.h 2008-06-27 20:56:54 +0000
+++ b/sql/sql_plugin.h 2008-09-23 14:33:18 +0000
@@ -18,6 +18,14 @@
class sys_var;
+#ifdef DBUG_OFF
+#define plugin_ref_to_int(A) A
+#define plugin_int_to_ref(A) A
+#else
+#define plugin_ref_to_int(A) (A ? A[0] : NULL)
+#define plugin_int_to_ref(A) &(A)
+#endif
+
/*
the following flags are valid for plugin_init()
*/
=== modified file 'sql/sql_repl.cc'
--- a/sql/sql_repl.cc 2008-09-04 18:30:34 +0000
+++ b/sql/sql_repl.cc 2008-09-23 14:33:18 +0000
@@ -21,6 +21,7 @@
#include "log_event.h"
#include "rpl_filter.h"
#include <my_dir.h>
+#include "rpl_handler.h"
int max_binlog_dump_events = 0; // unlimited
my_bool opt_sporadic_binlog_dump_fail = 0;
@@ -378,11 +379,36 @@ static int send_heartbeat_event(NET* net
{
DBUG_RETURN(-1);
}
- packet->set("\0", 1, &my_charset_bin);
DBUG_RETURN(0);
}
/*
+ Reset thread transmit packet buffer for event sending
+
+ This function allocates header bytes for event transmission, and
+ should be called before store the event data to the packet buffer.
+*/
+static int reset_transmit_packet(THD *thd, ushort flags,
+ ulong *ev_offset, const char **errmsg)
+{
+ int ret= 0;
+ String *packet= &thd->packet;
+
+ /* reserve and set default header */
+ packet->length(0);
+ packet->set("\0", 1, &my_charset_bin);
+
+ if (RUN_HOOK(binlog_transmit, reserve_header, (thd, flags, packet)))
+ {
+ *errmsg= "Failed to run hook 'reserve_header'";
+ my_errno= ER_UNKNOWN_ERROR;
+ ret= 1;
+ }
+ *ev_offset= packet->length();
+ return ret;
+}
+
+/*
TODO: Clean up loop to only have one call to send_file()
*/
@@ -392,6 +418,9 @@ void mysql_binlog_send(THD* thd, char* l
LOG_INFO linfo;
char *log_file_name = linfo.log_file_name;
char search_file_name[FN_REFLEN], *name;
+
+ ulong ev_offset;
+
IO_CACHE log;
File file = -1;
String* packet = &thd->packet;
@@ -407,6 +436,9 @@ void mysql_binlog_send(THD* thd, char* l
DBUG_PRINT("enter",("log_ident: '%s' pos: %ld", log_ident, (long) pos));
bzero((char*) &log,sizeof(log));
+ sql_print_information("Start binlog_dump to slave_server(%d), pos(%s, %lu)",
+ thd->server_id, log_ident, (ulong)pos);
+
/*
heartbeat_period from @master_heartbeat_period user variable
*/
@@ -423,6 +455,13 @@ void mysql_binlog_send(THD* thd, char* l
coord->file_name= log_file_name; // initialization basing on what slave remembers
coord->pos= pos;
}
+ if (RUN_HOOK(binlog_transmit, transmit_start, (thd, flags, log_ident, pos)))
+ {
+ errmsg= "Failed to run hook 'transmit_start'";
+ my_errno= ER_UNKNOWN_ERROR;
+ goto err;
+ }
+
#ifndef DBUG_OFF
if (opt_sporadic_binlog_dump_fail && (binlog_dump_count++ % 2))
{
@@ -477,11 +516,9 @@ impossible position";
goto err;
}
- /*
- We need to start a packet with something other than 255
- to distinguish it from error
- */
- packet->set("\0", 1, &my_charset_bin); /* This is the start of a new packet */
+ /* reset transmit packet for the fake rotate event below */
+ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
+ goto err;
/*
Tell the client about the log name with a fake Rotate event;
@@ -521,7 +558,7 @@ impossible position";
my_errno= ER_MASTER_FATAL_ERROR_READING_BINLOG;
goto err;
}
- packet->set("\0", 1, &my_charset_bin);
+
/*
Adding MAX_LOG_EVENT_HEADER_LEN, since a binlog event can become
this larger than the corresponding packet (query) sent
@@ -537,6 +574,11 @@ impossible position";
log_lock = mysql_bin_log.get_log_lock();
if (pos > BIN_LOG_HEADER_SIZE)
{
+ /* reset transmit packet for the event read from binary log
+ file */
+ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
+ goto err;
+
/*
Try to find a Format_description_log_event at the beginning of
the binlog
@@ -544,29 +586,30 @@ impossible position";
if (!(error = Log_event::read_log_event(&log, packet, log_lock)))
{
/*
- The packet has offsets equal to the normal offsets in a binlog
- event +1 (the first character is \0).
+ The packet has offsets equal to the normal offsets in a
+ binlog event + ev_offset (the first ev_offset characters are
+ the header (default \0)).
*/
DBUG_PRINT("info",
("Looked for a Format_description_log_event, found event type %d",
- (*packet)[EVENT_TYPE_OFFSET+1]));
- if ((*packet)[EVENT_TYPE_OFFSET+1] == FORMAT_DESCRIPTION_EVENT)
+ (*packet)[EVENT_TYPE_OFFSET+ev_offset]));
+ if ((*packet)[EVENT_TYPE_OFFSET+ev_offset] == FORMAT_DESCRIPTION_EVENT)
{
- binlog_can_be_corrupted= test((*packet)[FLAGS_OFFSET+1] &
+ binlog_can_be_corrupted= test((*packet)[FLAGS_OFFSET+ev_offset] &
LOG_EVENT_BINLOG_IN_USE_F);
- (*packet)[FLAGS_OFFSET+1] &= ~LOG_EVENT_BINLOG_IN_USE_F;
+ (*packet)[FLAGS_OFFSET+ev_offset] &= ~LOG_EVENT_BINLOG_IN_USE_F;
/*
mark that this event with "log_pos=0", so the slave
should not increment master's binlog position
(rli->group_master_log_pos)
*/
- int4store((char*) packet->ptr()+LOG_POS_OFFSET+1, 0);
+ int4store((char*) packet->ptr()+LOG_POS_OFFSET+ev_offset, 0);
/*
if reconnect master sends FD event with `created' as 0
to avoid destroying temp tables.
*/
int4store((char*) packet->ptr()+LOG_EVENT_MINIMAL_HEADER_LEN+
- ST_CREATED_OFFSET+1, (ulong) 0);
+ ST_CREATED_OFFSET+ev_offset, (ulong) 0);
/* send it */
if (my_net_write(net, (uchar*) packet->ptr(), packet->length()))
{
@@ -592,8 +635,6 @@ impossible position";
Format_description_log_event will be found naturally if it is written.
*/
}
- /* reset the packet as we wrote to it in any case */
- packet->set("\0", 1, &my_charset_bin);
} /* end of if (pos > BIN_LOG_HEADER_SIZE); */
else
{
@@ -605,6 +646,12 @@ impossible position";
while (!net->error && net->vio != 0 && !thd->killed)
{
+ Log_event_type event_type= UNKNOWN_EVENT;
+
+ /* reset the transmit packet for the event read from binary log
+ file */
+ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
+ goto err;
while (!(error = Log_event::read_log_event(&log, packet, log_lock)))
{
#ifndef DBUG_OFF
@@ -620,17 +667,26 @@ impossible position";
log's filename does not change while it's active
*/
if (coord)
- coord->pos= uint4korr(packet->ptr() + 1 + LOG_POS_OFFSET);
+ coord->pos= uint4korr(packet->ptr() + ev_offset + LOG_POS_OFFSET);
- if ((*packet)[EVENT_TYPE_OFFSET+1] == FORMAT_DESCRIPTION_EVENT)
+ event_type= (Log_event_type)((*packet)[LOG_EVENT_OFFSET+ev_offset]);
+ if (event_type == FORMAT_DESCRIPTION_EVENT)
{
- binlog_can_be_corrupted= test((*packet)[FLAGS_OFFSET+1] &
+ binlog_can_be_corrupted= test((*packet)[FLAGS_OFFSET+ev_offset] &
LOG_EVENT_BINLOG_IN_USE_F);
- (*packet)[FLAGS_OFFSET+1] &= ~LOG_EVENT_BINLOG_IN_USE_F;
+ (*packet)[FLAGS_OFFSET+ev_offset] &= ~LOG_EVENT_BINLOG_IN_USE_F;
}
- else if ((*packet)[EVENT_TYPE_OFFSET+1] == STOP_EVENT)
+ else if (event_type == STOP_EVENT)
binlog_can_be_corrupted= FALSE;
+ pos = my_b_tell(&log);
+ if (RUN_HOOK(binlog_transmit, before_send_event,
+ (thd, flags, packet, log_file_name, pos)))
+ {
+ my_errno= ER_UNKNOWN_ERROR;
+ errmsg= "run 'before_send_event' hook failed";
+ goto err;
+ }
if (my_net_write(net, (uchar*) packet->ptr(), packet->length()))
{
errmsg = "Failed on my_net_write()";
@@ -638,9 +694,8 @@ impossible position";
goto err;
}
- DBUG_PRINT("info", ("log event code %d",
- (*packet)[LOG_EVENT_OFFSET+1] ));
- if ((*packet)[LOG_EVENT_OFFSET+1] == LOAD_EVENT)
+ DBUG_PRINT("info", ("log event code %d", event_type));
+ if (event_type == LOAD_EVENT)
{
if (send_file(thd))
{
@@ -649,7 +704,17 @@ impossible position";
goto err;
}
}
- packet->set("\0", 1, &my_charset_bin);
+
+ if (RUN_HOOK(binlog_transmit, after_send_event, (thd, flags, packet)))
+ {
+ errmsg= "Failed to run hook 'after_send_event'";
+ my_errno= ER_UNKNOWN_ERROR;
+ goto err;
+ }
+
+ /* reset transmit packet for next loop */
+ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
+ goto err;
}
/*
@@ -700,6 +765,11 @@ impossible position";
}
#endif
+ /* reset the transmit packet for the event read from binary log
+ file */
+ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
+ goto err;
+
/*
No one will update the log while we are reading
now, but we'll be quick and just read one record
@@ -718,6 +788,7 @@ impossible position";
read_packet = 1;
if (coord)
coord->pos= uint4korr(packet->ptr() + 1 + LOG_POS_OFFSET);
+ event_type= (Log_event_type)((*packet)[LOG_EVENT_OFFSET+ev_offset]);
break;
case LOG_READ_EOF:
@@ -753,6 +824,9 @@ impossible position";
sql_print_information("the rest of heartbeat info skipped ...");
}
#endif
+ /* reset transmit packet for the heartbeat event */
+ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
+ goto err;
if (send_heartbeat_event(net, packet, coord))
{
errmsg = "Failed on my_net_write()";
@@ -778,8 +852,17 @@ impossible position";
}
if (read_packet)
- {
- thd_proc_info(thd, "Sending binlog event to slave");
+ {
+ thd_proc_info(thd, "Sending binlog event to slave");
+ pos = my_b_tell(&log);
+ if (RUN_HOOK(binlog_transmit, before_send_event,
+ (thd, flags, packet, log_file_name, pos)))
+ {
+ my_errno= ER_UNKNOWN_ERROR;
+ errmsg= "run 'before_send_event' hook failed";
+ goto err;
+ }
+
if (my_net_write(net, (uchar*) packet->ptr(), packet->length()) )
{
errmsg = "Failed on my_net_write()";
@@ -787,7 +870,7 @@ impossible position";
goto err;
}
- if ((*packet)[LOG_EVENT_OFFSET+1] == LOAD_EVENT)
+ if (event_type == LOAD_EVENT)
{
if (send_file(thd))
{
@@ -796,11 +879,13 @@ impossible position";
goto err;
}
}
- packet->set("\0", 1, &my_charset_bin);
- /*
- No need to net_flush because we will get to flush later when
- we hit EOF pretty quick
- */
+
+ if (RUN_HOOK(binlog_transmit, after_send_event, (thd, flags, packet)))
+ {
+ my_errno= ER_UNKNOWN_ERROR;
+ errmsg= "Failed to run hook 'after_send_event'";
+ goto err;
+ }
}
if (fatal_error)
@@ -836,6 +921,10 @@ impossible position";
end_io_cache(&log);
(void) my_close(file, MYF(MY_WME));
+ /* reset transmit packet for the possible fake rotate event */
+ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
+ goto err;
+
/*
Call fake_rotate_event() in case the previous log (the one which
we have just finished reading) did not contain a Rotate event
@@ -853,8 +942,6 @@ impossible position";
goto err;
}
- packet->length(0);
- packet->append('\0');
if (coord)
coord->file_name= log_file_name; // reset to the next
}
@@ -864,6 +951,7 @@ end:
end_io_cache(&log);
(void)my_close(file, MYF(MY_WME));
+ RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
my_eof(thd);
thd_proc_info(thd, "Waiting to finalize termination");
pthread_mutex_lock(&LOCK_thread_count);
@@ -874,6 +962,7 @@ end:
err:
thd_proc_info(thd, "Waiting to finalize termination");
end_io_cache(&log);
+ RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
/*
Exclude iteration through thread list
this is needed for purge_logs() - it will iterate through
@@ -1134,6 +1223,7 @@ int reset_slave(THD *thd, Master_info* m
goto err;
}
+ RUN_HOOK(binlog_relay_io, after_reset_slave, (thd, mi));
err:
unlock_slave_threads(mi);
if (error)
@@ -1416,7 +1506,11 @@ int reset_master(THD* thd)
ER(ER_FLUSH_MASTER_BINLOG_CLOSED), MYF(ME_BELL+ME_WAITTANG));
return 1;
}
- return mysql_bin_log.reset_logs(thd);
+
+ if (mysql_bin_log.reset_logs(thd))
+ return 1;
+ RUN_HOOK(binlog_transmit, after_reset_master, (thd, 0 /* flags */));
+ return 0;
}
int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1,
@@ -1926,5 +2020,3 @@ int init_replication_sys_vars()
}
#endif /* HAVE_REPLICATION */
-
-
=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc 2008-09-16 17:58:49 +0000
+++ b/sql/sql_show.cc 2008-09-25 07:15:02 +0000
@@ -3641,6 +3641,12 @@ static int get_schema_tables_record(THD
if (share->comment.str)
table->field[20]->store(share->comment.str, share->comment.length, cs);
+ if (share->tablespace)
+ {
+ table->field[21]->store(share->tablespace, strlen(share->tablespace), cs);
+ table->field[21]->set_notnull();
+ }
+
if(file)
{
file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO);
@@ -6397,6 +6403,7 @@ ST_FIELD_INFO tables_fields_info[]=
{"CREATE_OPTIONS", 255, MYSQL_TYPE_STRING, 0, 1, "Create_options",
OPEN_FRM_ONLY},
{"TABLE_COMMENT", TABLE_COMMENT_MAXLEN, MYSQL_TYPE_STRING, 0, 0, "Comment", OPEN_FRM_ONLY},
+ {"TABLESPACE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 1, 0, OPEN_FRM_ONLY},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}
};
=== modified file 'sql/transaction.cc'
--- a/sql/transaction.cc 2008-08-12 22:30:55 +0000
+++ b/sql/transaction.cc 2008-09-23 14:33:18 +0000
@@ -20,6 +20,7 @@
#include "transaction.h"
#include "mysql_priv.h"
+#include "rpl_handler.h"
#ifdef WITH_MARIA_STORAGE_ENGINE
#include "../storage/maria/ha_maria.h"
@@ -97,6 +98,14 @@ bool trans_commit(THD *thd)
thd->server_status&= ~SERVER_STATUS_IN_TRANS;
res= ha_commit_trans(thd, TRUE);
+ if (res)
+ /*
+ if res is non-zero, then ha_commit_trans has rolled back the
+ transaction, so the hooks for rollback will be called.
+ */
+ RUN_HOOK(transaction, after_rollback, (thd, FALSE));
+ else
+ RUN_HOOK(transaction, after_commit, (thd, FALSE));
thd->options&= ~(OPTION_BEGIN | OPTION_KEEP_LOG);
thd->transaction.all.modified_non_trans_table= FALSE;
thd->lex->start_transaction_opt= 0;
@@ -163,6 +172,7 @@ bool trans_rollback(THD *thd)
thd->server_status&= ~SERVER_STATUS_IN_TRANS;
res= ha_rollback_trans(thd, TRUE);
+ RUN_HOOK(transaction, after_rollback, (thd, FALSE));
thd->options&= ~(OPTION_BEGIN | OPTION_KEEP_LOG);
thd->transaction.all.modified_non_trans_table= FALSE;
thd->lex->start_transaction_opt= 0;
@@ -192,6 +202,15 @@ bool trans_commit_stmt(THD *thd)
int res= FALSE;
if (thd->transaction.stmt.ha_list)
res= ha_commit_trans(thd, FALSE);
+
+ if (res)
+ /*
+ if res is non-zero, then ha_commit_trans has rolled back the
+ transaction, so the hooks for rollback will be called.
+ */
+ RUN_HOOK(transaction, after_rollback, (thd, FALSE));
+ else
+ RUN_HOOK(transaction, after_commit, (thd, FALSE));
DBUG_RETURN(test(res));
}
@@ -216,6 +235,8 @@ bool trans_rollback_stmt(THD *thd)
ha_rollback_trans(thd, TRUE);
}
+ RUN_HOOK(transaction, after_rollback, (thd, FALSE));
+
DBUG_RETURN(FALSE);
}
=== modified file 'storage/falcon/Cache.cpp'
--- a/storage/falcon/Cache.cpp 2008-09-09 20:57:57 +0000
+++ b/storage/falcon/Cache.cpp 2008-10-02 23:06:04 +0000
@@ -50,11 +50,9 @@
extern uint falcon_io_threads;
//#define STOP_PAGE 55
-//#define CACHE_TRACE_FILE "cache.trace"
+#define TRACE_FILE "cache.trace"
-#ifdef CACHE_TRACE_FILE
static FILE *traceFile;
-#endif // CACHE_TRACE_FILE
static const uint64 cacheHunkSize = 1024 * 1024 * 128;
static const int ASYNC_BUFFER_SIZE = 1024000;
@@ -70,47 +68,23 @@ static const char THIS_FILE[]=__FILE__;
Cache::Cache(Database *db, int pageSz, int hashSz, int numBuffers)
{
- openTraceFile();
+ //openTraceFile();
database = db;
panicShutdown = false;
pageSize = pageSz;
-
- unsigned int highBit;
- for (highBit=0x01; highBit < (unsigned int)hashSz; highBit= highBit << 1) { }
-
- // if there are more than 4096 buckets then lets round down
- // else lets round up
- if (highBit >= 0x00001000) {
- // use power of two rounded down
- hashSize = highBit << 1;
- } else {
- // use power of two rounded up
- hashSize = highBit;
- }
-
- hashMask = hashSize - 1;
+ hashSize = hashSz;
numberBuffers = numBuffers;
upperFraction = numberBuffers / 4;
bufferAge = 0;
firstDirty = NULL;
lastDirty = NULL;
+ numberDirtyPages = 0;
pageWriter = NULL;
- hashTable = new Bdb* [hashSize];
+ hashTable = new Bdb* [hashSz];
memset (hashTable, 0, sizeof (Bdb*) * hashSize);
-#ifdef DEBUG_SYNC_HASH_TABLE_SIZE
- syncHashTable = new SyncObject [DEBUG_SYNC_HASH_TABLE_SIZE];
- for (int loop = 0; loop < DEBUG_SYNC_HASH_TABLE_SIZE; loop ++)
- syncHashTable[loop].setName("Cache::syncHashTable");
-#else /* DEBUG_SYNC_HASH_TABLE_SIZE */
- syncHashTable = new SyncObject [hashSize];
- for (int loop = 0; loop < hashSize; loop ++)
- {
- char tmpName[128];
- snprintf(tmpName,120,"Cache::syncHashTable[%d]",loop);
- syncHashTable[loop].setName(tmpName);
- }
-#endif /* DEBUG_SYNC_HASH_TABLE_SIZE */
- sectorCache = new SectorCache(sectorCacheSize / SECTOR_BUFFER_SIZE, pageSize);
+
+ if (falcon_use_sectorcache)
+ sectorCache = new SectorCache(sectorCacheSize / SECTOR_BUFFER_SIZE, pageSize);
uint64 n = ((uint64) pageSize * numberBuffers + cacheHunkSize - 1) / cacheHunkSize;
numberHunks = (int) n;
@@ -131,7 +105,6 @@ Cache::Cache(Database *db, int pageSz, i
try
{
- // non-protected access to bdbs,endBdbs is OK during initialization
bdbs = new Bdb [numberBuffers];
endBdbs = bdbs + numberBuffers;
int remaining = 0;
@@ -150,7 +123,6 @@ Cache::Cache(Database *db, int pageSz, i
}
bdb->cache = this;
- // non-protected access to bufferQueue is OK during initialization
bufferQueue.append(bdb);
bdb->buffer = (Page*) stuff;
stuff += pageSize;
@@ -176,15 +148,16 @@ Cache::Cache(Database *db, int pageSz, i
Cache::~Cache()
{
-
- closeTraceFile();
+ if (traceFile)
+ closeTraceFile();
delete [] hashTable;
- delete [] syncHashTable;
delete [] bdbs;
delete [] ioThreads;
delete flushBitmap;
- delete sectorCache;
+
+ if (falcon_use_sectorcache)
+ delete sectorCache;
if (bufferHunks)
{
@@ -198,12 +171,15 @@ Cache::~Cache()
Bdb* Cache::probePage(Dbb *dbb, int32 pageNumber)
{
ASSERT (pageNumber >= 0);
- Bdb *bdb;
+ Sync sync (&syncObject, "Cache::probePage");
+ sync.lock (Shared);
+ Bdb *bdb = findBdb(dbb, pageNumber);
- /* If we already have a buffer for this, we're done */
- bdb = lockFindBdbIncrementUseCount(dbb, pageNumber);
if (bdb)
{
+ bdb->incrementUseCount(ADD_HISTORY);
+ sync.unlock();
+
if (bdb->buffer->pageType == PAGE_free)
{
bdb->decrementUseCount(REL_HISTORY);
@@ -220,49 +196,11 @@ Bdb* Cache::probePage(Dbb *dbb, int32 pa
return NULL;
}
-Bdb* Cache::findBdb(Dbb* dbb, int32 pageNumber, int slot)
-{
- for (Bdb *bdb = hashTable [slot]; bdb; bdb = bdb->hash)
-{
- if (bdb->pageNumber == pageNumber && bdb->dbb == dbb)
- {
- return bdb;
- }
- }
-
- return NULL;
-}
-
Bdb* Cache::findBdb(Dbb* dbb, int32 pageNumber)
{
- return (findBdb(dbb, pageNumber, PAGENUM_2_SLOT(pageNumber)));
-}
-
-Bdb* Cache::lockFindBdbIncrementUseCount(Dbb* dbb, int32 pageNumber)
-{
- int slot = PAGENUM_2_SLOT(pageNumber);
- Sync lockHash (&syncHashTable[PAGENUM_2_LOCK_INDEX(pageNumber, slot)], "Cache::lockFindBdbIncrementUseCount");
- lockHash.lock (Shared);
- Bdb *bdb;
-
- bdb = findBdb(dbb, pageNumber, slot);
- if (bdb != NULL)
- bdb->incrementUseCount(ADD_HISTORY);
-
- return bdb;
-}
-
-Bdb* Cache::lockFindBdbIncrementUseCount(int32 pageNumber, int slot)
-{
- Sync lockHash (&syncHashTable[PAGENUM_2_LOCK_INDEX(pageNumber, slot)], "Cache::lockFindBdbIncrementUseCount");
- lockHash.lock (Shared);
-
- for (Bdb *bdb = hashTable [slot]; bdb; bdb = bdb->hash)
- if (bdb->pageNumber == pageNumber)
- {
- bdb->incrementUseCount(ADD_HISTORY);
+ for (Bdb *bdb = hashTable [pageNumber % hashSize]; bdb; bdb = bdb->hash)
+ if (bdb->pageNumber == pageNumber && bdb->dbb == dbb)
return bdb;
- }
return NULL;
}
@@ -283,39 +221,52 @@ Bdb* Cache::fetchPage(Dbb *dbb, int32 pa
#endif
ASSERT (pageNumber >= 0);
+ int slot = pageNumber % hashSize;
+ LockType actual = lockType;
+ Sync sync (&syncObject, "Cache::fetchPage");
+ sync.lock (Shared);
+ int hit = 0;
+
+ /* If we already have a buffer for this go, we're done */
+
Bdb *bdb;
- /* If we already have a buffer for this, we're done */
- bdb = lockFindBdbIncrementUseCount(dbb, pageNumber);
+ for (bdb = hashTable [slot]; bdb; bdb = bdb->hash)
+ if (bdb->pageNumber == pageNumber && bdb->dbb == dbb)
+ {
+ //syncObject.validateShared("Cache::fetchPage");
+ bdb->incrementUseCount(ADD_HISTORY);
+ sync.unlock();
+ bdb->addRef(lockType COMMA_ADD_HISTORY);
+ bdb->decrementUseCount(REL_HISTORY);
+ hit = 1;
+ break;
+ }
+
if (!bdb)
{
- // getFreeBuffer() locks a hash bucket to remove the candidate bdb
- // if we locked our hash bucket before the call then we could have
- // a deadlock
- // thus we get the free buffer before we lock the hash bucket we will
- // be inserting into. This avoids a dead lock but generates a race
- // we take care of the race by reversing the getFreeBuffer() work
- // when we lose the race
- Bdb *bdbAvailable;
- int slot = PAGENUM_2_SLOT(pageNumber);
- Sync lockHash (&syncHashTable[PAGENUM_2_LOCK_INDEX(pageNumber, slot)], "Cache::fetchPage");
-
- bdbAvailable = getFreeBuffer();
- /* assume we'll be inserting this new BDB. Set new page number. */
- bdbAvailable->pageNumber = pageNumber;
- bdbAvailable->dbb = dbb;
+ sync.unlock();
+ actual = Exclusive;
+ sync.lock(Exclusive);
+
+ for (bdb = hashTable [slot]; bdb; bdb = bdb->hash)
+ if (bdb->pageNumber == pageNumber && bdb->dbb == dbb)
+ {
+ //syncObject.validateExclusive("Cache::fetchPage (retry)");
+ bdb->incrementUseCount(ADD_HISTORY);
+ sync.unlock();
+ bdb->addRef(lockType COMMA_ADD_HISTORY);
+ bdb->decrementUseCount(REL_HISTORY);
+ hit = 2;
+ break;
+ }
- lockHash.lock(Exclusive);
- bdb = findBdb(dbb, pageNumber, slot);
if (!bdb)
{
- // we won the race so lets use the free bdb
- // relink into hash table
- bdbAvailable->hash = hashTable [slot];
- hashTable [slot] = bdbAvailable;
- lockHash.unlock();
+ bdb = findBuffer(dbb, pageNumber, actual);
+ moveToHead(bdb);
+ sync.unlock();
- bdb = bdbAvailable;
#ifdef STOP_PAGE
if (bdb->pageNumber == STOP_PAGE)
Log::debug("reading page %d/%d\n", bdb->pageNumber, dbb->tableSpaceId);
@@ -331,31 +282,9 @@ Bdb* Cache::fetchPage(Dbb *dbb, int32 pa
#ifdef HAVE_PAGE_NUMBER
ASSERT(bdb->buffer->pageNumber == pageNumber);
#endif
- if (Exclusive != lockType)
+ if (actual != lockType)
bdb->downGrade(lockType);
}
- else
- {
- //syncObject.validateExclusive("Cache::fetchPage (retry)");
- bdb->incrementUseCount(ADD_HISTORY);
- lockHash.unlock();
- bdb->addRef(lockType COMMA_ADD_HISTORY);
- bdb->decrementUseCount(REL_HISTORY);
- moveToHead(bdb);
-
- // lost a race. put our available back to useable
- // side effect, bdbAvailable will have to age again before we re-use it.
- bdbAvailable->hash = NULL;
- bdbAvailable->pageNumber = -1;
- bdbAvailable->dbb = NULL;
- bdbAvailable->release(REL_HISTORY);
- }
- }
- else
- {
- bdb->addRef(lockType COMMA_ADD_HISTORY);
- bdb->decrementUseCount(REL_HISTORY);
- moveToHead(bdb);
}
Page *page = bdb->buffer;
@@ -369,7 +298,7 @@ Bdb* Cache::fetchPage(Dbb *dbb, int32 pa
if (pageType && page->pageType != pageType)
{
/*** future code
- bdb->release(REL_HISTORY);
+ bdb->release();
throw SQLError (DATABASE_CORRUPTION, "page %d wrong page type, expected %d got %d\n",
pageNumber, pageType, page->pageType);
***/
@@ -377,6 +306,14 @@ Bdb* Cache::fetchPage(Dbb *dbb, int32 pa
bdb->pageNumber, dbb->tableSpaceId, pageType, page->pageType);
}
+ // If buffer has moved out of the upper "fraction" of the LRU queue, move it back up
+
+ if (bdb->age < bufferAge - (uint64) upperFraction)
+ {
+ sync.lock (Exclusive);
+ moveToHead (bdb);
+ }
+
ASSERT (bdb->pageNumber == pageNumber);
ASSERT (bdb->dbb == dbb);
ASSERT (bdb->useCount > 0);
@@ -386,7 +323,9 @@ Bdb* Cache::fetchPage(Dbb *dbb, int32 pa
Bdb* Cache::fakePage(Dbb *dbb, int32 pageNumber, PageType type, TransId transId)
{
- Bdb *bdb;
+ Sync sync(&syncObject, "Cache::fakePage");
+ sync.lock(Exclusive);
+ int slot = pageNumber % hashSize;
#ifdef STOP_PAGE
if (pageNumber == STOP_PAGE)
@@ -394,66 +333,33 @@ Bdb* Cache::fakePage(Dbb *dbb, int32 pag
#endif
/* If we already have a buffer for this, we're done */
- bdb = lockFindBdbIncrementUseCount(dbb, pageNumber);
- if (!bdb)
- {
- // getFreeBuffer() locks a hash bucket to remove the candidate bdb
- // if we locked our hash bucket before the call then we could have
- // a deadlock
- // thus we get the free buffer before we lock the hash bucket we will
- // be inserting into. This avoids a dead lock but generates a race
- // we take care of the race by reversing the getFreeBuffer() work
- // when we lose the race
- Bdb *bdbAvailable;
- int slot = PAGENUM_2_SLOT(pageNumber);
- Sync lockHash (&syncHashTable[PAGENUM_2_LOCK_INDEX(pageNumber, slot)], "Cache::fetchPage");
-
- bdbAvailable = getFreeBuffer();
- /* assume we'll be inserting this new BDB. Set new page number. */
- bdbAvailable->pageNumber = pageNumber;
- bdbAvailable->dbb = dbb;
- lockHash.lock(Exclusive);
- bdb = findBdb(dbb, pageNumber, slot);
- if (!bdb)
- {
- // we won the race so lets use the free bdb
- // relink into hash table
- bdbAvailable->hash = hashTable [slot];
- hashTable [slot] = bdbAvailable;
- lockHash.unlock();
+ Bdb *bdb;
- bdb = bdbAvailable;
- }
- else
+ for (bdb = hashTable [slot]; bdb; bdb = bdb->hash)
+ if (bdb->pageNumber == pageNumber && bdb->dbb == dbb)
{
- //syncObject.validateExclusive("Cache::fetchPage (retry)");
- bdb->incrementUseCount(ADD_HISTORY);
- lockHash.unlock();
+ if (bdb->syncObject.isLocked())
+ {
+ // The pageWriter may still be cleaning up this freed page with a shared lock
+ ASSERT(bdb->buffer->pageType == PAGE_free);
+ ASSERT(bdb->syncObject.getState() >= 0);
+ }
+
bdb->addRef(Exclusive COMMA_ADD_HISTORY);
- bdb->decrementUseCount(REL_HISTORY);
- moveToHead(bdb);
-
- // lost a race. put our available back to useable
- // side effect, bdbAvailable will have to age again before we re-use it.
- bdbAvailable->hash = NULL;
- bdbAvailable->pageNumber = -1;
- bdbAvailable->dbb = NULL;
- bdbAvailable->release(REL_HISTORY);
+
+ break;
}
- }
- else
- {
- bdb->addRef(Exclusive COMMA_ADD_HISTORY);
- bdb->decrementUseCount(REL_HISTORY);
- moveToHead(bdb);
- }
+
+ if (!bdb)
+ bdb = findBuffer(dbb, pageNumber, Exclusive);
if (!dbb->isReadOnly)
bdb->mark(transId);
memset(bdb->buffer, 0, pageSize);
bdb->setPageHeader(type);
+ moveToHead(bdb);
return bdb;
}
@@ -461,31 +367,32 @@ Bdb* Cache::fakePage(Dbb *dbb, int32 pag
void Cache::flush(int64 arg)
{
Sync flushLock(&syncFlush, "Cache::flush(1)");
- Sync dirtyLock(&syncDirty, "Cache::flush(2)");
+ Sync sync(&syncDirty, "Cache::flush(2)");
flushLock.lock(Exclusive);
if (flushing)
return;
syncWait.lock(NULL, Exclusive);
+ sync.lock(Shared);
//Log::debug(%d: "Initiating flush\n", dbb->deltaTime);
flushArg = arg;
flushPages = 0;
physicalWrites = 0;
- dirtyLock.lock(Shared);
for (Bdb *bdb = firstDirty; bdb; bdb = bdb->nextDirty)
{
bdb->flushIt = true;
flushBitmap->set(bdb->pageNumber);
++flushPages;
}
- dirtyLock.unlock();
- analyzeFlush();
+ if (traceFile)
+ analyzeFlush();
flushStart = database->timestamp;
flushing = true;
+ sync.unlock();
flushLock.unlock();
for (int n = 0; n < numberIoThreads; ++n)
@@ -495,131 +402,69 @@ void Cache::flush(int64 arg)
void Cache::moveToHead(Bdb * bdb)
{
- // If buffer has moved out of the upper "fraction" of the LRU queue, move it back up
- // non-protected access to age is harmless since it is fuzzy anyway
- if (bdb->age < bufferAge - (uint64) upperFraction)
- {
- Sync bufferQueueLock (&bufferQueue.syncObject, "Cache::moveToHead");
-
- bufferQueueLock.lock (Exclusive);
- bdb->age = bufferAge++;
- bufferQueue.remove(bdb);
- bufferQueue.prepend(bdb);
- //validateUnique (bdb);
- }
-}
-
-void Cache::moveToHeadAlreadyLocked(Bdb * bdb)
-{
bdb->age = bufferAge++;
bufferQueue.remove(bdb);
bufferQueue.prepend(bdb);
//validateUnique (bdb);
}
-Bdb* Cache::getFreeBuffer(void)
+Bdb* Cache::findBuffer(Dbb *dbb, int pageNumber, LockType lockType)
{
- Sync bufferQueueLock (&bufferQueue.syncObject, "Cache::getFreeBuffer");
- unsigned int count;
+ //syncObject.validateExclusive("Cache::findBuffer");
+ int slot = pageNumber % hashSize;
+ Sync sync(&syncDirty, "Cache::findBuffer");
+
+ /* Find least recently used, not-in-use buffer */
+
Bdb *bdb;
// Find a candidate BDB.
+
for (;;)
{
- bufferQueueLock.lock (Exclusive);
- // find a candidate that is NOT in use and NOT dirty and in the tail fraction of the LRU
- for (count = 0, bdb = bufferQueue.last; bdb ; bdb = bdb->prior, count++)
- {
- if (count >= upperFraction)
- {
- bdb = NULL;
- break;
- }
+ for (bdb = bufferQueue.last; bdb; bdb = bdb->prior)
if (bdb->useCount == 0)
- {
- if (!bdb->isDirty)
- {
- bdb->incrementUseCount(REL_HISTORY);
- moveToHeadAlreadyLocked(bdb);
- break;
- }
- }
- else
- {
- // get this one out of the way so we don't search it every time
- moveToHeadAlreadyLocked(bdb);
-#ifdef CHECK_STALLED_BDB
- bdb->stallCount++;
- if ((bdb->stallCount & 0x03) == 0x03) {
- Log::debug("Page %d is in use and aged %d times\n",
- bdb->pageNumber, bdb->stallCount);
- }
-#endif // CHECK_STALLED_BDB
- }
- }
- if (!bdb)
- // find a candidate that is NOT in use, could be dirty
- for (bdb = bufferQueue.last; bdb; bdb = bdb->prior)
- if (bdb->useCount == 0)
- {
- bdb->incrementUseCount(REL_HISTORY);
- moveToHeadAlreadyLocked(bdb);
- break;
- }
- bufferQueueLock.unlock();
+ break;
if (!bdb)
throw SQLError(RUNTIME_ERROR, "buffer pool is exhausted\n");
- if (bdb->pageNumber >= 0)
- {
- int slotRemove = PAGENUM_2_SLOT(bdb->pageNumber);
- Sync lockHashRemove (&syncHashTable[PAGENUM_2_LOCK_INDEX(bdb->pageNumber, slotRemove)], "Cache::getFreeBuffer");
- lockHashRemove.lock(Exclusive);
+ if (!bdb->isDirty)
+ break;
+
+ writePage (bdb, WRITE_TYPE_REUSE);
+ }
+
+ /* Unlink its old incarnation from the page/hash table */
- if (bdb->useCount != 1)
+ if (bdb->pageNumber >= 0)
+ for (Bdb **ptr = hashTable + bdb->pageNumber % hashSize;; ptr = &(*ptr)->hash)
+ if (*ptr == bdb)
{
- // we lost a race try again
- bdb->decrementUseCount(REL_HISTORY);
- lockHashRemove.unlock();
- continue;
+ *ptr = bdb->hash;
+ break;
}
+ else
+ ASSERT (*ptr);
- if (bdb->isDirty)
- writePage (bdb, WRITE_TYPE_REUSE);
+ bdb->addRef (lockType COMMA_ADD_HISTORY);
- /* Unlink its old incarnation from the page/hash table */
- for (Bdb **ptr = hashTable + PAGENUM_2_SLOT(bdb->pageNumber) ;; ptr = &(*ptr)->hash)
- if (*ptr == bdb)
- {
- *ptr = bdb->hash;
- break;
- }
- else
- ASSERT (*ptr);
- }
+ /* Set new page number and relink into hash table */
- break;
- }
-#ifdef CHECK_STALLED_BDB
- bdb->stallCount = 0;
-#endif // CHECK_STALLED_BDB
+ bdb->hash = hashTable [slot];
+ hashTable [slot] = bdb;
+ bdb->pageNumber = pageNumber;
+ bdb->dbb = dbb;
#ifdef COLLECT_BDB_HISTORY
bdb->initHistory();
#endif
- bdb->addRef (Exclusive COMMA_ADD_HISTORY);
- bdb->decrementUseCount(REL_HISTORY);
return bdb;
}
void Cache::validate()
{
- //Sync bufferQueueLock (&bufferQueue.syncObject, "Cache::validate");
-
- //bufferQueueLock.lock (Shared);
- // non-protected access to bufferQueue is DANGEROUS...
for (Bdb *bdb = bufferQueue.last; bdb; bdb = bdb->prior)
{
//IndexPage *page = (IndexPage*) bdb->buffer;
@@ -629,8 +474,8 @@ void Cache::validate()
void Cache::markDirty(Bdb *bdb)
{
- Sync dirtyLock (&syncDirty, "Cache::markDirty");
- dirtyLock.lock (Exclusive);
+ Sync sync (&syncDirty, "Cache::markDirty");
+ sync.lock (Exclusive);
bdb->nextDirty = NULL;
bdb->priorDirty = lastDirty;
@@ -640,13 +485,14 @@ void Cache::markDirty(Bdb *bdb)
firstDirty = bdb;
lastDirty = bdb;
+ ++numberDirtyPages;
//validateUnique (bdb);
}
void Cache::markClean(Bdb *bdb)
{
- Sync dirtyLock (&syncDirty, "Cache::markClean");
- dirtyLock.lock (Exclusive);
+ Sync sync (&syncDirty, "Cache::markClean");
+ sync.lock (Exclusive);
/***
if (bdb->flushIt)
@@ -654,6 +500,7 @@ void Cache::markClean(Bdb *bdb)
***/
bdb->flushIt = false;
+ --numberDirtyPages;
if (bdb == lastDirty)
lastDirty = bdb->priorDirty;
@@ -757,8 +604,8 @@ void Cache::writePage(Bdb *bdb, int type
if (dbb->shadows)
{
- Sync cloneLock (&dbb->syncClone, "Cache::writePage(2)");
- cloneLock.lock (Shared);
+ Sync sync (&dbb->syncClone, "Cache::writePage(2)");
+ sync.lock (Shared);
for (DatabaseCopy *shadow = dbb->shadows; shadow; shadow = shadow->next)
shadow->rewritePage(bdb);
@@ -767,14 +614,14 @@ void Cache::writePage(Bdb *bdb, int type
void Cache::analyze(Stream *stream)
{
- Sync dirtyLock (&syncDirty, "Cache::analyze");
+ Sync sync (&syncDirty, "Cache::analyze");
+ sync.lock (Shared);
int inUse = 0;
int dirty = 0;
int dirtyList = 0;
int total = 0;
Bdb *bdb;
- // non-protected access to bdbs,endBdbs is DANGEROUS...
for (bdb = bdbs; bdb < endBdbs; ++bdb)
{
++total;
@@ -786,10 +633,8 @@ void Cache::analyze(Stream *stream)
++inUse;
}
- dirtyLock.lock (Shared);
for (bdb = firstDirty; bdb; bdb = bdb->nextDirty)
++dirtyList;
- dirtyLock.unlock();
stream->format ("Cache: %d pages, %d in use, %d dirty, %d in dirty chain\n",
total, inUse, dirty, dirtyList);
@@ -797,18 +642,17 @@ void Cache::analyze(Stream *stream)
void Cache::validateUnique(Bdb *target)
{
- int slot = PAGENUM_2_SLOT(target->pageNumber);
+ int slot = target->pageNumber % hashSize;
- // WARNING: unlocked walk of hash table.... DANGEROUS
for (Bdb *bdb = hashTable [slot]; bdb; bdb = bdb->hash)
ASSERT (bdb == target || !(bdb->pageNumber == target->pageNumber && bdb->dbb == target->dbb));
}
void Cache::freePage(Dbb *dbb, int32 pageNumber)
{
- int slot = PAGENUM_2_SLOT(pageNumber);
- Sync lockHash (&syncHashTable[PAGENUM_2_LOCK_INDEX(pageNumber, slot)], "Cache::freePage");
- lockHash.lock(Shared);
+ Sync sync (&syncObject, "Cache::freePage");
+ sync.lock (Shared);
+ int slot = pageNumber % hashSize;
// If page exists in cache (usual case), clean it up
@@ -817,6 +661,7 @@ void Cache::freePage(Dbb *dbb, int32 pag
{
if (bdb->isDirty)
{
+ sync.unlock();
markClean (bdb);
}
@@ -844,14 +689,12 @@ void Cache::flush(Dbb *dbb)
bool Cache::hasDirtyPages(Dbb *dbb)
{
- Sync dirtyLock (&syncDirty, "Cache::hasDirtyPages");
- dirtyLock.lock (Shared);
+ Sync sync (&syncDirty, "Cache::hasDirtyPages");
+ sync.lock (Shared);
for (Bdb *bdb = firstDirty; bdb; bdb = bdb->nextDirty)
if (bdb->dbb == dbb)
- {
return true;
- }
return false;
}
@@ -878,16 +721,26 @@ Bdb* Cache::trialFetch(Dbb* dbb, int32 p
}
ASSERT (pageNumber >= 0);
+ int slot = pageNumber % hashSize;
+ Sync sync (&syncObject, "Cache::trialFetch");
+ sync.lock (Shared);
+ int hit = 0;
+
+ /* If we already have a buffer for this go, we're done */
+
Bdb *bdb;
- /* If we already have a buffer for this, we're done */
- bdb = lockFindBdbIncrementUseCount(dbb, pageNumber);
- if (bdb)
- {
- bdb->addRef(lockType COMMA_ADD_HISTORY);
- bdb->decrementUseCount(REL_HISTORY);
- moveToHead(bdb);
- }
+ for (bdb = hashTable [slot]; bdb; bdb = bdb->hash)
+ if (bdb->pageNumber == pageNumber && bdb->dbb == dbb)
+ {
+ //syncObject.validateShared("Cache::trialFetch");
+ bdb->incrementUseCount(ADD_HISTORY);
+ sync.unlock();
+ bdb->addRef(lockType COMMA_ADD_HISTORY);
+ bdb->decrementUseCount(REL_HISTORY);
+ hit = 1;
+ break;
+ }
return bdb;
}
@@ -915,9 +768,10 @@ void Cache::ioThread(void* arg)
void Cache::ioThread(void)
{
- Sync syncThread(&syncThreads, "Cache::ioThread");
+ Sync syncThread(&syncThreads, "Cache::ioThread(1)");
syncThread.lock(Shared);
- Sync flushLock(&syncFlush, "Cache::ioThread");
+ Sync flushLock(&syncFlush, "Cache::ioThread(2)");
+ Sync sync(&syncObject, "Cache::ioThread(3)");
Priority priority(database->ioScheduler);
Thread *thread = Thread::getThread("Cache::ioThread");
UCHAR *rawBuffer = new UCHAR[ASYNC_BUFFER_SIZE];
@@ -931,135 +785,137 @@ void Cache::ioThread(void)
{
int32 pageNumber = flushBitmap->nextSet(0);
int count;
+ Dbb *dbb;
if (pageNumber >= 0)
{
- Bdb *bdb;
- Dbb *dbb;
- int slot = PAGENUM_2_SLOT(pageNumber);
+ int slot = pageNumber % hashSize;
bool hit = false;
Bdb *bdbList = NULL;
UCHAR *p = buffer;
+ sync.lock(Shared);
- // Look for the page to flush.
- bdb = lockFindBdbIncrementUseCount(pageNumber, slot);
- if (bdb && bdb->flushIt && bdb->isDirty)
- {
- hit = true;
- count = 0;
- dbb = bdb->dbb;
-
- flushBitmap->clear(pageNumber);
-
- // get all his friends
- while (p < end)
+ // Look for a page to flush. Then get all his friends
+
+ for (Bdb *bdb = hashTable[slot]; bdb; bdb = bdb->hash)
+ if (bdb->pageNumber == pageNumber && bdb->flushIt && bdb->isDirty)
{
- ++count;
- bdb->addRef(Shared COMMA_ADD_HISTORY);
-
- bdb->syncWrite.lock(NULL, Exclusive);
- bdb->ioThreadNext = bdbList;
- bdbList = bdb;
-
- //ASSERT(!(bdb->flags & BDB_write_pending));
- //bdb->flags |= BDB_write_pending;
- memcpy(p, bdb->buffer, pageSize);
- p += pageSize;
- bdb->flushIt = false;
- markClean(bdb);
- bdb->isDirty = false;
- bdb->release(REL_HISTORY);
+ hit = true;
+ count = 0;
+ dbb = bdb->dbb;
- bdb = lockFindBdbIncrementUseCount(dbb, bdb->pageNumber + 1);
- if (!bdb)
- break;
+ if (!bdb->hash)
+ flushBitmap->clear(pageNumber);
- if (!bdb->isDirty && !continueWrite(bdb))
+ while (p < end)
{
- bdb->decrementUseCount(REL_HISTORY);
- break;
+ ++count;
+ bdb->incrementUseCount(ADD_HISTORY);
+ sync.unlock();
+ bdb->addRef(Shared COMMA_ADD_HISTORY);
+ if (falcon_use_sectorcache)
+ sectorCache->writePage(bdb);
+
+ bdb->syncWrite.lock(NULL, Exclusive);
+ bdb->ioThreadNext = bdbList;
+ bdbList = bdb;
+
+ //ASSERT(!(bdb->flags & BDB_write_pending));
+ //bdb->flags |= BDB_write_pending;
+ memcpy(p, bdb->buffer, pageSize);
+ p += pageSize;
+ bdb->flushIt = false;
+ markClean(bdb);
+ bdb->isDirty = false;
+ bdb->release(REL_HISTORY);
+ sync.lock(Shared);
+
+ if ( !(bdb = findBdb(dbb, bdb->pageNumber + 1)) )
+ break;
+
+ if (!bdb->isDirty && !continueWrite(bdb))
+ break;
}
- }
-
- flushLock.unlock();
- //Log::debug(" %d Writing %s %d pages: %d - %d\n", thread->threadId, (const char*) dbb->fileName, count, pageNumber, pageNumber + count - 1);
- int length = p - buffer;
- priority.schedule(PRIORITY_LOW);
-
- try
- {
- priority.schedule(PRIORITY_LOW);
- dbb->writePages(pageNumber, length, buffer, WRITE_TYPE_FLUSH);
- }
- catch (SQLException& exception)
- {
- priority.finished();
-
- if (exception.getSqlcode() != DEVICE_FULL)
- throw;
- database->setIOError(&exception);
+ if (sync.state != None)
+ sync.unlock();
+
+ flushLock.unlock();
+ //Log::debug(" %d Writing %s %d pages: %d - %d\n", thread->threadId, (const char*) dbb->fileName, count, pageNumber, pageNumber + count - 1);
+ int length = p - buffer;
+ priority.schedule(PRIORITY_LOW);
- for (bool error = true; error;)
+ try
+ {
+ priority.schedule(PRIORITY_LOW);
+ dbb->writePages(pageNumber, length, buffer, WRITE_TYPE_FLUSH);
+ }
+ catch (SQLException& exception)
{
- if (thread->shutdownInProgress)
+ priority.finished();
+
+ if (exception.getSqlcode() != DEVICE_FULL)
+ throw;
+
+ database->setIOError(&exception);
+
+ for (bool error = true; error;)
{
- Bdb *next;
+ if (thread->shutdownInProgress)
+ {
+ Bdb *next;
- for (bdb = bdbList; bdb; bdb = next)
+ for (bdb = bdbList; bdb; bdb = next)
+ {
+ //bdb->flags &= ~BDB_write_pending;
+ next = bdb->ioThreadNext;
+ bdb->syncWrite.unlock();
+ bdb->decrementUseCount(REL_HISTORY);
+ }
+
+ return;
+ }
+
+ thread->sleep(1000);
+
+ try
{
- //bdb->flags &= ~BDB_write_pending;
- next = bdb->ioThreadNext;
- bdb->syncWrite.unlock();
- bdb->decrementUseCount(REL_HISTORY);
+ priority.schedule(PRIORITY_LOW);
+ dbb->writePages(pageNumber, length, buffer, WRITE_TYPE_FLUSH);
+ error = false;
+ database->clearIOError();
}
+ catch (SQLException& exception2)
+ {
+ priority.finished();
- return;
- }
-
- thread->sleep(1000);
-
- try
- {
- priority.schedule(PRIORITY_LOW);
- dbb->writePages(pageNumber, length, buffer, WRITE_TYPE_FLUSH);
- error = false;
- database->clearIOError();
- }
- catch (SQLException& exception2)
- {
- priority.finished();
-
- if (exception2.getSqlcode() != DEVICE_FULL)
- throw;
+ if (exception2.getSqlcode() != DEVICE_FULL)
+ throw;
+ }
}
}
- }
- priority.finished();
- Bdb *next;
+ priority.finished();
+ Bdb *next;
- for (bdb = bdbList; bdb; bdb = next)
- {
- //ASSERT(bdb->flags & BDB_write_pending);
- //bdb->flags &= ~BDB_write_pending;
- next = bdb->ioThreadNext;
- bdb->syncWrite.unlock();
- bdb->decrementUseCount(REL_HISTORY);
- }
-
- flushLock.lock(Exclusive);
- ++physicalWrites;
-
- }
- else
- {
- if (bdb)
+ for (bdb = bdbList; bdb; bdb = next)
+ {
+ //ASSERT(bdb->flags & BDB_write_pending);
+ //bdb->flags &= ~BDB_write_pending;
+ next = bdb->ioThreadNext;
+ bdb->syncWrite.unlock();
bdb->decrementUseCount(REL_HISTORY);
- }
+ }
+
+ flushLock.lock(Exclusive);
+ ++physicalWrites;
+
+ break;
+ }
if (!hit)
{
+ sync.unlock();
flushBitmap->clear(pageNumber);
}
}
@@ -1070,9 +926,7 @@ void Cache::ioThread(void)
int writes = physicalWrites;
int pages = flushPages;
int delta = (int) (database->timestamp - flushStart);
- int64 callbackArg = flushArg;
flushing = false;
- flushArg = 0;
flushLock.unlock();
syncWait.unlock();
@@ -1080,8 +934,7 @@ void Cache::ioThread(void)
Log::log(LogInfo, "%d: Cache flush: %d pages, %d writes in %d seconds (%d pps)\n",
database->deltaTime, pages, writes, delta, pages / MAX(delta, 1));
- if (callbackArg != 0)
- database->pageCacheFlushed(callbackArg);
+ database->pageCacheFlushed(flushArg);
}
else
flushLock.unlock();
@@ -1091,8 +944,8 @@ void Cache::ioThread(void)
thread->sleep();
flushLock.lock(Exclusive);
+ }
}
- } // for ever
delete [] rawBuffer;
}
@@ -1105,12 +958,11 @@ bool Cache::continueWrite(Bdb* startingB
for (int32 pageNumber = startingBdb->pageNumber + 1, end = pageNumber+ 5; pageNumber < end; ++pageNumber)
{
- Bdb *bdb;
+ Bdb *bdb = findBdb(dbb, pageNumber);
if (dirty > clean)
return true;
-
- bdb = lockFindBdbIncrementUseCount(dbb, pageNumber);
+
if (!bdb)
return dirty >= clean;
@@ -1118,7 +970,6 @@ bool Cache::continueWrite(Bdb* startingB
++dirty;
else
++clean;
- bdb->decrementUseCount(REL_HISTORY);
}
return (dirty >= clean);
@@ -1148,18 +999,15 @@ void Cache::shutdownThreads(void)
ioThreads[n] = 0;
}
- Sync lockThreads(&syncThreads, "Cache::shutdownThreads");
- lockThreads.lock(Exclusive);
+ Sync sync(&syncThreads, "Cache::shutdownThreads");
+ sync.lock(Exclusive);
}
-#ifdef CACHE_TRACE_FILE
void Cache::analyzeFlush(void)
{
Dbb *dbb = NULL;
Bdb *bdb;
- Sync dirtyLock (&syncDirty, "Cache::hasDirtyPages");
- dirtyLock.lock (Shared);
for (bdb = firstDirty; bdb; bdb = bdb->nextDirty)
if (bdb->dbb->tableSpaceId == 1)
{
@@ -1167,7 +1015,6 @@ void Cache::analyzeFlush(void)
break;
}
- dirtyLock.unlock();
if (!dbb)
return;
@@ -1175,19 +1022,16 @@ void Cache::analyzeFlush(void)
fprintf(traceFile, "-------- time %d -------\n", database->deltaTime);
for (int pageNumber = 0; (pageNumber = flushBitmap->nextSet(pageNumber)) >= 0;)
- // non-protected access to hash table via findBdb()!
if ( (bdb = findBdb(dbb, pageNumber)) )
{
int start = pageNumber;
int type = bdb->buffer->pageType;
- // non-protected access to hash table via findBdb()!
for (; (bdb = findBdb(dbb, ++pageNumber)) && bdb->flushIt;)
;
fprintf(traceFile, " %d flushed: %d to %d, first type %d\n", pageNumber - start, start, pageNumber - 1, type);
- // non-protected access to hash table via findBdb()!
for (int max = pageNumber + 5; pageNumber < max && (bdb = findBdb(dbb, pageNumber)) && !bdb->flushIt; ++pageNumber)
{
if (bdb->isDirty)
@@ -1204,39 +1048,27 @@ void Cache::analyzeFlush(void)
void Cache::openTraceFile(void)
{
+#ifdef TRACE_FILE
if (traceFile)
closeTraceFile();
- traceFile = fopen(TRACE_FILE, "a+");
- fprintf(traceFile, "Starting\n");
-//KEL
-// setvbuf(traceFile, (char *) NULL, _IOLBF, 0);
-
+ traceFile = fopen(TRACE_FILE, "w");
+#endif
}
void Cache::closeTraceFile(void)
{
+#ifdef TRACE_FILE
if (traceFile)
{
fclose(traceFile);
traceFile = NULL;
}
+#endif
}
-#else // CACHE_TRACE_FILE
-void Cache::analyzeFlush(void)
-{
-}
-void Cache::openTraceFile(void)
-{
-}
-void Cache::closeTraceFile(void)
-{
-}
-#endif // CACHE_TRACE_FILE
void Cache::flushWait(void)
{
- Sync waitLock(&syncWait, "Cache::flushWait");
- waitLock.lock(Exclusive);
+ Sync sync(&syncWait, "Cache::flushWait");
+ sync.lock(Shared);
}
-
=== modified file 'storage/falcon/Cache.h'
--- a/storage/falcon/Cache.h 2008-09-02 16:08:11 +0000
+++ b/storage/falcon/Cache.h 2008-10-02 22:15:11 +0000
@@ -28,17 +28,6 @@
#include "SyncObject.h"
#include "Queue.h"
-// uncomment DEBUG_SYNC_HASH_TABLE_SIZE to cause more contention and test for race conditions
-//#define DEBUG_SYNC_HASH_TABLE_SIZE (0x01 << 1)
-#ifdef DEBUG_SYNC_HASH_TABLE_SIZE
-# define DEBUG_SYNC_HASH_TABLE_MASK (DEBUG_SYNC_HASH_TABLE_SIZE - 1)
-# define PAGENUM_2_LOCK_INDEX(_pgnum, _slot) ((_pgnum) & DEBUG_SYNC_HASH_TABLE_MASK)
-#else /* DEBUG_SYNC_HASH_TABLE_SIZE */
-# define PAGENUM_2_LOCK_INDEX(_pgnum, _slot) ((_slot))
-#endif /* DEBUG_SYNC_HASH_TABLE_SIZE */
-
-#define PAGENUM_2_SLOT(_pgnum) ((_pgnum) & hashMask)
-
class Bdb;
class Dbb;
class PageWriter;
@@ -65,6 +54,7 @@ public:
void markClean (Bdb *bdb);
void markDirty (Bdb *bdb);
void validate();
+ void moveToHead (Bdb *bdb);
void flush(int64 arg);
void validateCache(void);
void syncFile(Dbb *dbb, const char *text);
@@ -93,20 +83,14 @@ public:
bool flushing;
protected:
- void moveToHead (Bdb *bdb);
- void moveToHeadAlreadyLocked (Bdb *bdb);
- Bdb* getFreeBuffer(void);
- Bdb* findBdb(Dbb* dbb, int32 pageNumber, int slot);
+ Bdb* findBuffer (Dbb *dbb, int pageNumber, LockType lockType);
Bdb* findBdb(Dbb* dbb, int32 pageNumber);
- Bdb* lockFindBdbIncrementUseCount(Dbb* dbb, int32 pageNumber);
- Bdb* lockFindBdbIncrementUseCount(int32 pageNumber, int slot);
int64 flushArg;
Bdb *bdbs;
Bdb *endBdbs;
Queue<Bdb> bufferQueue;
Bdb **hashTable;
- SyncObject *syncHashTable;
Bdb *firstDirty;
Bdb *lastDirty;
Bitmap *flushBitmap;
@@ -121,13 +105,12 @@ protected:
int flushPages;
int physicalWrites;
int hashSize;
- unsigned int hashMask;
int pageSize;
- unsigned int upperFraction;
+ int upperFraction;
int numberHunks;
+ int numberDirtyPages;
int numberIoThreads;
- volatile uint64 bufferAge;
-
+ volatile int bufferAge;
public:
void flushWait(void);
};
=== modified file 'storage/falcon/DataPage.h'
--- a/storage/falcon/DataPage.h 2008-06-17 17:41:54 +0000
+++ b/storage/falcon/DataPage.h 2008-09-27 18:37:54 +0000
@@ -35,8 +35,8 @@ struct RecordIndex;
struct SectionAnalysis;
struct LineIndex {
- short offset;
- short length; // negative means record has overflow page
+ uint16 offset;
+ int16 length; // negative means record has overflow page
};
class DataPage : public Page
=== modified file 'storage/falcon/Database.cpp'
--- a/storage/falcon/Database.cpp 2008-09-11 10:56:00 +0000
+++ b/storage/falcon/Database.cpp 2008-09-30 18:17:19 +0000
@@ -686,7 +686,6 @@ void Database::createDatabase(const char
deleteFilesOnExit = true;
throw;
}
-
}
void Database::openDatabase(const char * filename)
@@ -1455,50 +1454,61 @@ void Database::dropTable(Table *table, T
void Database::truncateTable(Table *table, Sequence *sequence, Transaction *transaction)
{
- Sync syncDDL(&syncSysDDL, "Database::truncateTable(1)");
- syncDDL.lock(Exclusive);
-
- table->checkDrop();
-
// Check for records in active transactions
if (hasUncommittedRecords(table, transaction))
throw SQLError(UNCOMMITTED_UPDATES, "table %s.%s has uncommitted updates and cannot be truncated",
table->schemaName, table->name);
-
- // Block table drop/add, table list scans ok
-
- Sync syncTbl(&syncTables, "Database::truncateTable(2)");
- syncTbl.lock(Shared);
+
+ // Lock SystemDDL first. This lock can happen multiple times in many call stacks,
+ // both before and after the following locks. So it is important that we get an
+ // exclusive lock first.
+
+ Sync syncDDLLock(&syncSysDDL, "Database::truncateTable(SysDDL)");
+ syncDDLLock.lock(Exclusive);
+
+ // Lock syncScavenge before locking syncSysDDL, syncTables, or table->syncObject.
+ // The scavenger locks syncScavenge and then syncTables
+ // If we run out of record memory, forceRecordScavenge will eventually call table->syncObject.
+
+ Sync syncScavengeLock(&syncScavenge, "Database::truncateTable(scavenge)");
+ syncScavengeLock.lock(Exclusive);
+
+ table->checkDrop();
+ // Block table drop/add, table list scans ok
+
+ Sync syncTablesLock(&syncTables, "Database::truncateTable(tables)");
+ syncTablesLock.lock(Shared);
+
//Lock sections (factored out of SRLDropTable to avoid a deadlock)
//The lock order (serialLog->syncSections before table->syncObject) is
//important
- Sync syncSections(&serialLog->syncSections, "Database::truncateTable(3)");
- syncSections.lock(Exclusive);
-
+ Sync syncSectionsLock(&serialLog->syncSections, "Database::truncateTable(sections)");
+ syncSectionsLock.lock(Exclusive);
+
// No table access until truncate completes
-
- Sync syncObj(&table->syncObject, "Database::truncateTable(4)");
- syncObj.lock(Exclusive);
-
+
+ Sync syncTableLock(&table->syncObject, "Database::truncateTable(table)");
+ syncTableLock.lock(Exclusive);
+
table->deleting = true;
-
+
// Purge records out of committed transactions
-
+
transactionManager->truncateTable(table, transaction);
-
+
Transaction *sysTransaction = getSystemTransaction();
-
+
// Recreate data/blob sections and indexes
-
+
table->truncate(sysTransaction);
-
+
commitSystemTransaction();
-
+
// Delete and recreate the sequence
-
+
if (sequence)
sequence = sequence->recreate();
}
=== modified file 'storage/falcon/DeferredIndex.cpp'
--- a/storage/falcon/DeferredIndex.cpp 2008-09-10 19:51:03 +0000
+++ b/storage/falcon/DeferredIndex.cpp 2008-10-04 00:10:34 +0000
@@ -819,7 +819,7 @@ void DeferredIndex::scanIndex(IndexKey *
void DeferredIndex::detachIndex(void)
{
Sync sync(&syncObject, "DeferredIndex::detachIndex");
- sync.lock(Shared);
+ sync.lock(Exclusive); // was Shared
index = NULL;
}
@@ -884,11 +884,7 @@ void DeferredIndex::addRef()
void DeferredIndex::releaseRef()
{
- ASSERT(useCount > 0);
-
- INTERLOCKED_DECREMENT(useCount);
-
- if (useCount == 0)
+ if (INTERLOCKED_DECREMENT(useCount) == 0)
delete this;
}
=== modified file 'storage/falcon/MemoryManager.h'
--- a/storage/falcon/MemoryManager.h 2008-05-14 18:39:57 +0000
+++ b/storage/falcon/MemoryManager.h 2008-09-14 20:12:37 +0000
@@ -31,8 +31,10 @@
#ifdef _WIN32
#define ALWAYS_INLINE inline /* for windows */
-#else
+#elif __GNUC__
#define ALWAYS_INLINE extern inline __attribute__ ((always_inline)) /* for gcc */
+#else
+#define ALWAYS_INLINE extern inline
#endif
class Stream;
=== modified file 'storage/falcon/SRLUpdateIndex.cpp'
--- a/storage/falcon/SRLUpdateIndex.cpp 2008-07-15 18:57:27 +0000
+++ b/storage/falcon/SRLUpdateIndex.cpp 2008-10-04 00:10:34 +0000
@@ -40,14 +40,29 @@ SRLUpdateIndex::~SRLUpdateIndex(void)
void SRLUpdateIndex::append(DeferredIndex* deferredIndex)
{
+ uint indexId;
+ int idxVersion;
+ int tableSpaceId;
+
+ Sync syncDI(&deferredIndex->syncObject, "SRLUpdateIndex::append");
+ syncDI.lock(Shared);
+
+ if (!deferredIndex->index)
+ return;
+ else
+ {
+ indexId = deferredIndex->index->indexId;
+ idxVersion = deferredIndex->index->indexVersion;
+ tableSpaceId = deferredIndex->index->dbb->tableSpaceId;
+ }
+
+ syncDI.unlock();
+
Sync syncIndexes(&log->syncIndexes, "SRLUpdateIndex::append(1)");
syncIndexes.lock(Shared);
Transaction *transaction = deferredIndex->transaction;
DeferredIndexWalker walker(deferredIndex, NULL);
- uint indexId = deferredIndex->index->indexId;
- int idxVersion = deferredIndex->index->indexVersion;
- int tableSpaceId = deferredIndex->index->dbb->tableSpaceId;
uint64 virtualOffset = 0;
uint64 virtualOffsetAtEnd = 0;
=== modified file 'storage/falcon/SerialLogFile.cpp'
--- a/storage/falcon/SerialLogFile.cpp 2008-09-05 22:36:19 +0000
+++ b/storage/falcon/SerialLogFile.cpp 2008-09-12 17:01:24 +0000
@@ -263,15 +263,23 @@ uint32 SerialLogFile::read(int64 positio
overlapped.Offset = pos.LowPart;
overlapped.OffsetHigh = pos.HighPart;
- DWORD ret;
+ DWORD n;
- if (!ReadFile(handle, data, effectiveLength, &ret, &overlapped))
- throw SQLError(IO_ERROR, "serial log ReadFile failed with %d", GetLastError());
+ if (!ReadFile(handle, data, effectiveLength, &n, &overlapped))
+ {
+ DWORD lastError = GetLastError();
+ if(lastError != ERROR_HANDLE_EOF)
+ throw SQLError(IO_ERROR, "serial log ReadFile failed with %d",
+ GetLastError());
+ else
+ n = 0; // reached end of file
+ }
- offset = position + effectiveLength;
+
+ offset = position + n;
highWater = MAX(offset, highWater);
- return ret;
+ return n;
#else
#if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
=== modified file 'storage/falcon/SerialLogWindow.cpp'
--- a/storage/falcon/SerialLogWindow.cpp 2008-03-11 16:15:47 +0000
+++ b/storage/falcon/SerialLogWindow.cpp 2008-10-02 09:01:39 +0000
@@ -117,7 +117,7 @@ SerialLogBlock* SerialLogWindow::readFir
void SerialLogWindow::write(SerialLogBlock *block)
{
uint32 length = ROUNDUP(block->length, sectorSize);
- uint32 offset = (int) (origin + ((UCHAR*) block - buffer));
+ int64 offset = origin + ((UCHAR*) block - buffer);
ASSERT(length <= bufferLength);
try
=== modified file 'storage/falcon/StorageHandler.cpp'
--- a/storage/falcon/StorageHandler.cpp 2008-09-11 10:56:00 +0000
+++ b/storage/falcon/StorageHandler.cpp 2008-10-01 03:13:44 +0000
@@ -61,11 +61,11 @@ static const char *createTempSpace = "up
static const char *falconSchema [] = {
//"create tablespace " DEFAULT_TABLESPACE " filename '" FALCON_USER "' allocation 2000000000",
createTempSpace,
-
+
"upgrade table falcon.tablespaces ("
" name varchar(128) not null primary key,"
" pathname varchar(1024) not null)",
-
+
"upgrade table falcon.tables ("
" given_schema_name varchar(128) not null,"
" effective_schema_name varchar(128) not null,"
@@ -73,11 +73,11 @@ static const char *falconSchema [] = {
" effective_table_name varchar(128) not null,"
" tablespace_name varchar(128) not null,"
" pathname varchar(1024) not null primary key)",
-
+
"upgrade unique index effective on falcon.tables (effective_schema_name, effective_table_name)",
NULL };
-
+
class Server;
extern Server* startServer(int port, const char *configFile);
@@ -95,13 +95,13 @@ static const char THIS_FILE[]=__FILE__;
int init()
{
const char *p;
-
+
for (p = WHITE_SPACE; *p; p++)
charTable[(unsigned char)*p] = 1;
-
+
for (p = PUNCTUATION_CHARS; *p; p++)
charTable[(unsigned char)*p] = 1;
-
+
return 1;
}
@@ -109,7 +109,7 @@ StorageHandler* getFalconStorageHandler(
{
if (!storageHandler)
storageHandler = new StorageHandler(lockSize);
-
+
return storageHandler;
}
@@ -151,7 +151,7 @@ StorageHandler::~StorageHandler(void)
storageDatabases[n] = storageDatabase->collision;
delete storageDatabase;
}
-
+
for (int n = 0; n < tableHashSize; ++n)
for (StorageTableShare *table; (table = tables[n]);)
{
@@ -190,11 +190,11 @@ void StorageHandler::shutdownHandler(voi
dictionaryConnection->close();
dictionaryConnection = NULL;
}
-
+
for (int n = 0; n < databaseHashSize; ++n)
for (StorageDatabase *storageDatabase = storageDatabases[n]; storageDatabase; storageDatabase = storageDatabase->collision)
storageDatabase->close();
-
+
/***
Configuration configuration(NULL);
Connection *connection = new Connection(&configuration);
@@ -207,14 +207,14 @@ void StorageHandler::databaseDropped(Sto
{
if (!storageDatabase && storageConnection)
storageDatabase = storageConnection->storageDatabase;
-
+
if (storageDatabase)
{
Sync syncHash(&hashSyncObject, "StorageHandler::databaseDropped(1)");
int slot = JString::hash(storageDatabase->name, databaseHashSize);
syncHash.lock(Exclusive);
StorageDatabase **ptr;
-
+
for (ptr = storageDatabases + slot; *ptr; ptr = &(*ptr)->collision)
if (*ptr == storageDatabase)
{
@@ -240,7 +240,7 @@ void StorageHandler::databaseDropped(Sto
for (StorageConnection *cnct = connections[n]; cnct; cnct = cnct->collision)
if (cnct != storageConnection)
cnct->databaseDropped(storageDatabase);
-
+
sync.unlock();
}
@@ -256,8 +256,8 @@ int StorageHandler::startTransaction(THD
Sync sync(&syncObject, "StorageHandler::commit");
sync.lock(Shared);
int slot = HASH(mySqlThread, connectionHashSize);
-
- for (StorageConnection *storageConnection = connections[slot];
+
+ for (StorageConnection *storageConnection = connections[slot];
storageConnection; storageConnection = storageConnection->collision)
{
if (storageConnection->mySqlThread == mySqlThread)
@@ -276,16 +276,16 @@ int StorageHandler::commit(THD* mySqlThr
Sync sync(&syncObject, "StorageHandler::commit");
sync.lock(Shared);
int slot = HASH(mySqlThread, connectionHashSize);
-
+
for (StorageConnection *connection = connections[slot]; connection; connection = connection->collision)
if (connection->mySqlThread == mySqlThread)
{
int ret =connection->commit();
-
+
if (ret)
return ret;
}
-
+
return 0;
}
@@ -294,16 +294,16 @@ int StorageHandler::prepare(THD* mySqlTh
Sync sync(&syncObject, "StorageHandler::prepare");
sync.lock(Shared);
int slot = HASH(mySqlThread, connectionHashSize);
-
+
for (StorageConnection *connection = connections[slot]; connection; connection = connection->collision)
if (connection->mySqlThread == mySqlThread)
{
int ret = connection->prepare(xidSize, xid);
-
+
if (ret)
return ret;
}
-
+
return 0;
}
@@ -312,16 +312,16 @@ int StorageHandler::rollback(THD* mySqlT
Sync sync(&syncObject, "StorageHandler::rollback");
sync.lock(Shared);
int slot = HASH(mySqlThread, connectionHashSize);
-
+
for (StorageConnection *connection = connections[slot]; connection; connection = connection->collision)
if (connection->mySqlThread == mySqlThread)
{
int ret = connection->rollback();
-
+
if (ret)
return ret;
}
-
+
return 0;
}
@@ -330,11 +330,11 @@ int StorageHandler::releaseVerb(THD* myS
Sync sync(&syncObject, "StorageHandler::releaseVerb");
sync.lock(Shared);
int slot = HASH(mySqlThread, connectionHashSize);
-
+
for (StorageConnection *connection = connections[slot]; connection; connection = connection->collision)
if (connection->mySqlThread == mySqlThread)
connection->releaseVerb();
-
+
return 0;
}
@@ -343,11 +343,11 @@ int StorageHandler::rollbackVerb(THD* my
Sync sync(&syncObject, "StorageHandler::rollbackVerb");
sync.lock(Shared);
int slot = HASH(mySqlThread, connectionHashSize);
-
+
for (StorageConnection *connection = connections[slot]; connection; connection = connection->collision)
if (connection->mySqlThread == mySqlThread)
connection->rollbackVerb();
-
+
return 0;
}
@@ -357,7 +357,7 @@ int StorageHandler::savepointSet(THD* my
sync.lock(Shared);
int slot = HASH(mySqlThread, connectionHashSize);
StorageSavepoint *savepoints = NULL;
-
+
for (StorageConnection *connection = connections[slot]; connection; connection = connection->collision)
if (connection->mySqlThread == mySqlThread)
{
@@ -367,9 +367,9 @@ int StorageHandler::savepointSet(THD* my
savepoint->storageConnection = connection;
savepoint->savepoint = connection->savepointSet();
}
-
+
*((void**) savePoint) = savepoints;
-
+
return 0;
}
@@ -377,15 +377,15 @@ int StorageHandler::savepointRelease(THD
{
Sync sync(&syncObject, "StorageHandler::savepointRelease");
sync.lock(Shared);
-
- for (StorageSavepoint *savepoints = *(StorageSavepoint**) savePoint, *savepoint;
+
+ for (StorageSavepoint *savepoints = *(StorageSavepoint**) savePoint, *savepoint;
(savepoint = savepoints);)
{
savepoint->storageConnection->savepointRelease(savepoint->savepoint);
savepoints = savepoint->next;
delete savepoint;
}
-
+
*((void**) savePoint) = NULL;
return 0;
@@ -395,15 +395,15 @@ int StorageHandler::savepointRollback(TH
{
Sync sync(&syncObject, "StorageHandler::savepointRollback");
sync.lock(Shared);
-
- for (StorageSavepoint *savepoints = *(StorageSavepoint**) savePoint, *savepoint;
+
+ for (StorageSavepoint *savepoints = *(StorageSavepoint**) savePoint, *savepoint;
(savepoint = savepoints);)
{
savepoint->storageConnection->savepointRollback(savepoint->savepoint);
savepoints = savepoint->next;
delete savepoint;
}
-
+
*((void**) savePoint) = NULL;
return 0;
@@ -414,22 +414,22 @@ StorageDatabase* StorageHandler::getStor
Sync sync(&hashSyncObject, "StorageHandler::getStorageDatabase");
int slot = JString::hash(dbName, databaseHashSize);
StorageDatabase *storageDatabase;
-
+
if (storageDatabases[slot])
{
sync.lock(Shared);
-
+
if ( (storageDatabase = findDatabase(dbName)) )
return storageDatabase;
-
+
sync.unlock();
}
-
+
sync.lock(Exclusive);
if ( (storageDatabase = findDatabase(dbName)) )
return storageDatabase;
-
+
storageDatabase = new StorageDatabase(this, dbName, path);
storageDatabase->load();
storageDatabase->collision = storageDatabases[slot];
@@ -437,7 +437,7 @@ StorageDatabase* StorageHandler::getStor
storageDatabase->addRef();
storageDatabase->next = databaseList;
databaseList = storageDatabase;
-
+
return storageDatabase;
}
@@ -446,7 +446,7 @@ void StorageHandler::closeDatabase(const
Sync sync(&hashSyncObject, "StorageHandler::closeDatabase");
int slot = JString::hash(path, databaseHashSize);
sync.lock(Exclusive);
-
+
for (StorageDatabase *storageDatabase, **ptr = storageDatabases + slot; (storageDatabase = *ptr); ptr = &storageDatabase->collision)
if (storageDatabase->filename == path)
{
@@ -505,9 +505,7 @@ int StorageHandler::createTablespace(con
return StorageErrorTableSpaceExist;
}
- JString tableSpace = JString::upcase(tableSpaceName);
-
- TableSpaceManager *tableSpaceManager =
+ TableSpaceManager *tableSpaceManager =
dictionaryConnection->database->tableSpaceManager;
if (!tableSpaceManager->waitForPendingDrop(filename, 10))
@@ -527,16 +525,16 @@ int StorageHandler::createTablespace(con
{
if (exception.getSqlcode() == TABLESPACE_EXIST_ERROR)
return StorageErrorTableSpaceExist;
-
+
if (exception.getSqlcode() == TABLESPACE_NOT_EXIST_ERROR)
return StorageErrorTableSpaceNotExist;
if (exception.getSqlcode() == TABLESPACE_DATAFILE_EXIST_ERROR)
return StorageErrorTableSpaceDataFileExist;
-
+
return StorageErrorTablesSpaceOperationFailed;
}
-
+
return 0;
}
@@ -554,7 +552,7 @@ int StorageHandler::deleteTablespace(con
{
return StorageErrorTablesSpaceOperationFailed;
}
-
+
try
{
CmdGen gen;
@@ -568,16 +566,16 @@ int StorageHandler::deleteTablespace(con
catch (SQLException& exception)
{
int sqlCode = exception.getSqlcode();
-
+
if (sqlCode == TABLESPACE_NOT_EXIST_ERROR)
return StorageErrorTableSpaceNotExist;
-
+
if (sqlCode == TABLESPACE_NOT_EMPTY)
return StorageErrorTableNotEmpty;
-
+
return StorageErrorTablesSpaceOperationFailed;
}
-
+
return 0;
}
@@ -592,26 +590,26 @@ StorageTableShare* StorageHandler::findT
if (tables[slot])
{
sync.lock(Shared);
-
+
for (tableShare = tables[slot]; tableShare; tableShare = tableShare->collision)
if (tableShare->pathName == filename)
return tableShare;
-
+
sync.unlock();
}
sync.lock(Exclusive);
-
+
for (tableShare = tables[slot]; tableShare; tableShare = tableShare->collision)
if (tableShare->pathName == filename)
return tableShare;
-
+
tableShare = new StorageTableShare(this, filename, NULL, mySqlLockSize, false);
tableShare->collision = tables[slot];
tables[slot] = tableShare;
-
+
ASSERT(tableShare->collision != tableShare);
-
+
return tableShare;
}
@@ -632,7 +630,7 @@ StorageTableShare* StorageHandler::preDe
{
Sync sync(&hashSyncObject, "StorageHandler::preDeleteTable");
sync.lock(Shared);
-
+
for (tableShare = tables[slot]; tableShare; tableShare = tableShare->collision)
if (tableShare->pathName == filename)
return tableShare;
@@ -643,14 +641,14 @@ StorageTableShare* StorageHandler::preDe
tableShare = new StorageTableShare(this, filename, NULL, mySqlLockSize, false);
JString path = tableShare->lookupPathName();
delete tableShare;
-
+
if (path == pathname)
return findTable(pathname);
}
catch (...)
{
}
-
+
return NULL;
}
@@ -663,17 +661,17 @@ StorageTableShare* StorageHandler::creat
return NULL;
StorageTableShare *tableShare = new StorageTableShare(this, pathname, tableSpaceName, mySqlLockSize, tempTable);
-
+
if (tableShare->tableExists())
{
delete tableShare;
-
+
return NULL;
}
addTable(tableShare);
tableShare->registerTable();
-
+
return tableShare;
}
@@ -684,7 +682,7 @@ void StorageHandler::addTable(StorageTab
sync.lock(Exclusive);
table->collision = tables[slot];
tables[slot] = table;
-
+
ASSERT(table->collision != table);
}
@@ -693,7 +691,7 @@ void StorageHandler::removeTable(Storage
Sync sync(&hashSyncObject, "StorageHandler::removeTable");
sync.lock(Exclusive);
int slot = JString::hash(table->pathName, tableHashSize);
-
+
for (StorageTableShare **ptr = tables + slot; *ptr; ptr = &(*ptr)->collision)
if (*ptr == table)
{
@@ -705,7 +703,7 @@ void StorageHandler::removeTable(Storage
StorageConnection* StorageHandler::getStorageConnection(StorageTableShare* tableShare, THD* mySqlThread, int mySqlThdId, OpenOption createFlag)
{
Sync sync(&syncObject, "StorageHandler::getStorageConnection");
-
+
if (!defaultDatabase)
initialize();
@@ -727,10 +725,10 @@ StorageConnection* StorageHandler::getSt
if (storageConnection->mySqlThread == mySqlThread) // && storageConnection->storageDatabase == tableShare->storageDatabase)
{
storageConnection->addRef();
-
+
if (!tableShare->storageDatabase)
tableShare->setDatabase(storageDatabase);
-
+
return storageConnection;
}
@@ -743,16 +741,16 @@ StorageConnection* StorageHandler::getSt
if (storageConnection->mySqlThread == mySqlThread) // && storageConnection->storageDatabase == tableShare->storageDatabase)
{
storageConnection->addRef();
-
+
if (!tableShare->storageDatabase)
tableShare->setDatabase(storageDatabase);
-
+
return storageConnection;
}
-
+
storageConnection = new StorageConnection(this, storageDatabase, mySqlThread, mySqlThdId);
bool success = false;
-
+
if (createFlag != CreateDatabase) // && createFlag != OpenTemporaryDatabase)
try
{
@@ -763,15 +761,15 @@ StorageConnection* StorageHandler::getSt
{
//fprintf(stderr, "database open failed: %s\n", exception.getText());
storageConnection->setErrorText(exception.getText());
-
+
if (createFlag == OpenDatabase)
{
delete storageConnection;
-
+
return NULL;
}
}
-
+
if (!success && createFlag != OpenDatabase)
try
{
@@ -780,29 +778,29 @@ StorageConnection* StorageHandler::getSt
catch (SQLException&)
{
delete storageConnection;
-
+
return NULL;
}
-
+
tableShare->setDatabase(storageDatabase);
storageConnection->collision = connections[slot];
connections[slot] = storageConnection;
-
+
return storageConnection;
}
StorageDatabase* StorageHandler::findDatabase(const char* dbName)
{
int slot = JString::hash(dbName, databaseHashSize);
-
+
for (StorageDatabase *storageDatabase = storageDatabases[slot]; storageDatabase; storageDatabase = storageDatabase->collision)
if (storageDatabase->name == dbName)
{
storageDatabase->addRef();
-
+
return storageDatabase;
}
-
+
return NULL;
}
@@ -820,7 +818,7 @@ void StorageHandler::changeMySqlThread(S
void StorageHandler::removeConnection(StorageConnection* storageConnection)
{
int slot = HASH(storageConnection->mySqlThread, connectionHashSize);
-
+
for (StorageConnection **ptr = connections + slot; *ptr; ptr = &(*ptr)->collision)
if (*ptr == storageConnection)
{
@@ -838,7 +836,7 @@ int StorageHandler::closeConnections(THD
for (StorageConnection *storageConnection = connections[slot], *next; storageConnection; storageConnection = next)
{
next = storageConnection->collision;
-
+
if (storageConnection->mySqlThread == thd)
{
sync.unlock();
@@ -847,7 +845,7 @@ int StorageHandler::closeConnections(THD
if (storageConnection->mySqlThread)
storageConnection->release(); // This is for thd->ha_data[falcon_hton->slot]
-
+
storageConnection->release(); // This is for storageConn
}
}
@@ -861,25 +859,25 @@ int StorageHandler::dropDatabase(const c
char pathname[FILENAME_MAX];
const char *SEPARATOR = pathname;
char *q = pathname;
-
+
for (const char *p = path; *p;)
{
char c = *p++;
-
+
if (c == '/')
{
if (*p == 0)
break;
-
+
SEPARATOR = q + 1;
}
-
+
*q++ = c;
}
-
+
*q = 0;
JString dbName = JString::upcase(SEPARATOR);
- strcpy(q, StorageTableShare::getDefaultRoot());
+ strcpy(q, StorageTableShare::getDefaultRoot());
StorageDatabase *storageDatabase = getStorageDatabase(dbName, pathname);
databaseDropped(storageDatabase, NULL);
@@ -893,7 +891,7 @@ int StorageHandler::dropDatabase(const c
storageDatabase->release();
***/
-
+
return 0;
}
@@ -901,7 +899,7 @@ void StorageHandler::getIOInfo(InfoTable
{
Sync sync(&hashSyncObject, "StorageHandler::getIOInfo");
sync.lock(Shared);
-
+
for (StorageDatabase *storageDatabase = databaseList; storageDatabase; storageDatabase = storageDatabase->next)
storageDatabase->getIOInfo(infoTable);
}
@@ -930,7 +928,7 @@ void StorageHandler::getTransactionInfo(
{
Sync sync(&hashSyncObject, "StorageHandler::getTransactionInfo");
sync.lock(Shared);
-
+
for (StorageDatabase *storageDatabase = databaseList; storageDatabase; storageDatabase = storageDatabase->next)
storageDatabase->getTransactionInfo(infoTable);
}
@@ -939,7 +937,7 @@ void StorageHandler::getSerialLogInfo(In
{
Sync sync(&hashSyncObject, "StorageHandler::getSerialLogInfo");
sync.lock(Shared);
-
+
for (StorageDatabase *storageDatabase = databaseList; storageDatabase; storageDatabase = storageDatabase->next)
storageDatabase->getSerialLogInfo(infoTable);
}
@@ -953,7 +951,7 @@ void StorageHandler::getTransactionSumma
{
Sync sync(&hashSyncObject, "StorageHandler::getTransactionSummaryInfo");
sync.lock(Shared);
-
+
for (StorageDatabase *storageDatabase = databaseList; storageDatabase; storageDatabase = storageDatabase->next)
storageDatabase->getTransactionSummaryInfo(infoTable);
}
@@ -962,7 +960,7 @@ void StorageHandler::getTableSpaceInfo(I
{
Sync sync(&hashSyncObject, "StorageHandler::getTableSpaceInfo");
sync.lock(Shared);
-
+
for (StorageDatabase *storageDatabase = databaseList; storageDatabase; storageDatabase = storageDatabase->next)
storageDatabase->getTableSpaceInfo(infoTable);
}
@@ -971,7 +969,7 @@ void StorageHandler::getTableSpaceFilesI
{
Sync sync(&hashSyncObject, "StorageHandler::getTableSpaceFilesInfo");
sync.lock(Shared);
-
+
for (StorageDatabase *storageDatabase = databaseList; storageDatabase; storageDatabase = storageDatabase->next)
storageDatabase->getTableSpaceFilesInfo(infoTable);
}
@@ -980,16 +978,16 @@ void StorageHandler::initialize(void)
{
if (initialized)
return;
-
+
Sync sync(&syncObject, "StorageHandler::initialize");
sync.lock(Exclusive);
-
+
if (initialized)
return;
-
+
initialized = true;
defaultDatabase = getStorageDatabase(MASTER_NAME, MASTER_PATH);
-
+
try
{
defaultDatabase->getOpenConnection();
@@ -1001,7 +999,7 @@ void StorageHandler::initialize(void)
{
int err = e.getSqlcode();
- // If got one of following errors, just rethrow. No point in
+ // If got one of following errors, just rethrow. No point in
// trying to create database.
if (err != OPEN_MASTER_ERROR)
throw;
@@ -1046,14 +1044,14 @@ void StorageHandler::createDatabase(void
void StorageHandler::dropTempTables(void)
{
Statement *statement = dictionaryConnection->createStatement();
-
+
try
{
PStatement select = dictionaryConnection->prepareStatement(
"select schema,tablename from system.tables where tablespace='" TEMPORARY_TABLESPACE "'");
RSet resultSet = select->executeQuery();
bool hit = false;
-
+
while (resultSet->next())
{
CmdGen gen;
@@ -1061,14 +1059,14 @@ void StorageHandler::dropTempTables(void
statement->executeUpdate(gen.getString());
hit = true;
}
-
+
//if (hit)
//statement->executeUpdate(dropTempSpace);
}
catch(...)
{
}
-
+
try
{
statement->executeUpdate(createTempSpace);
@@ -1077,7 +1075,7 @@ void StorageHandler::dropTempTables(void
{
Log::log("Can't create temporary tablespace: %s\n", exception.getText());
}
-
+
statement->close();
}
@@ -1118,7 +1116,7 @@ void StorageHandler::cleanFileName(const
char *q = filename;
char *end = filename + filenameLength - 1;
filename[0] = 0;
-
+
for (const char *p = pathname; q < end && (c = *p++); prior = c)
if (c != SEPARATOR || c != prior)
*q++ = c;
@@ -1136,7 +1134,7 @@ void StorageHandler::getFalconVersionInf
int StorageHandler::recoverGetNextLimbo(int xidLength, unsigned char* xid)
{
- if (!defaultDatabase)
+ if (!defaultDatabase)
initialize();
if (Connection* connection = dictionaryConnection)
@@ -1149,14 +1147,14 @@ const char* StorageHandler::normalizeNam
{
char *q = buffer;
char *end = buffer + bufferSize - 1;
-
+
for (const char *p = name; *p && q < end; ++p)
if (charTable[(unsigned char)*p])
return name;
else
*q++ = UPPER(*p);
-
+
*q = 0;
-
+
return buffer;
}
=== modified file 'storage/falcon/StorageParameters.h'
--- a/storage/falcon/StorageParameters.h 2008-07-10 19:00:14 +0000
+++ b/storage/falcon/StorageParameters.h 2008-09-28 11:32:52 +0000
@@ -21,7 +21,7 @@ PARAMETER_UINT(index_chill_threshold, "B
PARAMETER_UINT(io_threads, "Number of Falcon I/O threads", 2, 2, 20, 0, NULL)
PARAMETER_UINT(large_blob_threshold, "Threshold for large blobs", 0, 160000, INT_MAX, 0, NULL)
PARAMETER_UINT(lock_wait_timeout, "Transaction lock time period (seconds)", 0, 50, INT_MAX, 0, NULL)
-PARAMETER_UINT(page_size, "The page size used when creating a Falcon tablespace.", 1024, 4096, 32768, 0x0200, NULL)
+PARAMETER_UINT(page_size, "The page size used when creating a Falcon tablespace.", 2048, 4096, 32768, 0x0200, NULL)
PARAMETER_UINT(record_chill_threshold, "Bytes of pending record data that is 'frozen' to the Falcon serial log.", 1, 5*1024*1024, 1024*1024*1024, 0, &updateRecordChillThreshold)
PARAMETER_UINT(record_scavenge_floor, "A percentage of falcon_record_memory_threshold that defines the amount of record data that will remain in the record cache after a scavenge run.", 10, 50, 90, 0x2000, &StorageInterface::updateRecordScavengeFloor)
PARAMETER_UINT(record_scavenge_threshold, "The percentage of falcon_record_memory_max that will cause the scavenger thread to start scavenging records from the record cache.", 10, 67, 100, 0x2000, &StorageInterface::updateRecordScavengeThreshold)
=== modified file 'storage/falcon/StorageVersion.h'
--- a/storage/falcon/StorageVersion.h 2008-05-22 13:31:03 +0000
+++ b/storage/falcon/StorageVersion.h 2008-10-06 08:40:27 +0000
@@ -14,5 +14,5 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#define FALCON_VERSION "T1.2-5"
-#define FALCON_DATE "22 May, 2008"
+#define FALCON_VERSION "T1.2-6"
+#define FALCON_DATE "06 October, 2008"
=== modified file 'storage/falcon/Table.cpp'
--- a/storage/falcon/Table.cpp 2008-09-08 11:51:19 +0000
+++ b/storage/falcon/Table.cpp 2008-10-03 23:56:24 +0000
@@ -2117,7 +2117,10 @@ void Table::garbageCollect(Record *leavi
if (!leaving && !staying)
return;
- Sync syncPrior(getSyncPrior(leaving ? leaving : staying), "Table::garbageCollect");
+ Sync sync (&syncObject, "Table::garbageCollect(1)");
+ sync.lock(Shared);
+
+ Sync syncPrior(getSyncPrior(leaving ? leaving : staying), "Table::garbageCollect(2)");
syncPrior.lock(Shared);
// Clean up field indexes
=== modified file 'storage/falcon/TableSpaceManager.cpp'
--- a/storage/falcon/TableSpaceManager.cpp 2008-09-03 09:00:56 +0000
+++ b/storage/falcon/TableSpaceManager.cpp 2008-09-22 09:24:39 +0000
@@ -501,6 +501,18 @@ void TableSpaceManager::getTableSpaceInf
}
}
+JString TableSpaceManager::tableSpaceFileType(JString name)
+{
+ JString type;
+
+ if (name == "FALCON_USER" || name == "FALCON_TEMPORARY" || name == "FALCON_SYSTEM_BASE")
+ type = "SYSTEM DATAFILE";
+ else
+ type = "USER DATAFILE";
+
+ return type;
+}
+
void TableSpaceManager::getTableSpaceFilesInfo(InfoTable* infoTable)
{
PStatement statement = database->systemConnection->prepareStatement(
@@ -512,7 +524,7 @@ void TableSpaceManager::getTableSpaceFil
infoTable->putInt(0, 0); // FILE_ID NOT NULL, unused for now
infoTable->setNotNull(1); // FILE_NAME
infoTable->putString(1, resultSet->getString(2));
- infoTable->putString(2, "DATAFILE"); // FILE_TYPE NOT NULL
+ infoTable->putString(2, tableSpaceFileType(resultSet->getString(1))); // FILE_TYPE NOT NULL
infoTable->setNotNull(3); // TABLESPACE_NAME
infoTable->putString(3, resultSet->getString(1));
infoTable->setNull(4); // TABLE_CATALOG
=== modified file 'storage/falcon/TableSpaceManager.h'
--- a/storage/falcon/TableSpaceManager.h 2008-07-17 20:38:45 +0000
+++ b/storage/falcon/TableSpaceManager.h 2008-09-22 09:24:39 +0000
@@ -55,6 +55,7 @@ public:
JString tableSpaceType(JString name);
void getIOInfo(InfoTable* infoTable);
void getTableSpaceInfo(InfoTable* infoTable);
+ JString tableSpaceFileType(JString name);
void getTableSpaceFilesInfo(InfoTable* infoTable);
void validate(int optionMask);
void sync();
=== modified file 'storage/falcon/Transaction.cpp'
--- a/storage/falcon/Transaction.cpp 2008-09-10 19:51:03 +0000
+++ b/storage/falcon/Transaction.cpp 2008-10-02 23:51:36 +0000
@@ -1076,14 +1076,10 @@ void Transaction::addRef()
INTERLOCKED_INCREMENT(useCount);
}
-int Transaction::release()
+void Transaction::release()
{
- int count = INTERLOCKED_DECREMENT(useCount);
-
- if (count == 0)
+ if (INTERLOCKED_DECREMENT(useCount) == 0)
delete this;
-
- return count;
}
int Transaction::createSavepoint()
@@ -1317,7 +1313,7 @@ void Transaction::add(DeferredIndex* def
Sync sync(&syncDeferredIndexes, "Transaction::add");
sync.lock(Exclusive);
- deferredIndex->addRef();
+// deferredIndex->addRef(); // temporarily disabled for Bug#39711
deferredIndex->nextInTransaction = deferredIndexes;
deferredIndexes = deferredIndex;
deferredIndexCount++;
=== modified file 'storage/falcon/Transaction.h'
--- a/storage/falcon/Transaction.h 2008-09-10 04:02:07 +0000
+++ b/storage/falcon/Transaction.h 2008-10-02 23:20:47 +0000
@@ -99,7 +99,7 @@ public:
void prepare(int xidLength, const UCHAR *xid);
void rollback();
void commit();
- int release();
+ void release();
void addRef();
void waitForTransaction();
bool waitForTransaction (TransId transId);
=== modified file 'storage/falcon/ha_falcon.cpp'
--- a/storage/falcon/ha_falcon.cpp 2008-09-16 17:58:49 +0000
+++ b/storage/falcon/ha_falcon.cpp 2008-10-03 05:15:40 +0000
@@ -2180,46 +2180,6 @@ int StorageInterface::check_if_supported
}
}
- // TODO for Add Index:
- // 1. Check for supported ALTER combinations
- // 2. Can error message be improved for non-null columns?
-
- if (alter_flags->is_set(HA_ADD_INDEX) || alter_flags->is_set(HA_ADD_UNIQUE_INDEX))
- {
- for (unsigned int n = 0; n < altered_table->s->keys; n++)
- {
- if (n != altered_table->s->primary_key)
- {
- KEY *key = altered_table->key_info + n;
- KEY *tableEnd = table->key_info + table->s->keys;
- KEY *tableKey;
-
- // Determine if this is a new index
-
- for (tableKey = table->key_info; tableKey < tableEnd; tableKey++)
- if (!strcmp(tableKey->name, key->name))
- break;
-
- // Verify that each part is nullable
-
- if (tableKey >= tableEnd)
- for (uint p = 0; p < key->key_parts; p++)
- {
- KEY_PART_INFO *keyPart = key->key_part + p;
- if (keyPart && !keyPart->field->real_maybe_null())
- {
- DBUG_PRINT("info",("Online add index columns must be nullable"));
- DBUG_RETURN(HA_ALTER_NOT_SUPPORTED);
- }
- }
- }
- }
- }
-
- if (alter_flags->is_set(HA_DROP_INDEX) || alter_flags->is_set(HA_DROP_UNIQUE_INDEX))
- {
- }
-
DBUG_RETURN(HA_ALTER_SUPPORTED_NO_LOCK);
}
| Thread |
|---|
| • bzr push into mysql-6.0-backup branch (Rafal.Somla:2704 to 2705) Bug#17823 | Rafal Somla | 9 Oct |