List:Commits« Previous MessageNext Message »
From:Konstantin Osipov Date:August 10 2010 8:38am
Subject:bzr push into mysql-5.5-bugfixing branch (kostja:3092 to 3093)
View as plain text  
 3093 Konstantin Osipov	2010-08-10 [merge]
      Merge 5.5-runtime -> 5.5-runtime-stage.

    removed:
      BUILD/compile-pentium-mysqlfs-debug
    modified:
      .bzr-mysql/default.conf
      .bzrignore
      BUILD/Makefile.am
      BUILD/SETUP.sh
      BUILD/autorun.sh
      BUILD/build_mccge.sh
      BUILD/check-cpu
      BUILD/compile-ndb-autotest
      BUILD/compile-pentium-debug
      BUILD/compile-pentium-debug-max
      BUILD/compile-pentium-debug-max-no-ndb
      BUILD/compile-pentium-debug-openssl
      BUILD/compile-pentium-debug-yassl
      BUILD/compile-pentium64-debug
      BUILD/compile-pentium64-debug-max
      CMakeLists.txt
      cmake/configure.pl
      cmake/plugin.cmake
      config/ac-macros/ha_ndbcluster.m4
      configure.in
      mysql-test/r/func_group.result
      mysql-test/r/signal.result
      mysql-test/r/signal_demo3.result
      mysql-test/r/sp-big.result
      mysql-test/r/sp-bugs.result
      mysql-test/r/sp-code.result
      mysql-test/r/sp-error.result
      mysql-test/r/sp.result
      mysql-test/r/sp_trans.result
      mysql-test/r/strict.result
      mysql-test/r/view.result
      mysql-test/suite/federated/federated_server.result
      mysql-test/suite/federated/federated_server.test
      mysql-test/suite/funcs_1/r/innodb_storedproc_02.result
      mysql-test/suite/funcs_1/r/memory_storedproc_02.result
      mysql-test/suite/funcs_1/r/myisam_storedproc_02.result
      mysql-test/suite/funcs_1/r/storedproc.result
      mysql-test/suite/rpl/r/rpl_row_sp005.result
      mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result
      mysql-test/suite/rpl/r/rpl_row_trig003.result
      mysql-test/t/disabled.def
      mysql-test/t/func_group.test
      mysql-test/t/signal.test
      mysql-test/t/sp-code.test
      mysql-test/t/sp-error.test
      mysql-test/t/sp.test
      scripts/CMakeLists.txt
      sql-bench/CMakeLists.txt
      sql/CMakeLists.txt
      sql/datadict.cc
      sql/ha_ndbcluster.cc
      sql/ha_ndbcluster_binlog.cc
      sql/ha_ndbcluster_binlog.h
      sql/handler.cc
      sql/handler.h
      sql/item.cc
      sql/mdl.cc
      sql/sp_head.cc
      sql/sp_pcontext.h
      sql/sp_rcontext.cc
      sql/sp_rcontext.h
      sql/sql_base.cc
      sql/sql_base.h
      sql/sql_class.cc
      sql/sql_class.h
      sql/sql_delete.cc
      sql/sql_error.cc
      sql/sql_error.h
      sql/sql_insert.cc
      sql/sql_parse.cc
      sql/sql_rename.cc
      sql/sql_select.cc
      sql/sql_show.cc
      sql/sql_signal.cc
      sql/sql_table.cc
      sql/sql_trigger.cc
      sql/sql_truncate.cc
      sql/sql_update.cc
      sql/sql_view.cc
      sql/sys_vars.cc
      storage/innobase/CMakeLists.txt
 3092 Konstantin Osipov	2010-08-10
      Bug 52044, a review comment, with changes requested
      by the reviewer.
      Turn the wait-for graph visitor into an abstract class.
      Renames. Simplify the algorithm that chooses the deadlock
      victim.

    modified:
      sql/mdl.cc
      sql/mdl.h
      sql/sql_base.cc
      sql/table.cc
      sql/table.h
=== modified file '.bzr-mysql/default.conf'
--- a/.bzr-mysql/default.conf	2010-07-29 12:32:11 +0000
+++ b/.bzr-mysql/default.conf	2010-08-04 09:14:09 +0000
@@ -1,4 +1,4 @@
 [MYSQL]
 post_commit_to = "commits@stripped"
 post_push_to = "commits@stripped"
-tree_name = "mysql-trunk-runtime"
+tree_name = "mysql-5.5-bugfixing"

=== modified file '.bzrignore'
--- a/.bzrignore	2010-06-06 11:19:29 +0000
+++ b/.bzrignore	2010-07-30 15:29:17 +0000
@@ -3101,3 +3101,4 @@ libmysqld/merge_archives_mysqlserver.cma
 libmysqld/mysqlserver_depends.c
 libmysqld/examples/mysql_embedded
 sql/.empty
+mysys/thr_lock

=== modified file 'BUILD/Makefile.am'
--- a/BUILD/Makefile.am	2010-07-22 11:30:14 +0000
+++ b/BUILD/Makefile.am	2010-08-06 12:59:38 +0000
@@ -52,7 +52,6 @@ EXTRA_DIST =		FINISH.sh \
 			compile-pentium-icc-yassl \
 			compile-pentium-max \
 			compile-pentium-myodbc \
-			compile-pentium-mysqlfs-debug \
 			compile-pentium-pgcc \
 			compile-pentium-valgrind-max \
 			compile-pentium64 \

=== modified file 'BUILD/SETUP.sh'
--- a/BUILD/SETUP.sh	2010-07-24 13:31:48 +0000
+++ b/BUILD/SETUP.sh	2010-08-06 12:59:38 +0000
@@ -14,7 +14,6 @@ Usage: $0 [-h|-n] [configure-options]
   -h, --help              Show this help message.
   -n, --just-print        Don't actually run any commands; just print them.
   -c, --just-configure    Stop after running configure.
-  --with-debug=full       Build with full debug.
   --warning-mode=[old|pedantic|maintainer]
                           Influences the debug flags. Old is default.
   --prefix=path           Build with prefix 'path'.
@@ -30,8 +29,6 @@ parse_options()
     case "$1" in
     --prefix=*)
       prefix=`get_key_value "$1"`;;
-    --with-debug=full)
-      full_debug="=full";;
     --warning-mode=*)
       warning_mode=`get_key_value "$1"`;;
     -c | --just-configure)
@@ -60,7 +57,6 @@ fi
 prefix="/usr/local/mysql"
 just_print=
 just_configure=
-full_debug=
 warning_mode=
 maintainer_mode=
 
@@ -116,7 +112,6 @@ else
   cxx_warnings="$warnings -Wno-unused-parameter"
 # cxx_warnings="$cxx_warnings -Woverloaded-virtual -Wsign-promo"
   cxx_warnings="$cxx_warnings -Wctor-dtor-privacy -Wnon-virtual-dtor"
-# Added unless --with-debug=full
   debug_extra_cflags="-O0 -g3 -gdwarf-2"
 fi
 
@@ -141,11 +136,8 @@ base_cxxflags="-felide-constructors -fno
 # Be as fast as we can be without losing our ability to backtrace.
 fast_cflags="-O3 -fno-omit-frame-pointer"
 
-debug_configs="--with-debug$full_debug"
-if [ -z "$full_debug" ]
-then
-  debug_cflags="$debug_cflags $debug_extra_cflags"
-fi
+debug_configs="--with-debug"
+debug_cflags="$debug_cflags $debug_extra_cflags"
 
 #
 # Configuration options.

=== modified file 'BUILD/autorun.sh'
--- a/BUILD/autorun.sh	2010-07-22 11:30:14 +0000
+++ b/BUILD/autorun.sh	2010-07-30 21:29:54 +0000
@@ -21,24 +21,18 @@ done
 IFS="$save_ifs"
 
 rm -rf configure
-
-# Ensure that cmake and perl are available. Required for cmake based builds.
-cmake -P cmake/check_minimal_version.cmake >/dev/null 2>&1 || HAVE_CMAKE=no
-perl --version >/dev/null 2>&1 || HAVE_CMAKE=no
-
-# Whether to use the autotools configuration script or cmake.
-if test "$HAVE_CMAKE" = "no"
-then
-  aclocal || die "Can't execute aclocal"
-  autoheader || die "Can't execute autoheader"
-  # --force means overwrite ltmain.sh script if it already exists
-  $LIBTOOLIZE --automake --force --copy || die "Can't execute libtoolize"
-  # --add-missing instructs automake to install missing auxiliary files
-  # and --force to overwrite them if they already exist
-  automake --add-missing --force  --copy || die "Can't execute automake"
-  autoconf || die "Can't execute autoconf"
-else
-  path=`dirname $0`
-  cp $path/cmake_configure.sh $path/../configure
-  chmod +x $path/../configure
-fi
+aclocal || die "Can't execute aclocal" 
+autoheader || die "Can't execute autoheader"
+# --force means overwrite ltmain.sh script if it already exists 
+$LIBTOOLIZE --automake --force --copy || die "Can't execute libtoolize"
+  
+# --add-missing instructs automake to install missing auxiliary files
+# and --force to overwrite them if they already exist
+automake --add-missing --force  --copy || die "Can't execute automake"
+autoconf || die "Can't execute autoconf"
+# Do not use autotools generated configure directly. Instead, use a script
+# that will either call CMake or original configure shell script at build
+# time (CMake is preferred if installed).
+mv configure configure.am
+cp BUILD/cmake_configure.sh configure
+chmod a+x configure

=== modified file 'BUILD/build_mccge.sh'
--- a/BUILD/build_mccge.sh	2010-07-13 17:34:32 +0000
+++ b/BUILD/build_mccge.sh	2010-08-06 12:59:38 +0000
@@ -148,7 +148,6 @@ Usage: $0 [options]
   --extended-help         Show extended help message
   --without-debug         Build non-debug version
   --with-debug            Build debug version
-  --with-debug=full       Build with full debug.
   --configure-only        Stop after running configure.
   --use-autotools         Start by running autoconf, automake,.. tools
   --no-autotools          Start from configure
@@ -262,10 +261,6 @@ extended_usage()
     This flag prevents the use of GPL libraries which cannot be used
     under a commercial license, such as the readline library.
 
-  --with-debug[=full]
-    This option will ensure that the version is built with debug
-    information enabled; the optimisation level is decreased to -O.
-
   --developer
     This option changes a number of things to make the version built
     more appropriate to the debugging and testing needs of developers. 
@@ -658,11 +653,6 @@ parse_options()
     --datadir=*)
       datadir=`get_key_value "$1"`
       ;;
-    --with-debug=full)
-      full_debug="=full"
-      with_debug_flag="yes"
-      fast_flag="no"
-      ;;
     --without-debug)
       with_debug_flag="no"
       if test "x$fast_flag" != "xyes" ; then
@@ -1044,10 +1034,7 @@ set_warning_flags()
 # C++ warnings
       cxx_warnings="$warnings -Woverloaded-virtual -Wsign-promo -Wreorder"
       cxx_warnings="$warnings -Wctor-dtor-privacy -Wnon-virtual-dtor"
-# Added unless --with-debug=full
-      if test "x$full_debug" = "x" ; then
-        compiler_flags="$compiler_flags -Wuninitialized"
-      fi
+      compiler_flags="$compiler_flags -Wuninitialized"
     elif test "x$warning_mode" = "xpedantic" ; then
       warnings="-W -Wall -ansi -pedantic -Wno-long-long -D_POSIX_SOURCE"
       c_warnings="$warnings"
@@ -1113,7 +1100,7 @@ set_base_configs()
     base_configs="$base_configs --localstatedir=$datadir"
   fi
   if test "x$with_debug_flag" = "xyes" ; then
-    base_configs="$base_configs --with-debug$full_debug"
+    base_configs="$base_configs --with-debug"
   fi
   base_configs="$base_configs --enable-local-infile"
   base_configs="$base_configs --enable-thread-safe-client"
@@ -1546,7 +1533,6 @@ gpl="yes"
 version_text=
 developer_flag="no"
 just_configure=
-full_debug=
 warning_mode=
 with_flags=
 error_inject_flag=

=== modified file 'BUILD/check-cpu'
--- a/BUILD/check-cpu	2010-07-02 19:38:04 +0000
+++ b/BUILD/check-cpu	2010-08-05 12:32:23 +0000
@@ -7,6 +7,79 @@
 # check_cpu_args : Arguments for GCC compiler settings
 #
 
+check_compiler_cpu_flags () {
+  # different compiler versions have different option names
+  # for CPU specific command line options
+  if test -z "$CC" ; then
+    cc="gcc";
+  else
+    cc=$CC
+  fi
+
+  # check if compiler is gcc and dump its version
+  cc_verno=`$cc -dumpversion 2>/dev/null`
+  if test "x$?" = "x0" ; then
+    set -- `echo $cc_verno | tr '.' ' '`
+    cc_ver="GCC"
+    cc_major=$1
+    cc_minor=$2
+    cc_patch=$3
+    cc_comp=`expr $cc_major '*' 100 '+' $cc_minor`
+  fi
+
+  case "$cc_ver--$cc_verno" in
+    *GCC*)
+        # different gcc backends (and versions) have different CPU flags
+        case `gcc -dumpmachine` in
+          i?86-* | x86_64-*)
+	    if test "$cc_comp" -lt 304 ; then
+              check_cpu_cflags="-mcpu=${cpu_arg}"
+            elif test "$cc_comp" -ge 402 ; then
+              check_cpu_cflags="-mtune=native"
+            else
+              check_cpu_cflags="-mtune=${cpu_arg}"
+            fi
+            ;;
+          ppc-*)
+              check_cpu_cflags="-mcpu=${cpu_arg} -mtune=${cpu_arg}"
+            ;;
+          *)
+            check_cpu_cflags=""
+            return
+            ;;
+        esac
+      ;;
+    2.95.*)
+      # GCC 2.95 doesn't expose its name in --version output
+      check_cpu_cflags="-m${cpu_arg}"
+      ;;
+    *)
+      check_cpu_cflags=""
+      return
+      ;;
+  esac
+
+  # now we check whether the compiler really understands the cpu type
+  touch __test.c
+
+  while [ "$cpu_arg" ] ; do
+    printf "testing $cpu_arg ... " >&2
+
+    # compile check
+    eval "$cc -c $check_cpu_cflags __test.c" 2>/dev/null
+    if test "x$?" = "x0" ; then
+      echo ok >&2
+      break;
+    fi
+
+    echo failed >&2
+    check_cpu_cflags=""
+    break;
+  done
+  rm __test.*
+  return 0
+}
+
 check_cpu () {
   CPUINFO=/proc/cpuinfo
   if test -n "$TEST_CPUINFO" ; then
@@ -179,83 +252,14 @@ check_cpu () {
     return
   fi
 
-  # different compiler versions have different option names
-  # for CPU specific command line options
-  if test -z "$CC" ; then
-    cc="gcc";
-  else
-    cc=$CC
+  if test "x$compiler" = "x" ; then
+    check_compiler_cpu_flags
   fi
 
   if test "x$core2" = "xyes" ; then
     cpu_arg="core2"
   fi
 
-  if test "x$compiler" != "x" ; then
-    return 0
-  fi
-
-  # check if compiler is gcc and dump its version
-  cc_verno=`$cc -dumpversion 2>/dev/null`
-  if test "x$?" = "x0" ; then
-    set -- `echo $cc_verno | tr '.' ' '`
-    cc_ver="GCC"
-    cc_major=$1
-    cc_minor=$2
-    cc_patch=$3
-    cc_comp=`expr $cc_major '*' 100 '+' $cc_minor`
-  fi
-
-  case "$cc_ver--$cc_verno" in
-    *GCC*)
-        # different gcc backends (and versions) have different CPU flags
-        case `gcc -dumpmachine` in
-          i?86-* | x86_64-*)
-	    if test "$cc_comp" -lt 304 ; then
-              check_cpu_cflags="-mcpu=${cpu_arg}"
-            elif test "$cc_comp" -ge 402 ; then
-              check_cpu_cflags="-mtune=native"
-            else
-              check_cpu_cflags="-mtune=${cpu_arg}"
-            fi
-            ;;
-          ppc-*)
-              check_cpu_cflags="-mcpu=${cpu_arg} -mtune=${cpu_arg}"
-            ;;
-          *)
-            check_cpu_cflags=""
-            return
-            ;;
-        esac
-      ;;
-    2.95.*)
-      # GCC 2.95 doesn't expose its name in --version output
-      check_cpu_cflags="-m${cpu_arg}"
-      ;;
-    *)
-      check_cpu_cflags=""
-      return
-      ;;
-  esac
-
-  # now we check whether the compiler really understands the cpu type
-  touch __test.c
-
-  while [ "$cpu_arg" ] ; do
-    printf "testing $cpu_arg ... " >&2
-
-    # compile check
-    eval "$cc -c $check_cpu_cflags __test.c" 2>/dev/null
-    if test "x$?" = "x0" ; then
-      echo ok >&2
-      break;
-    fi
-
-    echo failed >&2
-    check_cpu_cflags=""
-    break;
-  done
-  rm __test.*
   return 0
 }
 

=== modified file 'BUILD/compile-ndb-autotest'
--- a/BUILD/compile-ndb-autotest	2006-08-02 07:08:21 +0000
+++ b/BUILD/compile-ndb-autotest	2010-08-06 12:59:38 +0000
@@ -4,16 +4,6 @@ path=`dirname $0`
 . "$path/SETUP.sh"
 
 extra_configs="$max_configs --with-ndb-test --with-ndb-ccflags='-DERROR_INSERT'"
-if [ "$full_debug" ]
-then
-    extra_flags="$debug_cflags"
-    c_warnings="$c_warnings $debug_extra_warnings"
-    cxx_warnings="$cxx_warnings $debug_extra_warnings"
-    extra_configs="$debug_configs $extra_configs"
-else
-    extra_flags="$fast_cflags"
-fi
-
-extra_flags="$extra_flags $max_cflags -g"
+extra_flags="$fast_cflags $max_cflags -g"
 
 . "$path/FINISH.sh"

=== modified file 'BUILD/compile-pentium-debug'
--- a/BUILD/compile-pentium-debug	2007-04-11 12:06:03 +0000
+++ b/BUILD/compile-pentium-debug	2010-08-06 12:59:38 +0000
@@ -1,7 +1,6 @@
 #! /bin/sh
 
 path=`dirname $0`
-set -- "$@" --with-debug=full
 . "$path/SETUP.sh"
 
 extra_flags="$pentium_cflags $debug_cflags"

=== modified file 'BUILD/compile-pentium-debug-max'
--- a/BUILD/compile-pentium-debug-max	2007-04-11 12:06:03 +0000
+++ b/BUILD/compile-pentium-debug-max	2010-08-06 12:59:38 +0000
@@ -1,7 +1,6 @@
 #! /bin/sh
 
 path=`dirname $0`
-set -- "$@" --with-debug=full
 . "$path/SETUP.sh"
 
 extra_flags="$pentium_cflags $debug_cflags"

=== modified file 'BUILD/compile-pentium-debug-max-no-ndb'
--- a/BUILD/compile-pentium-debug-max-no-ndb	2007-04-11 12:06:03 +0000
+++ b/BUILD/compile-pentium-debug-max-no-ndb	2010-08-06 12:59:38 +0000
@@ -1,7 +1,6 @@
 #! /bin/sh
 
 path=`dirname $0`
-set -- "$@" --with-debug=full
 . "$path/SETUP.sh"
 
 extra_flags="$pentium_cflags $debug_cflags"

=== modified file 'BUILD/compile-pentium-debug-openssl'
--- a/BUILD/compile-pentium-debug-openssl	2006-05-17 11:59:37 +0000
+++ b/BUILD/compile-pentium-debug-openssl	2010-08-06 12:59:38 +0000
@@ -6,6 +6,6 @@ path=`dirname $0`
 extra_flags="$pentium_cflags $debug_cflags"
 extra_configs="$pentium_configs $debug_configs"
 
-extra_configs="$extra_configs  --with-debug=full --with-ssl=/usr"
+extra_configs="$extra_configs  --with-debug --with-ssl=/usr"
 
 . "$path/FINISH.sh"

=== modified file 'BUILD/compile-pentium-debug-yassl'
--- a/BUILD/compile-pentium-debug-yassl	2006-05-17 11:59:37 +0000
+++ b/BUILD/compile-pentium-debug-yassl	2010-08-06 12:59:38 +0000
@@ -6,6 +6,6 @@ path=`dirname $0`
 extra_flags="$pentium_cflags $debug_cflags"
 extra_configs="$pentium_configs $debug_configs"
 
-extra_configs="$extra_configs  --with-debug=full --with-ssl"
+extra_configs="$extra_configs  --with-debug --with-ssl"
 
 . "$path/FINISH.sh"

=== removed file 'BUILD/compile-pentium-mysqlfs-debug'
--- a/BUILD/compile-pentium-mysqlfs-debug	2006-04-05 13:50:33 +0000
+++ b/BUILD/compile-pentium-mysqlfs-debug	1970-01-01 00:00:00 +0000
@@ -1,11 +0,0 @@
-#! /bin/sh
-
-path=`dirname $0`
-. "$path/SETUP.sh"
-
-extra_flags="$pentium_cflags $debug_cflags"
-extra_configs="$pentium_configs $debug_configs $static_link"
-
-extra_configs="$extra_configs --with-debug=full --with-mysqlfs --without-server --without-pstack"
-
-. "$path/FINISH.sh"

=== modified file 'BUILD/compile-pentium64-debug'
--- a/BUILD/compile-pentium64-debug	2007-04-11 12:06:03 +0000
+++ b/BUILD/compile-pentium64-debug	2010-08-06 12:59:38 +0000
@@ -1,7 +1,6 @@
 #! /bin/sh
 
 path=`dirname $0`
-set -- "$@" --with-debug=full
 . "$path/SETUP.sh"
 
 extra_flags="$pentium64_cflags $debug_cflags"

=== modified file 'BUILD/compile-pentium64-debug-max'
--- a/BUILD/compile-pentium64-debug-max	2007-04-11 12:06:03 +0000
+++ b/BUILD/compile-pentium64-debug-max	2010-08-06 12:59:38 +0000
@@ -1,7 +1,6 @@
 #! /bin/sh
 
 path=`dirname $0`
-set -- "$@" --with-debug=full
 . "$path/SETUP.sh"
 
 extra_flags="$pentium64_cflags $debug_cflags"

=== modified file 'CMakeLists.txt'
--- a/CMakeLists.txt	2010-07-21 14:22:29 +0000
+++ b/CMakeLists.txt	2010-08-09 13:23:55 +0000
@@ -34,7 +34,6 @@ ENDIF()
 SET(CUSTOM_C_FLAGS $ENV{CFLAGS})
 
 OPTION(WITH_DEBUG "Use dbug/safemutex" OFF)
-OPTION(WITH_DEBUG_FULL "Use dbug and safemutex. Slow." OFF)
 
 # Distinguish between community and non-community builds, with the
 # default being a community build. This does not impact the feature
@@ -46,7 +45,8 @@ OPTION(COMMUNITY_BUILD "Set to true if t
 SET(MANUFACTURER_DOCSTRING
   "Set the entity that appears as the manufacturer of packages that support a manufacturer field.")
 IF(NOT DEFINED MANUFACTURER) 
-  SET(MANUFACTURER "Built from Source" CACHE BOOL ${MANUFACTURER_DOCSTRING})
+  SET(MANUFACTURER "Built from Source" CACHE  STRING ${MANUFACTURER_DOCSTRING})
+  MARK_AS_ADVANCED(MANUFACTURER)
 ENDIF()
 
 # We choose to provide WITH_DEBUG as alias to standard CMAKE_BUILD_TYPE=Debug
@@ -59,7 +59,7 @@ SET(BUILDTYPE_DOCSTRING
  "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
  CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel")
  
-IF(WITH_DEBUG OR WITH_DEBUG_FULL)
+IF(WITH_DEBUG)
   SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING ${BUILDTYPE_DOCSTRING} FORCE)
   SET(OLD_WITH_DEBUG 1 CACHE INTERNAL "" FORCE)
 ELSEIF(NOT HAVE_CMAKE_BUILD_TYPE OR OLD_WITH_DEBUG)
@@ -161,13 +161,6 @@ IF(ENABLE_DEBUG_SYNC) 
   SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") 
 ENDIF() 
  
-OPTION(WITH_ERROR_INJECT 
-  "Enable error injection in MySQL Server (debug builds only)" OFF) 
-IF(WITH_ERROR_INJECT) 
-  SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DERROR_INJECT_SUPPORT") 
-  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DERROR_INJECT_SUPPORT") 
-ENDIF() 
-
 OPTION(ENABLED_LOCAL_INFILE
  "If we should should enable LOAD DATA LOCAL by default" ${IF_WIN})
 MARK_AS_ADVANCED(ENABLED_LOCAL_INFILE)
@@ -201,15 +194,10 @@ ENDIF()
 
 # Add safemutex for debug configurations, except on Windows
 # (safemutex has never worked on Windows)
-IF(WITH_DEBUG OR WITH_DEBUG_FULL AND NOT WIN32)
+IF(WITH_DEBUG AND NOT WIN32)
   FOREACH(LANG C CXX)
-    IF(WITH_DEBUG_FULL)
-      SET(CMAKE_${LANG}_FLAGS_DEBUG 
-        "${CMAKE_${LANG}_FLAGS_DEBUG} -DSAFE_MUTEX")
-    ELSE()
-      SET(CMAKE_${LANG}_FLAGS_DEBUG 
-        "${CMAKE_${LANG}_FLAGS_DEBUG} -DSAFE_MUTEX")
-    ENDIF()
+      SET(CMAKE_${LANG}_FLAGS_DEBUG
+          "${CMAKE_${LANG}_FLAGS_DEBUG} -DSAFE_MUTEX")
   ENDFOREACH()
 ENDIF()
 

=== modified file 'cmake/configure.pl'
--- a/cmake/configure.pl	2010-07-12 16:39:00 +0000
+++ b/cmake/configure.pl	2010-08-06 12:59:38 +0000
@@ -179,11 +179,6 @@ foreach my $option (@ARGV)
     $cmakeargs = $cmakeargs." -DMYSQL_DATADIR=".substr($option,14); 
     next;
   }
-  if ($option =~ /with-debug=full/)
-  {
-    $cmakeargs = $cmakeargs." -DWITH_DEBUG_FULL=1"; 
-    next;
-  }
   if ($option =~ /mysql-maintainer-mode/)
   {
     $cmakeargs = $cmakeargs." -DMYSQL_MAINTAINER_MODE=" .

=== modified file 'cmake/plugin.cmake'
--- a/cmake/plugin.cmake	2010-06-18 15:04:15 +0000
+++ b/cmake/plugin.cmake	2010-08-05 16:38:24 +0000
@@ -57,11 +57,17 @@ MACRO(MYSQL_ADD_PLUGIN)
     SET(WITHOUT_NDBCLUSTER 1)
   ENDIF()
 
+  IF(ARG_DEFAULT)
+    IF(NOT DEFINED WITH_${plugin} AND 
+       NOT DEFINED WITH_${plugin}_STORAGE_ENGINE)
+      SET(WITH_${plugin} 1)
+    ENDIF()
+  ENDIF()
+  
   IF(WITH_${plugin}_STORAGE_ENGINE 
     OR WITH_{$plugin}
     OR WITH_ALL 
     OR WITH_MAX 
-    OR ARG_DEFAULT 
     AND NOT WITHOUT_${plugin}_STORAGE_ENGINE
     AND NOT WITHOUT_${plugin}
     AND NOT ARG_MODULE_ONLY)
@@ -88,6 +94,7 @@ MACRO(MYSQL_ADD_PLUGIN)
   IF(NOT ARG_DEPENDENCIES)
     SET(ARG_DEPENDENCIES)
   ENDIF()
+  SET(BUILD_PLUGIN 1)
   # Build either static library or module
   IF (WITH_${plugin} AND NOT ARG_MODULE_ONLY)
     ADD_LIBRARY(${target} STATIC ${SOURCES})
@@ -148,9 +155,6 @@ MACRO(MYSQL_ADD_PLUGIN)
     DTRACE_INSTRUMENT(${target})
     SET_TARGET_PROPERTIES (${target} PROPERTIES PREFIX ""
       COMPILE_DEFINITIONS "MYSQL_DYNAMIC_PLUGIN")
-    IF(ARG_LINK_LIBRARIES)
-      TARGET_LINK_LIBRARIES (${target} ${ARG_LINK_LIBRARIES})
-    ENDIF()
     TARGET_LINK_LIBRARIES (${target} mysqlservices)
 
     # Plugin uses symbols defined in mysqld executable.
@@ -165,17 +169,30 @@ MACRO(MYSQL_ADD_PLUGIN)
     ENDIF()
     ADD_DEPENDENCIES(${target} GenError ${ARG_DEPENDENCIES})
 
-	IF(NOT ARG_MODULE_ONLY)
+     IF(NOT ARG_MODULE_ONLY)
       # set cached variable, e.g with checkbox in GUI
       SET(${with_var} OFF CACHE BOOL "Link ${plugin} statically to the server" 
        FORCE)
-	ENDIF()
+     ENDIF()
     SET_TARGET_PROPERTIES(${target} PROPERTIES 
       OUTPUT_NAME "${ARG_MODULE_OUTPUT_NAME}")  
     # Install dynamic library
     MYSQL_INSTALL_TARGETS(${target} DESTINATION ${INSTALL_PLUGINDIR} COMPONENT Server)
     INSTALL_DEBUG_TARGET(${target} DESTINATION ${INSTALL_PLUGINDIR}/debug)
+  ELSE()
+    IF(WITHOUT_${plugin})
+      # Update cache variable
+      STRING(REPLACE "WITH_" "WITHOUT_" without_var ${with_var})
+      SET(${without_var} ON CACHE BOOL "Don't build ${plugin}" 
+       FORCE)
+    ENDIF()
+    SET(BUILD_PLUGIN 0)
   ENDIF()
+
+  IF(BUILD_PLUGIN AND ARG_LINK_LIBRARIES)
+    TARGET_LINK_LIBRARIES (${target} ${ARG_LINK_LIBRARIES})
+  ENDIF()
+
 ENDMACRO()
 
 

=== modified file 'config/ac-macros/ha_ndbcluster.m4'
--- a/config/ac-macros/ha_ndbcluster.m4	2009-03-13 11:13:55 +0000
+++ b/config/ac-macros/ha_ndbcluster.m4	2010-08-06 12:59:38 +0000
@@ -206,7 +206,7 @@ AC_DEFUN([MYSQL_SETUP_NDBCLUSTER], [
     NDB_DEFS="-DNDB_DEBUG_FULL -DVM_TRACE -DERROR_INSERT -DARRAY_GUARD"
   else
     # no extra ndb debug but still do asserts if debug version
-    if test "$with_debug" = "yes" -o "$with_debug" = "full"
+    if test "$with_debug" = "yes"
     then
       NDB_DEFS=""
     else

=== modified file 'configure.in'
--- a/configure.in	2010-07-29 12:32:11 +0000
+++ b/configure.in	2010-08-09 13:23:55 +0000
@@ -1732,22 +1732,14 @@ then
 fi
 
 AC_ARG_WITH(debug,
-    [  --with-debug            Add debug code
-  --with-debug=full       Add debug code (adds memory checker, very slow)],
+    [AS_HELP_STRING([--with-debug], [Add debug code @<:@default=no@:>@])],
     [with_debug=$withval],
     [with_debug=no])
 if test "$with_debug" = "yes"
 then
-  # Medium debug.
   AC_DEFINE([DBUG_ON], [1], [Use libdbug])
   CFLAGS="$DEBUG_CFLAGS $DEBUG_OPTIMIZE_CC -DSAFE_MUTEX $CFLAGS"
   CXXFLAGS="$DEBUG_CXXFLAGS $DEBUG_OPTIMIZE_CXX -DSAFE_MUTEX $CXXFLAGS"
-elif test "$with_debug" = "full"
-then
-  # Full debug. Very slow in some cases
-  AC_DEFINE([DBUG_ON], [1], [Use libdbug])
-  CFLAGS="$DEBUG_CFLAGS -DSAFE_MUTEX $CFLAGS"
-  CXXFLAGS="$DEBUG_CXXFLAGS -DSAFE_MUTEX $CXXFLAGS"
 else
   # Optimized version. No debug
   AC_DEFINE([DBUG_OFF], [1], [Don't use libdbug])
@@ -1783,21 +1775,6 @@ else
   AC_MSG_RESULT([no])
 fi
 
-# If we should allow error injection tests
-AC_ARG_WITH(error-inject,
-    AC_HELP_STRING([--with-error-inject],[Enable error injection in MySQL Server]),
-    [ with_error_inject=$withval ],
-    [ with_error_inject=no ])
-
-if test $with_debug != "no"
-then
-  if test "$with_error_inject" = "yes"
-  then
-    AC_DEFINE([ERROR_INJECT_SUPPORT], [1],
-              [Enable error injection in MySQL Server])
-  fi
-fi
-
 AC_ARG_WITH([fast-mutexes],
 	    AC_HELP_STRING([--with-fast-mutexes], 
 	    [Compile with fast mutexes (default is disabled)]),

=== modified file 'mysql-test/r/func_group.result'
--- a/mysql-test/r/func_group.result	2010-04-11 06:52:42 +0000
+++ b/mysql-test/r/func_group.result	2010-08-02 12:36:41 +0000
@@ -1714,3 +1714,14 @@ NULL	NULL	NULL	NULL	NULL
 drop table t1;
 #
 End of 5.1 tests
+#
+# Bug#55648: Server crash on MIX/MAX on maximum time value
+#
+CREATE TABLE t1(c1 TIME NOT NULL);
+INSERT INTO t1 VALUES('837:59:59');
+INSERT INTO t1 VALUES('838:59:59');
+SELECT MAX(c1) FROM t1;
+MAX(c1)
+838:59:59
+DROP TABLE t1;
+# End of the bug#55648

=== modified file 'mysql-test/r/signal.result'
--- a/mysql-test/r/signal.result	2010-02-23 18:43:26 +0000
+++ b/mysql-test/r/signal.result	2010-07-30 15:28:36 +0000
@@ -1189,6 +1189,8 @@ end $$
 call test_signal() $$
 Caught by SQLSTATE
 Caught by SQLSTATE
+Warnings:
+Warning	1012	Raising a warning
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1204,6 +1206,8 @@ end $$
 call test_signal() $$
 Caught by number
 Caught by number
+Warnings:
+Warning	1012	Raising a warning
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1219,6 +1223,8 @@ end $$
 call test_signal() $$
 Caught by SQLWARNING
 Caught by SQLWARNING
+Warnings:
+Warning	1012	Raising a warning
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1234,6 +1240,8 @@ end $$
 call test_signal() $$
 Caught by SQLSTATE
 Caught by SQLSTATE
+Warnings:
+Error	1012	Raising a not found
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1249,6 +1257,8 @@ end $$
 call test_signal() $$
 Caught by number
 Caught by number
+Warnings:
+Error	1012	Raising a not found
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1264,6 +1274,8 @@ end $$
 call test_signal() $$
 Caught by NOT FOUND
 Caught by NOT FOUND
+Warnings:
+Error	1012	Raising a not found
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1279,6 +1291,8 @@ end $$
 call test_signal() $$
 Caught by SQLSTATE
 Caught by SQLSTATE
+Warnings:
+Error	1012	Raising an error
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1294,6 +1308,8 @@ end $$
 call test_signal() $$
 Caught by number
 Caught by number
+Warnings:
+Error	1012	Raising an error
 drop procedure test_signal $$
 create procedure test_signal()
 begin
@@ -1309,6 +1325,8 @@ end $$
 call test_signal() $$
 Caught by SQLEXCEPTION
 Caught by SQLEXCEPTION
+Warnings:
+Error	1012	Raising an error
 drop procedure test_signal $$
 #
 # Test where SIGNAL can be used
@@ -1455,6 +1473,7 @@ after RESIGNAL
 after RESIGNAL
 Warnings:
 Warning	1012	Raising a warning
+Warning	1012	Raising a warning
 drop procedure test_resignal $$
 create procedure test_resignal()
 begin
@@ -1509,6 +1528,7 @@ after RESIGNAL
 after RESIGNAL
 Warnings:
 Warning	1264	Out of range value for column 'a' at row 1
+Warning	1264	Out of range value for column 'a' at row 1
 drop procedure test_resignal $$
 create procedure test_resignal()
 begin
@@ -1565,6 +1585,7 @@ before RESIGNAL
 after RESIGNAL
 after RESIGNAL
 Warnings:
+Warning	1012	Raising a warning
 Warning	5555	RESIGNAL of a warning
 drop procedure test_resignal $$
 create procedure test_resignal()
@@ -1625,6 +1646,7 @@ before RESIGNAL
 after RESIGNAL
 after RESIGNAL
 Warnings:
+Warning	1264	Out of range value for column 'a' at row 1
 Warning	5555	RESIGNAL of a warning
 drop procedure test_resignal $$
 create procedure test_resignal()
@@ -2126,6 +2148,9 @@ CALL peter_p2() $$
 ERROR 42000: Hi, I am a useless error message
 show warnings $$
 Level	Code	Message
+Error	1231	Variable 'sql_mode' can't be set to the value of 'NULL'
+Error	1231	Variable 'sql_mode' can't be set to the value of 'NULL'
+Error	9999	Variable 'sql_mode' can't be set to the value of 'NULL'
 Error	9999	Hi, I am a useless error message
 drop procedure peter_p1 $$
 drop procedure peter_p2 $$
@@ -2135,15 +2160,17 @@ DECLARE x CONDITION FOR SQLSTATE '42000'
 DECLARE EXIT HANDLER FOR x
 BEGIN
 SELECT '2';
+SHOW WARNINGS;
 RESIGNAL x SET MYSQL_ERRNO = 9999;
 END;
 BEGIN
 DECLARE EXIT HANDLER FOR x
 BEGIN
 SELECT '1';
+SHOW WARNINGS;
 RESIGNAL x SET
 SCHEMA_NAME = 'test',
-MYSQL_ERRNO= 1231;
+MYSQL_ERRNO= 1232;
 END;
 /* Raises ER_WRONG_VALUE_FOR_VAR : 1231, SQLSTATE 42000 */
 SET @@sql_mode=NULL;
@@ -2156,6 +2183,7 @@ DECLARE x CONDITION for SQLSTATE '42000'
 DECLARE EXIT HANDLER FOR x
 BEGIN
 SELECT '3';
+SHOW WARNINGS;
 RESIGNAL x SET
 MESSAGE_TEXT = 'Hi, I am a useless error message',
 MYSQL_ERRNO = 9999;
@@ -2166,15 +2194,24 @@ $$
 CALL peter_p2() $$
 1
 1
+Level	Code	Message
+Error	1231	Variable 'sql_mode' can't be set to the value of 'NULL'
 2
 2
+Level	Code	Message
+Error	1231	Variable 'sql_mode' can't be set to the value of 'NULL'
+Error	1232	Variable 'sql_mode' can't be set to the value of 'NULL'
 3
 3
+Level	Code	Message
+Error	1231	Variable 'sql_mode' can't be set to the value of 'NULL'
+Error	1232	Variable 'sql_mode' can't be set to the value of 'NULL'
+Error	9999	Variable 'sql_mode' can't be set to the value of 'NULL'
 ERROR 42000: Hi, I am a useless error message
 show warnings $$
 Level	Code	Message
 Error	1231	Variable 'sql_mode' can't be set to the value of 'NULL'
-Error	1231	Variable 'sql_mode' can't be set to the value of 'NULL'
+Error	1232	Variable 'sql_mode' can't be set to the value of 'NULL'
 Error	9999	Variable 'sql_mode' can't be set to the value of 'NULL'
 Error	9999	Hi, I am a useless error message
 drop procedure peter_p1 $$

=== modified file 'mysql-test/r/signal_demo3.result'
--- a/mysql-test/r/signal_demo3.result	2009-10-14 11:36:55 +0000
+++ b/mysql-test/r/signal_demo3.result	2010-07-30 15:28:36 +0000
@@ -95,11 +95,11 @@ call proc_1();
 ERROR 45000: Oops in proc_1
 show warnings;
 Level	Code	Message
-Error	1644	Oops in proc_5
-Error	1644	Oops in proc_4
-Error	1644	Oops in proc_3
-Error	1644	Oops in proc_2
-Error	1644	Oops in proc_1
+Error	1051	Unknown table 'oops_it_is_not_here'
+Error	1644	Oops in proc_9
+Error	1644	Oops in proc_8
+Error	1644	Oops in proc_7
+Error	1644	Oops in proc_6
 SET @@session.max_error_count = 7;
 SELECT @@session.max_error_count;
 @@session.max_error_count
@@ -108,13 +108,13 @@ call proc_1();
 ERROR 45000: Oops in proc_1
 show warnings;
 Level	Code	Message
+Error	1051	Unknown table 'oops_it_is_not_here'
+Error	1644	Oops in proc_9
+Error	1644	Oops in proc_8
 Error	1644	Oops in proc_7
 Error	1644	Oops in proc_6
 Error	1644	Oops in proc_5
 Error	1644	Oops in proc_4
-Error	1644	Oops in proc_3
-Error	1644	Oops in proc_2
-Error	1644	Oops in proc_1
 SET @@session.max_error_count = 9;
 SELECT @@session.max_error_count;
 @@session.max_error_count
@@ -123,6 +123,7 @@ call proc_1();
 ERROR 45000: Oops in proc_1
 show warnings;
 Level	Code	Message
+Error	1051	Unknown table 'oops_it_is_not_here'
 Error	1644	Oops in proc_9
 Error	1644	Oops in proc_8
 Error	1644	Oops in proc_7
@@ -131,7 +132,6 @@ Error	1644	Oops in proc_5
 Error	1644	Oops in proc_4
 Error	1644	Oops in proc_3
 Error	1644	Oops in proc_2
-Error	1644	Oops in proc_1
 drop database demo;
 SET @@global.max_error_count = @start_global_value;
 SELECT @@global.max_error_count;

=== modified file 'mysql-test/r/sp-big.result'
--- a/mysql-test/r/sp-big.result	2005-12-07 14:01:17 +0000
+++ b/mysql-test/r/sp-big.result	2010-07-30 15:28:36 +0000
@@ -46,6 +46,8 @@ end while;
 close cur1;
 end|
 call p1();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select count(*) from t1;
 count(*)
 256

=== modified file 'mysql-test/r/sp-bugs.result'
--- a/mysql-test/r/sp-bugs.result	2010-02-13 10:35:14 +0000
+++ b/mysql-test/r/sp-bugs.result	2010-07-30 15:28:36 +0000
@@ -43,6 +43,8 @@ END|
 SELECT f2 ();
 f2 ()
 NULL
+Warnings:
+Error	1305	FUNCTION testdb.f_not_exists does not exist
 DROP SCHEMA testdb;
 USE test;
 #

=== modified file 'mysql-test/r/sp-code.result'
--- a/mysql-test/r/sp-code.result	2009-12-01 19:07:18 +0000
+++ b/mysql-test/r/sp-code.result	2010-07-30 15:28:36 +0000
@@ -711,6 +711,8 @@ looping	i
 looping	1
 looping	i
 looping	0
+Warnings:
+Error	1062	Duplicate entry '1' for key 'a'
 call proc_26977_works(2);
 do something
 do something
@@ -730,6 +732,8 @@ looping	i
 looping	0
 optimizer: keep hreturn
 optimizer: keep hreturn
+Warnings:
+Error	1062	Duplicate entry '2' for key 'a'
 drop table t1;
 drop procedure proc_26977_broken;
 drop procedure proc_26977_works;
@@ -888,3 +892,56 @@ Pos	Instruction
 4	jump 6
 5	error 1339
 DROP PROCEDURE p1;
+#
+# Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
+#
+
+# - Case 4: check that "No Data trumps Warning".
+
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES (1), (2), (3);
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE c CURSOR FOR SELECT a FROM t1;
+OPEN c;
+BEGIN
+DECLARE v INT;
+DECLARE CONTINUE HANDLER FOR SQLWARNING
+BEGIN
+SELECT "Warning found!";
+SHOW WARNINGS;
+END;
+DECLARE EXIT HANDLER FOR NOT FOUND
+BEGIN
+SELECT "End of Result Set found!";
+SHOW WARNINGS;
+END;
+WHILE TRUE DO
+FETCH c INTO v;
+END WHILE;
+END;
+CLOSE c;
+SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack
+END|
+SET SESSION debug="+d,bug23032_emit_warning";
+CALL p1();
+Warning found!
+Warning found!
+Level	Code	Message
+Warning	1105	Unknown error
+Warning found!
+Warning found!
+Level	Code	Message
+Warning	1105	Unknown error
+Warning found!
+Warning found!
+Level	Code	Message
+Warning	1105	Unknown error
+End of Result Set found!
+End of Result Set found!
+Level	Code	Message
+Warning	1105	Unknown error
+Error	1329	No data - zero rows fetched, selected, or processed
+SET SESSION debug="-d,bug23032_emit_warning";
+DROP PROCEDURE p1;
+DROP TABLE t1;

=== modified file 'mysql-test/r/sp-error.result'
--- a/mysql-test/r/sp-error.result	2010-02-24 13:52:27 +0000
+++ b/mysql-test/r/sp-error.result	2010-07-30 15:28:36 +0000
@@ -1344,6 +1344,8 @@ set @in_func := 0;
 select func_20713_a();
 func_20713_a()
 NULL
+Warnings:
+Error	1146	Table 'test.bogus_table_20713' doesn't exist
 select @in_func;
 @in_func
 2
@@ -1351,6 +1353,8 @@ set @in_func := 0;
 select func_20713_b();
 func_20713_b()
 NULL
+Warnings:
+Error	1146	Table 'test.bogus_table_20713' doesn't exist
 select @in_func;
 @in_func
 2
@@ -1714,3 +1718,246 @@ DROP PROCEDURE p1;
 DROP VIEW v1;
 DROP TABLE t1;
 End of 5.1 tests
+#
+# Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
+#
+
+# - Case 1
+
+DROP PROCEDURE IF EXISTS p1;
+DROP PROCEDURE IF EXISTS p2;
+DROP PROCEDURE IF EXISTS p3;
+DROP PROCEDURE IF EXISTS p4;
+DROP PROCEDURE IF EXISTS p5;
+DROP PROCEDURE IF EXISTS p6;
+CREATE PROCEDURE p1()
+BEGIN
+SELECT CAST('10 ' as unsigned integer);
+SELECT 1;
+CALL p2();
+END|
+CREATE PROCEDURE p2()
+BEGIN
+SELECT CAST('10 ' as unsigned integer);
+END|
+CALL p1();
+CAST('10 ' as unsigned integer)
+10
+1
+1
+CAST('10 ' as unsigned integer)
+10
+Warnings:
+Warning	1292	Truncated incorrect INTEGER value: '10 '
+DROP PROCEDURE p1;
+DROP PROCEDURE p2;
+
+# - Case 2
+
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE c INT DEFAULT 0;
+DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1;
+CALL p2();
+CALL p3();
+CALL p4();
+SELECT c;
+SELECT @@warning_count;
+SHOW WARNINGS;
+END|
+CREATE PROCEDURE p2()
+BEGIN
+SELECT CAST('10 ' as unsigned integer);
+END|
+CREATE PROCEDURE p3()
+BEGIN
+SELECT CAST('10 ' as unsigned integer);
+SELECT 1;
+END|
+CREATE PROCEDURE p4()
+BEGIN
+SELECT CAST('10 ' as unsigned integer);
+CALL p2();
+END|
+CREATE PROCEDURE p5()
+BEGIN
+SELECT CAST('10 ' as unsigned integer);
+SHOW WARNINGS;
+END|
+CREATE PROCEDURE P6()
+BEGIN
+DECLARE c INT DEFAULT 0;
+DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1;
+CALL p5();
+SELECT c;
+END|
+CALL p1();
+CAST('10 ' as unsigned integer)
+10
+CAST('10 ' as unsigned integer)
+10
+1
+1
+CAST('10 ' as unsigned integer)
+10
+CAST('10 ' as unsigned integer)
+10
+c
+3
+@@warning_count
+1
+Level	Code	Message
+Warning	1292	Truncated incorrect INTEGER value: '10 '
+Warnings:
+Warning	1292	Truncated incorrect INTEGER value: '10 '
+CALL p6();
+CAST('10 ' as unsigned integer)
+10
+Level	Code	Message
+Warning	1292	Truncated incorrect INTEGER value: '10 '
+c
+1
+Warnings:
+Warning	1292	Truncated incorrect INTEGER value: '10 '
+DROP PROCEDURE p1;
+DROP PROCEDURE p2;
+DROP PROCEDURE p3;
+DROP PROCEDURE p4;
+DROP PROCEDURE p5;
+DROP PROCEDURE p6;
+
+# - Case 3: check that "Exception trumps No Data".
+
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES (1), (2), (3);
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE c CURSOR FOR SELECT a FROM t1;
+OPEN c;
+BEGIN
+DECLARE v1 INT;
+DECLARE v2 INT;
+DECLARE EXIT HANDLER FOR SQLEXCEPTION
+SELECT "Error caught (expected)";
+DECLARE EXIT HANDLER FOR NOT FOUND
+SELECT "End of Result Set found!";
+WHILE TRUE DO
+FETCH c INTO v1, v2;
+END WHILE;
+END;
+CLOSE c;
+SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack
+END|
+CALL p1();
+Error caught (expected)
+Error caught (expected)
+DROP PROCEDURE p1;
+DROP TABLE t1;
+#
+# Bug#36185: Incorrect precedence for warning and exception handlers
+#
+DROP TABLE IF EXISTS t1;
+DROP PROCEDURE IF EXISTS p1;
+CREATE TABLE t1 (a INT, b INT NOT NULL);
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'warning';
+DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'exception';
+INSERT INTO t1 VALUES (CAST('10 ' AS SIGNED), NULL);
+END|
+CALL p1();
+exception
+exception
+Warnings:
+Warning	1292	Truncated incorrect INTEGER value: '10 '
+Error	1048	Column 'b' cannot be null
+DROP TABLE t1;
+DROP PROCEDURE p1;
+#
+# Bug#5889: Exit handler for a warning doesn't hide the warning in trigger
+#
+
+# - Case 1
+
+CREATE TABLE t1(a INT, b INT);
+INSERT INTO t1 VALUES (1, 2);
+CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW
+BEGIN
+DECLARE EXIT HANDLER FOR SQLWARNING
+SET NEW.a = 10;
+SET NEW.a = 99999999999;
+END|
+UPDATE t1 SET b = 20;
+Warnings:
+Warning	1264	Out of range value for column 'a' at row 1
+SHOW WARNINGS;
+Level	Code	Message
+Warning	1264	Out of range value for column 'a' at row 1
+SELECT * FROM t1;
+a	b
+10	20
+DROP TRIGGER t1_bu;
+DROP TABLE t1;
+
+# - Case 2
+
+CREATE TABLE t1(a INT);
+CREATE TABLE t2(b CHAR(1));
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+BEGIN
+INSERT INTO t2 VALUES('ab'); # Produces a warning.
+INSERT INTO t2 VALUES('b');  # Does not produce a warning,
+# previous warning should be cleared.
+END|
+INSERT INTO t1 VALUES(0);
+SHOW WARNINGS;
+Level	Code	Message
+SELECT * FROM t1;
+a
+0
+SELECT * FROM t2;
+b
+a
+b
+DROP TRIGGER t1_bi;
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Bug#9857: Stored procedures: handler for sqlwarning ignored
+#
+SET @sql_mode_saved = @@sql_mode;
+SET sql_mode = traditional;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE CONTINUE HANDLER FOR SQLWARNING
+SELECT 'warning caught (expected)';
+SELECT 5 / 0;
+END|
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
+SELECT 'error caught (unexpected)';
+SELECT 5 / 0;
+END|
+CALL p1();
+5 / 0
+NULL
+warning caught (expected)
+warning caught (expected)
+Warnings:
+Warning	1365	Division by 0
+SHOW WARNINGS;
+Level	Code	Message
+Warning	1365	Division by 0
+CALL p2();
+5 / 0
+NULL
+Warnings:
+Warning	1365	Division by 0
+SHOW WARNINGS;
+Level	Code	Message
+Warning	1365	Division by 0
+DROP PROCEDURE p1;
+DROP PROCEDURE p2;
+SET sql_mode = @sql_mode_saved;

=== modified file 'mysql-test/r/sp.result'
--- a/mysql-test/r/sp.result	2010-05-14 05:28:51 +0000
+++ b/mysql-test/r/sp.result	2010-07-30 15:28:36 +0000
@@ -737,6 +737,8 @@ close c;
 end|
 insert into t2 values ("foo", 42, -1.9), ("bar", 3, 12.1), ("zap", 666, -3.14)|
 call cur1()|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select * from t1|
 id	data
 foo	40
@@ -772,6 +774,8 @@ close c1;
 close c2;
 end|
 call cur2()|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select * from t3 order by i,s|
 s	i
 bar	3
@@ -861,6 +865,8 @@ end$
 set @@sql_mode = ''|
 set sql_select_limit = 1|
 call modes(@c1, @c2)|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 set sql_select_limit = default|
 select @c1, @c2|
 @c1	@c2
@@ -1682,42 +1688,64 @@ end|
 call h_ee()|
 h_ee
 Inner (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_es()|
 h_es
 Outer (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_en()|
 h_en
 Outer (good)
+Warnings:
+Warning	1329	No data - zero rows fetched, selected, or processed
 call h_ew()|
 h_ew
 Outer (good)
 call h_ex()|
 h_ex
 Outer (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_se()|
 h_se
 Inner (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_ss()|
 h_ss
 Inner (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_sn()|
 h_sn
 Outer (good)
+Warnings:
+Warning	1329	No data - zero rows fetched, selected, or processed
 call h_sw()|
 h_sw
 Outer (good)
 call h_sx()|
 h_sx
 Outer (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_ne()|
 h_ne
 Inner (good)
+Warnings:
+Warning	1329	No data - zero rows fetched, selected, or processed
 call h_ns()|
 h_ns
 Inner (good)
+Warnings:
+Warning	1329	No data - zero rows fetched, selected, or processed
 call h_nn()|
 h_nn
 Inner (good)
+Warnings:
+Warning	1329	No data - zero rows fetched, selected, or processed
 call h_we()|
 h_we
 Inner (good)
@@ -1730,12 +1758,18 @@ Inner (good)
 call h_xe()|
 h_xe
 Inner (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_xs()|
 h_xs
 Inner (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 call h_xx()|
 h_xx
 Inner (good)
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 drop table t3|
 drop procedure h_ee|
 drop procedure h_es|
@@ -1884,6 +1918,8 @@ set @x2 = 2;
 close c1;
 end|
 call bug2260()|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select @x2|
 @x2
 2
@@ -2027,6 +2063,8 @@ insert into t3 values (123456789012);
 insert into t3 values (0);
 end|
 call bug2780()|
+Warnings:
+Warning	1264	Out of range value for column 's1' at row 1
 select @x|
 @x
 1
@@ -2449,6 +2487,8 @@ declare continue handler for sqlstate 'H
 select s1 from t3 union select s2 from t3; 
 end|
 call bug4904()|
+Warnings:
+Error	1267	Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin2_general_ci,IMPLICIT) for operation 'UNION'
 drop procedure bug4904|
 drop table t3|
 drop procedure if exists bug336|
@@ -2588,13 +2628,17 @@ select row_count()|
 row_count()
 1
 call bug4905()|
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 select row_count()|
 row_count()
-0
+-1
 call bug4905()|
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 select row_count()|
 row_count()
-0
+-1
 select * from t3|
 s1
 1
@@ -2615,10 +2659,14 @@ insert into t3 values (1)|
 call bug6029()|
 sqlstate 23000
 sqlstate 23000
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 delete from t3|
 call bug6029()|
 1136
 1136
+Warnings:
+Error	1136	Column count doesn't match value count at row 1
 drop procedure bug6029|
 drop table t3|
 drop procedure if exists bug8540|
@@ -2910,15 +2958,23 @@ end|
 call bug6900()|
 2
 2
+Warnings:
+Error	1136	Column count doesn't match value count at row 1
 call bug9074()|
 x1	x2	x3	x4	x5	x6
 1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 call bug6900_9074(0)|
 sqlexception
 sqlexception
+Warnings:
+Error	1136	Column count doesn't match value count at row 1
 call bug6900_9074(1)|
 23000
 23000
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 drop procedure bug6900|
 drop procedure bug9074|
 drop procedure bug6900_9074|
@@ -2961,9 +3017,13 @@ delete from t1|
 call bug9856()|
 16
 16
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 call bug9856()|
 16
 16
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 drop procedure bug9856|
 drop procedure if exists bug9674_1|
 drop procedure if exists bug9674_2|
@@ -3194,6 +3254,8 @@ x
 2
 x
 3
+Warnings:
+Error	1326	Cursor is not open
 call bug10961()|
 x
 1
@@ -3201,6 +3263,8 @@ x
 2
 x
 3
+Warnings:
+Error	1326	Cursor is not open
 drop procedure bug10961|
 DROP PROCEDURE IF EXISTS bug6866|
 DROP VIEW IF EXISTS tv|
@@ -3316,7 +3380,11 @@ insert into t1 values
 ('Name4', 13),
 ('Name5', 14)|
 call bug11529()|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 call bug11529()|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 delete from t1|
 drop procedure bug11529|
 set character set utf8|
@@ -3490,24 +3558,32 @@ end;
 end if;
 end|
 call bug12168('a')|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select * from t4|
 a
 1
 3
 truncate t4|
 call bug12168('b')|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select * from t4|
 a
 2
 4
 truncate t4|
 call bug12168('a')|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select * from t4|
 a
 1
 3
 truncate t4|
 call bug12168('b')|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select * from t4|
 a
 2
@@ -3807,6 +3883,8 @@ end|
 call bug7049_2()|
 Result
 Caught it
+Warnings:
+Error	1062	Duplicate entry '42' for key 'x'
 select * from t3|
 x
 42
@@ -3814,12 +3892,16 @@ delete from t3|
 call bug7049_4()|
 Result
 Caught it
+Warnings:
+Error	1062	Duplicate entry '42' for key 'x'
 select * from t3|
 x
 42
 select bug7049_2()|
 bug7049_2()
 1
+Warnings:
+Error	1062	Duplicate entry '42' for key 'x'
 drop table t3|
 drop procedure bug7049_1|
 drop procedure bug7049_2|
@@ -3947,6 +4029,8 @@ end|
 call bug14845()|
 a
 0
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 drop procedure bug14845|
 drop procedure if exists bug13549_1|
 drop procedure if exists bug13549_2|
@@ -4150,6 +4234,8 @@ end|
 call bug13729()|
 55
 55
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 select * from t3|
 s1
 1
@@ -4186,11 +4272,15 @@ Handler
 boo
 v	isnull(v)
 NULL	1
+Warnings:
+Error	1054	Unknown column 'undefined_var' in 'field list'
 call bug14643_2()|
 Handler
 boo
 Handler
 boo
+Warnings:
+Error	1054	Unknown column 'undefined_var' in 'field list'
 drop procedure bug14643_1|
 drop procedure bug14643_2|
 drop procedure if exists bug14304|
@@ -4514,11 +4604,15 @@ Handler
 error
 End
 done
+Warnings:
+Error	1054	Unknown column 'v' in 'field list'
 call bug14498_2()|
 Handler
 error
 End
 done
+Warnings:
+Error	1054	Unknown column 'v' in 'field list'
 call bug14498_3()|
 v
 maybe
@@ -4526,16 +4620,22 @@ Handler
 error
 End
 done
+Warnings:
+Error	1054	Unknown column 'v' in 'field list'
 call bug14498_4()|
 Handler
 error
 End
 done
+Warnings:
+Error	1054	Unknown column 'v' in 'field list'
 call bug14498_5()|
 Handler
 error
 End
 done
+Warnings:
+Error	1054	Unknown column 'v' in 'field list'
 drop procedure bug14498_1|
 drop procedure bug14498_2|
 drop procedure bug14498_3|
@@ -4546,6 +4646,8 @@ drop procedure if exists bug15231_1|
 drop procedure if exists bug15231_2|
 drop procedure if exists bug15231_3|
 drop procedure if exists bug15231_4|
+drop procedure if exists bug15231_5|
+drop procedure if exists bug15231_6|
 create table t3 (id int not null)|
 create procedure bug15231_1()
 begin
@@ -4568,7 +4670,7 @@ end|
 create procedure bug15231_3()
 begin
 declare exit handler for sqlwarning
-select 'Caught it (wrong)' as 'Result';
+select 'Caught it (correct)' as 'Result';
 call bug15231_4();
 end|
 create procedure bug15231_4()
@@ -4576,6 +4678,20 @@ begin
 declare x decimal(2,1);
 set x = 'zap';
 select 'Missed it (correct)' as 'Result';
+show warnings;
+end|
+create procedure bug15231_5()
+begin
+declare exit handler for sqlwarning
+select 'Caught it (wrong)' as 'Result';
+call bug15231_6();
+end|
+create procedure bug15231_6()
+begin
+declare x decimal(2,1);
+set x = 'zap';
+select 'Missed it (correct)' as 'Result';
+select id from t3;
 end|
 call bug15231_1()|
 1
@@ -4583,19 +4699,29 @@ Before NOT FOUND condition is triggered
 2
 After NOT FOUND condtition is triggered
 xid	xdone
-1	0
+1	1
 Warnings:
 Warning	1329	No data - zero rows fetched, selected, or processed
 call bug15231_3()|
 Result
 Missed it (correct)
+Level	Code	Message
+Warning	1366	Incorrect decimal value: 'zap' for column 'x' at row 1
+Result
+Caught it (correct)
 Warnings:
 Warning	1366	Incorrect decimal value: 'zap' for column 'x' at row 1
-drop table if exists t3|
-drop procedure if exists bug15231_1|
-drop procedure if exists bug15231_2|
-drop procedure if exists bug15231_3|
-drop procedure if exists bug15231_4|
+call bug15231_5()|
+Result
+Missed it (correct)
+id
+drop table t3|
+drop procedure bug15231_1|
+drop procedure bug15231_2|
+drop procedure bug15231_3|
+drop procedure bug15231_4|
+drop procedure bug15231_5|
+drop procedure bug15231_6|
 drop procedure if exists bug15011|
 create table t3 (c1 int primary key)|
 insert into t3 values (1)|
@@ -4613,6 +4739,8 @@ end|
 call bug15011()|
 Handler
 Inner
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 drop procedure bug15011|
 drop table t3|
 drop procedure if exists bug17476|
@@ -4688,6 +4816,8 @@ i
 1
 i
 0
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 drop table t3|
 drop procedure bug16887|
 drop procedure if exists bug16474_1|
@@ -4760,6 +4890,8 @@ declare continue handler for sqlexceptio
 select no_such_function();
 end|
 call bug18787()|
+Warnings:
+Error	1305	FUNCTION test.no_such_function does not exist
 drop procedure bug18787|
 create database bug18344_012345678901|
 use bug18344_012345678901|
@@ -5133,6 +5265,8 @@ statement failed
 statement failed
 statement after update
 statement after update
+Warnings:
+Error	1242	Subquery returns more than 1 row
 select * from t3|
 a
 1
@@ -5144,6 +5278,8 @@ statement failed
 statement failed
 statement after update
 statement after update
+Warnings:
+Error	1242	Subquery returns more than 1 row
 select * from t3|
 a
 1
@@ -5176,6 +5312,8 @@ in continue handler
 in continue handler
 reachable code a2
 reachable code a2
+Warnings:
+Error	1242	Subquery returns more than 1 row
 select * from t3|
 a
 1
@@ -5191,6 +5329,8 @@ in continue handler
 in continue handler
 reachable code a2
 reachable code a2
+Warnings:
+Error	1242	Subquery returns more than 1 row
 select * from t3|
 a
 1
@@ -5224,6 +5364,8 @@ in continue handler
 in continue handler
 reachable code a2
 reachable code a2
+Warnings:
+Error	1305	FUNCTION test.no_such_function does not exist
 drop procedure bug8153_proc_a|
 drop procedure bug8153_proc_b|
 drop table t3|
@@ -5792,9 +5934,13 @@ end|
 select func_8407_a()|
 func_8407_a()
 NULL
+Warnings:
+Error	1146	Table 'test.no_such_view' doesn't exist
 select func_8407_b()|
 func_8407_b()
 1500
+Warnings:
+Error	1146	Table 'test.no_such_view' doesn't exist
 drop function func_8407_a|
 drop function func_8407_b|
 drop table if exists table_26503|
@@ -5916,6 +6062,8 @@ looping	i
 looping	0
 leaving handler
 leaving handler
+Warnings:
+Error	1062	Duplicate entry '1' for key 'a'
 call proc_26503_ok_2(2)|
 do something
 do something
@@ -5927,6 +6075,8 @@ looping	i
 looping	4
 leaving handler
 leaving handler
+Warnings:
+Error	1062	Duplicate entry '2' for key 'a'
 call proc_26503_ok_3(3)|
 do something
 do something
@@ -5946,6 +6096,8 @@ looping	i
 looping	0
 leaving handler
 leaving handler
+Warnings:
+Error	1062	Duplicate entry '3' for key 'a'
 call proc_26503_ok_4(4)|
 do something
 do something
@@ -5957,6 +6109,8 @@ looping	i
 looping	4
 leaving handler
 leaving handler
+Warnings:
+Error	1062	Duplicate entry '4' for key 'a'
 drop table table_26503|
 drop procedure proc_26503_ok_1|
 drop procedure proc_26503_ok_2|
@@ -6670,6 +6824,8 @@ DECLARE CONTINUE HANDLER FOR SQLEXCEPTIO
 SELECT x FROM t1;
 END|
 CALL bug29770();
+Warnings:
+Error	1054	Unknown column 'x' in 'field list'
 SELECT @state, @exception;
 @state	@exception
 run	NULL
@@ -6708,6 +6864,8 @@ end;
 end while;
 end//
 call proc_33618(20);
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 drop table t_33618;
 drop procedure proc_33618;
 #

=== modified file 'mysql-test/r/sp_trans.result'
--- a/mysql-test/r/sp_trans.result	2010-02-24 13:52:27 +0000
+++ b/mysql-test/r/sp_trans.result	2010-07-30 15:28:36 +0000
@@ -99,6 +99,8 @@ return i;
 end|
 set @error_in_func:= 0|
 insert into t1 values (bug10015_6(5)), (bug10015_6(6))|
+Warnings:
+Error	1062	Duplicate entry '1' for key 'PRIMARY'
 select @error_in_func|
 @error_in_func
 1
@@ -524,6 +526,8 @@ until done end repeat;
 close c;
 end|
 call bug14210()|
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 select count(*) from t4|
 count(*)
 256

=== modified file 'mysql-test/r/strict.result'
--- a/mysql-test/r/strict.result	2010-04-11 06:52:42 +0000
+++ b/mysql-test/r/strict.result	2010-07-30 15:28:36 +0000
@@ -1190,6 +1190,8 @@ select'a'; insert into t1 values (200); 
 call t1();
 a
 a
+Warnings:
+Error	1264	Out of range value for column 'col1' at row 1
 select * from t1;
 col1
 drop procedure t1;

=== modified file 'mysql-test/r/view.result'
--- a/mysql-test/r/view.result	2010-07-27 10:25:53 +0000
+++ b/mysql-test/r/view.result	2010-07-30 15:28:36 +0000
@@ -3946,6 +3946,8 @@ create view a as select 1;
 end|
 call p();
 call p();
+Warnings:
+Error	1050	Table 'a' already exists
 drop view a;
 drop procedure p;
 #

=== modified file 'mysql-test/suite/federated/federated_server.result'
--- a/mysql-test/suite/federated/federated_server.result	2009-10-02 09:12:10 +0000
+++ b/mysql-test/suite/federated/federated_server.result	2010-07-31 13:10:27 +0000
@@ -54,7 +54,7 @@ PASSWORD '',
 PORT SLAVE_PORT,
 SOCKET '',
 OWNER 'root');
-select * from mysql.servers;
+select * from mysql.servers order by Server_name;
 Server_name	Host	Db	Username	Password	Port	Socket	Wrapper	Owner
 server_one	127.0.0.1	first_db	root		SLAVE_PORT		mysql	root
 server_two	127.0.0.1	second_db	root		SLAVE_PORT		mysql	root
@@ -154,7 +154,7 @@ id	name
 drop table federated.t1;
 drop server 'server_one';
 drop server 'server_two';
-select * from mysql.servers;
+select * from mysql.servers order by Server_name;
 Server_name	Host	Db	Username	Password	Port	Socket	Wrapper	Owner
 drop table first_db.t1;
 drop table second_db.t1;
@@ -254,6 +254,8 @@ password '', socket '', owner '', port 3
 drop server 's1';
 # End of 5.1 tests
 use test;
+create table t1(a int);
+insert into t1 values (1);
 create procedure p1 ()
 begin
 DECLARE v INT DEFAULT 0;
@@ -268,11 +270,13 @@ ALTER SERVER s OPTIONS (USER 'Remote');
 DROP SERVER s;
 SET v = v + 1;
 END WHILE;
+select a into @a from t1; # Just reset warnings
 END//
 use test;
 call p1();
 call p1();
 drop procedure p1;
+drop table t1;
 drop server if exists s;
 DROP TABLE IF EXISTS federated.t1;
 DROP DATABASE federated;

=== modified file 'mysql-test/suite/federated/federated_server.test'
--- a/mysql-test/suite/federated/federated_server.test	2009-01-22 13:07:58 +0000
+++ b/mysql-test/suite/federated/federated_server.test	2010-07-31 13:10:27 +0000
@@ -62,7 +62,7 @@ eval create server 'server_two' foreign 
   OWNER 'root');
 
 --replace_result $SLAVE_MYPORT SLAVE_PORT
-eval select * from mysql.servers;
+eval select * from mysql.servers order by Server_name;
 
 DROP TABLE IF EXISTS federated.old;
 --replace_result $SLAVE_MYPORT SLAVE_PORT
@@ -147,7 +147,7 @@ drop table federated.t1;
 
 drop server 'server_one';
 drop server 'server_two';
-select * from mysql.servers;
+select * from mysql.servers order by Server_name;
 
 connection slave;
 drop table first_db.t1;
@@ -301,6 +301,8 @@ drop server 's1';
 connect (other,localhost,root,,);
 connection master;
 use test;
+create table t1(a int);
+insert into t1 values (1);
 delimiter //;
 create procedure p1 ()
 begin
@@ -316,6 +318,7 @@ begin
 	DROP SERVER s;
     SET v = v + 1;
   END WHILE;
+  select a into @a from t1; # Just reset warnings
 END//
 delimiter ;//
 connection other;
@@ -326,6 +329,7 @@ call p1();
 connection other;
 reap;
 drop procedure p1;
+drop table t1;
 drop server if exists s;
 
 

=== modified file 'mysql-test/suite/funcs_1/r/innodb_storedproc_02.result'
--- a/mysql-test/suite/funcs_1/r/innodb_storedproc_02.result	2009-09-11 07:15:41 +0000
+++ b/mysql-test/suite/funcs_1/r/innodb_storedproc_02.result	2010-07-30 15:28:36 +0000
@@ -347,6 +347,8 @@ CALL h1();
 -7-	1	1	1	1	1	1
 END	x1	x2	x3	x4	x5	x6
 END	1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 DROP TABLE IF EXISTS tnull;
 DROP PROCEDURE IF EXISTS sp1;
 CREATE TABLE tnull(f1 int);
@@ -445,6 +447,8 @@ END//
 CALL h2();
 x1	x2	x3	x4	x5	x6
 1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 SELECT * FROM res_t1;
 w	x
 a	b
@@ -550,6 +554,8 @@ exit handler 2
 exit handler 2
 exit handler 1
 exit handler 1
+Warnings:
+Error	1146	Table 'db_storedproc.tqq' doesn't exist
 create table res_t1(w char unique, x char);
 insert into res_t1 values ('a', 'b');
 CREATE PROCEDURE h1 ()
@@ -580,6 +586,8 @@ END//
 CALL h1();
 x1	x2	x3	x4	x5	x6
 1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 This will fail, SQLSTATE 00000 is not allowed
 CREATE PROCEDURE sp1()
 begin1_label:BEGIN
@@ -623,6 +631,8 @@ CALL sp2();
 NULL
 @x2	@x
 1	2
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE sp1;
 DROP PROCEDURE sp2;
 
@@ -654,6 +664,8 @@ ERROR 42000: Incorrect number of argumen
 CALL sp2();
 -1-	@x2	@x
 -1-	0	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 SELECT '-3-', @x2, @x;
 -3-	@x2	@x
 -3-	1	1
@@ -696,6 +708,8 @@ CALL sp2();
 -2-	1	20
 -4-	@x2	@x
 -4-	11	22
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE sp1;
 DROP PROCEDURE sp2;
 
@@ -762,21 +776,33 @@ SELECT @done, @x;
 0	1
 INSERT INTO temp VALUES('1', NULL);
 CALL sp1();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	1
 INSERT INTO temp VALUES('2', NULL);
 CALL sp2();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	1
 INSERT INTO temp VALUES('3', NULL);
 CALL sp3();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	0
 INSERT INTO temp VALUES('4', NULL);
 CALL sp4();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	0
@@ -885,18 +911,26 @@ SELECT @done, @x;
 @done	@x
 0	1
 CALL sp1();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	2
 CALL sp2();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	2
 CALL sp3();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	1
 CALL sp4();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	1
@@ -1031,6 +1065,8 @@ SQLSTATE
 21000
 SQLSTATE
 24000
+Warnings:
+Error	1326	Cursor is not open
 SELECT '-1-', @x;
 -1-	@x
 -1-	6
@@ -1041,18 +1077,24 @@ SQLSTATE
 SQLEXCEPTION
 SQLSTATE
 24000
+Warnings:
+Error	1326	Cursor is not open
 SELECT '-2-', @x;
 -2-	@x
 -2-	6
 CALL sp3();
 SQLSTATE
 20000
+Warnings:
+Error	1339	Case not found for CASE statement
 SELECT '-3-', @x;
 -3-	@x
 -3-	1
 CALL sp4();
 SQLSTATE
 SQLEXCEPTION
+Warnings:
+Error	1339	Case not found for CASE statement
 SELECT '-4-', @x;
 -4-	@x
 -4-	1
@@ -1335,6 +1377,8 @@ CLOSE cur1;
 CLOSE cur2;
 END//
 CALL sp_outer();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT * FROM temp1;
 f0	cnt	f1	f2	f3	f4
 _sp_out_	1	a`	a`	1000-01-01	-5000

=== modified file 'mysql-test/suite/funcs_1/r/memory_storedproc_02.result'
--- a/mysql-test/suite/funcs_1/r/memory_storedproc_02.result	2009-09-11 07:15:41 +0000
+++ b/mysql-test/suite/funcs_1/r/memory_storedproc_02.result	2010-07-30 15:28:36 +0000
@@ -348,6 +348,8 @@ CALL h1();
 -7-	1	1	1	1	1	1
 END	x1	x2	x3	x4	x5	x6
 END	1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 DROP TABLE IF EXISTS tnull;
 DROP PROCEDURE IF EXISTS sp1;
 CREATE TABLE tnull(f1 int);
@@ -446,6 +448,8 @@ END//
 CALL h2();
 x1	x2	x3	x4	x5	x6
 1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 SELECT * FROM res_t1;
 w	x
 a	b
@@ -551,6 +555,8 @@ exit handler 2
 exit handler 2
 exit handler 1
 exit handler 1
+Warnings:
+Error	1146	Table 'db_storedproc.tqq' doesn't exist
 create table res_t1(w char unique, x char);
 insert into res_t1 values ('a', 'b');
 CREATE PROCEDURE h1 ()
@@ -581,6 +587,8 @@ END//
 CALL h1();
 x1	x2	x3	x4	x5	x6
 1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 This will fail, SQLSTATE 00000 is not allowed
 CREATE PROCEDURE sp1()
 begin1_label:BEGIN
@@ -624,6 +632,8 @@ CALL sp2();
 NULL
 @x2	@x
 1	2
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE sp1;
 DROP PROCEDURE sp2;
 
@@ -655,6 +665,8 @@ ERROR 42000: Incorrect number of argumen
 CALL sp2();
 -1-	@x2	@x
 -1-	0	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 SELECT '-3-', @x2, @x;
 -3-	@x2	@x
 -3-	1	1
@@ -697,6 +709,8 @@ CALL sp2();
 -2-	1	20
 -4-	@x2	@x
 -4-	11	22
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE sp1;
 DROP PROCEDURE sp2;
 
@@ -763,21 +777,33 @@ SELECT @done, @x;
 0	1
 INSERT INTO temp VALUES('1', NULL);
 CALL sp1();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	1
 INSERT INTO temp VALUES('2', NULL);
 CALL sp2();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	1
 INSERT INTO temp VALUES('3', NULL);
 CALL sp3();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	0
 INSERT INTO temp VALUES('4', NULL);
 CALL sp4();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	0
@@ -886,18 +912,26 @@ SELECT @done, @x;
 @done	@x
 0	1
 CALL sp1();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	2
 CALL sp2();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	2
 CALL sp3();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	1
 CALL sp4();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	1
@@ -1032,6 +1066,8 @@ SQLSTATE
 21000
 SQLSTATE
 24000
+Warnings:
+Error	1326	Cursor is not open
 SELECT '-1-', @x;
 -1-	@x
 -1-	6
@@ -1042,18 +1078,24 @@ SQLSTATE
 SQLEXCEPTION
 SQLSTATE
 24000
+Warnings:
+Error	1326	Cursor is not open
 SELECT '-2-', @x;
 -2-	@x
 -2-	6
 CALL sp3();
 SQLSTATE
 20000
+Warnings:
+Error	1339	Case not found for CASE statement
 SELECT '-3-', @x;
 -3-	@x
 -3-	1
 CALL sp4();
 SQLSTATE
 SQLEXCEPTION
+Warnings:
+Error	1339	Case not found for CASE statement
 SELECT '-4-', @x;
 -4-	@x
 -4-	1
@@ -1336,6 +1378,8 @@ CLOSE cur1;
 CLOSE cur2;
 END//
 CALL sp_outer();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT * FROM temp1;
 f0	cnt	f1	f2	f3	f4
 _sp_out_	1	a`	a`	1000-01-01	-5000

=== modified file 'mysql-test/suite/funcs_1/r/myisam_storedproc_02.result'
--- a/mysql-test/suite/funcs_1/r/myisam_storedproc_02.result	2009-09-11 07:15:41 +0000
+++ b/mysql-test/suite/funcs_1/r/myisam_storedproc_02.result	2010-07-30 15:28:36 +0000
@@ -348,6 +348,8 @@ CALL h1();
 -7-	1	1	1	1	1	1
 END	x1	x2	x3	x4	x5	x6
 END	1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 DROP TABLE IF EXISTS tnull;
 DROP PROCEDURE IF EXISTS sp1;
 CREATE TABLE tnull(f1 int);
@@ -446,6 +448,8 @@ END//
 CALL h2();
 x1	x2	x3	x4	x5	x6
 1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 SELECT * FROM res_t1;
 w	x
 a	b
@@ -551,6 +555,8 @@ exit handler 2
 exit handler 2
 exit handler 1
 exit handler 1
+Warnings:
+Error	1146	Table 'db_storedproc.tqq' doesn't exist
 create table res_t1(w char unique, x char);
 insert into res_t1 values ('a', 'b');
 CREATE PROCEDURE h1 ()
@@ -581,6 +587,8 @@ END//
 CALL h1();
 x1	x2	x3	x4	x5	x6
 1	1	1	1	1	1
+Warnings:
+Error	1062	Duplicate entry 'a' for key 'w'
 This will fail, SQLSTATE 00000 is not allowed
 CREATE PROCEDURE sp1()
 begin1_label:BEGIN
@@ -624,6 +632,8 @@ CALL sp2();
 NULL
 @x2	@x
 1	2
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE sp1;
 DROP PROCEDURE sp2;
 
@@ -655,6 +665,8 @@ ERROR 42000: Incorrect number of argumen
 CALL sp2();
 -1-	@x2	@x
 -1-	0	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 SELECT '-3-', @x2, @x;
 -3-	@x2	@x
 -3-	1	1
@@ -697,6 +709,8 @@ CALL sp2();
 -2-	1	20
 -4-	@x2	@x
 -4-	11	22
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE sp1;
 DROP PROCEDURE sp2;
 
@@ -763,21 +777,33 @@ SELECT @done, @x;
 0	1
 INSERT INTO temp VALUES('1', NULL);
 CALL sp1();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	1
 INSERT INTO temp VALUES('2', NULL);
 CALL sp2();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	1
 INSERT INTO temp VALUES('3', NULL);
 CALL sp3();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	0
 INSERT INTO temp VALUES('4', NULL);
 CALL sp4();
+Warnings:
+Warning	1265	Data truncated for column 'f1' at row 1
+Warning	1265	Data truncated for column 'f2' at row 1
 SELECT @done, @x;
 @done	@x
 1	0
@@ -886,18 +912,26 @@ SELECT @done, @x;
 @done	@x
 0	1
 CALL sp1();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	2
 CALL sp2();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	2
 CALL sp3();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	1
 CALL sp4();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT @done, @x;
 @done	@x
 1	1
@@ -1032,6 +1066,8 @@ SQLSTATE
 21000
 SQLSTATE
 24000
+Warnings:
+Error	1326	Cursor is not open
 SELECT '-1-', @x;
 -1-	@x
 -1-	6
@@ -1042,18 +1078,24 @@ SQLSTATE
 SQLEXCEPTION
 SQLSTATE
 24000
+Warnings:
+Error	1326	Cursor is not open
 SELECT '-2-', @x;
 -2-	@x
 -2-	6
 CALL sp3();
 SQLSTATE
 20000
+Warnings:
+Error	1339	Case not found for CASE statement
 SELECT '-3-', @x;
 -3-	@x
 -3-	1
 CALL sp4();
 SQLSTATE
 SQLEXCEPTION
+Warnings:
+Error	1339	Case not found for CASE statement
 SELECT '-4-', @x;
 -4-	@x
 -4-	1
@@ -1336,6 +1378,8 @@ CLOSE cur1;
 CLOSE cur2;
 END//
 CALL sp_outer();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT * FROM temp1;
 f0	cnt	f1	f2	f3	f4
 _sp_out_	1	a`	a`	1000-01-01	-5000

=== modified file 'mysql-test/suite/funcs_1/r/storedproc.result'
--- a/mysql-test/suite/funcs_1/r/storedproc.result	2010-03-20 18:34:51 +0000
+++ b/mysql-test/suite/funcs_1/r/storedproc.result	2010-07-30 15:28:36 +0000
@@ -9325,6 +9325,8 @@ insert into t2 values (1);
 set @x = 3;
 END//
 CALL sp1();
+Warnings:
+Error	1136	Column count doesn't match value count at row 1
 DROP PROCEDURE sp1;
 DROP PROCEDURE IF EXISTS sp1;
 Warnings:
@@ -13754,6 +13756,8 @@ END//
 CALL sp1();
 x	y	@x
 NULL	a	3
+Warnings:
+Error	1305	PROCEDURE db_storedproc.nonsexist does not exist
 SELECT @v1, @v2;
 @v1	@v2
 4	a
@@ -14938,6 +14942,8 @@ NULL	NULL
 NULL	NULL
 @x	@y
 NULL	NULL
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DROP PROCEDURE sp1;
 
 Testcase 4.2.63:
@@ -15097,6 +15103,8 @@ END;
 fetch cur1 into newf1, newf2, newf4, newf3;
 END//
 CALL sp1();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DROP PROCEDURE sp1;
 
 Testcase 4.2.70:
@@ -22447,6 +22455,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE h1;
 DROP PROCEDURE sp1;
 
@@ -22464,6 +22474,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1305	PROCEDURE db_storedproc.sp1 does not exist
 DROP PROCEDURE h1;
 
 Testcase 4.11.3:
@@ -22483,6 +22495,8 @@ CALL sp1 (1);
 set @x=0;
 END//
 CALL h1();
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 SELECT @x, @x2;
 @x	@x2
 1	1
@@ -22501,6 +22515,8 @@ CALL sp1 (1);
 set @x=0;
 END//
 CALL h1 ();
+Warnings:
+Error	1305	PROCEDURE db_storedproc.sp1 does not exist
 SELECT @x, @x2;
 @x	@x2
 1	1
@@ -22525,6 +22541,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE h1;
 DROP PROCEDURE sp1;
 
@@ -22547,6 +22565,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE h1;
 DROP PROCEDURE sp1;
 
@@ -22569,6 +22589,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE h1;
 DROP PROCEDURE sp1;
 
@@ -22586,6 +22608,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1305	PROCEDURE db_storedproc.sp1 does not exist
 DROP PROCEDURE h1;
 
 Testcase 4.11.9:
@@ -22605,6 +22629,8 @@ CALL sp1 (1);
 set @x=0;
 END//
 CALL h1();
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 SELECT @x, @x2;
 @x	@x2
 1	1
@@ -22623,6 +22649,8 @@ CALL sp1 (1);
 set @x=0;
 END//
 CALL h1 ();
+Warnings:
+Error	1305	PROCEDURE db_storedproc.sp1 does not exist
 SELECT @x, @x2;
 @x	@x2
 1	1
@@ -22647,6 +22675,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE h1;
 DROP PROCEDURE sp1;
 
@@ -22669,6 +22699,8 @@ END//
 CALL h1 ();
 @x	@x2
 1	1
+Warnings:
+Error	1318	Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
 DROP PROCEDURE h1;
 DROP PROCEDURE sp1;
 
@@ -22704,6 +22736,8 @@ done
 1
 done
 1
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22777,6 +22811,8 @@ done
 0
 done
 1
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22814,6 +22850,8 @@ done
 0
 done
 1
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22844,6 +22882,8 @@ done
 0
 done
 1
+Warnings:
+Error	1328	Incorrect number of FETCH variables
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22874,6 +22914,8 @@ done
 0
 done
 1
+Warnings:
+Error	1328	Incorrect number of FETCH variables
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22904,6 +22946,8 @@ END//
 CALL h1();
 done
 0
+Warnings:
+Error	1328	Incorrect number of FETCH variables
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22934,6 +22978,8 @@ END//
 CALL h1();
 done
 0
+Warnings:
+Error	1328	Incorrect number of FETCH variables
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22964,6 +23010,8 @@ done
 0
 done
 1
+Warnings:
+Error	1325	Cursor is already open
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -22995,6 +23043,8 @@ done
 0
 done	@x
 1	1
+Warnings:
+Error	1325	Cursor is already open
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -23025,6 +23075,8 @@ END//
 CALL h1();
 done
 0
+Warnings:
+Error	1325	Cursor is already open
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -23055,6 +23107,8 @@ END//
 CALL h1();
 done
 0
+Warnings:
+Error	1325	Cursor is already open
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -23082,6 +23136,8 @@ END//
 CALL h1();
 done	@x
 1	1
+Warnings:
+Error	1326	Cursor is not open
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -23109,6 +23165,8 @@ END//
 CALL h1();
 done	@x
 1	1
+Warnings:
+Error	1326	Cursor is not open
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -23134,6 +23192,8 @@ set @x=1;
 SELECT done, @x;
 END//
 CALL h1();
+Warnings:
+Error	1326	Cursor is not open
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -23159,6 +23219,8 @@ set @x=1;
 SELECT done, @x;
 END//
 CALL h1();
+Warnings:
+Error	1326	Cursor is not open
 DROP PROCEDURE IF EXISTS h1;
 drop table IF EXISTS res_t1;
 drop table IF EXISTS res_t2;
@@ -23189,6 +23251,8 @@ END//
 CALL h1();
 done	@x
 1	1
+Warnings:
+Error	1339	Case not found for CASE statement
 DROP PROCEDURE IF EXISTS h1;
 drop table IF EXISTS res_t1;
 drop table IF EXISTS res_t2;
@@ -23219,6 +23283,8 @@ END//
 CALL h1();
 done	@x
 1	1
+Warnings:
+Error	1339	Case not found for CASE statement
 DROP PROCEDURE IF EXISTS h1;
 drop table IF EXISTS res_t1;
 drop table IF EXISTS res_t2;
@@ -23247,6 +23313,8 @@ set @x=1;
 SELECT done, @x;
 END//
 CALL h1();
+Warnings:
+Error	1339	Case not found for CASE statement
 DROP PROCEDURE IF EXISTS h1;
 drop table IF EXISTS res_t1;
 drop table IF EXISTS res_t2;
@@ -23275,6 +23343,8 @@ set @x=1;
 SELECT done, @x;
 END//
 CALL h1();
+Warnings:
+Error	1339	Case not found for CASE statement
 DROP PROCEDURE IF EXISTS h1;
 DROP TABLE IF EXISTS res_t1;
 DROP TABLE IF EXISTS res_t2;
@@ -23423,6 +23493,9 @@ CREATE TABLE res_t1(w CHAR, x CHAR);
 INSERT INTO res_t1 VALUES('a', 'b');
 INSERT INTO res_t1 VALUES('c', 'd');
 CALL h1();
+Warnings:
+Warning	1265	Data truncated for column 'w' at row 1
+Warning	1265	Data truncated for column 'x' at row 1
 SELECT @done, @x;
 @done	@x
 1	1
@@ -23445,6 +23518,9 @@ CREATE TABLE res_t1(w CHAR, x CHAR);
 INSERT INTO res_t1 VALUES('a', 'b');
 INSERT INTO res_t1 VALUES('c', 'd');
 CALL h1();
+Warnings:
+Warning	1265	Data truncated for column 'w' at row 1
+Warning	1265	Data truncated for column 'x' at row 1
 SELECT @done, @x;
 @done	@x
 1	1

=== modified file 'mysql-test/suite/rpl/r/rpl_row_sp005.result'
--- a/mysql-test/suite/rpl/r/rpl_row_sp005.result	2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_sp005.result	2010-07-30 15:28:36 +0000
@@ -77,6 +77,8 @@ id2
 < ---- Master selects-- >
 -------------------------
 CALL test.p1();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 SELECT * FROM test.t3 ORDER BY id3;
 id3	c
 1	MySQL

=== modified file 'mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result'
--- a/mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result	2009-12-01 19:07:18 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result	2010-07-30 15:28:36 +0000
@@ -38,6 +38,8 @@ INSERT INTO t1 VALUES ('MySQL','1993-02-
 END|
 CALL p2();
 CALL p1();
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DROP TABLE t1;
 DROP TABLE t2;
 DROP PROCEDURE p1;

=== modified file 'mysql-test/suite/rpl/r/rpl_row_trig003.result'
--- a/mysql-test/suite/rpl/r/rpl_row_trig003.result	2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_trig003.result	2010-07-30 15:28:36 +0000
@@ -69,9 +69,15 @@ INSERT INTO test.t2 VALUES(NULL,0,'Testi
 UPDATE test.t1 SET b1 = 0 WHERE b1 = 1;
 INSERT INTO test.t2 VALUES(NULL,1,'This is an after update test.', 'If this works, total will not be zero on the master or slave',1.4321,5.221,0,YEAR(NOW()),NOW());
 UPDATE test.t2 SET b1 = 0 WHERE b1 = 1;
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 INSERT INTO test.t1 VALUES(NULL,1,'add some more test data test.', 'and hope for the best', 3.321,5.221,0,YEAR(NOW()),NOW());
 DELETE FROM test.t1 WHERE id = 1;
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DELETE FROM test.t2 WHERE id = 1;
+Warnings:
+Error	1329	No data - zero rows fetched, selected, or processed
 DROP TRIGGER test.t1_bi;
 DROP TRIGGER test.t2_ai;
 DROP TRIGGER test.t1_bu;

=== modified file 'mysql-test/t/disabled.def'
--- a/mysql-test/t/disabled.def	2010-06-30 09:27:38 +0000
+++ b/mysql-test/t/disabled.def	2010-08-09 18:33:47 +0000
@@ -17,3 +17,4 @@ plugin_load              : Bug#42144 200
 partition_innodb_plugin  : Bug#53307 2010-04-30 VasilDimov valgrind warnings
 query_cache_28249        : Bug#43861 2009-03-25 main.query_cache_28249 fails sporadically
 sp_sync                  : Bug#48157 2010-02-06 5.5-m3 demands a differnt solution
+ctype_utf8mb4_ndb	: Bug#55799, Bug#51907, disabled by Konstantin 2010-08-06

=== modified file 'mysql-test/t/func_group.test'
--- a/mysql-test/t/func_group.test	2009-11-24 15:26:13 +0000
+++ b/mysql-test/t/func_group.test	2010-08-02 12:36:41 +0000
@@ -1085,3 +1085,13 @@ drop table t1;
 --echo #
 --echo End of 5.1 tests
 
+--echo #
+--echo # Bug#55648: Server crash on MIX/MAX on maximum time value
+--echo #
+CREATE TABLE t1(c1 TIME NOT NULL);
+INSERT INTO t1 VALUES('837:59:59');
+INSERT INTO t1 VALUES('838:59:59');
+SELECT MAX(c1) FROM t1;
+DROP TABLE t1;
+--echo # End of the bug#55648
+

=== modified file 'mysql-test/t/signal.test'
--- a/mysql-test/t/signal.test	2009-09-10 09:18:29 +0000
+++ b/mysql-test/t/signal.test	2010-07-30 15:28:36 +0000
@@ -2408,6 +2408,7 @@ BEGIN
   DECLARE EXIT HANDLER FOR x
   BEGIN
     SELECT '2';
+    SHOW WARNINGS;
     RESIGNAL x SET MYSQL_ERRNO = 9999;
   END;
 
@@ -2415,9 +2416,10 @@ BEGIN
     DECLARE EXIT HANDLER FOR x
     BEGIN
       SELECT '1';
+      SHOW WARNINGS;
       RESIGNAL x SET
         SCHEMA_NAME = 'test',
-        MYSQL_ERRNO= 1231;
+        MYSQL_ERRNO= 1232;
     END;
     /* Raises ER_WRONG_VALUE_FOR_VAR : 1231, SQLSTATE 42000 */
     SET @@sql_mode=NULL;
@@ -2431,6 +2433,7 @@ BEGIN
   DECLARE EXIT HANDLER FOR x
   BEGIN
     SELECT '3';
+    SHOW WARNINGS;
     RESIGNAL x SET
       MESSAGE_TEXT = 'Hi, I am a useless error message',
       MYSQL_ERRNO = 9999;

=== modified file 'mysql-test/t/sp-code.test'
--- a/mysql-test/t/sp-code.test	2008-03-25 23:35:34 +0000
+++ b/mysql-test/t/sp-code.test	2010-07-30 15:28:36 +0000
@@ -649,3 +649,56 @@ END//
 DELIMITER ;//
 SHOW PROCEDURE CODE p1;
 DROP PROCEDURE p1;
+
+--echo #
+--echo # Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
+--echo #
+
+--echo
+--echo # - Case 4: check that "No Data trumps Warning".
+--echo
+
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES (1), (2), (3);
+
+delimiter |;
+
+CREATE PROCEDURE p1()
+BEGIN
+  DECLARE c CURSOR FOR SELECT a FROM t1;
+
+  OPEN c;
+  
+  BEGIN
+    DECLARE v INT;
+
+    DECLARE CONTINUE HANDLER FOR SQLWARNING
+    BEGIN
+      SELECT "Warning found!";
+      SHOW WARNINGS;
+    END;
+
+    DECLARE EXIT HANDLER FOR NOT FOUND
+    BEGIN
+      SELECT "End of Result Set found!";
+      SHOW WARNINGS;
+    END;
+
+    WHILE TRUE DO
+      FETCH c INTO v;
+    END WHILE;
+  END;
+
+  CLOSE c;
+
+  SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack
+END|
+
+delimiter ;|
+
+SET SESSION debug="+d,bug23032_emit_warning";
+CALL p1();
+SET SESSION debug="-d,bug23032_emit_warning";
+
+DROP PROCEDURE p1;
+DROP TABLE t1;

=== modified file 'mysql-test/t/sp-error.test'
--- a/mysql-test/t/sp-error.test	2010-02-04 22:08:08 +0000
+++ b/mysql-test/t/sp-error.test	2010-07-30 15:28:36 +0000
@@ -2543,3 +2543,273 @@ DROP TABLE t1;
 
 --echo End of 5.1 tests
 
+--echo #
+--echo # Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
+--echo #
+
+--echo
+--echo # - Case 1
+--echo
+
+--disable_warnings
+DROP PROCEDURE IF EXISTS p1;
+DROP PROCEDURE IF EXISTS p2;
+DROP PROCEDURE IF EXISTS p3;
+DROP PROCEDURE IF EXISTS p4;
+DROP PROCEDURE IF EXISTS p5;
+DROP PROCEDURE IF EXISTS p6;
+--enable_warnings
+
+delimiter |;
+
+CREATE PROCEDURE p1()
+  BEGIN
+    SELECT CAST('10 ' as unsigned integer);
+    SELECT 1;
+    CALL p2();
+  END|
+
+CREATE PROCEDURE p2()
+  BEGIN
+    SELECT CAST('10 ' as unsigned integer);
+  END|
+
+delimiter ;|
+
+CALL p1();
+
+DROP PROCEDURE p1;
+DROP PROCEDURE p2;
+
+--echo
+--echo # - Case 2
+--echo
+
+delimiter |;
+
+CREATE PROCEDURE p1()
+  BEGIN
+    DECLARE c INT DEFAULT 0;
+    DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1;
+    CALL p2();
+    CALL p3();
+    CALL p4();
+    SELECT c;
+    SELECT @@warning_count;
+    SHOW WARNINGS;
+  END|
+
+CREATE PROCEDURE p2()
+  BEGIN
+    SELECT CAST('10 ' as unsigned integer);
+  END|
+
+CREATE PROCEDURE p3()
+  BEGIN
+    SELECT CAST('10 ' as unsigned integer);
+    SELECT 1;
+  END|
+
+CREATE PROCEDURE p4()
+  BEGIN
+    SELECT CAST('10 ' as unsigned integer);
+    CALL p2();
+  END|
+
+CREATE PROCEDURE p5()
+  BEGIN
+    SELECT CAST('10 ' as unsigned integer);
+    SHOW WARNINGS;
+  END|
+
+CREATE PROCEDURE P6()
+  BEGIN
+    DECLARE c INT DEFAULT 0;
+    DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1;
+    CALL p5();
+    SELECT c;
+  END|
+
+delimiter ;|
+
+CALL p1();
+CALL p6();
+
+DROP PROCEDURE p1;
+DROP PROCEDURE p2;
+DROP PROCEDURE p3;
+DROP PROCEDURE p4;
+DROP PROCEDURE p5;
+DROP PROCEDURE p6;
+
+--echo
+--echo # - Case 3: check that "Exception trumps No Data".
+--echo
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES (1), (2), (3);
+
+delimiter |;
+
+CREATE PROCEDURE p1()
+BEGIN
+  DECLARE c CURSOR FOR SELECT a FROM t1;
+
+  OPEN c;
+  
+  BEGIN
+    DECLARE v1 INT;
+    DECLARE v2 INT;
+
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION
+      SELECT "Error caught (expected)";
+
+    DECLARE EXIT HANDLER FOR NOT FOUND
+      SELECT "End of Result Set found!";
+
+    WHILE TRUE DO
+      FETCH c INTO v1, v2;
+    END WHILE;
+  END;
+
+  CLOSE c;
+
+  SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack
+END|
+
+delimiter ;|
+
+CALL p1();
+
+DROP PROCEDURE p1;
+DROP TABLE t1;
+
+--echo #
+--echo # Bug#36185: Incorrect precedence for warning and exception handlers
+--echo #
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+DROP PROCEDURE IF EXISTS p1;
+--enable_warnings
+
+CREATE TABLE t1 (a INT, b INT NOT NULL);
+
+delimiter |;
+
+CREATE PROCEDURE p1()
+BEGIN
+  DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'warning';
+  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'exception';
+  INSERT INTO t1 VALUES (CAST('10 ' AS SIGNED), NULL);
+END|
+
+delimiter ;|
+
+CALL p1();
+
+DROP TABLE t1;
+DROP PROCEDURE p1;
+
+--echo #
+--echo # Bug#5889: Exit handler for a warning doesn't hide the warning in trigger
+--echo #
+
+--echo
+--echo # - Case 1
+--echo
+
+CREATE TABLE t1(a INT, b INT);
+INSERT INTO t1 VALUES (1, 2);
+
+delimiter |;
+
+CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW
+BEGIN
+  DECLARE EXIT HANDLER FOR SQLWARNING
+    SET NEW.a = 10;
+
+  SET NEW.a = 99999999999;
+END|
+
+delimiter ;|
+
+UPDATE t1 SET b = 20;
+
+SHOW WARNINGS;
+
+SELECT * FROM t1;
+
+DROP TRIGGER t1_bu;
+DROP TABLE t1;
+
+--echo
+--echo # - Case 2
+--echo
+
+CREATE TABLE t1(a INT);
+CREATE TABLE t2(b CHAR(1));
+
+delimiter |;
+
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+BEGIN
+  INSERT INTO t2 VALUES('ab'); # Produces a warning.
+
+  INSERT INTO t2 VALUES('b');  # Does not produce a warning,
+                               # previous warning should be cleared.
+END|
+
+delimiter ;|
+
+INSERT INTO t1 VALUES(0);
+
+SHOW WARNINGS;
+
+SELECT * FROM t1;
+SELECT * FROM t2;
+
+DROP TRIGGER t1_bi;
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo #
+--echo # Bug#9857: Stored procedures: handler for sqlwarning ignored
+--echo #
+
+SET @sql_mode_saved = @@sql_mode;
+SET sql_mode = traditional;
+
+delimiter |;
+
+CREATE PROCEDURE p1()
+BEGIN
+  DECLARE CONTINUE HANDLER FOR SQLWARNING
+    SELECT 'warning caught (expected)';
+  
+  SELECT 5 / 0;
+END|
+
+CREATE PROCEDURE p2()
+BEGIN
+  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
+    SELECT 'error caught (unexpected)';
+  
+  SELECT 5 / 0;
+END|
+
+delimiter ;|
+
+CALL p1();
+SHOW WARNINGS;
+
+CALL p2();
+SHOW WARNINGS;
+
+DROP PROCEDURE p1;
+DROP PROCEDURE p2;
+SET sql_mode = @sql_mode_saved;

=== modified file 'mysql-test/t/sp.test'
--- a/mysql-test/t/sp.test	2010-04-13 21:56:19 +0000
+++ b/mysql-test/t/sp.test	2010-07-30 15:28:36 +0000
@@ -5432,6 +5432,8 @@ drop procedure if exists bug15231_1|
 drop procedure if exists bug15231_2|
 drop procedure if exists bug15231_3|
 drop procedure if exists bug15231_4|
+drop procedure if exists bug15231_5|
+drop procedure if exists bug15231_6|
 --enable_warnings
 
 create table t3 (id int not null)|
@@ -5461,7 +5463,7 @@ end|
 create procedure bug15231_3()
 begin
   declare exit handler for sqlwarning
-    select 'Caught it (wrong)' as 'Result';
+    select 'Caught it (correct)' as 'Result';
 
   call bug15231_4();
 end|
@@ -5472,16 +5474,37 @@ begin
 
   set x = 'zap';
   select 'Missed it (correct)' as 'Result';
+  show warnings;
+end|
+
+create procedure bug15231_5()
+begin
+  declare exit handler for sqlwarning
+    select 'Caught it (wrong)' as 'Result';
+
+  call bug15231_6();
+end|
+
+create procedure bug15231_6()
+begin
+  declare x decimal(2,1);
+
+  set x = 'zap';
+  select 'Missed it (correct)' as 'Result';
+  select id from t3;
 end|
 
 call bug15231_1()|
 call bug15231_3()|
+call bug15231_5()|
 
-drop table if exists t3|
-drop procedure if exists bug15231_1|
-drop procedure if exists bug15231_2|
-drop procedure if exists bug15231_3|
-drop procedure if exists bug15231_4|
+drop table t3|
+drop procedure bug15231_1|
+drop procedure bug15231_2|
+drop procedure bug15231_3|
+drop procedure bug15231_4|
+drop procedure bug15231_5|
+drop procedure bug15231_6|
 
 
 #

=== modified file 'scripts/CMakeLists.txt'
--- a/scripts/CMakeLists.txt	2010-07-19 14:00:29 +0000
+++ b/scripts/CMakeLists.txt	2010-08-05 16:38:24 +0000
@@ -24,6 +24,7 @@ ENDIF()
 # Build mysql_fix_privilege_tables.sql (concatenate 2 sql scripts)
 IF(NOT WIN32 OR CMAKE_CROSSCOMPILING)
   FIND_PROGRAM(CAT_EXECUTABLE cat DOC "path to the executable")
+  MARK_AS_ADVANCED(CAT_EXECUTABLE)
 ENDIF()
 
 IF(CAT_EXECUTABLE)

=== modified file 'sql-bench/CMakeLists.txt'
--- a/sql-bench/CMakeLists.txt	2010-06-18 15:04:15 +0000
+++ b/sql-bench/CMakeLists.txt	2010-08-05 16:38:24 +0000
@@ -14,12 +14,6 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 # Install sql-bench files
-FILE(GLOB all_files 
-${CMAKE_SOURCE_DIR}/sql-bench/* 
-${CMAKE_SOURCE_DIR}/sql-bench/Data/ATIS/*
-${CMAKE_SOURCE_DIR}/sql-bench/Data/Wisconsin/*
-${CMAKE_SOURCE_DIR}/sql-bench/limits/*
-)
 
 IF(NOT INSTALL_SQLBENCHDIR)
  RETURN()
@@ -31,30 +25,39 @@ ELSE()
  SET(prefix ${INSTALL_SQLBENCHDIR}/)
 ENDIF()
 
-GET_FILENAME_COMPONENT(basedir ${CMAKE_SOURCE_DIR} ABSOLUTE)
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Data/ATIS
+  DESTINATION  ${prefix}sql-bench/Data)
+
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Data/Wisconsin
+  DESTINATION  ${prefix}sql-bench/Data)
+
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/limits
+  DESTINATION  ${prefix}sql-bench)
+
+FILE(GLOB all_files ${CMAKE_CURRENT_SOURCE_DIR}/*)
+
 FOREACH(file ${all_files})
   IF(NOT IS_DIRECTORY ${file} AND NOT ${file} MATCHES "Make|as3ap|/example$" )
-  FILE(RELATIVE_PATH relpath ${basedir} ${file})
-  SET(target_relpath ${relpath})
   GET_FILENAME_COMPONENT(ext ${file} EXT)
-  GET_FILENAME_COMPONENT(dir ${relpath} PATH)
+  GET_FILENAME_COMPONENT(name ${file} NAME)
+  SET(target ${name})
   IF(ext MATCHES ".sh$")
     # Those are perl files actually
-    STRING(REPLACE ".sh" "" target_relpath ${target_relpath} )
+    STRING(REPLACE ".sh" "" target ${target} )
     IF(WIN32)
       IF(NOT ext MATCHES ".pl")
-        SET(target_relpath "${target_relpath}.pl")
+        SET(target "${target}.pl")
       ENDIF()
     ENDIF()
   ENDIF()
-  SET(target "${CMAKE_BINARY_DIR}/${target_relpath}")
+  SET(target "${CMAKE_CURRENT_BINARY_DIR}/${target}")
   CONFIGURE_FILE(${file} ${target} COPYONLY)
   IF (ext MATCHES ".bat")
     IF(WIN32) 
-      INSTALL(FILES ${target} DESTINATION ${prefix}${dir})
+      INSTALL(FILES ${target} DESTINATION ${prefix}sql-bench)
     ENDIF()
   ELSE()
-    INSTALL(FILES ${target} DESTINATION ${prefix}${dir})
+    INSTALL(FILES ${target} DESTINATION ${prefix}sql-bench)
   ENDIF()
   ENDIF()
 ENDFOREACH()

=== modified file 'sql/CMakeLists.txt'
--- a/sql/CMakeLists.txt	2010-07-25 17:30:18 +0000
+++ b/sql/CMakeLists.txt	2010-08-05 16:38:24 +0000
@@ -42,7 +42,6 @@ SET (SQL_SOURCE
               ../sql-common/client.c derror.cc des_key_file.cc
                discover.cc ../libmysql/errmsg.c field.cc  field_conv.cc 
                filesort.cc gstream.cc sha2.cc
-               ha_partition.cc
                handler.cc hash_filo.h sql_plugin_services.h
                hostname.cc init.cc item.cc item_buff.cc item_cmpfunc.cc 
                item_create.cc item_func.cc item_geofunc.cc item_row.cc 
@@ -266,18 +265,20 @@ IF(WIN32 AND MYSQLD_EXECUTABLE)
   ENDIF()
   MAKE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR}/data)
   ADD_CUSTOM_COMMAND(
-     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/data/mysql/user.frm
+     OUTPUT initdb.dep
      COMMAND ${CMAKE_COMMAND}
      ${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_initial_db.cmake
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data
+     COMMAND  ${CMAKE_COMMAND} -E touch initdb.dep
+     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
      DEPENDS mysqld
   )
   ADD_CUSTOM_TARGET(initial_database  
     ALL
-    DEPENDS  ${CMAKE_CURRENT_BINARY_DIR}/data/mysql/user.frm
+    DEPENDS  initdb.dep
   )
-  INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data DESTINATION . COMPONENT DataFiles
-    PATTERN "bootstrap.sql" EXCLUDE)
+  INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data DESTINATION . 
+  COMPONENT DataFiles PATTERN "initdb.dep" EXCLUDE  PATTERN "bootstrap.sql" EXCLUDE)
 ELSE()
   # Not windows or cross compiling, just install an empty directory
   INSTALL(FILES ${DUMMY_FILE} DESTINATION data/mysql)

=== modified file 'sql/datadict.cc'
--- a/sql/datadict.cc	2010-06-06 11:19:29 +0000
+++ b/sql/datadict.cc	2010-08-09 18:33:47 +0000
@@ -152,9 +152,7 @@ bool dd_recreate_table(THD *thd, const c
   build_table_filename(path, sizeof(path) - 1, db, table_name, "", 0);
 
   /* Attempt to reconstruct the table. */
-  mysql_mutex_lock(&LOCK_open);
   error= ha_create_table(thd, path, db, table_name, &create_info, TRUE);
-  mysql_mutex_unlock(&LOCK_open);
 
   DBUG_RETURN(error);
 }

=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc	2010-08-02 17:16:18 +0000
+++ b/sql/ha_ndbcluster.cc	2010-08-10 08:21:59 +0000
@@ -680,7 +680,7 @@ int ha_ndbcluster::ndb_err(NdbTransactio
     bzero((char*) &table_list,sizeof(table_list));
     table_list.db= m_dbname;
     table_list.alias= table_list.table_name= m_tabname;
-    close_cached_tables(thd, &table_list, FALSE, FALSE, LONG_TIMEOUT);
+    close_cached_tables(thd, &table_list, FALSE, LONG_TIMEOUT);
     break;
   }
   default:
@@ -5702,7 +5702,7 @@ int ha_ndbcluster::create(const char *na
                                m_table->getObjectVersion(),
                                (is_truncate) ?
 			       SOT_TRUNCATE_TABLE : SOT_CREATE_TABLE, 
-			       0, 0, 1);
+			       0, 0);
       break;
     }
   }
@@ -6143,7 +6143,7 @@ int ha_ndbcluster::rename_table(const ch
                                old_dbname, m_tabname,
                                ndb_table_id, ndb_table_version,
                                SOT_RENAME_TABLE,
-                               m_dbname, new_tabname, 1);
+                               m_dbname, new_tabname);
   }
 
   // If we are moving tables between databases, we need to recreate
@@ -6337,7 +6337,7 @@ retry_temporary_error1:
                              thd->query(), thd->query_length(),
                              share->db, share->table_name,
                              ndb_table_id, ndb_table_version,
-                             SOT_DROP_TABLE, 0, 0, 1);
+                             SOT_DROP_TABLE, 0, 0);
   }
   else if (table_dropped && share && share->op) /* ndbcluster_log_schema_op
                                                    will do a force GCP */
@@ -7019,7 +7019,6 @@ int ndbcluster_drop_database_impl(const 
   while ((tabname=it++))
   {
     tablename_to_filename(tabname, tmp, FN_REFLEN - (tmp - full_path)-1);
-    mysql_mutex_lock(&LOCK_open);
     if (ha_ndbcluster::delete_table(0, ndb, full_path, dbname, tabname))
     {
       const NdbError err= dict->getNdbError();
@@ -7029,7 +7028,6 @@ int ndbcluster_drop_database_impl(const 
         ret= ndb_to_mysql_error(&err);
       }
     }
-    mysql_mutex_unlock(&LOCK_open);
   }
   DBUG_RETURN(ret);      
 }
@@ -7056,7 +7054,7 @@ static void ndbcluster_drop_database(han
   ha_ndbcluster::set_dbname(path, db);
   ndbcluster_log_schema_op(thd, 0,
                            thd->query(), thd->query_length(),
-                           db, "", 0, 0, SOT_DROP_DB, 0, 0, 0);
+                           db, "", 0, 0, SOT_DROP_DB, 0, 0);
 #endif
   DBUG_VOID_RETURN;
 }
@@ -7181,7 +7179,6 @@ int ndbcluster_find_all_files(THD *thd)
       my_free(data);
       my_free(pack_data);
 
-      mysql_mutex_lock(&LOCK_open);
       if (discover)
       {
         /* ToDo 4.1 database needs to be created if missing */
@@ -7199,7 +7196,6 @@ int ndbcluster_find_all_files(THD *thd)
                                        TRUE);
       }
 #endif
-      mysql_mutex_unlock(&LOCK_open);
     }
   }
   while (unhandled && retries);
@@ -7292,19 +7288,16 @@ int ndbcluster_find_files(handlerton *ht
                            file_name->str, reg_ext, 0);
       if (my_access(name, F_OK))
       {
-        mysql_mutex_lock(&LOCK_open);
         DBUG_PRINT("info", ("Table %s listed and need discovery",
                             file_name->str));
         if (ndb_create_table_from_engine(thd, db, file_name->str))
         {
-          mysql_mutex_unlock(&LOCK_open);
           push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
                               ER_TABLE_EXISTS_ERROR,
                               "Discover of table %s.%s failed",
                               db, file_name->str);
           continue;
         }
-        mysql_mutex_unlock(&LOCK_open);
       }
       DBUG_PRINT("info", ("%s existed in NDB _and_ on disk ", file_name->str));
       file_on_disk= TRUE;
@@ -7361,10 +7354,8 @@ int ndbcluster_find_files(handlerton *ht
       file_name_str= (char*)my_hash_element(&ok_tables, i);
       end= end1 +
         tablename_to_filename(file_name_str, end1, sizeof(name) - (end1 - name));
-      mysql_mutex_lock(&LOCK_open);
       ndbcluster_create_binlog_setup(ndb, name, end-name,
                                      db, file_name_str, TRUE);
-      mysql_mutex_unlock(&LOCK_open);
     }
   }
 #endif
@@ -7426,7 +7417,6 @@ int ndbcluster_find_files(handlerton *ht
   }
 
   /* Lock mutex before creating .FRM files. */
-  mysql_mutex_lock(&LOCK_open);
   /* Create new files. */
   List_iterator_fast<char> it2(create_list);
   while ((file_name_str=it2++))
@@ -7441,8 +7431,6 @@ int ndbcluster_find_files(handlerton *ht
     }
   }
 
-  mysql_mutex_unlock(&LOCK_open);
-
   my_hash_free(&ok_tables);
   my_hash_free(&ndb_tables);
 
@@ -8452,8 +8440,7 @@ int handle_trailing_share(NDB_SHARE *sha
   bzero((char*) &table_list,sizeof(table_list));
   table_list.db= share->db;
   table_list.alias= table_list.table_name= share->table_name;
-  mysql_mutex_assert_owner(&LOCK_open);
-  close_cached_tables(thd, &table_list, TRUE, FALSE, LONG_TIMEOUT);
+  close_cached_tables(thd, &table_list, FALSE, LONG_TIMEOUT);
 
   mysql_mutex_lock(&ndbcluster_mutex);
   /* ndb_share reference temporary free */
@@ -10612,13 +10599,13 @@ int ndbcluster_alter_tablespace(handlert
                              thd->query(), thd->query_length(),
                              "", alter_info->tablespace_name,
                              0, 0,
-                             SOT_TABLESPACE, 0, 0, 0);
+                             SOT_TABLESPACE, 0, 0);
   else
     ndbcluster_log_schema_op(thd, 0,
                              thd->query(), thd->query_length(),
                              "", alter_info->logfile_group_name,
                              0, 0,
-                             SOT_LOGFILE_GROUP, 0, 0, 0);
+                             SOT_LOGFILE_GROUP, 0, 0);
 #endif
   DBUG_RETURN(FALSE);
 

