summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xBuild-tools/Do-compile12
-rw-r--r--Docs/manual.texi107
-rw-r--r--acinclude.m410
-rw-r--r--client/mysql.cc10
-rw-r--r--client/mysqlbinlog.cc2
-rw-r--r--configure.in5
-rw-r--r--include/my_global.h7
-rw-r--r--include/my_pthread.h1
-rw-r--r--innobase/configure.in1
-rw-r--r--innobase/ut/ut0ut.c8
-rw-r--r--mysql-test/r/func_test.result12
-rw-r--r--mysql-test/r/rpl_get_lock.result10
-rw-r--r--mysql-test/t/func_test.test5
-rw-r--r--mysql-test/t/rpl_get_lock.test5
-rw-r--r--mysys/my_tempnam.c4
-rw-r--r--sql/item_cmpfunc.cc34
-rw-r--r--sql/item_create.cc4
-rw-r--r--sql/item_create.h2
-rw-r--r--sql/item_func.cc32
-rw-r--r--sql/item_func.h4
-rw-r--r--sql/lex.h2
-rw-r--r--sql/mysqld.cc8
-rw-r--r--sql/sql_db.cc2
-rw-r--r--sql/sql_parse.cc8
-rw-r--r--sql/sql_select.cc161
-rw-r--r--sql/table.cc3
26 files changed, 260 insertions, 199 deletions
diff --git a/Build-tools/Do-compile b/Build-tools/Do-compile
index e05f19181c0..0e7922c5f2f 100755
--- a/Build-tools/Do-compile
+++ b/Build-tools/Do-compile
@@ -2,12 +2,12 @@
use Getopt::Long;
$opt_distribution=$opt_user=$opt_result=$opt_config_options=$opt_config_env="";
-$opt_dbd_options=$opt_perl_options=$opt_suffix="";
+$opt_dbd_options=$opt_perl_options=$opt_make_options=$opt_suffix="";
$opt_tmp=$opt_version_suffix="";
$opt_help=$opt_Information=$opt_delete=$opt_debug=$opt_stage=$opt_rsh_mail=$opt_no_test=$opt_no_perl=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_no_mysqltest=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=0;
$opt_innodb=$opt_bdb=0;
-GetOptions("Information","help","distribution=s","user=s","result=s","delete","no-test","no-mysqltest","perl-files=s","debug","config-options=s","config-env=s","stage=i","rsh-mail","with-low-memory","fast-benchmark","tmp=s","static-client","static-server","static-perl","no-perl","local-perl","perl-options=s","sur","with-small-disk","dbd-options=s","tcpip","suffix=s","build-thread=i","innodb","bdb","use-old-distribution","enable-shared","no-crash-me","no-strip","version-suffix=s", "with-other-libc=s") || usage();
+GetOptions("Information","help","distribution=s","user=s","result=s","delete","no-test","no-mysqltest","perl-files=s","debug","config-options=s","config-env=s","stage=i","rsh-mail","with-low-memory","fast-benchmark","tmp=s","static-client","static-server","static-perl","no-perl","local-perl","perl-options=s","make-options=s", "sur","with-small-disk","dbd-options=s","tcpip","suffix=s","build-thread=i","innodb","bdb","use-old-distribution","enable-shared","no-crash-me","no-strip","version-suffix=s", "with-other-libc=s") || usage();
usage() if ($opt_help || $opt_Information);
usage() if (!$opt_distribution);
@@ -172,8 +172,11 @@ if ($opt_stage <= 1)
if ($opt_stage <= 2)
{
+ my ($command);
unlink($opt_distribution) if ($opt_delete && !$opt_use_old_distribution);
- safe_system("$make");
+ $command=$make;
+ $command.= " $opt_make_options" if (defined($opt_make_options) && $opt_make_options ne "");
+ safe_system($command);
}
#
@@ -368,6 +371,9 @@ To set up the environment, like 'CC=cc CXX=gcc CXXFLAGS=-O3'
--dbd-options 'options'
Options for Makefile.PL when configuring msql-mysql-modules.
+--make-options 'options'
+Options to make after configure. (Like 'CXXLD=gcc')
+
--version-suffix suffix
Can be used to set a suffix (normally 'com' or '-max') for a distribution
diff --git a/Docs/manual.texi b/Docs/manual.texi
index b908b6cb7ec..d68ea065cf3 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -5710,7 +5710,8 @@ FreeBSD 2.x with the included MIT-pthreads package. @xref{FreeBSD}.
@item
FreeBSD 3.x and 4.x with native threads. @xref{FreeBSD}.
@item
-HP-UX 10.20 with the included MIT-pthreads package. @xref{HP-UX 10.20}.
+HP-UX 10.20 with the DCE threads or the included MIT-pthreads package.
+@xref{HP-UX 10.20}.
@item
HP-UX 11.x with the native threads. @xref{HP-UX 11.x}.
@item
@@ -10396,25 +10397,15 @@ compiler, because @code{gcc} produces better code!
We recommend using gcc 2.95 on HP-UX. Don't use high optimisation
flags (like -O6) as this may not be safe on HP-UX.
-Note that MIT-pthreads can't be compiled with the HP-UX compiler
-because it can't compile @code{.S} (assembler) files.
-
-The following configure line should work:
+The following configure line should work with gcc 2.95:
@example
-CFLAGS="-DHPUX -I/opt/dce/include -fpic" \
-CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions \
+CFLAGS="-I/opt/dce/include -fpic" \
+CXXFLAGS="-I/opt/dce/include -felide-constructors -fno-exceptions \
-fno-rtti" CXX=gcc ./configure --with-pthread \
--with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared
@end example
-If you are compiling @code{gcc} 2.95 yourself, you should NOT link it with
-the DCE libraries (@code{libdce.a} or @code{libcma.a}) if you want to compile
-MySQL with MIT-pthreads. If you mix the DCE and MIT-pthreads
-packages you will get a @code{mysqld} to which you cannot connect. Remove
-the DCE libraries while you compile @code{gcc} 2.95!
-
-
@node HP-UX 11.x, IBM-AIX, HP-UX 10.20, Other Unix Notes
@subsubsection HP-UX Version 11.x Notes
@@ -28290,7 +28281,7 @@ in ANSI mode. @xref{ANSI mode}.
@multitable @columnfractions .15 .15 .70
@item @strong{Identifier} @tab @strong{Max length} @tab @strong{Allowed characters}
-@item Database @tab 64 @tab Any character that is allowed in a directory name except @samp{/} or @samp{.}.
+@item Database @tab 64 @tab Any character that is allowed in a directory name except @samp{/}, @samp{\} or @samp{.}.
@item Table @tab 64 @tab Any character that is allowed in a file name, except @samp{/} or @samp{.}.
@item Column @tab 64 @tab All characters.
@item Alias @tab 255 @tab All characters.
@@ -30746,6 +30737,22 @@ mysql> SELECT 1 && 0;
mysql> SELECT 1 && NULL;
-> NULL
@end example
+
+@findex XOR logical
+@item XOR
+Logical XOR. For non-@code{NULL} operands, evaluates to @code{1} if only one
+of the operators is non-zero.
+Produces @code{NULL} if either operand is @code{NULL}:
+@example
+mysql> SELECT 1 XOR 1;
+ -> 0
+mysql> SELECT 1 XOR 0;
+ -> 1
+mysql> SELECT 1 XOR NULL;
+ -> NULL
+@end example
+
+@code{a XOR b} is equal to @code{(a AND (NOT b)) OR ((NOT a) and b)}.
@end table
@@ -32825,6 +32832,23 @@ mysql> SELECT 29 & 15;
The result is an unsigned 64-bit integer.
+@findex ^ (bitwise XOR)
+@findex XOR, bitwise
+@item ^
+Bitwise XOR
+@example
+mysql> SELECT 1 ^ 1;
+ -> 0
+
+mysql> SELECT 1 ^ 0;
+ -> 1
+
+mysql> SELECT 11 ^ 3;
+ -> 8
+@end example
+
+The result is an unsigned 64-bit integer.
+
@findex << (left shift)
@item <<
Shifts a longlong (@code{BIGINT}) number to the left:
@@ -33215,6 +33239,8 @@ string to perform cooperative advisory locking:
@example
mysql> SELECT GET_LOCK("lock1",10);
-> 1
+mysql> SELECT IS_FREE_LOCK("lock2");
+ -> 1
mysql> SELECT GET_LOCK("lock2",10);
-> 1
mysql> SELECT RELEASE_LOCK("lock2");
@@ -33239,6 +33265,12 @@ been released.
The @code{DO} statement is convinient to use with @code{RELEASE_LOCK()}.
@xref{DO}.
+@findex IS_FREE_LOCK()
+@item IS_FREE_LOCK(str)
+Checks if the the lock named @code{str} is free (not locked) to use.
+Returns @code{1} no one is using the lock, @code{0} if the lock is in use and
+@code{NULL} on errors (like wrong arguments).
+
@findex BENCHMARK()
@item BENCHMARK(count,expr)
The @code{BENCHMARK()} function executes the expression @code{expr}
@@ -49578,44 +49610,15 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet
@item
-Added binary XOR.
-
-The one that with a query like :
-
-@example
-SELECT 11 ^ 3;
-@end example
-
-returns 8.
-
-Based on code contributed by Hartmut Holzgraefe @email{hartmut@@six.de}.
+Execute @code{chroot()}, if requested, directly after options has ben
+parsed.
@item
-
-Added logical XOR.
-
-The one that with a query like:
-
-@example
-SELECT 1 XOR 1;
-@end example
-
-returns 0;
-
-Based on code contributed by Hartmut Holzgraefe @email{hartmut@@six.de}.
+Don't allow database names that contains @code{\}.
@item
-Add function @code{CHECK_LOCK("lock_name")}.
-This function returns a value indicating whether or not the lock with the
-given name is available.
-It does not attempt to acquire a lock.
-It is used like this:
-
-@example
-SELECT CHECK_LOCK("some_lock");
-@end example
-
-@code{CHECK_LOCK()} returns 1 if the lock is available,
-0 if the lock is held by any process (including the current process),
-and @code{NULL} if an error occurs.
+@code{lower_case_table_names} now also affects created and dropped databases.
+@item
+Added operators @code{XOR} and @code{^} (bitwise @code{XOR}).
+Added function @code{IS_FREE_LOCK("lock_name")}.
Based on code contributed by Hartmut Holzgraefe @email{hartmut@@six.de}.
@item
Removed @code{mysql_ssl_clear()}, as this was not needed.
@@ -50225,7 +50228,7 @@ Added @code{@@@@VERSION} as a synonym for @code{VERSION()}.
@item
@code{SHOW VARIABLES LIKE 'xxx'} is now case-insensitive.
@item
-Fixed timeout for @code{GET_LOCK()} on HPUX with DCE threads.
+Fixed timeout for @code{GET_LOCK()} on HP-UX with DCE threads.
@item
Fixed memory allocation bug in the glibc library used to build Linux
binaries, which caused mysqld to die in 'free()'.
diff --git a/acinclude.m4 b/acinclude.m4
index 3230a4b5788..2b6c8cbc390 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -1210,10 +1210,12 @@ AC_DEFUN(AC_SYS_LARGEFILE_FLAGS,
changequote(, )dnl
hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
changequote([, ])dnl
- if test "$GCC" = yes; then
- ac_cv_sys_largefile_CFLAGS=-D__STDC_EXT__
- fi
- ;;
+ if test "$GCC" = yes; then
+ if $CC -v 2>&1 | grep 'version 2.95' > /dev/null 2>&1; then
+ ac_cv_sys_largefile_CFLAGS=-D__STDC_EXT__
+ fi
+ fi
+ ;;
# IRIX 6.2 and later require cc -n32.
changequote(, )dnl
irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*)
diff --git a/client/mysql.cc b/client/mysql.cc
index d6eabc1a567..5b2379e91ec 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -1269,12 +1269,10 @@ You can turn off this feature to get a quicker startup with -A\n\n");
/* for gnu readline */
#ifndef HAVE_INDEX
-#ifdef __cplusplus
extern "C" {
-#endif
-extern char *index(const char *,pchar c),*rindex(const char *,pchar);
+extern char *index(const char *,int c),*rindex(const char *,int);
-char *index(const char *s,pchar c)
+char *index(const char *s,int c)
{
for (;;)
{
@@ -1283,7 +1281,7 @@ char *index(const char *s,pchar c)
}
}
-char *rindex(const char *s,pchar c)
+char *rindex(const char *s,int c)
{
reg3 char *t;
@@ -1291,10 +1289,8 @@ char *rindex(const char *s,pchar c)
do if (*s == (char) c) t = (char*) s; while (*s++);
return (char*) t;
}
-#ifdef __cplusplus
}
#endif
-#endif
#endif /* HAVE_READLINE */
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index f7b381d72fa..4109fbd76d4 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -552,3 +552,5 @@ int main(int argc, char** argv)
#else
#include "log_event.cc"
#endif
+
+FIX_GCC_LINKING_PROBLEM
diff --git a/configure.in b/configure.in
index 923d6e18800..90ee62059e6 100644
--- a/configure.in
+++ b/configure.in
@@ -318,7 +318,7 @@ then
# mysqld doesn't use run-time-type-checking, so we disable it.
CXXFLAGS="$CXXFLAGS -fno-implicit-templates -fno-exceptions -fno-rtti"
- # If you are using 'gcc' 3.0 (not g++) to compile C++ programs,
+ # If you are using 'gcc' 3.0 (not g++) to compile C++ programs on Linux,
# we will gets some problems when linking static programs.
# The following code is used to fix this problem.
@@ -326,8 +326,7 @@ then
then
if $CXX -v 2>&1 | grep 'version 3' > /dev/null 2>&1
then
- CXXFLAGS="$CXXFLAGS -DUSE_MYSYS_NEW"
- CXXLDFLAGS="$CXXLDFLAGS -Wl,--defsym -Wl,__cxa_pure_virtual=0"
+ CXXFLAGS="$CXXFLAGS -DUSE_MYSYS_NEW -DDEFINE_CXA_PURE_VIRTUAL"
fi
fi
fi
diff --git a/include/my_global.h b/include/my_global.h
index 2ad8a870048..c13b79cbc1f 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -150,6 +150,13 @@
#define __LONG_MAX__ 2147483647
#endif
+/* Fix problem when linking c++ programs with gcc 3.x */
+#ifdef DEFINE_CXA_PURE_VIRTUAL
+#define FIX_GCC_LINKING_PROBLEM extern "C" { int __cxa_pure_virtual() {} }
+#else
+#define FIX_GCC_LINKING_PROBLEM
+#endif
+
/* egcs 1.1.2 has a problem with memcpy on Alpha */
#if defined(__GNUC__) && defined(__alpha__) && ! (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
#define BAD_MEMCPY
diff --git a/include/my_pthread.h b/include/my_pthread.h
index 7e975a8185d..d1d507c06cf 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -429,6 +429,7 @@ struct tm *localtime_r(const time_t *clock, struct tm *res);
#endif /* defined(__WIN__) */
#if defined(HPUX) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS)
+#undef pthread_cond_timedwait
#define pthread_cond_timedwait(a,b,c) my_pthread_cond_timedwait((a),(b),(c))
#define pthread_mutex_trylock(a) my_pthread_mutex_trylock((a))
int my_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
diff --git a/innobase/configure.in b/innobase/configure.in
index b606ecfffc0..c234e1e192d 100644
--- a/innobase/configure.in
+++ b/innobase/configure.in
@@ -36,6 +36,7 @@ AC_PROG_RANLIB
AC_PROG_INSTALL
AC_CHECK_HEADERS(aio.h sched.h)
AC_CHECK_SIZEOF(int, 4)
+AC_CHECK_SIZEOF(long, 4)
AC_CHECK_FUNCS(sched_yield)
AC_CHECK_FUNCS(fdatasync)
#AC_CHECK_FUNCS(localtime_r) # Already checked by MySQL
diff --git a/innobase/ut/ut0ut.c b/innobase/ut/ut0ut.c
index 7ee32b9a8e2..cd21491dcf1 100644
--- a/innobase/ut/ut0ut.c
+++ b/innobase/ut/ut0ut.c
@@ -27,11 +27,11 @@ ut_get_high32(
/* out: a >> 32 */
ulint a) /* in: ulint */
{
- if (sizeof(ulint) == 4) {
- return(0);
- }
-
+#if SIZEOF_LONG == 4
+ return 0;
+#else
return(a >> 32);
+#endif
}
/************************************************************
diff --git a/mysql-test/r/func_test.result b/mysql-test/r/func_test.result
index 7d0ef3cff89..8cfae44b9dd 100644
--- a/mysql-test/r/func_test.result
+++ b/mysql-test/r/func_test.result
@@ -40,12 +40,12 @@ select 2 in (3,2,5,9,5,1),"monty" in ("david","monty","allan"), 1.2 in (1.4,1.2,
select -1.49 or -1.49,0.6 or 0.6;
-1.49 or -1.49 0.6 or 0.6
1 1
-select 3 ^ 11;
-3 ^ 11
-8
-select 1 XOR 0;
-1 XOR 0
-1
+select 3 ^ 11, 1 ^ 1, 1 ^ 0, 1 ^ NULL, NULL ^ 1;
+3 ^ 11 1 ^ 1 1 ^ 0 1 ^ NULL NULL ^ 1
+8 0 1 NULL NULL
+select 1 XOR 1, 1 XOR 0, 0 XOR 1, 0 XOR 0, NULL XOR 1, 1 XOR NULL, 0 XOR NULL;
+1 XOR 1 1 XOR 0 0 XOR 1 0 XOR 0 NULL XOR 1 1 XOR NULL 0 XOR NULL
+0 1 1 0 NULL NULL NULL
select 5 between 0 and 10 between 0 and 1,(5 between 0 and 10) between 0 and 1;
5 between 0 and 10 between 0 and 1 (5 between 0 and 10) between 0 and 1
0 1
diff --git a/mysql-test/r/rpl_get_lock.result b/mysql-test/r/rpl_get_lock.result
index 6201a751961..cfbf4351f32 100644
--- a/mysql-test/r/rpl_get_lock.result
+++ b/mysql-test/r/rpl_get_lock.result
@@ -17,7 +17,13 @@ get_lock("lock",3)
select * from t1;
n
1
-select check_lock("lock");
-check_lock("lock")
+select is_free_lock("lock");
+is_free_lock("lock")
+0
+select is_free_lock("lock2");
+is_free_lock("lock2")
1
+select is_free_lock(NULL);
+is_free_lock(NULL)
+NULL
drop table t1;
diff --git a/mysql-test/t/func_test.test b/mysql-test/t/func_test.test
index 844db1a0214..f5ad2e21c73 100644
--- a/mysql-test/t/func_test.test
+++ b/mysql-test/t/func_test.test
@@ -15,8 +15,9 @@ select 2 between 1 and 3, "monty" between "max" and "my",2=2 and "monty" between
select 'b' between 'a' and 'c', 'B' between 'a' and 'c';
select 2 in (3,2,5,9,5,1),"monty" in ("david","monty","allan"), 1.2 in (1.4,1.2,1.0);
select -1.49 or -1.49,0.6 or 0.6;
-select 3 ^ 11;
-select 1 XOR 0;
+select 3 ^ 11, 1 ^ 1, 1 ^ 0, 1 ^ NULL, NULL ^ 1;
+select 1 XOR 1, 1 XOR 0, 0 XOR 1, 0 XOR 0, NULL XOR 1, 1 XOR NULL, 0 XOR NULL;
+
#
# Wrong usage of functions
#
diff --git a/mysql-test/t/rpl_get_lock.test b/mysql-test/t/rpl_get_lock.test
index e197b9911bb..1d98eb16bb0 100644
--- a/mysql-test/t/rpl_get_lock.test
+++ b/mysql-test/t/rpl_get_lock.test
@@ -21,8 +21,11 @@ connection slave;
sync_with_master;
select get_lock("lock",3);
select * from t1;
+select is_free_lock("lock");
+# Check lock functions
+select is_free_lock("lock2");
+select is_free_lock(NULL);
connection master1;
-select check_lock("lock");
drop table t1;
save_master_pos;
connection slave;
diff --git a/mysys/my_tempnam.c b/mysys/my_tempnam.c
index da0692b46c5..6c17aa5b165 100644
--- a/mysys/my_tempnam.c
+++ b/mysys/my_tempnam.c
@@ -109,13 +109,13 @@ my_string my_tempnam(const char *dir, const char *pfx,
old_env=(char**)environ;
if (dir)
{ /* Don't use TMPDIR if dir is given */
- environ=(const char**)temp_env; /* May give warning */
+ ((char**) environ)=(char**) temp_env;
temp_env[0]=0;
}
#endif
res=tempnam((char*) dir,(my_string) pfx); /* Use stand. dir with prefix */
#ifndef OS2
- environ=(const char**)old_env; /* May give warning */
+ ((char**) environ)=(char**) old_env;
#endif
if (!res)
DBUG_PRINT("error",("Got error: %d from tempnam",errno));
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index ca0044b371a..90e8a0e451f 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1625,17 +1625,41 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
}
}
+
+/*
+ Make a logical XOR of the arguments.
+
+ SYNOPSIS
+ val_int()
+
+ DESCRIPTION
+ If either operator is NULL, return NULL.
+
+ NOTE
+ As we don't do any index optimization on XOR this is not going to be
+ very fast to use.
+
+ TODO (low priority)
+ Change this to be optimized as:
+ A XOR B -> (A) == 1 AND (B) <> 1) OR (A <> 1 AND (B) == 1)
+ To be able to do this, we would however first have to extend the MySQL
+ range optimizer to handle OR better.
+*/
+
longlong Item_cond_xor::val_int()
{
List_iterator<Item> li(list);
Item *item;
int result=0;
- null_value=1;
+ null_value=0;
while ((item=li++))
{
- result ^= (item->val_int() != 0);
- if (!item->null_value)
- null_value=0;
+ result^= (item->val_int() != 0);
+ if (item->null_value)
+ {
+ null_value=1;
+ return 0;
+ }
}
- return result;
+ return (longlong) result;
}
diff --git a/sql/item_create.cc b/sql/item_create.cc
index f268550d115..62f09f002d1 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -429,9 +429,9 @@ Item *create_func_cast(Item *a, Item_cast cast_type)
return res;
}
-Item *create_func_check_lock(Item* a)
+Item *create_func_is_free_lock(Item* a)
{
current_thd->safe_to_cache_query=0;
- return new Item_func_check_lock(a);
+ return new Item_func_is_free_lock(a);
}
diff --git a/sql/item_create.h b/sql/item_create.h
index 09d72f9fbb3..967de0e2eba 100644
--- a/sql/item_create.h
+++ b/sql/item_create.h
@@ -91,4 +91,4 @@ Item *create_func_version(void);
Item *create_func_weekday(Item* a);
Item *create_load_file(Item* a);
Item *create_wait_for_master_pos(Item* a, Item* b);
-Item *create_func_check_lock(Item* a);
+Item *create_func_is_free_lock(Item* a);
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 4dfd9e3585f..a81a736c304 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -2260,18 +2260,9 @@ double Item_func_match::val()
longlong Item_func_bit_xor::val_int()
{
ulonglong arg1= (ulonglong) args[0]->val_int();
- if (args[0]->null_value)
- {
- null_value=1;
- return 0;
- }
ulonglong arg2= (ulonglong) args[1]->val_int();
- if (args[1]->null_value)
- {
- null_value=1;
+ if ((null_value= (args[0]->null_value || args[1]->null_value)))
return 0;
- }
- null_value=0;
return (longlong) (arg1 ^ arg2);
}
@@ -2295,12 +2286,17 @@ Item *get_system_var(LEX_STRING name)
/*
Check a user level lock.
- Returns 1: available
- Returns 0: already taken
- Returns NULL: Error
+
+ SYNOPSIS:
+ val_int()
+
+ RETURN VALUES
+ 1 Available
+ 0 Already taken
+ NULL Error
*/
-longlong Item_func_check_lock::val_int()
+longlong Item_func_is_free_lock::val_int()
{
String *res=args[0]->val_str(&value);
struct timespec abstime;
@@ -2309,23 +2305,17 @@ longlong Item_func_check_lock::val_int()
int error=0;
null_value=0;
-
- if (/* check_global_access(thd,SUPER_ACL) ||*/ !res || !res->length())
+ if (!res || !res->length())
{
null_value=1;
return 0;
}
pthread_mutex_lock(&LOCK_user_locks);
-
-
ull= (ULL*) hash_search(&hash_user_locks,(byte*) res->ptr(),
res->length());
-
pthread_mutex_unlock(&LOCK_user_locks);
-
if (!ull || !ull->locked)
return 1;
-
return 0;
}
diff --git a/sql/item_func.h b/sql/item_func.h
index 0e1b5b7c9e0..5560d3cdb0d 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -1000,11 +1000,11 @@ public:
void fix_length_xor_dec() { unsigned_flag=1; }
};
-class Item_func_check_lock :public Item_int_func
+class Item_func_is_free_lock :public Item_int_func
{
String value;
public:
- Item_func_check_lock(Item *a) :Item_int_func(a) {}
+ Item_func_is_free_lock(Item *a) :Item_int_func(a) {}
longlong val_int();
const char *func_name() const { return "check_lock"; }
void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
diff --git a/sql/lex.h b/sql/lex.h
index 8b9d2f3a9e0..81d597c6a5c 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -413,7 +413,6 @@ static SYMBOL sql_functions[] = {
{ "BIT_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_length)},
{ "CHAR_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
{ "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
- { "CHECK_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_check_lock)},
{ "COALESCE", SYM(COALESCE),0,0},
{ "CONCAT", SYM(CONCAT),0,0},
{ "CONCAT_WS", SYM(CONCAT_WS),0,0},
@@ -458,6 +457,7 @@ static SYMBOL sql_functions[] = {
{ "INET_NTOA", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_inet_ntoa)},
{ "INSTR", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_instr)},
{ "ISNULL", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isnull)},
+ { "IS_FREE_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_free_lock)},
{ "LCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)},
{ "LEAST", SYM(LEAST_SYM),0,0},
{ "LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)},
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index f1e863b830e..0b11ee89c3f 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1014,8 +1014,6 @@ static void server_init(void)
unireg_abort(1);
}
}
- if (mysqld_chroot)
- set_root(mysqld_chroot);
set_user(mysqld_user); // Works also with mysqld_user==NULL
#ifdef __NT__
@@ -1838,7 +1836,7 @@ int main(int argc, char **argv)
init_signals();
if (set_default_charset_by_name(default_charset, MYF(MY_WME)))
- exit( 1 );
+ exit(1);
charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS));
#ifdef HAVE_OPENSSL
@@ -1906,7 +1904,7 @@ int main(int argc, char **argv)
unireg_abort(1);
/*
- ** We have enough space for fiddling with the argv, continue
+ We have enough space for fiddling with the argv, continue
*/
umask(((~my_umask) & 0666));
if (my_setwd(mysql_real_data_home,MYF(MY_WME)))
@@ -4430,6 +4428,8 @@ static void get_options(int argc,char **argv)
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
exit(ho_error);
+ if (mysqld_chroot)
+ set_root(mysqld_chroot);
fix_paths();
default_table_type_name=ha_table_typelib.type_names[default_table_type-1];
default_tx_isolation_name=tx_isolation_typelib.type_names[default_tx_isolation];
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index c37dc1c4f6e..6ea815cd51a 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -344,6 +344,8 @@ bool mysql_change_db(THD *thd,const char *name)
x_free(dbname);
DBUG_RETURN(1);
}
+ if (lower_case_table_names)
+ casedn_str(dbname);
DBUG_PRINT("info",("Use database: %s", dbname));
if (test_all_bits(thd->master_access,DB_ACLS))
db_access=DB_ACLS;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 783a1631fad..df44a7e043f 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1035,6 +1035,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
break;
}
+ if (lower_case_table_names)
+ casedn_str(db);
if (check_access(thd,CREATE_ACL,db,0,1))
break;
mysql_log.write(thd,command,packet);
@@ -1051,6 +1053,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
break;
}
+ if (lower_case_table_names)
+ casedn_str(db);
if (thd->locked_tables || thd->active_transaction())
{
send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION);
@@ -2239,6 +2243,8 @@ mysql_execute_command(void)
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
break;
}
+ if (lower_case_table_names)
+ casedn_str(lex->name);
if (check_access(thd,CREATE_ACL,lex->name,0,1))
break;
res=mysql_create_db(thd,lex->name,lex->create_info.options,0);
@@ -2251,6 +2257,8 @@ mysql_execute_command(void)
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
break;
}
+ if (lower_case_table_names)
+ casedn_str(lex->name);
if (check_access(thd,DROP_ACL,lex->name,0,1))
break;
if (thd->locked_tables || thd->active_transaction())
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 0af91c443a8..459c85a4108 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -62,7 +62,7 @@ static void update_depend_map(JOIN *join);
static void update_depend_map(JOIN *join, ORDER *order);
static ORDER *remove_const(JOIN *join,ORDER *first_order,COND *cond,
bool *simple_order);
-static int return_zero_rows(select_result *res,TABLE_LIST *tables,
+static int return_zero_rows(JOIN *join, select_result *res,TABLE_LIST *tables,
List<Item> &fields, bool send_row,
uint select_options, const char *info,
Item *having, Procedure *proc);
@@ -145,7 +145,7 @@ static void init_sum_functions(Item_sum **func);
static bool update_sum_func(Item_sum **func);
static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
bool distinct, const char *message=NullS);
-static void describe_info(THD *thd, const char *info);
+static void describe_info(JOIN *join, const char *info);
/*
This handles SELECT with and without UNION
@@ -187,7 +187,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
TABLE *tmp_table;
int error, tmp_error;
bool need_tmp,hidden_group_fields;
- bool simple_order,simple_group,no_order, skip_sort_order, buffer_result;
+ bool simple_order,simple_group,no_order, skip_sort_order;
Item::cond_result cond_value;
SQL_SELECT *select;
DYNAMIC_ARRAY keyuse;
@@ -202,7 +202,6 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
/* Check that all tables, fields, conds and order are ok */
select_distinct=test(select_options & SELECT_DISTINCT);
- buffer_result=test(select_options & OPTION_BUFFER_RESULT) && !test(select_options & OPTION_FOUND_ROWS);
tmp_table=0;
select=0;
no_order=skip_sort_order=0;
@@ -353,13 +352,10 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
}
if (cond_value == Item::COND_FALSE || !thd->select_limit)
{ /* Impossible cond */
- if (select_options & SELECT_DESCRIBE && select_lex->next)
- select_describe(&join,false,false,false,"Impossible WHERE");
- else
- error=return_zero_rows(result, tables, fields,
- join.tmp_table_param.sum_func_count != 0 && !group,
- select_options,"Impossible WHERE",having,
- procedure);
+ error=return_zero_rows(&join, result, tables, fields,
+ join.tmp_table_param.sum_func_count != 0 && !group,
+ select_options,"Impossible WHERE",having,
+ procedure);
delete procedure;
DBUG_RETURN(error);
}
@@ -372,21 +368,15 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
{
if (res < 0)
{
- if (select_options & SELECT_DESCRIBE && select_lex->next)
- select_describe(&join,false,false,false,"No matching min/max row");
- else
- error=return_zero_rows(result, tables, fields, !group,
- select_options,"No matching min/max row",
- having,procedure);
+ error=return_zero_rows(&join, result, tables, fields, !group,
+ select_options,"No matching min/max row",
+ having,procedure);
delete procedure;
DBUG_RETURN(error);
}
if (select_options & SELECT_DESCRIBE)
{
- if (select_lex->next)
- select_describe(&join,false,false,false,"Select tables optimized away");
- else
- describe_info(thd,"Select tables optimized away");
+ describe_info(&join, "Select tables optimized away");
delete procedure;
DBUG_RETURN(error);
}
@@ -397,12 +387,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
{ // Only test of functions
error=0;
if (select_options & SELECT_DESCRIBE)
- {
- if (select_lex->next)
- select_describe(&join,false,false,false,"No tables used");
- else
- describe_info(thd,"No tables used");
- }
+ describe_info(&join, "No tables used");
else
{
result->send_fields(fields,1);
@@ -435,7 +420,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
if (join.const_table_map != join.found_const_table_map &&
!(select_options & SELECT_DESCRIBE))
{
- error=return_zero_rows(result,tables,fields,
+ error=return_zero_rows(&join,result,tables,fields,
join.tmp_table_param.sum_func_count != 0 &&
!group,0,"",having,procedure);
goto err;
@@ -480,14 +465,11 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
}
if (make_join_select(&join,select,conds))
{
- if (select_options & SELECT_DESCRIBE && select_lex->next)
- select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables");
- else
- error=return_zero_rows(result,tables,fields,
- join.tmp_table_param.sum_func_count != 0 && !group,
- select_options,
- "Impossible WHERE noticed after reading const tables",
- having,procedure);
+ error=return_zero_rows(&join, result, tables, fields,
+ join.tmp_table_param.sum_func_count != 0 && !group,
+ select_options,
+ "Impossible WHERE noticed after reading const tables",
+ having,procedure);
goto err;
}
@@ -546,21 +528,33 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
simple_order=0;
}
+ /*
+ Check if we need to create a temporary table.
+ This has to be done if all tables are not already read (const tables)
+ and one of the following conditions holds:
+ - We are using DISTINCT (simple distinct's are already optimized away)
+ - We are using an ORDER BY or GROUP BY on fields not in the first table
+ - We are using different ORDER BY and GROUP BY orders
+ - The user wants us to buffer the result.
+ */
need_tmp= (join.const_tables != join.tables &&
((select_distinct || !simple_order || !simple_group) ||
- (group && order) || buffer_result));
+ (group && order) ||
+ test(select_options & OPTION_BUFFER_RESULT)));
// No cache for MATCH
make_join_readinfo(&join,
(select_options & (SELECT_DESCRIBE |
SELECT_NO_JOIN_CACHE)) |
- (cur_sel->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0));
-
- /* Need to tell Innobase that to play it safe, it should fetch all
- columns of the tables: this is because MySQL
- may build row pointers for the rows, and for all columns of the primary
- key the field->query_id has not necessarily been set to thd->query_id
- by MySQL. */
+ (cur_sel->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE :
+ 0));
+ /*
+ Need to tell Innobase that to play it safe, it should fetch all
+ columns of the tables: this is because MySQL may build row
+ pointers for the rows, and for all columns of the primary key the
+ field->query_id has not necessarily been set to thd->query_id by
+ MySQL.
+ */
#ifdef HAVE_INNOBASE_DB
if (need_tmp || select_distinct || group || order)
@@ -2929,16 +2923,17 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond, bool *simple_order)
DBUG_RETURN(first_order);
}
+
static int
-return_zero_rows(select_result *result,TABLE_LIST *tables,List<Item> &fields,
- bool send_row, uint select_options,const char *info,
- Item *having, Procedure *procedure)
+return_zero_rows(JOIN *join, select_result *result,TABLE_LIST *tables,
+ List<Item> &fields, bool send_row, uint select_options,
+ const char *info, Item *having, Procedure *procedure)
{
DBUG_ENTER("return_zero_rows");
if (select_options & SELECT_DESCRIBE)
- {
- describe_info(current_thd, info);
+ {
+ describe_info(join, info);
DBUG_RETURN(0);
}
if (procedure)
@@ -7007,6 +7002,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
MYSQL_LOCK *save_lock;
SELECT_LEX *select_lex = &(join->thd->lex.select_lex);
select_result *result=join->result;
+ Item *item_null= new Item_null();
DBUG_ENTER("select_describe");
/* Don't log this into the slow query log */
@@ -7034,13 +7030,9 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
if (message)
{
- item_list.push_back(new Item_empty_string("",0));
- item_list.push_back(new Item_empty_string("",0));
- item_list.push_back(new Item_empty_string("",0));
- item_list.push_back(new Item_empty_string("",0));
- item_list.push_back(new Item_empty_string("",0));
- item_list.push_back(new Item_empty_string("",0));
- item_list.push_back(new Item_empty_string("",0));
+ Item *empty= new Item_empty_string("",0);
+ for (uint i=0 ; i < 7; i++)
+ item_list.push_back(empty);
item_list.push_back(new Item_string(message,strlen(message)));
if (result->send_data(item_list))
result->send_error(0,NullS);
@@ -7053,15 +7045,19 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
JOIN_TAB *tab=join->join_tab+i;
TABLE *table=tab->table;
char buff[512],*buff_ptr=buff;
- char buff1[512], buff2[512], bufff[512];
+ char buff1[512], buff2[512], buff3[512];
String tmp1(buff1,sizeof(buff1));
String tmp2(buff2,sizeof(buff2));
+ tmp1.length(0);
+ tmp2.length(0);
item_list.empty();
+
if (tab->type == JT_ALL && tab->select && tab->select->quick)
tab->type= JT_RANGE;
- item_list.push_back(new Item_string(table->table_name,strlen(table->table_name)));
- item_list.push_back(new Item_string(join_type_str[tab->type],strlen(join_type_str[tab->type])));
- tmp1.length(0); tmp2.length(0);
+ item_list.push_back(new Item_string(table->table_name,
+ strlen(table->table_name)));
+ item_list.push_back(new Item_string(join_type_str[tab->type],
+ strlen(join_type_str[tab->type])));
key_map bits;
uint j;
for (j=0,bits=tab->keys ; bits ; j++,bits>>=1)
@@ -7076,11 +7072,12 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
if (tmp1.length())
item_list.push_back(new Item_string(tmp1.ptr(),tmp1.length()));
else
- item_list.push_back(new Item_null());
+ item_list.push_back(item_null);
if (tab->ref.key_parts)
{
- item_list.push_back(new Item_string(table->key_info[tab->ref.key].name,
- strlen(table->key_info[tab->ref.key].name)));
+ KEY *key_info=table->key_info+ tab->ref.key;
+ item_list.push_back(new Item_string(key_info->name,
+ strlen(key_info->name)));
item_list.push_back(new Item_int((int32) tab->ref.key_length));
for (store_key **ref=tab->ref.key_copy ; *ref ; ref++)
{
@@ -7092,24 +7089,28 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
}
else if (tab->type == JT_NEXT)
{
- item_list.push_back(new Item_string(table->key_info[tab->index].name,strlen(table->key_info[tab->index].name)));
- item_list.push_back(new Item_int((int32) table->key_info[tab->index].key_length));
- item_list.push_back(new Item_null());
+ KEY *key_info=table->key_info+ tab->index;
+ item_list.push_back(new Item_string(key_info->name,
+ strlen(key_info->name)));
+ item_list.push_back(new Item_int((int32) key_info->key_length));
+ item_list.push_back(item_null);
}
else if (tab->select && tab->select->quick)
{
- item_list.push_back(new Item_string(table->key_info[tab->select->quick->index].name,strlen(table->key_info[tab->select->quick->index].name)));
+ KEY *key_info=table->key_info+ tab->select->quick->index;
+ item_list.push_back(new Item_string(key_info->name,
+ strlen(key_info->name)));
item_list.push_back(new Item_int((int32) tab->select->quick->max_used_key_length));
- item_list.push_back(new Item_null());
+ item_list.push_back(item_null);
}
else
{
- item_list.push_back(new Item_null());
- item_list.push_back(new Item_null());
- item_list.push_back(new Item_null());
+ item_list.push_back(item_null);
+ item_list.push_back(item_null);
+ item_list.push_back(item_null);
}
- sprintf(bufff,"%.0f",join->best_positions[i].records_read);
- item_list.push_back(new Item_string(bufff,strlen(bufff)));
+ sprintf(buff3,"%.0f",join->best_positions[i].records_read);
+ item_list.push_back(new Item_string(buff3,strlen(buff3)));
my_bool key_read=table->key_read;
if (tab->type == JT_NEXT &&
((table->used_keys & ((key_map) 1 << tab->index))))
@@ -7177,7 +7178,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
result->send_error(0,NullS);
}
}
- if (!join->thd->lex.select->next)
+ if (!thd->lex.select->next) // Not union
{
save_lock=thd->lock;
thd->lock=(MYSQL_LOCK *)0;
@@ -7188,13 +7189,21 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
}
-static void describe_info(THD *thd, const char *info)
+static void describe_info(JOIN *join, const char *info)
{
+ THD *thd= join->thd;
+
+ if (thd->lex.select_lex.next) /* If in UNION */
+ {
+ select_describe(join,FALSE,FALSE,FALSE,info);
+ return;
+ }
List<Item> field_list;
String *packet= &thd->packet;
/* Don't log this into the slow query log */
- thd->lex.select_lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED);
+ thd->lex.select_lex.options&= ~(QUERY_NO_INDEX_USED |
+ QUERY_NO_GOOD_INDEX_USED);
field_list.push_back(new Item_empty_string("Comment",80));
if (send_fields(thd,field_list,1))
return; /* purecov: inspected */
diff --git a/sql/table.cc b/sql/table.cc
index 9435a83120e..2eb924caaf2 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1078,7 +1078,8 @@ bool check_db_name(const char *name)
}
}
#endif
- if (*name == '/' || *name == FN_LIBCHAR || *name == FN_EXTCHAR)
+ if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR ||
+ *name == FN_EXTCHAR)
return 1;
name++;
}