diff options
author | unknown <monty@hundin.mysql.fi> | 2002-06-30 19:34:54 +0300 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2002-06-30 19:34:54 +0300 |
commit | 417c53ac5d26d4465d847d8c1a65b9847f8508a7 (patch) | |
tree | a9b44d5572a490b782837b066152336770b59740 | |
parent | 422d3873af935a3720ba869a866e17136dc2e99c (diff) | |
parent | a86390f01ae108baf07707d401e35c3c4e1e9041 (diff) | |
download | mariadb-git-417c53ac5d26d4465d847d8c1a65b9847f8508a7.tar.gz |
Merge work:/home/bk/mysql-4.0 into hundin.mysql.fi:/my/bk/mysql-4.0
include/my_pthread.h:
Auto merged
-rwxr-xr-x | Build-tools/Do-compile | 12 | ||||
-rw-r--r-- | Docs/manual.texi | 107 | ||||
-rw-r--r-- | acinclude.m4 | 10 | ||||
-rw-r--r-- | client/mysql.cc | 10 | ||||
-rw-r--r-- | client/mysqlbinlog.cc | 2 | ||||
-rw-r--r-- | configure.in | 5 | ||||
-rw-r--r-- | include/my_global.h | 7 | ||||
-rw-r--r-- | include/my_pthread.h | 1 | ||||
-rw-r--r-- | innobase/configure.in | 1 | ||||
-rw-r--r-- | innobase/ut/ut0ut.c | 8 | ||||
-rw-r--r-- | mysql-test/r/func_test.result | 12 | ||||
-rw-r--r-- | mysql-test/r/rpl_get_lock.result | 10 | ||||
-rw-r--r-- | mysql-test/t/func_test.test | 5 | ||||
-rw-r--r-- | mysql-test/t/rpl_get_lock.test | 5 | ||||
-rw-r--r-- | mysys/my_tempnam.c | 4 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 34 | ||||
-rw-r--r-- | sql/item_create.cc | 4 | ||||
-rw-r--r-- | sql/item_create.h | 2 | ||||
-rw-r--r-- | sql/item_func.cc | 32 | ||||
-rw-r--r-- | sql/item_func.h | 4 | ||||
-rw-r--r-- | sql/lex.h | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 8 | ||||
-rw-r--r-- | sql/sql_db.cc | 2 | ||||
-rw-r--r-- | sql/sql_parse.cc | 8 | ||||
-rw-r--r-- | sql/sql_select.cc | 161 | ||||
-rw-r--r-- | sql/table.cc | 3 |
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 0908f7b8ab9..038030540e8 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++; } |