=== modified file 'sql/ha_ndbcluster_binlog.cc'
--- a/sql/ha_ndbcluster_binlog.cc	2010-08-02 17:16:18 +0000
+++ b/sql/ha_ndbcluster_binlog.cc	2010-08-10 08:21:59 +0000
@@ -360,7 +360,6 @@ ndbcluster_binlog_open_table(THD *thd, N
   int error;
   DBUG_ENTER("ndbcluster_binlog_open_table");
   
-  mysql_mutex_assert_owner(&LOCK_open);
   init_tmp_table_share(thd, table_share, share->db, 0, share->table_name, 
                        share->key);
   if ((error= open_table_def(thd, table_share, 0)))
@@ -376,7 +375,9 @@ ndbcluster_binlog_open_table(THD *thd, N
     free_table_share(table_share);
     DBUG_RETURN(error);
   }
+  mysql_mutex_lock(&LOCK_open);
   assign_new_table_id(table_share);
+  mysql_mutex_unlock(&LOCK_open);
 
   if (!reopen)
   {
@@ -625,7 +626,7 @@ ndbcluster_binlog_log_query(handlerton *
   {
     ndbcluster_log_schema_op(thd, 0, query, query_length,
                              db, table_name, 0, 0, type,
-                             0, 0, 0);
+                             0, 0);
   }
   DBUG_VOID_RETURN;
 }
@@ -908,9 +909,7 @@ int ndbcluster_setup_binlog_table_shares
   if (!ndb_schema_share &&
       ndbcluster_check_ndb_schema_share() == 0)
   {
-    mysql_mutex_lock(&LOCK_open);
     ndb_create_table_from_engine(thd, NDB_REP_DB, NDB_SCHEMA_TABLE);
-    mysql_mutex_unlock(&LOCK_open);
     if (!ndb_schema_share)
     {
       ndbcluster_create_schema_table(thd);
@@ -922,9 +921,7 @@ int ndbcluster_setup_binlog_table_shares
   if (!ndb_apply_status_share &&
       ndbcluster_check_ndb_apply_status_share() == 0)
   {
-    mysql_mutex_lock(&LOCK_open);
     ndb_create_table_from_engine(thd, NDB_REP_DB, NDB_APPLY_TABLE);
-    mysql_mutex_unlock(&LOCK_open);
     if (!ndb_apply_status_share)
     {
       ndbcluster_create_ndb_apply_status_table(thd);
@@ -934,12 +931,10 @@ int ndbcluster_setup_binlog_table_shares
   }
   if (!ndbcluster_find_all_files(thd))
   {
-    mysql_mutex_lock(&LOCK_open);
     ndb_binlog_tables_inited= TRUE;
     if (opt_ndb_extra_logging)
       sql_print_information("NDB Binlog: ndb tables writable");
-    close_cached_tables(NULL, NULL, TRUE, FALSE, LONG_TIMEOUT);
-    mysql_mutex_unlock(&LOCK_open);
+    close_cached_tables(NULL, NULL, FALSE, LONG_TIMEOUT);
     /* Signal injector thread that all is setup */
     mysql_cond_signal(&injector_cond);
   }
@@ -1276,8 +1271,7 @@ int ndbcluster_log_schema_op(THD *thd, N
                              uint32 ndb_table_id,
                              uint32 ndb_table_version,
                              enum SCHEMA_OP_TYPE type,
-                             const char *new_db, const char *new_table_name,
-                             int have_lock_open)
+                             const char *new_db, const char *new_table_name)
 {
   DBUG_ENTER("ndbcluster_log_schema_op");
   Thd_ndb *thd_ndb= get_thd_ndb(thd);
@@ -1580,11 +1574,6 @@ end:
 
     int max_timeout= DEFAULT_SYNC_TIMEOUT;
     mysql_mutex_lock(&ndb_schema_object->mutex);
-    if (have_lock_open)
-    {
-      mysql_mutex_assert_owner(&LOCK_open);
-      mysql_mutex_unlock(&LOCK_open);
-    }
     while (1)
     {
       struct timespec abstime;
@@ -1640,10 +1629,6 @@ end:
                              "distributing", ndb_schema_object->key);
       }
     }
-    if (have_lock_open)
-    {
-      mysql_mutex_lock(&LOCK_open);
-    }
     mysql_mutex_unlock(&ndb_schema_object->mutex);
   }
 
@@ -1726,7 +1711,6 @@ ndb_handle_schema_change(THD *thd, Ndb *
     {
       DBUG_DUMP("frm", (uchar*) altered_table->getFrmData(), 
                 altered_table->getFrmLength());
-      mysql_mutex_lock(&LOCK_open);
       Ndb_table_guard ndbtab_g(dict, tabname);
       const NDBTAB *old= ndbtab_g.get_table();
       if (!old &&
@@ -1752,7 +1736,7 @@ ndb_handle_schema_change(THD *thd, Ndb *
       bzero((char*) &table_list,sizeof(table_list));
       table_list.db= (char *)dbname;
       table_list.alias= table_list.table_name= (char *)tabname;
-      close_cached_tables(thd, &table_list, TRUE, FALSE, LONG_TIMEOUT);
+      close_cached_tables(thd, &table_list, FALSE, LONG_TIMEOUT);
 
       if ((error= ndbcluster_binlog_open_table(thd, share,
                                                table_share, table, 1)))
@@ -1763,8 +1747,6 @@ ndb_handle_schema_change(THD *thd, Ndb *
       table_share= share->table_share;
       dbname= table_share->db.str;
       tabname= table_share->table_name.str;
-
-      mysql_mutex_unlock(&LOCK_open);
     }
     my_free(data);
     my_free(pack_data);
@@ -1858,7 +1840,7 @@ ndb_handle_schema_change(THD *thd, Ndb *
     bzero((char*) &table_list,sizeof(table_list));
     table_list.db= (char *)dbname;
     table_list.alias= table_list.table_name= (char *)tabname;
-    close_cached_tables(thd, &table_list, FALSE, FALSE, LONG_TIMEOUT);
+    close_cached_tables(thd, &table_list, FALSE, LONG_TIMEOUT);
     /* ndb_share reference create free */
     DBUG_PRINT("NDB_SHARE", ("%s create free  use_count: %u",
                              share->key, share->use_count));
@@ -1979,7 +1961,7 @@ ndb_binlog_thread_handle_schema_event(TH
             bzero((char*) &table_list,sizeof(table_list));
             table_list.db= schema->db;
             table_list.alias= table_list.table_name= schema->name;
-            close_cached_tables(thd, &table_list, FALSE, FALSE, LONG_TIMEOUT);
+            close_cached_tables(thd, &table_list, FALSE, LONG_TIMEOUT);
           }
           /* ndb_share reference temporary free */
           if (share)
@@ -1991,7 +1973,6 @@ ndb_binlog_thread_handle_schema_event(TH
         }
         // fall through
         case SOT_CREATE_TABLE:
-          mysql_mutex_lock(&LOCK_open);
           if (ndbcluster_check_if_local_table(schema->db, schema->name))
           {
             DBUG_PRINT("info", ("NDB Binlog: Skipping locally defined table '%s.%s'",
@@ -2005,7 +1986,6 @@ ndb_binlog_thread_handle_schema_event(TH
           {
             print_could_not_discover_error(thd, schema);
           }
-          mysql_mutex_unlock(&LOCK_open);
           log_query= 1;
           break;
         case SOT_DROP_DB:
@@ -2096,7 +2076,7 @@ ndb_binlog_thread_handle_schema_event(TH
       mysql_mutex_unlock(&ndb_schema_share_mutex);
       /* end protect ndb_schema_share */
 
-      close_cached_tables(NULL, NULL, FALSE, FALSE, LONG_TIMEOUT);
+      close_cached_tables(NULL, NULL, FALSE, LONG_TIMEOUT);
       // fall through
     case NDBEVENT::TE_ALTER:
       ndb_handle_schema_change(thd, ndb, pOp, tmp_share);
@@ -2253,7 +2233,7 @@ ndb_binlog_thread_handle_schema_event_po
           bzero((char*) &table_list,sizeof(table_list));
           table_list.db= schema->db;
           table_list.alias= table_list.table_name= schema->name;
-          close_cached_tables(thd, &table_list, FALSE, FALSE, LONG_TIMEOUT);
+          close_cached_tables(thd, &table_list, FALSE, LONG_TIMEOUT);
         }
         if (schema_type != SOT_ALTER_TABLE)
           break;
@@ -2274,7 +2254,6 @@ ndb_binlog_thread_handle_schema_event_po
             free_share(&share);
             share= 0;
           }
-          mysql_mutex_lock(&LOCK_open);
           if (ndbcluster_check_if_local_table(schema->db, schema->name))
           {
             DBUG_PRINT("info", ("NDB Binlog: Skipping locally defined table '%s.%s'",
@@ -2288,7 +2267,6 @@ ndb_binlog_thread_handle_schema_event_po
           {
             print_could_not_discover_error(thd, schema);
           }
-          mysql_mutex_unlock(&LOCK_open);
         }
         break;
       default:
@@ -3154,8 +3132,6 @@ ndbcluster_handle_drop_table(Ndb *ndb, c
 #ifdef SYNC_DROP_
   thd->proc_info= "Syncing ndb table schema operation and binlog";
   mysql_mutex_lock(&share->mutex);
-  mysql_mutex_assert_owner(&LOCK_open);
-  mysql_mutex_unlock(&LOCK_open);
   int max_timeout= DEFAULT_SYNC_TIMEOUT;
   while (share->op)
   {
@@ -3181,7 +3157,6 @@ ndbcluster_handle_drop_table(Ndb *ndb, c
                            type_str, share->key);
     }
   }
-  mysql_mutex_lock(&LOCK_open);
   mysql_mutex_unlock(&share->mutex);
 #else
   mysql_mutex_lock(&share->mutex);

=== modified file 'sql/ha_ndbcluster_binlog.h'
--- a/sql/ha_ndbcluster_binlog.h	2010-03-31 14:05:33 +0000
+++ b/sql/ha_ndbcluster_binlog.h	2010-08-09 18:33:47 +0000
@@ -158,8 +158,7 @@ int ndbcluster_log_schema_op(THD *thd, N
                              uint32 ndb_table_version,
                              enum SCHEMA_OP_TYPE type,
                              const char *new_db,
-                             const char *new_table_name,
-                             int have_lock_open);
+                             const char *new_table_name);
 int ndbcluster_handle_drop_table(Ndb *ndb, const char *event_name,
                                  NDB_SHARE *share,
                                  const char *type_str);

=== modified file 'sql/handler.cc'
--- a/sql/handler.cc	2010-07-27 14:32:42 +0000
+++ b/sql/handler.cc	2010-08-09 18:33:47 +0000
@@ -3670,6 +3670,34 @@ int ha_create_table_from_engine(THD* thd
   DBUG_RETURN(error != 0);
 }
 
+
+/**
+  Try to find a table in a storage engine. 
+
+  @param db   Normalized table schema name
+  @param name Normalized table name.
+  @param[out] exists Only valid if the function succeeded.
+
+  @retval TRUE   An error is found
+  @retval FALSE  Success, check *exists
+*/
+
+bool
+ha_check_if_table_exists(THD* thd, const char *db, const char *name,
+                         bool *exists)
+{
+  uchar *frmblob= NULL;
+  size_t frmlen;
+  DBUG_ENTER("ha_check_if_table_exists");
+
+  *exists= ! ha_discover(thd, db, name, &frmblob, &frmlen);
+  if (*exists)
+    my_free(frmblob);
+
+  DBUG_RETURN(FALSE);
+}
+
+
 void st_ha_check_opt::init()
 {
   flags= sql_flags= 0;

=== modified file 'sql/handler.h'
--- a/sql/handler.h	2010-07-27 14:32:42 +0000
+++ b/sql/handler.h	2010-08-09 18:33:47 +0000
@@ -2120,6 +2120,8 @@ bool ha_show_status(THD *thd, handlerton
 
 /* discovery */
 int ha_create_table_from_engine(THD* thd, const char *db, const char *name);
+bool ha_check_if_table_exists(THD* thd, const char *db, const char *name,
+                             bool *exists);
 int ha_discover(THD* thd, const char* dbname, const char* name,
                 uchar** frmblob, size_t* frmlen);
 int ha_find_files(THD *thd,const char *db,const char *path,

=== modified file 'sql/item.cc'
--- a/sql/item.cc	2010-07-20 19:30:10 +0000
+++ b/sql/item.cc	2010-08-02 12:36:41 +0000
@@ -7510,13 +7510,13 @@ String *Item_cache_datetime::val_str(Str
       if (cached_field_type == MYSQL_TYPE_TIME)
       {
         ulonglong time= int_value;
-        DBUG_ASSERT(time < TIME_MAX_VALUE);
+        DBUG_ASSERT(time <= TIME_MAX_VALUE);
         set_zero_time(&ltime, MYSQL_TIMESTAMP_TIME);
         ltime.second= time % 100;
         time/= 100;
         ltime.minute= time % 100;
         time/= 100;
-        ltime.hour= time % 100;
+        ltime.hour= time;
       }
       else
       {

=== modified file 'sql/mdl.cc'
--- a/sql/mdl.cc	2010-08-10 07:40:03 +0000
+++ b/sql/mdl.cc	2010-08-10 08:21:59 +0000
@@ -502,14 +502,6 @@ mdl_locks_key(const uchar *record, size_
   the associated condition variable: LOCK_mdl and COND_mdl.
   These locking primitives are implementation details of the MDL
   subsystem and are private to it.
-
-  Note, that even though the new implementation adds acquisition
-  of a new global mutex to the execution flow of almost every SQL
-  statement, the design capitalizes on that to later save on
-  look ups in the table definition cache. This leads to reduced
-  contention overall and on LOCK_open in particular.
-  Please see the description of MDL_context::acquire_lock()
-  for details.
 */
 
 void mdl_init()

=== modified file 'sql/sp_head.cc'
--- a/sql/sp_head.cc	2010-07-29 12:32:11 +0000
+++ b/sql/sp_head.cc	2010-07-30 15:28:36 +0000
@@ -1076,6 +1076,104 @@ void sp_head::recursion_level_error(THD 
 
 
 /**
+  Find an SQL handler for any condition (warning or error) after execution
+  of a stored routine instruction. Basically, this function looks for an
+  appropriate SQL handler in RT-contexts. If an SQL handler is found, it is
+  remembered in the RT-context for future activation (the context can be
+  inactive at the moment).
+
+  If there is no pending condition, the function just returns.
+
+  If there was an error during the execution, an SQL handler for it will be
+  searched within the current and outer scopes.
+
+  There might be several errors in the Warning Info (that's possible by using
+  SIGNAL/RESIGNAL in nested scopes) -- the function is looking for an SQL
+  handler for the latest (current) error only.
+
+  If there was a warning during the execution, an SQL handler for it will be
+  searched within the current scope only.
+
+  If several warnings were thrown during the execution and there are different
+  SQL handlers for them, it is not determined which SQL handler will be chosen.
+  Only one SQL handler will be executed.
+
+  If warnings and errors were thrown during the execution, the error takes
+  precedence. I.e. error handler will be executed. If there is no handler
+  for that error, condition will remain unhandled.
+
+  Once a warning or an error has been handled it is not removed from
+  Warning Info.
+
+  According to The Standard (quoting PeterG):
+
+    An SQL procedure statement works like this ...
+    SQL/Foundation 13.5 <SQL procedure statement>
+    (General Rules) (greatly summarized) says:
+    (1) Empty diagnostics area, thus clearing the condition.
+    (2) Execute statement.
+        During execution, if Exception Condition occurs,
+        set Condition Area = Exception Condition and stop
+        statement.
+        During execution, if No Data occurs,
+        set Condition Area = No Data Condition and continue
+        statement.
+        During execution, if Warning occurs,
+        and Condition Area is not already full due to
+        an earlier No Data condition, set Condition Area
+        = Warning and continue statement.
+    (3) Finish statement.
+        At end of execution, if Condition Area is not
+        already full due to an earlier No Data or Warning,
+        set Condition Area = Successful Completion.
+        In effect, this system means there is a precedence:
+        Exception trumps No Data, No Data trumps Warning,
+        Warning trumps Successful Completion.
+
+    NB: "Procedure statements" include any DDL or DML or
+    control statements. So CREATE and DELETE and WHILE
+    and CALL and RETURN are procedure statements. But
+    DECLARE and END are not procedure statements.
+
+  @param thd thread handle
+  @param ctx runtime context of the stored routine
+*/
+
+static void
+find_handler_after_execution(THD *thd, sp_rcontext *ctx)
+{
+  if (thd->is_error())
+  {
+    ctx->find_handler(thd,
+                      thd->stmt_da->sql_errno(),
+                      thd->stmt_da->get_sqlstate(),
+                      MYSQL_ERROR::WARN_LEVEL_ERROR,
+                      thd->stmt_da->message());
+  }
+  else if (thd->warning_info->statement_warn_count())
+  {
+    List_iterator<MYSQL_ERROR> it(thd->warning_info->warn_list());
+    MYSQL_ERROR *err;
+    while ((err= it++))
+    {
+      if (err->get_level() != MYSQL_ERROR::WARN_LEVEL_WARN &&
+          err->get_level() != MYSQL_ERROR::WARN_LEVEL_NOTE)
+        continue;
+
+      if (ctx->find_handler(thd,
+                            err->get_sql_errno(),
+                            err->get_sqlstate(),
+                            err->get_level(),
+                            err->get_message_text()))
+      {
+        break;
+      }
+    }
+  }
+}
+
+
+/**
   Execute the routine. The main instruction jump loop is there.
   Assume the parameters already set.
   @todo
@@ -1096,7 +1194,7 @@ sp_head::execute(THD *thd)
   LEX_STRING saved_cur_db_name=
     { saved_cur_db_name_buf, sizeof(saved_cur_db_name_buf) };
   bool cur_db_changed= FALSE;
-  sp_rcontext *ctx;
+  sp_rcontext *ctx= thd->spcont;
   bool err_status= FALSE;
   uint ip= 0;
   ulong save_sql_mode;
@@ -1157,8 +1255,6 @@ sp_head::execute(THD *thd)
     goto done;
   }
 
-  if ((ctx= thd->spcont))
-    ctx->clear_handler();
   thd->is_slave_error= 0;
   old_arena= thd->stmt_arena;
 
@@ -1243,7 +1339,6 @@ sp_head::execute(THD *thd)
   do
   {
     sp_instr *i;
-    uint hip;
 
 #if defined(ENABLED_PROFILING)
     /*
@@ -1265,6 +1360,9 @@ sp_head::execute(THD *thd)
       break;
     }
 
+    /* Reset number of warnings for this query. */
+    thd->warning_info->reset_for_next_command();
+
     DBUG_PRINT("execute", ("Instruction %u", ip));
 
     /*
@@ -1309,40 +1407,28 @@ sp_head::execute(THD *thd)
     free_root(&execute_mem_root, MYF(0));
 
     /*
-      Check if an exception has occurred and a handler has been found
-      Note: We have to check even if err_status == FALSE, since warnings (and
-      some errors) don't return a non-zero value. We also have to check even
-      if thd->killed != 0, since some errors return with this even when a
-      handler has been found (e.g. "bad data").
+      Find and process SQL handlers unless it is a fatal error (fatal
+      errors are not catchable by SQL handlers) or the connection has been
+      killed during execution.
     */
-    if (ctx)
+    if (!thd->is_fatal_error && !thd->killed_errno())
     {
-      uint handler_index;
+      /*
+        Find SQL handler in the appropriate RT-contexts:
+          - warnings can be handled by SQL handlers within
+            the current scope only;
+          - errors can be handled by any SQL handler from outer scope.
+      */
+      find_handler_after_execution(thd, ctx);
 
-      switch (ctx->found_handler(& hip, & handler_index)) {
-      case SP_HANDLER_NONE:
-        break;
-      case SP_HANDLER_CONTINUE:
-        thd->restore_active_arena(&execute_arena, &backup_arena);
-        thd->set_n_backup_active_arena(&execute_arena, &backup_arena);
-        ctx->push_hstack(i->get_cont_dest());
-        /* Fall through */
-      default:
-        if (ctx->end_partial_result_set)
-          thd->protocol->end_partial_result_set(thd);
-        ip= hip;
+      /* If found, activate handler for the current scope. */
+      if (ctx->activate_handler(thd, &ip, i, &execute_arena, &backup_arena))
         err_status= FALSE;
-        ctx->clear_handler();
-        ctx->enter_handler(hip, handler_index);
-        thd->clear_error();
-        thd->is_fatal_error= 0;
-        thd->killed= THD::NOT_KILLED;
-        thd->mysys_var->abort= 0;
-        continue;
-      }
-
-      ctx->end_partial_result_set= FALSE;
     }
+
+    /* Reset sp_rcontext::end_partial_result_set flag. */
+    ctx->end_partial_result_set= FALSE;
+
   } while (!err_status && !thd->killed && !thd->is_fatal_error);
 
 #if defined(ENABLED_PROFILING)
@@ -3037,23 +3123,14 @@ sp_instr_set::exec_core(THD *thd, uint *
 {
   int res= thd->spcont->set_variable(thd, m_offset, &m_value);
 
-  if (res && thd->spcont->found_handler_here())
+  if (res)
   {
-    /*
-      Failed to evaluate the value, and a handler has been found. Reset the
-      variable to NULL.
-    */
+    /* Failed to evaluate the value. Reset the variable to NULL. */
 
     if (thd->spcont->set_variable(thd, m_offset, 0))
     {
       /* If this also failed, let's abort. */
-
-      sp_rcontext *spcont= thd->spcont;
-
-      thd->spcont= NULL;           /* Avoid handlers */
-      my_error(ER_OUT_OF_RESOURCES, MYF(0));
-      spcont->clear_handler();
-      thd->spcont= spcont;
+      my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATALERROR));
     }
   }
 
@@ -3586,18 +3663,6 @@ sp_instr_copen::execute(THD *thd, uint *
     if (thd->stmt_arena->free_list)
       cleanup_items(thd->stmt_arena->free_list);
     thd->stmt_arena= old_arena;
-    /*
-      Work around the fact that errors in selects are not returned properly
-      (but instead converted into a warning), so if a condition handler
-      caught, we have lost the result code.
-    */
-    if (!res)
-    {
-      uint dummy1, dummy2;
-
-      if (thd->spcont->found_handler(&dummy1, &dummy2))
-        res= -1;
-    }
     /* TODO: Assert here that we either have an error or a cursor */
   }
   DBUG_RETURN(res);
@@ -3773,13 +3838,11 @@ sp_instr_set_case_expr::exec_core(THD *t
 {
   int res= thd->spcont->set_case_expr(thd, m_case_expr_id, &m_case_expr);
 
-  if (res &&
-      !thd->spcont->get_case_expr(m_case_expr_id) &&
-      thd->spcont->found_handler_here())
+  if (res && !thd->spcont->get_case_expr(m_case_expr_id))
   {
     /*
       Failed to evaluate the value, the case expression is still not
-      initialized, and a handler has been found. Set to NULL so we can continue.
+      initialized. Set to NULL so we can continue.
     */
 
     Item *null_item= new Item_null();
@@ -3788,13 +3851,7 @@ sp_instr_set_case_expr::exec_core(THD *t
         thd->spcont->set_case_expr(thd, m_case_expr_id, &null_item))
     {
       /* If this also failed, we have to abort. */
-
-      sp_rcontext *spcont= thd->spcont;
-
-      thd->spcont= NULL;           /* Avoid handlers */
-      my_error(ER_OUT_OF_RESOURCES, MYF(0));
-      spcont->clear_handler();
-      thd->spcont= spcont;
+      my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATALERROR));
     }
   }
   else

=== modified file 'sql/sp_pcontext.h'
--- a/sql/sp_pcontext.h	2010-03-31 14:05:33 +0000
+++ b/sql/sp_pcontext.h	2010-07-30 15:28:36 +0000
@@ -332,13 +332,6 @@ public:
   int
   push_cond(LEX_STRING *name, sp_cond_type_t *val);
 
-  inline void
-  pop_cond(uint num)
-  {
-    while (num--)
-      pop_dynamic(&m_conds);
-  }
-
   sp_cond_type_t *
   find_cond(LEX_STRING *name, my_bool scoped=0);
 

=== modified file 'sql/sp_rcontext.cc'
--- a/sql/sp_rcontext.cc	2010-07-27 12:42:36 +0000
+++ b/sql/sp_rcontext.cc	2010-07-30 15:28:36 +0000
@@ -171,48 +171,50 @@ sp_rcontext::set_return_value(THD *thd, 
 #define IS_NOT_FOUND_CONDITION(S) ((S)[0] == '0' && (S)[1] == '2')
 #define IS_EXCEPTION_CONDITION(S) ((S)[0] != '0' || (S)[1] > '2')
 
-/*
-  Find a handler for the given errno.
-  This is called from all error message functions (e.g. push_warning,
-  net_send_error, et al) when a sp_rcontext is in effect. If a handler
-  is found, no error is sent, and the the SP execution loop will instead
-  invoke the found handler.
-  This might be called several times before we get back to the execution
-  loop, so m_hfound can be >= 0 if a handler has already been found.
-  (In which case we don't search again - the first found handler will
-   be used.)
-  Handlers are pushed on the stack m_handler, with the latest/innermost
+/**
+  Find an SQL handler for the given error.
+
+  SQL handlers are pushed on the stack m_handler, with the latest/innermost
   one on the top; we then search for matching handlers from the top and
   down.
+
   We search through all the handlers, looking for the most specific one
   (sql_errno more specific than sqlstate more specific than the rest).
   Note that mysql error code handlers is a MySQL extension, not part of
   the standard.
 
-  SYNOPSIS
-    sql_errno     The error code
-    level         Warning level
+  SQL handlers for warnings are searched in the current scope only.
 
-  RETURN
-    1             if a handler was found, m_hfound is set to its index (>= 0)
-    0             if not found, m_hfound is -1
+  SQL handlers for errors are searched in the current and in outer scopes.
+  That's why finding and activation of handler must be separated: an errror
+  handler might be located in the outer scope, which is not active at the
+  moment. Before such handler can be activated, execution flow should
+  unwind to that scope.
+
+  Found SQL handler is remembered in m_hfound for future activation.
+  If no handler is found, m_hfound is -1.
+
+  @param thd        Thread handle
+  @param sql_errno  The error code
+  @param sqlstate   The error SQL state
+  @param level      The error level
+  @param msg        The error message
+
+  @retval TRUE  if an SQL handler was found
+  @retval FALSE otherwise
 */
 
 bool
 sp_rcontext::find_handler(THD *thd,
                           uint sql_errno,
-                          const char* sqlstate,
+                          const char *sqlstate,
                           MYSQL_ERROR::enum_warning_level level,
-                          const char* msg,
-                          MYSQL_ERROR ** cond_hdl)
+                          const char *msg)
 {
-  if (m_hfound >= 0)
-  {
-    *cond_hdl= NULL;
-    return TRUE;			// Already got one
-  }
+  int i= m_hcount;
 
-  int i= m_hcount, found= -1;
+  /* Reset previously found handler. */
+  m_hfound= -1;
 
   /*
     If this is a fatal sub-statement error, and this runtime
@@ -240,105 +242,56 @@ sp_rcontext::find_handler(THD *thd,
     {
     case sp_cond_type_t::number:
       if (sql_errno == cond->mysqlerr &&
-          (found < 0 || m_handler[found].cond->type > sp_cond_type_t::number))
-	found= i;		// Always the most specific
+          (m_hfound < 0 || m_handler[m_hfound].cond->type > sp_cond_type_t::number))
+	m_hfound= i;		// Always the most specific
       break;
     case sp_cond_type_t::state:
       if (strcmp(sqlstate, cond->sqlstate) == 0 &&
-	  (found < 0 || m_handler[found].cond->type > sp_cond_type_t::state))
-	found= i;
+	  (m_hfound < 0 || m_handler[m_hfound].cond->type > sp_cond_type_t::state))
+	m_hfound= i;
       break;
     case sp_cond_type_t::warning:
       if ((IS_WARNING_CONDITION(sqlstate) ||
            level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
-          found < 0)
-	found= i;
+          m_hfound < 0)
+	m_hfound= i;
       break;
     case sp_cond_type_t::notfound:
-      if (IS_NOT_FOUND_CONDITION(sqlstate) && found < 0)
-	found= i;
+      if (IS_NOT_FOUND_CONDITION(sqlstate) && m_hfound < 0)
+	m_hfound= i;
       break;
     case sp_cond_type_t::exception:
       if (IS_EXCEPTION_CONDITION(sqlstate) &&
 	  level == MYSQL_ERROR::WARN_LEVEL_ERROR &&
-	  found < 0)
-	found= i;
+	  m_hfound < 0)
+	m_hfound= i;
       break;
     }
   }
-  if (found < 0)
-  {
-    /*
-      Only "exception conditions" are propagated to handlers in calling
-      contexts. If no handler is found locally for a "completion condition"
-      (warning or "not found") we will simply resume execution.
-    */
-    if (m_prev_runtime_ctx && IS_EXCEPTION_CONDITION(sqlstate) &&
-        level == MYSQL_ERROR::WARN_LEVEL_ERROR)
-      return m_prev_runtime_ctx->find_handler(thd,
-                                              sql_errno,
-                                              sqlstate,
-                                              level,
-                                              msg,
-                                              cond_hdl);
-    *cond_hdl= NULL;
-    return FALSE;
-  }
-
-  m_hfound= found;
-
-  MYSQL_ERROR *raised= NULL;
-  DBUG_ASSERT(m_hfound >= 0);
-  DBUG_ASSERT((uint) m_hfound < m_root_parsing_ctx->max_handler_index());
-  raised= & m_raised_conditions[m_hfound];
-  raised->clear();
-  raised->set(sql_errno, sqlstate, level, msg);
-
-  *cond_hdl= raised;
-  return TRUE;
-}
-
-/*
-   Handle the error for a given errno.
-   The severity of the error is adjusted depending of the current sql_mode.
-   If an handler is present for the error (see find_handler()),
-   this function will return true.
-   If a handler is found and if the severity of the error indicate
-   that the current instruction executed should abort,
-   the flag thd->net.report_error is also set.
-   This will cause the execution of the current instruction in a
-   sp_instr* to fail, and give control to the handler code itself
-   in the sp_head::execute() loop.
 
-  SYNOPSIS
-    sql_errno     The error code
-    level         Warning level
-    thd           The current thread
+  if (m_hfound >= 0)
+  {
+    DBUG_ASSERT((uint) m_hfound < m_root_parsing_ctx->max_handler_index());
 
-  RETURN
-    TRUE       if a handler was found.
-    FALSE      if no handler was found.
-*/
-bool
-sp_rcontext::handle_condition(THD *thd,
-                              uint sql_errno,
-                              const char* sqlstate,
-                              MYSQL_ERROR::enum_warning_level level,
-                              const char* msg,
-                              MYSQL_ERROR ** cond_hdl)
-{
-  MYSQL_ERROR::enum_warning_level elevated_level= level;
+    m_raised_conditions[m_hfound].clear();
+    m_raised_conditions[m_hfound].set(sql_errno, sqlstate, level, msg);
 
+    return TRUE;
+  }
 
-  /* Depending on the sql_mode of execution,
-     warnings may be considered errors */
-  if ((level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
-      thd->really_abort_on_warning())
+  /*
+    Only "exception conditions" are propagated to handlers in calling
+    contexts. If no handler is found locally for a "completion condition"
+    (warning or "not found") we will simply resume execution.
+  */
+  if (m_prev_runtime_ctx && IS_EXCEPTION_CONDITION(sqlstate) &&
+      level == MYSQL_ERROR::WARN_LEVEL_ERROR)
   {
-    elevated_level= MYSQL_ERROR::WARN_LEVEL_ERROR;
+    return m_prev_runtime_ctx->find_handler(thd, sql_errno, sqlstate,
+                                            level, msg);
   }
 
-  return find_handler(thd, sql_errno, sqlstate, elevated_level, msg, cond_hdl);
+  return FALSE;
 }
 
 void
@@ -384,7 +337,9 @@ sp_rcontext::pop_handlers(uint count)
 {
   DBUG_ENTER("sp_rcontext::pop_handlers");
   DBUG_ASSERT(m_hcount >= count);
+
   m_hcount-= count;
+
   DBUG_PRINT("info", ("m_hcount: %d", m_hcount));
   DBUG_VOID_RETURN;
 }
@@ -394,7 +349,9 @@ sp_rcontext::push_hstack(uint h)
 {
   DBUG_ENTER("sp_rcontext::push_hstack");
   DBUG_ASSERT(m_hsp < m_root_parsing_ctx->max_handler_index());
+
   m_hstack[m_hsp++]= h;
+
   DBUG_PRINT("info", ("m_hsp: %d", m_hsp));
   DBUG_VOID_RETURN;
 }
@@ -405,21 +362,74 @@ sp_rcontext::pop_hstack()
   uint handler;
   DBUG_ENTER("sp_rcontext::pop_hstack");
   DBUG_ASSERT(m_hsp);
+
   handler= m_hstack[--m_hsp];
+
   DBUG_PRINT("info", ("m_hsp: %d", m_hsp));
   DBUG_RETURN(handler);
 }
 
-void
-sp_rcontext::enter_handler(uint hip, uint hindex)
+/**
+  Prepare found handler to be executed.
+
+  @retval TRUE if an SQL handler is activated (was found) and IP of the
+          first handler instruction.
+  @retval FALSE if there is no active handler
+*/
+
+bool
+sp_rcontext::activate_handler(THD *thd,
+                              uint *ip,
+                              sp_instr *instr,
+                              Query_arena *execute_arena,
+                              Query_arena *backup_arena)
 {
-  DBUG_ENTER("sp_rcontext::enter_handler");
-  DBUG_ASSERT(m_ihsp < m_root_parsing_ctx->max_handler_index());
-  m_in_handler[m_ihsp].ip= hip;
-  m_in_handler[m_ihsp].index= hindex;
-  m_ihsp++;
-  DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp));
-  DBUG_VOID_RETURN;
+  if (m_hfound < 0)
+    return FALSE;
+
+  switch (m_handler[m_hfound].type) {
+  case SP_HANDLER_NONE:
+    break;
+
+  case SP_HANDLER_CONTINUE:
+    thd->restore_active_arena(execute_arena, backup_arena);
+    thd->set_n_backup_active_arena(execute_arena, backup_arena);
+    push_hstack(instr->get_cont_dest());
+
+    /* Fall through */
+
+  default:
+    /* End aborted result set. */
+
+    if (end_partial_result_set)
+      thd->protocol->end_partial_result_set(thd);
+
+    /* Enter handler. */
+
+    DBUG_ASSERT(m_ihsp < m_root_parsing_ctx->max_handler_index());
+    DBUG_ASSERT(m_hfound >= 0);
+
+    m_in_handler[m_ihsp].ip= m_handler[m_hfound].handler;
+    m_in_handler[m_ihsp].index= m_hfound;
+    m_ihsp++;
+
+    DBUG_PRINT("info", ("Entering handler..."));
+    DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp));
+
+    /* Reset error state. */
+
+    thd->clear_error();
+    thd->killed= THD::NOT_KILLED; // Some errors set thd->killed
+                                  // (e.g. "bad data").
+
+    /* Return IP of the activated SQL handler. */
+    *ip= m_handler[m_hfound].handler;
+
+    /* Reset found handler. */
+    m_hfound= -1;
+  }
+
+  return TRUE;
 }
 
 void
@@ -427,9 +437,11 @@ sp_rcontext::exit_handler()
 {
   DBUG_ENTER("sp_rcontext::exit_handler");
   DBUG_ASSERT(m_ihsp);
+
   uint hindex= m_in_handler[m_ihsp-1].index;
   m_raised_conditions[hindex].clear();
   m_ihsp-= 1;
+
   DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp));
   DBUG_VOID_RETURN;
 }
@@ -567,6 +579,11 @@ sp_cursor::fetch(THD *thd, List<struct s
     return -1;
   }
 
+  DBUG_EXECUTE_IF("bug23032_emit_warning",
+                  push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
+                               ER_UNKNOWN_ERROR,
+                               ER(ER_UNKNOWN_ERROR)););
+
   result.set_spvar_list(vars);
 
   /* Attempt to fetch one row */

=== modified file 'sql/sp_rcontext.h'
--- a/sql/sp_rcontext.h	2010-03-31 14:05:33 +0000
+++ b/sql/sp_rcontext.h	2010-07-30 15:28:36 +0000
@@ -131,67 +131,40 @@ class sp_rcontext : public Sql_alloc
     return m_return_value_set;
   }
 
+  /*
+    SQL handlers support.
+  */
+
   void push_handler(struct sp_cond_type *cond, uint h, int type);
 
   void pop_handlers(uint count);
 
-  // Returns 1 if a handler was found, 0 otherwise.
   bool
   find_handler(THD *thd,
                uint sql_errno,
-               const char* sqlstate,
+               const char *sqlstate,
                MYSQL_ERROR::enum_warning_level level,
-               const char* msg,
-               MYSQL_ERROR ** cond_hdl);
-
-  // If there is an error handler for this error, handle it and return TRUE.
-  bool
-  handle_condition(THD *thd,
-                   uint sql_errno,
-                   const char* sqlstate,
-                   MYSQL_ERROR::enum_warning_level level,
-                   const char* msg,
-                   MYSQL_ERROR ** cond_hdl);
-
-  // Returns handler type and sets *ip to location if one was found
-  inline int
-  found_handler(uint *ip, uint *index)
-  {
-    if (m_hfound < 0)
-      return SP_HANDLER_NONE;
-    *ip= m_handler[m_hfound].handler;
-    *index= m_hfound;
-    return m_handler[m_hfound].type;
-  }
+               const char *msg);
 
-  MYSQL_ERROR* raised_condition() const;
-
-  // Returns true if we found a handler in this context
-  inline bool
-  found_handler_here()
-  {
-    return (m_hfound >= 0);
-  }
+  MYSQL_ERROR *
+  raised_condition() const;
 
-  // Clears the handler find state
-  inline void
-  clear_handler()
-  {
-    m_hfound= -1;
-  }
+  void
+  push_hstack(uint h);
 
-  void push_hstack(uint h);
+  uint
+  pop_hstack();
 
-  uint pop_hstack();
+  bool
+  activate_handler(THD *thd,
+                   uint *ip,
+                   sp_instr *instr,
+                   Query_arena *execute_arena,
+                   Query_arena *backup_arena);
 
-  /**
-    Enter a SQL exception handler.
-    @param hip the handler instruction pointer
-    @param index the handler index
-  */
-  void enter_handler(uint hip, uint index);
 
-  void exit_handler();
+  void
+  exit_handler();
 
   void
   push_cursor(sp_lex_keeper *lex_keeper, sp_instr_cpush *i);
@@ -199,7 +172,7 @@ class sp_rcontext : public Sql_alloc
   void
   pop_cursors(uint count);
 
-  void
+  inline void
   pop_all_cursors()
   {
     pop_cursors(m_ccount);

=== modified file 'sql/sql_base.cc'
--- a/sql/sql_base.cc	2010-08-10 07:40:03 +0000
+++ b/sql/sql_base.cc	2010-08-10 08:21:59 +0000
@@ -311,8 +311,6 @@ void table_def_start_shutdown(void)
   if (table_def_inited)
   {
     mysql_mutex_lock(&LOCK_open);
-    /* Free all cached but unused TABLEs and TABLE_SHAREs first. */
-    close_cached_tables(NULL, NULL, TRUE, FALSE, LONG_TIMEOUT);
     /*
       Ensure that TABLE and TABLE_SHARE objects which are created for
       tables that are open during process of plugins' shutdown are
@@ -321,6 +319,8 @@ void table_def_start_shutdown(void)
     */
     table_def_shutdown_in_progress= TRUE;
     mysql_mutex_unlock(&LOCK_open);
+    /* Free all cached but unused TABLEs and TABLE_SHAREs. */
+    close_cached_tables(NULL, NULL, FALSE, LONG_TIMEOUT);
   }
 }
 
@@ -513,10 +513,10 @@ TABLE_SHARE *get_table_share(THD *thd, T
   }
 
   /*
-    We assign a new table id under the protection of the LOCK_open and
-    the share's own mutex.  We do this insted of creating a new mutex
+    We assign a new table id under the protection of the LOCK_open.
+    We do this instead of creating a new mutex
     and using it for the sole purpose of serializing accesses to a
-    static variable, we assign the table id here.  We assign it to the
+    static variable, we assign the table id here. We assign it to the
     share before inserting it into the table_def_cache to be really
     sure that it cannot be read from the cache without having a table
     id assigned.
@@ -544,7 +544,7 @@ TABLE_SHARE *get_table_share(THD *thd, T
   DBUG_RETURN(share);
 
 found:
-  /* 
+  /*
      We found an existing table definition. Return it if we didn't get
      an error when reading the table definition from file.
   */
@@ -586,21 +586,21 @@ found:
 }
 
 
-/*
+/**
   Get a table share. If it didn't exist, try creating it from engine
 
-  For arguments and return values, see get_table_from_share()
+  For arguments and return values, see get_table_share()
 */
 
-static TABLE_SHARE
-*get_table_share_with_create(THD *thd, TABLE_LIST *table_list,
-                             char *key, uint key_length,
-                             uint db_flags, int *error,
-                             my_hash_value_type hash_value)
+static TABLE_SHARE *
+get_table_share_with_discover(THD *thd, TABLE_LIST *table_list,
+                              char *key, uint key_length,
+                              uint db_flags, int *error,
+                              my_hash_value_type hash_value)
 
 {
   TABLE_SHARE *share;
-  int tmp;
+  bool exists;
   DBUG_ENTER("get_table_share_with_create");
 
   share= get_table_share(thd, table_list, key, key_length, db_flags, error,
@@ -614,10 +614,15 @@ static TABLE_SHARE
     from the pre-locking list. In this case we still need to try
     auto-discover before returning a NULL share.
 
+    Or, we're inside SHOW CREATE VIEW, which
+    also installs a silencer for ER_NO_SUCH_TABLE error.
+
     If share is NULL and the error is ER_NO_SUCH_TABLE, this is
-    the same as above, only that the error was not silenced by 
-    pre-locking. Once again, we need to try to auto-discover
-    the share.
+    the same as above, only that the error was not silenced by
+    pre-locking or SHOW CREATE VIEW.
+
+    In both these cases it won't harm to try to discover the
+    table.
 
     Finally, if share is still NULL, it's a real error and we need
     to abort.
@@ -625,20 +630,25 @@ static TABLE_SHARE
     @todo Rework alternative ways to deal with ER_NO_SUCH TABLE.
   */
   if (share || (thd->is_error() && thd->stmt_da->sql_errno() != ER_NO_SUCH_TABLE))
-
     DBUG_RETURN(share);
 
+  *error= 0;
+
   /* Table didn't exist. Check if some engine can provide it */
-  tmp= ha_create_table_from_engine(thd, table_list->db,
-                                   table_list->table_name);
-  if (tmp < 0)
+  if (ha_check_if_table_exists(thd, table_list->db, table_list->table_name,
+                               &exists))
+  {
+    thd->clear_error();
+    /* Conventionally, the storage engine API does not report errors. */
+    my_error(ER_OUT_OF_RESOURCES, MYF(0));
+  }
+  else if (! exists)
   {
     /*
       No such table in any engine.
       Hide "Table doesn't exist" errors if the table belongs to a view.
       The check for thd->is_error() is necessary to not push an
-      unwanted error in case of pre-locking, which silences
-      "no such table" errors.
+      unwanted error in case the error was already silenced.
       @todo Rework the alternative ways to deal with ER_NO_SUCH TABLE.
     */
     if (thd->is_error())
@@ -656,27 +666,16 @@ static TABLE_SHARE
                  view->view_db.str, view->view_name.str);
       }
     }
-    DBUG_RETURN(0);
   }
-  if (tmp)
+  else
   {
-    /* Give right error message */
     thd->clear_error();
-    DBUG_PRINT("error", ("Discovery of %s/%s failed", table_list->db,
-                         table_list->table_name));
-    my_printf_error(ER_UNKNOWN_ERROR,
-                    "Failed to open '%-.64s', error while "
-                    "unpacking from engine",
-                    MYF(0), table_list->table_name);
-    DBUG_RETURN(0);
+    *error= 7; /* Run auto-discover. */
   }
-  /* Table existed in engine. Let's open it */
-  thd->warning_info->clear_warning_info(thd->query_id);
-  thd->clear_error();                           // Clear error message
-  DBUG_RETURN(get_table_share(thd, table_list, key, key_length,
-                              db_flags, error, hash_value));
+  DBUG_RETURN(NULL);
 }
 
+
 /**
   Mark that we are not using table share anymore.
 
@@ -923,7 +922,6 @@ static void kill_delayed_threads_for_tab
 
   @param thd Thread context
   @param tables List of tables to remove from the cache
-  @param have_lock If LOCK_open is locked
   @param wait_for_refresh Wait for a impending flush
   @param timeout Timeout for waiting for flush to be completed.
 
@@ -938,7 +936,7 @@ static void kill_delayed_threads_for_tab
         lock taken by thread trying to obtain global read lock.
 */
 
-bool close_cached_tables(THD *thd, TABLE_LIST *tables, bool have_lock,
+bool close_cached_tables(THD *thd, TABLE_LIST *tables,
                          bool wait_for_refresh, ulong timeout)
 {
   bool result= FALSE;
@@ -947,8 +945,7 @@ bool close_cached_tables(THD *thd, TABLE
   DBUG_ENTER("close_cached_tables");
   DBUG_ASSERT(thd || (!wait_for_refresh && !tables));
 
-  if (!have_lock)
-    mysql_mutex_lock(&LOCK_open);
+  mysql_mutex_lock(&LOCK_open);
   if (!tables)
   {
     /*
@@ -986,7 +983,7 @@ bool close_cached_tables(THD *thd, TABLE
         kill_delayed_threads_for_table(share);
         /* tdc_remove_table() also sets TABLE_SHARE::version to 0. */
         tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED, table->db,
-                         table->table_name);
+                         table->table_name, TRUE);
 	found=1;
       }
     }
@@ -994,15 +991,11 @@ bool close_cached_tables(THD *thd, TABLE
       wait_for_refresh=0;			// Nothing to wait for
   }
 
-  if (!have_lock)
-    mysql_mutex_unlock(&LOCK_open);
+  mysql_mutex_unlock(&LOCK_open);
 
   if (!wait_for_refresh)
     DBUG_RETURN(result);
 
-  /* Code below assume that LOCK_open is released. */
-  DBUG_ASSERT(!have_lock);
-
   set_timespec(abstime, timeout);
 
   if (thd->locked_tables_mode)
@@ -1123,7 +1116,7 @@ err_with_reopen:
 */
 
 bool close_cached_connection_tables(THD *thd, bool if_wait_for_refresh,
-                                    LEX_STRING *connection, bool have_lock)
+                                    LEX_STRING *connection)
 {
   uint idx;
   TABLE_LIST tmp, *tables= NULL;
@@ -1133,8 +1126,7 @@ bool close_cached_connection_tables(THD 
 
   bzero(&tmp, sizeof(TABLE_LIST));
 
-  if (!have_lock)
-    mysql_mutex_lock(&LOCK_open);
+  mysql_mutex_lock(&LOCK_open);
 
   for (idx= 0; idx < table_def_cache.records; idx++)
   {
@@ -1162,12 +1154,10 @@ bool close_cached_connection_tables(THD 
     tables= (TABLE_LIST *) memdup_root(thd->mem_root, (char*)&tmp, 
                                        sizeof(TABLE_LIST));
   }
+  mysql_mutex_unlock(&LOCK_open);
 
   if (tables)
-    result= close_cached_tables(thd, tables, TRUE, FALSE, LONG_TIMEOUT);
-
-  if (!have_lock)
-    mysql_mutex_unlock(&LOCK_open);
+    result= close_cached_tables(thd, tables, FALSE, LONG_TIMEOUT);
 
   if (if_wait_for_refresh)
   {
@@ -1370,9 +1360,8 @@ close_all_tables_for_name(THD *thd, TABL
     }
   }
   /* Remove the table share from the cache. */
-  mysql_mutex_lock(&LOCK_open);
-  tdc_remove_table(thd, TDC_RT_REMOVE_ALL, db, table_name);
-  mysql_mutex_unlock(&LOCK_open);
+  tdc_remove_table(thd, TDC_RT_REMOVE_ALL, db, table_name,
+                   FALSE);
   /*
     There could be a FLUSH thread waiting
     on the table to go away. Wake it up.
@@ -2216,10 +2205,9 @@ bool wait_while_table_is_used(THD *thd, 
              table->mdl_ticket, thd->variables.lock_wait_timeout))
     DBUG_RETURN(TRUE);
 
-  mysql_mutex_lock(&LOCK_open);
   tdc_remove_table(thd, TDC_RT_REMOVE_NOT_OWN,
-                   table->s->db.str, table->s->table_name.str);
-  mysql_mutex_unlock(&LOCK_open);
+                   table->s->db.str, table->s->table_name.str,
+                   FALSE);
   /* extra() call must come only after all instances above are closed */
   (void) table->file->extra(function);
   DBUG_RETURN(FALSE);
@@ -2260,9 +2248,8 @@ void drop_open_table(THD *thd, TABLE *ta
     table->file->extra(HA_EXTRA_PREPARE_FOR_DROP);
     close_thread_table(thd, &thd->open_tables);
     /* Remove the table share from the table cache. */
-    mysql_mutex_lock(&LOCK_open);
-    tdc_remove_table(thd, TDC_RT_REMOVE_ALL, db_name, table_name);
-    mysql_mutex_unlock(&LOCK_open);
+    tdc_remove_table(thd, TDC_RT_REMOVE_ALL, db_name, table_name,
+                     FALSE);
     /* Remove the table from the storage engine and rm the .frm. */
     quick_rm_table(table_type, db_name, table_name, 0);
   }
@@ -2294,16 +2281,20 @@ void drop_open_table(THD *thd, TABLE *ta
 bool check_if_table_exists(THD *thd, TABLE_LIST *table, bool *exists)
 {
   char path[FN_REFLEN + 1];
-  int rc= 0;
+  TABLE_SHARE *share;
   DBUG_ENTER("check_if_table_exists");
 
-  mysql_mutex_assert_not_owner(&LOCK_open);
-
   *exists= TRUE;
 
+  DBUG_ASSERT(thd->mdl_context.
+              is_lock_owner(MDL_key::TABLE, table->db,
+                            table->table_name, MDL_SHARED));
+
   mysql_mutex_lock(&LOCK_open);
+  share= get_cached_table_share(table->db, table->table_name);
+  mysql_mutex_unlock(&LOCK_open);
 
-  if (get_cached_table_share(table->db, table->table_name))
+  if (share)
     goto end;
 
   build_table_filename(path, sizeof(path) - 1, table->db, table->table_name,
@@ -2313,24 +2304,14 @@ bool check_if_table_exists(THD *thd, TAB
     goto end;
 
   /* .FRM file doesn't exist. Check if some engine can provide it. */
-
-  rc= ha_create_table_from_engine(thd, table->db, table->table_name);
-
-  if (rc < 0)
+  if (ha_check_if_table_exists(thd, table->db, table->table_name, exists))
   {
-    /* Table does not exists in engines as well. */
-    *exists= FALSE;
-    rc= 0;
-  }
-  else if (rc)
-  {
-    my_printf_error(ER_UNKNOWN_ERROR, "Failed to open '%-.64s', error while "
+    my_printf_error(ER_OUT_OF_RESOURCES, "Failed to open '%-.64s', error while "
                     "unpacking from engine", MYF(0), table->table_name);
+    DBUG_RETURN(TRUE);
   }
-
 end:
-  mysql_mutex_unlock(&LOCK_open);
-  DBUG_RETURN(test(rc));
+  DBUG_RETURN(FALSE);
 }
 
 
@@ -2860,11 +2841,25 @@ bool open_table(THD *thd, TABLE_LIST *ta
 
 retry_share:
 
-  if (!(share= get_table_share_with_create(thd, table_list, key,
-                                           key_length, OPEN_VIEW,
-                                           &error,
-                                           hash_value)))
-    goto err_unlock2;
+  if (!(share= get_table_share_with_discover(thd, table_list, key,
+                                             key_length, OPEN_VIEW,
+                                             &error,
+                                             hash_value)))
+  {
+    mysql_mutex_unlock(&LOCK_open);
+    /*
+      If thd->is_error() is not set, we either need discover
+      (error == 7), or the error was silenced by the prelocking
+      handler (error == 0), in which case we should skip this
+      table.
+    */
+    if (error == 7 && !thd->is_error())
+    {
+      (void) ot_ctx->request_backoff_action(Open_table_context::OT_DISCOVER,
+                                            table_list);
+    }
+    DBUG_RETURN(TRUE);
+  }
 
   if (share->is_view)
   {
@@ -3077,7 +3072,6 @@ err_lock:
   mysql_mutex_lock(&LOCK_open);
 err_unlock:
   release_table_share(share);
-err_unlock2:
   mysql_mutex_unlock(&LOCK_open);
 
   DBUG_RETURN(TRUE);
@@ -3700,10 +3694,10 @@ bool tdc_open_view(THD *thd, TABLE_LIST 
                            cache_key_length);
   mysql_mutex_lock(&LOCK_open);
 
-  if (!(share= get_table_share_with_create(thd, table_list, cache_key,
-                                           cache_key_length, 
-                                           OPEN_VIEW, &error,
-                                           hash_value)))
+  if (!(share= get_table_share(thd, table_list, cache_key,
+                               cache_key_length,
+                               OPEN_VIEW, &error,
+                               hash_value)))
     goto err;
 
   if (share->is_view &&
@@ -3805,10 +3799,10 @@ static bool auto_repair_table(THD *thd, 
                            cache_key_length);
   mysql_mutex_lock(&LOCK_open);
 
-  if (!(share= get_table_share_with_create(thd, table_list, cache_key,
-                                           cache_key_length,
-                                           OPEN_VIEW, &not_used,
-                                           hash_value)))
+  if (!(share= get_table_share(thd, table_list, cache_key,
+                               cache_key_length,
+                               OPEN_VIEW, &not_used,
+                               hash_value)))
     goto end_unlock;
 
   if (share->is_view)
@@ -3853,7 +3847,8 @@ static bool auto_repair_table(THD *thd, 
   release_table_share(share);
   /* Remove the repaired share from the table cache. */
   tdc_remove_table(thd, TDC_RT_REMOVE_ALL,
-                   table_list->db, table_list->table_name);
+                   table_list->db, table_list->table_name,
+                   TRUE);
 end_unlock:
   mysql_mutex_unlock(&LOCK_open);
   return result;
@@ -3993,12 +3988,10 @@ recover_from_failed_open(THD *thd)
                                       MYSQL_OPEN_SKIP_TEMPORARY)))
           break;
 
-        mysql_mutex_lock(&LOCK_open);
         tdc_remove_table(thd, TDC_RT_REMOVE_ALL, m_failed_table->db,
-                         m_failed_table->table_name);
+                         m_failed_table->table_name, FALSE);
         ha_create_table_from_engine(thd, m_failed_table->db,
                                     m_failed_table->table_name);
-        mysql_mutex_unlock(&LOCK_open);
 
         thd->warning_info->clear_warning_info(thd->query_id);
         thd->clear_error();                 // Clear error message
@@ -4012,10 +4005,8 @@ recover_from_failed_open(THD *thd)
                                       MYSQL_OPEN_SKIP_TEMPORARY)))
           break;
 
-        mysql_mutex_lock(&LOCK_open);
         tdc_remove_table(thd, TDC_RT_REMOVE_ALL, m_failed_table->db,
-                         m_failed_table->table_name);
-        mysql_mutex_unlock(&LOCK_open);
+                         m_failed_table->table_name, FALSE);
 
         result= auto_repair_table(thd, m_failed_table);
         thd->mdl_context.release_transactional_locks();
@@ -8624,7 +8615,7 @@ void tdc_flush_unused_tables()
   mysql_mutex_lock(&LOCK_open);
   while (unused_tables)
     free_cache_entry(unused_tables);
-  (void) mysql_mutex_unlock(&LOCK_open);
+  mysql_mutex_unlock(&LOCK_open);
 }
 
 
@@ -8718,20 +8709,25 @@ bool mysql_notify_thread_having_shared_l
                                                 remove TABLE_SHARE).
    @param  db           Name of database
    @param  table_name   Name of table
+   @param  has_lock     If TRUE, LOCK_open is already acquired
 
    @note It assumes that table instances are already not used by any
    (other) thread (this should be achieved by using meta-data locks).
 */
 
 void tdc_remove_table(THD *thd, enum_tdc_remove_table_type remove_type,
-                      const char *db, const char *table_name)
+                      const char *db, const char *table_name,
+                      bool has_lock)
 {
   char key[MAX_DBKEY_LENGTH];
   uint key_length;
   TABLE *table;
   TABLE_SHARE *share;
 
-  mysql_mutex_assert_owner(&LOCK_open);
+  if (! has_lock)
+    mysql_mutex_lock(&LOCK_open);
+  else
+    mysql_mutex_assert_owner(&LOCK_open);
 
   DBUG_ASSERT(remove_type == TDC_RT_REMOVE_UNUSED ||
               thd->mdl_context.is_lock_owner(MDL_key::TABLE, db, table_name,
@@ -8779,6 +8775,9 @@ void tdc_remove_table(THD *thd, enum_tdc
     else
       (void) my_hash_delete(&table_def_cache, (uchar*) share);
   }
+
+  if (! has_lock)
+    mysql_mutex_unlock(&LOCK_open);
 }
 
 
@@ -8905,11 +8904,6 @@ static int alter_close_tables(ALTER_PART
   TABLE *table;
   DBUG_ENTER("alter_close_tables");
   /*
-    We must keep LOCK_open while manipulating with thd->open_tables.
-    Another thread may be working on it.
-  */
-  mysql_mutex_lock(&LOCK_open);
-  /*
     We can safely remove locks for all tables with the same name:
     later they will all be closed anyway in
     alter_partition_lock_handling().
@@ -8919,9 +8913,20 @@ static int alter_close_tables(ALTER_PART
     if (!strcmp(table->s->table_name.str, share->table_name.str) &&
 	!strcmp(table->s->db.str, share->db.str))
     {
+      /*
+        No need to take LOCK_thd_data to protect mysql_lock_remove(),
+        since mysql_lock_abort_for_thread() only aborts waiting
+        locks, and our lock is already granted.
+      */
       mysql_lock_remove(thd, thd->lock, table);
+      /*
+        Protect members of thd->open_tables concurrently used
+        in mysql_notify_thread_having_shared_lock().
+      */
+      mysql_mutex_lock(&thd->LOCK_thd_data);
       table->file->close();
       table->db_stat= 0;                        // Mark file closed
+      mysql_mutex_unlock(&thd->LOCK_thd_data);
       /*
         Ensure that we won't end up with a crippled table instance
         in the table cache if an error occurs before we reach
@@ -8930,10 +8935,10 @@ static int alter_close_tables(ALTER_PART
       */
       tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED,
                        table->s->db.str,
-                       table->s->table_name.str);
+                       table->s->table_name.str,
+                       FALSE);
     }
   }
-  mysql_mutex_unlock(&LOCK_open);
   DBUG_RETURN(0);
 }
 

=== modified file 'sql/sql_base.h'
--- a/sql/sql_base.h	2010-08-06 16:48:58 +0000
+++ b/sql/sql_base.h	2010-08-10 08:21:59 +0000
@@ -226,16 +226,16 @@ TABLE *open_performance_schema_table(THD
                                      Open_tables_state *backup);
 void close_performance_schema_table(THD *thd, Open_tables_state *backup);
 
-bool close_cached_tables(THD *thd, TABLE_LIST *tables, bool have_lock,
+bool close_cached_tables(THD *thd, TABLE_LIST *tables,
                          bool wait_for_refresh, ulong timeout);
 bool close_cached_connection_tables(THD *thd, bool wait_for_refresh,
-                                    LEX_STRING *connect_string,
-                                    bool have_lock = FALSE);
+                                    LEX_STRING *connect_string);
 void close_all_tables_for_name(THD *thd, TABLE_SHARE *share,
                                bool remove_from_locked_tables);
 OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *db, const char *wild);
 void tdc_remove_table(THD *thd, enum_tdc_remove_table_type remove_type,
-                      const char *db, const char *table_name);
+                      const char *db, const char *table_name,
+                      bool has_lock);
 bool tdc_open_view(THD *thd, TABLE_LIST *table_list, const char *alias,
                    char *cache_key, uint cache_key_length,
                    MEM_ROOT *mem_root, uint flags);

=== modified file 'sql/sql_class.cc'
--- a/sql/sql_class.cc	2010-07-29 12:32:11 +0000
+++ b/sql/sql_class.cc	2010-07-30 15:28:36 +0000
@@ -845,35 +845,6 @@ MYSQL_ERROR* THD::raise_condition(uint s
     }
   }
 
-  /*
-    If a continue handler is found, the error message will be cleared
-    by the stored procedures code.
-  */
-  if (!is_fatal_error && spcont &&
-      spcont->handle_condition(this, sql_errno, sqlstate, level, msg, &cond))
-  {
-    /*
-      Do not push any warnings, a handled error must be completely
-      silenced.
-    */
-    DBUG_RETURN(cond);
-  }
-
-  /* Un-handled conditions */
-
-  cond= raise_condition_no_handler(sql_errno, sqlstate, level, msg);
-  DBUG_RETURN(cond);
-}
-
-MYSQL_ERROR*
-THD::raise_condition_no_handler(uint sql_errno,
-                                const char* sqlstate,
-                                MYSQL_ERROR::enum_warning_level level,
-                                const char* msg)
-{
-  MYSQL_ERROR *cond= NULL;
-  DBUG_ENTER("THD::raise_condition_no_handler");
-
   query_cache_abort(&query_cache_tls);
 
   /* FIXME: broken special case */
@@ -886,6 +857,7 @@ THD::raise_condition_no_handler(uint sql
   cond= warning_info->push_warning(this, sql_errno, sqlstate, level, msg);
   DBUG_RETURN(cond);
 }
+
 extern "C"
 void *thd_alloc(MYSQL_THD thd, unsigned int size)
 {
@@ -1737,9 +1709,9 @@ bool select_send::send_result_set_metada
   return res;
 }
 
-void select_send::abort()
+void select_send::abort_result_set()
 {
-  DBUG_ENTER("select_send::abort");
+  DBUG_ENTER("select_send::abort_result_set");
 
   if (is_result_set_started && thd->spcont)
   {

=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h	2010-08-02 17:16:18 +0000
+++ b/sql/sql_class.h	2010-08-10 08:21:59 +0000
@@ -2806,23 +2806,6 @@ private:
                   MYSQL_ERROR::enum_warning_level level,
                   const char* msg);
 
-  /**
-    Raise a generic SQL condition, without activation any SQL condition
-    handlers.
-    This method is necessary to support the RESIGNAL statement,
-    which is allowed to bypass SQL exception handlers.
-    @param sql_errno the condition error number
-    @param sqlstate the condition SQLSTATE
-    @param level the condition level
-    @param msg the condition message text
-    @return The condition raised, or NULL
-  */
-  MYSQL_ERROR*
-  raise_condition_no_handler(uint sql_errno,
-                             const char* sqlstate,
-                             MYSQL_ERROR::enum_warning_level level,
-                             const char* msg);
-
 public:
   /** Overloaded to guard query/query_length fields */
   virtual void set_statement(Statement *stmt);
@@ -2993,7 +2976,7 @@ public:
     @retval TRUE      error, an error message is set
   */
   virtual bool check_simple_select() const;
-  virtual void abort() {}
+  virtual void abort_result_set() {}
   /*
     Cleanup instance of this class for next execution of a prepared
     statement/stored procedure.
@@ -3036,7 +3019,7 @@ public:
   bool send_data(List<Item> &items);
   bool send_eof();
   virtual bool check_simple_select() const { return FALSE; }
-  void abort();
+  void abort_result_set();
   virtual void cleanup();
 };
 
@@ -3128,7 +3111,7 @@ class select_insert :public select_resul
   virtual bool can_rollback_data() { return 0; }
   void send_error(uint errcode,const char *err);
   bool send_eof();
-  void abort();
+  virtual void abort_result_set();
   /* not implemented: select_insert is never re-used in prepared statements */
   void cleanup();
 };
@@ -3164,7 +3147,7 @@ public:
   void store_values(List<Item> &values);
   void send_error(uint errcode,const char *err);
   bool send_eof();
-  void abort();
+  virtual void abort_result_set();
   virtual bool can_rollback_data() { return 1; }
 
   // Needed for access from local class MY_HOOKS in prepare(), since thd is proteted.
@@ -3498,7 +3481,7 @@ public:
   {
     return deleted;
   }
-  virtual void abort();
+  virtual void abort_result_set();
 };
 
 
