summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUILD/SETUP.sh.rej19
-rw-r--r--config/ac-macros/zlib.m413
-rw-r--r--configure.in4
-rw-r--r--configure.in.rej299
-rw-r--r--include/my_global.h.rej17
-rw-r--r--include/my_pthread.h.rej80
-rw-r--r--mysql-test/suite/row_lock/include/row_lock.inc83
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_big_tab.inc94
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_big_tab_1.inc93
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_big_tab_2.inc93
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_trig.inc96
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_view.inc89
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_view_mix.inc92
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_view_storedp.inc126
-rw-r--r--mysql-test/suite/row_lock/include/row_lock_view_trig.inc99
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_1.result142
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_2.result32
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_3.result32
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_4.result142
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_5.result32
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_big_tab.result97
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_1.result145
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_2.result113
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_trig_1.result151
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_trig_2.result37
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_1.result34
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_2.result40
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_1.result48
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_2.result40
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_1.result312
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_2.result47
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_1.result183
-rw-r--r--mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_2.result38
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_1.result139
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_2.result31
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_3.result30
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_4.result139
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_5.result30
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_big_tab.result177
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_1.result357
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_2.result255
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_trig_1.result148
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_trig_2.result35
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_1.result194
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_2.result200
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_1.result169
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_2.result38
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_1.result309
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_2.result46
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_1.result180
-rw-r--r--mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_2.result36
-rw-r--r--mysql-test/suite/row_lock/readme.txt9
-rw-r--r--mysql-test/suite/row_lock/summary_of_sel_test.txt36
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_1.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_2.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_3.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_4.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_5.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_big_tab.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_1.test10
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_2.test10
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_trig_1.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_trig_2.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_1.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_2.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_1.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_2.test10
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_1.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_2.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_1.test9
-rw-r--r--mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_2.test9
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_1.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_2.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_3.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_4.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_5.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_big_tab.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_1.test7
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_2.test7
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_trig_1.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_trig_2.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_1.test7
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_2.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_1.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_2.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_1.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_2.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_1.test6
-rw-r--r--mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_2.test6
-rw-r--r--mysys/thr_alarm.c.rej220
-rw-r--r--scripts/make_binary_distribution.sh8
-rw-r--r--support-files/mysql.spec.sh175
-rw-r--r--zlib/Makefile.am3
93 files changed, 5450 insertions, 752 deletions
diff --git a/BUILD/SETUP.sh.rej b/BUILD/SETUP.sh.rej
deleted file mode 100644
index ccbcaa4404f..00000000000
--- a/BUILD/SETUP.sh.rej
+++ /dev/null
@@ -1,19 +0,0 @@
-***************
-*** 39,46 ****
- c_warnings="$global_warnings -Wunused"
- cxx_warnings="$global_warnings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor"
-
-! alpha_cflags="-mcpu=ev6 -Wa,-mev6" # Not used yet
-! pentium_cflags="-mcpu=pentiumpro"
- sparc_cflags=""
-
- # be as fast as we can be without losing our ability to backtrace
---- 39,46 ----
- c_warnings="$global_warnings -Wunused"
- cxx_warnings="$global_warnings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor"
-
-! #alpha_cflags="-mcpu=ev6 -Wa,-mev6" # Not used yet
-! #pentium_cflags="-mcpu=pentiumpro"
- sparc_cflags=""
-
- # be as fast as we can be without losing our ability to backtrace
diff --git a/config/ac-macros/zlib.m4 b/config/ac-macros/zlib.m4
index a01d13937ff..74de715e424 100644
--- a/config/ac-macros/zlib.m4
+++ b/config/ac-macros/zlib.m4
@@ -10,16 +10,25 @@ AC_SUBST([zlib_dir])
mysql_cv_compress="yes"
])
-dnl Auxiliary macro to check for zlib at given path
+dnl Auxiliary macro to check for zlib at given path.
+dnl We are strict with the server, as "archive" engine
+dnl needs zlibCompileFlags(), but for client only we
+dnl are less strict, and take the zlib we find.
AC_DEFUN([MYSQL_CHECK_ZLIB_DIR], [
save_CPPFLAGS="$CPPFLAGS"
save_LIBS="$LIBS"
CPPFLAGS="$ZLIB_INCLUDES $CPPFLAGS"
LIBS="$LIBS $ZLIB_LIBS"
+if test X"$with_server" = Xno
+then
+ zlibsym=zlibVersion
+else
+ zlibsym=zlibCompileFlags
+fi
AC_CACHE_VAL([mysql_cv_compress],
[AC_TRY_LINK([#include <zlib.h>],
- [return zlibCompileFlags();],
+ [return $zlibsym();],
[mysql_cv_compress="yes"
AC_MSG_RESULT([ok])],
[mysql_cv_compress="no"])
diff --git a/configure.in b/configure.in
index 9b0505a594f..bcf561c02ef 100644
--- a/configure.in
+++ b/configure.in
@@ -1601,9 +1601,9 @@ fi
# dlopen, dlerror
case "$with_mysqld_ldflags " in
- *"-static "*)
+ *"-all-static "*)
# No need to check for dlopen when mysqld is linked with
- # -all-static or -static as it won't be able to load any functions.
+ # -all-static as it won't be able to load any functions.
# NOTE! It would be better if it was possible to test if dlopen
# can be used, but a good way to test it couldn't be found
diff --git a/configure.in.rej b/configure.in.rej
deleted file mode 100644
index 46fbf83b198..00000000000
--- a/configure.in.rej
+++ /dev/null
@@ -1,299 +0,0 @@
-***************
-*** 388,402 ****
- if expr "$target_os" : "[[Ll]]inux.*" > /dev/null
- then
- MYSQLD_DEFAULT_SWITCHES="--skip-locking"
-! IS_LINUX="true"
- AC_MSG_RESULT("yes");
- else
- MYSQLD_DEFAULT_SWITCHES=""
-! IS_LINUX="false"
- AC_MSG_RESULT("no");
- fi
- AC_SUBST(MYSQLD_DEFAULT_SWITCHES)
-! AC_SUBST(IS_LINUX)
-
- dnl Find paths to some shell programs
- AC_PATH_PROG(LN, ln, ln)
---- 388,403 ----
- if expr "$target_os" : "[[Ll]]inux.*" > /dev/null
- then
- MYSQLD_DEFAULT_SWITCHES="--skip-locking"
-! TARGET_LINUX="true"
- AC_MSG_RESULT("yes");
-+ AC_DEFINE([TARGET_OS_LINUX], [1], [Whether we build for Linux])
- else
- MYSQLD_DEFAULT_SWITCHES=""
-! TARGET_LINUX="false"
- AC_MSG_RESULT("no");
- fi
- AC_SUBST(MYSQLD_DEFAULT_SWITCHES)
-! AC_SUBST(TARGET_LINUX)
-
- dnl Find paths to some shell programs
- AC_PATH_PROG(LN, ln, ln)
-***************
-*** 576,582 ****
- # (this is true on the MySQL build machines to avoid NSS problems)
- #
-
-! if test "$IS_LINUX" = "true" -a "$static_nss" = ""
- then
- tmp=`nm /usr/lib/libc.a | grep _nss_files_getaliasent_r`
- if test -n "$tmp"
---- 577,583 ----
- # (this is true on the MySQL build machines to avoid NSS problems)
- #
-
-! if test "$TARGET_LINUX" = "true" -a "$static_nss" = ""
- then
- tmp=`nm /usr/lib/libc.a | grep _nss_files_getaliasent_r`
- if test -n "$tmp"
-***************
-*** 827,833 ****
- ])
- AC_SUBST(WRAPLIBS)
-
-! if test "$IS_LINUX" = "true"; then
- AC_MSG_CHECKING([for atomic operations])
-
- AC_LANG_SAVE
---- 828,834 ----
- ])
- AC_SUBST(WRAPLIBS)
-
-! if test "$TARGET_LINUX" = "true"; then
- AC_MSG_CHECKING([for atomic operations])
-
- AC_LANG_SAVE
-***************
-*** 870,876 ****
- [ USE_PSTACK=no ])
- pstack_libs=
- pstack_dirs=
-! if test "$USE_PSTACK" = yes -a "$IS_LINUX" = "true" -a "$BASE_MACHINE_TYPE" = "i386" -a "$with_mit_threads" = "no"
- then
- have_libiberty= have_libbfd=
- my_save_LIBS="$LIBS"
---- 871,877 ----
- [ USE_PSTACK=no ])
- pstack_libs=
- pstack_dirs=
-! if test "$USE_PSTACK" = yes -a "$TARGET_LINUX" = "true" -a "$BASE_MACHINE_TYPE" = "i386" -a "$with_mit_threads" = "no"
- then
- have_libiberty= have_libbfd=
- my_save_LIBS="$LIBS"
-***************
-*** 1239,1301 ****
- # Hack for DEC-UNIX (OSF1)
- if test "$with_named_thread" = "no" -a "$with_mit_threads" = "no"
- then
-! # Look for LinuxThreads.
-! AC_MSG_CHECKING("LinuxThreads")
-! grepres=`grep Linuxthreads /usr/include/pthread.h 2>/dev/null | wc -l`
-! getconfres=`which getconf >/dev/null && getconf GNU_LIBPTHREAD_VERSION | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ |grep LINUXTHREADS | wc -l || echo 0`
-! if test "$grepres" -gt 0 -o "$getconfres" -gt 0
- then
-! AC_MSG_RESULT("Found")
-! AC_DEFINE(HAVE_LINUXTHREADS)
-! # Linux 2.0 sanity check
-! AC_TRY_COMPILE([#include <sched.h>], [int a = sched_get_priority_min(1);], ,
-! AC_MSG_ERROR([Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. See the Installation chapter in the Reference Manual]))
-! # RedHat 5.0 does not work with dynamic linking of this. -static also
-! # gives a speed increase in linux so it does not hurt on other systems.
-! with_named_thread="-lpthread"
-! else
-! AC_MSG_RESULT("Not found")
-! # If this is a linux machine we should barf
-! AC_MSG_CHECKING("NPTL")
-! if test "$IS_LINUX" = "true"
-! then
-! getconfres=`which getconf >/dev/null && getconf GNU_LIBPTHREAD_VERSION | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ |grep NPTL | wc -l || echo 0`
-! if test "$getconfres" -gt 0
- then
-! AC_DEFINE(HAVE_LINUXTHREADS) dnl All this code predates NPTL, so "have linuxthreads" is a poor name.
-! with_named_thread="-lpthread"
- else
-! AC_MSG_ERROR([This is a Linux system and neither Linuxthreads nor NPTL were
-! found. Please install Linuxthreads or a new glibc and try
-! again. See the Installation chapter in the Reference Manual for
-! more information.])
- fi
-! else
-! AC_MSG_CHECKING("DEC threads")
-! if test -f /usr/shlib/libpthread.so -a -f /usr/lib/libmach.a -a -f /usr/ccs/lib/cmplrs/cc/libexc.a
-! then
-! with_named_thread="-lpthread -lmach -lexc"
-! CFLAGS="$CFLAGS -D_REENTRANT"
-! CXXFLAGS="$CXXFLAGS -D_REENTRANT"
-! AC_DEFINE(HAVE_DEC_THREADS)
-! AC_MSG_RESULT("yes")
-! else
-! AC_MSG_RESULT("no")
-! AC_MSG_CHECKING("DEC 3.2 threads")
-! if test -f /usr/shlib/libpthreads.so -a -f /usr/lib/libmach.a -a -f /usr/ccs/lib/cmplrs/cc/libexc.a
-! then
-! with_named_thread="-lpthreads -lmach -lc_r"
-! AC_DEFINE(HAVE_DEC_THREADS)
-! AC_DEFINE(HAVE_DEC_3_2_THREADS)
-! with_osf32_threads="yes"
-! MYSQLD_DEFAULT_SWITCHES="--skip-thread-priority"
-! AC_MSG_RESULT("yes")
-! else
-! AC_MSG_RESULT("no")
-! fi
-! fi
-! fi
-! fi
- fi
-
-
---- 1240,1337 ----
- # Hack for DEC-UNIX (OSF1)
- if test "$with_named_thread" = "no" -a "$with_mit_threads" = "no"
- then
-! AC_MSG_CHECKING("Linux threads")
-! if test "$TARGET_LINUX" = "true"
- then
-! AC_MSG_RESULT("starting")
-! # use getconf to check glibc contents
-! AC_MSG_CHECKING("getconf GNU_LIBPTHREAD_VERSION")
-! case `getconf GNU_LIBPTHREAD_VERSION | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` in
-! NPTL* )
-! AC_MSG_RESULT("NPTL")
-! AC_DEFINE([HAVE_NPTL], [1], [NPTL threads implementation])
-! with_named_thread="-lpthread"
-! ;;
-! LINUXTHREADS* )
-! AC_MSG_RESULT("Linuxthreads")
-! AC_DEFINE([HAVE_LINUXTHREADS], [1],
-! [Whether we are using Xavier Leroy's LinuxThreads])
-! with_named_thread="-lpthread"
-! ;;
-! * )
-! AC_MSG_RESULT("unknown")
-! ;;
-! esac
-! if test "$with_named_thread" = "no"
- then
-! # old method, check headers
-! # Look for LinuxThreads.
-! AC_MSG_CHECKING("LinuxThreads in header file comment")
-! res=`grep Linuxthreads /usr/include/pthread.h 2>/dev/null | wc -l`
-! if test "$res" -gt 0
-! then
-! AC_MSG_RESULT("Found")
-! AC_DEFINE([HAVE_LINUXTHREADS], [1],
-! [Whether we are using Xavier Leroy's LinuxThreads])
-! # Linux 2.0 sanity check
-! AC_TRY_COMPILE([#include <sched.h>], [int a = sched_get_priority_min(1);], ,
-! AC_MSG_ERROR([Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. See the Installation chapter in the Reference Manual]))
-! # RedHat 5.0 does not work with dynamic linking of this. -static also
-! # gives a speed increase in linux so it does not hurt on other systems.
-! with_named_thread="-lpthread"
-! else
-! AC_MSG_RESULT("Not found")
-! # If this is a linux machine we should barf
-! AC_MSG_ERROR([This is a Linux system without a working getconf,
-! and Linuxthreads was not found. Please install it (or a new glibc) and try again.
-! See the Installation chapter in the Reference Manual for more information.])
-! fi
- else
-! AC_MSG_RESULT("no need to check headers")
- fi
-! AC_MSG_CHECKING("for pthread_create in -lpthread");
-! ac_save_LIBS="$LIBS"
-! LIBS="$LIBS -lpthread"
-! AC_TRY_LINK( [#include <pthread.h>],
-! [ (void) pthread_create((pthread_t*) 0,(pthread_attr_t*) 0, 0, 0); ],
-! AC_MSG_RESULT("yes"),
-! [ AC_MSG_RESULT("no")
-! AC_MSG_ERROR([
-! This is a Linux system claiming to support threads, either Linuxthreads or NPTL, but linking a test program failed.
-! Please install one of these (or a new glibc) and try again.
-! See the Installation chapter in the Reference Manual for more information.]) ]
-! )
-! LIBS="$ac_save_LIBS"
-! else
-! AC_MSG_RESULT("no")
-! fi # "$TARGET_LINUX"
-! fi # "$with_named_thread" = "no" -a "$with_mit_threads" = "no"
-!
-! if test "$with_named_thread" = "no" -a "$with_mit_threads" = "no"
-! then
-! AC_MSG_CHECKING("DEC threads")
-! if test -f /usr/shlib/libpthread.so -a -f /usr/lib/libmach.a -a -f /usr/ccs/lib/cmplrs/cc/libexc.a
-! then
-! with_named_thread="-lpthread -lmach -lexc"
-! CFLAGS="$CFLAGS -D_REENTRANT"
-! CXXFLAGS="$CXXFLAGS -D_REENTRANT"
-! AC_DEFINE(HAVE_DEC_THREADS)
-! AC_MSG_RESULT("yes")
-! else
-! AC_MSG_RESULT("no")
-! AC_MSG_CHECKING("DEC 3.2 threads")
-! if test -f /usr/shlib/libpthreads.so -a -f /usr/lib/libmach.a -a -f /usr/ccs/lib/cmplrs/cc/libexc.a
-! then
-! with_named_thread="-lpthreads -lmach -lc_r"
-! AC_DEFINE(HAVE_DEC_THREADS)
-! AC_DEFINE(HAVE_DEC_3_2_THREADS)
-! with_osf32_threads="yes"
-! MYSQLD_DEFAULT_SWITCHES="--skip-thread-priority"
-! AC_MSG_RESULT("yes")
-! else
-! AC_MSG_RESULT("no")
-! fi
-! fi
- fi
-
-
-***************
-*** 1720,1726 ****
- AC_SUBST(COMPILATION_COMMENT)
-
- AC_MSG_CHECKING("need of special linking flags")
-! if test "$IS_LINUX" = "true" -a "$ac_cv_prog_gcc" = "yes" -a "$all_is_static" != "yes"
- then
- LDFLAGS="$LDFLAGS -rdynamic"
- AC_MSG_RESULT("-rdynamic")
---- 1756,1762 ----
- AC_SUBST(COMPILATION_COMMENT)
-
- AC_MSG_CHECKING("need of special linking flags")
-! if test "$TARGET_LINUX" = "true" -a "$ac_cv_prog_gcc" = "yes" -a "$all_is_static" != "yes"
- then
- LDFLAGS="$LDFLAGS -rdynamic"
- AC_MSG_RESULT("-rdynamic")
-***************
-*** 1873,1878 ****
- tell atod memcpy memmove \
- setupterm strcasecmp sighold vidattr lrand48 localtime_r \
- sigset sigthreadmask pthread_sigmask pthread_setprio pthread_setprio_np \
- pthread_setschedparam pthread_attr_setprio pthread_attr_setschedparam \
- pthread_attr_create pthread_getsequence_np pthread_attr_setstacksize \
- pthread_attr_getstacksize pthread_key_delete \
---- 1909,1915 ----
- tell atod memcpy memmove \
- setupterm strcasecmp sighold vidattr lrand48 localtime_r \
- sigset sigthreadmask pthread_sigmask pthread_setprio pthread_setprio_np \
-+ sigaction sigemptyset sigaddset \
- pthread_setschedparam pthread_attr_setprio pthread_attr_setschedparam \
- pthread_attr_create pthread_getsequence_np pthread_attr_setstacksize \
- pthread_attr_getstacksize pthread_key_delete \
-***************
-*** 1884,1890 ****
- # Sanity check: We chould not have any fseeko symbol unless
- # large_file_support=yes
- AC_CHECK_FUNCS(fseeko,
-! [if test "$large_file_support" = no -a "$IS_LINUX" = "true";
- then
- AC_MSG_ERROR("Found fseeko symbol but large_file_support is not enabled!");
- fi]
---- 1921,1927 ----
- # Sanity check: We chould not have any fseeko symbol unless
- # large_file_support=yes
- AC_CHECK_FUNCS(fseeko,
-! [if test "$large_file_support" = no -a "$TARGET_LINUX" = "true";
- then
- AC_MSG_ERROR("Found fseeko symbol but large_file_support is not enabled!");
- fi]
diff --git a/include/my_global.h.rej b/include/my_global.h.rej
deleted file mode 100644
index f2953d169e7..00000000000
--- a/include/my_global.h.rej
+++ /dev/null
@@ -1,17 +0,0 @@
-***************
-*** 97,103 ****
-
-
- /* Fix problem with S_ISLNK() on Linux */
-! #if defined(HAVE_LINUXTHREADS)
- #undef _GNU_SOURCE
- #define _GNU_SOURCE 1
- #endif
---- 97,103 ----
-
-
- /* Fix problem with S_ISLNK() on Linux */
-! #if defined(TARGET_OS_LINUX) || defined(__GLIBC__)
- #undef _GNU_SOURCE
- #define _GNU_SOURCE 1
- #endif
diff --git a/include/my_pthread.h.rej b/include/my_pthread.h.rej
deleted file mode 100644
index 1f73655b0bd..00000000000
--- a/include/my_pthread.h.rej
+++ /dev/null
@@ -1,80 +0,0 @@
-***************
-*** 286,293 ****
- #undef HAVE_PTHREAD_RWLOCK_RDLOCK
- #undef HAVE_SNPRINTF
-
-! #define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
-! #define signal(A,B) pthread_signal((A),(void (*)(int)) (B))
- #define my_pthread_attr_setprio(A,B)
- #endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */
-
---- 294,301 ----
- #undef HAVE_PTHREAD_RWLOCK_RDLOCK
- #undef HAVE_SNPRINTF
-
-! #define my_sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
-! #define my_signal(A,B) pthread_signal((A),(void (*)(int)) (B))
- #define my_pthread_attr_setprio(A,B)
- #endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */
-
-***************
-*** 324,337 ****
- #if !defined(HAVE_SIGWAIT) && !defined(HAVE_mit_thread) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX)
- int sigwait(sigset_t *setp, int *sigp); /* Use our implemention */
- #endif
-! #if !defined(HAVE_SIGSET) && !defined(HAVE_mit_thread) && !defined(sigset)
-! #define sigset(A,B) do { struct sigaction s; sigset_t set; \
-! sigemptyset(&set); \
-! s.sa_handler = (B); \
-! s.sa_mask = set; \
-! s.sa_flags = 0; \
-! sigaction((A), &s, (struct sigaction *) NULL); \
- } while (0)
- #endif
-
- #ifndef my_pthread_setprio
---- 332,358 ----
- #if !defined(HAVE_SIGWAIT) && !defined(HAVE_mit_thread) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX)
- int sigwait(sigset_t *setp, int *sigp); /* Use our implemention */
- #endif
-!
-! /*
-! We define my_sigset() and use that instead of the system sigset() so that
-! we can favor an implementation based on sigaction(). On some systems, such
-! as Mac OS X, sigset() results in flags such as SA_RESTART being set, and
-! we want to make sure that no such flags are set.
-! */
-! #if defined(HAVE_SIGACTION) && !defined(my_sigset)
-! #define my_sigset(A,B) do { struct sigaction s; sigset_t set; int rc; \
-! DBUG_ASSERT((A) != 0); \
-! sigemptyset(&set); \
-! s.sa_handler = (B); \
-! s.sa_mask = set; \
-! s.sa_flags = 0; \
-! rc= sigaction((A), &s, (struct sigaction *) NULL); \
-! DBUG_ASSERT(rc == 0); \
- } while (0)
-+ #elif defined(HAVE_SIGSET) && !defined(my_sigset)
-+ #define my_sigset(A,B) sigset((A),(B))
-+ #elif !defined(my_sigset)
-+ #define my_sigset(A,B) signal((A),(B))
- #endif
-
- #ifndef my_pthread_setprio
-***************
-*** 416,422 ****
- #undef pthread_detach_this_thread
- #define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(tmp); }
- #undef sigset
-! #define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
- #endif
-
- #if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) && !defined(HAVE_CTHREADS_WRAPPER)
---- 437,443 ----
- #undef pthread_detach_this_thread
- #define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(tmp); }
- #undef sigset
-! #define my_sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
- #endif
-
- #if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) && !defined(HAVE_CTHREADS_WRAPPER)
diff --git a/mysql-test/suite/row_lock/include/row_lock.inc b/mysql-test/suite/row_lock/include/row_lock.inc
new file mode 100644
index 00000000000..8572bc0246e
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock.inc
@@ -0,0 +1,83 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+eval $indext2;
+COMMIT;
+SELECT @@global.tx_isolation;
+
+# Both transaction are able to update the tables
+eval EXPLAIN $select;
+eval $select;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t1,t2 SET t1.i=223,t2.i=223 WHERE t1.i=123 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE t1,t2 SET t1.i=226,t2.i=226 WHERE t1.i=126 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t1,t2 SET t1.i=224,t2.i=224 WHERE t1.i=124 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP TABLE t1, t2;
+
diff --git a/mysql-test/suite/row_lock/include/row_lock_big_tab.inc b/mysql-test/suite/row_lock/include/row_lock_big_tab.inc
new file mode 100644
index 00000000000..f0823067eac
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_big_tab.inc
@@ -0,0 +1,94 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+eval $indext2;
+DELIMITER |;
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+ INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+ SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+ DECLARE res int DEFAULT 0;
+ SELECT count(*)/2 INTO res FROM t1;
+ RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+ INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+ SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+ DECLARE res int DEFAULT 0;
+ SELECT count(*)/2 INTO res FROM t2;
+ RETURN res;
+END;
+|
+DELIMITER ;|
+CALL fill_t1 (10);
+CALL fill_t2 (10);
+COMMIT;
+SELECT @@global.tx_isolation;
+# With the two separate selects (without join) the differs from
+# that select with join.
+
+# Both transaction are able to update the tables
+eval EXPLAIN $select;
+eval $select;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT k from t1 WHERE k < half_t1();
+SELECT k from t1 WHERE k >= half_t1();
+UPDATE t1,t2 SET t1.i=1111,t2.i=2222 WHERE t1.k < half_t1() AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t1,t2 SET t1.i=3333,t2.i=4444 WHERE t1.k >= half_t1() AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP VIEW IF EXISTS v1;
+DROP TABLE t1, t2;
+#DROP VIEW v1;
+
diff --git a/mysql-test/suite/row_lock/include/row_lock_big_tab_1.inc b/mysql-test/suite/row_lock/include/row_lock_big_tab_1.inc
new file mode 100644
index 00000000000..8535c016819
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_big_tab_1.inc
@@ -0,0 +1,93 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+eval $indext2;
+DELIMITER |;
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+ INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+ SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+ DECLARE res int DEFAULT 0;
+ SELECT MOD(k,2) INTO res FROM t1;
+ RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+ INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+ SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+ DECLARE res int DEFAULT 0;
+ SELECT MOD(k,2) INTO res FROM t2;
+ RETURN res;
+END;
+|
+DELIMITER ;|
+eval CALL fill_t1 ($nbrows);
+eval CALL fill_t2 ($nbrows);
+COMMIT;
+SELECT @@global.tx_isolation;
+# With the two separate selects (without join) the differs from
+# that select with join.
+
+# Both transaction are able to update the tables
+eval EXPLAIN $select;
+eval $select;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 1 AND t1.k = t2.k LOCK IN SHARE MODE;
+UPDATE t1,t2 SET t1.i=1111,t2.i=2222 WHERE t1.k % 2 = 1 AND t1.k = t2.k;
+SELECT * FROM t1 WHERE k < 20 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 20 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t1,t2 SET t1.i=3333,t2.i=4444 WHERE t1.k % 2 = 0 AND t1.k = t2.k;
+SELECT * FROM t1 WHERE k < 20 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 20 ORDER BY t2.k;
+
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM t1 WHERE k < 40 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 40 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM t1 WHERE k < 40 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 40 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP TABLE t1, t2;
+
+
diff --git a/mysql-test/suite/row_lock/include/row_lock_big_tab_2.inc b/mysql-test/suite/row_lock/include/row_lock_big_tab_2.inc
new file mode 100644
index 00000000000..050f2a54016
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_big_tab_2.inc
@@ -0,0 +1,93 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+eval $indext2;
+DELIMITER |;
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+ INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+ SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+ DECLARE res int DEFAULT 0;
+ SELECT MOD(k,2) INTO res FROM t1;
+ RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+ INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+ SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+ DECLARE res int DEFAULT 0;
+ SELECT MOD(k,2) INTO res FROM t2;
+ RETURN res;
+END;
+|
+DELIMITER ;|
+eval CALL fill_t1 ($nbrows);
+eval CALL fill_t2 ($nbrows);
+COMMIT;
+SELECT @@global.tx_isolation;
+# With the two separate selects (without join) the differs from
+# that select with join.
+
+# Both transaction are able to update the tables
+eval EXPLAIN $select;
+eval $select;
+
+--echo connection root1;
+CONNECTION root1;
+#SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 1 AND t1.k = t2.k FOR UPDATE;
+DELETE FROM t1 WHERE t1.k % 2 = 1;
+SELECT * FROM t1 WHERE k < 20 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 20 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t1,t2 SET t1.i=3333,t2.i=4444 WHERE t1.k % 2 = 0 AND t1.k = t2.k;
+SELECT * FROM t1 WHERE k < 20 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 20 ORDER BY t2.k;
+
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM t1 WHERE k < 40 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 40 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM t1 WHERE k < 40 ORDER BY t1.k;
+SELECT * FROM t2 WHERE k < 40 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP TABLE t1, t2;
+
+
diff --git a/mysql-test/suite/row_lock/include/row_lock_trig.inc b/mysql-test/suite/row_lock/include/row_lock_trig.inc
new file mode 100644
index 00000000000..384f00f243e
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_trig.inc
@@ -0,0 +1,96 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+eval $indext2;
+DELIMITER |;
+
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+ FOR EACH ROW BEGIN
+ UPDATE t1 SET l = NEW.i WHERE i = OLD.i;
+ END;
+|
+
+DELIMITER ;|
+
+COMMIT;
+SELECT @@global.tx_isolation;
+# With the two separate selects (without join) the differs from
+# that select with join.
+
+# Both transaction are able to update the tables
+eval EXPLAIN $select;
+eval $select;
+--echo connection root1;
+CONNECTION root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t2 SET t2.i=223 WHERE t2.i=123;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE t2 SET t2.i=226 WHERE t2.i=126;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t2 SET t2.i=224 WHERE t2.i=124;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP TABLE t1, t2;
+#DROP VIEW v1;
+
diff --git a/mysql-test/suite/row_lock/include/row_lock_view.inc b/mysql-test/suite/row_lock/include/row_lock_view.inc
new file mode 100644
index 00000000000..fbed8f64d3a
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_view.inc
@@ -0,0 +1,89 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+eval $indext2;
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+# With the two separate selects (without join) the differs from
+# that select with join.
+
+# Both transaction are able to update the tables
+eval EXPLAIN $select;
+eval $select;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE v1 SET i=325 where i=125;
+SELECT * FROM v1 ORDER BY i,l;
+SELECT * FROM t1 ORDER BY t1.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE v1 SET i=323 where i=123;
+SELECT * FROM v1 ORDER BY i,l;
+SELECT * FROM t1 ORDER BY t1.k;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE v1 SET i=326 where i=126;
+SELECT * FROM v1 ORDER BY i,l;
+SELECT * FROM t1 ORDER BY t1.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE v1 SET i=324 where i=124;
+SELECT * FROM v1 ORDER BY i,l;
+SELECT * FROM t1 ORDER BY t1.k;
+
+--echo connection root1;
+CONNECTION root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP VIEW IF EXISTS v1;
+DROP TABLE t1, t2;
+#DROP VIEW v1;
+
diff --git a/mysql-test/suite/row_lock/include/row_lock_view_mix.inc b/mysql-test/suite/row_lock/include/row_lock_view_mix.inc
new file mode 100644
index 00000000000..9e8cf3d34fc
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_view_mix.inc
@@ -0,0 +1,92 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+eval $indext2;
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+# With the two separate selects (without join) the differs from
+# that select with join.
+
+# Both transaction are able to update the tables
+eval EXPLAIN $select;
+eval $select;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+#UPDATE v1 SET i=325 where i=125;
+#SELECT * FROM v1 ORDER BY i,l;
+#SELECT * FROM t1 ORDER BY t1.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE v1 SET i=323 where i=123;
+SELECT * FROM v1 ORDER BY i,l;
+SELECT * FROM t1 ORDER BY t1.k;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE t1,t2 SET t1.i=226,t2.i=226 WHERE t1.i=126 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE v1 SET i=324 where i=124;
+SELECT * FROM v1 ORDER BY i,l;
+SELECT * FROM t1 ORDER BY t1.k;
+
+--echo connection root1;
+CONNECTION root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP VIEW IF EXISTS v1;
+DROP TABLE t1, t2;
+#DROP VIEW v1;
+
diff --git a/mysql-test/suite/row_lock/include/row_lock_view_storedp.inc b/mysql-test/suite/row_lock/include/row_lock_view_storedp.inc
new file mode 100644
index 00000000000..479392098be
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_view_storedp.inc
@@ -0,0 +1,126 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+DROP PROCEDURE IF EXISTS stp_t;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+CONNECT (root2, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+INSERT INTO t1 VALUES (5,127,5,127);
+INSERT INTO t1 VALUES (6,128,6,128);
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+INSERT INTO t2 VALUES (5,127,5,127);
+INSERT INTO t2 VALUES (6,128,6,128);
+eval $indext2;
+CREATE VIEW v1 AS SELECT t1.i from t1;
+DELIMITER |;
+
+CREATE PROCEDURE stp_t (IN p1 int, IN p2 int) MODIFIES SQL DATA
+ BEGIN
+ UPDATE t2 SET i = p2 WHERE i = p1;
+ UPDATE v1 SET i = p2 WHERE i = p1;
+ SELECT * FROM v1 ORDER BY i;
+ SELECT * FROM t1 ORDER BY t1.k;
+ SELECT * FROM t2 ORDER BY t2.k;
+ END;
+|
+
+DELIMITER ;|
+
+COMMIT;
+SELECT @@global.tx_isolation;
+eval EXPLAIN $select;
+eval $select;
+--echo connection root1;
+CONNECTION root1;
+CALL stp_t (125, 225);
+
+--echo connection root2;
+CONNECTION root2;
+CALL stp_t (127, 227);
+
+--echo connection default;
+CONNECTION default;
+CALL stp_t (123, 223);
+
+--echo connection root1;
+CONNECTION root1;
+CALL stp_t (126, 226);
+
+--echo connection root2;
+CONNECTION root2;
+CALL stp_t (128, 228);
+
+--echo connection default;
+CONNECTION default;
+CALL stp_t (124, 224);
+
+--echo connection root1;
+CONNECTION root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root2;
+CONNECTION root2;
+DELETE FROM t1 WHERE t1.i=228;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection root1;
+CONNECTION root1;
+COMMIT;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root1;
+
+--echo connection root2;
+CONNECTION root2;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root2;
+
+--echo connection default;
+CONNECTION default;
+--disable_warnings
+DROP VIEW v1;
+DROP PROCEDURE stp_t;
+DROP TABLE t1, t2;
+--enable_warnings
diff --git a/mysql-test/suite/row_lock/include/row_lock_view_trig.inc b/mysql-test/suite/row_lock/include/row_lock_view_trig.inc
new file mode 100644
index 00000000000..785eb1b66a9
--- /dev/null
+++ b/mysql-test/suite/row_lock/include/row_lock_view_trig.inc
@@ -0,0 +1,99 @@
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+--enable_warnings
+SET autocommit=0;
+# Create additional connections used through test
+CONNECT (root1, localhost, root,,);
+SET autocommit=0;
+--echo connection default;
+CONNECTION default;
+eval CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+eval $indext1;
+eval CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=$engine;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+eval $indext2;
+CREATE VIEW v1 AS SELECT t1.i from t1;
+DELIMITER |;
+
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+ FOR EACH ROW BEGIN
+ UPDATE v1 SET i = NEW.i WHERE i = OLD.i;
+ END;
+|
+
+DELIMITER ;|
+
+COMMIT;
+SELECT @@global.tx_isolation;
+eval EXPLAIN $select;
+eval $select;
+--echo connection root1;
+CONNECTION root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t2 SET t2.i=223 WHERE t2.i=123;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+UPDATE t2 SET t2.i=226 WHERE t2.i=126;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+UPDATE t2 SET t2.i=224 WHERE t2.i=124;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection default;
+CONNECTION default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+COMMIT;
+
+--echo connection root1;
+CONNECTION root1;
+ROLLBACK;
+
+--echo connection default;
+CONNECTION default;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+
+--echo connection root1;
+CONNECTION root1;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+DISCONNECT root1;
+--echo connection default;
+CONNECTION default;
+DROP TABLE t1, t2;
+DROP VIEW v1;
+
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_1.result b/mysql-test/suite/row_lock/r/innodb_row_lock_1.result
new file mode 100644
index 00000000000..54ed4350ba9
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_1.result
@@ -0,0 +1,142 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 2 Using where; Using index
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=223,t2.i=223 WHERE t1.i=123 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t1,t2 SET t1.i=226,t2.i=226 WHERE t1.i=126 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=224,t2.i=224 WHERE t1.i=124 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_2.result b/mysql-test/suite/row_lock/r/innodb_row_lock_2.result
new file mode 100644
index 00000000000..56154e64489
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_2.result
@@ -0,0 +1,32 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_3.result b/mysql-test/suite/row_lock/r/innodb_row_lock_3.result
new file mode 100644
index 00000000000..a89c55973d2
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_3.result
@@ -0,0 +1,32 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_4.result b/mysql-test/suite/row_lock/r/innodb_row_lock_4.result
new file mode 100644
index 00000000000..310d24a456a
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_4.result
@@ -0,0 +1,142 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 2 Using where; Using index
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=223,t2.i=223 WHERE t1.i=123 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t1,t2 SET t1.i=226,t2.i=226 WHERE t1.i=126 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=224,t2.i=224 WHERE t1.i=124 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_5.result b/mysql-test/suite/row_lock/r/innodb_row_lock_5.result
new file mode 100644
index 00000000000..ace5fddfad5
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_5.result
@@ -0,0 +1,32 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1 ignore index (ixi),t2 IGNORE INDEX (ixi) WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i,t2.i FROM t1 ignore index (ixi),t2 IGNORE INDEX (ixi) WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab.result b/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab.result
new file mode 100644
index 00000000000..8f00c3a0bb7
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab.result
@@ -0,0 +1,97 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+CREATE INDEX ixi ON t2 (i);
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT count(*)/2 INTO res FROM t1;
+RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT count(*)/2 INTO res FROM t2;
+RETURN res;
+END;
+|
+CALL fill_t1 (10);
+CALL fill_t2 (10);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < half_t1() AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 10 Using where; Using index
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 1 Using where; Using index
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < half_t1() AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+connection root1;
+SELECT k from t1 WHERE k < half_t1();
+k
+0
+1
+2
+3
+4
+SELECT k from t1 WHERE k >= half_t1();
+k
+5
+6
+7
+8
+9
+UPDATE t1,t2 SET t1.i=1111,t2.i=2222 WHERE t1.k < half_t1() AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+0 1111 0 100
+1 1111 1 101
+2 1111 2 102
+3 1111 3 103
+4 1111 4 104
+5 105 5 105
+6 106 6 106
+7 107 7 107
+8 108 8 108
+9 109 9 109
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+0 2222 0 100
+1 2222 1 101
+2 2222 2 102
+3 2222 3 103
+4 2222 4 104
+5 105 5 105
+6 106 6 106
+7 107 7 107
+8 108 8 108
+9 109 9 109
+connection default;
+UPDATE t1,t2 SET t1.i=3333,t2.i=4444 WHERE t1.k >= half_t1() AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_1.result b/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_1.result
new file mode 100644
index 00000000000..0b12f149193
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_1.result
@@ -0,0 +1,145 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+CREATE INDEX ixi ON t2 (i);
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t1;
+RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t2;
+RETURN res;
+END;
+|
+CALL fill_t1 (40);
+CALL fill_t2 (40);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 0 AND t1.k = t2.k LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index PRIMARY ixi 5 NULL 40 Using where; Using index
+1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.k 1
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 0 AND t1.k = t2.k LOCK IN SHARE MODE;
+i i
+100 100
+102 102
+104 104
+106 106
+108 108
+110 110
+112 112
+114 114
+116 116
+118 118
+120 120
+122 122
+124 124
+126 126
+128 128
+130 130
+132 132
+134 134
+136 136
+138 138
+connection root1;
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 1 AND t1.k = t2.k LOCK IN SHARE MODE;
+i i
+101 101
+103 103
+105 105
+107 107
+109 109
+111 111
+113 113
+115 115
+117 117
+119 119
+121 121
+123 123
+125 125
+127 127
+129 129
+131 131
+133 133
+135 135
+137 137
+139 139
+UPDATE t1,t2 SET t1.i=1111,t2.i=2222 WHERE t1.k % 2 = 1 AND t1.k = t2.k;
+SELECT * FROM t1 WHERE k < 20 ORDER BY t1.k;
+k i j l
+0 100 0 100
+1 1111 1 101
+2 102 2 102
+3 1111 3 103
+4 104 4 104
+5 1111 5 105
+6 106 6 106
+7 1111 7 107
+8 108 8 108
+9 1111 9 109
+10 110 10 110
+11 1111 11 111
+12 112 12 112
+13 1111 13 113
+14 114 14 114
+15 1111 15 115
+16 116 16 116
+17 1111 17 117
+18 118 18 118
+19 1111 19 119
+SELECT * FROM t2 WHERE k < 20 ORDER BY t2.k;
+k i j l
+0 100 0 100
+1 2222 1 101
+2 102 2 102
+3 2222 3 103
+4 104 4 104
+5 2222 5 105
+6 106 6 106
+7 2222 7 107
+8 108 8 108
+9 2222 9 109
+10 110 10 110
+11 2222 11 111
+12 112 12 112
+13 2222 13 113
+14 114 14 114
+15 2222 15 115
+16 116 16 116
+17 2222 17 117
+18 118 18 118
+19 2222 19 119
+connection default;
+UPDATE t1,t2 SET t1.i=3333,t2.i=4444 WHERE t1.k % 2 = 0 AND t1.k = t2.k;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_2.result b/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_2.result
new file mode 100644
index 00000000000..cc9f297f9fb
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_big_tab_2.result
@@ -0,0 +1,113 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+CREATE INDEX ixi ON t2 (i);
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t1;
+RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t2;
+RETURN res;
+END;
+|
+CALL fill_t1 (40);
+CALL fill_t2 (40);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 0 AND t1.k = t2.k LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index PRIMARY ixi 5 NULL 40 Using where; Using index
+1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.k 1
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 0 AND t1.k = t2.k LOCK IN SHARE MODE;
+i i
+100 100
+102 102
+104 104
+106 106
+108 108
+110 110
+112 112
+114 114
+116 116
+118 118
+120 120
+122 122
+124 124
+126 126
+128 128
+130 130
+132 132
+134 134
+136 136
+138 138
+connection root1;
+DELETE FROM t1 WHERE t1.k % 2 = 1;
+SELECT * FROM t1 WHERE k < 20 ORDER BY t1.k;
+k i j l
+0 100 0 100
+2 102 2 102
+4 104 4 104
+6 106 6 106
+8 108 8 108
+10 110 10 110
+12 112 12 112
+14 114 14 114
+16 116 16 116
+18 118 18 118
+SELECT * FROM t2 WHERE k < 20 ORDER BY t2.k;
+k i j l
+0 100 0 100
+1 101 1 101
+2 102 2 102
+3 103 3 103
+4 104 4 104
+5 105 5 105
+6 106 6 106
+7 107 7 107
+8 108 8 108
+9 109 9 109
+10 110 10 110
+11 111 11 111
+12 112 12 112
+13 113 13 113
+14 114 14 114
+15 115 15 115
+16 116 16 116
+17 117 17 117
+18 118 18 118
+19 119 19 119
+connection default;
+UPDATE t1,t2 SET t1.i=3333,t2.i=4444 WHERE t1.k % 2 = 0 AND t1.k = t2.k;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_trig_1.result b/mysql-test/suite/row_lock/r/innodb_row_lock_trig_1.result
new file mode 100644
index 00000000000..dd43e5752e5
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_trig_1.result
@@ -0,0 +1,151 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE t1 SET l = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 225
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t2 SET t2.i=223 WHERE t2.i=123;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t2 SET t2.i=226 WHERE t2.i=126;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 225
+4 126 4 226
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t2 SET t2.i=224 WHERE t2.i=124;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 225
+4 126 4 226
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_trig_2.result b/mysql-test/suite/row_lock/r/innodb_row_lock_trig_2.result
new file mode 100644
index 00000000000..cb3a5c692e9
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_trig_2.result
@@ -0,0 +1,37 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE t1 SET l = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_1.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_1.result
new file mode 100644
index 00000000000..834cb669833
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_1.result
@@ -0,0 +1,34 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 2 Using where; Using index
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE v1 SET i=325 where i=125;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_2.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_2.result
new file mode 100644
index 00000000000..440138d4cd1
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_2.result
@@ -0,0 +1,40 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+1 SIMPLE t2 index NULL PRIMARY 4 NULL 4 Using index
+SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+i
+123
+124
+123
+124
+123
+124
+123
+124
+connection root1;
+UPDATE v1 SET i=325 where i=125;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_1.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_1.result
new file mode 100644
index 00000000000..230873b67a0
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_1.result
@@ -0,0 +1,48 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 2 Using where; Using index
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE v1 SET i=323 where i=123;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_2.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_2.result
new file mode 100644
index 00000000000..d792d573f8e
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_mix_2.result
@@ -0,0 +1,40 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+1 SIMPLE t2 index NULL PRIMARY 4 NULL 4 Using index
+SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+i
+123
+124
+123
+124
+123
+124
+123
+124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_1.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_1.result
new file mode 100644
index 00000000000..77b9a4dd964
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_1.result
@@ -0,0 +1,312 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+INSERT INTO t1 VALUES (5,127,5,127);
+INSERT INTO t1 VALUES (6,128,6,128);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+INSERT INTO t2 VALUES (5,127,5,127);
+INSERT INTO t2 VALUES (6,128,6,128);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE PROCEDURE stp_t (IN p1 int, IN p2 int) MODIFIES SQL DATA
+BEGIN
+UPDATE t2 SET i = p2 WHERE i = p1;
+UPDATE v1 SET i = p2 WHERE i = p1;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 6 Using where; Using index
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+CALL stp_t (125, 225);
+i
+123
+124
+126
+127
+128
+225
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+CALL stp_t (127, 227);
+i
+123
+124
+125
+126
+128
+227
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 128 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 128 6 128
+connection default;
+CALL stp_t (123, 223);
+i
+124
+125
+126
+127
+128
+223
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root1;
+CALL stp_t (126, 226);
+i
+123
+124
+127
+128
+225
+226
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+CALL stp_t (128, 228);
+i
+123
+124
+125
+126
+227
+228
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+connection default;
+CALL stp_t (124, 224);
+i
+125
+126
+127
+128
+223
+224
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+DELETE FROM t1 WHERE t1.i=228;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+COMMIT;
+connection root1;
+ROLLBACK;
+connection root1;
+COMMIT;
+connection default;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+127
+128
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root1;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+127
+128
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+SELECT * FROM v1 ORDER BY i;
+i
+123
+124
+125
+126
+227
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+connection default;
+DROP TABLE t1, t2;
+DROP VIEW v1;
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_2.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_2.result
new file mode 100644
index 00000000000..73d8a3f4bea
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_storedp_2.result
@@ -0,0 +1,47 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+INSERT INTO t1 VALUES (5,127,5,127);
+INSERT INTO t1 VALUES (6,128,6,128);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+INSERT INTO t2 VALUES (5,127,5,127);
+INSERT INTO t2 VALUES (6,128,6,128);
+#CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE PROCEDURE stp_t (IN p1 int, IN p2 int) MODIFIES SQL DATA
+BEGIN
+UPDATE t2 SET i = p2 WHERE i = p1;
+UPDATE v1 SET i = p2 WHERE i = p1;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+CALL stp_t (125, 225);
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_1.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_1.result
new file mode 100644
index 00000000000..90383a9489f
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_1.result
@@ -0,0 +1,183 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE v1 SET i = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index ixi ixi 5 NULL 4 Using where; Using index
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
+SELECT * FROM v1 ORDER BY i;
+i
+123
+124
+126
+225
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t2 SET t2.i=223 WHERE t2.i=123;
+SELECT * FROM v1 ORDER BY i;
+i
+124
+125
+126
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t2 SET t2.i=226 WHERE t2.i=126;
+SELECT * FROM v1 ORDER BY i;
+i
+123
+124
+225
+226
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t2 SET t2.i=224 WHERE t2.i=124;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+223
+224
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
+DROP VIEW v1;
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_2.result b/mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_2.result
new file mode 100644
index 00000000000..55793558b21
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/innodb_row_lock_view_trig_2.result
@@ -0,0 +1,38 @@
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE v1 SET i = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_1.result b/mysql-test/suite/row_lock/r/ndb_row_lock_1.result
new file mode 100644
index 00000000000..248c7d5ea1f
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_1.result
@@ -0,0 +1,139 @@
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 1 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=223,t2.i=223 WHERE t1.i=123 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t1,t2 SET t1.i=226,t2.i=226 WHERE t1.i=126 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=224,t2.i=224 WHERE t1.i=124 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_2.result b/mysql-test/suite/row_lock/r/ndb_row_lock_2.result
new file mode 100644
index 00000000000..109d99dd036
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_2.result
@@ -0,0 +1,31 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_3.result b/mysql-test/suite/row_lock/r/ndb_row_lock_3.result
new file mode 100644
index 00000000000..c936ea209ff
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_3.result
@@ -0,0 +1,30 @@
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_4.result b/mysql-test/suite/row_lock/r/ndb_row_lock_4.result
new file mode 100644
index 00000000000..875c783bd81
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_4.result
@@ -0,0 +1,139 @@
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 1 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=223,t2.i=223 WHERE t1.i=123 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t1,t2 SET t1.i=226,t2.i=226 WHERE t1.i=126 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t1,t2 SET t1.i=224,t2.i=224 WHERE t1.i=124 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_5.result b/mysql-test/suite/row_lock/r/ndb_row_lock_5.result
new file mode 100644
index 00000000000..0d94f8abf72
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_5.result
@@ -0,0 +1,30 @@
+DROP TABLE IF EXISTS t1, t2;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1 ignore index (ixi),t2 IGNORE INDEX (ixi) WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i,t2.i FROM t1 ignore index (ixi),t2 IGNORE INDEX (ixi) WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab.result b/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab.result
new file mode 100644
index 00000000000..94b67c63d94
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab.result
@@ -0,0 +1,177 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+CREATE INDEX ixi ON t2 (i);
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT count(*)/2 INTO res FROM t1;
+RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT count(*)/2 INTO res FROM t2;
+RETURN res;
+END;
+|
+CALL fill_t1 (10);
+CALL fill_t2 (10);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < half_t1() AND t2.i=t1.i LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 1 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < half_t1() AND t2.i=t1.i LOCK IN SHARE MODE;
+i i
+connection root1;
+SELECT k from t1 WHERE k < half_t1();
+k
+0
+3
+1
+2
+4
+SELECT k from t1 WHERE k >= half_t1();
+k
+6
+7
+9
+5
+8
+UPDATE t1,t2 SET t1.i=1111,t2.i=2222 WHERE t1.k < half_t1() AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+0 1111 0 100
+1 1111 1 101
+2 1111 2 102
+3 1111 3 103
+4 1111 4 104
+5 105 5 105
+6 106 6 106
+7 107 7 107
+8 108 8 108
+9 109 9 109
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+0 2222 0 100
+1 2222 1 101
+2 2222 2 102
+3 2222 3 103
+4 2222 4 104
+5 105 5 105
+6 106 6 106
+7 107 7 107
+8 108 8 108
+9 109 9 109
+connection default;
+UPDATE t1,t2 SET t1.i=3333,t2.i=4444 WHERE t1.k >= half_t1() AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+0 100 0 100
+1 101 1 101
+2 102 2 102
+3 103 3 103
+4 104 4 104
+5 3333 5 105
+6 3333 6 106
+7 3333 7 107
+8 3333 8 108
+9 3333 9 109
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+0 100 0 100
+1 101 1 101
+2 102 2 102
+3 103 3 103
+4 104 4 104
+5 4444 5 105
+6 4444 6 106
+7 4444 7 107
+8 4444 8 108
+9 4444 9 109
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+0 100 0 100
+1 101 1 101
+2 102 2 102
+3 103 3 103
+4 104 4 104
+5 3333 5 105
+6 3333 6 106
+7 3333 7 107
+8 3333 8 108
+9 3333 9 109
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+0 100 0 100
+1 101 1 101
+2 102 2 102
+3 103 3 103
+4 104 4 104
+5 4444 5 105
+6 4444 6 106
+7 4444 7 107
+8 4444 8 108
+9 4444 9 109
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+0 100 0 100
+1 101 1 101
+2 102 2 102
+3 103 3 103
+4 104 4 104
+5 3333 5 105
+6 3333 6 106
+7 3333 7 107
+8 3333 8 108
+9 3333 9 109
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+0 100 0 100
+1 101 1 101
+2 102 2 102
+3 103 3 103
+4 104 4 104
+5 4444 5 105
+6 4444 6 106
+7 4444 7 107
+8 4444 8 108
+9 4444 9 109
+connection default;
+DROP VIEW IF EXISTS v1;
+Warnings:
+Note 1051 Unknown table 'test.v1'
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_1.result b/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_1.result
new file mode 100644
index 00000000000..9803895e1a7
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_1.result
@@ -0,0 +1,357 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+CREATE INDEX ixi ON t2 (i);
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t1;
+RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t2;
+RETURN res;
+END;
+|
+CALL fill_t1 (200);
+CALL fill_t2 (200);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < t1.k % 2 = 0 AND t2.k=t1.k LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 200 Using where
+1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.k 1
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < t1.k % 2 = 0 AND t2.k=t1.k LOCK IN SHARE MODE;
+i i
+135 135
+119 119
+211 211
+184 184
+232 232
+105 105
+188 188
+216 216
+255 255
+154 154
+197 197
+279 279
+218 218
+127 127
+203 203
+281 281
+194 194
+161 161
+276 276
+122 122
+139 139
+183 183
+114 114
+247 247
+144 144
+148 148
+174 174
+267 267
+142 142
+168 168
+226 226
+258 258
+231 231
+146 146
+253 253
+189 189
+230 230
+290 290
+178 178
+158 158
+130 130
+214 214
+133 133
+229 229
+294 294
+295 295
+108 108
+112 112
+297 297
+151 151
+251 251
+270 270
+291 291
+159 159
+132 132
+121 121
+244 244
+272 272
+293 293
+186 186
+111 111
+166 166
+201 201
+175 175
+180 180
+209 209
+192 192
+246 246
+195 195
+107 107
+233 233
+239 239
+103 103
+109 109
+128 128
+266 266
+143 143
+160 160
+187 187
+243 243
+273 273
+259 259
+110 110
+176 176
+141 141
+170 170
+215 215
+191 191
+200 200
+271 271
+162 162
+260 260
+106 106
+150 150
+126 126
+147 147
+155 155
+193 193
+207 207
+287 287
+235 235
+252 252
+129 129
+205 205
+268 268
+278 278
+116 116
+137 137
+199 199
+217 217
+234 234
+190 190
+236 236
+257 257
+100 100
+210 210
+212 212
+264 264
+221 221
+241 241
+256 256
+262 262
+265 265
+269 269
+277 277
+173 173
+177 177
+208 208
+219 219
+285 285
+101 101
+164 164
+113 113
+125 125
+202 202
+140 140
+156 156
+282 282
+181 181
+206 206
+299 299
+102 102
+145 145
+227 227
+196 196
+138 138
+198 198
+204 204
+237 237
+171 171
+284 284
+263 263
+292 292
+104 104
+149 149
+250 250
+296 296
+228 228
+280 280
+242 242
+248 248
+185 185
+220 220
+245 245
+275 275
+118 118
+120 120
+152 152
+153 153
+157 157
+182 182
+179 179
+254 254
+288 288
+172 172
+283 283
+286 286
+115 115
+238 238
+289 289
+131 131
+223 223
+134 134
+136 136
+222 222
+225 225
+261 261
+274 274
+123 123
+163 163
+224 224
+117 117
+298 298
+169 169
+124 124
+167 167
+240 240
+249 249
+165 165
+213 213
+connection root1;
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 1 AND t1.k = t2.k LOCK IN SHARE MODE;
+i i
+209 209
+195 195
+107 107
+233 233
+239 239
+103 103
+109 109
+143 143
+187 187
+243 243
+273 273
+259 259
+141 141
+215 215
+191 191
+271 271
+147 147
+155 155
+193 193
+207 207
+287 287
+235 235
+129 129
+205 205
+137 137
+199 199
+217 217
+257 257
+221 221
+241 241
+265 265
+269 269
+277 277
+173 173
+177 177
+135 135
+119 119
+211 211
+105 105
+255 255
+197 197
+279 279
+127 127
+203 203
+281 281
+161 161
+139 139
+183 183
+247 247
+267 267
+231 231
+253 253
+189 189
+133 133
+229 229
+295 295
+297 297
+151 151
+251 251
+291 291
+159 159
+121 121
+293 293
+111 111
+201 201
+175 175
+185 185
+245 245
+275 275
+153 153
+157 157
+179 179
+283 283
+115 115
+289 289
+131 131
+223 223
+225 225
+261 261
+123 123
+163 163
+117 117
+169 169
+167 167
+249 249
+165 165
+213 213
+219 219
+285 285
+101 101
+113 113
+125 125
+181 181
+299 299
+145 145
+227 227
+237 237
+171 171
+263 263
+149 149
+UPDATE t1,t2 SET t1.i=1111,t2.i=2222 WHERE t1.k % 2 = 1 AND t1.k = t2.k;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_2.result b/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_2.result
new file mode 100644
index 00000000000..adb89b03480
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_big_tab_2.result
@@ -0,0 +1,255 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+CREATE INDEX ixi ON t2 (i);
+CREATE PROCEDURE fill_t1 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t1 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t1() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t1;
+RETURN res;
+END;
+|
+CREATE PROCEDURE fill_t2 (IN upb int)
+BEGIN
+DECLARE cnt int DEFAULT 0;
+WHILE cnt < upb DO
+INSERT INTO t2 VALUES (cnt, cnt+100, cnt, cnt+100);
+SET cnt= cnt+1;
+END WHILE;
+END;
+|
+CREATE FUNCTION half_t2() RETURNS int
+BEGIN
+DECLARE res int DEFAULT 0;
+SELECT MOD(k,2) INTO res FROM t2;
+RETURN res;
+END;
+|
+CALL fill_t1 (200);
+CALL fill_t2 (200);
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < t1.k % 2 = 0 AND t2.k=t1.k LOCK IN SHARE MODE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 200 Using where
+1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.k 1
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < t1.k % 2 = 0 AND t2.k=t1.k LOCK IN SHARE MODE;
+i i
+135 135
+119 119
+211 211
+184 184
+232 232
+105 105
+188 188
+216 216
+255 255
+154 154
+197 197
+279 279
+218 218
+127 127
+203 203
+281 281
+194 194
+161 161
+276 276
+122 122
+139 139
+183 183
+114 114
+247 247
+144 144
+148 148
+174 174
+267 267
+142 142
+168 168
+226 226
+258 258
+231 231
+146 146
+253 253
+189 189
+230 230
+290 290
+178 178
+158 158
+130 130
+214 214
+133 133
+229 229
+294 294
+295 295
+108 108
+112 112
+297 297
+151 151
+251 251
+270 270
+291 291
+159 159
+132 132
+121 121
+244 244
+272 272
+293 293
+186 186
+111 111
+166 166
+201 201
+175 175
+180 180
+209 209
+192 192
+246 246
+195 195
+107 107
+233 233
+239 239
+103 103
+109 109
+128 128
+266 266
+143 143
+160 160
+187 187
+243 243
+273 273
+259 259
+110 110
+176 176
+141 141
+170 170
+215 215
+191 191
+200 200
+271 271
+162 162
+260 260
+106 106
+150 150
+126 126
+147 147
+155 155
+193 193
+207 207
+287 287
+235 235
+252 252
+129 129
+205 205
+268 268
+278 278
+116 116
+137 137
+199 199
+217 217
+234 234
+190 190
+236 236
+257 257
+100 100
+210 210
+212 212
+264 264
+221 221
+241 241
+256 256
+262 262
+265 265
+269 269
+277 277
+173 173
+177 177
+208 208
+219 219
+285 285
+101 101
+164 164
+113 113
+125 125
+202 202
+140 140
+156 156
+282 282
+181 181
+206 206
+299 299
+102 102
+145 145
+227 227
+196 196
+138 138
+198 198
+204 204
+237 237
+171 171
+284 284
+263 263
+292 292
+104 104
+149 149
+250 250
+296 296
+228 228
+280 280
+242 242
+248 248
+185 185
+220 220
+245 245
+275 275
+118 118
+120 120
+152 152
+153 153
+157 157
+182 182
+179 179
+254 254
+288 288
+172 172
+283 283
+286 286
+115 115
+238 238
+289 289
+131 131
+223 223
+134 134
+136 136
+222 222
+225 225
+261 261
+274 274
+123 123
+163 163
+224 224
+117 117
+298 298
+169 169
+124 124
+167 167
+240 240
+249 249
+165 165
+213 213
+connection root1;
+DELETE FROM t1 WHERE t1.k % 2 = 1;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_trig_1.result b/mysql-test/suite/row_lock/r/ndb_row_lock_trig_1.result
new file mode 100644
index 00000000000..eb69fd2e306
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_trig_1.result
@@ -0,0 +1,148 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE t1 SET l = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 225
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t2 SET t2.i=223 WHERE t2.i=123;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t2 SET t2.i=226 WHERE t2.i=126;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 225
+4 126 4 226
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t2 SET t2.i=224 WHERE t2.i=124;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 225
+4 126 4 226
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 223
+2 124 2 224
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_trig_2.result b/mysql-test/suite/row_lock/r/ndb_row_lock_trig_2.result
new file mode 100644
index 00000000000..bedb75da93a
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_trig_2.result
@@ -0,0 +1,35 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE t1 SET l = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_1.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_1.result
new file mode 100644
index 00000000000..279f2626c73
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_1.result
@@ -0,0 +1,194 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 1 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE v1 SET i=325 where i=125;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+123 123
+123 124
+123 125
+123 126
+124 123
+124 124
+124 125
+124 126
+126 123
+126 124
+126 125
+126 126
+325 123
+325 124
+325 125
+325 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 325 3 125
+4 126 4 126
+connection default;
+UPDATE v1 SET i=323 where i=123;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+124 123
+124 124
+124 125
+124 126
+125 123
+125 124
+125 125
+125 126
+126 123
+126 124
+126 125
+126 126
+323 123
+323 124
+323 125
+323 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE v1 SET i=326 where i=126;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+123 123
+123 124
+123 125
+123 126
+124 123
+124 124
+124 125
+124 126
+325 123
+325 124
+325 125
+325 126
+326 123
+326 124
+326 125
+326 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 325 3 125
+4 326 4 126
+connection default;
+UPDATE v1 SET i=324 where i=124;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+125 123
+125 124
+125 125
+125 126
+126 123
+126 124
+126 125
+126 126
+323 123
+323 124
+323 125
+323 126
+324 123
+324 124
+324 125
+324 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 325 3 125
+4 326 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP VIEW IF EXISTS v1;
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_2.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_2.result
new file mode 100644
index 00000000000..9e74e93b0cc
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_2.result
@@ -0,0 +1,200 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4
+SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+i
+123
+124
+123
+124
+123
+124
+123
+124
+connection root1;
+UPDATE v1 SET i=325 where i=125;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+123 123
+123 124
+123 125
+123 126
+124 123
+124 124
+124 125
+124 126
+126 123
+126 124
+126 125
+126 126
+325 123
+325 124
+325 125
+325 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 325 3 125
+4 126 4 126
+connection default;
+UPDATE v1 SET i=323 where i=123;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+124 123
+124 124
+124 125
+124 126
+125 123
+125 124
+125 125
+125 126
+126 123
+126 124
+126 125
+126 126
+323 123
+323 124
+323 125
+323 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE v1 SET i=326 where i=126;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+123 123
+123 124
+123 125
+123 126
+124 123
+124 124
+124 125
+124 126
+325 123
+325 124
+325 125
+325 126
+326 123
+326 124
+326 125
+326 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 325 3 125
+4 326 4 126
+connection default;
+UPDATE v1 SET i=324 where i=124;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+125 123
+125 124
+125 125
+125 126
+126 123
+126 124
+126 125
+126 126
+323 123
+323 124
+323 125
+323 126
+324 123
+324 124
+324 125
+324 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 325 3 125
+4 326 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP VIEW IF EXISTS v1;
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_1.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_1.result
new file mode 100644
index 00000000000..b5b1c519702
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_1.result
@@ -0,0 +1,169 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+1 SIMPLE t2 ref ixi ixi 5 test.t1.i 1 Using where
+SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+i i
+123 123
+124 124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE v1 SET i=323 where i=123;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+124 123
+124 124
+124 125
+124 126
+125 123
+125 124
+125 125
+125 126
+126 123
+126 124
+126 125
+126 126
+323 123
+323 124
+323 125
+323 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t1,t2 SET t1.i=226,t2.i=226 WHERE t1.i=126 AND t2.i=t1.i;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE v1 SET i=324 where i=124;
+SELECT * FROM v1 ORDER BY i,l;
+i l
+125 123
+125 124
+125 125
+125 126
+126 123
+126 124
+126 125
+126 126
+323 123
+323 124
+323 125
+323 126
+324 123
+324 124
+324 125
+324 126
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 323 1 123
+2 324 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP VIEW IF EXISTS v1;
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_2.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_2.result
new file mode 100644
index 00000000000..d92f9ad9664
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_mix_2.result
@@ -0,0 +1,38 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i, t2.l from t1,t2;
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 4
+SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+i
+123
+124
+123
+124
+123
+124
+123
+124
+connection root1;
+UPDATE t1,t2 SET t1.i=225,t2.i=225 WHERE t1.i=125 AND t2.i=t1.i;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_1.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_1.result
new file mode 100644
index 00000000000..e2a2a6e7deb
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_1.result
@@ -0,0 +1,309 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+DROP PROCEDURE IF EXISTS stp_t;
+SET autocommit=0;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+INSERT INTO t1 VALUES (5,127,5,127);
+INSERT INTO t1 VALUES (6,128,6,128);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+INSERT INTO t2 VALUES (5,127,5,127);
+INSERT INTO t2 VALUES (6,128,6,128);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE PROCEDURE stp_t (IN p1 int, IN p2 int) MODIFIES SQL DATA
+BEGIN
+UPDATE t2 SET i = p2 WHERE i = p1;
+UPDATE v1 SET i = p2 WHERE i = p1;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+CALL stp_t (125, 225);
+i
+123
+124
+126
+127
+128
+225
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+CALL stp_t (127, 227);
+i
+123
+124
+125
+126
+128
+227
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 128 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 128 6 128
+connection default;
+CALL stp_t (123, 223);
+i
+124
+125
+126
+127
+128
+223
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root1;
+CALL stp_t (126, 226);
+i
+123
+124
+127
+128
+225
+226
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+CALL stp_t (128, 228);
+i
+123
+124
+125
+126
+227
+228
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+connection default;
+CALL stp_t (124, 224);
+i
+125
+126
+127
+128
+223
+224
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+DELETE FROM t1 WHERE t1.i=228;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+COMMIT;
+connection root1;
+ROLLBACK;
+connection root1;
+COMMIT;
+connection default;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+127
+128
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root1;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+127
+128
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 127 5 127
+6 128 6 128
+connection root2;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+223
+227
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+5 227 5 127
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+5 227 5 127
+6 228 6 128
+connection default;
+DROP VIEW v1;
+DROP PROCEDURE stp_t;
+DROP TABLE t1, t2;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_2.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_2.result
new file mode 100644
index 00000000000..6dbd5f834ed
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_storedp_2.result
@@ -0,0 +1,46 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+DROP PROCEDURE IF EXISTS stp_t;
+SET autocommit=0;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+INSERT INTO t1 VALUES (5,127,5,127);
+INSERT INTO t1 VALUES (6,128,6,128);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+INSERT INTO t2 VALUES (5,127,5,127);
+INSERT INTO t2 VALUES (6,128,6,128);
+#CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE PROCEDURE stp_t (IN p1 int, IN p2 int) MODIFIES SQL DATA
+BEGIN
+UPDATE t2 SET i = p2 WHERE i = p1;
+UPDATE v1 SET i = p2 WHERE i = p1;
+SELECT * FROM v1 ORDER BY i;
+SELECT * FROM t1 ORDER BY t1.k;
+SELECT * FROM t2 ORDER BY t2.k;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+CALL stp_t (125, 225);
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_1.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_1.result
new file mode 100644
index 00000000000..f5c745ca41c
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_1.result
@@ -0,0 +1,180 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE v1 SET i = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ixi ixi 5 NULL 10 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
+SELECT * FROM v1 ORDER BY i;
+i
+123
+124
+126
+225
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 126 4 126
+connection default;
+UPDATE t2 SET t2.i=223 WHERE t2.i=123;
+SELECT * FROM v1 ORDER BY i;
+i
+124
+125
+126
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 124 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+UPDATE t2 SET t2.i=226 WHERE t2.i=126;
+SELECT * FROM v1 ORDER BY i;
+i
+123
+124
+225
+226
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+UPDATE t2 SET t2.i=224 WHERE t2.i=124;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+223
+224
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+DELETE FROM t1 WHERE t1.i=226;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 123 1 123
+2 124 2 124
+3 225 3 125
+4 226 4 126
+connection default;
+DELETE FROM t1 WHERE t1.i=224;
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+COMMIT;
+connection root1;
+ROLLBACK;
+connection default;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection root1;
+SELECT * FROM v1 ORDER BY i;
+i
+125
+126
+223
+SELECT * FROM t1 ORDER BY t1.k;
+k i j l
+1 223 1 123
+3 125 3 125
+4 126 4 126
+SELECT * FROM t2 ORDER BY t2.k;
+k i j l
+1 223 1 123
+2 224 2 124
+3 125 3 125
+4 126 4 126
+connection default;
+DROP TABLE t1, t2;
+DROP VIEW v1;
diff --git a/mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_2.result b/mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_2.result
new file mode 100644
index 00000000000..d6a38753c1d
--- /dev/null
+++ b/mysql-test/suite/row_lock/r/ndb_row_lock_view_trig_2.result
@@ -0,0 +1,36 @@
+DROP TABLE IF EXISTS t1, t2;
+DROP VIEW IF EXISTS v1;
+SET autocommit=0;
+SET autocommit=0;
+connection default;
+CREATE TABLE t1 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t1 VALUES (1,123,1,123);
+INSERT INTO t1 VALUES (2,124,2,124);
+INSERT INTO t1 VALUES (3,125,3,125);
+INSERT INTO t1 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t1 (i);
+CREATE TABLE t2 (k INT NOT NULL PRIMARY KEY, i INT, j INT, l INT) ENGINE=NDB;
+INSERT INTO t2 VALUES (1,123,1,123);
+INSERT INTO t2 VALUES (2,124,2,124);
+INSERT INTO t2 VALUES (3,125,3,125);
+INSERT INTO t2 VALUES (4,126,4,126);
+#CREATE INDEX ixi ON t2 (i);
+CREATE VIEW v1 AS SELECT t1.i from t1;
+CREATE TRIGGER trig_t2 AFTER UPDATE ON t2
+FOR EACH ROW BEGIN
+UPDATE v1 SET i = NEW.i WHERE i = OLD.i;
+END;
+|
+COMMIT;
+SELECT @@global.tx_isolation;
+@@global.tx_isolation
+REPEATABLE-READ
+EXPLAIN SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
+SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+i
+123
+124
+connection root1;
+UPDATE t2 SET t2.i=225 WHERE t2.i=125;
diff --git a/mysql-test/suite/row_lock/readme.txt b/mysql-test/suite/row_lock/readme.txt
new file mode 100644
index 00000000000..b43f04ecda4
--- /dev/null
+++ b/mysql-test/suite/row_lock/readme.txt
@@ -0,0 +1,9 @@
+All row lock test with InnoDB have to be executed with the options
+
+--innodb_lock_wait_timeout=1
+--innodb_locks_unsafe_for_binlog
+
+for example
+
+perl mysql-test-run.pl --mysqld=--innodb_lock_wait_timeout=2 --mysqld=--innodb_locks_unsafe_for_binlog --suite=row_lock innodb_row_lock_2
+
diff --git a/mysql-test/suite/row_lock/summary_of_sel_test.txt b/mysql-test/suite/row_lock/summary_of_sel_test.txt
new file mode 100644
index 00000000000..0fa332e957a
--- /dev/null
+++ b/mysql-test/suite/row_lock/summary_of_sel_test.txt
@@ -0,0 +1,36 @@
+Test plan:
+Create 2 tables with a primary key and 3 integer columns. Both get the same rows (1,123,1,123),(2,124,2,124),(3,125,3,125),(4,126,4,126). The second and third column may get an index to have cases with, without and mutilple index. Create views on the tables. Create an update trigger. Create a stored procedure updating the table. Create a stored function updating the table and deliver the key as result.
+
+The test isself consists of 2 sessions (transactions) running in "parallel" (same user "root") accessing and locking the same tables on basis of a row lock. Expected is that both sessions(transactions) can update the table successfully.
+
+First session
+execute an explain to every select and one of the following selects on the first half of table t1:
+- select <non index columns> ... where ... for update;
+- select <non index columns> ... where ... lock in share mode;
+- select <indexed columns> ... where ... for update;
+- select <indexed columns> ... where ... lock in share mode;
+- select <indexed columns> ... ignore index ... where ... for update;
+- select <indexed columns> ... ignore index ... where ... lock in share mode;
+- select ... where (select...) ... for update;
+- select ... where (select...) ... lock in share mode;
+- (select ... where) union (select ... where) for update;
+- (select ... where) union (select ... where) lock in...;
+- select <view> ... where ... for update;
+- select <view> ... where ... lock in ...;
+- select <join> ... where ... for update;
+- select <join> ... where ... lock in ...;
+Then executes
+- update
+- delete
+- trigger accessing table t1
+- stored procedure accessing table t1
+- stored function accessing table t1
+
+Second session
+executes the same on the last half of table t1
+
+call of mysqld with option
+--innodb_locks_unsafe_for_binlog
+
+As the tests above work with small tables (<10 rows) there must be at least one test with a big table (>1000 rows) doing a table scan.
+
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_1.test b/mysql-test/suite/row_lock/t/innodb_row_lock_1.test
new file mode 100644
index 00000000000..e0440fe2669
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_1.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_2.test b/mysql-test/suite/row_lock/t/innodb_row_lock_2.test
new file mode 100644
index 00000000000..5cb3ea9f2d9
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_2.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_3.test b/mysql-test/suite/row_lock/t/innodb_row_lock_3.test
new file mode 100644
index 00000000000..11f4dc423d6
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_3.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_4.test b/mysql-test/suite/row_lock/t/innodb_row_lock_4.test
new file mode 100644
index 00000000000..0a8ca9c13a0
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_4.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_5.test b/mysql-test/suite/row_lock/t/innodb_row_lock_5.test
new file mode 100644
index 00000000000..7e411d31649
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_5.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1 ignore index (ixi),t2 IGNORE INDEX (ixi) WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab.test b/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab.test
new file mode 100644
index 00000000000..0c5b8b41bd5
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < half_t1() AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_big_tab.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_1.test b/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_1.test
new file mode 100644
index 00000000000..a12a07d82a9
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_1.test
@@ -0,0 +1,10 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $nbrows= 40;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 0 AND t1.k = t2.k LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_big_tab_1.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_2.test b/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_2.test
new file mode 100644
index 00000000000..49e834eb2ce
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_big_tab_2.test
@@ -0,0 +1,10 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $nbrows= 40;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.k % 2= 0 AND t1.k = t2.k LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_big_tab_2.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_trig_1.test b/mysql-test/suite/row_lock/t/innodb_row_lock_trig_1.test
new file mode 100644
index 00000000000..225513d3f87
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_trig_1.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_trig.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_trig_2.test b/mysql-test/suite/row_lock/t/innodb_row_lock_trig_2.test
new file mode 100644
index 00000000000..88dee5f23f8
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_trig_2.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_trig.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_1.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_1.test
new file mode 100644
index 00000000000..d6381e1da5b
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_1.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_2.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_2.test
new file mode 100644
index 00000000000..ee45e683669
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_2.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_1.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_1.test
new file mode 100644
index 00000000000..49cba88dd23
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_1.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_mix.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_2.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_2.test
new file mode 100644
index 00000000000..b07f3a3378a
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_mix_2.test
@@ -0,0 +1,10 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+#let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $select= SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_mix.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_1.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_1.test
new file mode 100644
index 00000000000..d507ff3296f
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_1.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_storedp.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_2.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_2.test
new file mode 100644
index 00000000000..a1bfb16055e
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_storedp_2.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_storedp.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_1.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_1.test
new file mode 100644
index 00000000000..24c76532d17
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_1.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_trig.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_2.test b/mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_2.test
new file mode 100644
index 00000000000..a8a67d77979
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/innodb_row_lock_view_trig_2.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+SELECT @@global.innodb_table_locks into @table_locks;
+SET @@global.innodb_table_locks= OFF;
+let $engine= InnoDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_trig.inc
+SET @@global.innodb_table_locks= @table_locks;
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_1.test b/mysql-test/suite/row_lock/t/ndb_row_lock_1.test
new file mode 100644
index 00000000000..6ac2e829008
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_1.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_2.test b/mysql-test/suite/row_lock/t/ndb_row_lock_2.test
new file mode 100644
index 00000000000..994ecba96b0
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_2.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_3.test b/mysql-test/suite/row_lock/t/ndb_row_lock_3.test
new file mode 100644
index 00000000000..2de43c61c2a
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_3.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_4.test b/mysql-test/suite/row_lock/t/ndb_row_lock_4.test
new file mode 100644
index 00000000000..72b20488c74
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_4.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_5.test b/mysql-test/suite/row_lock/t/ndb_row_lock_5.test
new file mode 100644
index 00000000000..045f127a4ef
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_5.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1 ignore index (ixi),t2 IGNORE INDEX (ixi) WHERE t1.i<125 AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab.test b/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab.test
new file mode 100644
index 00000000000..bf2df104e03
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < half_t1() AND t2.i=t1.i LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_big_tab.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_1.test b/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_1.test
new file mode 100644
index 00000000000..4d32991d379
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_1.test
@@ -0,0 +1,7 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $nbrows= 200;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < t1.k % 2 = 0 AND t2.k=t1.k LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_big_tab_1.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_2.test b/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_2.test
new file mode 100644
index 00000000000..894a83fc1b0
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_big_tab_2.test
@@ -0,0 +1,7 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $nbrows= 200;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i < t1.k % 2 = 0 AND t2.k=t1.k LOCK IN SHARE MODE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_big_tab_2.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_trig_1.test b/mysql-test/suite/row_lock/t/ndb_row_lock_trig_1.test
new file mode 100644
index 00000000000..a5586a6101e
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_trig_1.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_trig.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_trig_2.test b/mysql-test/suite/row_lock/t/ndb_row_lock_trig_2.test
new file mode 100644
index 00000000000..7af13697ccc
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_trig_2.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_trig.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_1.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_1.test
new file mode 100644
index 00000000000..a1aaf5ab441
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_1.test
@@ -0,0 +1,7 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view.inc
+
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_2.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_2.test
new file mode 100644
index 00000000000..b8feef693e7
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_2.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_1.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_1.test
new file mode 100644
index 00000000000..a97626048d3
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_1.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i,t2.i FROM t1,t2 WHERE t1.i<125 AND t2.i=t1.i FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_mix.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_2.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_2.test
new file mode 100644
index 00000000000..e7a9a715785
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_mix_2.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT v1.i FROM v1 WHERE v1.i<125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_mix.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_1.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_1.test
new file mode 100644
index 00000000000..f57bcb3dd1b
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_1.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_storedp.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_2.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_2.test
new file mode 100644
index 00000000000..b0aaa38fb93
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_storedp_2.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_storedp.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_1.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_1.test
new file mode 100644
index 00000000000..9c4128d78bf
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_1.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= CREATE INDEX ixi ON t1 (i);
+let $indext2= CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_trig.inc
diff --git a/mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_2.test b/mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_2.test
new file mode 100644
index 00000000000..38c9472fb3d
--- /dev/null
+++ b/mysql-test/suite/row_lock/t/ndb_row_lock_view_trig_2.test
@@ -0,0 +1,6 @@
+--source include/have_ndb.inc
+let $engine= NDB;
+let $select= SELECT t1.i FROM t1 WHERE t1.i< 125 FOR UPDATE;
+let $indext1= #CREATE INDEX ixi ON t1 (i);
+let $indext2= #CREATE INDEX ixi ON t2 (i);
+--source suite/row_lock/include/row_lock_view_trig.inc
diff --git a/mysys/thr_alarm.c.rej b/mysys/thr_alarm.c.rej
deleted file mode 100644
index c991121052e..00000000000
--- a/mysys/thr_alarm.c.rej
+++ /dev/null
@@ -1,220 +0,0 @@
-***************
-*** 76,96 ****
- alarm_aborted=0;
- init_queue(&alarm_queue,max_alarms+1,offsetof(ALARM,expire_time),0,
- compare_ulong,NullS);
-! sigfillset(&full_signal_set); /* Neaded to block signals */
- pthread_mutex_init(&LOCK_alarm,MY_MUTEX_INIT_FAST);
- pthread_cond_init(&COND_alarm,NULL);
-! #if THR_CLIENT_ALARM != SIGALRM || defined(USE_ALARM_THREAD)
-! #if defined(HAVE_mit_thread)
-! sigset(THR_CLIENT_ALARM,thread_alarm); /* int. thread system calls */
-! #else
- {
-! struct sigaction sact;
-! sact.sa_flags = 0;
-! sact.sa_handler = thread_alarm;
-! sigaction(THR_CLIENT_ALARM, &sact, (struct sigaction*) 0);
- }
-- #endif
-- #endif
- sigemptyset(&s);
- sigaddset(&s, THR_SERVER_ALARM);
- alarm_thread=pthread_self();
---- 74,89 ----
- alarm_aborted=0;
- init_queue(&alarm_queue,max_alarms+1,offsetof(ALARM,expire_time),0,
- compare_ulong,NullS);
-! sigfillset(&full_signal_set); /* Needed to block signals */
- pthread_mutex_init(&LOCK_alarm,MY_MUTEX_INIT_FAST);
- pthread_cond_init(&COND_alarm,NULL);
-! #ifndef USE_ALARM_THREAD
-! if (thd_lib_detected != THD_LIB_LT)
-! #endif
- {
-! my_sigset(thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1,
-! thread_alarm);
- }
- sigemptyset(&s);
- sigaddset(&s, THR_SERVER_ALARM);
- alarm_thread=pthread_self();
-***************
-*** 108,120 ****
- }
- #elif defined(USE_ONE_SIGNAL_HAND)
- pthread_sigmask(SIG_BLOCK, &s, NULL); /* used with sigwait() */
-! #if THR_SERVER_ALARM == THR_CLIENT_ALARM
-! sigset(THR_CLIENT_ALARM,process_alarm); /* Linuxthreads */
-! pthread_sigmask(SIG_UNBLOCK, &s, NULL);
-! #endif
- #else
- pthread_sigmask(SIG_UNBLOCK, &s, NULL);
-- sigset(THR_SERVER_ALARM,process_alarm);
- #endif
- DBUG_VOID_RETURN;
- }
---- 101,115 ----
- }
- #elif defined(USE_ONE_SIGNAL_HAND)
- pthread_sigmask(SIG_BLOCK, &s, NULL); /* used with sigwait() */
-! if (thd_lib_detected == THD_LIB_LT)
-! {
-! my_sigset(thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1,
-! process_alarm); /* Linuxthreads */
-! pthread_sigmask(SIG_UNBLOCK, &s, NULL);
-! }
- #else
-+ my_sigset(THR_SERVER_ALARM, process_alarm);
- pthread_sigmask(SIG_UNBLOCK, &s, NULL);
- #endif
- DBUG_VOID_RETURN;
- }
-***************
-*** 240,246 ****
- if (alarm_data->malloced)
- my_free((gptr) alarm_data,MYF(0));
- found++;
-! #ifndef DBUG_OFF
- break;
- #endif
- }
---- 235,241 ----
- if (alarm_data->malloced)
- my_free((gptr) alarm_data,MYF(0));
- found++;
-! #ifdef DBUG_OFF
- break;
- #endif
- }
-***************
-*** 249,258 ****
- if (!found)
- {
- if (*alarmed)
-! fprintf(stderr,"Warning: Didn't find alarm %lx in queue of %d alarms\n",
-! (long) *alarmed, alarm_queue.elements);
-! DBUG_PRINT("warning",("Didn't find alarm %lx in queue\n",
-! (long) *alarmed));
- }
- pthread_mutex_unlock(&LOCK_alarm);
- pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
---- 244,254 ----
- if (!found)
- {
- if (*alarmed)
-! fprintf(stderr,
-! "Warning: Didn't find alarm 0x%lx in queue of %d alarms\n",
-! (long) *alarmed, alarm_queue.elements);
-! DBUG_PRINT("warning",("Didn't find alarm 0x%lx in queue\n",
-! (long) *alarmed));
- }
- pthread_mutex_unlock(&LOCK_alarm);
- pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
-***************
-*** 274,291 ****
- This must be first as we can't call DBUG inside an alarm for a normal thread
- */
-
-! #if THR_SERVER_ALARM == THR_CLIENT_ALARM
-! if (!pthread_equal(pthread_self(),alarm_thread))
- {
- #if defined(MAIN) && !defined(__bsdi__)
-! printf("thread_alarm\n"); fflush(stdout);
- #endif
- #ifdef DONT_REMEMBER_SIGNAL
-! sigset(THR_CLIENT_ALARM,process_alarm); /* int. thread system calls */
- #endif
- return;
- }
-- #endif
-
- /*
- We have to do do the handling of the alarm in a sub function,
---- 270,287 ----
- This must be first as we can't call DBUG inside an alarm for a normal thread
- */
-
-! if (thd_lib_detected == THD_LIB_LT &&
-! !pthread_equal(pthread_self(),alarm_thread))
- {
- #if defined(MAIN) && !defined(__bsdi__)
-! printf("thread_alarm in process_alarm\n"); fflush(stdout);
- #endif
- #ifdef DONT_REMEMBER_SIGNAL
-! my_sigset(thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1,
-! process_alarm); /* int. thread system calls */
- #endif
- return;
- }
-
- /*
- We have to do do the handling of the alarm in a sub function,
-***************
-*** 301,307 ****
- process_alarm_part2(sig);
- #ifndef USE_ALARM_THREAD
- #if defined(DONT_REMEMBER_SIGNAL) && !defined(USE_ONE_SIGNAL_HAND)
-! sigset(THR_SERVER_ALARM,process_alarm);
- #endif
- pthread_mutex_unlock(&LOCK_alarm);
- pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
---- 297,303 ----
- process_alarm_part2(sig);
- #ifndef USE_ALARM_THREAD
- #if defined(DONT_REMEMBER_SIGNAL) && !defined(USE_ONE_SIGNAL_HAND)
-! my_sigset(THR_SERVER_ALARM, process_alarm);
- #endif
- pthread_mutex_unlock(&LOCK_alarm);
- pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
-***************
-*** 504,520 ****
- ARGSUSED
- */
-
-- #if THR_CLIENT_ALARM != SIGALRM || defined(USE_ALARM_THREAD)
- static sig_handler thread_alarm(int sig)
- {
- #ifdef MAIN
- printf("thread_alarm\n"); fflush(stdout);
- #endif
- #ifdef DONT_REMEMBER_SIGNAL
-! sigset(sig,thread_alarm); /* int. thread system calls */
- #endif
- }
-- #endif
-
-
- #ifdef HAVE_TIMESPEC_TS_SEC
---- 499,513 ----
- ARGSUSED
- */
-
- static sig_handler thread_alarm(int sig)
- {
- #ifdef MAIN
- printf("thread_alarm\n"); fflush(stdout);
- #endif
- #ifdef DONT_REMEMBER_SIGNAL
-! my_sigset(sig, thread_alarm); /* int. thread system calls */
- #endif
- }
-
-
- #ifdef HAVE_TIMESPEC_TS_SEC
-***************
-*** 915,921 ****
- printf("Warning: Got signal %d from thread %s\n",sig,my_thread_name());
- fflush(stdout);
- #ifdef DONT_REMEMBER_SIGNAL
-! sigset(sig,print_signal_warning); /* int. thread system calls */
- #endif
- #ifndef OS2
- if (sig == SIGALRM)
---- 908,914 ----
- printf("Warning: Got signal %d from thread %s\n",sig,my_thread_name());
- fflush(stdout);
- #ifdef DONT_REMEMBER_SIGNAL
-! my_sigset(sig, print_signal_warning); /* int. thread system calls */
- #endif
- #ifndef OS2
- if (sig == SIGALRM)
diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh
index 7d7918975f2..e8bf39bd016 100644
--- a/scripts/make_binary_distribution.sh
+++ b/scripts/make_binary_distribution.sh
@@ -115,7 +115,12 @@ if [ $BASE_SYSTEM != "netware" ] ; then
chmod o-rwx $BASE/data $BASE/data/*
fi
-# Copy files if they exists, warn for those that don't
+# Copy files if they exists, warn for those that don't.
+# Note that when listing files to copy, we might list the file name
+# twice, once in the directory location where it is build, and a
+# second time in the ".libs" location. In the case the firs one
+# is a wrapper script, the second one will overwrite it with the
+# binary file.
copyfileto()
{
destdir=$1
@@ -165,6 +170,7 @@ if [ $BASE_SYSTEM = "netware" ] ; then
# For all other platforms:
else
BIN_FILES="$BIN_FILES \
+ server-tools/instance-manager/.libs/mysqlmanager \
client/mysqltestmanagerc \
client/mysqltestmanager-pwgen tools/mysqltestmanager \
client/.libs/mysql client/.libs/mysqlshow client/.libs/mysqladmin \
diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh
index 8cb425edcec..54e2a6adba6 100644
--- a/support-files/mysql.spec.sh
+++ b/support-files/mysql.spec.sh
@@ -14,7 +14,7 @@
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston
# MA 02110-1301 USA.
-%define mysql_version @VERSION@
+%define mysql_version @VERSION@
# use "rpmbuild --with static" or "rpm --define '_with_static 1'" (for RPM 3.x)
# to enable static linking (off by default)
@@ -32,10 +32,10 @@
%define release 0.glibc23
%endif
%define license GPL
-%define mysqld_user mysql
-%define mysqld_group mysql
-%define server_suffix -standard
-%define mysqldatadir /var/lib/mysql
+%define mysqld_user mysql
+%define mysqld_group mysql
+%define server_suffix -community
+%define mysqldatadir /var/lib/mysql
# We don't package all files installed into the build root by intention -
# See BUG#998 for details.
@@ -99,7 +99,7 @@ Summary: MySQL: a very fast and reliable SQL database server
Group: Applications/Databases
Requires: coreutils grep procps /usr/sbin/useradd /usr/sbin/groupadd /sbin/chkconfig
Provides: msqlormysql mysql-server mysql MySQL
-Obsoletes: MySQL mysql mysql-server
+Obsoletes: MySQL mysql mysql-server mysql-Max
%description server
The MySQL(TM) software delivers a very fast, multi-threaded, multi-user,
@@ -120,7 +120,7 @@ This package includes the MySQL server binary (incl. InnoDB) as well
as related utilities to run and administrate a MySQL server.
If you want to access and work with the database, you have to install
-package "MySQL-client" as well!
+the package "MySQL-client" as well!
%package client
Summary: MySQL - Client
@@ -141,8 +141,6 @@ Group: Applications/Databases
This package contains the ndbcluster storage engine.
It is necessary to have this package installed on all
computers that should store ndbcluster table data.
-Note that this storage engine can only be used in conjunction
-with the MySQL Max server.
%{see_base}
@@ -211,29 +209,6 @@ Obsoletes: mysql-shared
This package contains the shared libraries (*.so*) which certain
languages and applications need to dynamically load and use MySQL.
-%package Max
-Summary: MySQL - server with extended functionality
-Group: Applications/Databases
-Provides: mysql-Max
-Obsoletes: mysql-Max
-Requires: MySQL-server >= @MYSQL_BASE_VERSION@
-
-%description Max
-Optional MySQL server binary that supports additional features like:
-
- - Berkeley DB Storage Engine
- - Ndbcluster Storage Engine interface
- - Archive Storage Engine
- - CSV Storage Engine
- - Example Storage Engine
- - Federated Storage Engine
- - User Defined Functions (UDFs).
-
-To activate this binary, just install this package in addition to
-the standard MySQL package.
-
-Please note that this is a dynamically linked binary!
-
#%package embedded
#Requires: %{name}-devel
#Summary: MySQL - embedded library
@@ -323,9 +298,6 @@ mkdir -p $RBR%{_libdir}/mysql
PATH=${MYSQL_BUILD_PATH:-/bin:/usr/bin}
export PATH
-# Build the Max binary (includes BDB and UDFs and therefore
-# cannot be linked statically against the patched glibc)
-
# Use gcc for C and C++ code (to avoid a dependency on libstdc++ and
# including exceptions into the code
if [ -z "$CXX" -a -z "$CC" ]
@@ -334,76 +306,44 @@ then
export CXX="gcc"
fi
-BuildMySQL "--enable-shared \
- --with-extra-charsets=all \
- --with-berkeley-db \
- --with-innodb \
- --with-ndbcluster \
- --with-archive-storage-engine \
- --with-csv-storage-engine \
- --with-example-storage-engine \
- --with-blackhole-storage-engine \
- --with-federated-storage-engine \
- --with-big-tables \
- --with-comment=\"MySQL Community Edition - Experimental (GPL)\" \
- --with-server-suffix='-max'"
-
-# We might want to save the config log file
-if test -n "$MYSQL_MAXCONFLOG_DEST"
-then
- cp -fp config.log "$MYSQL_MAXCONFLOG_DEST"
-fi
-
-make test-bt
-
-# Save mysqld-max
-./libtool --mode=execute cp sql/mysqld sql/mysqld-max
-./libtool --mode=execute nm --numeric-sort sql/mysqld-max > sql/mysqld-max.sym
-
-# Save the perror binary so it supports the NDB error codes (BUG#13740)
-./libtool --mode=execute cp extra/perror extra/perror.ndb
-
-# Install the ndb binaries
-(cd ndb; make install DESTDIR=$RBR)
-
-# Include libgcc.a in the devel subpackage (BUG 4921)
-if expr "$CC" : ".*gcc.*" > /dev/null ;
-then
- libgcc=`$CC $CFLAGS --print-libgcc-file`
- if [ -f $libgcc ]
- then
- %define have_libgcc 1
- install -m 644 $libgcc $RBR%{_libdir}/mysql/libmygcc.a
- fi
-fi
-
-# Save libraries
-(cd libmysql/.libs; tar cf $RBR/shared-libs.tar *.so*)
-(cd libmysql_r/.libs; tar rf $RBR/shared-libs.tar *.so*)
-(cd ndb/src/.libs; tar rf $RBR/shared-libs.tar *.so*)
-
-# Now clean up
-make clean
-
#
# Only link statically on our i386 build host (which has a specially
# patched static glibc installed) - ia64 and x86_64 run glibc-2.3 (unpatched)
# so don't link statically there
#
-BuildMySQL "--disable-shared \
+for servertype in '--with-debug=full' ' '
+do
+ BuildMySQL "\
%if %{STATIC_BUILD}
+ --disable-shared \
--with-mysqld-ldflags='-all-static' \
--with-client-ldflags='-all-static' \
$USE_OTHER_LIBC_DIR \
%else
+ --enable-shared \
--with-zlib-dir=bundled \
%endif
--with-extra-charsets=complex \
- --with-comment=\"MySQL Community Edition - Standard (GPL)\" \
+ --with-comment=\"MySQL Community Edition (GPL)\" \
--with-server-suffix='%{server_suffix}' \
--with-archive-storage-engine \
--with-innodb \
- --with-big-tables"
+ --with-ndbcluster \
+ --with-csv-storage-engine \
+ --with-example-storage-engine \
+ --with-blackhole-storage-engine \
+ --with-federated-storage-engine \
+ --with-big-tables $servertype"
+ if test "$servertype" != ' '
+ then
+ # if this is not the regular build, we save the server binary
+ ./libtool --mode=execute cp sql/mysqld sql/mysqld-debug
+ ./libtool --mode=execute nm --numeric-sort sql/mysqld-debug > sql/mysqld-debug.sym
+ echo "# debug"
+ make test-bt
+ make clean
+ fi
+done
./libtool --mode=execute nm --numeric-sort sql/mysqld > sql/mysqld.sym
@@ -413,6 +353,7 @@ then
cp -fp config.log "$MYSQL_CONFLOG_DEST"
fi
+echo "# standard"
make test-bt
%install
@@ -428,22 +369,33 @@ install -d $RBR%{_libdir}
install -d $RBR%{_mandir}
install -d $RBR%{_sbindir}
-
# Install all binaries stripped
make install-strip DESTDIR=$RBR benchdir_root=%{_datadir}
-# Install shared libraries (Disable for architectures that don't support it)
-(cd $RBR%{_libdir}; tar xf $RBR/shared-libs.tar; rm -f $RBR/shared-libs.tar)
+# Install the ndb binaries
+(cd ndb; make install DESTDIR=$RBR)
-# install saved mysqld-max
-install -s -m 755 $MBD/sql/mysqld-max $RBR%{_sbindir}/mysqld-max
+# Install the saved debug server
+install -s -m 755 $MBD/sql/mysqld-debug $RBR%{_sbindir}/mysqld-debug
-# install saved perror binary with NDB support (BUG#13740)
-install -s -m 755 $MBD/extra/perror.ndb $RBR%{_bindir}/perror
+# Install shared libraries (Disable for architectures that don't support it)
+# (cd $RBR%{_libdir}; tar xf $RBR/shared-libs.tar; rm -f $RBR/shared-libs.tar)
+
+# Include libgcc.a in the devel subpackage (BUG 4921)
+if expr "$CC" : ".*gcc.*" > /dev/null ;
+then
+ libgcc=`$CC $CFLAGS --print-libgcc-file`
+ if [ -f $libgcc ]
+ then
+ %define have_libgcc 1
+ install -m 644 $libgcc $RBR%{_libdir}/mysql/libmygcc.a
+ fi
+fi
# install symbol files ( for stack trace resolution)
-install -m 644 $MBD/sql/mysqld-max.sym $RBR%{_libdir}/mysql/mysqld-max.sym
+# install -m 644 $MBD/sql/mysqld-max.sym $RBR%{_libdir}/mysql/mysqld-max.sym
install -m 644 $MBD/sql/mysqld.sym $RBR%{_libdir}/mysql/mysqld.sym
+install -m 644 $MBD/sql/mysqld-debug.sym $RBR%{_libdir}/mysql/mysqld-debug.sym
# Install logrotate and autostart
install -m 644 $MBD/support-files/mysql-log-rotate $RBR%{_sysconfdir}/logrotate.d/mysql
@@ -529,19 +481,12 @@ chmod -R og-rw $mysql_datadir/mysql
# Allow safe_mysqld to start mysqld and print a message before we exit
sleep 2
-
%post ndb-storage
mysql_clusterdir=/var/lib/mysql-cluster
# Create cluster directory if needed
if test ! -d $mysql_clusterdir; then mkdir -m 755 $mysql_clusterdir; fi
-
-%post Max
-# Restart mysqld, to use the new binary.
-echo "Restarting mysqld."
-%{_sysconfdir}/init.d/mysql restart > /dev/null 2>&1
-
%preun server
if test $1 = 0
then
@@ -611,7 +556,6 @@ fi
%attr(755, root, root) %{_bindir}/myisamlog
%attr(755, root, root) %{_bindir}/myisampack
%attr(755, root, root) %{_bindir}/mysql_convert_table_format
-%attr(755, root, root) %{_bindir}/mysql_create_system_tables
%attr(755, root, root) %{_bindir}/mysql_explain_log
%attr(755, root, root) %{_bindir}/mysql_fix_extensions
%attr(755, root, root) %{_bindir}/mysql_fix_privilege_tables
@@ -634,6 +578,7 @@ fi
%attr(755, root, root) %{_bindir}/safe_mysqld
%attr(755, root, root) %{_sbindir}/mysqld
+%attr(755, root, root) %{_sbindir}/mysqld-debug
%attr(755, root, root) %{_sbindir}/mysqlmanager
%attr(755, root, root) %{_sbindir}/rcmysql
%attr(644, root, root) %{_libdir}/mysql/mysqld.sym
@@ -762,11 +707,6 @@ fi
%doc %attr(644, root, man) %{_mandir}/man1/mysql-stress-test.pl.1*
%doc %attr(644, root, man) %{_mandir}/man1/mysql-test-run.pl.1*
-%files Max
-%defattr(-, root, root, 0755)
-%attr(755, root, root) %{_sbindir}/mysqld-max
-%attr(644, root, root) %{_libdir}/mysql/mysqld-max.sym
-
#%files embedded
#%defattr(-, root, root, 0755)
# %attr(644, root, root) %{_libdir}/mysql/libmysqld.a
@@ -774,7 +714,20 @@ fi
# The spec file changelog only includes changes made to the spec file
# itself - note that they must be ordered by date (important when
# merging BK trees)
-%changelog
+%changelog
+* Sat Apr 07 2007 Kent Boortz <kent@mysql.com>
+
+- Removed man page for "mysql_create_system_tables"
+
+* Wed Mar 21 2007 Daniel Fischer <df@mysql.com>
+
+- Add debug server.
+
+* Mon Mar 19 2007 Daniel Fischer <df@mysql.com>
+
+- Remove Max RPMs; the server RPMs contain a mysqld compiled with all
+ features that previously only were built into Max.
+
* Fri Mar 02 2007 Joerg Bruehe <joerg@mysql.com>
- Add several man pages for NDB which are now created.
diff --git a/zlib/Makefile.am b/zlib/Makefile.am
index c40c922851e..f5741a782fb 100644
--- a/zlib/Makefile.am
+++ b/zlib/Makefile.am
@@ -21,7 +21,8 @@ LIBS= $(NON_THREADED_LIBS)
pkglib_LTLIBRARIES=libz.la
-libz_la_LDFLAGS= -version-info 3:3:2
+# We are never interested in a shared version
+libz_la_LDFLAGS= -static
noinst_HEADERS= crc32.h deflate.h inffast.h inffixed.h inflate.h \
inftrees.h trees.h zconf.h zlib.h zutil.h