summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BitKeeper/etc/logging_ok4
-rw-r--r--Docs/manual.texi5
-rw-r--r--innobase/configure.in2
-rw-r--r--innobase/os/os0file.c25
-rw-r--r--innobase/os/os0thread.c20
-rw-r--r--innobase/row/row0mysql.c12
-rw-r--r--mysql-test/r/bdb-alter-table-1.result4
-rw-r--r--mysql-test/r/bdb-alter-table-2.result4
-rw-r--r--mysql-test/t/bdb-alter-table-1.test12
-rw-r--r--mysql-test/t/bdb-alter-table-2.test3
-rw-r--r--sql/ha_innodb.cc4
-rw-r--r--sql/sql_table.cc13
12 files changed, 96 insertions, 12 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index 0bb4d3ceb88..bee07b37c43 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -29,6 +29,7 @@ jorge@linux.jorge.mysql.com
kaj@work.mysql.com
lenz@kallisto.mysql.com
lenz@mysql.com
+miguel@hegel.br
miguel@hegel.local
miguel@light.local
monty@bitch.mysql.fi
@@ -43,6 +44,7 @@ monty@tramp.mysql.fi
monty@work.mysql.com
mwagner@cash.mwagner.org
mwagner@evoq.mwagner.org
+nick@mysql.com
nick@nick.leippe.com
paul@central.snake.net
paul@teton.kitebird.com
@@ -75,5 +77,3 @@ worm@altair.is.lan
zak@balfor.local
zak@linux.local
zgreant@mysql.com
-miguel@hegel.br
-nick@mysql.com
diff --git a/Docs/manual.texi b/Docs/manual.texi
index 4eb8c57e036..d52e46fe909 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -51057,11 +51057,14 @@ not yet 100% confident in this code.
@appendixsubsec Changes in release 3.23.53
@itemize @bullet
@item
+Fixed a @code{BDB}-related @code{ALTER TABLE} bug with dropping a column
+and shutting down immediately thereafter.
+@item
Fixed problem with @code{configure ... --localstatedir=...}.
@item
Fixed problem with @code{UNSIGNED BIGINT} on AIX (again).
@item
-Fixed bug in pthread_mutex_trylock() on HPUX 11.0
+Fixed bug in pthread_mutex_trylock() on HPUX 11.0.
@item
Multithreaded stress tests for InnoDB.
@end itemize
diff --git a/innobase/configure.in b/innobase/configure.in
index 237db834f7a..761859e5da3 100644
--- a/innobase/configure.in
+++ b/innobase/configure.in
@@ -90,6 +90,8 @@ case "$target_os" in
CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE -DUNIV_HPUX -DUNIV_HPUX10";;
hp*)
CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE -DUNIV_HPUX";;
+ aix*)
+ CFLAGS="$CFLAGS -DUNIV_AIX";;
irix*)
CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE";;
osf*)
diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c
index 3ca0fbd68a4..0297388c413 100644
--- a/innobase/os/os0file.c
+++ b/innobase/os/os0file.c
@@ -11,6 +11,7 @@ Created 10/21/1995 Heikki Tuuri
#include "ut0mem.h"
#include "srv0srv.h"
#include "fil0fil.h"
+#include "buf0buf.h"
#undef HAVE_FDATASYNC
@@ -2105,6 +2106,7 @@ os_aio_simulated_handle(
ibool ret;
ulint n;
ulint i;
+ ulint len2;
segment = os_aio_get_array_and_local_segment(&array, global_segment);
@@ -2260,6 +2262,29 @@ consecutive_loop:
/* Do the i/o with ordinary, synchronous i/o functions: */
if (slot->type == OS_FILE_WRITE) {
+ if (array == os_aio_write_array) {
+
+ /* Do a 'last millisecond' check that the page end
+ is sensible; reported page checksum errors from
+ Linux seem to wipe over the page end */
+
+ for (len2 = 0; len2 + UNIV_PAGE_SIZE <= total_len;
+ len2 += UNIV_PAGE_SIZE) {
+ if (mach_read_from_4(combined_buf + len2
+ + FIL_PAGE_LSN + 4)
+ != mach_read_from_4(combined_buf + len2
+ + UNIV_PAGE_SIZE
+ - FIL_PAGE_END_LSN + 4)) {
+ ut_print_timestamp(stderr);
+ fprintf(stderr,
+" InnoDB: ERROR: The page to be written seems corrupt!\n");
+ page_print(combined_buf + len2);
+ fprintf(stderr,
+"InnoDB: ERROR: The page to be written seems corrupt!\n");
+ }
+ }
+ }
+
ret = os_file_write(slot->name, slot->file, combined_buf,
slot->offset, slot->offset_high, total_len);
} else {
diff --git a/innobase/os/os0thread.c b/innobase/os/os0thread.c
index 13990b6743b..146303b2791 100644
--- a/innobase/os/os0thread.c
+++ b/innobase/os/os0thread.c
@@ -128,8 +128,28 @@ os_thread_create(
pthread_attr_init(&attr);
+#ifdef UNIV_AIX
+ /* We must make sure a thread stack is at least 32 kB, otherwise
+ InnoDB might crash; we do not know if the default stack size on
+ AIX is always big enough. An empirical test on AIX-4.3 suggested
+ the size was 96 kB, though. */
+
+ ret = pthread_attr_setstacksize(&attr,
+ (size_t)(PTHREAD_STACK_MIN + 32 * 1024));
+ if (ret) {
+ fprintf(stderr,
+ "InnoDB: Error: pthread_attr_setstacksize returned %d\n", ret);
+ exit(1);
+ }
+#endif
ret = pthread_create(&pthread, &attr, start_f, arg);
+ if (ret) {
+ fprintf(stderr,
+ "InnoDB: Error: pthread_create returned %d\n", ret);
+ exit(1);
+ }
+
pthread_attr_destroy(&attr);
if (srv_set_thread_priorities) {
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c
index 3ee458f43bf..43eef8c5092 100644
--- a/innobase/row/row0mysql.c
+++ b/innobase/row/row0mysql.c
@@ -1350,7 +1350,9 @@ row_create_table_for_mysql(
"InnoDB: creating an InnoDB table with the same name in another\n"
"InnoDB: database and moving the .frm file to the current database.\n"
"InnoDB: Then MySQL thinks the table exists, and DROP TABLE will\n"
- "InnoDB: succeed.\n");
+ "InnoDB: succeed.\n"
+ "InnoDB: You can look further help from section 15.1 of\n"
+ "InnoDB: http://www.innodb.com/ibman.html\n");
}
trx->error_state = DB_SUCCESS;
@@ -1872,7 +1874,9 @@ row_drop_table_for_mysql(
" InnoDB: Error: table %s does not exist in the InnoDB internal\n"
"InnoDB: data dictionary though MySQL is trying to drop it.\n"
"InnoDB: Have you copied the .frm file of the table to the\n"
- "InnoDB: MySQL database directory from another database?\n",
+ "InnoDB: MySQL database directory from another database?\n"
+ "InnoDB: You can look further help from section 15.1 of\n"
+ "InnoDB: http://www.innodb.com/ibman.html\n",
name);
goto funct_exit;
}
@@ -2194,7 +2198,9 @@ row_rename_table_for_mysql(
fprintf(stderr,
" InnoDB: Error: table %s exists in the InnoDB internal data\n"
"InnoDB: dictionary though MySQL is trying rename table %s to it.\n"
- "InnoDB: Have you deleted the .frm file and not used DROP TABLE?\n",
+ "InnoDB: Have you deleted the .frm file and not used DROP TABLE?\n"
+ "InnoDB: You can look further help from section 15.1 of\n"
+ "InnoDB: http://www.innodb.com/ibman.html\n",
new_name, old_name);
fprintf(stderr,
diff --git a/mysql-test/r/bdb-alter-table-1.result b/mysql-test/r/bdb-alter-table-1.result
new file mode 100644
index 00000000000..3742f45eb7a
--- /dev/null
+++ b/mysql-test/r/bdb-alter-table-1.result
@@ -0,0 +1,4 @@
+objid tablename oid test
+1 t1 4 9
+2 metatable 1 9
+3 metaindex 1 9
diff --git a/mysql-test/r/bdb-alter-table-2.result b/mysql-test/r/bdb-alter-table-2.result
new file mode 100644
index 00000000000..19c6d5e1ff9
--- /dev/null
+++ b/mysql-test/r/bdb-alter-table-2.result
@@ -0,0 +1,4 @@
+objid tablename oid
+1 t1 4
+2 metatable 1
+3 metaindex 1
diff --git a/mysql-test/t/bdb-alter-table-1.test b/mysql-test/t/bdb-alter-table-1.test
new file mode 100644
index 00000000000..25a86cd92f6
--- /dev/null
+++ b/mysql-test/t/bdb-alter-table-1.test
@@ -0,0 +1,12 @@
+-- source include/have_bdb.inc
+
+#
+# Small basic test for ALTER TABLE bug ..
+#
+drop table if exists t1;
+create table t1(objid BIGINT not null, tablename varchar(64), oid BIGINT not null, test BIGINT, PRIMARY KEY (objid), UNIQUE(tablename)) type=BDB;
+insert into t1 values(1, 't1',4,9);
+insert into t1 values(2, 'metatable',1,9);
+insert into t1 values(3, 'metaindex',1,9 );
+select * from t1;
+alter table t1 drop column test;
diff --git a/mysql-test/t/bdb-alter-table-2.test b/mysql-test/t/bdb-alter-table-2.test
new file mode 100644
index 00000000000..69ff04ee24a
--- /dev/null
+++ b/mysql-test/t/bdb-alter-table-2.test
@@ -0,0 +1,3 @@
+-- source include/have_bdb.inc
+select * from t1;
+drop table t1; \ No newline at end of file
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index b6b86a1988a..a514116c02c 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -975,7 +975,9 @@ Cannot find table %s from the internal data dictionary\n\
of InnoDB though the .frm file for the table exists. Maybe you\n\
have deleted and recreated InnoDB data files but have forgotten\n\
to delete the corresponding .frm files of InnoDB tables, or you\n\
-have moved .frm files to another database?",
+have moved .frm files to another database?\n\
+Look from section 15.1 of http://www.innodb.com/ibman.html\n\
+how you can resolve the problem.\n",
norm_name);
free_share(share);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index f58201ae429..0ff0a6b3ac8 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1871,11 +1871,6 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
VOID(pthread_cond_broadcast(&COND_refresh));
goto err;
}
-#ifdef HAVE_BERKELEY_DB
- extern bool berkeley_flush_logs(void);
- if (old_db_type == DB_TYPE_BERKELEY_DB && berkeley_flush_logs())
- goto err;
-#endif
thd->proc_info="end";
mysql_update_log.write(thd, thd->query,thd->query_length);
if (mysql_bin_log.is_open())
@@ -1885,6 +1880,14 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
}
VOID(pthread_cond_broadcast(&COND_refresh));
VOID(pthread_mutex_unlock(&LOCK_open));
+#ifdef HAVE_BERKELEY_DB
+ if (old_db_type == DB_TYPE_BERKELEY_DB)
+ {
+ extern bool berkeley_flush_logs(void);
+ (void)berkeley_flush_logs();
+ table=open_ltable(thd,table_list,TL_READ);
+ }
+#endif
table_list->table=0; // For query cache
query_cache_invalidate3(thd, table_list, 0);