mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
Merge mysql.com:/home/gluh/MySQL/Merge/4.1-opt
into mysql.com:/home/gluh/MySQL/Merge/4.1
This commit is contained in:
commit
658777d808
85 changed files with 3300 additions and 876 deletions
19
BUILD/SETUP.sh.rej
Normal file
19
BUILD/SETUP.sh.rej
Normal file
|
@ -0,0 +1,19 @@
|
|||
***************
|
||||
*** 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
|
|
@ -5,9 +5,13 @@
|
|||
#
|
||||
|
||||
check_cpu () {
|
||||
if test -r /proc/cpuinfo ; then
|
||||
CPUINFO=/proc/cpuinfo
|
||||
if test -n "$TEST_CPUINFO" ; then
|
||||
CPUINFO=$TEST_CPUINFO
|
||||
fi
|
||||
if test -r "$CPUINFO" -a "$CPUINFO" != " " ; then
|
||||
# on Linux (and others?) we can get detailed CPU information out of /proc
|
||||
cpuinfo="cat /proc/cpuinfo"
|
||||
cpuinfo="cat $CPUINFO"
|
||||
|
||||
# detect CPU family
|
||||
cpu_family=`$cpuinfo | grep 'family' | cut -d ':' -f 2 | cut -d ' ' -f 2 | head -1`
|
||||
|
@ -28,11 +32,12 @@ check_cpu () {
|
|||
fi
|
||||
|
||||
# parse CPU flags
|
||||
for flag in `$cpuinfo | grep '^flags' | sed -e 's/^flags.*: //'`; do
|
||||
for flag in `$cpuinfo | grep '^flags' | sed -e 's/^flags.*: //' -e 's/[^a-zA-Z0-9_ ]/_/g'`; do
|
||||
eval cpu_flag_$flag=yes
|
||||
done
|
||||
else
|
||||
# Fallback when there is no /proc/cpuinfo
|
||||
CPUINFO=" "
|
||||
case "`uname -s`" in
|
||||
FreeBSD|OpenBSD)
|
||||
cpu_family=`uname -m`;
|
||||
|
@ -84,6 +89,18 @@ check_cpu () {
|
|||
*Pentium*M*pro*)
|
||||
cpu_arg="pentium-m";
|
||||
;;
|
||||
*Celeron\(R\)*\ M*)
|
||||
cpu_arg="pentium-m";
|
||||
;;
|
||||
*Celeron*Coppermine*)
|
||||
cpu_arg="pentium3"
|
||||
;;
|
||||
*Celeron\(R\)*)
|
||||
cpu_arg="pentium4"
|
||||
;;
|
||||
*Celeron*)
|
||||
cpu_arg="pentium2";
|
||||
;;
|
||||
*Athlon*64*)
|
||||
cpu_arg="athlon64";
|
||||
;;
|
||||
|
@ -113,7 +130,14 @@ check_cpu () {
|
|||
esac
|
||||
|
||||
|
||||
if test -z "$cpu_arg"; then
|
||||
if test -z "$cpu_arg" ; then
|
||||
if test "$CPUINFO" != " " ; then
|
||||
# fallback to uname if necessary
|
||||
TEST_CPUINFO=" "
|
||||
check_cpu_cflags=""
|
||||
check_cpu
|
||||
return
|
||||
fi
|
||||
echo "BUILD/check-cpu: Oops, could not find out what kind of cpu this machine is using." >&2
|
||||
check_cpu_cflags=""
|
||||
return
|
||||
|
@ -167,8 +191,7 @@ check_cpu () {
|
|||
touch __test.c
|
||||
|
||||
while [ "$cpu_arg" ] ; do
|
||||
# FIXME: echo -n isn't portable - see contortions autoconf goes through
|
||||
echo -n testing $cpu_arg "... " >&2
|
||||
printf "testing $cpu_arg ... " >&2
|
||||
|
||||
# compile check
|
||||
check_cpu_cflags=`eval echo $check_cpu_args`
|
||||
|
|
|
@ -3,3 +3,4 @@
|
|||
454f8960jsVT_kMKJtZ9OCgXoba0xQ
|
||||
4554a95d7txO1DuO9G3nAizI3SkFAA
|
||||
4554b3722d71SbPiI2Gx-RhbZjmuIQ
|
||||
45ae6628gqKTsUFfnoNExadETVIkbA
|
||||
|
|
55
Makefile.am
55
Makefile.am
|
@ -95,7 +95,11 @@ dist-hook:
|
|||
|
||||
tags:
|
||||
support-files/build-tags
|
||||
.PHONY: init-db bin-dist
|
||||
|
||||
.PHONY: init-db bin-dist \
|
||||
test test-force test-full test-force-full test-force-mem \
|
||||
test-pl test-force-pl test-full-pl test-force-full-pl test-force-pl-mem \
|
||||
test-ps test-ns
|
||||
|
||||
# Target 'test' will run the regression test suite using the built server.
|
||||
#
|
||||
|
@ -105,36 +109,33 @@ tags:
|
|||
# will then calculate the various port numbers it needs from this,
|
||||
# making sure each user use different ports.
|
||||
|
||||
test:
|
||||
test-ps:
|
||||
cd mysql-test ; \
|
||||
./mysql-test-run && \
|
||||
./mysql-test-run --ps-protocol
|
||||
@PERL@ ./mysql-test-run.pl $(force) --ps-protocol
|
||||
|
||||
test-ns:
|
||||
cd mysql-test ; \
|
||||
@PERL@ ./mysql-test-run.pl $(force)
|
||||
|
||||
test: test-ns test-ps
|
||||
|
||||
# To ease script-writing, although in 4.1 it is identical to 'test'
|
||||
test-full: test
|
||||
|
||||
test-force:
|
||||
cd mysql-test; \
|
||||
./mysql-test-run --force && \
|
||||
./mysql-test-run --ps-protocol --force
|
||||
$(MAKE) force=--force test
|
||||
|
||||
test-force-mem:
|
||||
cd mysql-test; \
|
||||
./mysql-test-run --force --mem && \
|
||||
./mysql-test-run --ps-protocol --force --mem
|
||||
|
||||
|
||||
# We are testing a new Perl version of the test script
|
||||
test-pl:
|
||||
cd mysql-test; \
|
||||
./mysql-test-run.pl && \
|
||||
./mysql-test-run.pl --ps-protocol
|
||||
|
||||
test-force-pl:
|
||||
cd mysql-test; \
|
||||
./mysql-test-run.pl --force && \
|
||||
./mysql-test-run.pl --ps-protocol --force
|
||||
test-force-full:
|
||||
$(MAKE) force=--force test-full
|
||||
|
||||
#used by autopush.pl to run memory based tests
|
||||
test-force-pl-mem:
|
||||
cd mysql-test; \
|
||||
./mysql-test-run.pl --force --mem && \
|
||||
./mysql-test-run.pl --ps-protocol --force --mem
|
||||
test-force-mem:
|
||||
$(MAKE) 'force=--force --mem' test
|
||||
|
||||
# Keep these for a while
|
||||
test-pl: test
|
||||
test-full-pl: test-full
|
||||
test-force-pl: test-force
|
||||
test-force-pl-mem: test-force-mem
|
||||
test-force-full-pl: test-force-full
|
||||
|
||||
|
|
|
@ -2589,6 +2589,8 @@ static char *primary_key_fields(const char *table_name)
|
|||
char show_keys_buff[15 + 64 * 2 + 3];
|
||||
uint result_length = 0;
|
||||
char *result = 0;
|
||||
char buff[NAME_LEN * 2 + 3];
|
||||
char *quoted_field;
|
||||
|
||||
my_snprintf(show_keys_buff, sizeof(show_keys_buff),
|
||||
"SHOW KEYS FROM %s", table_name);
|
||||
|
@ -2612,8 +2614,10 @@ static char *primary_key_fields(const char *table_name)
|
|||
{
|
||||
/* Key is unique */
|
||||
do
|
||||
result_length += strlen(row[4]) + 1; /* + 1 for ',' or \0 */
|
||||
while ((row = mysql_fetch_row(res)) && atoi(row[3]) > 1);
|
||||
{
|
||||
quoted_field= quote_name(row[4], buff, 0);
|
||||
result_length+= strlen(quoted_field) + 1; /* + 1 for ',' or \0 */
|
||||
} while ((row= mysql_fetch_row(res)) && atoi(row[3]) > 1);
|
||||
}
|
||||
|
||||
/* Build the ORDER BY clause result */
|
||||
|
@ -2627,9 +2631,13 @@ static char *primary_key_fields(const char *table_name)
|
|||
}
|
||||
mysql_data_seek(res, 0);
|
||||
row = mysql_fetch_row(res);
|
||||
end = strmov(result, row[4]);
|
||||
while ((row = mysql_fetch_row(res)) && atoi(row[3]) > 1)
|
||||
end = strxmov(end, ",", row[4], NullS);
|
||||
quoted_field= quote_name(row[4], buff, 0);
|
||||
end= strmov(result, quoted_field);
|
||||
while ((row= mysql_fetch_row(res)) && atoi(row[3]) > 1)
|
||||
{
|
||||
quoted_field= quote_name(row[4], buff, 0);
|
||||
end= strxmov(end, ",", quoted_field, NullS);
|
||||
}
|
||||
}
|
||||
|
||||
cleanup:
|
||||
|
|
|
@ -1240,7 +1240,9 @@ void var_set(const char *var_name, const char *var_name_end,
|
|||
v->int_dirty= 0;
|
||||
v->str_val_len= strlen(v->str_val);
|
||||
}
|
||||
strxmov(buf, v->name, "=", v->str_val, NullS);
|
||||
my_snprintf(buf, sizeof(buf), "%.*s=%.*s",
|
||||
v->name_len, v->name,
|
||||
v->str_val_len, v->str_val);
|
||||
if (!(v->env_s= my_strdup(buf, MYF(MY_WME))))
|
||||
die("Out of memory");
|
||||
putenv(v->env_s);
|
||||
|
@ -2968,7 +2970,12 @@ void safe_connect(MYSQL* mysql, const char *name, const char *host,
|
|||
if ((mysql_errno(mysql) == CR_CONN_HOST_ERROR ||
|
||||
mysql_errno(mysql) == CR_CONNECTION_ERROR) &&
|
||||
failed_attempts < opt_max_connect_retries)
|
||||
{
|
||||
verbose_msg("Connect attempt %d/%d failed: %d: %s", failed_attempts,
|
||||
opt_max_connect_retries, mysql_errno(mysql),
|
||||
mysql_error(mysql));
|
||||
my_sleep(connection_retry_sleep);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (failed_attempts > 0)
|
||||
|
@ -4678,10 +4685,9 @@ void run_query_normal(struct st_connection *cn, struct st_command *command,
|
|||
}
|
||||
|
||||
/*
|
||||
Store the result. If res is NULL, use mysql_field_count to
|
||||
determine if that was expected
|
||||
Store the result of the query if it will return any fields
|
||||
*/
|
||||
if (!(res= mysql_store_result(mysql)) && mysql_field_count(mysql))
|
||||
if (mysql_field_count(mysql) && ((res= mysql_store_result(mysql)) == 0))
|
||||
{
|
||||
handle_error(command, mysql_errno(mysql), mysql_error(mysql),
|
||||
mysql_sqlstate(mysql), ds);
|
||||
|
@ -4733,7 +4739,10 @@ void run_query_normal(struct st_connection *cn, struct st_command *command,
|
|||
}
|
||||
|
||||
if (res)
|
||||
{
|
||||
mysql_free_result(res);
|
||||
res= 0;
|
||||
}
|
||||
counter++;
|
||||
} while (!(err= mysql_next_result(mysql)));
|
||||
if (err > 0)
|
||||
|
@ -4800,7 +4809,7 @@ void handle_error(struct st_command *command,
|
|||
err_errno, err_error);
|
||||
|
||||
/* Abort the run of this test, pass the failed query as reason */
|
||||
abort_not_supported_test("Query '%s' failed, required functionality" \
|
||||
abort_not_supported_test("Query '%s' failed, required functionality " \
|
||||
"not supported", command->query);
|
||||
}
|
||||
|
||||
|
|
|
@ -2990,10 +2990,14 @@ AM_CONDITIONAL(HAVE_NETWARE, test "$netware_dir" = "netware")
|
|||
export CC CXX CFLAGS CXXFLAGS LD LDFLAGS AR
|
||||
ac_configure_args="$ac_configure_args CFLAGS='$CFLAGS' CXXFLAGS='$CXXFLAGS'"
|
||||
|
||||
if test "$with_server" = "yes" -o "$THREAD_SAFE_CLIENT" != "no"
|
||||
if test "$with_server" != "no" -o "$THREAD_SAFE_CLIENT" != "no"
|
||||
then
|
||||
AC_DEFINE([THREAD], [1],
|
||||
[Define if you want to have threaded code. This may be undef on client code])
|
||||
fi
|
||||
|
||||
if test "$with_server" != "no"
|
||||
then
|
||||
# Avoid _PROGRAMS names
|
||||
THREAD_LPROGRAMS="test_thr_alarm\$(EXEEXT) test_thr_lock\$(EXEEXT)"
|
||||
AC_SUBST(THREAD_LPROGRAMS)
|
||||
|
|
299
configure.in.rej
Normal file
299
configure.in.rej
Normal file
|
@ -0,0 +1,299 @@
|
|||
***************
|
||||
*** 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]
|
|
@ -76,7 +76,7 @@ int hp_get_new_block(HP_BLOCK *block, ulong *alloc_length)
|
|||
and my_default_record_cache_size we get about 1/128 unused memory.
|
||||
*/
|
||||
*alloc_length=sizeof(HP_PTRS)*i+block->records_in_block* block->recbuffer;
|
||||
if (!(root=(HP_PTRS*) my_malloc(*alloc_length,MYF(0))))
|
||||
if (!(root=(HP_PTRS*) my_malloc(*alloc_length,MYF(MY_WME))))
|
||||
return 1;
|
||||
|
||||
if (i == 0)
|
||||
|
|
|
@ -68,11 +68,17 @@ int heap_write(HP_INFO *info, const byte *record)
|
|||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
DBUG_PRINT("info",("Duplicate key: %d", keydef - share->keydef));
|
||||
if (my_errno == HA_ERR_FOUND_DUPP_KEY)
|
||||
DBUG_PRINT("info",("Duplicate key: %d", keydef - share->keydef));
|
||||
info->errkey= keydef - share->keydef;
|
||||
if (keydef->algorithm == HA_KEY_ALG_BTREE)
|
||||
/*
|
||||
We don't need to delete non-inserted key from rb-tree. Also, if
|
||||
we got ENOMEM, the key wasn't inserted, so don't try to delete it
|
||||
either. Otherwise for HASH index on HA_ERR_FOUND_DUPP_KEY the key
|
||||
was inserted and we have to delete it.
|
||||
*/
|
||||
if (keydef->algorithm == HA_KEY_ALG_BTREE || my_errno == ENOMEM)
|
||||
{
|
||||
/* we don't need to delete non-inserted key from rb-tree */
|
||||
keydef--;
|
||||
}
|
||||
while (keydef >= share->keydef)
|
||||
|
|
|
@ -84,6 +84,42 @@
|
|||
#define NETWARE_SET_SCREEN_MODE(A)
|
||||
#endif
|
||||
|
||||
/*
|
||||
The macros below are used to allow build of Universal/fat binaries of
|
||||
MySQL and MySQL applications under darwin.
|
||||
*/
|
||||
#ifdef TARGET_FAT_BINARY
|
||||
# undef SIZEOF_CHARP
|
||||
# undef SIZEOF_INT
|
||||
# undef SIZEOF_LONG
|
||||
# undef SIZEOF_LONG_LONG
|
||||
# undef SIZEOF_OFF_T
|
||||
# undef SIZEOF_SHORT
|
||||
|
||||
#if defined(__i386__)
|
||||
# undef WORDS_BIGENDIAN
|
||||
# define SIZEOF_CHARP 4
|
||||
# define SIZEOF_INT 4
|
||||
# define SIZEOF_LONG 4
|
||||
# define SIZEOF_LONG_LONG 8
|
||||
# define SIZEOF_OFF_T 8
|
||||
# define SIZEOF_SHORT 2
|
||||
|
||||
#elif defined(__ppc__)
|
||||
# define WORDS_BIGENDIAN
|
||||
# define SIZEOF_CHARP 4
|
||||
# define SIZEOF_INT 4
|
||||
# define SIZEOF_LONG 4
|
||||
# define SIZEOF_LONG_LONG 8
|
||||
# define SIZEOF_OFF_T 8
|
||||
# define SIZEOF_SHORT 2
|
||||
|
||||
#else
|
||||
# error Building FAT binary for an unknown architecture.
|
||||
#endif
|
||||
#endif /* TARGET_FAT_BINARY */
|
||||
|
||||
|
||||
/*
|
||||
The macros below are borrowed from include/linux/compiler.h in the
|
||||
Linux kernel. Use them to indicate the likelyhood of the truthfulness
|
||||
|
@ -102,7 +138,7 @@
|
|||
|
||||
|
||||
/* Fix problem with S_ISLNK() on Linux */
|
||||
#if defined(TARGET_OS_LINUX)
|
||||
#if defined(TARGET_OS_LINUX) || defined(__GLIBC__)
|
||||
#undef _GNU_SOURCE
|
||||
#define _GNU_SOURCE 1
|
||||
#endif
|
||||
|
@ -379,7 +415,10 @@ int __void__;
|
|||
#endif
|
||||
|
||||
/* Define some useful general macros */
|
||||
#if !defined(max)
|
||||
#if defined(__cplusplus) && defined(__GNUC__)
|
||||
#define max(a, b) ((a) >? (b))
|
||||
#define min(a, b) ((a) <? (b))
|
||||
#elif !defined(max)
|
||||
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
|
17
include/my_global.h.rej
Normal file
17
include/my_global.h.rej
Normal file
|
@ -0,0 +1,17 @@
|
|||
***************
|
||||
*** 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
|
|
@ -28,6 +28,14 @@
|
|||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* Thread library */
|
||||
|
||||
#define THD_LIB_OTHER 1
|
||||
#define THD_LIB_NPTL 2
|
||||
#define THD_LIB_LT 4
|
||||
|
||||
extern uint thd_lib_detected;
|
||||
|
||||
#if defined(__WIN__) || defined(OS2)
|
||||
|
||||
#ifdef OS2
|
||||
|
|
80
include/my_pthread.h.rej
Normal file
80
include/my_pthread.h.rej
Normal file
|
@ -0,0 +1,80 @@
|
|||
***************
|
||||
*** 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)
|
|
@ -25,11 +25,6 @@ extern "C" {
|
|||
#ifndef USE_ALARM_THREAD
|
||||
#define USE_ONE_SIGNAL_HAND /* One must call process_alarm */
|
||||
#endif
|
||||
#ifdef HAVE_LINUXTHREADS
|
||||
#define THR_CLIENT_ALARM SIGALRM
|
||||
#else
|
||||
#define THR_CLIENT_ALARM SIGUSR1
|
||||
#endif
|
||||
#ifdef HAVE_rts_threads
|
||||
#undef USE_ONE_SIGNAL_HAND
|
||||
#define USE_ALARM_THREAD
|
||||
|
|
|
@ -18,6 +18,9 @@ typedef struct hash_cell_struct hash_cell_t;
|
|||
|
||||
typedef void* hash_node_t;
|
||||
|
||||
/* Fix Bug #13859: symbol collision between imap/mysql */
|
||||
#define hash_create hash0_create
|
||||
|
||||
/*****************************************************************
|
||||
Creates a hash table with >= n array cells. The actual number
|
||||
of cells is chosen to be a prime number slightly bigger than n. */
|
||||
|
|
|
@ -590,8 +590,7 @@ static void fill_quick_table(uint16 *table, uint bits, uint max_bits,
|
|||
static uint copy_decode_table(uint16 *to_pos, uint offset,
|
||||
uint16 *decode_table)
|
||||
{
|
||||
uint prev_offset;
|
||||
prev_offset= offset;
|
||||
uint prev_offset= offset;
|
||||
DBUG_ENTER("copy_decode_table");
|
||||
|
||||
/* Descent on the left side. */
|
||||
|
|
|
@ -288,6 +288,7 @@ sub collect_one_test_case($$$$$$$) {
|
|||
$tinfo->{'timezone'}= "GMT-3"; # for UNIX_TIMESTAMP tests to work
|
||||
|
||||
$tinfo->{'slave_num'}= 0; # Default, no slave
|
||||
$tinfo->{'master_num'}= 1; # Default, 1 master
|
||||
if ( defined mtr_match_prefix($tname,"rpl") )
|
||||
{
|
||||
if ( $::opt_skip_rpl )
|
||||
|
@ -297,13 +298,8 @@ sub collect_one_test_case($$$$$$$) {
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
$tinfo->{'slave_num'}= 1; # Default for rpl* tests, use one slave
|
||||
|
||||
if ( $tname eq 'rpl_failsafe' or $tname eq 'rpl_chain_temp_table' )
|
||||
{
|
||||
# $tinfo->{'slave_num'}= 3; # Not 3 ? Check old code, strange
|
||||
}
|
||||
}
|
||||
|
||||
if ( defined mtr_match_prefix($tname,"federated") )
|
||||
|
@ -582,6 +578,7 @@ our @tags=
|
|||
["include/have_debug.inc", "need_debug", 1],
|
||||
["include/have_ndb.inc", "ndb_test", 1],
|
||||
["include/have_ndb_extra.inc", "ndb_extra", 1],
|
||||
["include/have_multi_ndb.inc", "master_num", 2],
|
||||
["require_manager", "require_manager", 1],
|
||||
);
|
||||
|
||||
|
|
|
@ -220,7 +220,8 @@ sub spawn_parent_impl {
|
|||
my $ret_pid= waitpid($pid,0);
|
||||
if ( $ret_pid != $pid )
|
||||
{
|
||||
mtr_error("$path ($pid) got lost somehow");
|
||||
mtr_error("waitpid($pid, 0) returned $ret_pid " .
|
||||
"when waiting for '$path'");
|
||||
}
|
||||
|
||||
return mtr_process_exit_status($?);
|
||||
|
|
|
@ -58,6 +58,7 @@ $Devel::Trace::TRACE= 0; # Don't trace boring init stuff
|
|||
use File::Path;
|
||||
use File::Basename;
|
||||
use File::Copy;
|
||||
use File::Temp qw / tempdir /;
|
||||
use Cwd;
|
||||
use Getopt::Long;
|
||||
use Sys::Hostname;
|
||||
|
@ -222,10 +223,12 @@ our $opt_ndbconnectstring_slave;
|
|||
our $opt_record;
|
||||
our $opt_report_features;
|
||||
our $opt_check_testcases;
|
||||
our $opt_mark_progress;
|
||||
|
||||
our $opt_skip;
|
||||
our $opt_skip_rpl;
|
||||
our $max_slave_num= 0;
|
||||
our $max_master_num= 0;
|
||||
our $use_innodb;
|
||||
our $opt_skip_test;
|
||||
our $opt_skip_im;
|
||||
|
@ -403,6 +406,15 @@ sub main () {
|
|||
$max_slave_num= $test->{slave_num};
|
||||
mtr_error("Too many slaves") if $max_slave_num > 3;
|
||||
}
|
||||
|
||||
# Count max number of masters used by a test case
|
||||
if ( $test->{master_num} > $max_master_num)
|
||||
{
|
||||
$max_master_num= $test->{master_num};
|
||||
mtr_error("Too many masters") if $max_master_num > 2;
|
||||
mtr_error("Too few masters") if $max_master_num < 1;
|
||||
}
|
||||
|
||||
$use_innodb||= $test->{'innodb_test'};
|
||||
}
|
||||
|
||||
|
@ -555,6 +567,7 @@ sub command_line_setup () {
|
|||
# Test case authoring
|
||||
'record' => \$opt_record,
|
||||
'check-testcases' => \$opt_check_testcases,
|
||||
'mark-progress' => \$opt_mark_progress,
|
||||
|
||||
# Extra options used when starting mysqld
|
||||
'mysqld=s' => \@opt_extra_mysqld_opt,
|
||||
|
@ -1030,6 +1043,11 @@ sub command_line_setup () {
|
|||
my $sockdir = $opt_tmpdir;
|
||||
$sockdir =~ s|/+$||;
|
||||
|
||||
# On some operating systems, there is a limit to the length of a
|
||||
# UNIX domain socket's path far below PATH_MAX, so try to avoid long
|
||||
# socket path names.
|
||||
$sockdir = tempdir(CLEANUP => 0) if ( length($sockdir) > 80 );
|
||||
|
||||
# Put this into a hash, will be a C struct
|
||||
|
||||
$master->[0]=
|
||||
|
@ -1215,14 +1233,28 @@ sub command_line_setup () {
|
|||
$path_ndb_testrun_log= "$opt_vardir/log/ndb_testrun.log";
|
||||
|
||||
$path_snapshot= "$opt_tmpdir/snapshot_$opt_master_myport/";
|
||||
|
||||
if ( $opt_valgrind and $opt_debug )
|
||||
{
|
||||
# When both --valgrind and --debug is selected, send
|
||||
# all output to the trace file, making it possible to
|
||||
# see the exact location where valgrind complains
|
||||
foreach my $mysqld (@{$master}, @{$slave})
|
||||
{
|
||||
my $sidx= $mysqld->{idx} ? "$mysqld->{idx}" : "";
|
||||
$mysqld->{path_myerr}=
|
||||
"$opt_vardir/log/" . $mysqld->{type} . "$sidx.trace";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub datadir_list_setup () {
|
||||
|
||||
# Make a list of all data_dirs
|
||||
@data_dir_lst = (
|
||||
$master->[0]->{'path_myddir'},
|
||||
$master->[1]->{'path_myddir'});
|
||||
for (my $idx= 0; $idx < $max_master_num; $idx++)
|
||||
{
|
||||
push(@data_dir_lst, $master->[$idx]->{'path_myddir'});
|
||||
}
|
||||
|
||||
for (my $idx= 0; $idx < $max_slave_num; $idx++)
|
||||
{
|
||||
|
@ -2629,8 +2661,10 @@ sub mysql_install_db () {
|
|||
|
||||
install_db('master', $master->[0]->{'path_myddir'});
|
||||
|
||||
# FIXME check if testcase really is using second master
|
||||
copy_install_db('master', $master->[1]->{'path_myddir'});
|
||||
if ($max_master_num)
|
||||
{
|
||||
copy_install_db('master', $master->[1]->{'path_myddir'});
|
||||
}
|
||||
|
||||
# Install the number of slave databses needed
|
||||
for (my $idx= 0; $idx < $max_slave_num; $idx++)
|
||||
|
@ -3432,11 +3466,10 @@ sub mysqld_arguments ($$$$$) {
|
|||
if ( $glob_use_embedded_server )
|
||||
{
|
||||
$prefix= "--server-arg=";
|
||||
} else {
|
||||
# We can't pass embedded server --no-defaults
|
||||
mtr_add_arg($args, "--no-defaults");
|
||||
}
|
||||
|
||||
mtr_add_arg($args, "%s--no-defaults", $prefix);
|
||||
|
||||
mtr_add_arg($args, "%s--console", $prefix);
|
||||
mtr_add_arg($args, "%s--basedir=%s", $prefix, $path_my_basedir);
|
||||
mtr_add_arg($args, "%s--character-sets-dir=%s", $prefix, $path_charsetsdir);
|
||||
|
@ -4165,7 +4198,8 @@ sub run_testcase_start_servers($) {
|
|||
|
||||
}
|
||||
|
||||
if ( $clusters->[0]->{'pid'} and ! $master->[1]->{'pid'} )
|
||||
if ( $clusters->[0]->{'pid'} and ! $master->[1]->{'pid'} and
|
||||
$tinfo->{'master_num'} > 1 )
|
||||
{
|
||||
# Test needs cluster, start an extra mysqld connected to cluster
|
||||
|
||||
|
@ -4376,6 +4410,10 @@ sub run_mysqltest ($) {
|
|||
mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir);
|
||||
mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
|
||||
|
||||
# Log line number and time for each line in .test file
|
||||
mtr_add_arg($args, "--mark-progress")
|
||||
if $opt_mark_progress;
|
||||
|
||||
if ($tinfo->{'component_id'} eq 'im')
|
||||
{
|
||||
mtr_add_arg($args, "--socket=%s", $instance_manager->{'path_sock'});
|
||||
|
@ -4829,6 +4867,7 @@ Options for test case authoring
|
|||
|
||||
record TESTNAME (Re)genereate the result file for TESTNAME
|
||||
check-testcases Check testcases for sideeffects
|
||||
mark-progress Log line number and elapsed time to <testname>.progress
|
||||
|
||||
Options that pass on options
|
||||
|
||||
|
|
11
mysql-test/r/ctype_hebrew.result
Normal file
11
mysql-test/r/ctype_hebrew.result
Normal file
|
@ -0,0 +1,11 @@
|
|||
DROP TABLE IF EXISTS t1;
|
||||
SET NAMES hebrew;
|
||||
CREATE TABLE t1 (a char(1)) DEFAULT CHARSET=hebrew;
|
||||
INSERT INTO t1 VALUES (0xFD),(0xFE);
|
||||
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8;
|
||||
SELECT HEX(a) FROM t1;
|
||||
HEX(a)
|
||||
E2808E
|
||||
E2808F
|
||||
DROP TABLE t1;
|
||||
End of 4.1 tests
|
|
@ -124,12 +124,34 @@ create table t1 select date_format("2004-01-19 10:10:10", "%Y-%m-%d");
|
|||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`date_format("2004-01-19 10:10:10", "%Y-%m-%d")` binary(10) default NULL
|
||||
`date_format("2004-01-19 10:10:10", "%Y-%m-%d")` char(10) character set utf8 default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
select * from t1;
|
||||
date_format("2004-01-19 10:10:10", "%Y-%m-%d")
|
||||
2004-01-19
|
||||
drop table t1;
|
||||
set names utf8;
|
||||
set LC_TIME_NAMES='fr_FR';
|
||||
create table t1 (s1 char(20) character set latin1);
|
||||
insert into t1 values (date_format('2004-02-02','%M'));
|
||||
select hex(s1) from t1;
|
||||
hex(s1)
|
||||
66E97672696572
|
||||
drop table t1;
|
||||
create table t1 (s1 char(20) character set koi8r);
|
||||
set LC_TIME_NAMES='ru_RU';
|
||||
insert into t1 values (date_format('2004-02-02','%M'));
|
||||
insert into t1 values (date_format('2004-02-02','%b'));
|
||||
insert into t1 values (date_format('2004-02-02','%W'));
|
||||
insert into t1 values (date_format('2004-02-02','%a'));
|
||||
select hex(s1), s1 from t1;
|
||||
hex(s1) s1
|
||||
E6C5D7D2C1CCD1 Февраля
|
||||
E6C5D7 Фев
|
||||
F0CFCEC5C4C5CCD8CEC9CB Понедельник
|
||||
F0CEC4 Пнд
|
||||
drop table t1;
|
||||
set LC_TIME_NAMES='en_US';
|
||||
set names koi8r;
|
||||
create table t1 (s1 char(1) character set utf8);
|
||||
insert into t1 values (_koi8r'ÁÂ');
|
||||
|
|
|
@ -923,24 +923,4 @@ SET @@myisam_repair_threads=1;
|
|||
SHOW VARIABLES LIKE 'myisam_repair%';
|
||||
Variable_name Value
|
||||
myisam_repair_threads 1
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TEMPORARY TABLE `t1` (
|
||||
`a` int(11) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TEST_DIR/var/log/'
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TEMPORARY TABLE `t1` (
|
||||
`a` int(11) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TEST_DIR/var/log/'
|
||||
create table t1 (a int) engine=myisam select 42 a;
|
||||
select * from t1;
|
||||
a
|
||||
9
|
||||
select * from t1;
|
||||
a
|
||||
99
|
||||
select * from t1;
|
||||
a
|
||||
42
|
||||
drop table t1;
|
||||
End of 4.1 tests
|
||||
|
|
|
@ -1584,4 +1584,66 @@ CREATE TABLE `t1` (
|
|||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
drop table t1;
|
||||
CREATE TABLE `t1` (
|
||||
`a b` INT,
|
||||
`c"d` INT,
|
||||
`e``f` INT,
|
||||
PRIMARY KEY (`a b`, `c"d`, `e``f`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
insert into t1 values (0815, 4711, 2006);
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||
DROP TABLE IF EXISTS "t1";
|
||||
CREATE TABLE "t1" (
|
||||
"a b" int(11) NOT NULL default '0',
|
||||
"c""d" int(11) NOT NULL default '0',
|
||||
"e`f" int(11) NOT NULL default '0',
|
||||
PRIMARY KEY ("a b","c""d","e`f")
|
||||
);
|
||||
|
||||
LOCK TABLES "t1" WRITE;
|
||||
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
|
||||
INSERT INTO "t1" VALUES (815,4711,2006);
|
||||
/*!40000 ALTER TABLE "t1" ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8 */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||
DROP TABLE IF EXISTS `t1`;
|
||||
CREATE TABLE `t1` (
|
||||
`a b` int(11) NOT NULL default '0',
|
||||
`c"d` int(11) NOT NULL default '0',
|
||||
`e``f` int(11) NOT NULL default '0',
|
||||
PRIMARY KEY (`a b`,`c"d`,`e``f`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
|
||||
LOCK TABLES `t1` WRITE;
|
||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||
INSERT INTO `t1` VALUES (815,4711,2006);
|
||||
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
DROP TABLE `t1`;
|
||||
End of 4.1 tests
|
||||
|
|
|
@ -70,3 +70,4 @@ select time_stamp>@now from t1;
|
|||
time_stamp>@now
|
||||
1
|
||||
drop table t1;
|
||||
End of 4.1 tests
|
||||
|
|
|
@ -1035,4 +1035,71 @@ EXECUTE stmt USING @a;
|
|||
0 0
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
CREATE TABLE t1 (i INT);
|
||||
PREPARE st_19182
|
||||
FROM "CREATE TABLE t2 (i INT, j INT, KEY (i), KEY(j)) SELECT i FROM t1";
|
||||
EXECUTE st_19182;
|
||||
DESC t2;
|
||||
Field Type Null Key Default Extra
|
||||
j int(11) YES MUL NULL
|
||||
i int(11) YES MUL NULL
|
||||
DROP TABLE t2;
|
||||
EXECUTE st_19182;
|
||||
DESC t2;
|
||||
Field Type Null Key Default Extra
|
||||
j int(11) YES MUL NULL
|
||||
i int(11) YES MUL NULL
|
||||
DEALLOCATE PREPARE st_19182;
|
||||
DROP TABLE t2, t1;
|
||||
drop database if exists mysqltest;
|
||||
drop table if exists t1, t2;
|
||||
create database mysqltest character set utf8;
|
||||
prepare stmt1 from "create table mysqltest.t1 (c char(10))";
|
||||
prepare stmt2 from "create table mysqltest.t2 select 'test'";
|
||||
execute stmt1;
|
||||
execute stmt2;
|
||||
show create table mysqltest.t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c` char(10) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
||||
show create table mysqltest.t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`test` char(4) character set latin1 NOT NULL default ''
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
||||
drop table mysqltest.t1;
|
||||
drop table mysqltest.t2;
|
||||
alter database mysqltest character set latin1;
|
||||
execute stmt1;
|
||||
execute stmt2;
|
||||
show create table mysqltest.t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c` char(10) character set utf8 default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show create table mysqltest.t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`test` char(4) NOT NULL default ''
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop database mysqltest;
|
||||
deallocate prepare stmt1;
|
||||
deallocate prepare stmt2;
|
||||
execute stmt;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c` char(10) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/'
|
||||
drop table t1;
|
||||
execute stmt;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c` char(10) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/'
|
||||
drop table t1;
|
||||
deallocate prepare stmt;
|
||||
End of 4.1 tests.
|
||||
|
|
16
mysql-test/r/rpl_locale.result
Normal file
16
mysql-test/r/rpl_locale.result
Normal file
|
@ -0,0 +1,16 @@
|
|||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
create table t1 (s1 char(10));
|
||||
set lc_time_names= 'de_DE';
|
||||
insert into t1 values (date_format('2001-01-01','%W'));
|
||||
select * from t1;
|
||||
s1
|
||||
Montag
|
||||
select * from t1;
|
||||
s1
|
||||
Montag
|
||||
drop table t1;
|
|
@ -102,3 +102,25 @@ t1 CREATE TABLE `t1` (
|
|||
`i` int(11) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TEMPORARY TABLE `t1` (
|
||||
`a` int(11) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TEST_DIR/var/log/'
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TEMPORARY TABLE `t1` (
|
||||
`a` int(11) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TEST_DIR/var/log/'
|
||||
create table t1 (a int) engine=myisam select 42 a;
|
||||
select * from t1;
|
||||
a
|
||||
9
|
||||
select * from t1;
|
||||
a
|
||||
99
|
||||
select * from t1;
|
||||
a
|
||||
42
|
||||
drop table t1;
|
||||
End of 4.1 tests
|
||||
|
|
|
@ -54,7 +54,7 @@ ushort smallint(5) unsigned zerofill NULL MUL 00000 #
|
|||
umedium mediumint(8) unsigned NULL MUL 0 #
|
||||
ulong int(11) unsigned NULL MUL 0 #
|
||||
ulonglong bigint(13) unsigned NULL MUL 0 #
|
||||
time_stamp timestamp NULL YES CURRENT_TIMESTAMP #
|
||||
time_stamp timestamp NULL CURRENT_TIMESTAMP #
|
||||
date_field date NULL YES NULL #
|
||||
time_field time NULL YES NULL #
|
||||
date_time datetime NULL YES NULL #
|
||||
|
@ -222,7 +222,7 @@ ushort smallint(5) unsigned zerofill NULL 00000 #
|
|||
umedium mediumint(8) unsigned NULL MUL 0 #
|
||||
ulong int(11) unsigned NULL MUL 0 #
|
||||
ulonglong bigint(13) unsigned NULL MUL 0 #
|
||||
time_stamp timestamp NULL YES CURRENT_TIMESTAMP #
|
||||
time_stamp timestamp NULL CURRENT_TIMESTAMP #
|
||||
date_field varchar(10) latin1_swedish_ci YES NULL #
|
||||
time_field time NULL YES NULL #
|
||||
date_time datetime NULL YES NULL #
|
||||
|
@ -248,7 +248,7 @@ ushort smallint(5) unsigned zerofill NULL 00000 #
|
|||
umedium mediumint(8) unsigned NULL 0 #
|
||||
ulong int(11) unsigned NULL 0 #
|
||||
ulonglong bigint(13) unsigned NULL 0 #
|
||||
time_stamp timestamp NULL YES 0000-00-00 00:00:00 #
|
||||
time_stamp timestamp NULL 0000-00-00 00:00:00 #
|
||||
date_field varchar(10) latin1_swedish_ci YES NULL #
|
||||
time_field time NULL YES NULL #
|
||||
date_time datetime NULL YES NULL #
|
||||
|
|
|
@ -188,9 +188,9 @@ t1 CREATE TABLE `t1` (
|
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show columns from t1;
|
||||
Field Type Null Key Default Extra
|
||||
t1 timestamp YES 2003-01-01 00:00:00
|
||||
t1 timestamp 2003-01-01 00:00:00
|
||||
t2 datetime YES NULL
|
||||
t3 timestamp YES 0000-00-00 00:00:00
|
||||
t3 timestamp 0000-00-00 00:00:00
|
||||
drop table t1;
|
||||
create table t1 (t1 timestamp default now(), t2 datetime, t3 timestamp);
|
||||
SET TIMESTAMP=1000000002;
|
||||
|
@ -212,9 +212,9 @@ t1 CREATE TABLE `t1` (
|
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show columns from t1;
|
||||
Field Type Null Key Default Extra
|
||||
t1 timestamp YES CURRENT_TIMESTAMP
|
||||
t1 timestamp CURRENT_TIMESTAMP
|
||||
t2 datetime YES NULL
|
||||
t3 timestamp YES 0000-00-00 00:00:00
|
||||
t3 timestamp 0000-00-00 00:00:00
|
||||
drop table t1;
|
||||
create table t1 (t1 timestamp default '2003-01-01 00:00:00' on update now(), t2 datetime);
|
||||
SET TIMESTAMP=1000000004;
|
||||
|
@ -238,7 +238,7 @@ t1 CREATE TABLE `t1` (
|
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show columns from t1;
|
||||
Field Type Null Key Default Extra
|
||||
t1 timestamp YES 2003-01-01 00:00:00
|
||||
t1 timestamp 2003-01-01 00:00:00
|
||||
t2 datetime YES NULL
|
||||
drop table t1;
|
||||
create table t1 (t1 timestamp default now() on update now(), t2 datetime);
|
||||
|
@ -263,7 +263,7 @@ t1 CREATE TABLE `t1` (
|
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show columns from t1;
|
||||
Field Type Null Key Default Extra
|
||||
t1 timestamp YES CURRENT_TIMESTAMP
|
||||
t1 timestamp CURRENT_TIMESTAMP
|
||||
t2 datetime YES NULL
|
||||
drop table t1;
|
||||
create table t1 (t1 timestamp, t2 datetime, t3 timestamp);
|
||||
|
@ -289,9 +289,9 @@ t1 CREATE TABLE `t1` (
|
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show columns from t1;
|
||||
Field Type Null Key Default Extra
|
||||
t1 timestamp YES CURRENT_TIMESTAMP
|
||||
t1 timestamp CURRENT_TIMESTAMP
|
||||
t2 datetime YES NULL
|
||||
t3 timestamp YES 0000-00-00 00:00:00
|
||||
t3 timestamp 0000-00-00 00:00:00
|
||||
drop table t1;
|
||||
create table t1 (t1 timestamp default current_timestamp on update current_timestamp, t2 datetime);
|
||||
SET TIMESTAMP=1000000009;
|
||||
|
@ -315,7 +315,7 @@ t1 CREATE TABLE `t1` (
|
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
show columns from t1;
|
||||
Field Type Null Key Default Extra
|
||||
t1 timestamp YES CURRENT_TIMESTAMP
|
||||
t1 timestamp CURRENT_TIMESTAMP
|
||||
t2 datetime YES NULL
|
||||
delete from t1;
|
||||
insert into t1 values ('2004-04-01 00:00:00', '2004-04-01 00:00:00');
|
||||
|
|
|
@ -499,6 +499,63 @@ set names latin1;
|
|||
select @@have_innodb;
|
||||
@@have_innodb
|
||||
#
|
||||
*** Various tests with LC_TIME_NAMES
|
||||
*** LC_TIME_NAMES: testing case insensitivity
|
||||
set @@lc_time_names='ru_ru';
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
ru_RU
|
||||
*** LC_TIME_NAMES: testing with a user variable
|
||||
set @lc='JA_JP';
|
||||
set @@lc_time_names=@lc;
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
ja_JP
|
||||
*** LC_TIME_NAMES: testing with string expressions
|
||||
set lc_time_names=concat('de','_','DE');
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
de_DE
|
||||
set lc_time_names=concat('de','+','DE');
|
||||
ERROR HY000: Unknown locale: 'de+DE'
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
de_DE
|
||||
LC_TIME_NAMES: testing with numeric expressions
|
||||
set @@lc_time_names=1+2;
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
sv_SE
|
||||
set @@lc_time_names=1/0;
|
||||
ERROR 42000: Incorrect argument type to variable 'lc_time_names'
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
sv_SE
|
||||
set lc_time_names=en_US;
|
||||
LC_TIME_NAMES: testing NULL and a negative number:
|
||||
set lc_time_names=NULL;
|
||||
ERROR 42000: Variable 'lc_time_names' can't be set to the value of 'NULL'
|
||||
set lc_time_names=-1;
|
||||
ERROR HY000: Unknown locale: '-1'
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
en_US
|
||||
LC_TIME_NAMES: testing locale with the last ID:
|
||||
set lc_time_names=108;
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
zh_HK
|
||||
LC_TIME_NAMES: testing a number beyond the valid ID range:
|
||||
set lc_time_names=109;
|
||||
ERROR HY000: Unknown locale: '109'
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
zh_HK
|
||||
LC_TIME_NAMES: testing that 0 is en_US:
|
||||
set lc_time_names=0;
|
||||
select @@lc_time_names;
|
||||
@@lc_time_names
|
||||
en_US
|
||||
set @test = @@query_prealloc_size;
|
||||
set @@query_prealloc_size = @test;
|
||||
select @@query_prealloc_size = @test;
|
||||
|
|
|
@ -6,3 +6,9 @@ use prn;
|
|||
ERROR 42000: Unknown database 'prn'
|
||||
create table nu (a int);
|
||||
drop table nu;
|
||||
drop table if exists t1;
|
||||
CREATE TABLE t1 ( `ID` int(6) ) data directory 'c:/tmp/' index directory 'c:/tmp/' engine=MyISAM;
|
||||
Warnings:
|
||||
Warning 0 DATA DIRECTORY option ignored
|
||||
Warning 0 INDEX DIRECTORY option ignored
|
||||
drop table t1;
|
||||
|
|
|
@ -51,5 +51,6 @@ unlock tables;
|
|||
connection con1;
|
||||
reap;
|
||||
drop table t5;
|
||||
--system rm $MYSQLTEST_VARDIR/tmp/t?.*
|
||||
|
||||
# End of 4.1 tests
|
||||
|
|
16
mysql-test/t/ctype_hebrew.test
Normal file
16
mysql-test/t/ctype_hebrew.test
Normal file
|
@ -0,0 +1,16 @@
|
|||
#
|
||||
# BUG #24037: Lossy Hebrew to Unicode conversion
|
||||
#
|
||||
# Test if LRM and RLM characters are correctly converted to UTF-8
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
SET NAMES hebrew;
|
||||
CREATE TABLE t1 (a char(1)) DEFAULT CHARSET=hebrew;
|
||||
INSERT INTO t1 VALUES (0xFD),(0xFE);
|
||||
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8;
|
||||
SELECT HEX(a) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 4.1 tests
|
|
@ -93,6 +93,26 @@ show create table t1;
|
|||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#22646 LC_TIME_NAMES: Assignment to non-UTF8 target fails
|
||||
#
|
||||
set names utf8;
|
||||
set LC_TIME_NAMES='fr_FR';
|
||||
create table t1 (s1 char(20) character set latin1);
|
||||
insert into t1 values (date_format('2004-02-02','%M'));
|
||||
select hex(s1) from t1;
|
||||
drop table t1;
|
||||
create table t1 (s1 char(20) character set koi8r);
|
||||
set LC_TIME_NAMES='ru_RU';
|
||||
insert into t1 values (date_format('2004-02-02','%M'));
|
||||
insert into t1 values (date_format('2004-02-02','%b'));
|
||||
insert into t1 values (date_format('2004-02-02','%W'));
|
||||
insert into t1 values (date_format('2004-02-02','%a'));
|
||||
select hex(s1), s1 from t1;
|
||||
drop table t1;
|
||||
set LC_TIME_NAMES='en_US';
|
||||
|
||||
|
||||
#
|
||||
# Bug #2366 Wrong utf8 behaviour when data is truncated
|
||||
#
|
||||
|
|
|
@ -14,7 +14,7 @@ set GLOBAL query_cache_size=1355776;
|
|||
|
||||
reset query cache;
|
||||
flush status;
|
||||
connect (root,localhost,root,,test,$MASTER_MYPORT,master.sock);
|
||||
connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection root;
|
||||
show grants for current_user;
|
||||
show grants;
|
||||
|
@ -29,7 +29,7 @@ insert into mysqltest.t2 values (3,3,3);
|
|||
create table test.t1 (a char (10));
|
||||
insert into test.t1 values ("test.t1");
|
||||
select * from t1;
|
||||
connect (root2,localhost,root,,mysqltest,$MASTER_MYPORT,master.sock);
|
||||
connect (root2,localhost,root,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection root2;
|
||||
# put queries in cache
|
||||
select * from t1;
|
||||
|
@ -47,7 +47,7 @@ grant SELECT on test.t1 to mysqltest_2@localhost;
|
|||
grant SELECT(a) on mysqltest.t1 to mysqltest_3@localhost;
|
||||
|
||||
# The following queries should be fetched from cache
|
||||
connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,master.sock);
|
||||
connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection user1;
|
||||
show grants for current_user();
|
||||
show status like "Qcache_queries_in_cache";
|
||||
|
@ -72,12 +72,12 @@ show status like "Qcache_hits";
|
|||
show status like "Qcache_not_cached";
|
||||
|
||||
# Don't use '' as user because it will pick Unix login
|
||||
connect (unkuser,localhost,unkuser,,,$MASTER_MYPORT,master.sock);
|
||||
connect (unkuser,localhost,unkuser,,,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection unkuser;
|
||||
show grants for current_user();
|
||||
|
||||
# The following queries should be fetched from cache
|
||||
connect (user2,localhost,mysqltest_2,,mysqltest,$MASTER_MYPORT,master.sock);
|
||||
connect (user2,localhost,mysqltest_2,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection user2;
|
||||
select "user2";
|
||||
select * from t1;
|
||||
|
@ -92,7 +92,7 @@ show status like "Qcache_hits";
|
|||
show status like "Qcache_not_cached";
|
||||
|
||||
# The following queries should not be fetched from cache
|
||||
connect (user3,localhost,mysqltest_3,,mysqltest,$MASTER_MYPORT,master.sock);
|
||||
connect (user3,localhost,mysqltest_3,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection user3;
|
||||
select "user3";
|
||||
--replace_result 127.0.0.1 localhost
|
||||
|
@ -113,7 +113,7 @@ show status like "Qcache_hits";
|
|||
show status like "Qcache_not_cached";
|
||||
|
||||
# Connect without a database
|
||||
connect (user4,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,master.sock);
|
||||
connect (user4,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection user4;
|
||||
select "user4";
|
||||
show grants;
|
||||
|
|
|
@ -70,11 +70,14 @@ insert into t2 select id from t1;
|
|||
create table t3 (kill_id int);
|
||||
insert into t3 values(connection_id());
|
||||
|
||||
connect (conn2, localhost, root,,);
|
||||
connection conn2;
|
||||
|
||||
connection conn1;
|
||||
-- disable_result_log
|
||||
send select id from t1 where id in (select distinct id from t2);
|
||||
-- enable_result_log
|
||||
|
||||
connect (conn2, localhost, root,,);
|
||||
connection conn2;
|
||||
select ((@id := kill_id) - kill_id) from t3;
|
||||
-- sleep 1
|
||||
|
|
|
@ -495,7 +495,7 @@ insert into t1 values (1),(2),(3),(4),(5),(6);
|
|||
insert into t2 values (1,1),(2,1);
|
||||
lock tables t1 read local, t2 read local;
|
||||
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
|
||||
connect (root,localhost,root,,test,$MASTER_MYPORT,master.sock);
|
||||
connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
insert into t2 values(2,0);
|
||||
disconnect root;
|
||||
connection default;
|
||||
|
@ -854,40 +854,5 @@ DROP TABLE t1;
|
|||
#
|
||||
SET @@myisam_repair_threads=1;
|
||||
SHOW VARIABLES LIKE 'myisam_repair%';
|
||||
# Bug#8706 - temporary table with data directory option fails
|
||||
#
|
||||
connect (session1,localhost,root,,);
|
||||
connect (session2,localhost,root,,);
|
||||
|
||||
connection session1;
|
||||
disable_query_log;
|
||||
eval create temporary table t1 (a int) engine=myisam data directory="$MYSQL_TEST_DIR/var/log" select 9 a;
|
||||
enable_query_log;
|
||||
# If running test suite with a non standard tmp dir, the "show create table"
|
||||
# will print "DATA_DIRECTORY=". Use replace_result to mask it out
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
show create table t1;
|
||||
|
||||
connection session2;
|
||||
disable_query_log;
|
||||
eval create temporary table t1 (a int) engine=myisam data directory="$MYSQL_TEST_DIR/var/log" select 99 a;
|
||||
enable_query_log;
|
||||
# If running test suite with a non standard tmp dir, the "show create table"
|
||||
# will print "DATA_DIRECTORY=". Use replace_result to mask it out
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
show create table t1;
|
||||
|
||||
connection default;
|
||||
create table t1 (a int) engine=myisam select 42 a;
|
||||
|
||||
connection session1;
|
||||
select * from t1;
|
||||
disconnect session1;
|
||||
connection session2;
|
||||
select * from t1;
|
||||
disconnect session2;
|
||||
connection default;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
--echo End of 4.1 tests
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
database=db1
|
||||
EOF
|
||||
|
||||
--replace_regex /\/.*mysqladmin/mysqladmin/
|
||||
--replace_regex /.*mysqladmin.*: unknown/mysqladmin: unknown/
|
||||
--error 7
|
||||
--exec $MYSQLADMIN --defaults-file=$MYSQLTEST_VARDIR/tmp/bug10608.cnf -S $MASTER_MYSOCK -P $MASTER_MYPORT -u root --password= ping 2>&1
|
||||
|
||||
|
@ -29,6 +29,6 @@ EOF
|
|||
loose-database=db2
|
||||
EOF
|
||||
|
||||
--replace_regex /Warning: .*mysqladmin/Warning: mysqladmin/
|
||||
--replace_regex /Warning: .*mysqladmin.*: unknown/Warning: mysqladmin: unknown/
|
||||
--exec $MYSQLADMIN --defaults-file=$MYSQLTEST_VARDIR/tmp/bug10608.cnf -S $MASTER_MYSOCK -P $MASTER_MYPORT -u root --password= ping 2>&1
|
||||
|
||||
|
|
|
@ -702,4 +702,19 @@ create table t1 (a int);
|
|||
--exec $MYSQL_DUMP --skip-comments --force test t1 --where='xx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 2>&1
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# BUG#13926: --order-by-primary fails if PKEY contains quote character
|
||||
#
|
||||
CREATE TABLE `t1` (
|
||||
`a b` INT,
|
||||
`c"d` INT,
|
||||
`e``f` INT,
|
||||
PRIMARY KEY (`a b`, `c"d`, `e``f`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
insert into t1 values (0815, 4711, 2006);
|
||||
|
||||
--exec $MYSQL_DUMP --skip-comments --compatible=ansi --order-by-primary test t1
|
||||
--exec $MYSQL_DUMP --skip-comments --order-by-primary test t1
|
||||
DROP TABLE `t1`;
|
||||
|
||||
--echo End of 4.1 tests
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
-- source include/have_ndb.inc
|
||||
-- source include/not_embedded.inc
|
||||
--source include/have_ndb.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
|
@ -48,7 +48,7 @@ CREATE TABLE t1 (
|
|||
);
|
||||
|
||||
set @now = now();
|
||||
sleep 1;
|
||||
--sleep 1.5
|
||||
insert into t1
|
||||
(string,vstring,bin,vbin,tiny,short,medium,long_int,longlong,
|
||||
real_float,real_double, utiny, ushort, umedium,ulong,ulonglong,
|
||||
|
@ -64,7 +64,7 @@ from t1;
|
|||
select time_stamp>@now from t1;
|
||||
|
||||
set @now = now();
|
||||
sleep 1;
|
||||
--sleep 1.5
|
||||
update t1 set string="bbbb",vstring="bbbb",bin=0xBBBB,vbin=0xBBBB,
|
||||
tiny=-2,short=-2,medium=-2,long_int=-2,longlong=-2,real_float=2.2,
|
||||
real_double=2.2,utiny=2,ushort=2,umedium=2,ulong=2,ulonglong=2,
|
||||
|
@ -79,4 +79,4 @@ select time_stamp>@now from t1;
|
|||
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
--echo End of 4.1 tests
|
||||
|
|
|
@ -1068,5 +1068,82 @@ EXECUTE stmt USING @a;
|
|||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#19182: CREATE TABLE bar (m INT) SELECT n FROM foo; doesn't work
|
||||
# from stored procedure.
|
||||
#
|
||||
# The cause of a bug was that cached LEX::create_list was modified,
|
||||
# and then together with LEX::key_list was reset.
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (i INT);
|
||||
|
||||
PREPARE st_19182
|
||||
FROM "CREATE TABLE t2 (i INT, j INT, KEY (i), KEY(j)) SELECT i FROM t1";
|
||||
|
||||
EXECUTE st_19182;
|
||||
DESC t2;
|
||||
|
||||
DROP TABLE t2;
|
||||
|
||||
# Check that on second execution we don't loose 'j' column and the keys
|
||||
# on 'i' and 'j' columns.
|
||||
EXECUTE st_19182;
|
||||
DESC t2;
|
||||
|
||||
DEALLOCATE PREPARE st_19182;
|
||||
DROP TABLE t2, t1;
|
||||
|
||||
#
|
||||
# Bug #22060 "ALTER TABLE x AUTO_INCREMENT=y in SP crashes server"
|
||||
#
|
||||
# Code which implemented CREATE/ALTER TABLE and CREATE DATABASE
|
||||
# statement modified HA_CREATE_INFO structure in LEX, making these
|
||||
# statements PS/SP-unsafe (their re-execution might have resulted
|
||||
# in incorrect results).
|
||||
#
|
||||
--disable_warnings
|
||||
drop database if exists mysqltest;
|
||||
drop table if exists t1, t2;
|
||||
--enable_warnings
|
||||
# CREATE TABLE and CREATE TABLE ... SELECT
|
||||
create database mysqltest character set utf8;
|
||||
prepare stmt1 from "create table mysqltest.t1 (c char(10))";
|
||||
prepare stmt2 from "create table mysqltest.t2 select 'test'";
|
||||
execute stmt1;
|
||||
execute stmt2;
|
||||
show create table mysqltest.t1;
|
||||
show create table mysqltest.t2;
|
||||
drop table mysqltest.t1;
|
||||
drop table mysqltest.t2;
|
||||
alter database mysqltest character set latin1;
|
||||
execute stmt1;
|
||||
execute stmt2;
|
||||
show create table mysqltest.t1;
|
||||
show create table mysqltest.t2;
|
||||
drop database mysqltest;
|
||||
deallocate prepare stmt1;
|
||||
deallocate prepare stmt2;
|
||||
#
|
||||
# CREATE TABLE with DATA DIRECTORY option
|
||||
#
|
||||
# Protect ourselves from data left in tmp/ by a previos possibly failed
|
||||
# test
|
||||
--system rm -f $MYSQLTEST_VARDIR/tmp/t1.*
|
||||
--disable_query_log
|
||||
eval prepare stmt from "create table t1 (c char(10)) data directory='$MYSQLTEST_VARDIR/tmp'";
|
||||
--enable_query_log
|
||||
execute stmt;
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
execute stmt;
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
deallocate prepare stmt;
|
||||
#
|
||||
--echo End of 4.1 tests.
|
||||
|
|
|
@ -81,12 +81,12 @@ drop table t1, t2, t3, t11, t21;
|
|||
#
|
||||
# do not use QC if tables locked (BUG#12385)
|
||||
#
|
||||
connect (root,localhost,root,,test,$MASTER_MYPORT,master.sock);
|
||||
connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection root;
|
||||
CREATE TABLE t1 ( a INT NOT NULL PRIMARY KEY AUTO_INCREMENT ) ENGINE =
|
||||
MyISAM;
|
||||
LOCK TABLE t1 READ LOCAL;
|
||||
connect (root2,localhost,root,,test,$MASTER_MYPORT,master.sock);
|
||||
connect (root2,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection root2;
|
||||
INSERT INTO t1 VALUES (), (), ();
|
||||
connection root;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
connect (master,localhost,root,,test,$MASTER_MYPORT,master.sock);
|
||||
connect (slave,localhost,root,,test,$SLAVE_MYPORT,slave.sock);
|
||||
connect (master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connect (slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK);
|
||||
connection master;
|
||||
reset master;
|
||||
show master status;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
connect (master,localhost,root,,test,$MASTER_MYPORT,master.sock);
|
||||
connect (slave,localhost,root,,test,$SLAVE_MYPORT,slave.sock);
|
||||
connect (master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connect (slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK);
|
||||
connection master;
|
||||
reset master;
|
||||
grant replication slave on *.* to replicate@localhost identified by 'aaaaaaaaaaaaaaab';
|
||||
|
|
22
mysql-test/t/rpl_locale.test
Normal file
22
mysql-test/t/rpl_locale.test
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Replication of locale variables
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
#
|
||||
# Bug#22645 LC_TIME_NAMES: Statement not replicated
|
||||
#
|
||||
connection master;
|
||||
create table t1 (s1 char(10));
|
||||
set lc_time_names= 'de_DE';
|
||||
insert into t1 values (date_format('2001-01-01','%W'));
|
||||
select * from t1;
|
||||
sync_slave_with_master;
|
||||
connection slave;
|
||||
select * from t1;
|
||||
connection master;
|
||||
drop table t1;
|
||||
sync_slave_with_master;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
|
|
@ -9,11 +9,11 @@
|
|||
# changes
|
||||
# - Test creating a duplicate key error and recover from it
|
||||
|
||||
connect (master,localhost,root,,test,$MASTER_MYPORT,master.sock);
|
||||
connect (master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
--disable_warnings
|
||||
drop table if exists t1, t2, t3, t4;
|
||||
--enable_warnings
|
||||
connect (slave,localhost,root,,test,$SLAVE_MYPORT,slave.sock);
|
||||
connect (slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK);
|
||||
system cat /dev/null > var/slave-data/master.info;
|
||||
system chmod 000 var/slave-data/master.info;
|
||||
connection slave;
|
||||
|
|
|
@ -133,4 +133,41 @@ enable_query_log;
|
|||
show create table t1;
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
#
|
||||
# Bug#8706 - temporary table with data directory option fails
|
||||
#
|
||||
connect (session1,localhost,root,,);
|
||||
connect (session2,localhost,root,,);
|
||||
|
||||
connection session1;
|
||||
disable_query_log;
|
||||
eval create temporary table t1 (a int) engine=myisam data directory="$MYSQL_TEST_DIR/var/log" select 9 a;
|
||||
enable_query_log;
|
||||
# If running test suite with a non standard tmp dir, the "show create table"
|
||||
# will print "DATA_DIRECTORY=". Use replace_result to mask it out
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
show create table t1;
|
||||
|
||||
connection session2;
|
||||
disable_query_log;
|
||||
eval create temporary table t1 (a int) engine=myisam data directory="$MYSQL_TEST_DIR/var/log" select 99 a;
|
||||
enable_query_log;
|
||||
# If running test suite with a non standard tmp dir, the "show create table"
|
||||
# will print "DATA_DIRECTORY=". Use replace_result to mask it out
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
show create table t1;
|
||||
|
||||
connection default;
|
||||
create table t1 (a int) engine=myisam select 42 a;
|
||||
|
||||
connection session1;
|
||||
select * from t1;
|
||||
disconnect session1;
|
||||
connection session2;
|
||||
select * from t1;
|
||||
disconnect session2;
|
||||
connection default;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
--echo End of 4.1 tests
|
||||
|
|
|
@ -396,6 +396,50 @@ set names latin1;
|
|||
--replace_column 1 #
|
||||
select @@have_innodb;
|
||||
|
||||
#
|
||||
# Tests for lc_time_names
|
||||
# Note, when adding new locales, please fix ID accordingly:
|
||||
# - to test the last ID (currently 108)
|
||||
# - and the next after the last (currently 109)
|
||||
#
|
||||
--echo *** Various tests with LC_TIME_NAMES
|
||||
--echo *** LC_TIME_NAMES: testing case insensitivity
|
||||
set @@lc_time_names='ru_ru';
|
||||
select @@lc_time_names;
|
||||
--echo *** LC_TIME_NAMES: testing with a user variable
|
||||
set @lc='JA_JP';
|
||||
set @@lc_time_names=@lc;
|
||||
select @@lc_time_names;
|
||||
--echo *** LC_TIME_NAMES: testing with string expressions
|
||||
set lc_time_names=concat('de','_','DE');
|
||||
select @@lc_time_names;
|
||||
--error 1105
|
||||
set lc_time_names=concat('de','+','DE');
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing with numeric expressions
|
||||
set @@lc_time_names=1+2;
|
||||
select @@lc_time_names;
|
||||
--error 1232
|
||||
set @@lc_time_names=1/0;
|
||||
select @@lc_time_names;
|
||||
set lc_time_names=en_US;
|
||||
--echo LC_TIME_NAMES: testing NULL and a negative number:
|
||||
--error 1231
|
||||
set lc_time_names=NULL;
|
||||
--error 1105
|
||||
set lc_time_names=-1;
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing locale with the last ID:
|
||||
set lc_time_names=108;
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing a number beyond the valid ID range:
|
||||
--error 1105
|
||||
set lc_time_names=109;
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing that 0 is en_US:
|
||||
set lc_time_names=0;
|
||||
select @@lc_time_names;
|
||||
|
||||
#
|
||||
# Bug #13334: query_prealloc_size default less than minimum
|
||||
#
|
||||
|
|
|
@ -17,4 +17,13 @@ use prn;
|
|||
create table nu (a int);
|
||||
drop table nu;
|
||||
|
||||
#
|
||||
# Bug17489: ailed to put data file in custom directory use "data directory" option
|
||||
#
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
CREATE TABLE t1 ( `ID` int(6) ) data directory 'c:/tmp/' index directory 'c:/tmp/' engine=MyISAM;
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
|
|
@ -49,6 +49,7 @@ const char *default_directories[]= {
|
|||
"sys:/etc/",
|
||||
#else
|
||||
"/etc/",
|
||||
"/etc/mysql/",
|
||||
#endif
|
||||
#ifdef DATADIR
|
||||
DATADIR,
|
||||
|
|
|
@ -199,11 +199,11 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
|
|||
if (type != READ_NET && type != WRITE_NET)
|
||||
{
|
||||
/* Retry allocating memory in smaller blocks until we get one */
|
||||
cachesize=(uint) ((ulong) (cachesize + min_cache-1) &
|
||||
(ulong) ~(min_cache-1));
|
||||
for (;;)
|
||||
{
|
||||
uint buffer_block;
|
||||
cachesize=(uint) ((ulong) (cachesize + min_cache-1) &
|
||||
(ulong) ~(min_cache-1));
|
||||
if (cachesize < min_cache)
|
||||
cachesize = min_cache;
|
||||
buffer_block = cachesize;
|
||||
|
@ -222,7 +222,8 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
|
|||
}
|
||||
if (cachesize == min_cache)
|
||||
DBUG_RETURN(2); /* Can't alloc cache */
|
||||
cachesize= (uint) ((long) cachesize*3/4); /* Try with less memory */
|
||||
/* Try with less memory */
|
||||
cachesize= (uint) ((ulong) cachesize*3/4 & (ulong)~(min_cache-1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
#define SCHED_POLICY SCHED_OTHER
|
||||
#endif
|
||||
|
||||
uint thd_lib_detected;
|
||||
|
||||
#ifndef my_pthread_setprio
|
||||
void my_pthread_setprio(pthread_t thread_id,int prior)
|
||||
{
|
||||
|
@ -336,7 +338,7 @@ void *sigwait_thread(void *set_arg)
|
|||
sigaction(i, &sact, (struct sigaction*) 0);
|
||||
}
|
||||
}
|
||||
sigaddset(set,THR_CLIENT_ALARM);
|
||||
sigaddset(set, thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1);
|
||||
pthread_sigmask(SIG_UNBLOCK,(sigset_t*) set,(sigset_t*) 0);
|
||||
alarm_thread=pthread_self(); /* For thr_alarm */
|
||||
|
||||
|
|
|
@ -58,9 +58,7 @@ static void *alarm_handler(void *arg);
|
|||
#define reschedule_alarms() pthread_kill(alarm_thread,THR_SERVER_ALARM)
|
||||
#endif
|
||||
|
||||
#if THR_CLIENT_ALARM != SIGALRM || defined(USE_ALARM_THREAD)
|
||||
static sig_handler thread_alarm(int sig __attribute__((unused)));
|
||||
#endif
|
||||
|
||||
static int compare_ulong(void *not_used __attribute__((unused)),
|
||||
byte *a_ptr,byte* b_ptr)
|
||||
|
@ -79,9 +77,13 @@ void init_thr_alarm(uint max_alarms)
|
|||
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)
|
||||
my_sigset(THR_CLIENT_ALARM,thread_alarm);
|
||||
#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();
|
||||
|
@ -99,10 +101,12 @@ void init_thr_alarm(uint max_alarms)
|
|||
}
|
||||
#elif defined(USE_ONE_SIGNAL_HAND)
|
||||
pthread_sigmask(SIG_BLOCK, &s, NULL); /* used with sigwait() */
|
||||
#if THR_SERVER_ALARM == THR_CLIENT_ALARM
|
||||
my_sigset(THR_CLIENT_ALARM,process_alarm); /* Linuxthreads */
|
||||
pthread_sigmask(SIG_UNBLOCK, &s, NULL);
|
||||
#endif
|
||||
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);
|
||||
|
@ -153,7 +157,7 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data)
|
|||
|
||||
now=(ulong) time((time_t*) 0);
|
||||
pthread_sigmask(SIG_BLOCK,&full_signal_set,&old_mask);
|
||||
pthread_mutex_lock(&LOCK_alarm); /* Lock from threads & alarms */
|
||||
pthread_mutex_lock(&LOCK_alarm); /* Lock from threads & alarms */
|
||||
if (alarm_aborted > 0)
|
||||
{ /* No signal thread */
|
||||
DBUG_PRINT("info", ("alarm aborted"));
|
||||
|
@ -273,18 +277,18 @@ sig_handler process_alarm(int sig __attribute__((unused)))
|
|||
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 (thd_lib_detected == THD_LIB_LT &&
|
||||
!pthread_equal(pthread_self(),alarm_thread))
|
||||
{
|
||||
#if defined(MAIN) && !defined(__bsdi__)
|
||||
printf("thread_alarm\n"); fflush(stdout);
|
||||
printf("thread_alarm in process_alarm\n"); fflush(stdout);
|
||||
#endif
|
||||
#ifdef DONT_REMEMBER_SIGNAL
|
||||
my_sigset(THR_CLIENT_ALARM,process_alarm); /* int. thread system calls */
|
||||
my_sigset(thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1,
|
||||
process_alarm); /* int. thread system calls */
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
We have to do do the handling of the alarm in a sub function,
|
||||
|
@ -328,7 +332,8 @@ static sig_handler process_alarm_part2(int sig __attribute__((unused)))
|
|||
alarm_data=(ALARM*) queue_element(&alarm_queue,i);
|
||||
alarm_data->alarmed=1; /* Info to thread */
|
||||
if (pthread_equal(alarm_data->thread,alarm_thread) ||
|
||||
pthread_kill(alarm_data->thread, THR_CLIENT_ALARM))
|
||||
pthread_kill(alarm_data->thread,
|
||||
thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1))
|
||||
{
|
||||
#ifdef MAIN
|
||||
printf("Warning: pthread_kill couldn't find thread!!!\n");
|
||||
|
@ -352,7 +357,8 @@ static sig_handler process_alarm_part2(int sig __attribute__((unused)))
|
|||
alarm_data->alarmed=1; /* Info to thread */
|
||||
DBUG_PRINT("info",("sending signal to waiting thread"));
|
||||
if (pthread_equal(alarm_data->thread,alarm_thread) ||
|
||||
pthread_kill(alarm_data->thread, THR_CLIENT_ALARM))
|
||||
pthread_kill(alarm_data->thread,
|
||||
thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1))
|
||||
{
|
||||
#ifdef MAIN
|
||||
printf("Warning: pthread_kill couldn't find thread!!!\n");
|
||||
|
@ -429,16 +435,13 @@ void end_thr_alarm(my_bool free_structures)
|
|||
if (error == ETIME || error == ETIMEDOUT)
|
||||
break; /* Don't wait forever */
|
||||
}
|
||||
if (!alarm_queue.elements)
|
||||
delete_queue(&alarm_queue);
|
||||
alarm_aborted= 1;
|
||||
pthread_mutex_unlock(&LOCK_alarm);
|
||||
if (!alarm_thread_running) /* Safety */
|
||||
{
|
||||
delete_queue(&alarm_queue);
|
||||
alarm_aborted= 1;
|
||||
pthread_mutex_unlock(&LOCK_alarm);
|
||||
if (!alarm_thread_running) /* Safety */
|
||||
{
|
||||
pthread_mutex_destroy(&LOCK_alarm);
|
||||
pthread_cond_destroy(&COND_alarm);
|
||||
}
|
||||
pthread_mutex_destroy(&LOCK_alarm);
|
||||
pthread_cond_destroy(&COND_alarm);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -495,7 +498,7 @@ void thr_alarm_info(ALARM_INFO *info)
|
|||
ARGSUSED
|
||||
*/
|
||||
|
||||
#if THR_CLIENT_ALARM != SIGALRM || defined(USE_ALARM_THREAD)
|
||||
|
||||
static sig_handler thread_alarm(int sig)
|
||||
{
|
||||
#ifdef MAIN
|
||||
|
@ -505,7 +508,6 @@ static sig_handler thread_alarm(int sig)
|
|||
my_sigset(sig,thread_alarm); /* int. thread system calls */
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAVE_TIMESPEC_TS_SEC
|
||||
|
@ -933,9 +935,7 @@ static void *signal_hand(void *arg __attribute__((unused)))
|
|||
sigaddset(&set,SIGINT);
|
||||
sigaddset(&set,SIGQUIT);
|
||||
sigaddset(&set,SIGTERM);
|
||||
#if THR_CLIENT_ALARM != SIGHUP
|
||||
sigaddset(&set,SIGHUP);
|
||||
#endif
|
||||
#ifdef SIGTSTP
|
||||
sigaddset(&set,SIGTSTP);
|
||||
#endif
|
||||
|
@ -947,7 +947,7 @@ static void *signal_hand(void *arg __attribute__((unused)))
|
|||
#endif
|
||||
#endif /* OS2 */
|
||||
printf("server alarm: %d thread alarm: %d\n",
|
||||
THR_SERVER_ALARM,THR_CLIENT_ALARM);
|
||||
THR_SERVER_ALARM, thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1);
|
||||
DBUG_PRINT("info",("Starting signal and alarm handling thread"));
|
||||
for(;;)
|
||||
{
|
||||
|
@ -1019,11 +1019,11 @@ int main(int argc __attribute__((unused)),char **argv __attribute__((unused)))
|
|||
sigaddset(&set,SIGTSTP);
|
||||
#endif
|
||||
sigaddset(&set,THR_SERVER_ALARM);
|
||||
sigdelset(&set,THR_CLIENT_ALARM);
|
||||
sigdelset(&set, thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1);
|
||||
(void) pthread_sigmask(SIG_SETMASK,&set,NULL);
|
||||
#ifdef NOT_USED
|
||||
sigemptyset(&set);
|
||||
sigaddset(&set,THR_CLIENT_ALARM);
|
||||
sigaddset(&set, thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1);
|
||||
VOID(pthread_sigmask(SIG_UNBLOCK, &set, (sigset_t*) 0));
|
||||
#endif
|
||||
#endif /* OS2 */
|
||||
|
@ -1073,8 +1073,8 @@ int main(int argc __attribute__((unused)),char **argv __attribute__((unused)))
|
|||
}
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
end_thr_alarm(1);
|
||||
thr_alarm_info(&alarm_info);
|
||||
end_thr_alarm(1);
|
||||
printf("Main_thread: Alarms: %u max_alarms: %u next_alarm_time: %lu\n",
|
||||
alarm_info.active_alarms, alarm_info.max_used_alarms,
|
||||
alarm_info.next_alarm_time);
|
||||
|
|
220
mysys/thr_alarm.c.rej
Normal file
220
mysys/thr_alarm.c.rej
Normal file
|
@ -0,0 +1,220 @@
|
|||
***************
|
||||
*** 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)
|
|
@ -322,7 +322,7 @@ BASE=$BASE2
|
|||
#
|
||||
|
||||
if [ x"@GXX@" = x"yes" ] ; then
|
||||
gcclib=`@CC@ --print-libgcc-file`
|
||||
gcclib=`@CC@ @CFLAGS@ --print-libgcc-file`
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Warning: Couldn't find libgcc.a!"
|
||||
else
|
||||
|
|
|
@ -22,6 +22,16 @@ command=".mysql.$$"
|
|||
trap "interrupt" 2
|
||||
|
||||
rootpass=""
|
||||
echo_n=
|
||||
echo_c=
|
||||
|
||||
set_echo_compat() {
|
||||
case `echo "testing\c"`,`echo -n testing` in
|
||||
*c*,-n*) echo_n= echo_c= ;;
|
||||
*c*,*) echo_n=-n echo_c= ;;
|
||||
*) echo_n= echo_c='\c' ;;
|
||||
esac
|
||||
}
|
||||
|
||||
prepare() {
|
||||
touch $config $command
|
||||
|
@ -45,7 +55,7 @@ get_root_password() {
|
|||
status=1
|
||||
while [ $status -eq 1 ]; do
|
||||
stty -echo
|
||||
echo -n "Enter current password for root (enter for none): "
|
||||
echo $echo_n "Enter current password for root (enter for none): $echo_c"
|
||||
read password
|
||||
echo
|
||||
stty echo
|
||||
|
@ -65,10 +75,10 @@ get_root_password() {
|
|||
|
||||
set_root_password() {
|
||||
stty -echo
|
||||
echo -n "New password: "
|
||||
echo $echo_n "New password: $echo_c"
|
||||
read password1
|
||||
echo
|
||||
echo -n "Re-enter new password: "
|
||||
echo $echo_n "Re-enter new password: $echo_c"
|
||||
read password2
|
||||
echo
|
||||
stty echo
|
||||
|
@ -173,6 +183,7 @@ cleanup() {
|
|||
# The actual script starts here
|
||||
|
||||
prepare
|
||||
set_echo_compat
|
||||
|
||||
echo
|
||||
echo
|
||||
|
@ -201,11 +212,11 @@ echo "root user without the proper authorisation."
|
|||
echo
|
||||
|
||||
if [ $hadpass -eq 0 ]; then
|
||||
echo -n "Set root password? [Y/n] "
|
||||
echo $echo_n "Set root password? [Y/n] $echo_c"
|
||||
else
|
||||
echo "You already have a root password set, so you can safely answer 'n'."
|
||||
echo
|
||||
echo -n "Change the root password? [Y/n] "
|
||||
echo $echo_n "Change the root password? [Y/n] $echo_c"
|
||||
fi
|
||||
|
||||
read reply
|
||||
|
@ -232,7 +243,7 @@ echo "go a bit smoother. You should remove them before moving into a"
|
|||
echo "production environment."
|
||||
echo
|
||||
|
||||
echo -n "Remove anonymous users? [Y/n] "
|
||||
echo $echo_n "Remove anonymous users? [Y/n] $echo_c"
|
||||
|
||||
read reply
|
||||
if [ "$reply" = "n" ]; then
|
||||
|
@ -251,7 +262,7 @@ echo "Normally, root should only be allowed to connect from 'localhost'. This"
|
|||
echo "ensures that someone cannot guess at the root password from the network."
|
||||
echo
|
||||
|
||||
echo -n "Disallow root login remotely? [Y/n] "
|
||||
echo $echo_n "Disallow root login remotely? [Y/n] $echo_c"
|
||||
read reply
|
||||
if [ "$reply" = "n" ]; then
|
||||
echo " ... skipping."
|
||||
|
@ -270,7 +281,7 @@ echo "access. This is also intended only for testing, and should be removed"
|
|||
echo "before moving into a production environment."
|
||||
echo
|
||||
|
||||
echo -n "Remove test database and access to it? [Y/n] "
|
||||
echo $echo_n "Remove test database and access to it? [Y/n] $echo_c"
|
||||
read reply
|
||||
if [ "$reply" = "n" ]; then
|
||||
echo " ... skipping."
|
||||
|
@ -288,7 +299,7 @@ echo "Reloading the privilege tables will ensure that all changes made so far"
|
|||
echo "will take effect immediately."
|
||||
echo
|
||||
|
||||
echo -n "Reload privilege tables now? [Y/n] "
|
||||
echo $echo_n "Reload privilege tables now? [Y/n] $echo_c"
|
||||
read reply
|
||||
if [ "$reply" = "n" ]; then
|
||||
echo " ... skipping."
|
||||
|
|
|
@ -465,6 +465,9 @@ MySQLaccess::Report::Print_Header();
|
|||
elsif (-f "@sysconfdir@/$script_conf") {
|
||||
require "@sysconfdir@/$script_conf";
|
||||
}
|
||||
elsif (-f "/etc/$script_conf") {
|
||||
require "/etc/$script_conf";
|
||||
}
|
||||
|
||||
# ****************************
|
||||
# Read in all parameters
|
||||
|
@ -930,6 +933,7 @@ sub MergeConfigFile {
|
|||
sub MergeConfigFiles {
|
||||
my ($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwuid $<;
|
||||
MergeConfigFile("@sysconfdir@/my.cnf");
|
||||
MergeConfigFile("/etc/my.cnf");
|
||||
MergeConfigFile("$dir/.my.cnf");
|
||||
}
|
||||
|
||||
|
|
|
@ -132,7 +132,13 @@ if test -z "$VISUAL"
|
|||
then
|
||||
if test -z "$EDITOR"
|
||||
then
|
||||
EDIT=emacs
|
||||
# Honor debian sensible-editor
|
||||
if test -x "/usr/bin/sensible-editor"
|
||||
then
|
||||
EDIT=/usr/bin/sensible-editor
|
||||
else
|
||||
EDIT=emacs
|
||||
fi
|
||||
else
|
||||
EDIT="$EDITOR"
|
||||
fi
|
||||
|
|
|
@ -432,11 +432,22 @@ sub find_groups
|
|||
if (-f "@sysconfdir@/my.cnf" && -r "@sysconfdir@/my.cnf")
|
||||
{
|
||||
open(MY_CNF, "<@sysconfdir@/my.cnf") && (@tmp=<MY_CNF>) && close(MY_CNF);
|
||||
} elsif (-f "/etc/my.cnf" && -r "/etc/my.cnf")
|
||||
{
|
||||
open(MY_CNF, "</etc/my.cnf") && (@tmp=<MY_CNF>) && close(MY_CNF);
|
||||
}
|
||||
for ($i = 0; ($line = shift @tmp); $i++)
|
||||
{
|
||||
$data[$i] = $line;
|
||||
}
|
||||
if (-f "/etc/mysql/my.cnf" && -r "/etc/mysql/my.cnf")
|
||||
{
|
||||
open(MY_CNF, "</etc/mysql/my.cnf") && (@tmp=<MY_CNF>) && close(MY_CNF);
|
||||
}
|
||||
for (; ($line = shift @tmp); $i++)
|
||||
{
|
||||
$data[$i] = $line;
|
||||
}
|
||||
if (-f "$homedir/.my.cnf" && -r "$homedir/.my.cnf")
|
||||
{
|
||||
open(MY_CNF, "<$homedir/.my.cnf") && (@tmp=<MY_CNF>) && close(MY_CNF);
|
||||
|
@ -446,7 +457,7 @@ sub find_groups
|
|||
$data[$i] = $line;
|
||||
}
|
||||
}
|
||||
chop @data;
|
||||
chomp @data;
|
||||
# Make a list of the wanted group ids
|
||||
if (defined($raw_gids))
|
||||
{
|
||||
|
|
|
@ -195,6 +195,7 @@ if [ ! -d $mysql_unix_port_dir ]
|
|||
then
|
||||
mkdir $mysql_unix_port_dir
|
||||
chown $user $mysql_unix_port_dir
|
||||
chmod 755 $mysql_unix_port_dir
|
||||
fi
|
||||
|
||||
# Use the mysqld-max binary by default if the user doesn't specify a binary
|
||||
|
|
|
@ -40,6 +40,7 @@ unless (@ARGV) {
|
|||
warn "basedir=$basedir\n" if $opt{v};
|
||||
|
||||
my $datadir = ($defaults =~ m/--datadir=(.*)/)[0];
|
||||
my $slowlog = ($defaults =~ m/--log-slow-queries=(.*)/)[0];
|
||||
if (!$datadir or $opt{i}) {
|
||||
# determine the datadir from the instances section of /etc/my.cnf, if any
|
||||
my $instances = `my_print_defaults instances`;
|
||||
|
@ -55,8 +56,13 @@ unless (@ARGV) {
|
|||
warn "datadir=$datadir\n" if $opt{v};
|
||||
}
|
||||
|
||||
@ARGV = <$datadir/$opt{h}-slow.log>;
|
||||
die "Can't find '$datadir/$opt{h}-slow.log'\n" unless @ARGV;
|
||||
if ( -f $slowlog ) {
|
||||
@ARGV = ($slowlog);
|
||||
die "Can't find '$slowlog'\n" unless @ARGV;
|
||||
} else {
|
||||
@ARGV = <$datadir/$opt{h}-slow.log>;
|
||||
die "Can't find '$datadir/$opt{h}-slow.log'\n" unless @ARGV;
|
||||
}
|
||||
}
|
||||
|
||||
warn "\nReading mysql slow query log from @ARGV\n";
|
||||
|
|
|
@ -5373,7 +5373,7 @@ ndb_get_table_statistics(ha_ndbcluster* file, bool report_error, Ndb* ndb,
|
|||
retry:
|
||||
if(report_error)
|
||||
{
|
||||
if (file)
|
||||
if (file && pTrans)
|
||||
{
|
||||
reterr= file->ndb_err(pTrans);
|
||||
}
|
||||
|
|
|
@ -2473,8 +2473,9 @@ bool Item_func_set_user_var::update_hash(void *ptr, uint length,
|
|||
char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
|
||||
if (entry->value == pos)
|
||||
entry->value=0;
|
||||
if (!(entry->value=(char*) my_realloc(entry->value, length,
|
||||
MYF(MY_ALLOW_ZERO_PTR))))
|
||||
entry->value= (char*) my_realloc(entry->value, length,
|
||||
MYF(MY_ALLOW_ZERO_PTR | MY_WME));
|
||||
if (!entry->value)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -595,16 +595,10 @@ bool make_date_time(DATE_TIME_FORMAT *format, TIME *l_time,
|
|||
uint weekday;
|
||||
ulong length;
|
||||
const char *ptr, *end;
|
||||
MY_LOCALE *locale;
|
||||
THD *thd= current_thd;
|
||||
char buf[128];
|
||||
String tmp(buf, sizeof(buf), thd->variables.character_set_results);
|
||||
uint errors= 0;
|
||||
MY_LOCALE *locale= thd->variables.lc_time_names;
|
||||
|
||||
tmp.length(0);
|
||||
str->length(0);
|
||||
str->set_charset(&my_charset_bin);
|
||||
locale = thd->variables.lc_time_names;
|
||||
|
||||
if (l_time->neg)
|
||||
str->append("-", 1);
|
||||
|
@ -618,41 +612,37 @@ bool make_date_time(DATE_TIME_FORMAT *format, TIME *l_time,
|
|||
{
|
||||
switch (*++ptr) {
|
||||
case 'M':
|
||||
if (!l_time->month)
|
||||
return 1;
|
||||
tmp.copy(locale->month_names->type_names[l_time->month-1],
|
||||
strlen(locale->month_names->type_names[l_time->month-1]),
|
||||
system_charset_info, tmp.charset(), &errors);
|
||||
str->append(tmp.ptr(), tmp.length());
|
||||
break;
|
||||
if (!l_time->month)
|
||||
return 1;
|
||||
str->append(locale->month_names->type_names[l_time->month-1],
|
||||
strlen(locale->month_names->type_names[l_time->month-1]),
|
||||
system_charset_info);
|
||||
break;
|
||||
case 'b':
|
||||
if (!l_time->month)
|
||||
return 1;
|
||||
tmp.copy(locale->ab_month_names->type_names[l_time->month-1],
|
||||
strlen(locale->ab_month_names->type_names[l_time->month-1]),
|
||||
system_charset_info, tmp.charset(), &errors);
|
||||
str->append(tmp.ptr(), tmp.length());
|
||||
break;
|
||||
if (!l_time->month)
|
||||
return 1;
|
||||
str->append(locale->ab_month_names->type_names[l_time->month-1],
|
||||
strlen(locale->ab_month_names->type_names[l_time->month-1]),
|
||||
system_charset_info);
|
||||
break;
|
||||
case 'W':
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
return 1;
|
||||
weekday= calc_weekday(calc_daynr(l_time->year,l_time->month,
|
||||
l_time->day),0);
|
||||
tmp.copy(locale->day_names->type_names[weekday],
|
||||
strlen(locale->day_names->type_names[weekday]),
|
||||
system_charset_info, tmp.charset(), &errors);
|
||||
str->append(tmp.ptr(), tmp.length());
|
||||
break;
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
return 1;
|
||||
weekday= calc_weekday(calc_daynr(l_time->year,l_time->month,
|
||||
l_time->day),0);
|
||||
str->append(locale->day_names->type_names[weekday],
|
||||
strlen(locale->day_names->type_names[weekday]),
|
||||
system_charset_info);
|
||||
break;
|
||||
case 'a':
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
return 1;
|
||||
weekday=calc_weekday(calc_daynr(l_time->year,l_time->month,
|
||||
l_time->day),0);
|
||||
tmp.copy(locale->ab_day_names->type_names[weekday],
|
||||
strlen(locale->ab_day_names->type_names[weekday]),
|
||||
system_charset_info, tmp.charset(), &errors);
|
||||
str->append(tmp.ptr(), tmp.length());
|
||||
break;
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
return 1;
|
||||
weekday=calc_weekday(calc_daynr(l_time->year,l_time->month,
|
||||
l_time->day),0);
|
||||
str->append(locale->ab_day_names->type_names[weekday],
|
||||
strlen(locale->ab_day_names->type_names[weekday]),
|
||||
system_charset_info);
|
||||
break;
|
||||
case 'D':
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
return 1;
|
||||
|
@ -1638,8 +1628,9 @@ longlong Item_func_sec_to_time::val_int()
|
|||
|
||||
void Item_func_date_format::fix_length_and_dec()
|
||||
{
|
||||
THD* thd= current_thd;
|
||||
decimals=0;
|
||||
collation.set(&my_charset_bin);
|
||||
collation.set(thd->variables.collation_connection);
|
||||
if (args[1]->type() == STRING_ITEM)
|
||||
{ // Optimize the normal case
|
||||
fixed_length=1;
|
||||
|
@ -1653,17 +1644,14 @@ void Item_func_date_format::fix_length_and_dec()
|
|||
args[1]->collation.set(
|
||||
get_charset_by_csname(args[1]->collation.collation->csname,
|
||||
MY_CS_BINSORT,MYF(0)), DERIVATION_COERCIBLE);
|
||||
/*
|
||||
The result is a binary string (no reason to use collation->mbmaxlen
|
||||
This is becasue make_date_time() only returns binary strings
|
||||
*/
|
||||
max_length= format_length(((Item_string*) args[1])->const_string());
|
||||
max_length= format_length(((Item_string*) args[1])->const_string()) *
|
||||
collation.collation->mbmaxlen;
|
||||
}
|
||||
else
|
||||
{
|
||||
fixed_length=0;
|
||||
/* The result is a binary string (no reason to use collation->mbmaxlen */
|
||||
max_length=min(args[1]->max_length,MAX_BLOB_WIDTH) * 10;
|
||||
max_length= min(args[1]->max_length,MAX_BLOB_WIDTH) * 10 *
|
||||
collation.collation->mbmaxlen;
|
||||
set_if_smaller(max_length,MAX_BLOB_WIDTH);
|
||||
}
|
||||
maybe_null=1; // If wrong date
|
||||
|
@ -1783,6 +1771,7 @@ String *Item_func_date_format::val_str(String *str)
|
|||
date_time_format.format.length= format->length();
|
||||
|
||||
/* Create the result string */
|
||||
str->set_charset(collation.collation);
|
||||
if (!make_date_time(&date_time_format, &l_time,
|
||||
is_time_format ? MYSQL_TIMESTAMP_TIME :
|
||||
MYSQL_TIMESTAMP_DATE,
|
||||
|
|
15
sql/log.cc
15
sql/log.cc
|
@ -1350,6 +1350,21 @@ COLLATION_CONNECTION=%u,COLLATION_DATABASE=%u,COLLATION_SERVER=%u",
|
|||
if (e.write(file))
|
||||
goto err;
|
||||
}
|
||||
/*
|
||||
Use the same ONE_SHOT trick for making replication of lc_time_names.
|
||||
*/
|
||||
if (thd->variables.lc_time_names->number) // Not en_US
|
||||
{
|
||||
char buf[32];
|
||||
uint length= my_snprintf(buf, sizeof(buf),
|
||||
"SET ONE_SHOT LC_TIME_NAMES=%u",
|
||||
(uint) thd->variables.lc_time_names->number);
|
||||
Query_log_event e(thd, buf, length, 0, FALSE);
|
||||
e.set_log_pos(this);
|
||||
e.error_code= 0; // This statement cannot fail (see [1]).
|
||||
if (e.write(file))
|
||||
goto err;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (thd->last_insert_id_used)
|
||||
|
|
|
@ -71,6 +71,7 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset;
|
|||
|
||||
typedef struct my_locale_st
|
||||
{
|
||||
uint number;
|
||||
const char *name;
|
||||
const char *description;
|
||||
const bool is_ascii;
|
||||
|
@ -84,6 +85,7 @@ extern MY_LOCALE my_locale_en_US;
|
|||
extern MY_LOCALE *my_locales[];
|
||||
|
||||
MY_LOCALE *my_locale_by_name(const char *name);
|
||||
MY_LOCALE *my_locale_by_number(uint number);
|
||||
|
||||
/***************************************************************************
|
||||
Configuration parameters
|
||||
|
@ -563,25 +565,22 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
uint &key_count, int select_field_count);
|
||||
int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
HA_CREATE_INFO *create_info,
|
||||
List<create_field> &fields, List<Key> &keys,
|
||||
Alter_info *alter_info,
|
||||
bool tmp_table, uint select_field_count);
|
||||
|
||||
TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
||||
const char *db, const char *name,
|
||||
List<create_field> *extra_fields,
|
||||
List<Key> *keys,
|
||||
Alter_info *alter_info,
|
||||
List<Item> *items,
|
||||
MYSQL_LOCK **lock);
|
||||
int mysql_alter_table(THD *thd, char *new_db, char *new_name,
|
||||
HA_CREATE_INFO *create_info,
|
||||
TABLE_LIST *table_list,
|
||||
List<create_field> &fields,
|
||||
List<Key> &keys,
|
||||
Alter_info *alter_info,
|
||||
uint order_num, ORDER *order,
|
||||
enum enum_duplicates handle_duplicates,
|
||||
bool ignore,
|
||||
ALTER_INFO *alter_info, bool do_send_ok=1);
|
||||
int mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool do_send_ok);
|
||||
bool ignore);
|
||||
int mysql_recreate_table(THD *thd, TABLE_LIST *table_list);
|
||||
int mysql_create_like_table(THD *thd, TABLE_LIST *table,
|
||||
HA_CREATE_INFO *create_info,
|
||||
Table_ident *src_table);
|
||||
|
@ -590,9 +589,6 @@ bool mysql_rename_table(enum db_type base,
|
|||
const char * old_name,
|
||||
const char *new_db,
|
||||
const char * new_name);
|
||||
int mysql_create_index(THD *thd, TABLE_LIST *table_list, List<Key> &keys);
|
||||
int mysql_drop_index(THD *thd, TABLE_LIST *table_list,
|
||||
ALTER_INFO *alter_info);
|
||||
int mysql_prepare_update(THD *thd, TABLE_LIST *table_list,
|
||||
TABLE_LIST *update_table_list,
|
||||
Item **conds, uint order_num, ORDER *order);
|
||||
|
@ -679,7 +675,8 @@ int get_quote_char_for_identifier(THD *thd, const char *name, uint length);
|
|||
void mysqld_list_fields(THD *thd,TABLE_LIST *table, const char *wild);
|
||||
int mysqld_dump_create_info(THD *thd, TABLE *table, int fd = -1);
|
||||
int mysqld_show_create(THD *thd, TABLE_LIST *table_list);
|
||||
int mysqld_show_create_db(THD *thd, char *dbname, HA_CREATE_INFO *create);
|
||||
int mysqld_show_create_db(THD *thd, char *dbname,
|
||||
const HA_CREATE_INFO *create);
|
||||
|
||||
void mysqld_list_processes(THD *thd,const char *user,bool verbose);
|
||||
int mysqld_show_status(THD *thd);
|
||||
|
|
|
@ -210,12 +210,6 @@ inline void reset_floating_point_exceptions()
|
|||
|
||||
} /* cplusplus */
|
||||
|
||||
|
||||
#if defined(HAVE_LINUXTHREADS)
|
||||
#define THR_KILL_SIGNAL SIGINT
|
||||
#else
|
||||
#define THR_KILL_SIGNAL SIGUSR2 // Can't use this with LinuxThreads
|
||||
#endif
|
||||
#define MYSQL_KILL_SIGNAL SIGTERM
|
||||
|
||||
#ifdef HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R
|
||||
|
@ -587,6 +581,7 @@ static void clean_up_mutexes(void);
|
|||
static void wait_for_signal_thread_to_end(void);
|
||||
static int test_if_case_insensitive(const char *dir_name);
|
||||
static void create_pid_file();
|
||||
static uint get_thread_lib(void);
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
/****************************************************************************
|
||||
|
@ -626,7 +621,8 @@ static void close_connections(void)
|
|||
DBUG_PRINT("info",("Waiting for select thread"));
|
||||
|
||||
#ifndef DONT_USE_THR_ALARM
|
||||
if (pthread_kill(select_thread,THR_CLIENT_ALARM))
|
||||
if (pthread_kill(select_thread,
|
||||
thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1))
|
||||
break; // allready dead
|
||||
#endif
|
||||
set_timespec(abstime, 2);
|
||||
|
@ -2049,7 +2045,10 @@ static void init_signals(void)
|
|||
DBUG_ENTER("init_signals");
|
||||
|
||||
if (test_flags & TEST_SIGINT)
|
||||
my_sigset(THR_KILL_SIGNAL,end_thread_signal);
|
||||
{
|
||||
my_sigset(thd_lib_detected == THD_LIB_LT ? SIGINT : SIGUSR2,
|
||||
end_thread_signal);
|
||||
}
|
||||
my_sigset(THR_SERVER_ALARM,print_signal_warning); // Should never be called!
|
||||
|
||||
if (!(test_flags & TEST_NO_STACKTRACE) || (test_flags & TEST_CORE_ON_SIGNAL))
|
||||
|
@ -2106,8 +2105,12 @@ static void init_signals(void)
|
|||
#endif
|
||||
sigaddset(&set,THR_SERVER_ALARM);
|
||||
if (test_flags & TEST_SIGINT)
|
||||
sigdelset(&set,THR_KILL_SIGNAL); // May be SIGINT
|
||||
sigdelset(&set,THR_CLIENT_ALARM); // For alarms
|
||||
{
|
||||
// May be SIGINT
|
||||
sigdelset(&set, thd_lib_detected == THD_LIB_LT ? SIGINT : SIGUSR2);
|
||||
}
|
||||
// For alarms
|
||||
sigdelset(&set, thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1);
|
||||
sigprocmask(SIG_SETMASK,&set,NULL);
|
||||
pthread_sigmask(SIG_SETMASK,&set,NULL);
|
||||
DBUG_VOID_RETURN;
|
||||
|
@ -2163,23 +2166,19 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
|
|||
*/
|
||||
init_thr_alarm(max_connections +
|
||||
global_system_variables.max_insert_delayed_threads + 10);
|
||||
#if SIGINT != THR_KILL_SIGNAL
|
||||
if (test_flags & TEST_SIGINT)
|
||||
if (thd_lib_detected != THD_LIB_LT && test_flags & TEST_SIGINT)
|
||||
{
|
||||
(void) sigemptyset(&set); // Setup up SIGINT for debug
|
||||
(void) sigaddset(&set,SIGINT); // For debugging
|
||||
(void) pthread_sigmask(SIG_UNBLOCK,&set,NULL);
|
||||
}
|
||||
#endif
|
||||
(void) sigemptyset(&set); // Setup up SIGINT for debug
|
||||
#ifdef USE_ONE_SIGNAL_HAND
|
||||
(void) sigaddset(&set,THR_SERVER_ALARM); // For alarms
|
||||
#endif
|
||||
#ifndef IGNORE_SIGHUP_SIGQUIT
|
||||
(void) sigaddset(&set,SIGQUIT);
|
||||
#if THR_CLIENT_ALARM != SIGHUP
|
||||
(void) sigaddset(&set,SIGHUP);
|
||||
#endif
|
||||
#endif
|
||||
(void) sigaddset(&set,SIGTERM);
|
||||
(void) sigaddset(&set,SIGTSTP);
|
||||
|
@ -3148,6 +3147,7 @@ int main(int argc, char **argv)
|
|||
}
|
||||
#endif
|
||||
|
||||
thd_lib_detected= get_thread_lib();
|
||||
if (init_common_variables(MYSQL_CONFIG_NAME,
|
||||
argc, argv, load_default_groups))
|
||||
unireg_abort(1); // Will do exit
|
||||
|
@ -7024,6 +7024,22 @@ static void create_pid_file()
|
|||
}
|
||||
|
||||
|
||||
static uint get_thread_lib(void)
|
||||
{
|
||||
char buff[64];
|
||||
|
||||
#ifdef _CS_GNU_LIBPTHREAD_VERSION
|
||||
confstr(_CS_GNU_LIBPTHREAD_VERSION, buff, sizeof(buff));
|
||||
|
||||
if (!strncasecmp(buff, "NPTL", 4))
|
||||
return THD_LIB_NPTL;
|
||||
else if (!strncasecmp(buff, "linuxthreads", 12))
|
||||
return THD_LIB_LT;
|
||||
#endif
|
||||
return THD_LIB_OTHER;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
Instantiate templates
|
||||
*****************************************************************************/
|
||||
|
|
161
sql/mysqld.cc.rej
Normal file
161
sql/mysqld.cc.rej
Normal file
|
@ -0,0 +1,161 @@
|
|||
***************
|
||||
*** 177,188 ****
|
||||
} /* cplusplus */
|
||||
|
||||
|
||||
- #if defined(HAVE_LINUXTHREADS)
|
||||
- #define THR_KILL_SIGNAL SIGINT
|
||||
- #else
|
||||
- #define THR_KILL_SIGNAL SIGUSR2 // Can't use this with LinuxThreads
|
||||
- #endif
|
||||
-
|
||||
#ifdef HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R
|
||||
#include <sys/types.h>
|
||||
#else
|
||||
--- 177,182 ----
|
||||
} /* cplusplus */
|
||||
|
||||
|
||||
#ifdef HAVE_GLIBC2_STYLE_GETHOSTBYNAME_R
|
||||
#include <sys/types.h>
|
||||
#else
|
||||
***************
|
||||
*** 505,510 ****
|
||||
static void clean_up_mutexes(void);
|
||||
static int test_if_case_insensitive(const char *dir_name);
|
||||
static void create_pid_file();
|
||||
|
||||
/****************************************************************************
|
||||
** Code to end mysqld
|
||||
--- 499,505 ----
|
||||
static void clean_up_mutexes(void);
|
||||
static int test_if_case_insensitive(const char *dir_name);
|
||||
static void create_pid_file();
|
||||
+ static uint get_thread_lib(void);
|
||||
|
||||
/****************************************************************************
|
||||
** Code to end mysqld
|
||||
***************
|
||||
*** 544,550 ****
|
||||
DBUG_PRINT("info",("Waiting for select_thread"));
|
||||
|
||||
#ifndef DONT_USE_THR_ALARM
|
||||
! if (pthread_kill(select_thread,THR_CLIENT_ALARM))
|
||||
break; // allready dead
|
||||
#endif
|
||||
set_timespec(abstime, 2);
|
||||
--- 539,546 ----
|
||||
DBUG_PRINT("info",("Waiting for select_thread"));
|
||||
|
||||
#ifndef DONT_USE_THR_ALARM
|
||||
! if (pthread_kill(select_thread,
|
||||
! thd_lib_detected == THD_LIB_LT ? SIGALRM : SIGUSR1))
|
||||
break; // allready dead
|
||||
#endif
|
||||
set_timespec(abstime, 2);
|
||||
***************
|
||||
*** 844,850 ****
|
||||
sig,my_thread_id());
|
||||
}
|
||||
#ifdef DONT_REMEMBER_SIGNAL
|
||||
! sigset(sig,print_signal_warning); /* int. thread system calls */
|
||||
#endif
|
||||
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__)
|
||||
if (sig == SIGALRM)
|
||||
--- 840,846 ----
|
||||
sig,my_thread_id());
|
||||
}
|
||||
#ifdef DONT_REMEMBER_SIGNAL
|
||||
! my_sigset(sig, print_signal_warning); /* int. thread system calls */
|
||||
#endif
|
||||
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__)
|
||||
if (sig == SIGALRM)
|
||||
***************
|
||||
*** 1841,1848 ****
|
||||
DBUG_ENTER("init_signals");
|
||||
|
||||
if (test_flags & TEST_SIGINT)
|
||||
! sigset(THR_KILL_SIGNAL,end_thread_signal);
|
||||
! sigset(THR_SERVER_ALARM,print_signal_warning); // Should never be called!
|
||||
|
||||
if (!(test_flags & TEST_NO_STACKTRACE) || (test_flags & TEST_CORE_ON_SIGNAL))
|
||||
{
|
||||
--- 1837,1847 ----
|
||||
DBUG_ENTER("init_signals");
|
||||
|
||||
if (test_flags & TEST_SIGINT)
|
||||
! {
|
||||
! my_sigset(thd_lib_detected == THD_LIB_LT ? SIGINT : SIGUSR2,
|
||||
! end_thread_signal);
|
||||
! }
|
||||
! my_sigset(THR_SERVER_ALARM, print_signal_warning); // Should never be called!
|
||||
|
||||
if (!(test_flags & TEST_NO_STACKTRACE) || (test_flags & TEST_CORE_ON_SIGNAL))
|
||||
{
|
||||
***************
|
||||
*** 1877,1883 ****
|
||||
#endif
|
||||
(void) sigemptyset(&set);
|
||||
#ifdef THREAD_SPECIFIC_SIGPIPE
|
||||
! sigset(SIGPIPE,abort_thread);
|
||||
sigaddset(&set,SIGPIPE);
|
||||
#else
|
||||
(void) signal(SIGPIPE,SIG_IGN); // Can't know which thread
|
||||
--- 1876,1882 ----
|
||||
#endif
|
||||
(void) sigemptyset(&set);
|
||||
#ifdef THREAD_SPECIFIC_SIGPIPE
|
||||
! my_sigset(SIGPIPE, abort_thread);
|
||||
sigaddset(&set,SIGPIPE);
|
||||
#else
|
||||
(void) signal(SIGPIPE,SIG_IGN); // Can't know which thread
|
||||
***************
|
||||
*** 2237,2244 ****
|
||||
MY_INIT(argv[0]); // init my_sys library & pthreads
|
||||
tzset(); // Set tzname
|
||||
|
||||
start_time=time((time_t*) 0);
|
||||
-
|
||||
#ifdef OS2
|
||||
{
|
||||
// fix timezone for daylight saving
|
||||
--- 2236,2243 ----
|
||||
MY_INIT(argv[0]); // init my_sys library & pthreads
|
||||
tzset(); // Set tzname
|
||||
|
||||
+ thd_lib_detected= get_thread_lib();
|
||||
start_time=time((time_t*) 0);
|
||||
#ifdef OS2
|
||||
{
|
||||
// fix timezone for daylight saving
|
||||
***************
|
||||
*** 5547,5552 ****
|
||||
(void) my_write(file, (byte*) buff, (uint) (end-buff),MYF(MY_WME));
|
||||
(void) my_close(file, MYF(0));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
--- 5546,5567 ----
|
||||
(void) my_write(file, (byte*) buff, (uint) (end-buff),MYF(MY_WME));
|
||||
(void) my_close(file, MYF(0));
|
||||
}
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ static uint get_thread_lib(void)
|
||||
+ {
|
||||
+ char buff[64];
|
||||
+
|
||||
+ #ifdef _CS_GNU_LIBPTHREAD_VERSION
|
||||
+ confstr(_CS_GNU_LIBPTHREAD_VERSION, buff, sizeof(buff));
|
||||
+
|
||||
+ if (!strncasecmp(buff, "NPTL", 4))
|
||||
+ return THD_LIB_NPTL;
|
||||
+ else if (!strncasecmp(buff, "linuxthreads", 12))
|
||||
+ return THD_LIB_LT;
|
||||
+ #endif
|
||||
+ return THD_LIB_OTHER;
|
||||
}
|
||||
|
||||
|
|
@ -2570,19 +2570,38 @@ void sys_var_thd_time_zone::set_default(THD *thd, enum_var_type type)
|
|||
|
||||
bool sys_var_thd_lc_time_names::check(THD *thd, set_var *var)
|
||||
{
|
||||
char *locale_str =var->value->str_value.c_ptr();
|
||||
MY_LOCALE *locale_match= my_locale_by_name(locale_str);
|
||||
MY_LOCALE *locale_match;
|
||||
|
||||
if(locale_match == NULL)
|
||||
if (var->value->result_type() == INT_RESULT)
|
||||
{
|
||||
my_printf_error(ER_UNKNOWN_ERROR, "Unknown locale: '%s'", MYF(0), locale_str);
|
||||
return 1;
|
||||
if (!(locale_match= my_locale_by_number((uint) var->value->val_int())))
|
||||
{
|
||||
char buf[20];
|
||||
int10_to_str((int) var->value->val_int(), buf, -10);
|
||||
my_printf_error(ER_UNKNOWN_ERROR, "Unknown locale: '%s'", MYF(0), buf);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
else // STRING_RESULT
|
||||
{
|
||||
var->save_result.locale_value= locale_match;
|
||||
return 0;
|
||||
char buff[6];
|
||||
String str(buff, sizeof(buff), &my_charset_latin1), *res;
|
||||
if (!(res=var->value->val_str(&str)))
|
||||
{
|
||||
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name, "NULL");
|
||||
return 1;
|
||||
}
|
||||
const char *locale_str= res->c_ptr();
|
||||
if (!(locale_match= my_locale_by_name(locale_str)))
|
||||
{
|
||||
my_printf_error(ER_UNKNOWN_ERROR,
|
||||
"Unknown locale: '%s'", MYF(0), locale_str);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
var->save_result.locale_value= locale_match;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -764,12 +764,16 @@ class sys_var_thd_lc_time_names :public sys_var_thd
|
|||
public:
|
||||
sys_var_thd_lc_time_names(const char *name_arg):
|
||||
sys_var_thd(name_arg)
|
||||
{}
|
||||
{
|
||||
#if MYSQL_VERSION_ID < 50000
|
||||
no_support_one_shot= 0;
|
||||
#endif
|
||||
}
|
||||
bool check(THD *thd, set_var *var);
|
||||
SHOW_TYPE type() { return SHOW_CHAR; }
|
||||
bool check_update_type(Item_result type)
|
||||
{
|
||||
return type != STRING_RESULT; /* Only accept strings */
|
||||
return ((type != STRING_RESULT) && (type != INT_RESULT));
|
||||
}
|
||||
bool check_default(enum_var_type type) { return 0; }
|
||||
bool update(THD *thd, set_var *var);
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
|
||||
02 02 02 02 02 02 02 02 02 02 02 00 00 00 00 00
|
||||
02 02 02 02 02 02 02 02 02 02 02 00 00 20 20 00
|
||||
</map>
|
||||
</ctype>
|
||||
|
||||
|
@ -106,7 +106,7 @@
|
|||
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
|
||||
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 2017
|
||||
05D0 05D1 05D2 05D3 05D4 05D5 05D6 05D7 05D8 05D9 05DA 05DB 05DC 05DD 05DE 05DF
|
||||
05E0 05E1 05E2 05E3 05E4 05E5 05E6 05E7 05E8 05E9 05EA 0000 0000 0000 0000 0000
|
||||
05E0 05E1 05E2 05E3 05E4 05E5 05E6 05E7 05E8 05E9 05EA 0000 0000 200E 200F 0000
|
||||
</map>
|
||||
</unicode>
|
||||
|
||||
|
|
|
@ -1293,20 +1293,21 @@ class select_create: public select_insert {
|
|||
ORDER *group;
|
||||
const char *db;
|
||||
const char *name;
|
||||
List<create_field> *extra_fields;
|
||||
List<Key> *keys;
|
||||
HA_CREATE_INFO *create_info;
|
||||
Alter_info *alter_info;
|
||||
MYSQL_LOCK *lock;
|
||||
Field **field;
|
||||
public:
|
||||
select_create(const char *db_name, const char *table_name,
|
||||
HA_CREATE_INFO *create_info_par,
|
||||
List<create_field> &fields_par,
|
||||
List<Key> &keys_par,
|
||||
List<Item> &select_fields,enum_duplicates duplic, bool ignore)
|
||||
:select_insert (NULL, &select_fields, duplic, ignore), db(db_name),
|
||||
name(table_name), extra_fields(&fields_par),keys(&keys_par),
|
||||
create_info(create_info_par), lock(0)
|
||||
HA_CREATE_INFO *create_info_arg,
|
||||
Alter_info *alter_info_arg,
|
||||
List<Item> &select_fields,
|
||||
enum_duplicates duplic, bool ignore)
|
||||
:select_insert(NULL, &select_fields, duplic, ignore),
|
||||
db(db_name), name(table_name),
|
||||
create_info(create_info_arg),
|
||||
alter_info(alter_info_arg),
|
||||
lock(0)
|
||||
{}
|
||||
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
|
||||
void store_values(List<Item> &values);
|
||||
|
|
|
@ -1805,7 +1805,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
|||
|
||||
unit= u;
|
||||
table= create_table_from_items(thd, create_info, db, name,
|
||||
extra_fields, keys, &values, &lock);
|
||||
alter_info, &values, &lock);
|
||||
if (!table)
|
||||
DBUG_RETURN(-1); // abort() deletes table
|
||||
|
||||
|
|
|
@ -1015,6 +1015,18 @@ int yylex(void *arg, void *yythd)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
|
||||
:drop_list(rhs.drop_list, mem_root),
|
||||
alter_list(rhs.alter_list, mem_root),
|
||||
key_list(rhs.key_list, mem_root),
|
||||
create_list(rhs.create_list, mem_root),
|
||||
flags(rhs.flags),
|
||||
keys_onoff(rhs.keys_onoff),
|
||||
tablespace_op(rhs.tablespace_op),
|
||||
is_simple(rhs.is_simple)
|
||||
{}
|
||||
|
||||
/*
|
||||
st_select_lex structures initialisations
|
||||
*/
|
||||
|
|
|
@ -571,19 +571,61 @@ typedef class st_select_lex SELECT_LEX;
|
|||
#define ALTER_ORDER 64
|
||||
#define ALTER_OPTIONS 128
|
||||
|
||||
typedef struct st_alter_info
|
||||
/**
|
||||
@brief Parsing data for CREATE or ALTER TABLE.
|
||||
|
||||
This structure contains a list of columns or indexes to be created,
|
||||
altered or dropped.
|
||||
*/
|
||||
|
||||
class Alter_info
|
||||
{
|
||||
public:
|
||||
List<Alter_drop> drop_list;
|
||||
List<Alter_column> alter_list;
|
||||
List<Key> key_list;
|
||||
List<create_field> create_list;
|
||||
uint flags;
|
||||
enum enum_enable_or_disable keys_onoff;
|
||||
enum tablespace_op_type tablespace_op;
|
||||
bool is_simple;
|
||||
|
||||
st_alter_info(){clear();}
|
||||
void clear(){keys_onoff= LEAVE_AS_IS;tablespace_op= NO_TABLESPACE_OP;}
|
||||
void reset(){drop_list.empty();alter_list.empty();clear();}
|
||||
} ALTER_INFO;
|
||||
Alter_info() :
|
||||
flags(0),
|
||||
keys_onoff(LEAVE_AS_IS),
|
||||
tablespace_op(NO_TABLESPACE_OP),
|
||||
is_simple(1)
|
||||
{}
|
||||
void reset()
|
||||
{
|
||||
drop_list.empty();
|
||||
alter_list.empty();
|
||||
key_list.empty();
|
||||
create_list.empty();
|
||||
flags= 0;
|
||||
keys_onoff= LEAVE_AS_IS;
|
||||
tablespace_op= NO_TABLESPACE_OP;
|
||||
is_simple= 1;
|
||||
}
|
||||
/**
|
||||
Construct a copy of this object to be used for mysql_alter_table
|
||||
and mysql_create_table. Historically, these two functions modify
|
||||
their Alter_info arguments. This behaviour breaks re-execution of
|
||||
prepared statements and stored procedures and is compensated by
|
||||
always supplying a copy of Alter_info to these functions.
|
||||
The constructed copy still shares key Key, Alter_drop, create_field
|
||||
and Alter_column elements of the lists - these structures are not
|
||||
modified and thus are not copied.
|
||||
|
||||
@note You need to use check thd->is_fatal_error for out
|
||||
of memory condition after calling this function.
|
||||
*/
|
||||
Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root);
|
||||
private:
|
||||
Alter_info &operator=(const Alter_info &rhs); // not implemented
|
||||
Alter_info(const Alter_info &rhs); // not implemented
|
||||
};
|
||||
|
||||
|
||||
/* The state of the lex parsing. This is saved in the THD struct */
|
||||
|
||||
|
@ -620,8 +662,6 @@ typedef struct st_lex
|
|||
List<String> interval_list;
|
||||
List<LEX_USER> users_list;
|
||||
List<LEX_COLUMN> columns;
|
||||
List<Key> key_list;
|
||||
List<create_field> create_list;
|
||||
List<Item> *insert_list,field_list,value_list,update_list;
|
||||
List<List_item> many_values;
|
||||
List<set_var_base> var_list;
|
||||
|
@ -654,7 +694,7 @@ typedef struct st_lex
|
|||
bool derived_tables;
|
||||
bool safe_to_cache_query;
|
||||
bool subqueries, ignore;
|
||||
ALTER_INFO alter_info;
|
||||
Alter_info alter_info;
|
||||
/* Prepared statements SQL syntax:*/
|
||||
LEX_STRING prepared_stmt_name; /* Statement name (in all queries) */
|
||||
/*
|
||||
|
|
|
@ -66,21 +66,24 @@ public:
|
|||
pointer.
|
||||
*/
|
||||
|
||||
class list_node :public Sql_alloc
|
||||
|
||||
/**
|
||||
list_node - a node of a single-linked list.
|
||||
@note We never call a destructor for instances of this class.
|
||||
*/
|
||||
|
||||
struct list_node :public Sql_alloc
|
||||
{
|
||||
public:
|
||||
list_node *next;
|
||||
void *info;
|
||||
list_node(void *info_par,list_node *next_par)
|
||||
:next(next_par),info(info_par)
|
||||
{}
|
||||
{}
|
||||
list_node() /* For end_of_list */
|
||||
{
|
||||
info=0;
|
||||
next= this;
|
||||
}
|
||||
friend class base_list;
|
||||
friend class base_list_iterator;
|
||||
{
|
||||
info= 0;
|
||||
next= this;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -96,11 +99,56 @@ public:
|
|||
|
||||
inline void empty() { elements=0; first= &end_of_list; last=&first;}
|
||||
inline base_list() { empty(); }
|
||||
/**
|
||||
This is a shallow copy constructor that implicitly passes the ownership
|
||||
from the source list to the new instance. The old instance is not
|
||||
updated, so both objects end up sharing the same nodes. If one of
|
||||
the instances then adds or removes a node, the other becomes out of
|
||||
sync ('last' pointer), while still operational. Some old code uses and
|
||||
relies on this behaviour. This logic is quite tricky: please do not use
|
||||
it in any new code.
|
||||
*/
|
||||
inline base_list(const base_list &tmp) :Sql_alloc()
|
||||
{
|
||||
elements=tmp.elements;
|
||||
first=tmp.first;
|
||||
last=tmp.last;
|
||||
elements= tmp.elements;
|
||||
first= tmp.first;
|
||||
last= elements ? tmp.last : &first;
|
||||
}
|
||||
/**
|
||||
Construct a deep copy of the argument in memory root mem_root.
|
||||
The elements themselves are copied by pointer.
|
||||
*/
|
||||
inline base_list(const base_list &rhs, MEM_ROOT *mem_root)
|
||||
{
|
||||
if (rhs.elements)
|
||||
{
|
||||
/*
|
||||
It's okay to allocate an array of nodes at once: we never
|
||||
call a destructor for list_node objects anyway.
|
||||
*/
|
||||
first= (list_node*) alloc_root(mem_root,
|
||||
sizeof(list_node) * rhs.elements);
|
||||
if (first)
|
||||
{
|
||||
elements= rhs.elements;
|
||||
list_node *dst= first;
|
||||
list_node *src= rhs.first;
|
||||
for (; dst < first + elements - 1; dst++, src= src->next)
|
||||
{
|
||||
dst->info= src->info;
|
||||
dst->next= dst + 1;
|
||||
}
|
||||
/* Copy the last node */
|
||||
dst->info= src->info;
|
||||
dst->next= &end_of_list;
|
||||
/* Setup 'last' member */
|
||||
last= &dst->next;
|
||||
return;
|
||||
}
|
||||
}
|
||||
elements= 0;
|
||||
first= &end_of_list;
|
||||
last= &first;
|
||||
}
|
||||
inline base_list(bool error) { }
|
||||
inline bool push_back(void *info)
|
||||
|
@ -327,6 +375,8 @@ template <class T> class List :public base_list
|
|||
public:
|
||||
inline List() :base_list() {}
|
||||
inline List(const List<T> &tmp) :base_list(tmp) {}
|
||||
inline List(const List<T> &tmp, MEM_ROOT *mem_root) :
|
||||
base_list(tmp, mem_root) {}
|
||||
inline bool push_back(T *a) { return base_list::push_back(a); }
|
||||
inline bool push_front(T *a) { return base_list::push_front(a); }
|
||||
inline T* head() {return (T*) base_list::head(); }
|
||||
|
|
1245
sql/sql_locale.cc
1245
sql/sql_locale.cc
File diff suppressed because it is too large
Load diff
218
sql/sql_parse.cc
218
sql/sql_parse.cc
|
@ -1958,6 +1958,7 @@ static void reset_one_shot_variables(THD *thd)
|
|||
thd->update_charset();
|
||||
thd->variables.time_zone=
|
||||
global_system_variables.time_zone;
|
||||
thd->variables.lc_time_names= &my_locale_en_US;
|
||||
thd->one_shot_set= 0;
|
||||
}
|
||||
|
||||
|
@ -2478,19 +2479,42 @@ mysql_execute_command(THD *thd)
|
|||
}
|
||||
/* Skip first table, which is the table we are creating */
|
||||
TABLE_LIST *create_table, *create_table_local;
|
||||
/*
|
||||
Code below (especially in mysql_create_table() and select_create
|
||||
methods) may modify HA_CREATE_INFO structure in LEX, so we have to
|
||||
use a copy of this structure to make execution prepared statement-
|
||||
safe. A shallow copy is enough as this code won't modify any memory
|
||||
referenced from this structure.
|
||||
*/
|
||||
HA_CREATE_INFO create_info(lex->create_info);
|
||||
Alter_info alter_info(lex->alter_info, thd->mem_root);
|
||||
|
||||
if (thd->is_fatal_error)
|
||||
{
|
||||
/* out of memory when creating a copy of alter_info */
|
||||
res= 1;
|
||||
goto unsent_create_error;
|
||||
}
|
||||
tables= lex->unlink_first_table(tables, &create_table,
|
||||
&create_table_local);
|
||||
|
||||
if ((res= create_table_precheck(thd, tables, create_table)))
|
||||
goto unsent_create_error;
|
||||
|
||||
create_info.alias= create_table->alias;
|
||||
#ifndef HAVE_READLINK
|
||||
lex->create_info.data_file_name=lex->create_info.index_file_name=0;
|
||||
if (create_info.data_file_name)
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
|
||||
"DATA DIRECTORY option ignored");
|
||||
if (create_info.index_file_name)
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
|
||||
"INDEX DIRECTORY option ignored");
|
||||
create_info.data_file_name= create_info.index_file_name= NULL;
|
||||
#else
|
||||
/* Fix names if symlinked tables */
|
||||
if (append_file_to_dir(thd, &lex->create_info.data_file_name,
|
||||
if (append_file_to_dir(thd, &create_info.data_file_name,
|
||||
create_table->real_name) ||
|
||||
append_file_to_dir(thd,&lex->create_info.index_file_name,
|
||||
append_file_to_dir(thd, &create_info.index_file_name,
|
||||
create_table->real_name))
|
||||
{
|
||||
res=-1;
|
||||
|
@ -2501,14 +2525,14 @@ mysql_execute_command(THD *thd)
|
|||
If we are using SET CHARSET without DEFAULT, add an implicite
|
||||
DEFAULT to not confuse old users. (This may change).
|
||||
*/
|
||||
if ((lex->create_info.used_fields &
|
||||
if ((create_info.used_fields &
|
||||
(HA_CREATE_USED_DEFAULT_CHARSET | HA_CREATE_USED_CHARSET)) ==
|
||||
HA_CREATE_USED_CHARSET)
|
||||
{
|
||||
lex->create_info.used_fields&= ~HA_CREATE_USED_CHARSET;
|
||||
lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
||||
lex->create_info.default_table_charset= lex->create_info.table_charset;
|
||||
lex->create_info.table_charset= 0;
|
||||
create_info.used_fields&= ~HA_CREATE_USED_CHARSET;
|
||||
create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
|
||||
create_info.default_table_charset= create_info.table_charset;
|
||||
create_info.table_charset= 0;
|
||||
}
|
||||
/*
|
||||
The create-select command will open and read-lock the select table
|
||||
|
@ -2542,11 +2566,14 @@ mysql_execute_command(THD *thd)
|
|||
if (!(res=open_and_lock_tables(thd,tables)))
|
||||
{
|
||||
res= -1; // If error
|
||||
/*
|
||||
select_create is currently not re-execution friendly and
|
||||
needs to be created for every execution of a PS/SP.
|
||||
*/
|
||||
if ((result=new select_create(create_table->db,
|
||||
create_table->real_name,
|
||||
&lex->create_info,
|
||||
lex->create_list,
|
||||
lex->key_list,
|
||||
&create_info,
|
||||
&alter_info,
|
||||
select_lex->item_list, lex->duplicates,
|
||||
lex->ignore)))
|
||||
{
|
||||
|
@ -2558,22 +2585,18 @@ mysql_execute_command(THD *thd)
|
|||
res=handle_select(thd, lex, result);
|
||||
select_lex->resolve_mode= SELECT_LEX::NOMATTER_MODE;
|
||||
}
|
||||
//reset for PS
|
||||
lex->create_list.empty();
|
||||
lex->key_list.empty();
|
||||
}
|
||||
}
|
||||
else // regular create
|
||||
{
|
||||
if (lex->name)
|
||||
res= mysql_create_like_table(thd, create_table, &lex->create_info,
|
||||
res= mysql_create_like_table(thd, create_table, &create_info,
|
||||
(Table_ident *)lex->name);
|
||||
else
|
||||
{
|
||||
res= mysql_create_table(thd,create_table->db,
|
||||
create_table->real_name, &lex->create_info,
|
||||
lex->create_list,
|
||||
lex->key_list,0,0);
|
||||
res= mysql_create_table(thd, create_table->db,
|
||||
create_table->real_name, &create_info,
|
||||
&alter_info, 0, 0);
|
||||
}
|
||||
if (!res)
|
||||
send_ok(thd);
|
||||
|
@ -2591,15 +2614,49 @@ unsent_create_error:
|
|||
break;
|
||||
}
|
||||
case SQLCOM_CREATE_INDEX:
|
||||
/* Fall through */
|
||||
case SQLCOM_DROP_INDEX:
|
||||
/*
|
||||
CREATE INDEX and DROP INDEX are implemented by calling ALTER
|
||||
TABLE with proper arguments. This isn't very fast but it
|
||||
should work for most cases.
|
||||
|
||||
In the future ALTER TABLE will notice that only added
|
||||
indexes and create these one by one for the existing table
|
||||
without having to do a full rebuild.
|
||||
|
||||
One should normally create all indexes with CREATE TABLE or
|
||||
ALTER TABLE.
|
||||
*/
|
||||
{
|
||||
Alter_info alter_info(lex->alter_info, thd->mem_root);
|
||||
HA_CREATE_INFO create_info;
|
||||
|
||||
if (thd->is_fatal_error) /* out of memory creating a copy of alter_info*/
|
||||
goto error;
|
||||
|
||||
if (check_one_table_access(thd, INDEX_ACL, tables))
|
||||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
if (end_active_trans(thd))
|
||||
res= -1;
|
||||
else
|
||||
res = mysql_create_index(thd, tables, lex->key_list);
|
||||
break;
|
||||
goto error;
|
||||
/*
|
||||
Currently CREATE INDEX or DROP INDEX cause a full table rebuild
|
||||
and thus classify as slow administrative statements just like
|
||||
ALTER TABLE.
|
||||
*/
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
|
||||
bzero((char*) &create_info, sizeof(create_info));
|
||||
create_info.db_type= DB_TYPE_DEFAULT;
|
||||
create_info.row_type= ROW_TYPE_NOT_USED;
|
||||
create_info.default_table_charset= thd->variables.collation_database;
|
||||
|
||||
res= mysql_alter_table(thd, tables->db, tables->real_name,
|
||||
&create_info, tables, &alter_info,
|
||||
0, (ORDER*)0, DUP_ERROR, 0);
|
||||
break;
|
||||
}
|
||||
#ifdef HAVE_REPLICATION
|
||||
case SQLCOM_SLAVE_START:
|
||||
{
|
||||
|
@ -2642,6 +2699,17 @@ unsent_create_error:
|
|||
#else
|
||||
{
|
||||
ulong priv=0;
|
||||
/*
|
||||
Code in mysql_alter_table() may modify its HA_CREATE_INFO argument,
|
||||
so we have to use a copy of this structure to make execution
|
||||
prepared statement- safe. A shallow copy is enough as no memory
|
||||
referenced from this structure will be modified.
|
||||
*/
|
||||
HA_CREATE_INFO create_info(lex->create_info);
|
||||
Alter_info alter_info(lex->alter_info, thd->mem_root);
|
||||
|
||||
if (thd->is_fatal_error) /* out of memory creating a copy of alter_info */
|
||||
goto error;
|
||||
if (lex->name && (!lex->name[0] || strlen(lex->name) > NAME_LEN))
|
||||
{
|
||||
net_printf(thd, ER_WRONG_TABLE_NAME, lex->name);
|
||||
|
@ -2655,7 +2723,7 @@ unsent_create_error:
|
|||
default database if the new name is not explicitly qualified
|
||||
by a database. (Bug #11493)
|
||||
*/
|
||||
if (lex->alter_info.flags & ALTER_RENAME)
|
||||
if (alter_info.flags & ALTER_RENAME)
|
||||
{
|
||||
if (! thd->db)
|
||||
{
|
||||
|
@ -2671,7 +2739,7 @@ unsent_create_error:
|
|||
check_access(thd,INSERT_ACL | CREATE_ACL,select_lex->db,&priv,0,0)||
|
||||
check_merge_table_access(thd, tables->db,
|
||||
(TABLE_LIST *)
|
||||
lex->create_info.merge_list.first))
|
||||
create_info.merge_list.first))
|
||||
goto error; /* purecov: inspected */
|
||||
if (grant_option)
|
||||
{
|
||||
|
@ -2690,26 +2758,26 @@ unsent_create_error:
|
|||
}
|
||||
}
|
||||
/* Don't yet allow changing of symlinks with ALTER TABLE */
|
||||
if (lex->create_info.data_file_name)
|
||||
if (create_info.data_file_name)
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
|
||||
"DATA DIRECTORY option ignored");
|
||||
if (lex->create_info.index_file_name)
|
||||
if (create_info.index_file_name)
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
|
||||
"INDEX DIRECTORY option ignored");
|
||||
lex->create_info.data_file_name=lex->create_info.index_file_name=0;
|
||||
create_info.data_file_name= create_info.index_file_name= NULL;
|
||||
/* ALTER TABLE ends previous transaction */
|
||||
if (end_active_trans(thd))
|
||||
res= -1;
|
||||
else
|
||||
{
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
res= mysql_alter_table(thd, select_lex->db, lex->name,
|
||||
&lex->create_info,
|
||||
tables, lex->create_list,
|
||||
lex->key_list,
|
||||
select_lex->order_list.elements,
|
||||
res= mysql_alter_table(thd, select_lex->db, lex->name,
|
||||
&create_info,
|
||||
tables,
|
||||
&alter_info,
|
||||
select_lex->order_list.elements,
|
||||
(ORDER *) select_lex->order_list.first,
|
||||
lex->duplicates, lex->ignore, &lex->alter_info);
|
||||
lex->duplicates, lex->ignore);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -2846,7 +2914,7 @@ unsent_create_error:
|
|||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
res= (specialflag & (SPECIAL_SAFE_MODE | SPECIAL_NO_NEW_FUNC)) ?
|
||||
mysql_recreate_table(thd, tables, 1) :
|
||||
mysql_recreate_table(thd, tables) :
|
||||
mysql_optimize_table(thd, tables, &lex->check_opt);
|
||||
/* ! we write after unlocking the table */
|
||||
if (!res && !lex->no_write_to_binlog)
|
||||
|
@ -3123,14 +3191,6 @@ unsent_create_error:
|
|||
res= mysql_rm_table(thd,tables,lex->drop_if_exists, lex->drop_temporary);
|
||||
}
|
||||
break;
|
||||
case SQLCOM_DROP_INDEX:
|
||||
if (check_one_table_access(thd, INDEX_ACL, tables))
|
||||
goto error; /* purecov: inspected */
|
||||
if (end_active_trans(thd))
|
||||
res= -1;
|
||||
else
|
||||
res = mysql_drop_index(thd, tables, &lex->alter_info);
|
||||
break;
|
||||
case SQLCOM_SHOW_DATABASES:
|
||||
#if defined(DONT_ALLOW_SHOW_COMMANDS)
|
||||
send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */
|
||||
|
@ -3363,6 +3423,12 @@ purposes internal to the MySQL server", MYF(0));
|
|||
break;
|
||||
case SQLCOM_CREATE_DB:
|
||||
{
|
||||
/*
|
||||
As mysql_create_db() may modify HA_CREATE_INFO structure passed to
|
||||
it, we need to use a copy of LEX::create_info to make execution
|
||||
prepared statement- safe.
|
||||
*/
|
||||
HA_CREATE_INFO create_info(lex->create_info);
|
||||
if (end_active_trans(thd))
|
||||
{
|
||||
res= -1;
|
||||
|
@ -3393,7 +3459,7 @@ purposes internal to the MySQL server", MYF(0));
|
|||
if (check_access(thd,CREATE_ACL,lex->name,0,1,0))
|
||||
break;
|
||||
res= mysql_create_db(thd,(lower_case_table_names == 2 ? alias : lex->name),
|
||||
&lex->create_info, 0);
|
||||
&create_info, 0);
|
||||
break;
|
||||
}
|
||||
case SQLCOM_DROP_DB:
|
||||
|
@ -4443,15 +4509,17 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
|
|||
if (type_modifier & PRI_KEY_FLAG)
|
||||
{
|
||||
lex->col_list.push_back(new key_part_spec(field_name,0));
|
||||
lex->key_list.push_back(new Key(Key::PRIMARY, NullS, HA_KEY_ALG_UNDEF,
|
||||
0, lex->col_list));
|
||||
lex->alter_info.key_list.push_back(new Key(Key::PRIMARY, NullS,
|
||||
HA_KEY_ALG_UNDEF, 0,
|
||||
lex->col_list));
|
||||
lex->col_list.empty();
|
||||
}
|
||||
if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG))
|
||||
{
|
||||
lex->col_list.push_back(new key_part_spec(field_name,0));
|
||||
lex->key_list.push_back(new Key(Key::UNIQUE, NullS, HA_KEY_ALG_UNDEF, 0,
|
||||
lex->col_list));
|
||||
lex->alter_info.key_list.push_back(new Key(Key::UNIQUE, NullS,
|
||||
HA_KEY_ALG_UNDEF, 0,
|
||||
lex->col_list));
|
||||
lex->col_list.empty();
|
||||
}
|
||||
|
||||
|
@ -4778,7 +4846,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
|
|||
new_field->sql_type,
|
||||
new_field->length);
|
||||
new_field->char_length= new_field->length;
|
||||
lex->create_list.push_back(new_field);
|
||||
lex->alter_info.create_list.push_back(new_field);
|
||||
lex->last_field=new_field;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
@ -5458,57 +5526,6 @@ Item * all_any_subquery_creator(Item *left_expr,
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
CREATE INDEX and DROP INDEX are implemented by calling ALTER TABLE with
|
||||
the proper arguments. This isn't very fast but it should work for most
|
||||
cases.
|
||||
|
||||
In the future ALTER TABLE will notice that only added indexes
|
||||
and create these one by one for the existing table without having to do
|
||||
a full rebuild.
|
||||
|
||||
One should normally create all indexes with CREATE TABLE or ALTER TABLE.
|
||||
*/
|
||||
|
||||
int mysql_create_index(THD *thd, TABLE_LIST *table_list, List<Key> &keys)
|
||||
{
|
||||
List<create_field> fields;
|
||||
ALTER_INFO alter_info;
|
||||
alter_info.flags= ALTER_ADD_INDEX;
|
||||
alter_info.is_simple= 0;
|
||||
HA_CREATE_INFO create_info;
|
||||
DBUG_ENTER("mysql_create_index");
|
||||
bzero((char*) &create_info,sizeof(create_info));
|
||||
create_info.db_type=DB_TYPE_DEFAULT;
|
||||
create_info.default_table_charset= thd->variables.collation_database;
|
||||
create_info.row_type= ROW_TYPE_NOT_USED;
|
||||
DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name,
|
||||
&create_info, table_list,
|
||||
fields, keys, 0, (ORDER*)0,
|
||||
DUP_ERROR, 0, &alter_info));
|
||||
}
|
||||
|
||||
|
||||
int mysql_drop_index(THD *thd, TABLE_LIST *table_list, ALTER_INFO *alter_info)
|
||||
{
|
||||
List<create_field> fields;
|
||||
List<Key> keys;
|
||||
HA_CREATE_INFO create_info;
|
||||
DBUG_ENTER("mysql_drop_index");
|
||||
bzero((char*) &create_info,sizeof(create_info));
|
||||
create_info.db_type=DB_TYPE_DEFAULT;
|
||||
create_info.default_table_charset= thd->variables.collation_database;
|
||||
create_info.row_type= ROW_TYPE_NOT_USED;
|
||||
alter_info->clear();
|
||||
alter_info->flags= ALTER_DROP_INDEX;
|
||||
alter_info->is_simple= 0;
|
||||
DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name,
|
||||
&create_info, table_list,
|
||||
fields, keys, 0, (ORDER*)0,
|
||||
DUP_ERROR, 0, alter_info));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Multi update query pre-check
|
||||
|
||||
|
@ -5791,7 +5808,6 @@ int create_table_precheck(THD *thd, TABLE_LIST *tables,
|
|||
|
||||
want_priv= ((lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) ?
|
||||
CREATE_TMP_ACL : CREATE_ACL);
|
||||
lex->create_info.alias= create_table->alias;
|
||||
if (check_access(thd, want_priv, create_table->db,
|
||||
&create_table->grant.privilege, 0, 0) ||
|
||||
check_merge_table_access(thd, create_table->db,
|
||||
|
|
|
@ -714,16 +714,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
|
|||
if (verbose)
|
||||
protocol->store(field->has_charset() ? field->charset()->name : "NULL",
|
||||
system_charset_info);
|
||||
/*
|
||||
Even if TIMESTAMP field can't contain NULL as its value it
|
||||
will accept NULL if you will try to insert such value and will
|
||||
convert NULL value to current TIMESTAMP. So YES here means
|
||||
that NULL is allowed for assignment (but may be won't be
|
||||
returned).
|
||||
*/
|
||||
pos=(byte*) ((flags & NOT_NULL_FLAG) &&
|
||||
field->type() != FIELD_TYPE_TIMESTAMP ?
|
||||
"" : "YES");
|
||||
pos= (byte*) ((flags & NOT_NULL_FLAG) ? "" : "YES");
|
||||
protocol->store((const char*) pos, system_charset_info);
|
||||
pos=(byte*) ((field->flags & PRI_KEY_FLAG) ? "PRI" :
|
||||
(field->flags & UNIQUE_KEY_FLAG) ? "UNI" :
|
||||
|
@ -845,7 +836,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
|
|||
}
|
||||
|
||||
int mysqld_show_create_db(THD *thd, char *dbname,
|
||||
HA_CREATE_INFO *create_info)
|
||||
const HA_CREATE_INFO *create_info)
|
||||
{
|
||||
int length;
|
||||
char path[FN_REFLEN];
|
||||
|
|
375
sql/sql_table.cc
375
sql/sql_table.cc
|
@ -456,8 +456,7 @@ void calculate_interval_lengths(CHARSET_INFO *cs, TYPELIB *interval,
|
|||
mysql_prepare_table()
|
||||
thd Thread object
|
||||
create_info Create information (like MAX_ROWS)
|
||||
fields List of fields to create
|
||||
keys List of keys to create
|
||||
alter_info List of columns and indexes to create
|
||||
|
||||
DESCRIPTION
|
||||
Prepares the table and key structures for table creation.
|
||||
|
@ -468,8 +467,8 @@ void calculate_interval_lengths(CHARSET_INFO *cs, TYPELIB *interval,
|
|||
*/
|
||||
|
||||
int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
||||
List<create_field> &fields,
|
||||
List<Key> &keys, bool tmp_table, uint &db_options,
|
||||
Alter_info *alter_info,
|
||||
bool tmp_table, uint &db_options,
|
||||
handler *file, KEY *&key_info_buffer,
|
||||
uint *key_count, int select_field_count)
|
||||
{
|
||||
|
@ -482,10 +481,11 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
int timestamps= 0, timestamps_with_niladic= 0;
|
||||
int field_no,dup_no;
|
||||
int select_field_pos,auto_increment=0;
|
||||
List_iterator<create_field> it(alter_info->create_list);
|
||||
List_iterator<create_field> it2(alter_info->create_list);
|
||||
DBUG_ENTER("mysql_prepare_table");
|
||||
|
||||
List_iterator<create_field> it(fields),it2(fields);
|
||||
select_field_pos=fields.elements - select_field_count;
|
||||
select_field_pos= alter_info->create_list.elements - select_field_count;
|
||||
null_fields=blob_columns=0;
|
||||
|
||||
for (field_no=0; (sql_field=it++) ; field_no++)
|
||||
|
@ -883,7 +883,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
|
||||
/* Create keys */
|
||||
|
||||
List_iterator<Key> key_iterator(keys), key_iterator2(keys);
|
||||
List_iterator<Key> key_iterator(alter_info->key_list);
|
||||
List_iterator<Key> key_iterator2(alter_info->key_list);
|
||||
uint key_parts=0, fk_key_count=0;
|
||||
bool primary_key=0,unique_key=0;
|
||||
Key *key, *key2;
|
||||
|
@ -1333,23 +1334,27 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
|
||||
SYNOPSIS
|
||||
mysql_create_table()
|
||||
thd Thread object
|
||||
db Database
|
||||
table_name Table name
|
||||
create_info Create information (like MAX_ROWS)
|
||||
fields List of fields to create
|
||||
keys List of keys to create
|
||||
tmp_table Set to 1 if this is an internal temporary table
|
||||
(From ALTER TABLE)
|
||||
thd Thread object
|
||||
db Database
|
||||
table_name Table name
|
||||
create_info [in/out] Create information (like MAX_ROWS)
|
||||
alter_info [in/out] List of columns and indexes to create
|
||||
tmp_table Set to 1 if this is an internal temporary table
|
||||
(From ALTER TABLE)
|
||||
|
||||
DESCRIPTION
|
||||
If one creates a temporary table, this is automaticly opened
|
||||
If one creates a temporary table, this is automatically opened
|
||||
|
||||
no_log is needed for the case of CREATE ... SELECT,
|
||||
as the logging will be done later in sql_insert.cc
|
||||
select_field_count is also used for CREATE ... SELECT,
|
||||
and must be zero for standard create of table.
|
||||
|
||||
Note that structures passed as 'create_info' and 'alter_info' parameters
|
||||
may be modified by this function. It is responsibility of the caller to
|
||||
make a copy of create_info in order to provide correct execution in
|
||||
prepared statements/stored routines.
|
||||
|
||||
RETURN VALUES
|
||||
0 ok
|
||||
-1 error
|
||||
|
@ -1357,8 +1362,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||
|
||||
int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
HA_CREATE_INFO *create_info,
|
||||
List<create_field> &fields,
|
||||
List<Key> &keys,bool tmp_table,
|
||||
Alter_info *alter_info,
|
||||
bool tmp_table,
|
||||
uint select_field_count)
|
||||
{
|
||||
char path[FN_REFLEN];
|
||||
|
@ -1371,7 +1376,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
|||
DBUG_ENTER("mysql_create_table");
|
||||
|
||||
/* Check for duplicate fields and check type of table to create */
|
||||
if (!fields.elements)
|
||||
if (!alter_info->create_list.elements)
|
||||
{
|
||||
my_error(ER_TABLE_MUST_HAVE_COLUMNS,MYF(0));
|
||||
DBUG_RETURN(-1);
|
||||
|
@ -1423,10 +1428,10 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
|||
create_info->default_table_charset= db_info.default_table_charset;
|
||||
}
|
||||
|
||||
if (mysql_prepare_table(thd, create_info, fields,
|
||||
keys, tmp_table, db_options, file,
|
||||
key_info_buffer, &key_count,
|
||||
select_field_count))
|
||||
if (mysql_prepare_table(thd, create_info, alter_info, tmp_table,
|
||||
db_options, file,
|
||||
key_info_buffer, &key_count,
|
||||
select_field_count))
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
/* Check if table exists */
|
||||
|
@ -1503,8 +1508,8 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
|||
create_info->table_options=db_options;
|
||||
|
||||
if (rea_create_table(thd, path, db, table_name,
|
||||
create_info, fields, key_count,
|
||||
key_info_buffer))
|
||||
create_info, alter_info->create_list,
|
||||
key_count, key_info_buffer))
|
||||
goto end;
|
||||
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
|
||||
{
|
||||
|
@ -1592,8 +1597,7 @@ make_unique_key_name(const char *field_name,KEY *start,KEY *end)
|
|||
|
||||
TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
||||
const char *db, const char *name,
|
||||
List<create_field> *extra_fields,
|
||||
List<Key> *keys,
|
||||
Alter_info *alter_info,
|
||||
List<Item> *items,
|
||||
MYSQL_LOCK **lock)
|
||||
{
|
||||
|
@ -1627,7 +1631,7 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
|||
((Item_field *)item)->field :
|
||||
(Field*) 0))))
|
||||
DBUG_RETURN(0);
|
||||
extra_fields->push_back(cr_field);
|
||||
alter_info->create_list.push_back(cr_field);
|
||||
}
|
||||
/* create and lock table */
|
||||
/* QQ: create and open should be done atomic ! */
|
||||
|
@ -1641,8 +1645,8 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
|||
open_table().
|
||||
*/
|
||||
tmp_disable_binlog(thd);
|
||||
if (!mysql_create_table(thd,db,name,create_info,*extra_fields,
|
||||
*keys,0,select_field_count))
|
||||
if (!mysql_create_table(thd, db, name, create_info, alter_info,
|
||||
0, select_field_count))
|
||||
{
|
||||
if (!(table=open_table(thd,db,name,name,(bool*) 0)))
|
||||
quick_rm_table(create_info->db_type,db,table_case_name(create_info,name));
|
||||
|
@ -2146,6 +2150,7 @@ send_result_message:
|
|||
|
||||
case HA_ADMIN_TRY_ALTER:
|
||||
{
|
||||
my_bool save_no_send_ok= thd->net.no_send_ok;
|
||||
/*
|
||||
This is currently used only by InnoDB. ha_innobase::optimize() answers
|
||||
"try with alter", so here we close the table, do an ALTER TABLE,
|
||||
|
@ -2155,7 +2160,9 @@ send_result_message:
|
|||
TABLE_LIST *save_next= table->next;
|
||||
table->next= 0;
|
||||
tmp_disable_binlog(thd); // binlogging is done by caller if wanted
|
||||
result_code= mysql_recreate_table(thd, table, 0);
|
||||
thd->net.no_send_ok= TRUE;
|
||||
result_code= mysql_recreate_table(thd, table);
|
||||
thd->net.no_send_ok= save_no_send_ok;
|
||||
reenable_binlog(thd);
|
||||
close_thread_tables(thd);
|
||||
if (!result_code) // recreation went ok
|
||||
|
@ -2635,206 +2642,6 @@ err:
|
|||
}
|
||||
|
||||
|
||||
#ifdef NOT_USED
|
||||
/*
|
||||
CREATE INDEX and DROP INDEX are implemented by calling ALTER TABLE with
|
||||
the proper arguments. This isn't very fast but it should work for most
|
||||
cases.
|
||||
One should normally create all indexes with CREATE TABLE or ALTER TABLE.
|
||||
*/
|
||||
|
||||
int mysql_create_indexes(THD *thd, TABLE_LIST *table_list, List<Key> &keys)
|
||||
{
|
||||
List<create_field> fields;
|
||||
List<Alter_drop> drop;
|
||||
List<Alter_column> alter;
|
||||
HA_CREATE_INFO create_info;
|
||||
int rc;
|
||||
uint idx;
|
||||
uint db_options;
|
||||
uint key_count;
|
||||
TABLE *table;
|
||||
Field **f_ptr;
|
||||
KEY *key_info_buffer;
|
||||
char path[FN_REFLEN+1];
|
||||
DBUG_ENTER("mysql_create_index");
|
||||
|
||||
/*
|
||||
Try to use online generation of index.
|
||||
This requires that all indexes can be created online.
|
||||
Otherwise, the old alter table procedure is executed.
|
||||
|
||||
Open the table to have access to the correct table handler.
|
||||
*/
|
||||
if (!(table=open_ltable(thd,table_list,TL_WRITE_ALLOW_READ)))
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
/*
|
||||
The add_index method takes an array of KEY structs for the new indexes.
|
||||
Preparing a new table structure generates this array.
|
||||
It needs a list with all fields of the table, which does not need to
|
||||
be correct in every respect. The field names are important.
|
||||
*/
|
||||
for (f_ptr= table->field; *f_ptr; f_ptr++)
|
||||
{
|
||||
create_field *c_fld= new create_field(*f_ptr, *f_ptr);
|
||||
c_fld->unireg_check= Field::NONE; /*avoid multiple auto_increments*/
|
||||
fields.push_back(c_fld);
|
||||
}
|
||||
bzero((char*) &create_info,sizeof(create_info));
|
||||
create_info.db_type=DB_TYPE_DEFAULT;
|
||||
create_info.default_table_charset= thd->variables.collation_database;
|
||||
db_options= 0;
|
||||
if (mysql_prepare_table(thd, &create_info, fields,
|
||||
keys, /*tmp_table*/ 0, db_options, table->file,
|
||||
key_info_buffer, key_count,
|
||||
/*select_field_count*/ 0))
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
/*
|
||||
Check if all keys can be generated with the add_index method.
|
||||
If anyone cannot, then take the old way.
|
||||
*/
|
||||
for (idx=0; idx< key_count; idx++)
|
||||
{
|
||||
DBUG_PRINT("info", ("creating index %s", key_info_buffer[idx].name));
|
||||
if (!(table->file->index_ddl_flags(key_info_buffer+idx)&
|
||||
(HA_DDL_ONLINE| HA_DDL_WITH_LOCK)))
|
||||
break ;
|
||||
}
|
||||
if ((idx < key_count)|| !key_count)
|
||||
{
|
||||
/* Re-initialize the create_info, which was changed by prepare table. */
|
||||
bzero((char*) &create_info,sizeof(create_info));
|
||||
create_info.db_type=DB_TYPE_DEFAULT;
|
||||
create_info.default_table_charset= thd->variables.collation_database;
|
||||
/* Cleanup the fields list. We do not want to create existing fields. */
|
||||
fields.delete_elements();
|
||||
if (real_alter_table(thd, table_list->db, table_list->real_name,
|
||||
&create_info, table_list, table,
|
||||
fields, keys, drop, alter, 0, (ORDER*)0,
|
||||
ALTER_ADD_INDEX, DUP_ERROR))
|
||||
/* Don't need to free((gptr) key_info_buffer);*/
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (table->file->add_index(table, key_info_buffer, key_count)||
|
||||
build_table_path(path, sizeof(path), table_list->db,
|
||||
(lower_case_table_names == 2) ?
|
||||
table_list->alias : table_list->real_name,
|
||||
reg_ext) == 0 ||
|
||||
mysql_create_frm(thd, path, &create_info,
|
||||
fields, key_count, key_info_buffer, table->file))
|
||||
/* don't need to free((gptr) key_info_buffer);*/
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
/* don't need to free((gptr) key_info_buffer);*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
int mysql_drop_indexes(THD *thd, TABLE_LIST *table_list,
|
||||
List<Alter_drop> &drop)
|
||||
{
|
||||
List<create_field> fields;
|
||||
List<Key> keys;
|
||||
List<Alter_column> alter;
|
||||
HA_CREATE_INFO create_info;
|
||||
uint idx;
|
||||
uint db_options;
|
||||
uint key_count;
|
||||
uint *key_numbers;
|
||||
TABLE *table;
|
||||
Field **f_ptr;
|
||||
KEY *key_info;
|
||||
KEY *key_info_buffer;
|
||||
char path[FN_REFLEN];
|
||||
DBUG_ENTER("mysql_drop_index");
|
||||
|
||||
/*
|
||||
Try to use online generation of index.
|
||||
This requires that all indexes can be created online.
|
||||
Otherwise, the old alter table procedure is executed.
|
||||
|
||||
Open the table to have access to the correct table handler.
|
||||
*/
|
||||
if (!(table=open_ltable(thd,table_list,TL_WRITE_ALLOW_READ)))
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
/*
|
||||
The drop_index method takes an array of key numbers.
|
||||
It cannot get more entries than keys in the table.
|
||||
*/
|
||||
key_numbers= (uint*) thd->alloc(sizeof(uint*)*table->keys);
|
||||
key_count= 0;
|
||||
|
||||
/*
|
||||
Get the number of each key and check if it can be created online.
|
||||
*/
|
||||
List_iterator<Alter_drop> drop_it(drop);
|
||||
Alter_drop *drop_key;
|
||||
while ((drop_key= drop_it++))
|
||||
{
|
||||
/* Find the key in the table. */
|
||||
key_info=table->key_info;
|
||||
for (idx=0; idx< table->keys; idx++, key_info++)
|
||||
{
|
||||
if (!my_strcasecmp(system_charset_info, key_info->name, drop_key->name))
|
||||
break;
|
||||
}
|
||||
if (idx>= table->keys)
|
||||
{
|
||||
my_error(ER_CANT_DROP_FIELD_OR_KEY, MYF(0), drop_key->name);
|
||||
/*don't need to free((gptr) key_numbers);*/
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
/*
|
||||
Check if the key can be generated with the add_index method.
|
||||
If anyone cannot, then take the old way.
|
||||
*/
|
||||
DBUG_PRINT("info", ("dropping index %s", table->key_info[idx].name));
|
||||
if (!(table->file->index_ddl_flags(table->key_info+idx)&
|
||||
(HA_DDL_ONLINE| HA_DDL_WITH_LOCK)))
|
||||
break ;
|
||||
key_numbers[key_count++]= idx;
|
||||
}
|
||||
|
||||
bzero((char*) &create_info,sizeof(create_info));
|
||||
create_info.db_type=DB_TYPE_DEFAULT;
|
||||
create_info.default_table_charset= thd->variables.collation_database;
|
||||
|
||||
if ((drop_key)|| (drop.elements<= 0))
|
||||
{
|
||||
if (real_alter_table(thd, table_list->db, table_list->real_name,
|
||||
&create_info, table_list, table,
|
||||
fields, keys, drop, alter, 0, (ORDER*)0,
|
||||
ALTER_DROP_INDEX, DUP_ERROR))
|
||||
/*don't need to free((gptr) key_numbers);*/
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
db_options= 0;
|
||||
if (table->file->drop_index(table, key_numbers, key_count)||
|
||||
mysql_prepare_table(thd, &create_info, fields,
|
||||
keys, /*tmp_table*/ 0, db_options, table->file,
|
||||
key_info_buffer, key_count,
|
||||
/*select_field_count*/ 0)||
|
||||
build_table_path(path, sizeof(path), table_list->db,
|
||||
(lower_case_table_names == 2) ?
|
||||
table_list->alias : table_list->real_name,
|
||||
reg_ext) == 0 ||
|
||||
mysql_create_frm(thd, path, &create_info,
|
||||
fields, key_count, key_info_buffer, table->file))
|
||||
/*don't need to free((gptr) key_numbers);*/
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
/*don't need to free((gptr) key_numbers);*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
#endif /* NOT_USED */
|
||||
|
||||
|
||||
/*
|
||||
|
@ -2887,15 +2694,21 @@ bool alter_table_manage_keys(TABLE *table, int indexes_were_disabled,
|
|||
|
||||
/*
|
||||
Alter table
|
||||
|
||||
|
||||
NOTE
|
||||
The structures passed as 'create_info' and 'alter_info' parameters may
|
||||
be modified by this function. It is responsibility of the caller to make
|
||||
a copy of create_info in order to provide correct execution in prepared
|
||||
statements/stored routines.
|
||||
*/
|
||||
|
||||
int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
HA_CREATE_INFO *create_info,
|
||||
TABLE_LIST *table_list,
|
||||
List<create_field> &fields, List<Key> &keys,
|
||||
Alter_info *alter_info,
|
||||
uint order_num, ORDER *order,
|
||||
enum enum_duplicates handle_duplicates, bool ignore,
|
||||
ALTER_INFO *alter_info, bool do_send_ok)
|
||||
enum enum_duplicates handle_duplicates, bool ignore)
|
||||
{
|
||||
TABLE *table,*new_table;
|
||||
int error;
|
||||
|
@ -3064,8 +2877,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
||||
mysql_bin_log.write(&qinfo);
|
||||
}
|
||||
if (do_send_ok)
|
||||
send_ok(thd);
|
||||
send_ok(thd);
|
||||
}
|
||||
else if (error > 0)
|
||||
{
|
||||
|
@ -3091,10 +2903,9 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
|
||||
restore_record(table,default_values); // Empty record for DEFAULT
|
||||
List_iterator<Alter_drop> drop_it(alter_info->drop_list);
|
||||
List_iterator<create_field> def_it(fields);
|
||||
List_iterator<create_field> def_it(alter_info->create_list);
|
||||
List_iterator<Alter_column> alter_it(alter_info->alter_list);
|
||||
List<create_field> create_list; // Add new fields here
|
||||
List<Key> key_list; // Add new keys here
|
||||
Alter_info new_info; // Add new columns and indexes here
|
||||
create_field *def;
|
||||
|
||||
/*
|
||||
|
@ -3140,13 +2951,13 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
def->field=field;
|
||||
if (!def->after)
|
||||
{
|
||||
create_list.push_back(def);
|
||||
new_info.create_list.push_back(def);
|
||||
def_it.remove();
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // Use old field value
|
||||
create_list.push_back(def=new create_field(field,field));
|
||||
new_info.create_list.push_back(def= new create_field(field, field));
|
||||
alter_it.rewind(); // Change default if ALTER
|
||||
Alter_column *alter;
|
||||
while ((alter=alter_it++))
|
||||
|
@ -3167,7 +2978,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
}
|
||||
}
|
||||
def_it.rewind();
|
||||
List_iterator<create_field> find_it(create_list);
|
||||
List_iterator<create_field> find_it(new_info.create_list);
|
||||
while ((def=def_it++)) // Add new columns
|
||||
{
|
||||
if (def->change && ! def->field)
|
||||
|
@ -3176,9 +2987,9 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
DBUG_RETURN(-1);
|
||||
}
|
||||
if (!def->after)
|
||||
create_list.push_back(def);
|
||||
new_info.create_list.push_back(def);
|
||||
else if (def->after == first_keyword)
|
||||
create_list.push_front(def);
|
||||
new_info.create_list.push_front(def);
|
||||
else
|
||||
{
|
||||
create_field *find;
|
||||
|
@ -3202,7 +3013,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
table_name);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
if (!create_list.elements)
|
||||
if (!new_info.create_list.elements)
|
||||
{
|
||||
my_error(ER_CANT_REMOVE_ALL_FIELDS,MYF(0));
|
||||
DBUG_RETURN(-1);
|
||||
|
@ -3213,8 +3024,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
for which some fields exists.
|
||||
*/
|
||||
|
||||
List_iterator<Key> key_it(keys);
|
||||
List_iterator<create_field> field_it(create_list);
|
||||
List_iterator<Key> key_it(alter_info->key_list);
|
||||
List_iterator<create_field> field_it(new_info.create_list);
|
||||
List<key_part_spec> key_parts;
|
||||
|
||||
KEY *key_info=table->key_info;
|
||||
|
@ -3272,24 +3083,37 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
key_part_length));
|
||||
}
|
||||
if (key_parts.elements)
|
||||
key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL :
|
||||
(key_info->flags & HA_NOSAME ?
|
||||
(!my_strcasecmp(system_charset_info,
|
||||
key_name, primary_key_name) ?
|
||||
Key::PRIMARY : Key::UNIQUE) :
|
||||
(key_info->flags & HA_FULLTEXT ?
|
||||
Key::FULLTEXT : Key::MULTIPLE)),
|
||||
key_name,
|
||||
key_info->algorithm,
|
||||
test(key_info->flags & HA_GENERATED_KEY),
|
||||
key_parts));
|
||||
{
|
||||
Key *key;
|
||||
enum Key::Keytype key_type;
|
||||
|
||||
if (key_info->flags & HA_SPATIAL)
|
||||
key_type= Key::SPATIAL;
|
||||
else if (key_info->flags & HA_NOSAME)
|
||||
{
|
||||
if (! my_strcasecmp(system_charset_info, key_name, primary_key_name))
|
||||
key_type= Key::PRIMARY;
|
||||
else
|
||||
key_type= Key::UNIQUE;
|
||||
}
|
||||
else if (key_info->flags & HA_FULLTEXT)
|
||||
key_type= Key::FULLTEXT;
|
||||
else
|
||||
key_type= Key::MULTIPLE;
|
||||
|
||||
key= new Key(key_type, key_name,
|
||||
key_info->algorithm,
|
||||
test(key_info->flags & HA_GENERATED_KEY),
|
||||
key_parts);
|
||||
new_info.key_list.push_back(key);
|
||||
}
|
||||
}
|
||||
{
|
||||
Key *key;
|
||||
while ((key=key_it++)) // Add new keys
|
||||
{
|
||||
if (key->type != Key::FOREIGN_KEY)
|
||||
key_list.push_back(key);
|
||||
new_info.key_list.push_back(key);
|
||||
if (key->name &&
|
||||
!my_strcasecmp(system_charset_info,key->name,primary_key_name))
|
||||
{
|
||||
|
@ -3393,7 +3217,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
/* We don't log the statement, it will be logged later. */
|
||||
tmp_disable_binlog(thd);
|
||||
error= mysql_create_table(thd, new_db, tmp_name,
|
||||
create_info,create_list,key_list,1,0);
|
||||
create_info, &new_info, 1, 0);
|
||||
reenable_binlog(thd);
|
||||
if (error)
|
||||
DBUG_RETURN(error);
|
||||
|
@ -3422,10 +3246,10 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
next_insert_id=thd->next_insert_id; // Remember for loggin
|
||||
copied=deleted=0;
|
||||
if (!new_table->is_view)
|
||||
error=copy_data_between_tables(table,new_table,create_list,
|
||||
handle_duplicates, ignore,
|
||||
order_num, order, &copied, &deleted,
|
||||
alter_info->keys_onoff);
|
||||
error= copy_data_between_tables(table, new_table, new_info.create_list,
|
||||
handle_duplicates, ignore,
|
||||
order_num, order, &copied, &deleted,
|
||||
alter_info->keys_onoff);
|
||||
/*
|
||||
No need to have call to alter_table_manage_keys() in the else because
|
||||
in 4.1 we always copy data, except for views. In 5.0 it could happen
|
||||
|
@ -3637,8 +3461,7 @@ end_temporary:
|
|||
my_snprintf(tmp_name, sizeof(tmp_name), ER(ER_INSERT_INFO),
|
||||
(ulong) (copied + deleted), (ulong) deleted,
|
||||
(ulong) thd->cuted_fields);
|
||||
if (do_send_ok)
|
||||
send_ok(thd,copied+deleted,0L,tmp_name);
|
||||
send_ok(thd, copied + deleted, 0L, tmp_name);
|
||||
thd->some_tables_deleted=0;
|
||||
DBUG_RETURN(0);
|
||||
|
||||
|
@ -3828,30 +3651,26 @@ copy_data_between_tables(TABLE *from,TABLE *to,
|
|||
mysql_recreate_table()
|
||||
thd Thread handler
|
||||
tables Tables to recreate
|
||||
do_send_ok If we should send_ok() or leave it to caller
|
||||
|
||||
RETURN
|
||||
Like mysql_alter_table().
|
||||
*/
|
||||
int mysql_recreate_table(THD *thd, TABLE_LIST *table_list,
|
||||
bool do_send_ok)
|
||||
int mysql_recreate_table(THD *thd, TABLE_LIST *table_list)
|
||||
{
|
||||
DBUG_ENTER("mysql_recreate_table");
|
||||
LEX *lex= thd->lex;
|
||||
HA_CREATE_INFO create_info;
|
||||
lex->create_list.empty();
|
||||
lex->key_list.empty();
|
||||
lex->col_list.empty();
|
||||
lex->alter_info.reset();
|
||||
lex->alter_info.is_simple= 0; // Force full recreate
|
||||
Alter_info alter_info;
|
||||
|
||||
DBUG_ENTER("mysql_recreate_table");
|
||||
|
||||
bzero((char*) &create_info,sizeof(create_info));
|
||||
create_info.db_type=DB_TYPE_DEFAULT;
|
||||
create_info.row_type=ROW_TYPE_DEFAULT;
|
||||
create_info.default_table_charset=default_charset_info;
|
||||
alter_info.is_simple= 0; // Force full recreate
|
||||
DBUG_RETURN(mysql_alter_table(thd, NullS, NullS, &create_info,
|
||||
table_list, lex->create_list,
|
||||
lex->key_list, 0, (ORDER *) 0,
|
||||
DUP_ERROR, 0, &lex->alter_info, do_send_ok));
|
||||
table_list, &alter_info,
|
||||
0, (ORDER *) 0, DUP_ERROR, 0));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1021,8 +1021,7 @@ create:
|
|||
TL_READ_NO_INSERT:
|
||||
TL_READ)))
|
||||
YYABORT;
|
||||
lex->create_list.empty();
|
||||
lex->key_list.empty();
|
||||
lex->alter_info.reset();
|
||||
lex->col_list.empty();
|
||||
lex->change=NullS;
|
||||
bzero((char*) &lex->create_info,sizeof(lex->create_info));
|
||||
|
@ -1040,16 +1039,18 @@ create:
|
|||
if (!lex->current_select->add_table_to_list(lex->thd, $7, NULL,
|
||||
TL_OPTION_UPDATING))
|
||||
YYABORT;
|
||||
lex->create_list.empty();
|
||||
lex->key_list.empty();
|
||||
lex->alter_info.reset();
|
||||
lex->alter_info.is_simple= 0;
|
||||
lex->alter_info.flags= ALTER_ADD_INDEX;
|
||||
lex->col_list.empty();
|
||||
lex->change=NullS;
|
||||
}
|
||||
'(' key_list ')'
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
Key *key= new Key($2, $4.str, $5, 0, lex->col_list);
|
||||
|
||||
lex->key_list.push_back(new Key($2,$4.str, $5, 0, lex->col_list));
|
||||
lex->alter_info.key_list.push_back(key);
|
||||
lex->col_list.empty();
|
||||
}
|
||||
| CREATE DATABASE opt_if_not_exists ident
|
||||
|
@ -1305,29 +1306,34 @@ key_def:
|
|||
key_type opt_ident key_alg '(' key_list ')'
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
lex->key_list.push_back(new Key($1,$2, $3, 0, lex->col_list));
|
||||
Key *key= new Key($1, $2, $3, 0, lex->col_list);
|
||||
lex->alter_info.key_list.push_back(key);
|
||||
|
||||
lex->col_list.empty(); /* Alloced by sql_alloc */
|
||||
}
|
||||
| opt_constraint constraint_key_type opt_ident key_alg '(' key_list ')'
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
const char *key_name= $3 ? $3:$1;
|
||||
lex->key_list.push_back(new Key($2, key_name, $4, 0,
|
||||
lex->col_list));
|
||||
Key *key= new Key($2, key_name, $4, 0, lex->col_list);
|
||||
lex->alter_info.key_list.push_back(key);
|
||||
lex->col_list.empty(); /* Alloced by sql_alloc */
|
||||
}
|
||||
| opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
lex->key_list.push_back(new foreign_key($4 ? $4:$1, lex->col_list,
|
||||
$8,
|
||||
lex->ref_list,
|
||||
lex->fk_delete_opt,
|
||||
lex->fk_update_opt,
|
||||
lex->fk_match_option));
|
||||
lex->key_list.push_back(new Key(Key::MULTIPLE, $4 ? $4 : $1,
|
||||
HA_KEY_ALG_UNDEF, 1,
|
||||
lex->col_list));
|
||||
const char *key_name= $4 ? $4 : $1;
|
||||
Key *key= new foreign_key(key_name, lex->col_list,
|
||||
$8,
|
||||
lex->ref_list,
|
||||
lex->fk_delete_opt,
|
||||
lex->fk_update_opt,
|
||||
lex->fk_match_option);
|
||||
lex->alter_info.key_list.push_back(key);
|
||||
key= new Key(Key::MULTIPLE, key_name,
|
||||
HA_KEY_ALG_UNDEF, 1,
|
||||
lex->col_list);
|
||||
lex->alter_info.key_list.push_back(key);
|
||||
lex->col_list.empty(); /* Alloced by sql_alloc */
|
||||
}
|
||||
| constraint opt_check_constraint
|
||||
|
@ -1850,8 +1856,6 @@ alter:
|
|||
if (!lex->select_lex.add_table_to_list(thd, $4, NULL,
|
||||
TL_OPTION_UPDATING))
|
||||
YYABORT;
|
||||
lex->create_list.empty();
|
||||
lex->key_list.empty();
|
||||
lex->col_list.empty();
|
||||
lex->select_lex.init_order();
|
||||
lex->select_lex.db=lex->name=0;
|
||||
|
@ -1859,9 +1863,7 @@ alter:
|
|||
lex->create_info.db_type= DB_TYPE_DEFAULT;
|
||||
lex->create_info.default_table_charset= NULL;
|
||||
lex->create_info.row_type= ROW_TYPE_NOT_USED;
|
||||
lex->alter_info.reset();
|
||||
lex->alter_info.is_simple= 1;
|
||||
lex->alter_info.flags= 0;
|
||||
lex->alter_info.reset();
|
||||
}
|
||||
alter_list
|
||||
{}
|
||||
|
@ -4030,7 +4032,9 @@ drop:
|
|||
{
|
||||
LEX *lex=Lex;
|
||||
lex->sql_command= SQLCOM_DROP_INDEX;
|
||||
lex->alter_info.drop_list.empty();
|
||||
lex->alter_info.reset();
|
||||
lex->alter_info.is_simple= 0;
|
||||
lex->alter_info.flags= ALTER_DROP_INDEX;
|
||||
lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY,
|
||||
$3.str));
|
||||
if (!lex->current_select->add_table_to_list(lex->thd, $5, NULL,
|
||||
|
|
|
@ -270,7 +270,14 @@ main(int argc, char **argv __attribute__((unused)))
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
fprintf(f, "/*\n");
|
||||
fprintf(f, " This file was generated by the conf_to_src utility. "
|
||||
"Do not edit it directly,\n");
|
||||
fprintf(f, " edit the XML definitions in sql/share/charsets/ instead.\n\n");
|
||||
fprintf(f, " To re-generate, run the following in the strings/ "
|
||||
"directory:\n");
|
||||
fprintf(f, " ./conf_to_src ../sql/share/charsets/ > FILE\n");
|
||||
fprintf(f, "*/\n\n");
|
||||
fprintf(f,"#include <my_global.h>\n");
|
||||
fprintf(f,"#include <m_ctype.h>\n\n");
|
||||
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
/*
|
||||
This file was generated by the conf_to_src utility. Do not edit it directly,
|
||||
edit the XML definitions in sql/share/charsets/ instead.
|
||||
|
||||
To re-generate, run the following in the strings/ directory:
|
||||
./conf_to_src ../sql/share/charsets/ > FILE
|
||||
*/
|
||||
|
||||
#include <my_global.h>
|
||||
#include <m_ctype.h>
|
||||
|
||||
|
@ -1169,7 +1177,7 @@ uchar ctype_hebrew_general_ci[] = {
|
|||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
|
||||
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00
|
||||
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x20,0x20,0x00
|
||||
};
|
||||
|
||||
uchar to_lower_hebrew_general_ci[] = {
|
||||
|
@ -1261,7 +1269,7 @@ uint16 to_uni_hebrew_general_ci[] = {
|
|||
0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7,
|
||||
0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF,
|
||||
0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7,
|
||||
0x05E8,0x05E9,0x05EA,0x0000,0x0000,0x0000,0x0000,0x0000
|
||||
0x05E8,0x05E9,0x05EA,0x0000,0x0000,0x200E,0x200F,0x0000
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -5100,7 +5108,7 @@ uchar ctype_hebrew_bin[] = {
|
|||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
|
||||
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00
|
||||
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x20,0x20,0x00
|
||||
};
|
||||
|
||||
uchar to_lower_hebrew_bin[] = {
|
||||
|
@ -5173,7 +5181,7 @@ uint16 to_uni_hebrew_bin[] = {
|
|||
0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7,
|
||||
0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF,
|
||||
0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7,
|
||||
0x05E8,0x05E9,0x05EA,0x0000,0x0000,0x0000,0x0000,0x0000
|
||||
0x05E8,0x05E9,0x05EA,0x0000,0x0000,0x200E,0x200F,0x0000
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -340,7 +340,7 @@ install -m 644 libmysqld/libmysqld.a $RBR%{_libdir}/mysql/
|
|||
# Include libgcc.a in the devel subpackage (BUG 4921)
|
||||
if expr "$CC" : ".*gcc.*" > /dev/null ;
|
||||
then
|
||||
libgcc=`$CC --print-libgcc-file`
|
||||
libgcc=`$CC $CFLAGS --print-libgcc-file`
|
||||
if [ -f $libgcc ]
|
||||
then
|
||||
%define have_libgcc 1
|
||||
|
@ -726,6 +726,11 @@ fi
|
|||
# itself - note that they must be ordered by date (important when
|
||||
# merging BK trees)
|
||||
%changelog
|
||||
* Fri Jan 05 2007 Kent Boortz <kent@mysql.com>
|
||||
|
||||
- Add CFLAGS to gcc call with --print-libgcc-file, to make sure the
|
||||
correct "libgcc.a" path is returned for the 32/64 bit architecture.
|
||||
|
||||
* Thu Dec 14 2006 Joerg Bruehe <joerg@mysql.com>
|
||||
|
||||
- Include the new man pages for "my_print_defaults" and "mysql_tzinfo_to_sql"
|
||||
|
|
Loading…
Reference in a new issue