@@ -3549,7 +3532,7 @@ public:
   {
     return updated;
   }
-  virtual void abort();
+  virtual void abort_result_set();
 };
 
 class my_var : public Sql_alloc  {

=== modified file 'sql/sql_delete.cc'
--- a/sql/sql_delete.cc	2010-07-19 09:21:24 +0000
+++ b/sql/sql_delete.cc	2010-07-28 11:17:19 +0000
@@ -770,9 +770,9 @@ void multi_delete::send_error(uint errco
 }
 
 
-void multi_delete::abort()
+void multi_delete::abort_result_set()
 {
-  DBUG_ENTER("multi_delete::abort");
+  DBUG_ENTER("multi_delete::abort_result_set");
 
   /* the error was handled or nothing deleted and no side effects return */
   if (error_handled ||

=== modified file 'sql/sql_error.cc'
--- a/sql/sql_error.cc	2010-07-20 11:57:02 +0000
+++ b/sql/sql_error.cc	2010-07-30 15:28:36 +0000
@@ -494,14 +494,6 @@ void Warning_info::clear_warning_info(ul
   m_current_row_for_warning= 1; /* Start counting from the first row */
 }
 
-void Warning_info::reserve_space(THD *thd, uint count)
-{
-  /* Make room for count conditions */
-  while ((m_warn_list.elements > 0) &&
-        ((m_warn_list.elements + count) > thd->variables.max_error_count))
-    m_warn_list.pop();
-}
-
 /**
   Append warnings only if the original contents of the routine
   warning info was replaced.

=== modified file 'sql/sql_error.h'
--- a/sql/sql_error.h	2010-03-31 14:05:33 +0000
+++ b/sql/sql_error.h	2010-07-30 15:28:36 +0000
@@ -153,8 +153,8 @@ private:
   Representation of a SQL condition.
   A SQL condition can be a completion condition (note, warning),
   or an exception condition (error, not found).
-  @note This class is named MYSQL_ERROR instead of SQL_condition for historical reasons,
-  to facilitate merging code with previous releases.
+  @note This class is named MYSQL_ERROR instead of SQL_condition for
+  historical reasons, to facilitate merging code with previous releases.
 */
 class MYSQL_ERROR : public Sql_alloc
 {
@@ -471,18 +471,6 @@ public:
 
   ulong statement_warn_count() const { return m_statement_warn_count; }
 
-  /**
-    Reserve some space in the condition area.
-    This is a privileged operation, reserved for the RESIGNAL implementation,
-    as only the RESIGNAL statement is allowed to remove conditions from
-    the condition area.
-    For other statements, new conditions are not added to the condition
-    area once the condition area is full.
-    @param thd The current thread
-    @param count The number of slots to reserve
-  */
-  void reserve_space(THD *thd, uint count);
-
   /** Add a new condition to the current list. */
   MYSQL_ERROR *push_warning(THD *thd,
                             uint sql_errno, const char* sqlstate,

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2010-07-27 10:25:53 +0000
+++ b/sql/sql_insert.cc	2010-08-09 18:33:47 +0000
@@ -3399,9 +3399,9 @@ bool select_insert::send_eof()
   DBUG_RETURN(0);
 }
 
-void select_insert::abort() {
+void select_insert::abort_result_set() {
 
-  DBUG_ENTER("select_insert::abort");
+  DBUG_ENTER("select_insert::abort_result_set");
   /*
     If the creation of the table failed (due to a syntax error, for
     example), no table will have been opened and therefore 'table'
@@ -3600,11 +3600,9 @@ static TABLE *create_table_from_items(TH
         */
         if (open_table(thd, create_table, thd->mem_root, &ot_ctx))
         {
-          mysql_mutex_lock(&LOCK_open);
           quick_rm_table(create_info->db_type, create_table->db,
                          table_case_name(create_info, create_table->table_name),
                          0);
-          mysql_mutex_unlock(&LOCK_open);
         }
         else
           table= create_table->table;
@@ -3938,9 +3936,9 @@ bool select_create::send_eof()
 }
 
 
-void select_create::abort()
+void select_create::abort_result_set()
 {
-  DBUG_ENTER("select_create::abort");
+  DBUG_ENTER("select_create::abort_result_set");
 
   /*
     In select_insert::abort() we roll back the statement, including
@@ -3958,7 +3956,7 @@ void select_create::abort()
     log state.
   */
   tmp_disable_binlog(thd);
-  select_insert::abort();
+  select_insert::abort_result_set();
   thd->transaction.stmt.modified_non_trans_table= FALSE;
   reenable_binlog(thd);
   /* possible error of writing binary log is ignored deliberately */

=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc	2010-08-02 17:16:18 +0000
+++ b/sql/sql_parse.cc	2010-08-10 08:21:59 +0000
@@ -1794,11 +1794,9 @@ static bool flush_tables_with_read_lock(
        table_list= table_list->next_global)
   {
     /* Request removal of table from cache. */
-    mysql_mutex_lock(&LOCK_open);
     tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED,
                      table_list->db,
-                     table_list->table_name);
-    mysql_mutex_unlock(&LOCK_open);
+                     table_list->table_name, FALSE);
 
     /* Skip views and temporary tables. */
     table_list->required_type= FRMTYPE_TABLE; /* Don't try to flush views. */
@@ -3395,7 +3393,7 @@ end_with_restore_list:
       res|= thd->is_error();
       MYSQL_MULTI_DELETE_DONE(res, del_result->num_deleted());
       if (res)
-        del_result->abort();
+        del_result->abort_result_set();
       delete del_result;
     }
     else
@@ -3418,7 +3416,7 @@ end_with_restore_list:
       /* So that DROP TEMPORARY TABLE gets to binlog at commit/rollback */
       thd->variables.option_bits|= OPTION_KEEP_LOG;
     }
-    /* DDL and binlog write order protected by LOCK_open */
+    /* DDL and binlog write order are protected by metadata locks. */
     res= mysql_rm_table(thd, first_table, lex->drop_if_exists,
 			lex->drop_temporary);
   }
@@ -4865,7 +4863,7 @@ static bool execute_sqlcom_select(THD *t
                      ER_YES, str.ptr());
       }
       if (res)
-        result->abort();
+        result->abort_result_set();
       else
         result->send_eof();
       delete result;
@@ -6858,10 +6856,11 @@ bool reload_acl_and_cache(THD *thd, ulon
       tmp_write_to_binlog= 0;
       if (thd->global_read_lock.lock_global_read_lock(thd))
 	return 1;                               // Killed
-      if (close_cached_tables(thd, tables, FALSE, ((options & REFRESH_FAST) ?
-                              FALSE : TRUE), thd->variables.lock_wait_timeout))
-          result= 1;
-      
+      if (close_cached_tables(thd, tables,
+                              ((options & REFRESH_FAST) ?  FALSE : TRUE),
+                              thd->variables.lock_wait_timeout))
+        result= 1;
+
       if (thd->global_read_lock.make_global_read_lock_block_commit(thd)) // Killed
       {
         /* Don't leave things in a half-locked state */
@@ -6898,10 +6897,10 @@ bool reload_acl_and_cache(THD *thd, ulon
         }
       }
 
-      if (close_cached_tables(thd, tables, FALSE, ((options & REFRESH_FAST) ?
-                              FALSE : TRUE),
+      if (close_cached_tables(thd, tables,
+                              ((options & REFRESH_FAST) ?  FALSE : TRUE),
                               (thd ? thd->variables.lock_wait_timeout :
-                                     LONG_TIMEOUT)))
+                               LONG_TIMEOUT)))
         result= 1;
     }
     my_dbopt_cleanup();

