diff --git a/VC++Files/client/mysql_upgrade.dsp b/VC++Files/client/mysql_upgrade.dsp
new file mode 100644
index 0000000000000000000000000000000000000000..a039098d6391099a86f0cae485798a33b210e741
--- /dev/null
+++ b/VC++Files/client/mysql_upgrade.dsp
@@ -0,0 +1,71 @@
+# Microsoft Developer Studio Project File - Name="mysql_upgrade" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=mysql_upgrade - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "mysql_upgrade.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "mysql_upgrade.mak" CFG="mysql_upgrade - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "mysql_upgrade - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "mysql_upgrade___Win32_Release"
+# PROP BASE Intermediate_Dir "mysql_upgrade___Win32_Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "mysql_upgrade___Win32_Release"
+# PROP Intermediate_Dir "mysql_upgrade___Win32_Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../include" /D "NDEBUG" /D "DBUG_OFF" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /Fp"Release/mysql_upgrade.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib zlib.lib /nologo /subsystem:console /pdb:"release/mysql_upgrade.pdb" /machine:I386 /out:"../client_release/mysql_upgrade.exe" /libpath:"..\lib_release\\"
+# SUBTRACT LINK32 /pdb:none
+# Begin Target
+
+# Name "mysql_upgrade - Win32 Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\mysql_upgrade.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/VC++Files/client/mysql_upgrade_ia64.dsp b/VC++Files/client/mysql_upgrade_ia64.dsp
new file mode 100644
index 0000000000000000000000000000000000000000..a116f3f06c39ac7cc5ec8afa81f9eb9b79742ad8
--- /dev/null
+++ b/VC++Files/client/mysql_upgrade_ia64.dsp
@@ -0,0 +1,77 @@
+# Microsoft Developer Studio Project File - Name="mysql_upgrade" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=mysql_upgrade - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "mysql_upgrade.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "mysql_upgrade.mak" CFG="mysql_upgrade - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "mysql_upgrade - WinIA64 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "mysql - WinIA64 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "mysql_upgrade___WinIA64_Release"
+# PROP BASE Intermediate_Dir "mysql_upgrade___WinIA64_Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "mysql_upgrade___WinIA64_Release"
+# PROP Intermediate_Dir "mysql_upgrade___WinIA64_Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo  /MT /W3  /I "../include" /D"NDEBUG" /D"DBUG_OFF" /D"_CONSOLE" /D"_MBCS" /D"_WINDOWS" /Fp"Release/mysql_upgrade.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c /O2 /G2 /EHsc /D"_IA64_" /Zi /D"WIN64" /D"WIN32" /D"_AFX_NO_DAO_SUPPORT" /Wp64 /Zm600
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  /nologo /subsystem:console /machine:IA64
+# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib zlib.lib /nologo /subsystem:console /pdb:"release/mysql_upgrade.pdb" /machine:IA64 /out:"../client_release/mysql_upgrade.exe" /libpath:"..\lib_release\\" /incremental:no
+# SUBTRACT LINK32 
+
+!ENDIF
+
+# Begin Target
+
+# Name "mysql_upgrade - WinIA64 Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\mysql_upgrade.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/VC++Files/mysql.dsw b/VC++Files/mysql.dsw
index 36e3e1ae10c1d8ed390f1a082fed460d46e6559e..b31b0dd0d29a2d1830a1f2514a6630916707b5db 100644
--- a/VC++Files/mysql.dsw
+++ b/VC++Files/mysql.dsw
@@ -339,6 +339,27 @@ Package=<4>
 
 ###############################################################################
 
+Project: "mysql_upgrade"=".\client\mysql_upgrade.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name mysqlclient
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name zlib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name mysys
+    End Project Dependency
+}}}
+
+###############################################################################
+
 Project: "mysqlbinlog"=".\mysqlbinlog\mysqlbinlog.dsp" - Package Owner=<4>
 
 Package=<5>
@@ -415,6 +436,8 @@ Package=<4>
     End Project Dependency
     Begin Project Dependency
     Project_Dep_Name mysqladmin
+    Begin Project Dependency
+    Project_Dep_Name myqsl_upgrade
     End Project Dependency
     Begin Project Dependency
     Project_Dep_Name mysqldump
@@ -802,6 +825,8 @@ Package=<4>
     End Project Dependency
     Begin Project Dependency
     Project_Dep_Name mysqladmin
+    Begin Project Dependency
+    Project_Dep_Name mysql_upgrade
     End Project Dependency
     Begin Project Dependency
     Project_Dep_Name mysql_client_test
diff --git a/VC++Files/mysql_ia64.dsw b/VC++Files/mysql_ia64.dsw
index 1e441107c933a611ee7dc8f2c4bb10465c5b2381..96878cd3651237c0f6d638c373cec4c5a18ba2d4 100644
--- a/VC++Files/mysql_ia64.dsw
+++ b/VC++Files/mysql_ia64.dsw
@@ -436,6 +436,24 @@ Package=<4>
 
 ###############################################################################
 
+Project: "mysql_upgrade"=".\client\mysql_upgrade_ia64.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name mysqlclient
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name zlib
+    End Project Dependency
+}}}
+
+###############################################################################
+
 Project: "mysqlbinlog"=".\mysqlbinlog\mysqlbinlog_ia64.dsp" - Package Owner=<4>
 
 Package=<5>
@@ -500,6 +518,8 @@ Package=<4>
     End Project Dependency
     Begin Project Dependency
     Project_Dep_Name mysqladmin_ia64
+    Begin Project Dependency
+    Project_Dep_Name mysql_upgrade_ia64
     End Project Dependency
     Begin Project Dependency
     Project_Dep_Name mysqldump
diff --git a/client/Makefile.am b/client/Makefile.am
index 970ca744146b92b5e08f25b620a520c79a314cdf..66f0ce9ad6d637e02ff4774c3b6eabc1e342fbda 100644
--- a/client/Makefile.am
+++ b/client/Makefile.am
@@ -39,7 +39,7 @@ LDADD=				@CLIENT_EXTRA_LDFLAGS@ $(CLIENT_THREAD_LIBS) \
 bin_PROGRAMS =			mysql mysqladmin mysqlcheck mysqlshow \
 				mysqldump mysqlimport mysqltest mysqlbinlog \
 				mysqltestmanagerc mysqltestmanager-pwgen \
-				mysqlslap
+				mysqlslap mysql_upgrade
 noinst_HEADERS =		sql_string.h completion_hash.h my_readline.h \
 				client_priv.h
 mysql_SOURCES =			mysql.cc readline.cc sql_string.cc completion_hash.cc
@@ -72,11 +72,14 @@ mysqlslap_SOURCES=		mysqlslap.c \
 mysqldump_SOURCES=		mysqldump.c my_user.c $(yassl_dummy_link_fix)
 mysqlimport_SOURCES=		mysqlimport.c \
 				$(yassl_dummy_link_fix)
+mysql_upgrade_SOURCES=          mysql_upgrade.c $(yassl_dummy_link_fix)
 sql_src=log_event.h mysql_priv.h log_event.cc my_decimal.h my_decimal.cc
 strings_src=decimal.c
 
 # Fix for mit-threads
-DEFS =			-DUNDEF_THREADS_HACK
+DEFS =			-DUNDEF_THREADS_HACK \
+			-DDEFAULT_MYSQL_HOME="\"$(prefix)\"" \
+			-DDATADIR="\"$(localstatedir)\"" 
 EXTRA_DIST =		get_password.c cmakelists.txt
 
 link_sources:
diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c
new file mode 100644
index 0000000000000000000000000000000000000000..743e9cc3b693a3b5bdc7cb00fce7d9adb0d14707
--- /dev/null
+++ b/client/mysql_upgrade.c
@@ -0,0 +1,400 @@
+/* Copyright (C) 2000 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; either version 2 of the License, or
+   (at your option) any later version.
+
+   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 "client_priv.h"
+#include <my_dir.h>
+
+static my_bool opt_force= 0, opt_verbose= 0, tty_password= 0;
+static char *user= (char*) "root", *basedir= 0, *datadir= 0, *opt_password= 0;
+static my_bool upgrade_defaults_created= 0;
+static my_string opt_mysql_port, opt_mysql_unix_port= 0;
+static char *default_dbug_option= (char*) "d:t:O,/tmp/comp_err.trace";
+static my_bool info_flag= 0;
+
+static struct my_option my_long_options[]=
+{
+  {"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG,
+   NO_ARG, 0, 0, 0, 0, 0, 0},
+  {"basedir", 'b', "Specifies the directory where MySQL is installed",
+   (gptr*) &basedir,
+   (gptr*) &basedir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+  {"datadir", 'd', "Specifies the data directory", (gptr*) &datadir,
+   (gptr*) &datadir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+#ifdef DBUG_OFF
+  {"debug", '#', "This is a non-debug version. Catch this and exit",
+   0, 0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
+#else
+  {"debug", '#', "Output debug log", (gptr *) & default_dbug_option,
+   (gptr *) & default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
+#endif
+  {"debug-info", 'T', "Print some debug info at exit.", (gptr *) & info_flag,
+   (gptr *) & info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+  {"force", 'f', "Continue even if we get an sql-error.",
+   (gptr*) &opt_force, (gptr*) &opt_force, 0, GET_BOOL, NO_ARG, 0, 0,
+   0, 0, 0, 0},
+  {"password", 'p',
+   "Password to use when connecting to server. If password is not given it's solicited on the tty.",
+   0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
+  {"port", 'P', "Port number to use for connection.", (gptr*) &opt_mysql_port,
+   (gptr*) &opt_mysql_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0,
+   0},
+  {"protocol", OPT_MYSQL_PROTOCOL,
+   "The protocol of connection (tcp,socket,pipe,memory).",
+   0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+  {"socket", 'S', "Socket file to use for connection.",
+   (gptr*) &opt_mysql_unix_port, (gptr*) &opt_mysql_unix_port, 0, GET_STR,
+   REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+  {"user", 'u', "User for login if not current user.", (gptr*) &user,
+   (gptr*) &user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+  {"verbose", 'v', "Display more output about the process", (gptr*) &opt_verbose,
+    (gptr *) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+  {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
+};
+static const char *load_default_groups[]=
+{
+  "mysql_upgrade", "client", 0
+};
+
+#include <help_end.h>
+
+static my_bool
+get_one_option(int optid, const struct my_option *opt __attribute__ ((unused)),
+               char *argument)
+{
+  switch (optid) {
+  case '?':
+    puts
+      ("MySQL utility script to upgrade database to the current server version");
+    puts("");
+    my_print_help(my_long_options);
+    exit(0);
+  case '#':
+    DBUG_PUSH(argument ? argument : default_dbug_option);
+    break;
+  case 'f':
+    opt_force= TRUE;
+    break;
+  case 'p':
+    tty_password= 1;
+    if (argument)
+    {
+      char *start= argument;
+      my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR));
+      opt_password= my_strdup(argument, MYF(MY_FAE));
+      while (*argument)
+        *argument++= 'x';                       /* Destroy argument */
+      if (*start)
+        start[1]= 0;                            /* Cut length of argument */
+      tty_password= 0;
+    }
+    break;
+  default:;
+  };
+  return 0;
+}
+
+
+/* buffer should be not smaller than FN_REFLEN */
+static my_bool test_file_exists_res(const char *dir, const char *fname,
+                                    char *buffer, char **buf_end)
+{
+  MY_STAT stat_info;
+
+  *buf_end= strxnmov(buffer, FN_REFLEN-1, dir, "/", fname, NullS);
+  unpack_filename(buffer, buffer);
+  return my_stat(buffer, &stat_info, MYF(0)) != 0;
+}
+
+
+static my_bool test_file_exists(const char *dir, const char *fname)
+{
+  char path[FN_REFLEN];
+  char *path_end;
+  return test_file_exists_res(dir, fname, path, &path_end);
+}
+
+
+static int create_check_file(const char *path)
+{
+  File check_file= my_open(path, O_CREAT | O_WRONLY, MYF(MY_FAE | MY_WME));
+  int error;
+
+  if (check_file < 0)
+    return 1;
+
+  error= my_write(check_file, VERSION, strlen(VERSION), MYF(MY_WME | MY_FNABP));
+  error= my_close(check_file, MYF(MY_FAE | MY_WME)) || error;
+  return error;
+}
+
+
+static int create_defaults_file(const char *path, const char *our_defaults_path)
+{
+  uint b_read;
+  File our_defaults_file;
+  char buffer[512];
+  char *buffer_end;
+  int error;
+
+  /* check if the defaults file is needed at all */
+  if (!opt_password)
+    return 0;
+
+  File defaults_file= my_open(path, O_BINARY | O_CREAT | O_WRONLY,
+                              MYF(MY_FAE | MY_WME));
+
+  if (defaults_file < 0)
+    return 1;
+  upgrade_defaults_created= 1;
+  if (our_defaults_path)
+  {
+    our_defaults_file= my_open(our_defaults_path, O_RDONLY,
+                               MYF(MY_FAE | MY_WME));
+    if (our_defaults_file < 0)
+      return 1;
+    do
+    {
+      if (((b_read= my_read(our_defaults_file, buffer,
+                            sizeof(buffer), MYF(MY_WME))) == MY_FILE_ERROR) ||
+          my_write(defaults_file, buffer, b_read, MYF(MY_FNABP | MY_WME)))
+      {
+        error= 1;
+        goto close_return;
+      }
+    } while (b_read == sizeof(buffer));
+  }
+  buffer_end= strnmov(buffer, "\n[client]", sizeof(buffer));
+  if (opt_password)
+    buffer_end= strxnmov(buffer, sizeof(buffer),
+                         "\npassword=", opt_password, NullS);
+  error= my_write(defaults_file, buffer, (int) (buffer_end - buffer),
+                  MYF(MY_WME | MY_FNABP));
+close_return:
+  return my_close(defaults_file, MYF(MY_WME)) || error;
+}
+
+
+int main(int argc, char **argv)
+{
+  char bindir[FN_REFLEN];
+  char *bindir_end, *buf_end;
+  char datadir_buf[FN_REFLEN];
+  char mysqlcheck_line[FN_REFLEN], *mysqlcheck_end;
+  char check_file_name[FN_REFLEN];
+  int check_file;
+  char fix_priv_tables_cmd[FN_REFLEN], *fix_cmd_end;
+  char script_line[FN_REFLEN];
+  int error;
+  char *forced_defaults_file;
+  char *forced_extra_defaults;
+  char *defaults_group_suffix;
+  char upgrade_defaults_path[FN_REFLEN], *defaults_to_use= 0;
+  char port_socket[100], *port_socket_end;
+
+  MY_INIT(argv[0]);
+#ifdef __NETWARE__
+  setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
+#endif
+
+  load_defaults("my", load_default_groups, &argc, &argv);
+
+  if ((error= handle_options(&argc, &argv, my_long_options, get_one_option)))
+    exit(error);
+
+  if (tty_password)
+    opt_password= get_tty_password(NullS);
+
+  /* Check if we want to force the use a specific default file */
+  get_defaults_options(argc, argv,
+                       &forced_defaults_file, &forced_extra_defaults,
+                       &defaults_group_suffix);
+
+  port_socket_end= port_socket;
+  if (opt_mysql_port)
+    port_socket_end= strxnmov(port_socket, sizeof(port_socket) - 1, " --port=",
+                              opt_mysql_port, NullS);
+  if (opt_mysql_unix_port)
+    port_socket_end= strxnmov(port_socket_end,
+                              sizeof(port_socket) -
+                                (int)(port_socket_end - port_socket) - 1,
+                              " --socket=", opt_mysql_unix_port, NullS);
+  *port_socket_end= 0;
+
+  if (basedir)
+  {
+    bindir_end= strmake(bindir, basedir, sizeof(bindir)-1);
+  }
+  else
+  {
+    if (test_file_exists("./share/mysql/english", "errmsg.sys")
+        && (test_file_exists("./bin", "mysqld") ||
+            test_file_exists("./libexec", "mysqld")))
+    {
+      getcwd(bindir, sizeof(bindir));
+      bindir_end= bindir + strlen(bindir);
+    }
+    else
+    {
+      bindir_end= strmake(bindir, DEFAULT_MYSQL_HOME, sizeof(bindir)-1);
+    }
+  }
+
+  if (!datadir)
+  {
+    datadir= datadir_buf;
+    if (test_file_exists(bindir, "data/mysql"))
+    {
+      *strxnmov(datadir_buf, sizeof(datadir_buf)-1, bindir, "/data", NullS)= 0;
+    }
+    else if (test_file_exists(bindir, "var/mysql"))
+    {
+      *strxnmov(datadir_buf, sizeof(datadir_buf)-1, bindir, "/var", NullS)= 0;
+    }
+    else
+      datadir= (char*) DATADIR;
+  }
+
+  strmake(bindir_end, "/bin", sizeof(bindir) - (int) (bindir_end - bindir)-1);
+
+  if (!test_file_exists_res
+      (bindir, "mysqlcheck", mysqlcheck_line, &mysqlcheck_end))
+  {
+    printf("Can't find program '%s'\n", mysqlcheck_line);
+    puts("Please restart with --basedir=mysql-install-directory");
+    exit(1);
+  }
+
+  if (!test_file_exists(datadir, "mysql/user.frm"))
+  {
+    puts
+      ("Can't find data directory. Please restart with --datadir=path-to-data-dir");
+    exit(1);
+  }
+
+  /* create the modified defaults file to be used by mysqlcheck */
+  /* and mysql tools                                            */
+  *strxnmov(upgrade_defaults_path, sizeof(upgrade_defaults_path)-1,
+           datadir, "/upgrade_defaults", NullS)= 0;
+  unpack_filename(upgrade_defaults_path, upgrade_defaults_path);
+  if ((error=
+       create_defaults_file(upgrade_defaults_path, forced_extra_defaults)))
+    goto err_exit;
+
+  defaults_to_use= upgrade_defaults_created ?
+    upgrade_defaults_path : forced_extra_defaults;
+
+  if (test_file_exists_res(datadir, "mysql_upgrade_info", check_file_name,
+                           &buf_end) && !opt_force)
+  {
+    char chf_buffer[50];
+    int b_read;
+    check_file= my_open(check_file_name, O_RDONLY, MYF(0));
+    b_read= my_read(check_file, chf_buffer, sizeof(chf_buffer)-1, MYF(0));
+    chf_buffer[b_read]= 0;
+    my_close(check_file, MYF(0));
+    if (!strcmp(chf_buffer, VERSION))
+    {
+      if (opt_verbose)
+        puts("mysql_upgrade already done for this version");
+      goto fix_priv_tables;
+    }
+  }
+
+  if (defaults_to_use)
+  {
+    mysqlcheck_end= strxnmov(mysqlcheck_end,
+                             sizeof(mysqlcheck_line) - (int) (mysqlcheck_end -
+                                                              mysqlcheck_line),
+                             " --defaults-extra-file=", defaults_to_use,NullS);
+  }
+
+  mysqlcheck_end= strxnmov(mysqlcheck_end,
+                           sizeof(mysqlcheck_line) -
+                             (int) (mysqlcheck_end - mysqlcheck_line - 1),
+                           " --check-upgrade --all-databases --auto-repair --user=",
+                           user, port_socket, NullS);
+  *mysqlcheck_end= 0;
+
+  if (opt_verbose)
+    printf("Running %s\n", mysqlcheck_line);
+  if ((error= system(mysqlcheck_line)))
+  {
+    printf("Error executing '%s'\n", mysqlcheck_line);
+    goto err_exit;
+  }
+
+  if ((error= create_check_file(check_file_name)))
+    goto err_exit;
+
+fix_priv_tables:
+  if (!test_file_exists_res(bindir, "mysql", fix_priv_tables_cmd, &fix_cmd_end))
+  {
+    puts("Could not find MySQL command-line client (mysql).");
+    puts
+      ("Please use --basedir to specify the directory where MySQL is installed.");
+    error= 1;
+    goto err_exit;
+  }
+
+  if (!test_file_exists_res(basedir,
+                            "support_files/mysql_fix_privilege_tables.sql",
+                            script_line, &buf_end)
+      && !test_file_exists_res(basedir, "share/mysql_fix_privilege_tables.sql",
+                               script_line, &buf_end)
+      && !test_file_exists_res(basedir,
+                               "share/mysql/mysql_fix_privilege_tables.sql",
+                               script_line, &buf_end)
+      && !test_file_exists_res(basedir,
+                               "scripts/mysql_fix_privilege_tables.sql",
+                               script_line, &buf_end)
+      && !test_file_exists_res("/usr/local/mysql/share/mysql",
+                               "mysql_fix_privilege_tables.sql", script_line,
+                               &buf_end))
+  {
+    puts("Could not find file mysql_fix_privilege_tables.sql");
+    puts
+      ("Please use --basedir to specify the directory where MySQL is installed");
+    error= 1;
+    goto err_exit;
+  }
+
+  if (defaults_to_use)
+  {
+    fix_cmd_end= strxnmov(fix_cmd_end,
+                          sizeof(fix_priv_tables_cmd) -
+                            (int) (fix_cmd_end - fix_priv_tables_cmd - 1),
+                          " --defaults-extra-file=", defaults_to_use, NullS);
+  }
+  fix_cmd_end= strxnmov(fix_cmd_end,
+           sizeof(fix_priv_tables_cmd) - (int) (fix_cmd_end -
+                                                fix_priv_tables_cmd),
+           " --user=", user, port_socket, " mysql < ", script_line, NullS);
+  *fix_cmd_end= 0;
+
+  if ((error= system(fix_priv_tables_cmd)))
+  {
+    /* Problem is that the 'Duplicate column' error           */
+    /* which is not a bug for the script makes 'mysql' return */
+    /* an error                                               */
+    /* printf("Error executing '%s'\n", fix_priv_tables_cmd); */
+  }
+
+err_exit:
+  if (upgrade_defaults_created)
+    my_delete(upgrade_defaults_path, MYF(0));
+  my_end(info_flag ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
+  return error;
+}                                               /* main */
diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result
index 48f9b04c15f1901db9bec91b2698b44fab473073..ec8bbc16a41ca19f882d3dc2dd1550752ebb549b 100644
--- a/mysql-test/r/partition.result
+++ b/mysql-test/r/partition.result
@@ -848,4 +848,21 @@ t1	CREATE TABLE `t1` (
   `a` int(11) DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY LIST (a) (PARTITION p0 VALUES IN (NULL) ENGINE = MyISAM)
 DROP TABLE t1;
+create table t1 (s1 int auto_increment primary key)
+partition by list (s1)
+(partition p1 values in (1),
+partition p2 values in (2),
+partition p3 values in (3));
+insert into t1 values (null);
+insert into t1 values (null);
+insert into t1 values (null);
+select auto_increment from information_schema.tables where table_name='t1';
+auto_increment
+4
+select * from t1;
+s1
+1
+2
+3
+drop table t1;
 End of 5.1 tests
diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def
index 98b1ae08b1515a9d1b2e0fc8aae56060be33a96e..0e842ae54d0718e8dbb6068be8e436204bae89e2 100644
--- a/mysql-test/t/disabled.def
+++ b/mysql-test/t/disabled.def
@@ -4,49 +4,50 @@
 #
 #  Separate the test case name and the comment with ':'.
 #
-#      <testcasename>  : Comment test
+#    <testcasename> : BUG#<xxxx> <date disabled> <disabler> <comment>
 #
 #  Do not use any TAB characters for whitespace.
 #
 ##############################################################################
-events_bugs             : test case unstable (race conditions). andrey will fix
-events_stress           : test case unstable. andrey will fix
-events                  : test case unstable. andrey will fix
-#ndb_alter_table_row    : sometimes wrong error 1015!=1046
-ndb_autodiscover        : Needs to be fixed w.r.t binlog
-ndb_autodiscover2       : Needs to be fixed w.r.t binlog
-#ndb_binlog_basic        : Results are not deterministic, Tomas will fix
-#ndb_binlog_multi        : Results are not deterministic, Tomas will fix
-ndb_cache2  : Bug #18597
-ndb_gis    : Bug #18600
-ndb_load                : Bug#17233
-partition_03ndb         : Bug#16385
-ps_7ndb                 : dbug assert in RBR mode when executing test suite
-#rpl_bit_npk             : Bug#13418
-#rpl_ddl                 : Bug#15963 SBR does not show "Definer" correctly
-rpl_ndb_dd_basic        : Bug #18569
-rpl_row_basic_7ndb        : Bug #18923
-rpl_ndb_dd_advance        : Bug #18924
-rpl_ndb_multi_update2     : Bug #18928
-rpl_ndb_2innodb         : assertion in get_parts_for_update()
-rpl_ndb_2myisam         : assertion in get_parts_for_update()
-rpl_ndb_auto_inc        : Bug#17086
-rpl_ndb_basic           : Bug #18592
-#rpl_ndb_blob            : interferes with following tests, causing hang
-#rpl_ndb_blob2           : interferes with following tests, causing hang
-rpl_ndb_ddl             : master hangs
-#rpl_ndb_delete_nowhere  : Bug#17400: delete & update of rows in table without pk fails
-rpl_ndb_insert_ignore : Bug #18567
-rpl_ndb_innodb2ndb      : Bug#18261: Cluster Replication: tests rpl_ndb_xxx2ndb fails
-rpl_ndb_myisam2ndb      : Bug#18261: Cluster Replication: tests rpl_ndb_xxx2ndb fails
-rpl_ndb_multi_update3   : Bug#18627: Cluster Replication: rpl_ndb_multi_update3 fails on Intel 64 bit
-rpl_ndb_log             : result not deterministic, TBD if should remove
-rpl_ndb_relay_space     : Bug#16993
-#rpl_ndb_multi_update3   : Bug#17400: delete & update of rows in table without pk fails
-rpl_switch_stm_row_mixed : Bug #18590
-rpl_row_inexist_tbl     : Disabled since patch makes this test wait forever
-rpl_sp                  : Bug#16456
-rpl_until               : Unstable test case, bug#15886
-sp-goto                 : GOTO is currently is disabled - will be fixed in the future
-mysqldump               : BUG#18078
-udf             : Bug#18564 (Permission by Brian)
+events_bugs              : BUG#17619 2006-02-21 andrey  Test case unstable (race conditions)
+events_stress            : BUG#17619 2006-02-21 andrey  Test case unstable
+events                   : BUG#17619 2006-02-21 andrey  Test case unstable
+ndb_autodiscover         : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
+ndb_autodiscover2        : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
+ndb_cache2               : BUG#18597 2006-03-28 brian
+ndb_gis                  : BUG#18600 2006-03-28 brian
+ndb_load                 : BUG#17233 2006-02-16 jmiller
+partition_03ndb          : BUG#16385 2006-03-24 mikael
+ps_7ndb                  : BUG#18950 2006-02-16 jmiller Dbug assert in RBR mode when executing test suite
+rpl_ndb_dd_basic         : BUG#18569 2006-03-28 brian
+rpl_row_basic_7ndb       : BUG#18923 2006-04-09 brian
+rpl_ndb_dd_advance       : BUG#18924 2006-04-09 brian
+rpl_ndb_multi_update2    : BUG#18928 2006-04-09 brian
+rpl_ndb_2innodb          : BUG#18945 2006-03-22 tomas   Assertion in get_parts_for_update()
+rpl_ndb_2myisam          : BUG#18945 2006-03-22 tomas   Assertion in get_parts_for_update()
+rpl_ndb_auto_inc         : BUG#17086 2006-02-16 jmiller
+rpl_ndb_basic            : BUG#18592 2006-03-28 brian
+rpl_ndb_ddl              : BUG#18946 2006-03-16 mats    Master hangs (Probably related to BUG#17400)
+rpl_ndb_insert_ignore    : BUG#18567 2006-03-28 brian
+rpl_ndb_innodb2ndb       : BUG#18261 2006-03-16 mats    Cluster Replication: tests rpl_ndb_xxx2ndb fails (BUG#17400)
+rpl_ndb_myisam2ndb       : BUG#18261 2006-03-16 mats    Cluster Replication: tests rpl_ndb_xxx2ndb fails (BUG#17400)
+rpl_ndb_multi_update3    : BUG#18627 2006-03-29 monty   Cluster Replication: rpl_ndb_multi_update3 fails on Intel 64 bit
+rpl_ndb_log              : BUG#18947 2006-03-21 tomas   Result not deterministic, TBD if should remove
+rpl_ndb_relay_space      : BUG#16993 2006-02-16 jmiller
+rpl_switch_stm_row_mixed : BUG#18590 2006-03-28 brian
+rpl_row_inexist_tbl      : BUG#18948 2006-03-09 mats    Disabled since patch makes this test wait forever
+rpl_sp                   : BUG#16456 2006-02-16 jmiller
+rpl_until                : BUG#15886 2006-02-16 jmiller Unstable test case
+sp-goto                  : BUG#18949 2006-02-16 jmiller GOTO is currently is disabled - will be fixed in the future
+mysqldump                : BUG#18078 2006-03-10 lars
+udf                      : BUG#18564 2006-03-27 ian     (Permission by Brian)
+
+#ndb_alter_table_row      : sometimes wrong error 1015!=1046
+#ndb_binlog_basic         : Results are not deterministic, Tomas will fix
+#ndb_binlog_multi         : Results are not deterministic, Tomas will fix
+#rpl_bit_npk              : Bug#13418
+#rpl_ddl                  : Bug#15963 SBR does not show "Definer" correctly
+#rpl_ndb_blob             : interferes with following tests, causing hang
+#rpl_ndb_blob2            : interferes with following tests, causing hang
+#rpl_ndb_delete_nowhere   : Bug#17400: delete & update of rows in table without pk fails
+#rpl_ndb_multi_update3    : Bug#17400: delete & update of rows in table without pk fails
diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test
index 4eb27765f5f723981fcbab4cb24c1a566ae07722..c3f1cc6da6dfea03f133efe0cdeb37dfa5164a7a 100644
--- a/mysql-test/t/partition.test
+++ b/mysql-test/t/partition.test
@@ -965,4 +965,19 @@ PARTITION BY LIST (a)
 SHOW CREATE TABLE t1;
 DROP TABLE t1;
 
+#
+# Bug#18753 Partitions: auto_increment fails
+#
+create table t1 (s1 int auto_increment primary key)
+partition by list (s1)
+(partition p1 values in (1),
+ partition p2 values in (2),
+ partition p3 values in (3));
+insert into t1 values (null);
+insert into t1 values (null);
+insert into t1 values (null);
+select auto_increment from information_schema.tables where table_name='t1';
+select * from t1;
+drop table t1;
+
 --echo End of 5.1 tests
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 7cf841a5d71e6c6d13736c60c98c5360bffee9a4..3f74b555f4a088f39b89aa71d4a758d05ba19cea 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -4201,11 +4201,7 @@ void ha_partition::info(uint flag)
   if (flag & HA_STATUS_AUTO)
   {
     DBUG_PRINT("info", ("HA_STATUS_AUTO"));
-    /*
-      The auto increment value is only maintained by the first handler
-      so we will only call this.
-    */
-    m_file[0]->info(HA_STATUS_AUTO);
+    auto_increment_value= get_auto_increment();
   }
   if (flag & HA_STATUS_VARIABLE)
   {
@@ -5349,9 +5345,15 @@ void ha_partition::restore_auto_increment()
 
 ulonglong ha_partition::get_auto_increment()
 {
+  ulonglong auto_inc, max_auto_inc= 0;
   DBUG_ENTER("ha_partition::get_auto_increment");
 
-  DBUG_RETURN(m_file[0]->get_auto_increment());
+  for (uint i= 0; i < m_tot_parts; i++)
+  {
+    auto_inc= m_file[i]->get_auto_increment();
+    set_if_bigger(max_auto_inc, auto_inc);
+  }
+  DBUG_RETURN(max_auto_inc);
 }