summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <tsmith@siva.hindu.god>2007-04-17 15:38:59 -0600
committerunknown <tsmith@siva.hindu.god>2007-04-17 15:38:59 -0600
commit4e387d6c0f46f53e6acfa0102d13ab81f1ce01a6 (patch)
tree75bff5859e8b9e2c83a2ad97648ce1376082e3fe
parent247c3a81a1cf3c72ac86a9a1bf466a750bb6c6e3 (diff)
parent78c734b0132fbd53ff033eada5a9664919370739 (diff)
downloadmariadb-git-4e387d6c0f46f53e6acfa0102d13ab81f1ce01a6.tar.gz
Merge siva.hindu.god:/home/tsmith/m/bk/41
into siva.hindu.god:/home/tsmith/m/bk/maint/41
-rw-r--r--BUILD/SETUP.sh.rej19
-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/r/row.result18
-rw-r--r--mysql-test/t/row.test25
-rw-r--r--mysys/thr_alarm.c.rej220
-rw-r--r--ndb/src/kernel/blocks/ERROR_codes.txt7
-rw-r--r--ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp22
-rw-r--r--ndb/src/kernel/blocks/dbtc/DbtcMain.cpp38
-rw-r--r--ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp6
-rw-r--r--ndb/test/ndbapi/testScan.cpp41
-rw-r--r--ndb/test/run-test/daily-basic-tests.txt4
-rw-r--r--sql/item_cmpfunc.cc65
14 files changed, 206 insertions, 655 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/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/r/row.result b/mysql-test/r/row.result
index 76d6fa13766..1c1c4809f36 100644
--- a/mysql-test/r/row.result
+++ b/mysql-test/r/row.result
@@ -170,3 +170,21 @@ ROW(2,10) <=> ROW(3,4)
SELECT ROW(NULL,10) <=> ROW(3,NULL);
ROW(NULL,10) <=> ROW(3,NULL)
0
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2)));
+ERROR 21000: Operand should contain 3 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0));
+ERROR 21000: Operand should contain 1 column(s)
+SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2));
+ERROR 21000: Operand should contain 1 column(s)
diff --git a/mysql-test/t/row.test b/mysql-test/t/row.test
index d8d9a244134..6c66d45b942 100644
--- a/mysql-test/t/row.test
+++ b/mysql-test/t/row.test
@@ -83,4 +83,29 @@ drop table t1;
SELECT ROW(2,10) <=> ROW(3,4);
SELECT ROW(NULL,10) <=> ROW(3,NULL);
+#
+# Bug #27484: nested row expressions in IN predicate
+#
+
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3)));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2)));
+--error 1241
+SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2)));
+
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4)));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3)));
+
+--error 1241
+SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0));
+--error 1241
+SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2));
+
# End of 4.1 tests
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/ndb/src/kernel/blocks/ERROR_codes.txt b/ndb/src/kernel/blocks/ERROR_codes.txt
index 874c128a56d..a1472cf8376 100644
--- a/ndb/src/kernel/blocks/ERROR_codes.txt
+++ b/ndb/src/kernel/blocks/ERROR_codes.txt
@@ -6,7 +6,7 @@ Next DBTUP 4014
Next DBLQH 5043
Next DBDICT 6006
Next DBDIH 7178
-Next DBTC 8038
+Next DBTC 8039
Next CMVMI 9000
Next BACKUP 10022
Next DBUTIL 11002
@@ -285,6 +285,11 @@ ABORT OF TCKEYREQ
8037 : Invalid schema version in TCINDXREQ
+------
+
+8038 : Simulate API disconnect just after SCAN_TAB_REQ
+
+
CMVMI
-----
9000 Set RestartOnErrorInsert to restart -n
diff --git a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
index f9290a75afb..6519444c364 100644
--- a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
+++ b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
@@ -311,6 +311,16 @@ void Cmvmi::execSTTOR(Signal* signal)
jamEntry();
if (theStartPhase == 1){
jam();
+
+ if(theConfig.lockPagesInMainMemory())
+ {
+ int res = NdbMem_MemLockAll();
+ if(res != 0){
+ g_eventLogger.warning("Failed to memlock pages");
+ warningEvent("Failed to memlock pages");
+ }
+ }
+
sendSTTORRY(signal);
return;
} else if (theStartPhase == 3) {
@@ -331,18 +341,6 @@ void Cmvmi::execSTTOR(Signal* signal)
execOPEN_COMREQ(signal);
globalData.theStartLevel = NodeState::SL_STARTED;
sendSTTORRY(signal);
- } else {
- jam();
-
- if(theConfig.lockPagesInMainMemory()){
- int res = NdbMem_MemLockAll();
- if(res != 0){
- g_eventLogger.warning("Failed to memlock pages");
- warningEvent("Failed to memlock pages");
- }
- }
-
- sendSTTORRY(signal);
}
}
diff --git a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
index 59e6bd35baf..cdab0635dce 100644
--- a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
+++ b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
@@ -8619,6 +8619,20 @@ void Dbtc::execSCAN_TABREQ(Signal* signal)
* IF ANY TO RECEIVE.
**********************************************************/
scanptr.p->scanState = ScanRecord::WAIT_AI;
+
+ if (ERROR_INSERTED(8038))
+ {
+ /**
+ * Force API_FAILREQ
+ */
+ DisconnectRep * const rep = (DisconnectRep *)signal->getDataPtrSend();
+ rep->nodeId = refToNode(apiConnectptr.p->ndbapiBlockref);
+ rep->err = 8038;
+
+ EXECUTE_DIRECT(CMVMI, GSN_DISCONNECT_REP, signal, 2);
+ CLEAR_ERROR_INSERT_VALUE;
+ }
+
return;
SCAN_error_check:
@@ -8706,6 +8720,7 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr,
jam();
ScanFragRecPtr ptr;
ndbrequire(list.seize(ptr));
+ ptr.p->scanFragState = ScanFragRec::IDLE;
ptr.p->scanRec = scanptr.i;
ptr.p->scanFragId = 0;
ptr.p->m_apiPtr = cdata[i];
@@ -9457,9 +9472,17 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){
ScanRecord* scanP = scanPtr.p;
ndbrequire(scanPtr.p->scanState != ScanRecord::IDLE);
+ ScanRecord::ScanState old = scanPtr.p->scanState;
scanPtr.p->scanState = ScanRecord::CLOSING_SCAN;
scanPtr.p->m_close_scan_req = req_received;
+ if (old == ScanRecord::WAIT_FRAGMENT_COUNT)
+ {
+ jam();
+ scanPtr.p->scanState = old;
+ return; // Will continue on execDI_FCOUNTCONF
+ }
+
/**
* Queue : Action
* ============= : =================
@@ -9487,11 +9510,22 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){
ScanFragRecPtr curr = ptr; // Remove while iterating...
running.next(ptr);
- if(curr.p->scanFragState == ScanFragRec::WAIT_GET_PRIMCONF){
+ switch(curr.p->scanFragState){
+ case ScanFragRec::IDLE:
+ jam(); // real early abort
+ ndbrequire(old == ScanRecord::WAIT_AI);
+ running.release(curr);
+ continue;
+ case ScanFragRec::WAIT_GET_PRIMCONF:
jam();
continue;
+ case ScanFragRec::LQH_ACTIVE:
+ jam();
+ break;
+ default:
+ jamLine(curr.p->scanFragState);
+ ndbrequire(false);
}
- ndbrequire(curr.p->scanFragState == ScanFragRec::LQH_ACTIVE);
curr.p->startFragTimer(ctcTimer);
curr.p->scanFragState = ScanFragRec::LQH_ACTIVE;
diff --git a/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp b/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp
index e16d3df6d8d..37bf33f0313 100644
--- a/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp
+++ b/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp
@@ -390,6 +390,7 @@ Dbtup::commitRecord(Signal* signal,
fragptr.p = regFragPtr;
tabptr.p = regTabPtr;
+ Uint32 hashValue = firstOpPtr.p->hashValue;
if (opType == ZINSERT_DELETE) {
ljam();
@@ -412,6 +413,7 @@ Dbtup::commitRecord(Signal* signal,
//--------------------------------------------------------------------
Uint32 saveOpType = regOperPtr->optype;
regOperPtr->optype = ZINSERT;
+ regOperPtr->hashValue = hashValue;
operPtr.p = regOperPtr;
checkDetachedTriggers(signal,
@@ -444,6 +446,8 @@ Dbtup::commitRecord(Signal* signal,
befOpPtr.p->changeMask.clear();
befOpPtr.p->changeMask.bitOR(attributeMask);
befOpPtr.p->gci = regOperPtr->gci;
+ befOpPtr.p->optype = ZUPDATE;
+ befOpPtr.p->hashValue = hashValue;
befOpPtr.p->optype = opType;
operPtr.p = befOpPtr.p;
@@ -478,11 +482,13 @@ Dbtup::commitRecord(Signal* signal,
Uint32 fragPageId = befOpPtr.p->fragPageId;
Uint32 pageIndex = befOpPtr.p->pageIndex;
+ befOpPtr.p->optype = ZDELETE;
befOpPtr.p->realPageId = befOpPtr.p->realPageIdC;
befOpPtr.p->pageOffset = befOpPtr.p->pageOffsetC;
befOpPtr.p->fragPageId = befOpPtr.p->fragPageIdC;
befOpPtr.p->pageIndex = befOpPtr.p->pageIndexC;
befOpPtr.p->gci = regOperPtr->gci;
+ befOpPtr.p->hashValue = hashValue;
befOpPtr.p->optype = opType;
operPtr.p = befOpPtr.p;
diff --git a/ndb/test/ndbapi/testScan.cpp b/ndb/test/ndbapi/testScan.cpp
index f1018d29846..e228c9c0bd1 100644
--- a/ndb/test/ndbapi/testScan.cpp
+++ b/ndb/test/ndbapi/testScan.cpp
@@ -622,7 +622,7 @@ int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
int nodeId = restarter.getDbNodeId(lastId);
lastId = (lastId + 1) % restarter.getNumDbNodes();
- if(restarter.restartOneDbNode(nodeId) != 0){
+ if(restarter.restartOneDbNode(nodeId, false, false, true) != 0){
g_err << "Failed to restartNextDbNode" << endl;
result = NDBT_FAILED;
break;
@@ -1080,6 +1080,39 @@ int runScanRestart(NDBT_Context* ctx, NDBT_Step* step){
}
+int
+runBug24447(NDBT_Context* ctx, NDBT_Step* step){
+ int loops = 1; //ctx->getNumLoops();
+ int records = ctx->getNumRecords();
+ int abort = ctx->getProperty("AbortProb", 15);
+ NdbRestarter restarter;
+ HugoTransactions hugoTrans(*ctx->getTab());
+ int i = 0;
+ while (i<loops && !ctx->isTestStopped())
+ {
+ g_info << i++ << ": ";
+
+ int nodeId = restarter.getRandomNotMasterNodeId(rand());
+ if (nodeId == -1)
+ nodeId = restarter.getMasterNodeId();
+ if (restarter.insertErrorInNode(nodeId, 8038) != 0)
+ {
+ ndbout << "Could not insert error in node="<<nodeId<<endl;
+ return NDBT_FAILED;
+ }
+
+ for (Uint32 j = 0; i<10; i++)
+ {
+ hugoTrans.scanReadRecords(GETNDB(step), records, abort, 0,
+ NdbOperation::LM_CommittedRead);
+ }
+
+ }
+ restarter.insertErrorInAllNodes(0);
+
+ return NDBT_OK;
+}
+
NDBT_TESTSUITE(testScan);
TESTCASE("ScanRead",
"Verify scan requirement: It should be possible "\
@@ -1540,6 +1573,12 @@ TESTCASE("ScanRestart",
STEP(runScanRestart);
FINALIZER(runClearTable);
}
+TESTCASE("Bug24447",
+ ""){
+ INITIALIZER(runLoadTable);
+ STEP(runBug24447);
+ FINALIZER(runClearTable);
+}
NDBT_TESTSUITE_END(testScan);
int main(int argc, const char** argv){
diff --git a/ndb/test/run-test/daily-basic-tests.txt b/ndb/test/run-test/daily-basic-tests.txt
index 39782ecbbc7..51ee6d14f00 100644
--- a/ndb/test/run-test/daily-basic-tests.txt
+++ b/ndb/test/run-test/daily-basic-tests.txt
@@ -439,6 +439,10 @@ cmd: testScan
args: -l 100 -n Scan-bug8262 T7
max-time: 500
+cmd: testScan
+args: -n Bug24447 T1
+
+max-time: 500
cmd: testNodeRestart
args: -n Bug15587 T1
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 4d54dfc2b39..ce3096da778 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -62,6 +62,42 @@ static void agg_result_type(Item_result *type, Item **items, uint nitems)
/*
+ Compare row signature of two expressions
+
+ SYNOPSIS:
+ cmp_row_type()
+ item1 the first expression
+ item2 the second expression
+
+ DESCRIPTION
+ The function checks that two expressions have compatible row signatures
+ i.e. that the number of columns they return are the same and that if they
+ are both row expressions then each component from the first expression has
+ a row signature compatible with the signature of the corresponding component
+ of the second expression.
+
+ RETURN VALUES
+ 1 type incompatibility has been detected
+ 0 otherwise
+*/
+
+static int cmp_row_type(Item* item1, Item* item2)
+{
+ uint n= item1->cols();
+ if (item2->check_cols(n))
+ return 1;
+ for (uint i=0; i<n; i++)
+ {
+ if (item2->el(i)->check_cols(item1->el(i)->cols()) ||
+ (item1->el(i)->result_type() == ROW_RESULT &&
+ cmp_row_type(item1->el(i), item2->el(i))))
+ return 1;
+ }
+ return 0;
+}
+
+
+/*
Aggregates result types from the array of items.
SYNOPSIS:
@@ -75,14 +111,32 @@ static void agg_result_type(Item_result *type, Item **items, uint nitems)
This function aggregates result types from the array of items. Found type
supposed to be used later for comparison of values of these items.
Aggregation itself is performed by the item_cmp_type() function.
+ The function also checks compatibility of row signatures for the
+ submitted items (see the spec for the cmp_row_type function).
+
+ RETURN VALUES
+ 1 type incompatibility has been detected
+ 0 otherwise
*/
-static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
+static int agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
{
uint i;
type[0]= items[0]->result_type();
for (i= 1 ; i < nitems ; i++)
+ {
type[0]= item_cmp_type(type[0], items[i]->result_type());
+ /*
+ When aggregating types of two row expressions we have to check
+ that they have the same cardinality and that each component
+ of the first row expression has a compatible row signature with
+ the signature of the corresponding component of the second row
+ expression.
+ */
+ if (type[0] == ROW_RESULT && cmp_row_type(items[0], items[i]))
+ return 1; // error found: invalid usage of rows
+ }
+ return 0;
}
static void my_coll_agg_error(DTCollation &c1, DTCollation &c2,
@@ -984,7 +1038,8 @@ void Item_func_between::fix_length_and_dec()
*/
if (!args[0] || !args[1] || !args[2])
return;
- agg_cmp_type(thd, &cmp_type, args, 3);
+ if ( agg_cmp_type(thd, &cmp_type, args, 3))
+ return;
if (cmp_type == STRING_RESULT &&
agg_arg_charsets(cmp_collation, args, 3, MY_COLL_CMP_CONV))
return;
@@ -1532,7 +1587,8 @@ void Item_func_case::fix_length_and_dec()
for (nagg= 0; nagg < ncases/2 ; nagg++)
agg[nagg+1]= args[nagg*2];
nagg++;
- agg_cmp_type(current_thd, &cmp_type, agg, nagg);
+ if (agg_cmp_type(current_thd, &cmp_type, agg, nagg))
+ return;
if ((cmp_type == STRING_RESULT) &&
agg_arg_charsets(cmp_collation, agg, nagg, MY_COLL_CMP_CONV))
return;
@@ -2013,7 +2069,8 @@ void Item_func_in::fix_length_and_dec()
uint const_itm= 1;
THD *thd= current_thd;
- agg_cmp_type(thd, &cmp_type, args, arg_count);
+ if (agg_cmp_type(thd, &cmp_type, args, arg_count))
+ return;
if (cmp_type == STRING_RESULT &&
agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV))