List:Commits« Previous MessageNext Message »
From:Rafal Somla Date:October 9 2008 1:51pm
Subject:bzr push into mysql-6.0-backup branch (Rafal.Somla:2704 to 2705) Bug#17823
View as plain text  
 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(&current_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(&current_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(&current_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, (&param));
+
+  /*
+    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, (&param));
+
+  /*
+    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,
+                   (&param, 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, (&param, 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, (&param));
+  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(&param,
+                                                        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,
+                   (&param, (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,
+                   (&param, 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, (&param));
+  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(&param, mi);
+
+  int ret= 0;
+  FOREACH_OBSERVER(ret, thread_start, thd, (&param));
+  return ret;
+}
+
+
+int Binlog_relay_IO_delegate::thread_stop(THD *thd, Master_info *mi)
+{
+
+  Binlog_relay_IO_param param;
+  init_param(&param, mi);
+
+  int ret= 0;
+  FOREACH_OBSERVER(ret, thread_stop, thd, (&param));
+  return ret;
+}
+
+int Binlog_relay_IO_delegate::before_request_transmit(THD *thd,
+                                                      Master_info *mi,
+                                                      ushort flags)
+{
+  Binlog_relay_IO_param param;
+  init_param(&param, mi);
+
+  int ret= 0;
+  FOREACH_OBSERVER(ret, before_request_transmit, thd, (&param, (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(&param, mi);
+
+  int ret= 0;
+  FOREACH_OBSERVER(ret, after_read_event, thd,
+                   (&param, 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(&param, mi);
+
+  uint32 flags=0;
+  if (synced)
+    flags |= BINLOG_STORAGE_IS_SYNCED;
+
+  int ret= 0;
+  FOREACH_OBSERVER(ret, after_queue_event, thd,
+                   (&param, 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(&param, mi);
+
+  int ret= 0;
+  FOREACH_OBSERVER(ret, after_reset_slave, thd, (&param));
+  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#17823Rafal Somla9 Oct