=== modified file 'sql/sql_rename.cc'
--- a/sql/sql_rename.cc	2010-07-01 13:53:46 +0000
+++ b/sql/sql_rename.cc	2010-08-09 18:33:47 +0000
@@ -147,13 +147,15 @@ bool mysql_rename_tables(THD *thd, TABLE
                        MYSQL_OPEN_SKIP_TEMPORARY))
     goto err;
 
-  mysql_mutex_lock(&LOCK_open);
-
   for (ren_table= table_list; ren_table; ren_table= ren_table->next_local)
     tdc_remove_table(thd, TDC_RT_REMOVE_ALL, ren_table->db,
-                     ren_table->table_name);
+                     ren_table->table_name, FALSE);
 
   error=0;
+  /*
+    An exclusive lock on table names is satisfactory to ensure
+    no other thread accesses this table.
+  */
   if ((ren_table=rename_tables(thd,table_list,0)))
   {
     /* Rename didn't succeed;  rename back the tables in reverse order */
@@ -175,17 +177,6 @@ bool mysql_rename_tables(THD *thd, TABLE
 
     error= 1;
   }
-  /*
-    An exclusive lock on table names is satisfactory to ensure
-    no other thread accesses this table.
-    However, NDB assumes that handler::rename_tables is called under
-    LOCK_open. And it indeed is, from ALTER TABLE.
-    TODO: remove this limitation.
-    We still should unlock LOCK_open as early as possible, to provide
-    higher concurrency - query_cache_invalidate can take minutes to
-    complete.
-  */
-  mysql_mutex_unlock(&LOCK_open);
 
   if (!silent && !error)
   {

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc	2010-07-29 12:32:11 +0000
+++ b/sql/sql_select.cc	2010-07-30 15:13:38 +0000
@@ -299,7 +299,7 @@ bool handle_select(THD *thd, LEX *lex, s
 		     thd->is_error()));
   res|= thd->is_error();
   if (unlikely(res))
-    result->abort();
+    result->abort_result_set();
 
   MYSQL_SELECT_DONE((int) res, (ulong) thd->limit_found_rows);
   DBUG_RETURN(res);

=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc	2010-07-29 12:32:11 +0000
+++ b/sql/sql_show.cc	2010-08-09 18:33:47 +0000
@@ -7657,7 +7657,7 @@ static bool show_create_trigger_impl(THD
 */
 
 static
-TABLE_LIST *get_trigger_table_impl(THD *thd, const sp_name *trg_name)
+TABLE_LIST *get_trigger_table(THD *thd, const sp_name *trg_name)
 {
   char trn_path_buff[FN_REFLEN];
   LEX_STRING trn_path= { trn_path_buff, 0 };
@@ -7694,39 +7694,6 @@ TABLE_LIST *get_trigger_table_impl(THD *
   return table;
 }
 
-/**
-  Read TRN and TRG files to obtain base table name for the specified
-  trigger name and construct TABE_LIST object for the base table. Acquire
-  LOCK_open when doing this.
-
-  @param thd      Thread context.
-  @param trg_name Trigger name.
-
-  @return TABLE_LIST object corresponding to the base table.
-*/
-
-static
-TABLE_LIST *get_trigger_table(THD *thd, const sp_name *trg_name)
-{
-  /* Acquire LOCK_open (stop the server). */
-
-  mysql_mutex_lock(&LOCK_open);
-
-  /*
-    Load base table name from the TRN-file and create TABLE_LIST object.
-  */
-
-  TABLE_LIST *lst= get_trigger_table_impl(thd, trg_name);
-
-  /* Release LOCK_open (continue the server). */
-
-  mysql_mutex_unlock(&LOCK_open);
-
-  /* That's it. */
-
-  return lst;
-}
-
 
 /**
   SHOW CREATE TRIGGER high-level implementation.

=== modified file 'sql/sql_signal.cc'
--- a/sql/sql_signal.cc	2010-05-14 18:11:25 +0000
+++ b/sql/sql_signal.cc	2010-07-30 15:28:36 +0000
@@ -499,18 +499,6 @@ bool Resignal_statement::execute(THD *th
   }
 
   /* RESIGNAL with signal_value */
-
-  /* Make room for 2 conditions */
-  thd->warning_info->reserve_space(thd, 2);
-
-  MYSQL_ERROR *raised= NULL;
-  raised= thd->raise_condition_no_handler(signaled->get_sql_errno(),
-                                          signaled->get_sqlstate(),
-                                          signaled->get_level(),
-                                          signaled->get_message_text());
-  if (raised)
-    raised->copy_opt_attributes(signaled);
-
   result= raise_condition(thd, signaled);
 
   DBUG_RETURN(result);

=== modified file 'sql/sql_table.cc'
--- a/sql/sql_table.cc	2010-07-29 12:32:11 +0000
+++ b/sql/sql_table.cc	2010-08-09 18:33:47 +0000
@@ -1723,7 +1723,6 @@ bool mysql_write_frm(ALTER_PARTITION_PAR
       completing this we write a new phase to the log entry that will
       deactivate it.
     */
-    mysql_mutex_lock(&LOCK_open);
     if (mysql_file_delete(key_file_frm, frm_name, MYF(MY_WME)) ||
 #ifdef WITH_PARTITION_STORAGE_ENGINE
         lpt->table->file->ha_create_handler_files(path, shadow_path,
@@ -1779,7 +1778,6 @@ bool mysql_write_frm(ALTER_PARTITION_PAR
 #endif
 
 err:
-    mysql_mutex_unlock(&LOCK_open);
 #ifdef WITH_PARTITION_STORAGE_ENGINE
     deactivate_ddl_log_entry(part_info->frm_log_entry->entry_pos);
     part_info->frm_log_entry= NULL;
@@ -1955,10 +1953,11 @@ int mysql_rm_table_part2(THD *thd, TABLE
       if (lock_table_names(thd, tables, NULL, thd->variables.lock_wait_timeout,
                            MYSQL_OPEN_SKIP_TEMPORARY))
         DBUG_RETURN(1);
-      mysql_mutex_lock(&LOCK_open);
       for (table= tables; table; table= table->next_local)
-        tdc_remove_table(thd, TDC_RT_REMOVE_ALL, table->db, table->table_name);
-      mysql_mutex_unlock(&LOCK_open);
+      {
+        tdc_remove_table(thd, TDC_RT_REMOVE_ALL, table->db, table->table_name,
+                         FALSE);
+      }
     }
     else
     {
@@ -2104,14 +2103,9 @@ int mysql_rm_table_part2(THD *thd, TABLE
                                         table->internal_tmp_table ?
                                         FN_IS_TMP : 0);
     }
-    /*
-      TODO: Investigate what should be done to remove this lock completely.
-            Is exclusive meta-data lock enough ?
-    */
     DEBUG_SYNC(thd, "rm_table_part2_before_delete_table");
     DBUG_EXECUTE_IF("sleep_before_part2_delete_table",
                     my_sleep(100000););
-    mysql_mutex_lock(&LOCK_open);
     if (drop_temporary ||
         ((access(path, F_OK) &&
           ha_create_table_from_engine(thd, db, alias)) ||
@@ -2131,8 +2125,7 @@ int mysql_rm_table_part2(THD *thd, TABLE
       char *end;
       /*
         Cannot use the db_type from the table, since that might have changed
-        while waiting for the exclusive name lock. We are under LOCK_open,
-        so reading from the frm-file is safe.
+        while waiting for the exclusive name lock.
       */
       if (frm_db_type == DB_TYPE_UNKNOWN)
       {
@@ -2173,7 +2166,6 @@ int mysql_rm_table_part2(THD *thd, TABLE
         error|= new_error;
       }
     }
-    mysql_mutex_unlock(&LOCK_open);
     if (error)
     {
       if (wrong_tables.length())
@@ -4053,7 +4045,6 @@ bool mysql_create_table_no_lock(THD *thd
     goto err;
   }
 
-  mysql_mutex_lock(&LOCK_open);
   if (!internal_tmp_table && !(create_info->options & HA_LEX_CREATE_TMP_TABLE))
   {
     if (!access(path,F_OK))
@@ -4061,7 +4052,7 @@ bool mysql_create_table_no_lock(THD *thd
       if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
         goto warn;
       my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
-      goto unlock_and_end;
+      goto err;
     }
     /*
       We don't assert here, but check the result, because the table could be
@@ -4071,11 +4062,14 @@ bool mysql_create_table_no_lock(THD *thd
       Then she could create the table. This case is pretty obscure and
       therefore we don't introduce a new error message only for it.
     */
+    mysql_mutex_lock(&LOCK_open);
     if (get_cached_table_share(db, table_name))
     {
+      mysql_mutex_unlock(&LOCK_open);
       my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
-      goto unlock_and_end;
+      goto err;
     }
+    mysql_mutex_unlock(&LOCK_open);
   }
 
   /*
@@ -4083,7 +4077,7 @@ bool mysql_create_table_no_lock(THD *thd
     exist in any storage engine. In such a case it should
     be discovered and the error ER_TABLE_EXISTS_ERROR be returned
     unless user specified CREATE TABLE IF EXISTS
-    The LOCK_open mutex has been locked to make sure no
+    An exclusive metadata lock ensures that no
     one else is attempting to discover the table. Since
     it's not on disk as a frm file, no one could be using it!
   */
@@ -4104,12 +4098,12 @@ bool mysql_create_table_no_lock(THD *thd
         if (create_if_not_exists)
           goto warn;
         my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
-        goto unlock_and_end;
+        goto err;
         break;
       default:
         DBUG_PRINT("info", ("error: %u from storage engine", retcode));
         my_error(retcode, MYF(0),table_name);
-        goto unlock_and_end;
+        goto err;
     }
   }
 
@@ -4142,7 +4136,7 @@ bool mysql_create_table_no_lock(THD *thd
       if (test_if_data_home_dir(dirpath))
       {
         my_error(ER_WRONG_ARGUMENTS, MYF(0), "DATA DIRECTORY");
-        goto unlock_and_end;
+        goto err;
       }
     }
     if (create_info->index_file_name)
@@ -4151,7 +4145,7 @@ bool mysql_create_table_no_lock(THD *thd
       if (test_if_data_home_dir(dirpath))
       {
         my_error(ER_WRONG_ARGUMENTS, MYF(0), "INDEX DIRECTORY");
-        goto unlock_and_end;
+        goto err;
       }
     }
   }
@@ -4159,7 +4153,7 @@ bool mysql_create_table_no_lock(THD *thd
 #ifdef WITH_PARTITION_STORAGE_ENGINE
   if (check_partition_dirs(thd->lex->part_info))
   {
-    goto unlock_and_end;
+    goto err;
   }
 #endif /* WITH_PARTITION_STORAGE_ENGINE */
 
@@ -4182,7 +4176,7 @@ bool mysql_create_table_no_lock(THD *thd
   if (rea_create_table(thd, path, db, table_name,
                        create_info, alter_info->create_list,
                        key_count, key_info_buffer, file))
-    goto unlock_and_end;
+    goto err;
 
   if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
   {
@@ -4190,15 +4184,12 @@ bool mysql_create_table_no_lock(THD *thd
     if (!(open_temporary_table(thd, path, db, table_name, 1)))
     {
       (void) rm_temporary_table(create_info->db_type, path);
-      goto unlock_and_end;
+      goto err;
     }
     thd->thread_specific_used= TRUE;
   }
 
   error= FALSE;
-unlock_and_end:
-  mysql_mutex_unlock(&LOCK_open);
-
 err:
   thd_proc_info(thd, "After create");
   delete file;
@@ -4210,7 +4201,7 @@ warn:
                       ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
                       alias);
   create_info->table_existed= 1;		// Mark that table existed
-  goto unlock_and_end;
+  goto err;
 }
 
 
@@ -4459,20 +4450,19 @@ static int prepare_for_repair(THD *thd, 
 
     hash_value= my_calc_hash(&table_def_cache, (uchar*) key, key_length);
     mysql_mutex_lock(&LOCK_open);
-    if (!(share= (get_table_share(thd, table_list, key, key_length, 0,
-                                  &error, hash_value))))
-    {
-      mysql_mutex_unlock(&LOCK_open);
+    share= get_table_share(thd, table_list, key, key_length, 0,
+                           &error, hash_value);
+    mysql_mutex_unlock(&LOCK_open);
+    if (share == NULL)
       DBUG_RETURN(0);				// Can't open frm file
-    }
 
     if (open_table_from_share(thd, share, "", 0, 0, 0, &tmp_table, FALSE))
     {
+      mysql_mutex_lock(&LOCK_open);
       release_table_share(share);
       mysql_mutex_unlock(&LOCK_open);
       DBUG_RETURN(0);                           // Out of memory
     }
-    mysql_mutex_unlock(&LOCK_open);
     table= &tmp_table;
   }
 
@@ -5136,10 +5126,8 @@ send_result_message:
       }
       else if (open_for_modify || fatal_error)
       {
-        mysql_mutex_lock(&LOCK_open);
         tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED,
-                         table->db, table->table_name);
-        mysql_mutex_unlock(&LOCK_open);
+                         table->db, table->table_name, FALSE);
         /*
           May be something modified. Consequently, we have to
           invalidate the query cache.
@@ -6775,7 +6763,6 @@ bool mysql_alter_table(THD *thd,char *ne
       else
       {
         *fn_ext(new_name)=0;
-        mysql_mutex_lock(&LOCK_open);
         if (mysql_rename_table(old_db_type,db,table_name,new_db,new_alias, 0))
           error= -1;
         else if (Table_triggers_list::change_table_name(thd, db, table_name,
@@ -6785,7 +6772,6 @@ bool mysql_alter_table(THD *thd,char *ne
                                     table_name, 0);
           error= -1;
         }
-        mysql_mutex_unlock(&LOCK_open);
       }
     }
 
@@ -7404,7 +7390,6 @@ bool mysql_alter_table(THD *thd,char *ne
     /* This type cannot happen in regular ALTER. */
     new_db_type= old_db_type= NULL;
   }
-  mysql_mutex_lock(&LOCK_open);
   if (mysql_rename_table(old_db_type, db, table_name, db, old_name,
                          FN_TO_IS_TMP))
   {
@@ -7431,8 +7416,6 @@ bool mysql_alter_table(THD *thd,char *ne
   if (! error)
     (void) quick_rm_table(old_db_type, db, old_name, FN_IS_TMP);
 
-  mysql_mutex_unlock(&LOCK_open);
-
   if (error)
   {
     /* This shouldn't happen. But let us play it safe. */

=== modified file 'sql/sql_trigger.cc'
--- a/sql/sql_trigger.cc	2010-07-27 10:25:53 +0000
+++ b/sql/sql_trigger.cc	2010-08-09 18:33:47 +0000
@@ -394,9 +394,7 @@ bool mysql_create_or_drop_trigger(THD *t
   /*
     We don't want perform our operations while global read lock is held
     so we have to wait until its end and then prevent it from occurring
-    again until we are done, unless we are under lock tables. (Acquiring
-    LOCK_open is not enough because global read lock is held without holding
-    LOCK_open).
+    again until we are done, unless we are under lock tables.
   */
   if (!thd->locked_tables_mode &&
       thd->global_read_lock.wait_if_global_read_lock(thd, FALSE, TRUE))
@@ -516,11 +514,9 @@ bool mysql_create_or_drop_trigger(THD *t
       goto end;
   }
 
-  mysql_mutex_lock(&LOCK_open);
   result= (create ?
            table->triggers->create_trigger(thd, tables, &stmt_query):
            table->triggers->drop_trigger(thd, tables, &stmt_query));
-  mysql_mutex_unlock(&LOCK_open);
 
   if (result)
     goto end;
@@ -1680,9 +1676,6 @@ bool add_table_for_trigger(THD *thd,
   @param db       schema for table
   @param name     name for table
 
-  @note
-    The calling thread should hold the LOCK_open mutex;
-
   @retval
     False   success
   @retval
@@ -1912,14 +1905,10 @@ bool Table_triggers_list::change_table_n
 
   /*
     This method interfaces the mysql server code protected by
-    either LOCK_open mutex or with an exclusive metadata lock.
-    In the future, only an exclusive metadata lock will be enough.
+    an exclusive metadata lock.
   */
-#ifndef DBUG_OFF
-  if (thd->mdl_context.is_lock_owner(MDL_key::TABLE, db, old_table,
-                                     MDL_EXCLUSIVE))
-    mysql_mutex_assert_owner(&LOCK_open);
-#endif
+  DBUG_ASSERT(thd->mdl_context.is_lock_owner(MDL_key::TABLE, db, old_table,
+                                             MDL_EXCLUSIVE));
 
   DBUG_ASSERT(my_strcasecmp(table_alias_charset, db, new_db) ||
               my_strcasecmp(table_alias_charset, old_table, new_table));

=== modified file 'sql/sql_truncate.cc'
--- a/sql/sql_truncate.cc	2010-07-13 08:39:24 +0000
+++ b/sql/sql_truncate.cc	2010-08-09 18:33:47 +0000
@@ -310,10 +310,8 @@ static bool open_and_lock_table_for_trun
           upgrade_shared_lock_to_exclusive(table_ref->mdl_request.ticket,
                                            timeout))
         DBUG_RETURN(TRUE);
-      mysql_mutex_lock(&LOCK_open);
       tdc_remove_table(thd, TDC_RT_REMOVE_ALL, table_ref->db,
-                       table_ref->table_name);
-      mysql_mutex_unlock(&LOCK_open);
+                       table_ref->table_name, FALSE);
     }
   }
   else

=== modified file 'sql/sql_update.cc'
--- a/sql/sql_update.cc	2010-07-19 09:21:24 +0000
+++ b/sql/sql_update.cc	2010-07-28 11:17:19 +0000
@@ -1261,7 +1261,7 @@ bool mysql_multi_update(THD *thd,
   {
     /* If we had a another error reported earlier then this will be ignored */
     (*result)->send_error(ER_UNKNOWN_ERROR, ER(ER_UNKNOWN_ERROR));
-    (*result)->abort();
+    (*result)->abort_result_set();
   }
   thd->abort_on_warning= 0;
   DBUG_RETURN(res);
@@ -1861,7 +1861,7 @@ void multi_update::send_error(uint errco
 }
 
 
-void multi_update::abort()
+void multi_update::abort_result_set()
 {
   /* the error was handled or nothing deleted and no side effects return */
   if (error_handled ||

=== modified file 'sql/sql_view.cc'
--- a/sql/sql_view.cc	2010-07-01 13:53:46 +0000
+++ b/sql/sql_view.cc	2010-08-09 18:33:47 +0000
@@ -658,7 +658,6 @@ bool mysql_create_view(THD *thd, TABLE_L
     goto err;
   }
 
-  mysql_mutex_lock(&LOCK_open);
   res= mysql_register_view(thd, view, mode);
 
   if (mysql_bin_log.is_open())
@@ -705,7 +704,6 @@ bool mysql_create_view(THD *thd, TABLE_L
       res= TRUE;
   }
 
-  mysql_mutex_unlock(&LOCK_open);
   if (mode != VIEW_CREATE_NEW)
     query_cache_invalidate3(thd, view, 0);
   thd->global_read_lock.start_waiting_global_read_lock(thd);
@@ -1656,10 +1654,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIS
                        MYSQL_OPEN_SKIP_TEMPORARY))
     DBUG_RETURN(TRUE);
 
-  mysql_mutex_lock(&LOCK_open);
   for (view= views; view; view= view->next_local)
   {
-    TABLE_SHARE *share;
     frm_type_enum type= FRMTYPE_ERROR;
     build_table_filename(path, sizeof(path) - 1,
                          view->db, view->table_name, reg_ext, 0);
@@ -1698,16 +1694,12 @@ bool mysql_drop_view(THD *thd, TABLE_LIS
     some_views_deleted= TRUE;
 
     /*
-      For a view, there is only one table_share object which should never
-      be used outside of LOCK_open
+      For a view, there is a TABLE_SHARE object, but its
+      ref_count never goes above 1. Remove it from the table
+      definition cache, in case the view was cached.
     */
-    if ((share= get_cached_table_share(view->db, view->table_name)))
-    {
-      DBUG_ASSERT(share->ref_count == 0);
-      share->ref_count++;
-      share->version= 0;
-      release_table_share(share);
-    }
+    tdc_remove_table(thd, TDC_RT_REMOVE_ALL, view->db, view->table_name,
+                     FALSE);
     query_cache_invalidate3(thd, view, 0);
     sp_cache_invalidate();
   }
@@ -1732,8 +1724,6 @@ bool mysql_drop_view(THD *thd, TABLE_LIS
       something_wrong= 1;
   }
 
-  mysql_mutex_unlock(&LOCK_open);
-  
   if (something_wrong)
   {
     DBUG_RETURN(TRUE);

=== modified file 'sql/sys_vars.cc'
--- a/sql/sys_vars.cc	2010-08-02 17:16:18 +0000
+++ b/sql/sys_vars.cc	2010-08-10 08:21:59 +0000
@@ -1492,7 +1492,7 @@ static bool fix_read_only(sys_var *self,
     can cause to wait on a read lock, it's required for the client application
     to unlock everything, and acceptable for the server to wait on all locks.
   */
-  if ((result= close_cached_tables(thd, NULL, FALSE, TRUE,
+  if ((result= close_cached_tables(thd, NULL, TRUE,
                                    thd->variables.lock_wait_timeout)))
     goto end_with_read_lock;
 

=== modified file 'storage/innobase/CMakeLists.txt'
--- a/storage/innobase/CMakeLists.txt	2010-07-21 14:22:29 +0000
+++ b/storage/innobase/CMakeLists.txt	2010-08-06 12:59:38 +0000
@@ -43,7 +43,7 @@ ENDIF()
 # Enable InnoDB's UNIV_DEBUG if MySQL's WITH_DEBUG[_FULL] is defined
 # enable when this bug is resolved:
 # Bug#54861 Additional connections not handled properly in mtr --embedded
-#IF(WITH_DEBUG OR WITH_DEBUG_FULL)
+#IF(WITH_DEBUG)
 #  ADD_DEFINITIONS("-DUNIV_DEBUG")
 #ENDIF()
 


Attachment: [text/bzr-bundle] bzr/kostja@sun.com-20100810082159-287azv29xd7s8cvj.bundle
Thread
bzr push into mysql-5.5-bugfixing branch (kostja:3092 to 3093)Konstantin Osipov10 Aug