Commit 631558f3 authored by unknown's avatar unknown

Merge kishkin.ru:/home/wax/mysql-4.1 into kishkin.ru:/home/wax/mysql-4g


mysql-test/r/func_gconcat.result:
  Auto merged
sql/field.cc:
  Auto merged
sql/item_sum.cc:
  Auto merged
sql/item_sum.h:
  Auto merged
parents 6bb747bb 7fac151b
...@@ -399,6 +399,7 @@ libmysqld/sql_rename.cc ...@@ -399,6 +399,7 @@ libmysqld/sql_rename.cc
libmysqld/sql_repl.cc libmysqld/sql_repl.cc
libmysqld/sql_select.cc libmysqld/sql_select.cc
libmysqld/sql_show.cc libmysqld/sql_show.cc
libmysqld/sql_state.c
libmysqld/sql_string.cc libmysqld/sql_string.cc
libmysqld/sql_table.cc libmysqld/sql_table.cc
libmysqld/sql_test.cc libmysqld/sql_test.cc
...@@ -552,6 +553,7 @@ sql-bench/test-select ...@@ -552,6 +553,7 @@ sql-bench/test-select
sql-bench/test-transactions sql-bench/test-transactions
sql-bench/test-wisconsin sql-bench/test-wisconsin
sql/.gdbinit sql/.gdbinit
sql/client.c
sql/gen_lex_hash sql/gen_lex_hash
sql/gmon.out sql/gmon.out
sql/lex_hash.h sql/lex_hash.h
...@@ -586,6 +588,7 @@ stamp-h4 ...@@ -586,6 +588,7 @@ stamp-h4
strings/conf_to_src strings/conf_to_src
strings/ctype_autoconf.c strings/ctype_autoconf.c
strings/ctype_extra_sources.c strings/ctype_extra_sources.c
strings/str_test
support-files/MacOSX/Description.plist support-files/MacOSX/Description.plist
support-files/MacOSX/Info.plist support-files/MacOSX/Info.plist
support-files/MacOSX/ReadMe.txt support-files/MacOSX/ReadMe.txt
...@@ -619,4 +622,3 @@ vio/test-ssl ...@@ -619,4 +622,3 @@ vio/test-ssl
vio/test-sslclient vio/test-sslclient
vio/test-sslserver vio/test-sslserver
vio/viotest-ssl vio/viotest-ssl
sql/client.c
...@@ -71,6 +71,22 @@ else ...@@ -71,6 +71,22 @@ else
make=make make=make
fi fi
if test -z $CXX ; then if test -z "$CXX" ; then
CXX=gcc CXX=gcc
fi fi
# If ccache (a compiler cache which reduces build time)
# (http://samba.org/ccache) is installed, use it.
# We use 'grep' and hope 'grep' will work as expected
# (returns 0 if finds lines)
if ccache -V > /dev/null 2>&1
then
if ! (echo "$CC" | grep "ccache" > /dev/null)
then
CC="ccache $CC"
fi
if ! (echo "$CXX" | grep "ccache" > /dev/null)
then
CXX="ccache $CXX"
fi
fi
...@@ -40,6 +40,7 @@ jani@hynda.mysql.fi ...@@ -40,6 +40,7 @@ jani@hynda.mysql.fi
jani@janikt.pp.saunalahti.fi jani@janikt.pp.saunalahti.fi
jani@rhols221.adsl.netsonic.fi jani@rhols221.adsl.netsonic.fi
jani@rhols221.arenanet.fi jani@rhols221.arenanet.fi
jani@ua126d19.elisa.omakaista.fi
jcole@abel.spaceapes.com jcole@abel.spaceapes.com
jcole@main.burghcom.com jcole@main.burghcom.com
jcole@mugatu.spaceapes.com jcole@mugatu.spaceapes.com
......
...@@ -104,6 +104,10 @@ SOURCE=..\mysys\charset.c ...@@ -104,6 +104,10 @@ SOURCE=..\mysys\charset.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\libmysql\client.c
# End Source File
# Begin Source File
SOURCE=.\completion_hash.cpp SOURCE=.\completion_hash.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -430,10 +434,6 @@ SOURCE=..\mysys\safemalloc.c ...@@ -430,10 +434,6 @@ SOURCE=..\mysys\safemalloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\select_test.c
# End Source File
# Begin Source File
SOURCE=..\mysys\sha1.c SOURCE=..\mysys\sha1.c
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -123,6 +123,10 @@ SOURCE=..\mysys\charset.c ...@@ -123,6 +123,10 @@ SOURCE=..\mysys\charset.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\client.c
# End Source File
# Begin Source File
SOURCE="..\strings\ctype-big5.c" SOURCE="..\strings\ctype-big5.c"
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -215,10 +219,6 @@ SOURCE=.\libmysql.c ...@@ -215,10 +219,6 @@ SOURCE=.\libmysql.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\pack.c
# End Source File
# Begin Source File
SOURCE=.\Libmysql.def SOURCE=.\Libmysql.def
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -403,15 +403,15 @@ SOURCE=..\sql\net_serv.cpp ...@@ -403,15 +403,15 @@ SOURCE=..\sql\net_serv.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\password.c SOURCE=.\pack.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\mysys\safemalloc.c SOURCE=.\password.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\client\select_test.c SOURCE=..\mysys\safemalloc.c
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -87,10 +87,10 @@ LINK32=link.exe ...@@ -87,10 +87,10 @@ LINK32=link.exe
# Name "libmysqld - Win32 Debug" # Name "libmysqld - Win32 Debug"
# Begin Source File # Begin Source File
SOURCE=..\sql\convert.cpp SOURCE=.\client.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\derror.cpp SOURCE=..\sql\derror.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -180,6 +180,10 @@ SOURCE=..\sql\item_func.cpp ...@@ -180,6 +180,10 @@ SOURCE=..\sql\item_func.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\item_geofunc.cpp
# End Source File
# Begin Source File
SOURCE=.\item_row.cpp SOURCE=.\item_row.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -236,10 +240,6 @@ SOURCE=..\sql\mf_iocache.cpp ...@@ -236,10 +240,6 @@ SOURCE=..\sql\mf_iocache.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\mini_client.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\net_serv.cpp SOURCE=..\sql\net_serv.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -256,6 +256,10 @@ SOURCE=..\sql\opt_sum.cpp ...@@ -256,6 +256,10 @@ SOURCE=..\sql\opt_sum.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\libmysql\pack.c
# End Source File
# Begin Source File
SOURCE=..\libmysql\password.c SOURCE=..\libmysql\password.c
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -88,6 +88,10 @@ LINK32=link.exe ...@@ -88,6 +88,10 @@ LINK32=link.exe
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File # Begin Source File
SOURCE=..\mysys\mf_tempdir.c
# End Source File
# Begin Source File
SOURCE=..\client\mysqlbinlog.cpp SOURCE=..\client\mysqlbinlog.cpp
# End Source File # End Source File
# End Group # End Group
......
...@@ -84,10 +84,6 @@ LIB32=xilink6.exe -lib ...@@ -84,10 +84,6 @@ LIB32=xilink6.exe -lib
# Name "mysqldemb - Win32 Debug" # Name "mysqldemb - Win32 Debug"
# Begin Source File # Begin Source File
SOURCE=..\sql\convert.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\derror.cpp SOURCE=..\sql\derror.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -220,10 +216,6 @@ SOURCE=..\sql\mf_iocache.cpp ...@@ -220,10 +216,6 @@ SOURCE=..\sql\mf_iocache.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\sql\mini_client.cpp
# End Source File
# Begin Source File
SOURCE=..\sql\net_serv.cpp SOURCE=..\sql\net_serv.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -178,7 +178,7 @@ LINK32=xilink6.exe ...@@ -178,7 +178,7 @@ LINK32=xilink6.exe
# Name "mysqld - Win32 Max" # Name "mysqld - Win32 Max"
# Begin Source File # Begin Source File
SOURCE=.\convert.cpp SOURCE=.\client.c
!IF "$(CFG)" == "mysqld - Win32 Release" !IF "$(CFG)" == "mysqld - Win32 Release"
...@@ -486,6 +486,10 @@ SOURCE=.\item_func.cpp ...@@ -486,6 +486,10 @@ SOURCE=.\item_func.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\item_geofunc.cpp
# End Source File
# Begin Source File
SOURCE=.\item_row.cpp SOURCE=.\item_row.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -656,10 +660,6 @@ SOURCE=.\mf_iocache.cpp ...@@ -656,10 +660,6 @@ SOURCE=.\mf_iocache.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\mini_client.cpp
# End Source File
# Begin Source File
SOURCE=..\myisammrg\myrg_rnext_same.c SOURCE=..\myisammrg\myrg_rnext_same.c
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -742,6 +742,10 @@ SOURCE=.\OPT_SUM.cpp ...@@ -742,6 +742,10 @@ SOURCE=.\OPT_SUM.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\pack.c
# End Source File
# Begin Source File
SOURCE=.\password.c SOURCE=.\password.c
!IF "$(CFG)" == "mysqld - Win32 Release" !IF "$(CFG)" == "mysqld - Win32 Release"
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
#include <locale.h> #include <locale.h>
#endif #endif
const char *VER= "14.0"; const char *VER= "14.1";
/* Don't try to make a nice table if the data is too big */ /* Don't try to make a nice table if the data is too big */
#define MAX_COLUMN_LENGTH 1024 #define MAX_COLUMN_LENGTH 1024
...@@ -200,7 +200,9 @@ static int com_nopager(String *str, char*), com_pager(String *str, char*), ...@@ -200,7 +200,9 @@ static int com_nopager(String *str, char*), com_pager(String *str, char*),
static int read_lines(bool execute_commands); static int read_lines(bool execute_commands);
static int sql_connect(char *host,char *database,char *user,char *password, static int sql_connect(char *host,char *database,char *user,char *password,
uint silent); uint silent);
static int put_info(const char *str,INFO_TYPE info,uint error=0); static int put_info(const char *str,INFO_TYPE info,uint error=0,
const char *sql_state=0);
static int put_error(MYSQL *mysql);
static void safe_put_field(const char *pos,ulong length); static void safe_put_field(const char *pos,ulong length);
static void xmlencode_print(const char *src, uint length); static void xmlencode_print(const char *src, uint length);
static void init_pager(); static void init_pager();
...@@ -1437,7 +1439,7 @@ int mysql_real_query_for_lazy(const char *buf, int length) ...@@ -1437,7 +1439,7 @@ int mysql_real_query_for_lazy(const char *buf, int length)
{ {
if (!mysql_real_query(&mysql,buf,length)) if (!mysql_real_query(&mysql,buf,length))
return 0; return 0;
uint error=put_info(mysql_error(&mysql),INFO_ERROR, mysql_errno(&mysql)); int error= put_error(&mysql);
if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR || retry > 1 || if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR || retry > 1 ||
!opt_reconnect) !opt_reconnect)
return error; return error;
...@@ -1452,8 +1454,7 @@ int mysql_store_result_for_lazy(MYSQL_RES **result) ...@@ -1452,8 +1454,7 @@ int mysql_store_result_for_lazy(MYSQL_RES **result)
return 0; return 0;
if (mysql_error(&mysql)[0]) if (mysql_error(&mysql)[0])
return put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql)); return put_error(&mysql);
return 0; return 0;
} }
...@@ -1664,9 +1665,7 @@ com_go(String *buffer,char *line __attribute__((unused))) ...@@ -1664,9 +1665,7 @@ com_go(String *buffer,char *line __attribute__((unused)))
if (quick) if (quick)
{ {
if (!(result=mysql_use_result(&mysql)) && mysql_field_count(&mysql)) if (!(result=mysql_use_result(&mysql)) && mysql_field_count(&mysql))
{ return put_error(&mysql);
return put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql));
}
} }
else else
{ {
...@@ -1728,7 +1727,7 @@ com_go(String *buffer,char *line __attribute__((unused))) ...@@ -1728,7 +1727,7 @@ com_go(String *buffer,char *line __attribute__((unused)))
put_info("",INFO_RESULT); // Empty row put_info("",INFO_RESULT); // Empty row
if (result && !mysql_eof(result)) /* Something wrong when using quick */ if (result && !mysql_eof(result)) /* Something wrong when using quick */
error=put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql)); error= put_error(&mysql);
else if (unbuffered) else if (unbuffered)
fflush(stdout); fflush(stdout);
mysql_free_result(result); mysql_free_result(result);
...@@ -2442,12 +2441,12 @@ com_use(String *buffer __attribute__((unused)), char *line) ...@@ -2442,12 +2441,12 @@ com_use(String *buffer __attribute__((unused)), char *line)
if (mysql_select_db(&mysql,tmp)) if (mysql_select_db(&mysql,tmp))
{ {
if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR) if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR)
return put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql)); return put_error(&mysql);
if (reconnect()) if (reconnect())
return opt_reconnect ? -1 : 1; // Fatal error return opt_reconnect ? -1 : 1; // Fatal error
if (mysql_select_db(&mysql,tmp)) if (mysql_select_db(&mysql,tmp))
return put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql)); return put_error(&mysql);
} }
my_free(current_db,MYF(MY_ALLOW_ZERO_PTR)); my_free(current_db,MYF(MY_ALLOW_ZERO_PTR));
current_db=my_strdup(tmp,MYF(MY_WME)); current_db=my_strdup(tmp,MYF(MY_WME));
...@@ -2569,7 +2568,7 @@ sql_real_connect(char *host,char *database,char *user,char *password, ...@@ -2569,7 +2568,7 @@ sql_real_connect(char *host,char *database,char *user,char *password,
(mysql_errno(&mysql) != CR_CONN_HOST_ERROR && (mysql_errno(&mysql) != CR_CONN_HOST_ERROR &&
mysql_errno(&mysql) != CR_CONNECTION_ERROR)) mysql_errno(&mysql) != CR_CONNECTION_ERROR))
{ {
put_info(mysql_error(&mysql),INFO_ERROR,mysql_errno(&mysql)); (void) put_error(&mysql);
(void) fflush(stdout); (void) fflush(stdout);
return ignore_errors ? -1 : 1; // Abort return ignore_errors ? -1 : 1; // Abort
} }
...@@ -2719,7 +2718,7 @@ select_limit, max_join_size); ...@@ -2719,7 +2718,7 @@ select_limit, max_join_size);
static int static int
put_info(const char *str,INFO_TYPE info_type,uint error) put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate)
{ {
FILE *file= (info_type == INFO_ERROR ? stderr : stdout); FILE *file= (info_type == INFO_ERROR ? stderr : stdout);
static int inited=0; static int inited=0;
...@@ -2764,7 +2763,12 @@ put_info(const char *str,INFO_TYPE info_type,uint error) ...@@ -2764,7 +2763,12 @@ put_info(const char *str,INFO_TYPE info_type,uint error)
putchar('\007'); /* This should make a bell */ putchar('\007'); /* This should make a bell */
vidattr(A_STANDOUT); vidattr(A_STANDOUT);
if (error) if (error)
(void) tee_fprintf(file, "ERROR %d: ", error); {
if (sqlstate)
(void) tee_fprintf(file, "ERROR %d (%s): ", error, sqlstate);
else
(void) tee_fprintf(file, "ERROR %d: ", error);
}
else else
tee_puts("ERROR: ", file); tee_puts("ERROR: ", file);
} }
...@@ -2779,6 +2783,14 @@ put_info(const char *str,INFO_TYPE info_type,uint error) ...@@ -2779,6 +2783,14 @@ put_info(const char *str,INFO_TYPE info_type,uint error)
} }
static int
put_error(MYSQL *mysql)
{
return put_info(mysql_error(mysql), INFO_ERROR, mysql_errno(mysql),
mysql_sqlstate(mysql));
}
static void remove_cntrl(String &buffer) static void remove_cntrl(String &buffer)
{ {
char *start,*end; char *start,*end;
...@@ -2929,14 +2941,18 @@ static const char* construct_prompt() ...@@ -2929,14 +2941,18 @@ static const char* construct_prompt()
add_int_to_prompt(++prompt_counter); add_int_to_prompt(++prompt_counter);
break; break;
case 'v': case 'v':
processed_prompt.append(mysql_get_server_info(&mysql)); if (connected)
processed_prompt.append(mysql_get_server_info(&mysql));
else
processed_prompt.append("not_connected");
break; break;
case 'd': case 'd':
processed_prompt.append(current_db ? current_db : "(none)"); processed_prompt.append(current_db ? current_db : "(none)");
break; break;
case 'h': case 'h':
{ {
const char *prompt=mysql_get_host_info(&mysql); const char *prompt;
prompt= connected ? mysql_get_host_info(&mysql) : "not_connected";
if (strstr(prompt, "Localhost")) if (strstr(prompt, "Localhost"))
processed_prompt.append("localhost"); processed_prompt.append("localhost");
else else
...@@ -2948,8 +2964,13 @@ static const char* construct_prompt() ...@@ -2948,8 +2964,13 @@ static const char* construct_prompt()
} }
case 'p': case 'p':
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
if (!connected)
{
processed_prompt.append("not_connected");
break;
}
if (strstr(mysql_get_host_info(&mysql),"TCP/IP") || if (strstr(mysql_get_host_info(&mysql),"TCP/IP") ||
! mysql.unix_socket) !mysql.unix_socket)
add_int_to_prompt(mysql.port); add_int_to_prompt(mysql.port);
else else
{ {
...@@ -3097,4 +3118,3 @@ void sql_element_free(void *ptr) ...@@ -3097,4 +3118,3 @@ void sql_element_free(void *ptr)
my_free((gptr) ptr,MYF(0)); my_free((gptr) ptr,MYF(0));
} }
#endif /* EMBEDDED_LIBRARY */ #endif /* EMBEDDED_LIBRARY */
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
**********************************************************************/ **********************************************************************/
#define MTEST_VERSION "1.27" #define MTEST_VERSION "1.28"
#include <my_global.h> #include <my_global.h>
#include <mysql_embed.h> #include <mysql_embed.h>
...@@ -523,8 +523,12 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char* fname) ...@@ -523,8 +523,12 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char* fname)
if (!my_stat(eval_file, &stat_info, MYF(MY_WME))) if (!my_stat(eval_file, &stat_info, MYF(MY_WME)))
die(NullS); die(NullS);
if (!eval_result && stat_info.st_size != ds->length) if (!eval_result && (uint) stat_info.st_size != ds->length)
{
DBUG_PRINT("info",("Size differs: result size: %u file size: %u",
ds->length, stat_info.st_size));
DBUG_RETURN(2); DBUG_RETURN(2);
}
if (!(tmp = (char*) my_malloc(stat_info.st_size + 1, MYF(MY_WME)))) if (!(tmp = (char*) my_malloc(stat_info.st_size + 1, MYF(MY_WME))))
die(NullS); die(NullS);
...@@ -2147,6 +2151,10 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -2147,6 +2151,10 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
if (i == 0 && q->expected_errors == 1) if (i == 0 && q->expected_errors == 1)
{ {
/* Only log error if there is one possible error */ /* Only log error if there is one possible error */
dynstr_append_mem(ds,"ERROR ",6);
replace_dynstr_append_mem(ds, mysql_sqlstate(mysql),
strlen(mysql_sqlstate(mysql)));
dynstr_append_mem(ds,": ",2);
replace_dynstr_append_mem(ds,mysql_error(mysql), replace_dynstr_append_mem(ds,mysql_error(mysql),
strlen(mysql_error(mysql))); strlen(mysql_error(mysql)));
dynstr_append_mem(ds,"\n",1); dynstr_append_mem(ds,"\n",1);
......
...@@ -359,7 +359,7 @@ then ...@@ -359,7 +359,7 @@ then
# we will gets some problems when linking static programs. # we will gets some problems when linking static programs.
# The following code is used to fix this problem. # The following code is used to fix this problem.
if test "$CXX" = "gcc" if test "$CXX" = "gcc" -o "$CXX" = "ccache gcc"
then then
if $CXX -v 2>&1 | grep 'version 3' > /dev/null 2>&1 if $CXX -v 2>&1 | grep 'version 3' > /dev/null 2>&1
then then
...@@ -1023,8 +1023,16 @@ case $SYSTEM_TYPE in ...@@ -1023,8 +1023,16 @@ case $SYSTEM_TYPE in
;; ;;
*freebsd*) *freebsd*)
echo "Adding fix for interrupted reads" echo "Adding fix for interrupted reads"
CFLAGS="$CFLAGS -DHAVE_BROKEN_REALPATH" OSVERSION=`sysctl -a | grep osreldate | awk '{ print $2 }'`
CXXFLAGS="$CXXFLAGS -DMYSQLD_NET_RETRY_COUNT=1000000 -DHAVE_BROKEN_REALPATH" if test "$OSVERSION" -gt "480100" && \
test "$OSVERSION" -lt "500000" || \
test "$OSVERSION" -gt "500109"
then
CXXFLAGS="$CXXFLAGS -DMYSQLD_NET_RETRY_COUNT=1000000"
else
CFLAGS="$CFLAGS -DHAVE_BROKEN_REALPATH"
CXXFLAGS="$CXXFLAGS -DMYSQLD_NET_RETRY_COUNT=1000000 -DHAVE_BROKEN_REALPATH"
fi
;; ;;
*netbsd*) *netbsd*)
echo "Adding flag -Dunix" echo "Adding flag -Dunix"
......
...@@ -280,7 +280,7 @@ static BOOLEAN Writable(char *pathname); ...@@ -280,7 +280,7 @@ static BOOLEAN Writable(char *pathname);
static void ChangeOwner(char *pathname); static void ChangeOwner(char *pathname);
/* Allocate memory for runtime support */ /* Allocate memory for runtime support */
#endif #endif
static char *DbugMalloc(int size); static char *DbugMalloc(size_t size);
/* Remove leading pathname components */ /* Remove leading pathname components */
static char *BaseName(const char *pathname); static char *BaseName(const char *pathname);
static void DoPrefix(uint line); static void DoPrefix(uint line);
...@@ -1120,7 +1120,7 @@ static void PushState () ...@@ -1120,7 +1120,7 @@ static void PushState ()
init_done=TRUE; init_done=TRUE;
} }
(void) code_state(); /* Alloc memory */ (void) code_state(); /* Alloc memory */
new_malloc = (struct state *) DbugMalloc (sizeof (struct state)); new_malloc = (struct state *) DbugMalloc(sizeof (struct state));
new_malloc -> flags = 0; new_malloc -> flags = 0;
new_malloc -> delay = 0; new_malloc -> delay = 0;
new_malloc -> maxdepth = MAXDEPTH; new_malloc -> maxdepth = MAXDEPTH;
...@@ -1341,11 +1341,10 @@ struct link *linkp) ...@@ -1341,11 +1341,10 @@ struct link *linkp)
*/ */
static char *StrDup ( static char *StrDup (const char *str)
const char *str)
{ {
reg1 char *new_malloc; reg1 char *new_malloc;
new_malloc = DbugMalloc ((int) strlen (str) + 1); new_malloc = DbugMalloc((size_t) strlen (str) + 1);
(void) strcpy (new_malloc, str); (void) strcpy (new_malloc, str);
return (new_malloc); return (new_malloc);
} }
...@@ -1606,14 +1605,13 @@ static void DbugExit (const char *why) ...@@ -1606,14 +1605,13 @@ static void DbugExit (const char *why)
* *
*/ */
static char *DbugMalloc ( static char *DbugMalloc (size_t size)
int size)
{ {
register char *new_malloc; register char *new_malloc;
if (!(new_malloc = (char*) malloc ((unsigned int) size))) if (!(new_malloc = (char*) malloc((size_t) size)))
DbugExit ("out of memory"); DbugExit ("out of memory");
return (new_malloc); return (new_malloc);
} }
...@@ -1622,9 +1620,7 @@ int size) ...@@ -1622,9 +1620,7 @@ int size)
* separator (to allow directory-paths in dos). * separator (to allow directory-paths in dos).
*/ */
static char *static_strtok ( static char *static_strtok (char *s1, pchar separator)
char *s1,
pchar separator)
{ {
static char *end = NULL; static char *end = NULL;
reg1 char *rtnval,*cpy; reg1 char *rtnval,*cpy;
......
...@@ -138,6 +138,11 @@ typedef uint rf_SetTimer; ...@@ -138,6 +138,11 @@ typedef uint rf_SetTimer;
#define SIZEOF_LONG 4 #define SIZEOF_LONG 4
#define SIZEOF_LONG_LONG 8 #define SIZEOF_LONG_LONG 8
#define SIZEOF_OFF_T 8 #define SIZEOF_OFF_T 8
#ifdef _WIN64
#define SIZEOF_CHARP 8
#else
#define SIZEOF_CHARP 4
#endif
#define HAVE_BROKEN_NETINET_INCLUDES #define HAVE_BROKEN_NETINET_INCLUDES
#ifdef __NT__ #ifdef __NT__
#define HAVE_NAMED_PIPE /* We can only create pipes on NT */ #define HAVE_NAMED_PIPE /* We can only create pipes on NT */
...@@ -203,6 +208,7 @@ inline double ulonglong2double(ulonglong value) ...@@ -203,6 +208,7 @@ inline double ulonglong2double(ulonglong value)
/* Optimized store functions for Intel x86 */ /* Optimized store functions for Intel x86 */
#ifndef _WIN64
#define sint2korr(A) (*((int16 *) (A))) #define sint2korr(A) (*((int16 *) (A)))
#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \ #define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \
(((uint32) 255L << 24) | \ (((uint32) 255L << 24) | \
...@@ -243,7 +249,7 @@ inline double ulonglong2double(ulonglong value) ...@@ -243,7 +249,7 @@ inline double ulonglong2double(ulonglong value)
#define float8get(V,M) doubleget((V),(M)) #define float8get(V,M) doubleget((V),(M))
#define float4store(V,M) memcpy((byte*) V,(byte*) (&M),sizeof(float)) #define float4store(V,M) memcpy((byte*) V,(byte*) (&M),sizeof(float))
#define float8store(V,M) doublestore((V),(M)) #define float8store(V,M) doublestore((V),(M))
#endif /* _WIN64 */
#define HAVE_PERROR #define HAVE_PERROR
#define HAVE_VFPRINT #define HAVE_VFPRINT
...@@ -333,3 +339,5 @@ inline double ulonglong2double(ulonglong value) ...@@ -333,3 +339,5 @@ inline double ulonglong2double(ulonglong value)
#define shared_memory_buffer_length 16000 #define shared_memory_buffer_length 16000
#define default_shared_memory_base_name "MYSQL" #define default_shared_memory_base_name "MYSQL"
#define MYSQL_DEFAULT_CHARSET_NAME "latin1"
#define MYSQL_DEFAULT_COLLATION_NAME "latin1_swedish_ci"
...@@ -74,14 +74,14 @@ ...@@ -74,14 +74,14 @@
/* Unixware 7 */ /* Unixware 7 */
#if !defined(HAVE_BFILL) #if !defined(HAVE_BFILL)
# define bfill(A,B,C) memset((A),(C),(B)) # define bfill(A,B,C) memset((A),(C),(B))
# define bmove_allign(A,B,C) memcpy((A),(B),(C)) # define bmove_align(A,B,C) memcpy((A),(B),(C))
#endif #endif
#if !defined(HAVE_BCMP) #if !defined(HAVE_BCMP)
# define bcopy(s, d, n) memcpy((d), (s), (n)) # define bcopy(s, d, n) memcpy((d), (s), (n))
# define bcmp(A,B,C) memcmp((A),(B),(C)) # define bcmp(A,B,C) memcmp((A),(B),(C))
# define bzero(A,B) memset((A),0,(B)) # define bzero(A,B) memset((A),0,(B))
# define bmove_allign(A,B,C) memcpy((A),(B),(C)) # define bmove_align(A,B,C) memcpy((A),(B),(C))
#endif #endif
#if defined(__cplusplus) && !defined(OS2) #if defined(__cplusplus) && !defined(OS2)
...@@ -111,11 +111,11 @@ extern char NEAR _dig_vec[]; /* Declared in int2str() */ ...@@ -111,11 +111,11 @@ extern char NEAR _dig_vec[]; /* Declared in int2str() */
#endif #endif
#ifdef MSDOS #ifdef MSDOS
#undef bmove_allign #undef bmove_align
#define bmove512(A,B,C) bmove_allign(A,B,C) #define bmove512(A,B,C) bmove_align(A,B,C)
#define my_itoa(A,B,C) itoa(A,B,C) #define my_itoa(A,B,C) itoa(A,B,C)
#define my_ltoa(A,B,C) ltoa(A,B,C) #define my_ltoa(A,B,C) ltoa(A,B,C)
extern void bmove_allign(gptr dst,const gptr src,uint len); extern void bmove_align(gptr dst,const gptr src,uint len);
#endif #endif
#if (!defined(USE_BMOVE512) || defined(HAVE_purify)) && !defined(bmove512) #if (!defined(USE_BMOVE512) || defined(HAVE_purify)) && !defined(bmove512)
......
/* Copyright (C) 2000 MySQL AB /* Copyright (C) 2000-2003 MySQL AB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -266,7 +266,7 @@ C_MODE_END ...@@ -266,7 +266,7 @@ C_MODE_END
# endif # endif
#endif /* TIME_WITH_SYS_TIME */ #endif /* TIME_WITH_SYS_TIME */
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
#if defined(HAVE_OPENSSL) && !defined(__FreeBSD__) && !defined(NeXT) #if defined(HAVE_OPENSSL) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__)
#define crypt unistd_crypt #define crypt unistd_crypt
#endif #endif
#include <unistd.h> #include <unistd.h>
...@@ -654,7 +654,13 @@ extern double my_atof(const char*); ...@@ -654,7 +654,13 @@ extern double my_atof(const char*);
Max size that must be added to a so that we know Size to make Max size that must be added to a so that we know Size to make
adressable obj. adressable obj.
*/ */
#if SIZEOF_CHARP == 4
typedef long my_ptrdiff_t; typedef long my_ptrdiff_t;
#else
typedef long long my_ptrdiff_t;
#endif
#define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1)) #define MY_ALIGN(A,L) (((A) + (L) - 1) & ~((L) - 1))
#define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double)) #define ALIGN_SIZE(A) MY_ALIGN((A),sizeof(double))
/* Size to make adressable obj. */ /* Size to make adressable obj. */
...@@ -731,6 +737,8 @@ typedef unsigned __int64 my_ulonglong; ...@@ -731,6 +737,8 @@ typedef unsigned __int64 my_ulonglong;
typedef unsigned long long my_ulonglong; typedef unsigned long long my_ulonglong;
#endif #endif
/* typedef used for length of string; Should be unsigned! */
typedef ulong size_str;
#ifdef USE_RAID #ifdef USE_RAID
/* /*
...@@ -869,7 +877,7 @@ typedef char bool; /* Ordinary boolean values 0 1 */ ...@@ -869,7 +877,7 @@ typedef char bool; /* Ordinary boolean values 0 1 */
*/ */
/* Optimized store functions for Intel x86 */ /* Optimized store functions for Intel x86 */
#ifdef __i386__ #if defined(__i386__) && !defined(_WIN64)
#define sint2korr(A) (*((int16 *) (A))) #define sint2korr(A) (*((int16 *) (A)))
#define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \ #define sint3korr(A) ((int32) ((((uchar) (A)[2]) & 128) ? \
(((uint32) 255L << 24) | \ (((uint32) 255L << 24) | \
......
...@@ -268,7 +268,8 @@ typedef struct st_mysql ...@@ -268,7 +268,8 @@ typedef struct st_mysql
my_bool free_me; /* If free in mysql_close */ my_bool free_me; /* If free in mysql_close */
my_ulonglong insert_id; /* id if insert on table with NEXTNR */ my_ulonglong insert_id; /* id if insert on table with NEXTNR */
unsigned int last_errno; unsigned int last_errno;
char *last_error; char *last_error; /* Used by embedded server */
char sqlstate[SQLSTATE_LENGTH+1]; /* Used by embedded server */
} MYSQL; } MYSQL;
#endif #endif
...@@ -566,6 +567,7 @@ unsigned long STDCALL mysql_param_count(MYSQL_STMT * stmt); ...@@ -566,6 +567,7 @@ unsigned long STDCALL mysql_param_count(MYSQL_STMT * stmt);
my_bool STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd); my_bool STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
my_bool STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); my_bool STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt);
unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt);
const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt); const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt);
const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt); const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt);
......
...@@ -324,6 +324,7 @@ my_bool check_scramble(const char *, const char *message, ...@@ -324,6 +324,7 @@ my_bool check_scramble(const char *, const char *message,
unsigned long *salt,my_bool old_ver); unsigned long *salt,my_bool old_ver);
char *get_tty_password(char *opt_message); char *get_tty_password(char *opt_message);
void hash_password(unsigned long *result, const char *password); void hash_password(unsigned long *result, const char *password);
const char *mysql_errno_to_sqlstate(uint mysql_errno);
/* Some other useful functions */ /* Some other useful functions */
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#else #else
#define PROTOCOL_VERSION @PROTOCOL_VERSION@ #define PROTOCOL_VERSION @PROTOCOL_VERSION@
#define MYSQL_SERVER_VERSION "@VERSION@" #define MYSQL_SERVER_VERSION "@VERSION@"
#define MYSQL_BASE_VERSION "mysqld-@MYSQL_BASE_VERSION@"
#ifndef MYSQL_SERVER_SUFFIX #ifndef MYSQL_SERVER_SUFFIX
#define MYSQL_SERVER_SUFFIX "@MYSQL_SERVER_SUFFIX@" #define MYSQL_SERVER_SUFFIX "@MYSQL_SERVER_SUFFIX@"
#endif #endif
......
...@@ -282,4 +282,6 @@ ...@@ -282,4 +282,6 @@
#define ER_WARN_DATA_TRUNCATED 1263 #define ER_WARN_DATA_TRUNCATED 1263
#define ER_WARN_USING_OTHER_HANDLER 1264 #define ER_WARN_USING_OTHER_HANDLER 1264
#define ER_CANT_AGGREGATE_COLLATIONS 1265 #define ER_CANT_AGGREGATE_COLLATIONS 1265
#define ER_DROP_USER 1266
#define ER_REVOKE_GRANTS 1267
#define ER_ERROR_MESSAGES 266 #define ER_ERROR_MESSAGES 266
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
extern const char *unknown_sqlstate; extern const char *unknown_sqlstate;
extern const char *not_error_sqlstate;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
......
/* Copyright (C) 2000-2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/*
This file includes a mapping from mysql_errno.h to sql_state (as used by
MyODBC) and jdbc_state.
It's suitable to include into a C struct for further processing
The first column is the mysqld server error (declared in mysqld_error.h),
the second column is the ODBC state (which the 4.1 server sends out by
default) and the last is the state used by the JDBC driver.
If the last column is "" then it means that the JDBC driver is using the
ODBC state
The errors in this file is sorted in the same order as in mysqld_error.h
to allow on to do binary searches for the sqlstate.
*/
ER_DUP_KEY, "23000", "",
ER_OUTOFMEMORY, "HY001", "S1001",
ER_OUT_OF_SORTMEMORY, "HY001", "S1001",
ER_CON_COUNT_ERROR, "08004", "",
ER_BAD_HOST_ERROR, "08S01", "",
ER_HANDSHAKE_ERROR, "08S01", "",
ER_DBACCESS_DENIED_ERROR, "42000", "",
ER_ACCESS_DENIED_ERROR, "42000", "28000",
ER_NO_DB_ERROR, "42000", "",
ER_UNKNOWN_COM_ERROR, "08S01", "",
ER_BAD_NULL_ERROR, "23000", "",
ER_BAD_DB_ERROR, "42000", "",
ER_TABLE_EXISTS_ERROR, "42S01", "",
ER_BAD_TABLE_ERROR, "42S02", "",
ER_NON_UNIQ_ERROR, "23000", "",
ER_SERVER_SHUTDOWN, "08S01", "",
ER_BAD_FIELD_ERROR, "42S22", "S0022",
ER_WRONG_FIELD_WITH_GROUP, "42000", "S1009",
ER_WRONG_GROUP_FIELD, "42000", "S1009",
ER_WRONG_SUM_SELECT, "42000", "S1009",
ER_WRONG_VALUE_COUNT, "21S01", "",
ER_TOO_LONG_IDENT, "42000", "S1009",
ER_DUP_FIELDNAME, "42S21", "S1009",
ER_DUP_KEYNAME, "42000", "S1009",
ER_DUP_ENTRY, "23000", "S1009",
ER_WRONG_FIELD_SPEC, "42000", "S1009",
ER_PARSE_ERROR, "42000", "",
ER_EMPTY_QUERY, "42000" , "",
ER_NONUNIQ_TABLE, "42000", "S1009",
ER_INVALID_DEFAULT, "42000", "S1009",
ER_MULTIPLE_PRI_KEY, "42000", "S1009",
ER_TOO_MANY_KEYS, "42000", "S1009",
ER_TOO_MANY_KEY_PARTS, "42000", "S1009",
ER_TOO_LONG_KEY, "42000", "S1009",
ER_KEY_COLUMN_DOES_NOT_EXITS, "42000", "S1009",
ER_BLOB_USED_AS_KEY, "42000", "S1009",
ER_TOO_BIG_FIELDLENGTH, "42000", "S1009",
ER_WRONG_AUTO_KEY, "42000", "S1009",
ER_FORCING_CLOSE, "08S01", "",
ER_IPSOCK_ERROR, "088S01", "",
ER_NO_SUCH_INDEX, "42S12", "S1009",
ER_WRONG_FIELD_TERMINATORS, "42000", "S1009",
ER_BLOBS_AND_NO_TERMINATED, "42000", "S1009",
ER_CANT_REMOVE_ALL_FIELDS, "42000", "",
ER_CANT_DROP_FIELD_OR_KEY, "42000", "",
ER_BLOB_CANT_HAVE_DEFAULT, "42000", "",
ER_WRONG_DB_NAME, "42000", "",
ER_WRONG_TABLE_NAME, "42000", "",
ER_TOO_BIG_SELECT, "42000", "",
ER_UNKNOWN_PROCEDURE, "42000", "",
ER_WRONG_PARAMCOUNT_TO_PROCEDURE, "42000", "",
ER_UNKNOWN_TABLE, "42S02", "",
ER_FIELD_SPECIFIED_TWICE, "42000", "",
ER_UNSUPPORTED_EXTENSION, "42000", "",
ER_TABLE_MUST_HAVE_COLUMNS, "42000", "",
ER_UNKNOWN_CHARACTER_SET, "42000", "",
ER_TOO_BIG_ROWSIZE, "42000", "",
ER_STACK_OVERRUN, "HY000", "",
ER_WRONG_OUTER_JOIN, "42000", "",
ER_NULL_COLUMN_IN_INDEX, "42000", "",
ER_PASSWORD_ANONYMOUS_USER, "42000", "",
ER_PASSWORD_NOT_ALLOWED, "42000", "",
ER_PASSWORD_NO_MATCH, "42000", "",
ER_WRONG_VALUE_COUNT_ON_ROW, "21S01", "",
ER_INVALID_USE_OF_NULL, "42000", "",
ER_REGEXP_ERROR, "42000", "",
ER_MIX_OF_GROUP_FUNC_AND_FIELDS,"42000", "",
ER_NONEXISTING_GRANT, "42000", "",
ER_TABLEACCESS_DENIED_ERROR, "42000", "",
ER_COLUMNACCESS_DENIED_ERROR, "42000", "",
ER_ILLEGAL_GRANT_FOR_TABLE, "42000", "",
ER_GRANT_WRONG_HOST_OR_USER, "42000", "",
ER_NO_SUCH_TABLE, "42S02", "",
ER_NONEXISTING_TABLE_GRANT, "42000", "",
ER_NOT_ALLOWED_COMMAND, "42000", "",
ER_SYNTAX_ERROR, "42000", "",
ER_ABORTING_CONNECTION, "08S01", "",
ER_NET_PACKET_TOO_LARGE, "08S01", "",
ER_NET_READ_ERROR_FROM_PIPE, "08S01", "",
ER_NET_FCNTL_ERROR, "08S01", "",
ER_NET_PACKETS_OUT_OF_ORDER, "08S01", "",
ER_NET_UNCOMPRESS_ERROR, "08S01", "",
ER_NET_READ_ERROR, "08S01", "",
ER_NET_READ_INTERRUPTED, "08S01", "",
ER_NET_ERROR_ON_WRITE, "08S01", "",
ER_NET_WRITE_INTERRUPTED, "08S01", "",
ER_TOO_LONG_STRING, "42000", "",
ER_TABLE_CANT_HANDLE_BLOB, "42000", "",
ER_TABLE_CANT_HANDLE_AUTO_INCREMENT, "42000", "",
ER_WRONG_COLUMN_NAME, "42000", "",
ER_WRONG_KEY_COLUMN, "42000", "",
ER_DUP_UNIQUE, "23000", "",
ER_BLOB_KEY_WITHOUT_LENGTH, "42000", "",
ER_PRIMARY_CANT_HAVE_NULL, "42000", "",
ER_TOO_MANY_ROWS, "42000", "",
ER_REQUIRES_PRIMARY_KEY, "42000", "",
ER_CHECK_NO_SUCH_TABLE, "42000", "",
ER_CHECK_NOT_IMPLEMENTED, "42000", "",
ER_CANT_DO_THIS_DURING_AN_TRANSACTION, "25000", "",
ER_ERROR_DURING_COMMIT, "HY000", "",
ER_ERROR_DURING_ROLLBACK, "HY000", "",
ER_NEW_ABORTING_CONNECTION, "08S01", "",
ER_MASTER_NET_READ, "08S01", "",
ER_MASTER_NET_WRITE, "08S01", "",
ER_TOO_MANY_USER_CONNECTIONS, "42000", "",
ER_READ_ONLY_TRANSACTION, "25000", "",
ER_NO_PERMISSION_TO_CREATE_USER,"42000", "",
ER_LOCK_DEADLOCK, "40001", "",
ER_NO_REFERENCED_ROW, "23000", "",
ER_ROW_IS_REFERENCED, "23000", "",
ER_CONNECT_TO_MASTER, "08S01", "",
ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT,"21000", "",
ER_USER_LIMIT_REACHED, "42000", "",
ER_NO_DEFAULT, "42000", "",
ER_WRONG_VALUE_FOR_VAR, "42000", "",
ER_WRONG_TYPE_FOR_VAR, "42000", "",
ER_CANT_USE_OPTION_HERE, "42000", "",
ER_NOT_SUPPORTED_YET, "42000", "",
ER_WRONG_FK_DEF, "42000", "",
ER_CARDINALITY_COL, "21000", "",
ER_SUBSELECT_NO_1_ROW, "21000", "",
ER_ILLEGAL_REFERENCE, "42S22", "",
ER_DERIVED_MUST_HAVE_ALIAS, "42000", "",
ER_SELECT_REDUCED, "01000", "",
ER_TABLENAME_NOT_ALLOWED_HERE, "42000", "",
ER_NOT_SUPPORTED_AUTH_MODE, "08004", "",
ER_SPATIAL_CANT_HAVE_NULL, "42000", "",
ER_COLLATION_CHARSET_MISMATCH, "42000", "",
ER_WARN_TOO_FEW_RECORDS, "01000", "",
ER_WARN_TOO_MANY_RECORDS, "01000", "",
ER_WARN_NULL_TO_NOTNULL, "01000", "",
ER_WARN_DATA_OUT_OF_RANGE, "01000", "",
ER_WARN_DATA_TRUNCATED, "01000", "",
...@@ -100,10 +100,10 @@ typedef struct st_alarm { ...@@ -100,10 +100,10 @@ typedef struct st_alarm {
#define thr_alarm_init(A) (*(A))=0 #define thr_alarm_init(A) (*(A))=0
#define thr_alarm_in_use(A) (*(A)!= 0) #define thr_alarm_in_use(A) (*(A)!= 0)
void init_thr_alarm(uint max_alarm); void init_thr_alarm(uint max_alarm);
bool thr_alarm(thr_alarm_t *alarmed, uint sec, ALARM *buff); my_bool thr_alarm(thr_alarm_t *alarmed, uint sec, ALARM *buff);
void thr_alarm_kill(pthread_t thread_id); void thr_alarm_kill(pthread_t thread_id);
void thr_end_alarm(thr_alarm_t *alarmed); void thr_end_alarm(thr_alarm_t *alarmed);
void end_thr_alarm(void); void end_thr_alarm(my_bool free_structures);
sig_handler process_alarm(int); sig_handler process_alarm(int);
#ifndef thr_got_alarm #ifndef thr_got_alarm
bool thr_got_alarm(thr_alarm_t *alrm); bool thr_got_alarm(thr_alarm_t *alrm);
......
...@@ -103,7 +103,8 @@ struct com_shm_endpoint_struct{ ...@@ -103,7 +103,8 @@ struct com_shm_endpoint_struct{
the area currently may contain a datagram; the area currently may contain a datagram;
NOTE: automatic event */ NOTE: automatic event */
os_event_t empty; /* this is in the signaled state if the area os_event_t empty; /* this is in the signaled state if the area
currently may be empty; NOTE: automatic event */ currently may be empty; NOTE: automatic
event */
ip_mutex_hdl_t* ip_mutex; /* handle to the interprocess mutex ip_mutex_hdl_t* ip_mutex; /* handle to the interprocess mutex
protecting the shared memory */ protecting the shared memory */
UT_LIST_NODE_T(com_shm_endpoint_t) list; /* If the endpoint struct UT_LIST_NODE_T(com_shm_endpoint_t) list; /* If the endpoint struct
...@@ -793,16 +794,18 @@ com_shm_create_or_open( ...@@ -793,16 +794,18 @@ com_shm_create_or_open(
ut_strcpy(buf + len, (char*)"_IBSHM_EV_NE"), ut_strcpy(buf + len, (char*)"_IBSHM_EV_NE"),
event_ne = os_event_create_auto(buf); event_ne = os_event_create(buf);
ut_ad(event_ne); ut_ad(event_ne);
ut_strcpy(buf + len, (char*)"_IBSHM_EV_EM"), ut_strcpy(buf + len, (char*)"_IBSHM_EV_EM"),
event_em = os_event_create_auto(buf); event_em = os_event_create(buf);
ut_ad(event_em); ut_ad(event_em);
ut_a(0); /* event_ne and event_em should be auto events! */
com_shm_endpoint_set_shm(ep, shm); com_shm_endpoint_set_shm(ep, shm);
com_shm_endpoint_set_map(ep, map); com_shm_endpoint_set_map(ep, map);
......
...@@ -301,6 +301,13 @@ os_aio( ...@@ -301,6 +301,13 @@ os_aio(
are ignored */ are ignored */
void* message2); void* message2);
/**************************************************************************** /****************************************************************************
Wakes up all async i/o threads so that they know to exit themselves in
shutdown. */
void
os_aio_wake_all_threads_at_shutdown(void);
/*=====================================*/
/****************************************************************************
Waits until there are no pending writes in os_aio_write_array. There can Waits until there are no pending writes in os_aio_write_array. There can
be other, synchronous, pending writes. */ be other, synchronous, pending writes. */
......
...@@ -10,15 +10,29 @@ Created 9/6/1995 Heikki Tuuri ...@@ -10,15 +10,29 @@ Created 9/6/1995 Heikki Tuuri
#define os0sync_h #define os0sync_h
#include "univ.i" #include "univ.i"
#include "ut0lst.h"
#ifdef __WIN__ #ifdef __WIN__
#define os_fast_mutex_t CRITICAL_SECTION #define os_fast_mutex_t CRITICAL_SECTION
typedef void* os_event_t;
#else typedef HANDLE os_native_event_t;
typedef struct os_event_struct os_event_struct_t;
typedef os_event_struct_t* os_event_t;
struct os_event_struct {
os_native_event_t handle;
/* Windows event */
UT_LIST_NODE_T(os_event_struct_t) os_event_list;
/* list of all created events */
};
#else
typedef pthread_mutex_t os_fast_mutex_t; typedef pthread_mutex_t os_fast_mutex_t;
typedef struct os_event_struct os_event_struct_t;
typedef os_event_struct_t* os_event_t;
struct os_event_struct { struct os_event_struct {
os_fast_mutex_t os_mutex; /* this mutex protects the next os_fast_mutex_t os_mutex; /* this mutex protects the next
fields */ fields */
...@@ -26,9 +40,9 @@ struct os_event_struct { ...@@ -26,9 +40,9 @@ struct os_event_struct {
not reserved */ not reserved */
pthread_cond_t cond_var; /* condition variable is used in pthread_cond_t cond_var; /* condition variable is used in
waiting for the event */ waiting for the event */
UT_LIST_NODE_T(os_event_struct_t) os_event_list;
/* list of all created events */
}; };
typedef struct os_event_struct os_event_struct_t;
typedef os_event_struct_t* os_event_t;
#endif #endif
typedef struct os_mutex_struct os_mutex_str_t; typedef struct os_mutex_struct os_mutex_str_t;
...@@ -38,10 +52,32 @@ typedef os_mutex_str_t* os_mutex_t; ...@@ -38,10 +52,32 @@ typedef os_mutex_str_t* os_mutex_t;
#define OS_SYNC_TIME_EXCEEDED 1 #define OS_SYNC_TIME_EXCEEDED 1
/* Mutex protecting counts and the event and OS 'slow' mutex lists */
extern os_mutex_t os_sync_mutex;
/* This is incremented by 1 in os_thread_create and decremented by 1 in
os_thread_exit */
extern ulint os_thread_count;
extern ulint os_event_count;
extern ulint os_mutex_count;
extern ulint os_fast_mutex_count;
/*************************************************************
Initializes global event and OS 'slow' mutex lists. */
void
os_sync_init(void);
/*==============*/
/************************************************************* /*************************************************************
Creates an event semaphore, i.e., a semaphore which may Frees created events and OS 'slow' mutexes. */
just have two states: signaled and nonsignaled.
The created event is manual reset: it must be reset void
os_sync_free(void);
/*==============*/
/*************************************************************
Creates an event semaphore, i.e., a semaphore which may just have two states:
signaled and nonsignaled. The created event is manual reset: it must be reset
explicitly by calling sync_os_reset_event. */ explicitly by calling sync_os_reset_event. */
os_event_t os_event_t
...@@ -50,10 +86,10 @@ os_event_create( ...@@ -50,10 +86,10 @@ os_event_create(
/* out: the event handle */ /* out: the event handle */
char* name); /* in: the name of the event, if NULL char* name); /* in: the name of the event, if NULL
the event is created without a name */ the event is created without a name */
#ifdef __WIN__
/************************************************************* /*************************************************************
Creates an auto-reset event semaphore, i.e., an event Creates an auto-reset event semaphore, i.e., an event which is automatically
which is automatically reset when a single thread is reset when a single thread is released. Works only in Windows. */
released. */
os_event_t os_event_t
os_event_create_auto( os_event_create_auto(
...@@ -61,6 +97,7 @@ os_event_create_auto( ...@@ -61,6 +97,7 @@ os_event_create_auto(
/* out: the event handle */ /* out: the event handle */
char* name); /* in: the name of the event, if NULL char* name); /* in: the name of the event, if NULL
the event is created without a name */ the event is created without a name */
#endif
/************************************************************** /**************************************************************
Sets an event semaphore to the signaled state: lets waiting threads Sets an event semaphore to the signaled state: lets waiting threads
proceed. */ proceed. */
...@@ -85,7 +122,10 @@ os_event_free( ...@@ -85,7 +122,10 @@ os_event_free(
/*==========*/ /*==========*/
os_event_t event); /* in: event to free */ os_event_t event); /* in: event to free */
/************************************************************** /**************************************************************
Waits for an event object until it is in the signaled state. */ Waits for an event object until it is in the signaled state. If
srv_shutdown_state == SRV_SHUTDOWN_EXIT_THREADS this also exits the
waiting thread when the event becomes signaled (or immediately if the
event is already in the signaled state). */
void void
os_event_wait( os_event_wait(
...@@ -93,7 +133,7 @@ os_event_wait( ...@@ -93,7 +133,7 @@ os_event_wait(
os_event_t event); /* in: event to wait */ os_event_t event); /* in: event to wait */
/************************************************************** /**************************************************************
Waits for an event object until it is in the signaled state or Waits for an event object until it is in the signaled state or
a timeout is exceeded. */ a timeout is exceeded. In Unix the timeout is always infinite. */
ulint ulint
os_event_wait_time( os_event_wait_time(
...@@ -104,8 +144,9 @@ os_event_wait_time( ...@@ -104,8 +144,9 @@ os_event_wait_time(
os_event_t event, /* in: event to wait */ os_event_t event, /* in: event to wait */
ulint time); /* in: timeout in microseconds, or ulint time); /* in: timeout in microseconds, or
OS_SYNC_INFINITE_TIME */ OS_SYNC_INFINITE_TIME */
#ifdef __WIN__
/************************************************************** /**************************************************************
Waits for any event in an event array. Returns if even a single Waits for any event in an OS native event array. Returns if even a single
one is signaled or becomes signaled. */ one is signaled or becomes signaled. */
ulint ulint
...@@ -113,14 +154,15 @@ os_event_wait_multiple( ...@@ -113,14 +154,15 @@ os_event_wait_multiple(
/*===================*/ /*===================*/
/* out: index of the event /* out: index of the event
which was signaled */ which was signaled */
ulint n, /* in: number of events in the ulint n, /* in: number of events in the
array */ array */
os_event_t* event_array); /* in: pointer to an array of event os_native_event_t* native_event_array);
/* in: pointer to an array of event
handles */ handles */
#endif
/************************************************************* /*************************************************************
Creates an operating system mutex semaphore. Creates an operating system mutex semaphore. Because these are slow, the
Because these are slow, the mutex semaphore of the database mutex semaphore of InnoDB itself (mutex_t) should be used where possible. */
itself (sync_mutex_t) should be used where possible. */
os_mutex_t os_mutex_t
os_mutex_create( os_mutex_create(
......
...@@ -44,4 +44,3 @@ os_fast_mutex_trylock( ...@@ -44,4 +44,3 @@ os_fast_mutex_trylock(
#endif #endif
#endif #endif
} }
...@@ -41,7 +41,6 @@ typedef os_thread_t os_thread_id_t; /* In Unix we use the thread ...@@ -41,7 +41,6 @@ typedef os_thread_t os_thread_id_t; /* In Unix we use the thread
the thread */ the thread */
#endif #endif
/* Define a function pointer type to use in a typecast */ /* Define a function pointer type to use in a typecast */
typedef void* (*os_posix_f_t) (void*); typedef void* (*os_posix_f_t) (void*);
...@@ -66,7 +65,9 @@ os_thread_pf( ...@@ -66,7 +65,9 @@ os_thread_pf(
/******************************************************************** /********************************************************************
Creates a new thread of execution. The execution starts from Creates a new thread of execution. The execution starts from
the function given. The start function takes a void* parameter the function given. The start function takes a void* parameter
and returns a ulint. */ and returns a ulint.
NOTE: We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */
os_thread_t os_thread_t
os_thread_create( os_thread_create(
...@@ -83,12 +84,13 @@ os_thread_create( ...@@ -83,12 +84,13 @@ os_thread_create(
os_thread_id_t* thread_id); /* out: id of the created os_thread_id_t* thread_id); /* out: id of the created
thread */ thread */
/********************************************************************* /*********************************************************************
A thread calling this function ends its execution. */ Exits the current thread. */
void void
os_thread_exit( os_thread_exit(
/*===========*/ /*===========*/
ulint code); /* in: exit code */ void* exit_value); /* in: exit value; in Windows this void*
is cast as a DWORD */
/********************************************************************* /*********************************************************************
Returns the thread identifier of current thread. */ Returns the thread identifier of current thread. */
...@@ -144,7 +146,6 @@ ulint ...@@ -144,7 +146,6 @@ ulint
os_thread_get_last_error(void); os_thread_get_last_error(void);
/*==========================*/ /*==========================*/
#ifndef UNIV_NONINL #ifndef UNIV_NONINL
#include "os0thread.ic" #include "os0thread.ic"
#endif #endif
......
...@@ -212,6 +212,12 @@ void ...@@ -212,6 +212,12 @@ void
srv_init(void); srv_init(void);
/*==========*/ /*==========*/
/************************************************************************* /*************************************************************************
Frees the OS fast mutex created in srv_init(). */
void
srv_free(void);
/*==========*/
/*************************************************************************
Initializes the synchronization primitives, memory system, and the thread Initializes the synchronization primitives, memory system, and the thread
local storage. */ local storage. */
......
...@@ -86,11 +86,12 @@ extern ibool srv_startup_is_before_trx_rollback_phase; ...@@ -86,11 +86,12 @@ extern ibool srv_startup_is_before_trx_rollback_phase;
extern ibool srv_is_being_shut_down; extern ibool srv_is_being_shut_down;
/* At a shutdown the value first climbs from 0 to SRV_SHUTDOWN_CLEANUP /* At a shutdown the value first climbs from 0 to SRV_SHUTDOWN_CLEANUP
and then to SRV_SHUTDOWN_LAST_PHASE */ and then to SRV_SHUTDOWN_LAST_PHASE, and so on */
extern ulint srv_shutdown_state; extern ulint srv_shutdown_state;
#define SRV_SHUTDOWN_CLEANUP 1 #define SRV_SHUTDOWN_CLEANUP 1
#define SRV_SHUTDOWN_LAST_PHASE 2 #define SRV_SHUTDOWN_LAST_PHASE 2
#define SRV_SHUTDOWN_EXIT_THREADS 3
#endif #endif
...@@ -187,7 +187,11 @@ management to ensure correct alignment for doubles etc. */ ...@@ -187,7 +187,11 @@ management to ensure correct alignment for doubles etc. */
/* Another basic type we use is unsigned long integer which is intended to be /* Another basic type we use is unsigned long integer which is intended to be
equal to the word size of the machine. */ equal to the word size of the machine. */
#ifdef _WIN64
typedef unsigned __int64 ulint;
#else
typedef unsigned long int ulint; typedef unsigned long int ulint;
#endif
typedef long int lint; typedef long int lint;
......
...@@ -375,7 +375,7 @@ log_pad_current_log_block(void) ...@@ -375,7 +375,7 @@ log_pad_current_log_block(void)
log_close(); log_close();
log_release(); log_release();
ut_a((ut_dulint_get_low(lsn) % OS_FILE_LOG_BLOCK_SIZE) ut_ad((ut_dulint_get_low(lsn) % OS_FILE_LOG_BLOCK_SIZE)
== LOG_BLOCK_HDR_SIZE); == LOG_BLOCK_HDR_SIZE);
} }
...@@ -998,6 +998,8 @@ log_group_file_header_flush( ...@@ -998,6 +998,8 @@ log_group_file_header_flush(
{ {
byte* buf; byte* buf;
ulint dest_offset; ulint dest_offset;
UT_NOT_USED(type);
ut_ad(mutex_own(&(log_sys->mutex))); ut_ad(mutex_own(&(log_sys->mutex)));
...@@ -1068,8 +1070,8 @@ log_group_write_buf( ...@@ -1068,8 +1070,8 @@ log_group_write_buf(
ulint i; ulint i;
ut_ad(mutex_own(&(log_sys->mutex))); ut_ad(mutex_own(&(log_sys->mutex)));
ut_a(len % OS_FILE_LOG_BLOCK_SIZE == 0); ut_ad(len % OS_FILE_LOG_BLOCK_SIZE == 0);
ut_a(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); ut_ad(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0);
if (new_data_offset == 0) { if (new_data_offset == 0) {
write_header = TRUE; write_header = TRUE;
...@@ -2901,10 +2903,9 @@ logs_empty_and_mark_files_at_shutdown(void) ...@@ -2901,10 +2903,9 @@ logs_empty_and_mark_files_at_shutdown(void)
dulint lsn; dulint lsn;
ulint arch_log_no; ulint arch_log_no;
if (srv_print_verbose_log) if (srv_print_verbose_log) {
{ ut_print_timestamp(stderr);
ut_print_timestamp(stderr); fprintf(stderr, " InnoDB: Starting shutdown...\n");
fprintf(stderr, " InnoDB: Starting shutdown...\n");
} }
/* Wait until the master thread and all other operations are idle: our /* Wait until the master thread and all other operations are idle: our
algorithm only works if the server is idle at shutdown */ algorithm only works if the server is idle at shutdown */
...@@ -3006,15 +3007,17 @@ loop: ...@@ -3006,15 +3007,17 @@ loop:
goto loop; goto loop;
} }
/* Make some checks that the server really is quiet */
ut_a(buf_all_freed());
ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
fil_write_flushed_lsn_to_data_files(lsn, arch_log_no); fil_write_flushed_lsn_to_data_files(lsn, arch_log_no);
fil_flush_file_spaces(FIL_TABLESPACE); fil_flush_file_spaces(FIL_TABLESPACE);
if (srv_print_verbose_log) /* Make some checks that the server really is quiet */
{ ut_a(buf_all_freed());
ut_print_timestamp(stderr); ut_a(0 == ut_dulint_cmp(lsn, log_sys->lsn));
fprintf(stderr, " InnoDB: Shutdown completed\n");
}
} }
/********************************************************** /**********************************************************
......
...@@ -80,6 +80,8 @@ struct os_aio_slot_struct{ ...@@ -80,6 +80,8 @@ struct os_aio_slot_struct{
which pending aio operation was which pending aio operation was
completed */ completed */
#ifdef WIN_ASYNC_IO #ifdef WIN_ASYNC_IO
os_event_t event; /* event object we need in the
OVERLAPPED struct */
OVERLAPPED control; /* Windows control block for the OVERLAPPED control; /* Windows control block for the
aio request */ aio request */
#elif defined(POSIX_ASYNC_IO) #elif defined(POSIX_ASYNC_IO)
...@@ -107,11 +109,14 @@ struct os_aio_array_struct{ ...@@ -107,11 +109,14 @@ struct os_aio_array_struct{
ulint n_reserved;/* Number of reserved slots in the ulint n_reserved;/* Number of reserved slots in the
aio array outside the ibuf segment */ aio array outside the ibuf segment */
os_aio_slot_t* slots; /* Pointer to the slots in the array */ os_aio_slot_t* slots; /* Pointer to the slots in the array */
os_event_t* events; /* Pointer to an array of event handles #ifdef __WIN__
where we copied the handles from slots, os_native_event_t* native_events;
in the same order. This can be used in /* Pointer to an array of OS native event
WaitForMultipleObjects; used only in handles where we copied the handles from
slots, in the same order. This can be used
in WaitForMultipleObjects; used only in
Windows */ Windows */
#endif
}; };
/* Array of events used in simulated aio */ /* Array of events used in simulated aio */
...@@ -295,7 +300,8 @@ os_file_handle_error( ...@@ -295,7 +300,8 @@ os_file_handle_error(
/* out: TRUE if we should retry the /* out: TRUE if we should retry the
operation */ operation */
os_file_t file, /* in: file pointer */ os_file_t file, /* in: file pointer */
char* name) /* in: name of a file or NULL */ char* name, /* in: name of a file or NULL */
const char* operation)/* in: operation */
{ {
ulint err; ulint err;
...@@ -338,6 +344,7 @@ os_file_handle_error( ...@@ -338,6 +344,7 @@ os_file_handle_error(
fprintf(stderr, "InnoDB: File name %s\n", name); fprintf(stderr, "InnoDB: File name %s\n", name);
} }
fprintf(stderr, "InnoDB: System call %s.\n", operation);
fprintf(stderr, "InnoDB: Cannot continue operation.\n"); fprintf(stderr, "InnoDB: Cannot continue operation.\n");
fflush(stderr); fflush(stderr);
...@@ -419,8 +426,9 @@ try_again: ...@@ -419,8 +426,9 @@ try_again:
if (file == INVALID_HANDLE_VALUE) { if (file == INVALID_HANDLE_VALUE) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name); retry = os_file_handle_error(file, name,
create_mode == OS_FILE_OPEN ?
"open" : "create");
if (retry) { if (retry) {
goto try_again; goto try_again;
} }
...@@ -460,8 +468,9 @@ try_again: ...@@ -460,8 +468,9 @@ try_again:
if (file == -1) { if (file == -1) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name); retry = os_file_handle_error(file, name,
create_mode == OS_FILE_OPEN ?
"open" : "create");
if (retry) { if (retry) {
goto try_again; goto try_again;
} }
...@@ -568,8 +577,9 @@ try_again: ...@@ -568,8 +577,9 @@ try_again:
if (file == INVALID_HANDLE_VALUE) { if (file == INVALID_HANDLE_VALUE) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name); retry = os_file_handle_error(file, name,
create_mode == OS_FILE_OPEN ?
"open" : "create");
if (retry) { if (retry) {
goto try_again; goto try_again;
} }
...@@ -615,8 +625,9 @@ try_again: ...@@ -615,8 +625,9 @@ try_again:
if (file == -1) { if (file == -1) {
*success = FALSE; *success = FALSE;
retry = os_file_handle_error(file, name); retry = os_file_handle_error(file, name,
create_mode == OS_FILE_OPEN ?
"open" : "create");
if (retry) { if (retry) {
goto try_again; goto try_again;
} }
...@@ -649,7 +660,7 @@ os_file_close( ...@@ -649,7 +660,7 @@ os_file_close(
return(TRUE); return(TRUE);
} }
os_file_handle_error(file, NULL); os_file_handle_error(file, NULL, "close");
return(FALSE); return(FALSE);
#else #else
int ret; int ret;
...@@ -657,7 +668,7 @@ os_file_close( ...@@ -657,7 +668,7 @@ os_file_close(
ret = close(file); ret = close(file);
if (ret == -1) { if (ret == -1) {
os_file_handle_error(file, NULL); os_file_handle_error(file, NULL, "close");
return(FALSE); return(FALSE);
} }
...@@ -825,7 +836,7 @@ os_file_flush( ...@@ -825,7 +836,7 @@ os_file_flush(
return(TRUE); return(TRUE);
} }
os_file_handle_error(file, NULL); os_file_handle_error(file, NULL, "flush");
/* It is a fatal error if a file flush does not succeed, because then /* It is a fatal error if a file flush does not succeed, because then
the database can get corrupt on disk */ the database can get corrupt on disk */
...@@ -858,7 +869,7 @@ os_file_flush( ...@@ -858,7 +869,7 @@ os_file_flush(
fprintf(stderr, fprintf(stderr,
" InnoDB: Error: the OS said file flush did not succeed\n"); " InnoDB: Error: the OS said file flush did not succeed\n");
os_file_handle_error(file, NULL); os_file_handle_error(file, NULL, "flush");
/* It is a fatal error if a file flush does not succeed, because then /* It is a fatal error if a file flush does not succeed, because then
the database can get corrupt on disk */ the database can get corrupt on disk */
...@@ -1099,7 +1110,7 @@ try_again: ...@@ -1099,7 +1110,7 @@ try_again:
#ifdef __WIN__ #ifdef __WIN__
error_handling: error_handling:
#endif #endif
retry = os_file_handle_error(file, NULL); retry = os_file_handle_error(file, NULL, "read");
if (retry) { if (retry) {
goto try_again; goto try_again;
...@@ -1295,7 +1306,6 @@ os_aio_array_create( ...@@ -1295,7 +1306,6 @@ os_aio_array_create(
#endif #endif
ut_a(n > 0); ut_a(n > 0);
ut_a(n_segments > 0); ut_a(n_segments > 0);
ut_a(n % n_segments == 0);
array = ut_malloc(sizeof(os_aio_array_t)); array = ut_malloc(sizeof(os_aio_array_t));
...@@ -1309,19 +1319,22 @@ os_aio_array_create( ...@@ -1309,19 +1319,22 @@ os_aio_array_create(
array->n_segments = n_segments; array->n_segments = n_segments;
array->n_reserved = 0; array->n_reserved = 0;
array->slots = ut_malloc(n * sizeof(os_aio_slot_t)); array->slots = ut_malloc(n * sizeof(os_aio_slot_t));
array->events = ut_malloc(n * sizeof(os_event_t)); #ifdef __WIN__
array->native_events = ut_malloc(n * sizeof(os_native_event_t));
#endif
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
slot = os_aio_array_get_nth_slot(array, i); slot = os_aio_array_get_nth_slot(array, i);
slot->pos = i; slot->pos = i;
slot->reserved = FALSE; slot->reserved = FALSE;
#ifdef WIN_ASYNC_IO #ifdef WIN_ASYNC_IO
slot->event = os_event_create(NULL);
over = &(slot->control); over = &(slot->control);
over->hEvent = os_event_create(NULL); over->hEvent = slot->event->handle;
*((array->events) + i) = over->hEvent; *((array->native_events) + i) = over->hEvent;
#endif #endif
} }
...@@ -1404,6 +1417,50 @@ os_aio_init( ...@@ -1404,6 +1417,50 @@ os_aio_init(
pthread_sigmask(SIG_BLOCK, &sigset, NULL); */ pthread_sigmask(SIG_BLOCK, &sigset, NULL); */
#endif #endif
} }
#ifdef WIN_ASYNC_IO
/****************************************************************************
Wakes up all async i/o threads in the array in Windows async i/o at
shutdown. */
static
void
os_aio_array_wake_win_aio_at_shutdown(
/*==================================*/
os_aio_array_t* array) /* in: aio array */
{
ulint i;
for (i = 0; i < array->n_slots; i++) {
os_event_set((array->slots + i)->event);
}
}
#endif
/****************************************************************************
Wakes up all async i/o threads so that they know to exit themselves in
shutdown. */
void
os_aio_wake_all_threads_at_shutdown(void)
/*=====================================*/
{
ulint i;
#ifdef WIN_ASYNC_IO
/* This code wakes up all ai/o threads in Windows native aio */
os_aio_array_wake_win_aio_at_shutdown(os_aio_read_array);
os_aio_array_wake_win_aio_at_shutdown(os_aio_write_array);
os_aio_array_wake_win_aio_at_shutdown(os_aio_ibuf_array);
os_aio_array_wake_win_aio_at_shutdown(os_aio_log_array);
#endif
/* This loop wakes up all simulated ai/o threads */
for (i = 0; i < os_aio_n_segments; i++) {
os_event_set(os_aio_segment_wait_events[i]);
}
}
/**************************************************************************** /****************************************************************************
Waits until there are no pending writes in os_aio_write_array. There can Waits until there are no pending writes in os_aio_write_array. There can
...@@ -1635,7 +1692,7 @@ loop: ...@@ -1635,7 +1692,7 @@ loop:
control = &(slot->control); control = &(slot->control);
control->Offset = (DWORD)offset; control->Offset = (DWORD)offset;
control->OffsetHigh = (DWORD)offset_high; control->OffsetHigh = (DWORD)offset_high;
os_event_reset(control->hEvent); os_event_reset(slot->event);
#elif defined(POSIX_ASYNC_IO) #elif defined(POSIX_ASYNC_IO)
...@@ -1693,7 +1750,7 @@ os_aio_array_free_slot( ...@@ -1693,7 +1750,7 @@ os_aio_array_free_slot(
} }
#ifdef WIN_ASYNC_IO #ifdef WIN_ASYNC_IO
os_event_reset(slot->control.hEvent); os_event_reset(slot->event);
#endif #endif
os_mutex_exit(array->mutex); os_mutex_exit(array->mutex);
} }
...@@ -1818,7 +1875,7 @@ os_aio( ...@@ -1818,7 +1875,7 @@ os_aio(
offset where to read or write */ offset where to read or write */
ulint offset_high, /* in: most significant 32 bits of ulint offset_high, /* in: most significant 32 bits of
offset */ offset */
ulint n, /* in: number of bytes to read or write */ ulint n, /* in: number of bytes to read or write */
void* message1,/* in: messages for the aio handler (these void* message1,/* in: messages for the aio handler (these
can be used to identify a completed aio can be used to identify a completed aio
operation); if mode is OS_AIO_SYNC, these operation); if mode is OS_AIO_SYNC, these
...@@ -1862,7 +1919,8 @@ os_aio( ...@@ -1862,7 +1919,8 @@ os_aio(
wait in the Windows case. */ wait in the Windows case. */
if (type == OS_FILE_READ) { if (type == OS_FILE_READ) {
return(os_file_read(file, buf, offset, offset_high, n)); return(os_file_read(file, buf, offset,
offset_high, n));
} }
ut_a(type == OS_FILE_WRITE); ut_a(type == OS_FILE_WRITE);
...@@ -1940,8 +1998,7 @@ try_again: ...@@ -1940,8 +1998,7 @@ try_again:
#ifdef WIN_ASYNC_IO #ifdef WIN_ASYNC_IO
if (os_aio_use_native_aio) { if (os_aio_use_native_aio) {
if ((ret && len == n) if ((ret && len == n)
|| (!ret && GetLastError() == ERROR_IO_PENDING)) { || (!ret && GetLastError() == ERROR_IO_PENDING)) {
/* aio was queued successfully! */ /* aio was queued successfully! */
if (mode == OS_AIO_SYNC) { if (mode == OS_AIO_SYNC) {
...@@ -1971,8 +2028,8 @@ try_again: ...@@ -1971,8 +2028,8 @@ try_again:
os_aio_array_free_slot(array, slot); os_aio_array_free_slot(array, slot);
retry = os_file_handle_error(file, name); retry = os_file_handle_error(file, name,
type == OS_FILE_READ ? "aio read" : "aio write");
if (retry) { if (retry) {
goto try_again; goto try_again;
...@@ -2037,15 +2094,15 @@ os_aio_windows_handle( ...@@ -2037,15 +2094,15 @@ os_aio_windows_handle(
n = array->n_slots / array->n_segments; n = array->n_slots / array->n_segments;
if (array == os_aio_sync_array) { if (array == os_aio_sync_array) {
srv_io_thread_op_info[orig_seg] = "wait Windows aio for 1 page"; srv_io_thread_op_info[orig_seg] =
"wait Windows aio for 1 page";
ut_ad(pos < array->n_slots); os_event_wait(os_aio_array_get_nth_slot(array, pos)->event);
os_event_wait(array->events[pos]);
i = pos; i = pos;
} else { } else {
srv_io_thread_op_info[orig_seg] = srv_io_thread_op_info[orig_seg] =
"wait Windows aio"; "wait Windows aio";
i = os_event_wait_multiple(n, (array->events) + segment * n); i = os_event_wait_multiple(n,
(array->native_events) + segment * n);
} }
os_mutex_enter(array->mutex); os_mutex_enter(array->mutex);
...@@ -2070,7 +2127,7 @@ os_aio_windows_handle( ...@@ -2070,7 +2127,7 @@ os_aio_windows_handle(
ut_a(TRUE == os_file_flush(slot->file)); ut_a(TRUE == os_file_flush(slot->file));
} }
} else { } else {
os_file_handle_error(slot->file, slot->name); os_file_handle_error(slot->file, slot->name, "Windows aio");
ret_val = FALSE; ret_val = FALSE;
} }
......
This diff is collapsed.
/****************************************************** /******************************************************
The interface to the operating system The interface to the operating system thread control primitives
process and thread control primitives
(c) 1995 Innobase Oy (c) 1995 Innobase Oy
...@@ -17,6 +16,7 @@ Created 9/8/1995 Heikki Tuuri ...@@ -17,6 +16,7 @@ Created 9/8/1995 Heikki Tuuri
#endif #endif
#include "srv0srv.h" #include "srv0srv.h"
#include "os0sync.h"
/******************************************************************* /*******************************************************************
Compares two thread ids for equality. */ Compares two thread ids for equality. */
...@@ -102,6 +102,10 @@ os_thread_create( ...@@ -102,6 +102,10 @@ os_thread_create(
os_thread_t thread; os_thread_t thread;
ulint win_thread_id; ulint win_thread_id;
os_mutex_enter(os_sync_mutex);
os_thread_count++;
os_mutex_exit(os_sync_mutex);
thread = CreateThread(NULL, /* no security attributes */ thread = CreateThread(NULL, /* no security attributes */
0, /* default size stack */ 0, /* default size stack */
(LPTHREAD_START_ROUTINE)start_f, (LPTHREAD_START_ROUTINE)start_f,
...@@ -144,6 +148,9 @@ os_thread_create( ...@@ -144,6 +148,9 @@ os_thread_create(
exit(1); exit(1);
} }
#endif #endif
os_mutex_enter(os_sync_mutex);
os_thread_count++;
os_mutex_exit(os_sync_mutex);
#if defined(UNIV_HOTBACKUP) && defined(UNIV_HPUX10) #if defined(UNIV_HOTBACKUP) && defined(UNIV_HPUX10)
ret = pthread_create(&pthread, pthread_attr_default, start_f, arg); ret = pthread_create(&pthread, pthread_attr_default, start_f, arg);
...@@ -170,6 +177,30 @@ os_thread_create( ...@@ -170,6 +177,30 @@ os_thread_create(
#endif #endif
} }
/*********************************************************************
Exits the current thread. */
void
os_thread_exit(
/*===========*/
void* exit_value) /* in: exit value; in Windows this void*
is cast as a DWORD */
{
#ifdef UNIV_DEBUG_THREAD_CREATION
printf("A thread exits.\n");
printf("Thread id %lu\n", os_thread_pf(os_thread_get_curr_id()));
#endif
os_mutex_enter(os_sync_mutex);
os_thread_count--;
os_mutex_exit(os_sync_mutex);
#ifdef __WIN__
ExitThread((DWORD)exit_value);
#else
pthread_exit(exit_value);
#endif
}
/********************************************************************* /*********************************************************************
Returns handle to the current thread. */ Returns handle to the current thread. */
......
...@@ -1275,6 +1275,10 @@ row_ins_unique_report_err( ...@@ -1275,6 +1275,10 @@ row_ins_unique_report_err(
dtuple_t* entry, /* in: index entry to insert in the index */ dtuple_t* entry, /* in: index entry to insert in the index */
dict_index_t* index) /* in: index */ dict_index_t* index) /* in: index */
{ {
#ifdef notdefined
/* Disable reporting to test if the slowdown of REPLACE in 4.0.13 was
caused by this! */
char* buf = dict_unique_err_buf; char* buf = dict_unique_err_buf;
/* The foreign err mutex protects also dict_unique_err_buf */ /* The foreign err mutex protects also dict_unique_err_buf */
...@@ -1303,6 +1307,7 @@ row_ins_unique_report_err( ...@@ -1303,6 +1307,7 @@ row_ins_unique_report_err(
ut_a(strlen(buf) < DICT_FOREIGN_ERR_BUF_LEN); ut_a(strlen(buf) < DICT_FOREIGN_ERR_BUF_LEN);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);
#endif
} }
/******************************************************************* /*******************************************************************
......
...@@ -868,6 +868,7 @@ srv_release_max_if_no_queries(void) ...@@ -868,6 +868,7 @@ srv_release_max_if_no_queries(void)
mutex_exit(&kernel_mutex); mutex_exit(&kernel_mutex);
} }
#ifdef notdefined
/*********************************************************************** /***********************************************************************
Releases one utility thread if no queries are active and Releases one utility thread if no queries are active and
the high-water mark 2 for the utility is exceeded. */ the high-water mark 2 for the utility is exceeded. */
...@@ -902,7 +903,6 @@ srv_release_one_if_no_queries(void) ...@@ -902,7 +903,6 @@ srv_release_one_if_no_queries(void)
mutex_exit(&kernel_mutex); mutex_exit(&kernel_mutex);
} }
#ifdef notdefined
/*********************************************************************** /***********************************************************************
Decrements the utility meter by the value given and suspends the calling Decrements the utility meter by the value given and suspends the calling
thread, which must be an utility thread of the type given, if necessary. */ thread, which must be an utility thread of the type given, if necessary. */
...@@ -1012,6 +1012,8 @@ srv_communication_init( ...@@ -1012,6 +1012,8 @@ srv_communication_init(
ut_a(ret == 0); ut_a(ret == 0);
} }
#ifdef notdefined
/************************************************************************* /*************************************************************************
Implements the recovery utility. */ Implements the recovery utility. */
...@@ -1072,6 +1074,7 @@ srv_purge_thread( ...@@ -1072,6 +1074,7 @@ srv_purge_thread(
return(0); return(0);
} }
#endif /* notdefined */
/************************************************************************* /*************************************************************************
Creates the utility threads. */ Creates the utility threads. */
...@@ -1102,6 +1105,7 @@ srv_create_utility_threads(void) ...@@ -1102,6 +1105,7 @@ srv_create_utility_threads(void)
ut_a(thread); */ ut_a(thread); */
} }
#ifdef notdefined
/************************************************************************* /*************************************************************************
Implements the communication threads. */ Implements the communication threads. */
static static
...@@ -1151,6 +1155,7 @@ srv_com_thread( ...@@ -1151,6 +1155,7 @@ srv_com_thread(
return(0); return(0);
} }
#endif
/************************************************************************* /*************************************************************************
Creates the communication threads. */ Creates the communication threads. */
...@@ -1171,6 +1176,7 @@ srv_create_com_threads(void) ...@@ -1171,6 +1176,7 @@ srv_create_com_threads(void)
} }
} }
#ifdef notdefined
/************************************************************************* /*************************************************************************
Implements the worker threads. */ Implements the worker threads. */
static static
...@@ -1215,6 +1221,7 @@ srv_worker_thread( ...@@ -1215,6 +1221,7 @@ srv_worker_thread(
return(0); return(0);
} }
#endif
/************************************************************************* /*************************************************************************
Creates the worker threads. */ Creates the worker threads. */
...@@ -1705,76 +1712,33 @@ srv_init(void) ...@@ -1705,76 +1712,33 @@ srv_init(void)
ut_a(conc_slot->event); ut_a(conc_slot->event);
} }
} }
/************************************************************************* /*************************************************************************
Initializes the synchronization primitives, memory system, and the thread Frees the OS fast mutex created in srv_init(). */
local storage. */
void void
srv_general_init(void) srv_free(void)
/*==================*/ /*==========*/
{ {
sync_init(); os_fast_mutex_free(&srv_conc_mutex);
mem_init(srv_mem_pool_size);
thr_local_init();
} }
#if defined(__NETWARE__) || defined(SAFE_MUTEX_DETECT_DESTROY)
/* NetWare requires some cleanup of mutexes */
/************************************************************************* /*************************************************************************
Deinitializes the synchronization primitives, memory system, and the thread Initializes the synchronization primitives, memory system, and the thread
local storage. */ local storage. */
void void
srv_general_free(void) srv_general_init(void)
/*==================*/ /*==================*/
{ {
sync_close(); os_sync_init();
sync_init();
mem_init(srv_mem_pool_size);
thr_local_init();
} }
#endif /* __NETWARE__ */
/*======================= InnoDB Server FIFO queue =======================*/ /*======================= InnoDB Server FIFO queue =======================*/
#if defined(__NETWARE__) || defined(SAFE_MUTEX_DETECT_DESTROY)
/* NetWare requires some cleanup of mutexes */
/*************************************************************************
Deinitializes the server. */
void
srv_free(void)
/*==========*/
{
srv_conc_slot_t* conc_slot;
srv_slot_t* slot;
ulint i;
for (i = 0; i < OS_THREAD_MAX_N; i++)
{
slot = srv_table_get_nth_slot(i);
os_event_free(slot->event);
}
/* TODO: free(srv_sys->threads); */
for (i = 0; i < OS_THREAD_MAX_N; i++)
{
slot = srv_mysql_table + i;
os_event_free(slot->event);
}
/* TODO: free(srv_mysql_table); */
for (i = 0; i < OS_THREAD_MAX_N; i++)
{
conc_slot = srv_conc_slots + i;
os_event_free(conc_slot->event);
}
}
#endif /* __NETWARE__ */
/************************************************************************* /*************************************************************************
Puts an OS thread to wait if there are too many concurrent threads Puts an OS thread to wait if there are too many concurrent threads
...@@ -2533,6 +2497,10 @@ srv_lock_timeout_and_monitor_thread( ...@@ -2533,6 +2497,10 @@ srv_lock_timeout_and_monitor_thread(
char* buf; char* buf;
ulint i; ulint i;
#ifdef UNIV_DEBUG_THREAD_CREATION
printf("Lock timeout thread starts\n");
printf("Thread id %lu\n", os_thread_pf(os_thread_get_curr_id()));
#endif
UT_NOT_USED(arg); UT_NOT_USED(arg);
srv_last_monitor_time = time(NULL); srv_last_monitor_time = time(NULL);
last_table_monitor_time = time(NULL); last_table_monitor_time = time(NULL);
...@@ -2673,6 +2641,10 @@ loop: ...@@ -2673,6 +2641,10 @@ loop:
exit_func: exit_func:
srv_lock_timeout_and_monitor_active = FALSE; srv_lock_timeout_and_monitor_active = FALSE;
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */
os_thread_exit(NULL);
#ifndef __WIN__ #ifndef __WIN__
return(NULL); return(NULL);
#else #else
...@@ -2698,6 +2670,10 @@ srv_error_monitor_thread( ...@@ -2698,6 +2670,10 @@ srv_error_monitor_thread(
ulint cnt = 0; ulint cnt = 0;
UT_NOT_USED(arg); UT_NOT_USED(arg);
#ifdef UNIV_DEBUG_THREAD_CREATION
printf("Error monitor thread starts\n");
printf("Thread id %lu\n", os_thread_pf(os_thread_get_curr_id()));
#endif
loop: loop:
srv_error_monitor_active = TRUE; srv_error_monitor_active = TRUE;
...@@ -2734,6 +2710,11 @@ loop: ...@@ -2734,6 +2710,11 @@ loop:
srv_error_monitor_active = FALSE; srv_error_monitor_active = FALSE;
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */
os_thread_exit(NULL);
#ifndef __WIN__ #ifndef __WIN__
return(NULL); return(NULL);
#else #else
...@@ -2812,6 +2793,10 @@ srv_master_thread( ...@@ -2812,6 +2793,10 @@ srv_master_thread(
UT_NOT_USED(arg); UT_NOT_USED(arg);
#ifdef UNIV_DEBUG_THREAD_CREATION
printf("Master thread starts\n");
printf("Thread id %lu\n", os_thread_pf(os_thread_get_curr_id()));
#endif
srv_main_thread_process_no = os_proc_get_number(); srv_main_thread_process_no = os_proc_get_number();
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id()); srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
...@@ -3047,6 +3032,15 @@ background_loop: ...@@ -3047,6 +3032,15 @@ background_loop:
n_tables_to_drop = row_drop_tables_for_mysql_in_background(); n_tables_to_drop = row_drop_tables_for_mysql_in_background();
if (n_tables_to_drop > 0) {
/* Do not monopolize the CPU even if there are tables waiting
in the background drop queue. (It is essentially a bug if
MySQL tries to drop a table while there are still open handles
to it and we had to put it to the background drop queue.) */
os_thread_sleep(100000);
}
srv_main_thread_op_info = (char*)"purging"; srv_main_thread_op_info = (char*)"purging";
if (srv_fast_shutdown && srv_shutdown_state > 0) { if (srv_fast_shutdown && srv_shutdown_state > 0) {
...@@ -3173,11 +3167,25 @@ suspend_thread: ...@@ -3173,11 +3167,25 @@ suspend_thread:
os_event_wait(event); os_event_wait(event);
if (srv_shutdown_state == SRV_SHUTDOWN_EXIT_THREADS) {
/* This is only extra safety, the thread should exit
already when the event wait ends */
os_thread_exit(NULL);
}
/* When there is user activity, InnoDB will set the event and the main /* When there is user activity, InnoDB will set the event and the main
thread goes back to loop: */ thread goes back to loop: */
goto loop; goto loop;
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit.
The thread actually never comes here because it is exited in an
os_event_wait(). */
os_thread_exit(NULL);
#ifndef __WIN__ #ifndef __WIN__
return(NULL); return(NULL);
#else #else
......
...@@ -414,8 +414,10 @@ io_handler_thread( ...@@ -414,8 +414,10 @@ io_handler_thread(
segment = *((ulint*)arg); segment = *((ulint*)arg);
/* printf("Io handler thread %lu starts\n", segment); */ #ifdef UNIV_DEBUG_THREAD_CREATION
printf("Io handler thread %lu starts\n", segment);
printf("Thread id %lu\n", os_thread_pf(os_thread_get_curr_id()));
#endif
for (i = 0;; i++) { for (i = 0;; i++) {
fil_aio_wait(segment); fil_aio_wait(segment);
...@@ -424,6 +426,13 @@ io_handler_thread( ...@@ -424,6 +426,13 @@ io_handler_thread(
mutex_exit(&ios_mutex); mutex_exit(&ios_mutex);
} }
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit.
The thread actually never comes here because it is exited in an
os_event_wait(). */
os_thread_exit(NULL);
#ifndef __WIN__ #ifndef __WIN__
return(NULL); return(NULL);
#else #else
...@@ -1481,9 +1490,7 @@ innobase_start_or_create_for_mysql(void) ...@@ -1481,9 +1490,7 @@ innobase_start_or_create_for_mysql(void)
os_fast_mutex_unlock(&srv_os_test_mutex); os_fast_mutex_unlock(&srv_os_test_mutex);
#if defined(__NETWARE__) || defined(SAFE_MUTEX_DETECT_DESTROY) os_fast_mutex_free(&srv_os_test_mutex);
os_fast_mutex_free(&srv_os_test_mutex); /* all platforms? */
#endif /* __NETWARE__ */
if (srv_print_verbose_log) { if (srv_print_verbose_log) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
...@@ -1509,6 +1516,8 @@ innobase_shutdown_for_mysql(void) ...@@ -1509,6 +1516,8 @@ innobase_shutdown_for_mysql(void)
/*=============================*/ /*=============================*/
/* out: DB_SUCCESS or error code */ /* out: DB_SUCCESS or error code */
{ {
ulint i;
if (!srv_was_started) { if (!srv_was_started) {
if (srv_is_being_started) { if (srv_is_being_started) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
...@@ -1521,7 +1530,7 @@ innobase_shutdown_for_mysql(void) ...@@ -1521,7 +1530,7 @@ innobase_shutdown_for_mysql(void)
return(DB_SUCCESS); return(DB_SUCCESS);
} }
/* Flush buffer pool to disk, write the current lsn to /* 1. Flush buffer pool to disk, write the current lsn to
the tablespace header(s), and copy all log data to archive */ the tablespace header(s), and copy all log data to archive */
logs_empty_and_mark_files_at_shutdown(); logs_empty_and_mark_files_at_shutdown();
...@@ -1533,30 +1542,88 @@ innobase_shutdown_for_mysql(void) ...@@ -1533,30 +1542,88 @@ innobase_shutdown_for_mysql(void)
srv_conc_n_threads); srv_conc_n_threads);
} }
#if defined(__NETWARE__) || defined(SAFE_MUTEX_DETECT_DESTROY) /* 2. Make all threads created by InnoDB to exit */
/*
TODO: Fix this temporary solution srv_shutdown_state = SRV_SHUTDOWN_EXIT_THREADS;
We are having a race condition occure with io_handler_thread threads.
When they yield in os_aio_simulated_handle during shutdown, this /* All threads end up waiting for certain events. Put those events
thread was able to free the memory early. to the signaled state. Then the threads will exit themselves in
*/ os_thread_event_wait(). */
os_thread_yield();
for (i = 0; i < 1000; i++) {
/* NOTE: IF YOU CREATE THREADS IN INNODB, YOU MUST EXIT THEM
HERE OR EARLIER */
/* 1. Let the lock timeout thread exit */
os_event_set(srv_lock_timeout_thread_event);
/* 2. srv error monitor thread exits automatically, no need
to do anything here */
/* 3. We wake the master thread so that it exits */
srv_wake_master_thread();
/* 4. Exit the i/o threads */
os_aio_wake_all_threads_at_shutdown();
os_mutex_enter(os_sync_mutex);
if (os_thread_count == 0) {
/* All the threads have exited or are just exiting;
NOTE that the threads may not have completed their
exit yet. Should we use pthread_join() to make sure
they have exited? Now we just sleep 0.1 seconds and
hope that is enough! */
os_mutex_exit(os_sync_mutex);
os_thread_sleep(100000);
break;
}
os_mutex_exit(os_sync_mutex);
os_thread_sleep(100000);
}
if (i == 1000) {
fprintf(stderr,
"InnoDB: Warning: %lu threads created by InnoDB had not exited at shutdown!\n",
os_thread_count);
}
/* 3. Free all InnoDB's own mutexes and the os_fast_mutexes inside
them */
sync_close();
/* 4. Free the os_conc_mutex and all os_events and os_mutexes */
/* TODO: Where should this be called? */
srv_free(); srv_free();
os_sync_free();
/* 5. Free all allocated memory and the os_fast_mutex created in
ut0mem.c */
/* TODO: Where should this be called? */
srv_general_free();
#endif
/*
TODO: We should exit the i/o-handler and other utility threads
before freeing all memory. Now this can potentially cause a seg
fault!
*/
#if defined(NOT_WORKING_YET) || defined(__NETWARE__) || defined(SAFE_MUTEX_DETECT_DESTROY)
/* NetWare requires this free */
ut_free_all_mem(); ut_free_all_mem();
#endif
if (os_thread_count != 0
|| os_event_count != 0
|| os_mutex_count != 0
|| os_fast_mutex_count != 0) {
fprintf(stderr,
"InnoDB: Warning: some resources were not cleaned up in shutdown:\n"
"InnoDB: threads %lu, events %lu, os_mutexes %lu, os_fast_mutexes %lu\n",
os_thread_count, os_event_count, os_mutex_count,
os_fast_mutex_count);
}
if (srv_print_verbose_log) {
ut_print_timestamp(stderr);
fprintf(stderr, " InnoDB: Shutdown completed\n");
}
return((int) DB_SUCCESS); return((int) DB_SUCCESS);
} }
...@@ -235,8 +235,7 @@ mutex_create_func( ...@@ -235,8 +235,7 @@ mutex_create_func(
mutex->cline = cline; mutex->cline = cline;
/* Check that lock_word is aligned; this is important on Intel */ /* Check that lock_word is aligned; this is important on Intel */
ut_ad(((ulint)(&(mutex->lock_word))) % 4 == 0);
ut_a(((ulint)(&(mutex->lock_word))) % 4 == 0);
/* NOTE! The very first mutexes are not put to the mutex list */ /* NOTE! The very first mutexes are not put to the mutex list */
...@@ -266,11 +265,14 @@ mutex_free( ...@@ -266,11 +265,14 @@ mutex_free(
ut_a(mutex_get_lock_word(mutex) == 0); ut_a(mutex_get_lock_word(mutex) == 0);
ut_a(mutex_get_waiters(mutex) == 0); ut_a(mutex_get_waiters(mutex) == 0);
mutex_enter(&mutex_list_mutex); if (mutex != &mutex_list_mutex && mutex != &sync_thread_mutex) {
UT_LIST_REMOVE(list, mutex_list, mutex); mutex_enter(&mutex_list_mutex);
mutex_exit(&mutex_list_mutex); UT_LIST_REMOVE(list, mutex_list, mutex);
mutex_exit(&mutex_list_mutex);
}
#if !defined(_WIN32) || !defined(UNIV_CAN_USE_X86_ASSEMBLER) #if !defined(_WIN32) || !defined(UNIV_CAN_USE_X86_ASSEMBLER)
os_fast_mutex_free(&(mutex->os_fast_mutex)); os_fast_mutex_free(&(mutex->os_fast_mutex));
...@@ -1230,13 +1232,26 @@ sync_init(void) ...@@ -1230,13 +1232,26 @@ sync_init(void)
} }
/********************************************************************** /**********************************************************************
Frees the resources in synchronization data structures. */ Frees the resources in InnoDB's own synchronization data structures. Use
os_sync_free() after calling this. */
void void
sync_close(void) sync_close(void)
/*===========*/ /*===========*/
{ {
mutex_t* mutex;
sync_array_free(sync_primary_wait_array); sync_array_free(sync_primary_wait_array);
mutex = UT_LIST_GET_FIRST(mutex_list);
while (mutex) {
mutex_free(mutex);
mutex = UT_LIST_GET_FIRST(mutex_list);
}
mutex_free(&mutex_list_mutex);
mutex_free(&sync_thread_mutex);
} }
/*********************************************************************** /***********************************************************************
......
...@@ -225,6 +225,8 @@ ut_free_all_mem(void) ...@@ -225,6 +225,8 @@ ut_free_all_mem(void)
os_fast_mutex_unlock(&ut_list_mutex); os_fast_mutex_unlock(&ut_list_mutex);
ut_a(ut_total_allocated_memory == 0); ut_a(ut_total_allocated_memory == 0);
os_fast_mutex_free(&ut_list_mutex);
} }
/************************************************************************** /**************************************************************************
......
This diff is collapsed.
...@@ -115,6 +115,7 @@ EXPORTS ...@@ -115,6 +115,7 @@ EXPORTS
mysql_param_result mysql_param_result
mysql_prepare_result mysql_prepare_result
mysql_stmt_close mysql_stmt_close
mysql_stmt_free_result
mysql_stmt_error mysql_stmt_error
mysql_stmt_errno mysql_stmt_errno
mysql_fetch mysql_fetch
......
...@@ -43,7 +43,7 @@ sqlsources = derror.cc field.cc field_conv.cc filesort.cc \ ...@@ -43,7 +43,7 @@ sqlsources = derror.cc field.cc field_conv.cc filesort.cc \
item.cc item_buff.cc item_cmpfunc.cc item_create.cc \ item.cc item_buff.cc item_cmpfunc.cc item_create.cc \
item_func.cc item_strfunc.cc item_sum.cc item_timefunc.cc \ item_func.cc item_strfunc.cc item_sum.cc item_timefunc.cc \
item_geofunc.cc item_uniq.cc item_subselect.cc item_row.cc\ item_geofunc.cc item_uniq.cc item_subselect.cc item_row.cc\
key.cc lock.cc log.cc log_event.cc \ key.cc lock.cc log.cc log_event.cc sql_state.c \
protocol.cc net_serv.cc opt_ft.cc opt_range.cc \ protocol.cc net_serv.cc opt_ft.cc opt_range.cc \
opt_sum.cc procedure.cc records.cc sql_acl.cc \ opt_sum.cc procedure.cc records.cc sql_acl.cc \
sql_load.cc sql_olap.cc \ sql_load.cc sql_olap.cc \
......
...@@ -450,6 +450,7 @@ static inline int mysql_init_charset(MYSQL *mysql) ...@@ -450,6 +450,7 @@ static inline int mysql_init_charset(MYSQL *mysql)
if (!mysql->charset) if (!mysql->charset)
{ {
mysql->last_errno=CR_CANT_READ_CHARSET; mysql->last_errno=CR_CANT_READ_CHARSET;
strmov(mysql->sqlstate, "HY0000");
if (mysql->options.charset_dir) if (mysql->options.charset_dir)
sprintf(mysql->last_error,ER(mysql->last_errno), sprintf(mysql->last_error,ER(mysql->last_errno),
charset_name ? charset_name : "unknown", charset_name ? charset_name : "unknown",
...@@ -1130,6 +1131,7 @@ mysql_stat(MYSQL *mysql) ...@@ -1130,6 +1131,7 @@ mysql_stat(MYSQL *mysql)
if (!mysql->net.read_pos[0]) if (!mysql->net.read_pos[0])
{ {
mysql->net.last_errno=CR_WRONG_HOST_INFO; mysql->net.last_errno=CR_WRONG_HOST_INFO;
strmov(mysql->sqlstate, unknown_sqlstate);
strmov(mysql->net.last_error, ER(mysql->net.last_errno)); strmov(mysql->net.last_error, ER(mysql->net.last_errno));
return mysql->net.last_error; return mysql->net.last_error;
} }
...@@ -1284,12 +1286,12 @@ unsigned int STDCALL mysql_field_count(MYSQL *mysql) ...@@ -1284,12 +1286,12 @@ unsigned int STDCALL mysql_field_count(MYSQL *mysql)
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql) my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql)
{ {
return (mysql)->affected_rows; return mysql->affected_rows;
} }
my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql) my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
{ {
return (mysql)->insert_id; return mysql->insert_id;
} }
uint STDCALL mysql_errno(MYSQL *mysql) uint STDCALL mysql_errno(MYSQL *mysql)
...@@ -1297,6 +1299,11 @@ uint STDCALL mysql_errno(MYSQL *mysql) ...@@ -1297,6 +1299,11 @@ uint STDCALL mysql_errno(MYSQL *mysql)
return mysql->last_errno; return mysql->last_errno;
} }
const char *STDCALL mysql_sqlstate(MYSQL *mysql)
{
return mysql->sqlstate;
}
const char * STDCALL mysql_error(MYSQL *mysql) const char * STDCALL mysql_error(MYSQL *mysql)
{ {
return mysql->last_error; return mysql->last_error;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
.SH NAME .SH NAME
mysql_fix_privilege_tables \- Fixes MySQL privilege tables. mysql_fix_privilege_tables \- Fixes MySQL privilege tables.
.SH SYNOPSIS .SH SYNOPSIS
mysql_fix_privilege_tables [options] mysql_fix_privilege_tables [mysql_root_password]
.SH DESCRIPTION .SH DESCRIPTION
This scripts updates the mysql.user, mysql.db, mysql.host and the This scripts updates the mysql.user, mysql.db, mysql.host and the
mysql.func tables to MySQL 3.22.14 and above. mysql.func tables to MySQL 3.22.14 and above.
...@@ -10,10 +10,9 @@ mysql.func tables to MySQL 3.22.14 and above. ...@@ -10,10 +10,9 @@ mysql.func tables to MySQL 3.22.14 and above.
This is needed if you want to use the new GRANT functions, This is needed if you want to use the new GRANT functions,
CREATE AGGREGATE FUNCTION or want to use the more secure passwords in 3.23 CREATE AGGREGATE FUNCTION or want to use the more secure passwords in 3.23
If you get 'Access denied' errors, you should run this script again If you get 'Access denied' errors, run the script again
and give the MySQL root user password as an argument! and give the MySQL root user password as an argument.
For more information start the program with '--help'.
.SH "SEE ALSO" .SH "SEE ALSO"
mysql (1), mysqld (1) mysql (1), mysqld (1)
.SH AUTHOR .SH AUTHOR
......
...@@ -13,12 +13,15 @@ DB=test ...@@ -13,12 +13,15 @@ DB=test
DBPASSWD= DBPASSWD=
VERBOSE="" VERBOSE=""
USE_MANAGER=0 USE_MANAGER=0
TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work MY_TZ=GMT-3
TZ=$MY_TZ; export TZ # for UNIX_TIMESTAMP tests to work
#++ #++
# Program Definitions # Program Definitions
#-- #--
LC_COLLATE=C
export LC_COLLATE
PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin:/usr/bin/X11:$PATH PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin:/usr/bin/X11:$PATH
MASTER_40_ARGS="--rpl-recovery-rank=1 --init-rpl-role=master" MASTER_40_ARGS="--rpl-recovery-rank=1 --init-rpl-role=master"
...@@ -1163,9 +1166,18 @@ run_testcase () ...@@ -1163,9 +1166,18 @@ run_testcase ()
if [ -f $master_opt_file ] ; if [ -f $master_opt_file ] ;
then then
EXTRA_MASTER_OPT=`$CAT $master_opt_file | $SED -e "s;\\$MYSQL_TEST_DIR;$MYSQL_TEST_DIR;"` EXTRA_MASTER_OPT=`$CAT $master_opt_file | $SED -e "s;\\$MYSQL_TEST_DIR;$MYSQL_TEST_DIR;"`
case "$EXTRA_MASTER_OPT" in
--timezone=*)
TZ=`$ECHO "$EXTRA_MASTER_OPT" | $SED -e "s;--timezone=;;"`
export TZ
# Note that this must be set to space, not "" for test-reset to work
EXTRA_MASTER_OPT=" "
;;
esac
stop_master stop_master
echo "CURRENT_TEST: $tname" >> $MASTER_MYERR echo "CURRENT_TEST: $tname" >> $MASTER_MYERR
start_master start_master
TZ=$MY_TZ; export TZ
else else
if [ ! -z "$EXTRA_MASTER_OPT" ] || [ x$MASTER_RUNNING != x1 ] || [ -f $master_init_script ] if [ ! -z "$EXTRA_MASTER_OPT" ] || [ x$MASTER_RUNNING != x1 ] || [ -f $master_init_script ]
then then
......
...@@ -276,3 +276,8 @@ t1 0 a 1 a A 3 NULL NULL YES BTREE ...@@ -276,3 +276,8 @@ t1 0 a 1 a A 3 NULL NULL YES BTREE
t1 0 a 2 b A 300 NULL NULL YES BTREE t1 0 a 2 b A 300 NULL NULL YES BTREE
t1 1 b 1 b A 100 NULL NULL YES BTREE t1 1 b 1 b A 100 NULL NULL YES BTREE
drop table t1; drop table t1;
CREATE TABLE t1 (i int(10), index(i) );
ALTER TABLE t1 DISABLE KEYS;
INSERT DELAYED INTO t1 VALUES(1),(2),(3);
ALTER TABLE t1 ENABLE KEYS;
drop table t1;
...@@ -6,26 +6,26 @@ Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_ ...@@ -6,26 +6,26 @@ Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_
count(*) 4 4 1 1 0 0 4.0000 0.0000 ENUM('4') NOT NULL count(*) 4 4 1 1 0 0 4.0000 0.0000 ENUM('4') NOT NULL
select * from t1 procedure analyse(); select * from t1 procedure analyse();
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL test.t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL test.t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
select * from t1 procedure analyse(2); select * from t1 procedure analyse(2);
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
t1.i 1 7 1 1 0 0 4.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL test.t1.i 1 7 1 1 0 0 4.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL test.t1.j 2 8 1 1 0 0 5.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL
t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
create table t2 select * from t1 procedure analyse(); create table t2 select * from t1 procedure analyse();
select * from t2; select * from t2;
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL test.t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL test.t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
drop table t1,t2; drop table t1,t2;
EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(); EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
......
...@@ -6,5 +6,13 @@ CREATE TABLE t1 (id INT, id2 int); ...@@ -6,5 +6,13 @@ CREATE TABLE t1 (id INT, id2 int);
SELECT id,NULL,1,1.1,'a' FROM t1 GROUP BY id; SELECT id,NULL,1,1.1,'a' FROM t1 GROUP BY id;
id NULL 1 1.1 a id NULL 1 1.1 a
SELECT id FROM t1 GROUP BY id2; SELECT id FROM t1 GROUP BY id2;
't1.id' isn't in GROUP BY ERROR 42000: 'test.t1.id' isn't in GROUP BY
drop table t1; drop table t1;
set sql_mode="MySQL40";
select @@sql_mode;
@@sql_mode
NO_FIELD_OPTIONS,MYSQL40
set sql_mode="ANSI";
select @@sql_mode;
@@sql_mode
REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI
...@@ -112,7 +112,7 @@ select last_insert_id(); ...@@ -112,7 +112,7 @@ select last_insert_id();
last_insert_id() last_insert_id()
255 255
insert into t1 set i = null; insert into t1 set i = null;
Duplicate entry '255' for key 1 ERROR 23000: Duplicate entry '255' for key 1
select last_insert_id(); select last_insert_id();
last_insert_id() last_insert_id()
255 255
...@@ -140,7 +140,7 @@ select last_insert_id(); ...@@ -140,7 +140,7 @@ select last_insert_id();
last_insert_id() last_insert_id()
2 2
insert into t1 values (NULL, 10); insert into t1 values (NULL, 10);
Duplicate entry '10' for key 2 ERROR 23000: Duplicate entry '10' for key 2
select last_insert_id(); select last_insert_id();
last_insert_id() last_insert_id()
3 3
......
...@@ -9,7 +9,7 @@ set autocommit=0; ...@@ -9,7 +9,7 @@ set autocommit=0;
update t2 set x = 1 where id = 0; update t2 set x = 1 where id = 0;
select x from t1 where id = 0; select x from t1 where id = 0;
select x from t2 where id = 0; select x from t2 where id = 0;
Deadlock found when trying to get lock; Try restarting transaction ERROR 40001: Deadlock found when trying to get lock; Try restarting transaction
commit; commit;
x x
1 1
......
...@@ -48,7 +48,7 @@ id parent_id level ...@@ -48,7 +48,7 @@ id parent_id level
15 102 2 15 102 2
update t1 set id=id+1000; update t1 set id=id+1000;
update t1 set id=1024 where id=1009; update t1 set id=1024 where id=1009;
Duplicate entry '1024' for key 1 ERROR 23000: Duplicate entry '1024' for key 1
select * from t1; select * from t1;
id parent_id level id parent_id level
1001 100 0 1001 100 0
...@@ -270,7 +270,7 @@ n after commit ...@@ -270,7 +270,7 @@ n after commit
commit; commit;
insert into t1 values (5); insert into t1 values (5);
insert into t1 values (4); insert into t1 values (4);
Duplicate entry '4' for key 1 ERROR 23000: Duplicate entry '4' for key 1
commit; commit;
select n, "after commit" from t1; select n, "after commit" from t1;
n after commit n after commit
...@@ -279,7 +279,7 @@ n after commit ...@@ -279,7 +279,7 @@ n after commit
set autocommit=1; set autocommit=1;
insert into t1 values (6); insert into t1 values (6);
insert into t1 values (4); insert into t1 values (4);
Duplicate entry '4' for key 1 ERROR 23000: Duplicate entry '4' for key 1
select n from t1; select n from t1;
n n
4 4
...@@ -309,7 +309,7 @@ drop table t1; ...@@ -309,7 +309,7 @@ drop table t1;
CREATE TABLE t1 (id char(8) not null primary key, val int not null) type=bdb; CREATE TABLE t1 (id char(8) not null primary key, val int not null) type=bdb;
insert into t1 values ('pippo', 12); insert into t1 values ('pippo', 12);
insert into t1 values ('pippo', 12); insert into t1 values ('pippo', 12);
Duplicate entry 'pippo' for key 1 ERROR 23000: Duplicate entry 'pippo' for key 1
delete from t1; delete from t1;
delete from t1 where id = 'pippo'; delete from t1 where id = 'pippo';
select * from t1; select * from t1;
...@@ -464,9 +464,9 @@ UNIQUE ggid (ggid) ...@@ -464,9 +464,9 @@ UNIQUE ggid (ggid)
insert into t1 (ggid,passwd) values ('test1','xxx'); insert into t1 (ggid,passwd) values ('test1','xxx');
insert into t1 (ggid,passwd) values ('test2','yyy'); insert into t1 (ggid,passwd) values ('test2','yyy');
insert into t1 (ggid,passwd) values ('test2','this will fail'); insert into t1 (ggid,passwd) values ('test2','this will fail');
Duplicate entry 'test2' for key 2 ERROR 23000: Duplicate entry 'test2' for key 2
insert into t1 (ggid,id) values ('this will fail',1); insert into t1 (ggid,id) values ('this will fail',1);
Duplicate entry '1' for key 1 ERROR 23000: Duplicate entry '1' for key 1
select * from t1 where ggid='test1'; select * from t1 where ggid='test1';
id ggid email passwd id ggid email passwd
1 test1 xxx 1 test1 xxx
...@@ -479,7 +479,7 @@ id ggid email passwd ...@@ -479,7 +479,7 @@ id ggid email passwd
replace into t1 (ggid,id) values ('this will work',1); replace into t1 (ggid,id) values ('this will work',1);
replace into t1 (ggid,passwd) values ('test2','this will work'); replace into t1 (ggid,passwd) values ('test2','this will work');
update t1 set id=100,ggid='test2' where id=1; update t1 set id=100,ggid='test2' where id=1;
Duplicate entry 'test2' for key 2 ERROR 23000: Duplicate entry 'test2' for key 2
select * from t1; select * from t1;
id ggid email passwd id ggid email passwd
1 this will work 1 this will work
...@@ -1008,7 +1008,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3 ...@@ -1008,7 +1008,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3
insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL');
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
Duplicate entry '1-1' for key 1 ERROR 23000: Duplicate entry '1-1' for key 1
select id from t1; select id from t1;
id id
0 0
...@@ -1026,7 +1026,7 @@ insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJ ...@@ -1026,7 +1026,7 @@ insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJ
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
begin; begin;
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
Duplicate entry '1-1' for key 1 ERROR 23000: Duplicate entry '1-1' for key 1
select id from t1; select id from t1;
id id
0 0
......
...@@ -6,7 +6,7 @@ multi line comment */; ...@@ -6,7 +6,7 @@ multi line comment */;
1 1
1 1
; ;
Query was empty ERROR 42000: Query was empty
select 1 /*!32301 +1 */; select 1 /*!32301 +1 */;
1 /*!32301 +1 1 /*!32301 +1
2 2
......
...@@ -17,29 +17,29 @@ b ...@@ -17,29 +17,29 @@ b
drop table t1; drop table t1;
create table t2 type=heap select * from t1; create table t2 type=heap select * from t1;
Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
create table t2 select auto+1 from t1; create table t2 select auto+1 from t1;
Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
drop table if exists t1,t2; drop table if exists t1,t2;
Warnings: Warnings:
Note 1051 Unknown table 't1' Note 1051 Unknown table 't1'
Note 1051 Unknown table 't2' Note 1051 Unknown table 't2'
create table t1 (b char(0) not null, index(b)); create table t1 (b char(0) not null, index(b));
The used storage engine can't index column 'b' ERROR 42000: The used storage engine can't index column 'b'
create table t1 (a int not null auto_increment,primary key (a)) type=heap; create table t1 (a int not null auto_increment,primary key (a)) type=heap;
create table t1 (a int not null,b text) type=heap; create table t1 (a int not null,b text) type=heap;
The used table type doesn't support BLOB/TEXT columns ERROR 42000: The used table type doesn't support BLOB/TEXT columns
drop table if exists t1; drop table if exists t1;
create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap; create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap;
Incorrect table definition; There can only be one auto column and it must be defined as a key ERROR 42000: Incorrect table definition; There can only be one auto column and it must be defined as a key
create table not_existing_database.test (a int); create table not_existing_database.test (a int);
Got one of the listed errors Got one of the listed errors
create table `a/a` (a int); create table `a/a` (a int);
Incorrect table name 'a/a' ERROR 42000: Incorrect table name 'a/a'
create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int); create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int);
Incorrect table name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ERROR 42000: Incorrect table name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
create table a (`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` int); create table a (`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` int);
Identifier name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' is too long ERROR 42000: Identifier name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' is too long
create table 1ea10 (1a20 int,1e int); create table 1ea10 (1a20 int,1e int);
insert into 1ea10 values(1,1); insert into 1ea10 values(1,1);
select 1ea10.1a20,1e+ 1e+10 from 1ea10; select 1ea10.1a20,1e+ 1e+10 from 1ea10;
...@@ -61,11 +61,11 @@ create table test_$1.test2$ (a int); ...@@ -61,11 +61,11 @@ create table test_$1.test2$ (a int);
drop table test_$1.test2$; drop table test_$1.test2$;
drop database test_$1; drop database test_$1;
create table `` (a int); create table `` (a int);
Incorrect table name '' ERROR 42000: Incorrect table name ''
drop table if exists ``; drop table if exists ``;
Incorrect table name '' ERROR 42000: Incorrect table name ''
create table t1 (`` int); create table t1 (`` int);
Incorrect column name '' ERROR 42000: Incorrect column name ''
drop table if exists t1; drop table if exists t1;
Warnings: Warnings:
Note 1051 Unknown table 't1' Note 1051 Unknown table 't1'
...@@ -115,17 +115,17 @@ Field Type Null Key Default Extra ...@@ -115,17 +115,17 @@ Field Type Null Key Default Extra
a int(11) YES NULL a int(11) YES NULL
drop table if exists t2; drop table if exists t2;
create table t2 (a int, a float) select * from t1; create table t2 (a int, a float) select * from t1;
Duplicate column name 'a' ERROR 42S21: Duplicate column name 'a'
drop table if exists t2; drop table if exists t2;
Warnings: Warnings:
Note 1051 Unknown table 't2' Note 1051 Unknown table 't2'
create table t2 (a int) select a as b, a+1 as b from t1; create table t2 (a int) select a as b, a+1 as b from t1;
Duplicate column name 'b' ERROR 42S21: Duplicate column name 'b'
drop table if exists t2; drop table if exists t2;
Warnings: Warnings:
Note 1051 Unknown table 't2' Note 1051 Unknown table 't2'
create table t2 (b int) select a as b, a+1 as b from t1; create table t2 (b int) select a as b, a+1 as b from t1;
Duplicate column name 'b' ERROR 42S21: Duplicate column name 'b'
drop table if exists t1,t2; drop table if exists t1,t2;
Warnings: Warnings:
Note 1051 Unknown table 't2' Note 1051 Unknown table 't2'
...@@ -204,11 +204,11 @@ drop table t1; ...@@ -204,11 +204,11 @@ drop table t1;
create table t1 ( k1 varchar(2), k2 int, primary key(k1,k2)); create table t1 ( k1 varchar(2), k2 int, primary key(k1,k2));
insert into t1 values ("a", 1), ("b", 2); insert into t1 values ("a", 1), ("b", 2);
insert into t1 values ("c", NULL); insert into t1 values ("c", NULL);
Column 'k2' cannot be null ERROR 23000: Column 'k2' cannot be null
insert into t1 values (NULL, 3); insert into t1 values (NULL, 3);
Column 'k1' cannot be null ERROR 23000: Column 'k1' cannot be null
insert into t1 values (NULL, NULL); insert into t1 values (NULL, NULL);
Column 'k1' cannot be null ERROR 23000: Column 'k1' cannot be null
drop table t1; drop table t1;
create table t1 (a int, key(a)); create table t1 (a int, key(a));
create table t2 (b int, foreign key(b) references t1(a), key(b)); create table t2 (b int, foreign key(b) references t1(a), key(b));
...@@ -273,15 +273,15 @@ select * from t2; ...@@ -273,15 +273,15 @@ select * from t2;
id name id name
create table t3 like t1; create table t3 like t1;
create table t3 like test_$1.t3; create table t3 like test_$1.t3;
Table 't3' already exists ERROR 42S01: Table 't3' already exists
create table non_existing_database.t1 like t1; create table non_existing_database.t1 like t1;
Got one of the listed errors Got one of the listed errors
create table t3 like non_existing_table; create table t3 like non_existing_table;
Unknown table 'non_existing_table' ERROR 42S02: Unknown table 'non_existing_table'
create temporary table t3 like t1; create temporary table t3 like t1;
Table 't3' already exists ERROR 42S01: Table 't3' already exists
create table t3 like `a/a`; create table t3 like `a/a`;
Incorrect table name 'a/a' ERROR 42000: Incorrect table name 'a/a'
drop table t1, t2, t3; drop table t1, t2, t3;
drop table t3; drop table t3;
drop database test_$1; drop database test_$1;
......
...@@ -6,7 +6,7 @@ latin1_f CHAR(32) CHARACTER SET latin1 NOT NULL ...@@ -6,7 +6,7 @@ latin1_f CHAR(32) CHARACTER SET latin1 NOT NULL
CREATE TABLE t2 ( CREATE TABLE t2 (
latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r_general_ci NOT NULL latin1_f CHAR(32) CHARACTER SET latin1 COLLATE koi8r_general_ci NOT NULL
); );
COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' ERROR 42000: COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
INSERT INTO t1 (latin1_f) VALUES (_latin1'A'); INSERT INTO t1 (latin1_f) VALUES (_latin1'A');
INSERT INTO t1 (latin1_f) VALUES (_latin1'a'); INSERT INTO t1 (latin1_f) VALUES (_latin1'a');
INSERT INTO t1 (latin1_f) VALUES (_latin1'AD'); INSERT INTO t1 (latin1_f) VALUES (_latin1'AD');
...@@ -180,7 +180,7 @@ z ...@@ -180,7 +180,7 @@ z
SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r_general_ci; SELECT latin1_f FROM t1 ORDER BY latin1_f COLLATE koi8r_general_ci;
COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' ERROR 42000: COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
SELECT latin1_f COLLATE latin1_swedish_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; SELECT latin1_f COLLATE latin1_swedish_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
latin1_f_as latin1_f_as
A A
...@@ -298,7 +298,7 @@ z ...@@ -298,7 +298,7 @@ z
SELECT latin1_f COLLATE koi8r_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as; SELECT latin1_f COLLATE koi8r_general_ci AS latin1_f_as FROM t1 ORDER BY latin1_f_as;
COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' ERROR 42000: COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f; SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f;
latin1_f count(*) latin1_f count(*)
A 2 A 2
...@@ -390,7 +390,7 @@ z 1 ...@@ -390,7 +390,7 @@ z 1
1 1
1 1
SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r_general_ci; SELECT latin1_f,count(*) FROM t1 GROUP BY latin1_f COLLATE koi8r_general_ci;
COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1' ERROR 42000: COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
SELECT DISTINCT latin1_f FROM t1; SELECT DISTINCT latin1_f FROM t1;
latin1_f latin1_f
A A
...@@ -482,7 +482,7 @@ y ...@@ -482,7 +482,7 @@ y
Z Z
z z
SELECT DISTINCT latin1_f COLLATE koi8r FROM t1; SELECT DISTINCT latin1_f COLLATE koi8r FROM t1;
COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1' ERROR 42000: COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1'
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
...@@ -524,5 +524,5 @@ SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; ...@@ -524,5 +524,5 @@ SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A' charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1 latin1 latin1_swedish_ci 3 1
SET CHARACTER SET 'DEFAULT'; SET CHARACTER SET 'DEFAULT';
Unknown character set: 'DEFAULT' ERROR 42000: Unknown character set: 'DEFAULT'
DROP TABLE t1; DROP TABLE t1;
...@@ -21,7 +21,7 @@ insert delayed into t1 values (1,"b"); ...@@ -21,7 +21,7 @@ insert delayed into t1 values (1,"b");
insert delayed into t1 values (null,"c"); insert delayed into t1 values (null,"c");
insert delayed into t1 values (3,"d"),(null,"e"); insert delayed into t1 values (3,"d"),(null,"e");
insert delayed into t1 values (3,"this will give an","error"); insert delayed into t1 values (3,"this will give an","error");
Column count doesn't match value count at row 1 ERROR 21S01: Column count doesn't match value count at row 1
select * from t1; select * from t1;
a b a b
1 b 1 b
......
...@@ -30,7 +30,7 @@ CREATE TABLE `t1` ( ...@@ -30,7 +30,7 @@ CREATE TABLE `t1` (
PRIMARY KEY (`i`) PRIMARY KEY (`i`)
); );
DELETE FROM t1 USING t1 WHERE post='1'; DELETE FROM t1 USING t1 WHERE post='1';
Unknown column 'post' in 'where clause' ERROR 42S22: Unknown column 'post' in 'where clause'
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
bool char(0) default NULL, bool char(0) default NULL,
......
...@@ -3,9 +3,9 @@ select * from (select 2 from DUAL) b; ...@@ -3,9 +3,9 @@ select * from (select 2 from DUAL) b;
2 2
2 2
SELECT 1 as a FROM (SELECT 1 UNION SELECT a) b; SELECT 1 as a FROM (SELECT 1 UNION SELECT a) b;
Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT 1 as a FROM (SELECT a UNION SELECT 1) b; SELECT 1 as a FROM (SELECT a UNION SELECT 1) b;
Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
CREATE TABLE t1 (a int not null, b char (10) not null); CREATE TABLE t1 (a int not null, b char (10) not null);
insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c');
CREATE TABLE t2 (a int not null, b char (10) not null); CREATE TABLE t2 (a int not null, b char (10) not null);
...@@ -25,18 +25,18 @@ a y ...@@ -25,18 +25,18 @@ a y
3 3 3 3
3 3 3 3
SELECT a FROM (SELECT 1 FROM (SELECT 1) a HAVING a=1) b; SELECT a FROM (SELECT 1 FROM (SELECT 1) a HAVING a=1) b;
Unknown column 'a' in 'having clause' ERROR 42S22: Unknown column 'a' in 'having clause'
SELECT a,b as a FROM (SELECT '1' as a,'2' as b) b HAVING a=1; SELECT a,b as a FROM (SELECT '1' as a,'2' as b) b HAVING a=1;
Column: 'a' in having clause is ambiguous ERROR 23000: Column: 'a' in having clause is ambiguous
SELECT a,2 as a FROM (SELECT '1' as a) b HAVING a=2; SELECT a,2 as a FROM (SELECT '1' as a) b HAVING a=2;
a a a a
1 2 1 2
SELECT a,2 as a FROM (SELECT '1' as a) b HAVING a=1; SELECT a,2 as a FROM (SELECT '1' as a) b HAVING a=1;
a a a a
SELECT 1 FROM (SELECT 1) a WHERE a=2; SELECT 1 FROM (SELECT 1) a WHERE a=2;
Unknown column 'a' in 'where clause' ERROR 42S22: Unknown column 'a' in 'where clause'
SELECT (SELECT 1) as a FROM (SELECT 1 FROM t1 HAVING a=1) as a; SELECT (SELECT 1) as a FROM (SELECT 1 FROM t1 HAVING a=1) as a;
Unknown column 'a' in 'having clause' ERROR 42S22: Unknown column 'a' in 'having clause'
select * from t1 as x1, (select * from t1) as x2; select * from t1 as x1, (select * from t1) as x2;
a b a b a b a b
1 a 1 a 1 a 1 a
...@@ -146,10 +146,17 @@ select * from (select 1 as a) b left join (select 2 as a) c using(a); ...@@ -146,10 +146,17 @@ select * from (select 1 as a) b left join (select 2 as a) c using(a);
a a a a
1 NULL 1 NULL
SELECT * FROM (SELECT 1 UNION SELECT a) b; SELECT * FROM (SELECT 1 UNION SELECT a) b;
Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT 1 as a FROM (SELECT a UNION SELECT 1) b; SELECT 1 as a FROM (SELECT a UNION SELECT 1) b;
Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT 1 as a FROM (SELECT 1 UNION SELECT a) b; SELECT 1 as a FROM (SELECT 1 UNION SELECT a) b;
Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
select 1 from (select 2) a order by 0; select 1 from (select 2) a order by 0;
Unknown column '0' in 'order clause' ERROR 42S22: Unknown column '0' in 'order clause'
create table t1 (id int);
insert into t1 values (1),(2),(3);
describe select * from (select * from t1 group by id) bar;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3
2 DERIVED t1 ALL NULL NULL NULL NULL 3 Using temporary; Using filesort
drop table t1;
...@@ -175,7 +175,7 @@ explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; ...@@ -175,7 +175,7 @@ explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t3 index a a 5 NULL 6 Using index; Using temporary 1 SIMPLE t3 index a a 5 NULL 6 Using index; Using temporary
1 SIMPLE t2 index a a 4 NULL 5 Using index; Distinct 1 SIMPLE t2 index a a 4 NULL 5 Using index; Distinct
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 Using where; Distinct 1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.a 1 Using where; Distinct
SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a;
a a
1 1
...@@ -190,7 +190,7 @@ insert into t3 select * from t4; ...@@ -190,7 +190,7 @@ insert into t3 select * from t4;
explain select distinct t1.a from t1,t3 where t1.a=t3.a; explain select distinct t1.a from t1,t3 where t1.a=t3.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary
1 SIMPLE t3 ref a a 5 t1.a 10 Using where; Using index; Distinct 1 SIMPLE t3 ref a a 5 test.t1.a 10 Using where; Using index; Distinct
select distinct t1.a from t1,t3 where t1.a=t3.a; select distinct t1.a from t1,t3 where t1.a=t3.a;
a a
1 1
......
drop table if exists t1; drop table if exists t1;
drop table t1; drop table t1;
Unknown table 't1' ERROR 42S02: Unknown table 't1'
create table t1(n int); create table t1(n int);
insert into t1 values(1); insert into t1 values(1);
create temporary table t1( n int); create temporary table t1( n int);
insert into t1 values(2); insert into t1 values(2);
create table t1(n int); create table t1(n int);
Table 't1' already exists ERROR 42S01: Table 't1' already exists
drop table t1; drop table t1;
select * from t1; select * from t1;
n n
...@@ -48,4 +48,4 @@ Database ...@@ -48,4 +48,4 @@ Database
mysql mysql
test test
drop database mysqltest; drop database mysqltest;
Can't drop database 'mysqltest'. Database doesn't exist ERROR HY000: Can't drop database 'mysqltest'. Database doesn't exist
drop table if exists t1; drop table if exists t1;
insert into t1 values(1); insert into t1 values(1);
Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
delete from t1; delete from t1;
Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set a=1; update t1 set a=1;
Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
create table t1 (a int); create table t1 (a int);
select count(test.t1.b) from t1; select count(test.t1.b) from t1;
Unknown column 'test.t1.b' in 'field list' ERROR 42S22: Unknown column 'test.t1.b' in 'field list'
select count(not_existing_database.t1) from t1; select count(not_existing_database.t1) from t1;
Unknown table 'not_existing_database' in field list ERROR 42S02: Unknown table 'not_existing_database' in field list
select count(not_existing_database.t1.a) from t1; select count(not_existing_database.t1.a) from t1;
Unknown table 'not_existing_database.t1' in field list ERROR 42S02: Unknown table 'not_existing_database.t1' in field list
select count(not_existing_database.t1.a) from not_existing_database.t1; select count(not_existing_database.t1.a) from not_existing_database.t1;
Got one of the listed errors Got one of the listed errors
select 1 from t1 order by 2; select 1 from t1 order by 2;
Unknown column '2' in 'order clause' ERROR 42S22: Unknown column '2' in 'order clause'
select 1 from t1 group by 2; select 1 from t1 group by 2;
Unknown column '2' in 'group statement' ERROR 42S22: Unknown column '2' in 'group statement'
select 1 from t1 order by t1.b; select 1 from t1 order by t1.b;
Unknown column 't1.b' in 'order clause' ERROR 42S22: Unknown column 't1.b' in 'order clause'
select count(*),b from t1; select count(*),b from t1;
Unknown column 'b' in 'field list' ERROR 42S22: Unknown column 'b' in 'field list'
drop table t1; drop table t1;
...@@ -24,9 +24,9 @@ explain select * from t1 use key (str,str) where str="foo"; ...@@ -24,9 +24,9 @@ explain select * from t1 use key (str,str) where str="foo";
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const str str 11 const 1 1 SIMPLE t1 const str str 11 const 1
explain select * from t1 use key (str,str,foo) where str="foo"; explain select * from t1 use key (str,str,foo) where str="foo";
Key column 'foo' doesn't exist in table ERROR 42000: Key column 'foo' doesn't exist in table
explain select * from t1 ignore key (str,str,foo) where str="foo"; explain select * from t1 ignore key (str,str,foo) where str="foo";
Key column 'foo' doesn't exist in table ERROR 42000: Key column 'foo' doesn't exist in table
drop table t1; drop table t1;
explain select 1; explain select 1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
......
...@@ -8,7 +8,7 @@ n ...@@ -8,7 +8,7 @@ n
3 3
flush tables with read lock; flush tables with read lock;
drop table t2; drop table t2;
Table 't2' was locked with a READ lock and can't be updated ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
drop table t2; drop table t2;
unlock tables; unlock tables;
create database mysqltest; create database mysqltest;
......
...@@ -162,11 +162,11 @@ KEY tig (ticket), ...@@ -162,11 +162,11 @@ KEY tig (ticket),
fulltext index tix (inhalt) fulltext index tix (inhalt)
); );
select * from t2 where MATCH inhalt AGAINST (t2.inhalt); select * from t2 where MATCH inhalt AGAINST (t2.inhalt);
Wrong arguments to AGAINST ERROR HY000: Wrong arguments to AGAINST
select * from t2 where MATCH ticket AGAINST ('foobar'); select * from t2 where MATCH ticket AGAINST ('foobar');
Can't find FULLTEXT index matching the column list ERROR HY000: Can't find FULLTEXT index matching the column list
select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar'); select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar');
Wrong arguments to MATCH ERROR HY000: Wrong arguments to MATCH
drop table t1,t2,t3; drop table t1,t2,t3;
CREATE TABLE t1 ( CREATE TABLE t1 (
id int(11) auto_increment, id int(11) auto_increment,
......
...@@ -173,7 +173,7 @@ REQ_ID URL ...@@ -173,7 +173,7 @@ REQ_ID URL
drop table T_URL; drop table T_URL;
drop table T_REQUEST; drop table T_REQUEST;
select group_concat(sum(a)) from t1 group by grp; select group_concat(sum(a)) from t1 group by grp;
Invalid use of group function ERROR HY000: Invalid use of group function
select grp,group_concat(c order by 2) from t1 group by grp; select grp,group_concat(c order by 2) from t1 group by grp;
Unknown column '2' in 'group statement' ERROR 42S22: Unknown column '2' in 'group statement'
drop table t1; drop table t1;
...@@ -64,7 +64,7 @@ concat_ws(NULL,'a') concat_ws(',',NULL,'') ...@@ -64,7 +64,7 @@ concat_ws(NULL,'a') concat_ws(',',NULL,'')
NULL NULL
select concat_ws(',','',NULL,'a'); select concat_ws(',','',NULL,'a');
concat_ws(',','',NULL,'a') concat_ws(',','',NULL,'a')
a ,a
SELECT CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"'); SELECT CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"');
CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"') CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"')
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
......
...@@ -37,13 +37,13 @@ version()>=_latin1"3.23.29" ...@@ -37,13 +37,13 @@ version()>=_latin1"3.23.29"
select charset(version()); select charset(version());
charset(version()) charset(version())
utf8 utf8
create table t1 select database(), user(), version(); create table t1 (version char(40)) select database(), user(), version() as 'version';
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`database()` char(102) character set utf8 NOT NULL default '', `database()` char(102) character set utf8 NOT NULL default '',
`user()` char(231) character set utf8 NOT NULL default '', `user()` char(231) character set utf8 NOT NULL default '',
`version()` char(21) character set utf8 NOT NULL default '' `version` char(40) character set utf8 default NULL
) TYPE=MyISAM CHARSET=latin1 ) TYPE=MyISAM CHARSET=latin1
drop table t1; drop table t1;
select TRUE,FALSE,NULL; select TRUE,FALSE,NULL;
......
drop table if exists t1;
create table t1 (a int);
delete from mysql.user where user='mysqltest_1'; delete from mysql.user where user='mysqltest_1';
delete from mysql.db where user='mysqltest_1'; delete from mysql.db where user='mysqltest_1';
flush privileges; flush privileges;
...@@ -69,3 +71,36 @@ show grants for user@localhost; ...@@ -69,3 +71,36 @@ show grants for user@localhost;
Grants for user@localhost Grants for user@localhost
GRANT USAGE ON *.* TO 'user'@'localhost' GRANT USAGE ON *.* TO 'user'@'localhost'
GRANT USAGE ON `test`.* TO 'user'@'localhost' WITH GRANT OPTION GRANT USAGE ON `test`.* TO 'user'@'localhost' WITH GRANT OPTION
grant ALL PRIVILEGES on *.* to drop_user2@localhost with GRANT OPTION;
show grants for drop_user2@localhost;
Grants for drop_user2@localhost
GRANT ALL PRIVILEGES ON *.* TO 'drop_user2'@'localhost' WITH GRANT OPTION
revoke all privileges, grant from drop_user2@localhost;
drop user drop_user2@localhost;
grant ALL PRIVILEGES on *.* to drop_user@localhost with GRANT OPTION;
grant ALL PRIVILEGES on test.* to drop_user@localhost with GRANT OPTION;
grant select(a) on test.t1 to drop_user@localhost;
show grants for drop_user@localhost;
Grants for drop_user@localhost
GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION
GRANT ALL PRIVILEGES ON `test`.* TO 'drop_user'@'localhost' WITH GRANT OPTION
GRANT SELECT (a) ON `test`.`t1` TO 'drop_user'@'localhost'
revoke all privileges, grant from drop_user@localhost;
show grants for drop_user@localhost;
Grants for drop_user@localhost
GRANT USAGE ON *.* TO 'drop_user'@'localhost'
drop user drop_user@localhost;
revoke all privileges, grant from drop_user@localhost;
Can't revoke all privileges, grant for one or more of the requested users
grant select(a) on test.t1 to drop_user1@localhost;
grant select on test.t1 to drop_user2@localhost;
grant select on test.* to drop_user3@localhost;
grant select on *.* to drop_user4@localhost;
drop user drop_user1@localhost, drop_user2@localhost, drop_user3@localhost,
drop_user4@localhost;
Can't drop one or more of the requested users
revoke all privileges, grant from drop_user1@localhost, drop_user2@localhost,
drop_user3@localhost, drop_user4@localhost;
drop user drop_user1@localhost, drop_user2@localhost, drop_user3@localhost,
drop_user4@localhost;
drop table t1;
...@@ -84,7 +84,7 @@ a b c a ...@@ -84,7 +84,7 @@ a b c a
1 1 1 test.t1 1 1 1 test.t1
2 2 2 test.t1 2 2 2 test.t1
select * from t2; select * from t2;
select command denied to user: 'mysqltest_2@localhost' for table 't2' ERROR 42000: select command denied to user: 'mysqltest_2@localhost' for table 't2'
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 6 Qcache_queries_in_cache 6
...@@ -98,17 +98,17 @@ select "user3"; ...@@ -98,17 +98,17 @@ select "user3";
user3 user3
user3 user3
select * from t1; select * from t1;
select command denied to user: 'mysqltest_3@localhost' for column 'b' in table 't1' ERROR 42000: select command denied to user: 'mysqltest_3@localhost' for column 'b' in table 't1'
select a from t1; select a from t1;
a a
1 1
2 2
select c from t1; select c from t1;
SELECT command denied to user: 'mysqltest_3@localhost' for column 'c' in table 't1' ERROR 42000: SELECT command denied to user: 'mysqltest_3@localhost' for column 'c' in table 't1'
select * from t2; select * from t2;
select command denied to user: 'mysqltest_3@localhost' for table 't2' ERROR 42000: select command denied to user: 'mysqltest_3@localhost' for table 't2'
select mysqltest.t1.c from test.t1,mysqltest.t1; select mysqltest.t1.c from test.t1,mysqltest.t1;
SELECT command denied to user: 'mysqltest_3@localhost' for column 'c' in table 't1' ERROR 42000: SELECT command denied to user: 'mysqltest_3@localhost' for column 'c' in table 't1'
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 6 Qcache_queries_in_cache 6
...@@ -122,7 +122,7 @@ select "user4"; ...@@ -122,7 +122,7 @@ select "user4";
user4 user4
user4 user4
select a from t1; select a from t1;
No Database Selected ERROR 42000: No Database Selected
select * from mysqltest.t1,test.t1; select * from mysqltest.t1,test.t1;
a b c a a b c a
1 1 1 test.t1 1 1 1 test.t1
......
drop table if exists t1,t2,t3; drop table if exists t1,t2,t3;
SELECT 1 FROM (SELECT 1) as a GROUP BY SUM(1); SELECT 1 FROM (SELECT 1) as a GROUP BY SUM(1);
Invalid use of group function ERROR HY000: Invalid use of group function
CREATE TABLE t1 ( CREATE TABLE t1 (
spID int(10) unsigned, spID int(10) unsigned,
userID int(10) unsigned, userID int(10) unsigned,
...@@ -56,7 +56,7 @@ userid MIN(t1.score+0.0) ...@@ -56,7 +56,7 @@ userid MIN(t1.score+0.0)
EXPLAIN SELECT t2.userid, MIN(t1.score+0.0) FROM t1, t2 WHERE t1.userID=t2.userID AND t1.spID=2 GROUP BY t2.userid ORDER BY NULL; EXPLAIN SELECT t2.userid, MIN(t1.score+0.0) FROM t1, t2 WHERE t1.userID=t2.userID AND t1.spID=2 GROUP BY t2.userid ORDER BY NULL;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where; Using temporary 1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where; Using temporary
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 t1.userID 1 Using index 1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.userID 1 Using index
drop table t1,t2; drop table t1,t2;
CREATE TABLE t1 ( CREATE TABLE t1 (
PID int(10) unsigned NOT NULL auto_increment, PID int(10) unsigned NOT NULL auto_increment,
...@@ -79,7 +79,7 @@ KEY payDate (payDate) ...@@ -79,7 +79,7 @@ KEY payDate (payDate)
); );
INSERT INTO t1 VALUES (1,'1970-01-01','1997-10-17 00:00:00',2529,1,21000,11886,'check',0,'F',16200,6); INSERT INTO t1 VALUES (1,'1970-01-01','1997-10-17 00:00:00',2529,1,21000,11886,'check',0,'F',16200,6);
SELECT COUNT(P.URID),SUM(P.amount),P.method, MIN(PP.recdate+0) > 19980501000000 AS IsNew FROM t1 AS P JOIN t1 as PP WHERE P.URID = PP.URID GROUP BY method,IsNew; SELECT COUNT(P.URID),SUM(P.amount),P.method, MIN(PP.recdate+0) > 19980501000000 AS IsNew FROM t1 AS P JOIN t1 as PP WHERE P.URID = PP.URID GROUP BY method,IsNew;
Can't group on 'IsNew' ERROR 42000: Can't group on 'IsNew'
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
cid mediumint(9) NOT NULL auto_increment, cid mediumint(9) NOT NULL auto_increment,
......
...@@ -6,7 +6,7 @@ insert into t1 values ...@@ -6,7 +6,7 @@ insert into t1 values
(20,"ggg"),(21,"hhh"),(22,"iii"); (20,"ggg"),(21,"hhh"),(22,"iii");
handler t1 open as t2; handler t1 open as t2;
handler t2 read a=(SELECT 1); handler t2 read a=(SELECT 1);
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT 1)' at line 1 ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT 1)' at line 1
handler t2 read a first; handler t2 read a first;
a b a b
14 aaa 14 aaa
...@@ -51,7 +51,7 @@ handler t2 read a=(16); ...@@ -51,7 +51,7 @@ handler t2 read a=(16);
a b a b
16 ccc 16 ccc
handler t2 read a=(19,"fff"); handler t2 read a=(19,"fff");
Too many key parts specified. Max 1 parts allowed ERROR 42000: Too many key parts specified. Max 1 parts allowed
handler t2 read b=(19,"fff"); handler t2 read b=(19,"fff");
a b a b
19 fff 19 fff
...@@ -62,7 +62,7 @@ handler t2 read b=(19); ...@@ -62,7 +62,7 @@ handler t2 read b=(19);
a b a b
19 fff 19 fff
handler t1 read a last; handler t1 read a last;
Unknown table 't1' in HANDLER ERROR 42S02: Unknown table 't1' in HANDLER
handler t2 read a=(11); handler t2 read a=(11);
a b a b
handler t2 read a>=(11); handler t2 read a>=(11);
...@@ -135,16 +135,16 @@ handler t2 read next; ...@@ -135,16 +135,16 @@ handler t2 read next;
a b a b
19 fff 19 fff
handler t2 read last; handler t2 read last;
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
handler t2 close; handler t2 close;
handler t1 open as t2; handler t1 open as t2;
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);
insert into t1 values (17); insert into t1 values (17);
handler t2 read first; handler t2 read first;
Unknown table 't2' in HANDLER ERROR 42S02: Unknown table 't2' in HANDLER
handler t1 open as t2; handler t1 open as t2;
alter table t1 type=MyISAM; alter table t1 type=MyISAM;
handler t2 read first; handler t2 read first;
Unknown table 't2' in HANDLER ERROR 42S02: Unknown table 't2' in HANDLER
drop table t1; drop table t1;
Variable_name Value
timezone MEST
...@@ -86,7 +86,7 @@ x y x y ...@@ -86,7 +86,7 @@ x y x y
explain select * from t1,t1 as t2 where t1.x=t2.y; explain select * from t1,t1 as t2 where t1.x=t2.y;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL x NULL NULL NULL 6 1 SIMPLE t1 ALL x NULL NULL NULL 6
1 SIMPLE t2 eq_ref y y 4 t1.x 1 1 SIMPLE t2 eq_ref y y 4 test.t1.x 1
drop table t1; drop table t1;
create table t1 (a int) type=heap; create table t1 (a int) type=heap;
insert into t1 values(1); insert into t1 values(1);
...@@ -201,7 +201,7 @@ SELECT * FROM t1 WHERE b<=>NULL; ...@@ -201,7 +201,7 @@ SELECT * FROM t1 WHERE b<=>NULL;
a b a b
99 NULL 99 NULL
INSERT INTO t1 VALUES (1,3); INSERT INTO t1 VALUES (1,3);
Duplicate entry '3' for key 1 ERROR 23000: Duplicate entry '3' for key 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a int not null, primary key(a)) type=heap; CREATE TABLE t1 (a int not null, primary key(a)) type=heap;
INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11);
......
...@@ -89,7 +89,7 @@ x y x y ...@@ -89,7 +89,7 @@ x y x y
explain select * from t1,t1 as t2 where t1.x=t2.y; explain select * from t1,t1 as t2 where t1.x=t2.y;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL x NULL NULL NULL 6 1 SIMPLE t1 ALL x NULL NULL NULL 6
1 SIMPLE t2 eq_ref y y 4 t1.x 1 1 SIMPLE t2 eq_ref y y 4 test.t1.x 1
drop table t1; drop table t1;
create table t1 (a int) type=heap; create table t1 (a int) type=heap;
insert into t1 values(1); insert into t1 values(1);
...@@ -217,7 +217,7 @@ SELECT * FROM t1 WHERE b<=>NULL; ...@@ -217,7 +217,7 @@ SELECT * FROM t1 WHERE b<=>NULL;
a b a b
99 NULL 99 NULL
INSERT INTO t1 VALUES (1,3); INSERT INTO t1 VALUES (1,3);
Duplicate entry '3' for key 1 ERROR 23000: Duplicate entry '3' for key 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a int, b int, c int, key using BTREE (a, b, c)) type=heap; CREATE TABLE t1 (a int, b int, c int, key using BTREE (a, b, c)) type=heap;
INSERT INTO t1 VALUES (1, NULL, NULL), (1, 1, NULL), (1, NULL, 1); INSERT INTO t1 VALUES (1, NULL, NULL), (1, 1, NULL), (1, NULL, 1);
......
...@@ -86,7 +86,7 @@ x y x y ...@@ -86,7 +86,7 @@ x y x y
explain select * from t1,t1 as t2 where t1.x=t2.y; explain select * from t1,t1 as t2 where t1.x=t2.y;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL x NULL NULL NULL 6 1 SIMPLE t1 ALL x NULL NULL NULL 6
1 SIMPLE t2 eq_ref y y 4 t1.x 1 1 SIMPLE t2 eq_ref y y 4 test.t1.x 1
drop table t1; drop table t1;
create table t1 (a int) type=heap; create table t1 (a int) type=heap;
insert into t1 values(1); insert into t1 values(1);
...@@ -201,7 +201,7 @@ SELECT * FROM t1 WHERE b<=>NULL; ...@@ -201,7 +201,7 @@ SELECT * FROM t1 WHERE b<=>NULL;
a b a b
99 NULL 99 NULL
INSERT INTO t1 VALUES (1,3); INSERT INTO t1 VALUES (1,3);
Duplicate entry '3' for key 1 ERROR 23000: Duplicate entry '3' for key 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a int not null, primary key using HASH (a)) type=heap; CREATE TABLE t1 (a int not null, primary key using HASH (a)) type=heap;
INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11);
......
...@@ -224,7 +224,7 @@ n after commit ...@@ -224,7 +224,7 @@ n after commit
commit; commit;
insert into t1 values (5); insert into t1 values (5);
insert into t1 values (4); insert into t1 values (4);
Duplicate entry '4' for key 1 ERROR 23000: Duplicate entry '4' for key 1
commit; commit;
select n, "after commit" from t1; select n, "after commit" from t1;
n after commit n after commit
...@@ -233,7 +233,7 @@ n after commit ...@@ -233,7 +233,7 @@ n after commit
set autocommit=1; set autocommit=1;
insert into t1 values (6); insert into t1 values (6);
insert into t1 values (4); insert into t1 values (4);
Duplicate entry '4' for key 1 ERROR 23000: Duplicate entry '4' for key 1
select n from t1; select n from t1;
n n
4 4
...@@ -263,7 +263,7 @@ drop table t1; ...@@ -263,7 +263,7 @@ drop table t1;
CREATE TABLE t1 (id char(8) not null primary key, val int not null) type=innodb; CREATE TABLE t1 (id char(8) not null primary key, val int not null) type=innodb;
insert into t1 values ('pippo', 12); insert into t1 values ('pippo', 12);
insert into t1 values ('pippo', 12); insert into t1 values ('pippo', 12);
Duplicate entry 'pippo' for key 1 ERROR 23000: Duplicate entry 'pippo' for key 1
delete from t1; delete from t1;
delete from t1 where id = 'pippo'; delete from t1 where id = 'pippo';
select * from t1; select * from t1;
...@@ -427,9 +427,9 @@ UNIQUE ggid (ggid) ...@@ -427,9 +427,9 @@ UNIQUE ggid (ggid)
insert into t1 (ggid,passwd) values ('test1','xxx'); insert into t1 (ggid,passwd) values ('test1','xxx');
insert into t1 (ggid,passwd) values ('test2','yyy'); insert into t1 (ggid,passwd) values ('test2','yyy');
insert into t1 (ggid,passwd) values ('test2','this will fail'); insert into t1 (ggid,passwd) values ('test2','this will fail');
Duplicate entry 'test2' for key 2 ERROR 23000: Duplicate entry 'test2' for key 2
insert into t1 (ggid,id) values ('this will fail',1); insert into t1 (ggid,id) values ('this will fail',1);
Duplicate entry '1' for key 1 ERROR 23000: Duplicate entry '1' for key 1
select * from t1 where ggid='test1'; select * from t1 where ggid='test1';
id ggid email passwd id ggid email passwd
1 test1 xxx 1 test1 xxx
...@@ -442,7 +442,7 @@ id ggid email passwd ...@@ -442,7 +442,7 @@ id ggid email passwd
replace into t1 (ggid,id) values ('this will work',1); replace into t1 (ggid,id) values ('this will work',1);
replace into t1 (ggid,passwd) values ('test2','this will work'); replace into t1 (ggid,passwd) values ('test2','this will work');
update t1 set id=100,ggid='test2' where id=1; update t1 set id=100,ggid='test2' where id=1;
Duplicate entry 'test2' for key 2 ERROR 23000: Duplicate entry 'test2' for key 2
select * from t1; select * from t1;
id ggid email passwd id ggid email passwd
1 this will work 1 this will work
...@@ -753,7 +753,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3 ...@@ -753,7 +753,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3
insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL');
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
Duplicate entry '1-1' for key 1 ERROR 23000: Duplicate entry '1-1' for key 1
select id from t1; select id from t1;
id id
0 0
...@@ -771,7 +771,7 @@ insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJ ...@@ -771,7 +771,7 @@ insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJ
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
begin; begin;
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
Duplicate entry '1-1' for key 1 ERROR 23000: Duplicate entry '1-1' for key 1
select id from t1; select id from t1;
id id
0 0
...@@ -788,7 +788,7 @@ id id3 ...@@ -788,7 +788,7 @@ id id3
UNLOCK TABLES; UNLOCK TABLES;
DROP TABLE t1; DROP TABLE t1;
create table t1 (a char(20), unique (a(5))) type=innodb; create table t1 (a char(20), unique (a(5))) type=innodb;
Incorrect sub part key. The used key part isn't a string, the used length is longer than the key part or the store engine doesn't support unique sub keys ERROR HY000: Incorrect sub part key. The used key part isn't a string, the used length is longer than the key part or the store engine doesn't support unique sub keys
create table t1 (a char(20), index (a(5))) type=innodb; create table t1 (a char(20), index (a(5))) type=innodb;
show create table t1; show create table t1;
Table Create Table Table Create Table
...@@ -851,7 +851,7 @@ set autocommit=0; ...@@ -851,7 +851,7 @@ set autocommit=0;
create table t1 (a int not null) type= innodb; create table t1 (a int not null) type= innodb;
insert into t1 values(1),(2); insert into t1 values(1),(2);
truncate table t1; truncate table t1;
Can't execute the given command because you have active locked tables or an active transaction ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
commit; commit;
truncate table t1; truncate table t1;
select * from t1; select * from t1;
......
...@@ -49,7 +49,7 @@ handler t2 read a=(16); ...@@ -49,7 +49,7 @@ handler t2 read a=(16);
a b a b
16 ccc 16 ccc
handler t2 read a=(19,"fff"); handler t2 read a=(19,"fff");
Too many key parts specified. Max 1 parts allowed ERROR 42000: Too many key parts specified. Max 1 parts allowed
handler t2 read b=(19,"fff"); handler t2 read b=(19,"fff");
a b a b
19 fff 19 fff
...@@ -60,7 +60,7 @@ handler t2 read b=(19); ...@@ -60,7 +60,7 @@ handler t2 read b=(19);
a b a b
19 fff 19 fff
handler t1 read a last; handler t1 read a last;
Unknown table 't1' in HANDLER ERROR 42S02: Unknown table 't1' in HANDLER
handler t2 read a=(11); handler t2 read a=(11);
a b a b
handler t2 read a>=(11); handler t2 read a>=(11);
...@@ -130,7 +130,7 @@ handler t2 read next; ...@@ -130,7 +130,7 @@ handler t2 read next;
a b a b
18 eee 18 eee
handler t2 read last; handler t2 read last;
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
handler t2 close; handler t2 close;
handler t1 open as t2; handler t1 open as t2;
handler t2 read first; handler t2 read first;
...@@ -138,7 +138,7 @@ a b ...@@ -138,7 +138,7 @@ a b
17 ddd 17 ddd
alter table t1 type=innodb; alter table t1 type=innodb;
handler t2 read first; handler t2 read first;
Unknown table 't2' in HANDLER ERROR 42S02: Unknown table 't2' in HANDLER
drop table t1; drop table t1;
CREATE TABLE t1 ( no1 smallint(5) NOT NULL default '0', no2 int(10) NOT NULL default '0', PRIMARY KEY (no1,no2)) TYPE=InnoDB; CREATE TABLE t1 ( no1 smallint(5) NOT NULL default '0', no2 int(10) NOT NULL default '0', PRIMARY KEY (no1,no2)) TYPE=InnoDB;
INSERT INTO t1 VALUES (1,274),(1,275),(2,6),(2,8),(4,1),(4,2); INSERT INTO t1 VALUES (1,274),(1,275),(2,6),(2,8),(4,1),(4,2);
......
...@@ -4,7 +4,7 @@ insert into t1 (bandID,payoutID) VALUES (1,6),(2,6),(3,4),(4,9),(5,10),(6,1),(7, ...@@ -4,7 +4,7 @@ insert into t1 (bandID,payoutID) VALUES (1,6),(2,6),(3,4),(4,9),(5,10),(6,1),(7,
create table t2 (payoutID SMALLINT UNSIGNED NOT NULL PRIMARY KEY); create table t2 (payoutID SMALLINT UNSIGNED NOT NULL PRIMARY KEY);
insert into t2 (payoutID) SELECT DISTINCT payoutID FROM t1; insert into t2 (payoutID) SELECT DISTINCT payoutID FROM t1;
insert into t2 (payoutID) SELECT payoutID+10 FROM t1; insert into t2 (payoutID) SELECT payoutID+10 FROM t1;
Duplicate entry '16' for key 1 ERROR 23000: Duplicate entry '16' for key 1
insert ignore into t2 (payoutID) SELECT payoutID+10 FROM t1; insert ignore into t2 (payoutID) SELECT payoutID+10 FROM t1;
select * from t2; select * from t2;
payoutID payoutID
...@@ -65,3 +65,14 @@ INSERT INTO t1 (numeropost,icone,contenu,pseudo,date,signature,ip) ...@@ -65,3 +65,14 @@ INSERT INTO t1 (numeropost,icone,contenu,pseudo,date,signature,ip)
SELECT 1718,icone,contenu,pseudo,date,signature,ip FROM t2 SELECT 1718,icone,contenu,pseudo,date,signature,ip FROM t2
WHERE numeropost=9 ORDER BY numreponse ASC; WHERE numeropost=9 ORDER BY numreponse ASC;
DROP TABLE IF EXISTS t1,t2; DROP TABLE IF EXISTS t1,t2;
create table t1(a int, unique(a));
insert into t1 values(2);
create table t2(a int);
insert into t2 values(1),(2);
reset master;
insert into t1 select * from t2;
ERROR 23000: Duplicate entry '2' for key 1
show binlog events;
Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.000001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3
drop table t1, t2;
...@@ -26,7 +26,7 @@ a b c ...@@ -26,7 +26,7 @@ a b c
3 4 1020 3 4 1020
5 6 130 5 6 130
INSERT t1 VALUES (1,9,70) ON DUPLICATE KEY UPDATE c=c+100000, b=4; INSERT t1 VALUES (1,9,70) ON DUPLICATE KEY UPDATE c=c+100000, b=4;
Duplicate entry '4' for key 2 ERROR 23000: Duplicate entry '4' for key 2
SELECT * FROM t1; SELECT * FROM t1;
a b c a b c
1 2 10010 1 2 10010
......
...@@ -128,7 +128,7 @@ a ...@@ -128,7 +128,7 @@ a
1 1
2 2
select t1.a from t1 as t1 left join t1 as t2 using (a) left join t1 as t3 using (a) left join t1 as t4 using (a) left join t1 as t5 using (a) left join t1 as t6 using (a) left join t1 as t7 using (a) left join t1 as t8 using (a) left join t1 as t9 using (a) left join t1 as t10 using (a) left join t1 as t11 using (a) left join t1 as t12 using (a) left join t1 as t13 using (a) left join t1 as t14 using (a) left join t1 as t15 using (a) left join t1 as t16 using (a) left join t1 as t17 using (a) left join t1 as t18 using (a) left join t1 as t19 using (a) left join t1 as t20 using (a) left join t1 as t21 using (a) left join t1 as t22 using (a) left join t1 as t23 using (a) left join t1 as t24 using (a) left join t1 as t25 using (a) left join t1 as t26 using (a) left join t1 as t27 using (a) left join t1 as t28 using (a) left join t1 as t29 using (a) left join t1 as t30 using (a) left join t1 as t31 using (a) left join t1 as t32 using (a) left join t1 as t33 using (a) left join t1 as t34 using (a) left join t1 as t35 using (a) left join t1 as t36 using (a) left join t1 as t37 using (a) left join t1 as t38 using (a) left join t1 as t39 using (a) left join t1 as t40 using (a) left join t1 as t41 using (a) left join t1 as t42 using (a) left join t1 as t43 using (a) left join t1 as t44 using (a) left join t1 as t45 using (a) left join t1 as t46 using (a) left join t1 as t47 using (a) left join t1 as t48 using (a) left join t1 as t49 using (a) left join t1 as t50 using (a) left join t1 as t51 using (a) left join t1 as t52 using (a) left join t1 as t53 using (a) left join t1 as t54 using (a) left join t1 as t55 using (a) left join t1 as t56 using (a) left join t1 as t57 using (a) left join t1 as t58 using (a) left join t1 as t59 using (a) left join t1 as t60 using (a) left join t1 as t61 using (a) left join t1 as t62 using (a) left join t1 as t63 using (a) left join t1 as t64 using (a) left join t1 as t65 using (a); select t1.a from t1 as t1 left join t1 as t2 using (a) left join t1 as t3 using (a) left join t1 as t4 using (a) left join t1 as t5 using (a) left join t1 as t6 using (a) left join t1 as t7 using (a) left join t1 as t8 using (a) left join t1 as t9 using (a) left join t1 as t10 using (a) left join t1 as t11 using (a) left join t1 as t12 using (a) left join t1 as t13 using (a) left join t1 as t14 using (a) left join t1 as t15 using (a) left join t1 as t16 using (a) left join t1 as t17 using (a) left join t1 as t18 using (a) left join t1 as t19 using (a) left join t1 as t20 using (a) left join t1 as t21 using (a) left join t1 as t22 using (a) left join t1 as t23 using (a) left join t1 as t24 using (a) left join t1 as t25 using (a) left join t1 as t26 using (a) left join t1 as t27 using (a) left join t1 as t28 using (a) left join t1 as t29 using (a) left join t1 as t30 using (a) left join t1 as t31 using (a) left join t1 as t32 using (a) left join t1 as t33 using (a) left join t1 as t34 using (a) left join t1 as t35 using (a) left join t1 as t36 using (a) left join t1 as t37 using (a) left join t1 as t38 using (a) left join t1 as t39 using (a) left join t1 as t40 using (a) left join t1 as t41 using (a) left join t1 as t42 using (a) left join t1 as t43 using (a) left join t1 as t44 using (a) left join t1 as t45 using (a) left join t1 as t46 using (a) left join t1 as t47 using (a) left join t1 as t48 using (a) left join t1 as t49 using (a) left join t1 as t50 using (a) left join t1 as t51 using (a) left join t1 as t52 using (a) left join t1 as t53 using (a) left join t1 as t54 using (a) left join t1 as t55 using (a) left join t1 as t56 using (a) left join t1 as t57 using (a) left join t1 as t58 using (a) left join t1 as t59 using (a) left join t1 as t60 using (a) left join t1 as t61 using (a) left join t1 as t62 using (a) left join t1 as t63 using (a) left join t1 as t64 using (a) left join t1 as t65 using (a);
Too many tables. MySQL can only use XX tables in a join ERROR HY000: Too many tables. MySQL can only use XX tables in a join
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
a int(11) NOT NULL, a int(11) NOT NULL,
......
...@@ -95,7 +95,7 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -95,7 +95,7 @@ id select_type table type possible_keys key key_len ref rows Extra
explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1; explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 7 1 SIMPLE t1 ALL NULL NULL NULL NULL 7
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 t1.a 1 Using where 1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 test.t1.a 1 Using where
select t1.*,t2.*,t3.a from t1 left join t2 on (t1.a=t2.a) left join t1 as t3 on (t2.a=t3.a); select t1.*,t2.*,t3.a from t1 left join t2 on (t1.a=t2.a) left join t1 as t3 on (t2.a=t3.a);
grp a c id a c d a grp a c id a c d a
1 1 a 1 1 a 1 1 1 1 a 1 1 a 1 1
...@@ -106,11 +106,11 @@ grp a c id a c d a ...@@ -106,11 +106,11 @@ grp a c id a c d a
3 6 D 3 6 C 6 6 3 6 D 3 6 C 6 6
NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
explain select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t1.a=t3.a); explain select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t1.a=t3.a);
Cross dependency found in OUTER JOIN. Examine your ON conditions ERROR 42000: Cross dependency found in OUTER JOIN. Examine your ON conditions
select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t1.a=t3.a); select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t1.a=t3.a);
Cross dependency found in OUTER JOIN. Examine your ON conditions ERROR 42000: Cross dependency found in OUTER JOIN. Examine your ON conditions
select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t2.a=t3.a); select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t2.a=t3.a);
Cross dependency found in OUTER JOIN. Examine your ON conditions ERROR 42000: Cross dependency found in OUTER JOIN. Examine your ON conditions
select t1.*,t2.* from t1 inner join t2 using (a); select t1.*,t2.* from t1 inner join t2 using (a);
grp a c id a c d grp a c id a c d
1 1 a 1 1 a 1 1 1 a 1 1 a 1
...@@ -169,7 +169,7 @@ usr_id uniq_id increment usr2_id c_amount max ...@@ -169,7 +169,7 @@ usr_id uniq_id increment usr2_id c_amount max
3 4 84676 NULL NULL NULL 3 4 84676 NULL NULL NULL
INSERT INTO t2 VALUES (2,3,3000,6000,0,0,746584,837484,'yes'); INSERT INTO t2 VALUES (2,3,3000,6000,0,0,746584,837484,'yes');
INSERT INTO t2 VALUES (2,3,3000,6000,0,0,746584,837484,'yes'); INSERT INTO t2 VALUES (2,3,3000,6000,0,0,746584,837484,'yes');
Duplicate entry '2-3' for key 1 ERROR 23000: Duplicate entry '2-3' for key 1
INSERT INTO t2 VALUES (7,3,1000,2000,0,0,746294,937484,'yes'); INSERT INTO t2 VALUES (7,3,1000,2000,0,0,746294,937484,'yes');
SELECT t1.usr_id,t1.uniq_id,t1.increment,t2.usr2_id,t2.c_amount,t2.max FROM t1 LEFT JOIN t2 ON t2.id = t1.uniq_id WHERE t1.uniq_id = 4 ORDER BY t2.c_amount; SELECT t1.usr_id,t1.uniq_id,t1.increment,t2.usr2_id,t2.c_amount,t2.max FROM t1 LEFT JOIN t2 ON t2.id = t1.uniq_id WHERE t1.uniq_id = 4 ORDER BY t2.c_amount;
usr_id uniq_id increment usr2_id c_amount max usr_id uniq_id increment usr2_id c_amount max
...@@ -406,7 +406,7 @@ insert into t3 values (1); ...@@ -406,7 +406,7 @@ insert into t3 values (1);
insert into t4 values (1,1); insert into t4 values (1,1);
insert into t5 values (1,1); insert into t5 values (1,1);
explain select * from t3 left join t4 on t4.seq_1_id = t2.t2_id left join t1 on t1.t1_id = t4.seq_0_id left join t5 on t5.seq_0_id = t1.t1_id left join t2 on t2.t2_id = t5.seq_1_id where t3.t3_id = 23; explain select * from t3 left join t4 on t4.seq_1_id = t2.t2_id left join t1 on t1.t1_id = t4.seq_0_id left join t5 on t5.seq_0_id = t1.t1_id left join t2 on t2.t2_id = t5.seq_1_id where t3.t3_id = 23;
Cross dependency found in OUTER JOIN. Examine your ON conditions ERROR 42000: Cross dependency found in OUTER JOIN. Examine your ON conditions
drop table t1,t2,t3,t4,t5; drop table t1,t2,t3,t4,t5;
create table t1 (n int, m int, o int, key(n)); create table t1 (n int, m int, o int, key(n));
create table t2 (n int not null, m int, o int, primary key(n)); create table t2 (n int not null, m int, o int, primary key(n));
......
...@@ -127,7 +127,7 @@ primary key (SEQNO, MOTYPEID, MOINSTANCEID, ATTRID, VALUE ) ...@@ -127,7 +127,7 @@ primary key (SEQNO, MOTYPEID, MOINSTANCEID, ATTRID, VALUE )
INSERT INTO t1 VALUES (1, 1, 1, 1, 'a'); INSERT INTO t1 VALUES (1, 1, 1, 1, 'a');
INSERT INTO t1 VALUES (1, 1, 1, 1, 'b'); INSERT INTO t1 VALUES (1, 1, 1, 1, 'b');
INSERT INTO t1 VALUES (1, 1, 1, 1, 'a'); INSERT INTO t1 VALUES (1, 1, 1, 1, 'a');
Duplicate entry '1-1-1-1-a' for key 1 ERROR 23000: Duplicate entry '1-1-1-1-a' for key 1
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
a tinytext NOT NULL, a tinytext NOT NULL,
......
...@@ -15,4 +15,16 @@ a b c d ...@@ -15,4 +15,16 @@ a b c d
0000-00-00 0000-00-00 0000-00-00 0000-00-00 0000-00-00 0000-00-00 0000-00-00 0000-00-00
2003-03-03 2003-03-03 2003-03-03 NULL 2003-03-03 2003-03-03 2003-03-03 NULL
2003-03-03 2003-03-03 2003-03-03 NULL 2003-03-03 2003-03-03 2003-03-03 NULL
truncate table t1;
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' LINES STARTING BY ',' (b,c,d);
Warnings:
Warning 1263 Data truncated for column 'c' at row 1
Warning 1263 Data truncated for column 'd' at row 1
Warning 1263 Data truncated for column 'b' at row 2
Warning 1263 Data truncated for column 'd' at row 2
SELECT * from t1;
a b c d
NULL NULL 0000-00-00 0000-00-00
NULL 0000-00-00 0000-00-00 0000-00-00
NULL 2003-03-03 2003-03-03 NULL
drop table t1; drop table t1;
...@@ -8,9 +8,9 @@ NULL 1 ...@@ -8,9 +8,9 @@ NULL 1
update t1 set id=-1 where id=1; update t1 set id=-1 where id=1;
LOCK TABLE t1 READ; LOCK TABLE t1 READ;
update t1 set id=1 where id=1; update t1 set id=1 where id=1;
Table 't1' was locked with a READ lock and can't be updated ERROR HY000: Table 't1' was locked with a READ lock and can't be updated
create table t2 SELECT * from t1; create table t2 SELECT * from t1;
Table 't2' was not locked with LOCK TABLES ERROR HY000: Table 't2' was not locked with LOCK TABLES
create temporary table t2 SELECT * from t1; create temporary table t2 SELECT * from t1;
drop table if exists t2; drop table if exists t2;
unlock tables; unlock tables;
......
...@@ -22,5 +22,5 @@ create table t2 (a int); ...@@ -22,5 +22,5 @@ create table t2 (a int);
lock table t1 write, t2 write; lock table t1 write, t2 write;
insert t1 select * from t2; insert t1 select * from t2;
drop table t2; drop table t2;
Table 'test.t2' doesn't exist ERROR 42S02: Table 'test.t2' doesn't exist
drop table t1; drop table t1;
...@@ -13,3 +13,17 @@ show tables like 't_'; ...@@ -13,3 +13,17 @@ show tables like 't_';
Tables_in_test (t_) Tables_in_test (t_)
t3 t3
drop table t3; drop table t3;
create table t1 (a int);
select count(*) from T1;
count(*)
0
select count(*) from t1;
count(*)
0
select count(T1.a) from t1;
count(T1.a)
0
select count(bags.a) from t1 as Bags;
count(bags.a)
0
drop table t1;
...@@ -177,9 +177,9 @@ t3 CREATE TABLE `t3` ( ...@@ -177,9 +177,9 @@ t3 CREATE TABLE `t3` (
) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) ) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2)
create table t4 (a int not null, b char(10), key(a)) type=MERGE UNION=(t1,t2); create table t4 (a int not null, b char(10), key(a)) type=MERGE UNION=(t1,t2);
select * from t4; select * from t4;
Can't open file: 't4.MRG'. (errno: 143) ERROR HY000: Can't open file: 't4.MRG'. (errno: 143)
create table t5 (a int not null, b char(10), key(a)) type=MERGE UNION=(test.t1,test_2.t2); create table t5 (a int not null, b char(10), key(a)) type=MERGE UNION=(test.t1,test_2.t2);
Incorrect table definition; All MERGE tables must be in the same database ERROR HY000: Incorrect table definition; All MERGE tables must be in the same database
drop table if exists t5,t4,t3,t1,t2; drop table if exists t5,t4,t3,t1,t2;
Warnings: Warnings:
Note 1051 Unknown table 't5' Note 1051 Unknown table 't5'
......
...@@ -147,11 +147,11 @@ insert into t1 values(1,1); ...@@ -147,11 +147,11 @@ insert into t1 values(1,1);
insert into t2 values(1,10),(2,20); insert into t2 values(1,10),(2,20);
LOCK TABLES t1 write, t2 read; LOCK TABLES t1 write, t2 read;
DELETE t1.*, t2.* FROM t1,t2 where t1.n=t2.n; DELETE t1.*, t2.* FROM t1,t2 where t1.n=t2.n;
Table 't2' was locked with a READ lock and can't be updated ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n; UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n;
Table 't2' was locked with a READ lock and can't be updated ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
Table 't2' was locked with a READ lock and can't be updated ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
unlock tables; unlock tables;
LOCK TABLES t1 write, t2 write; LOCK TABLES t1 write, t2 write;
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
...@@ -172,7 +172,7 @@ create table t2 (n int(10), d int(10)); ...@@ -172,7 +172,7 @@ create table t2 (n int(10), d int(10));
insert into t1 values(1,1); insert into t1 values(1,1);
insert into t2 values(1,10),(2,20); insert into t2 values(1,10),(2,20);
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column ERROR HY000: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
set sql_safe_updates=0; set sql_safe_updates=0;
drop table t1,t2; drop table t1,t2;
set timestamp=1038401397; set timestamp=1038401397;
...@@ -190,7 +190,7 @@ n d unix_timestamp(t) ...@@ -190,7 +190,7 @@ n d unix_timestamp(t)
1 10 1038401397 1 10 1038401397
2 20 1038401397 2 20 1038401397
UPDATE t1,t2 SET 1=2 WHERE t1.n=t2.n; UPDATE t1,t2 SET 1=2 WHERE t1.n=t2.n;
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '1=2 WHERE t1.n=t2.n' at line 1 ERROR 42000: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '1=2 WHERE t1.n=t2.n' at line 1
drop table t1,t2; drop table t1,t2;
set timestamp=0; set timestamp=0;
set sql_safe_updates=0; set sql_safe_updates=0;
......
...@@ -339,10 +339,10 @@ Table Op Msg_type Msg_text ...@@ -339,10 +339,10 @@ Table Op Msg_type Msg_text
test.t1 check status OK test.t1 check status OK
drop table t1; drop table t1;
CREATE TABLE t1 (a varchar(255), b varchar(255), c varchar(255), KEY t1 (a, b, c)); CREATE TABLE t1 (a varchar(255), b varchar(255), c varchar(255), KEY t1 (a, b, c));
Specified key was too long. Max key length is 500 ERROR 42000: Specified key was too long. Max key length is 500
CREATE TABLE t1 (a varchar(255), b varchar(255), c varchar(255)); CREATE TABLE t1 (a varchar(255), b varchar(255), c varchar(255));
ALTER TABLE t1 ADD INDEX t1 (a, b, c); ALTER TABLE t1 ADD INDEX t1 (a, b, c);
Specified key was too long. Max key length is 500 ERROR 42000: Specified key was too long. Max key length is 500
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a int not null, b int, c int, key(b), key(c), key(a,b), key(c,a)); CREATE TABLE t1 (a int not null, b int, c int, key(b), key(c), key(a,b), key(c,a));
INSERT into t1 values (0, null, 0), (0, null, 1), (0, null, 2), (0, null,3), (1,1,4); INSERT into t1 values (0, null, 0), (0, null, 1), (0, null, 2), (0, null,3), (1,1,4);
...@@ -370,11 +370,11 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -370,11 +370,11 @@ id select_type table type possible_keys key key_len ref rows Extra
explain select * from t1 force index(a),t2 force index(a) where t1.a=t2.a; explain select * from t1 force index(a),t2 force index(a) where t1.a=t2.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL a NULL NULL NULL 2 1 SIMPLE t2 ALL a NULL NULL NULL 2
1 SIMPLE t1 ref a a 4 t2.a 3 1 SIMPLE t1 ref a a 4 test.t2.a 3
explain select * from t1,t2 where t1.b=t2.b; explain select * from t1,t2 where t1.b=t2.b;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL b NULL NULL NULL 2 1 SIMPLE t2 ALL b NULL NULL NULL 2
1 SIMPLE t1 ref b b 5 t2.b 1 Using where 1 SIMPLE t1 ref b b 5 test.t2.b 1 Using where
explain select * from t1,t2 force index(c) where t1.a=t2.a; explain select * from t1,t2 force index(c) where t1.a=t2.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL a NULL NULL NULL 5 1 SIMPLE t1 ALL a NULL NULL NULL 5
...@@ -393,7 +393,7 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -393,7 +393,7 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 5 Using where
drop table t1,t2; drop table t1,t2;
CREATE TABLE t1 (`a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', UNIQUE KEY `a` USING RTREE (`a`,`b`)) TYPE=MyISAM; CREATE TABLE t1 (`a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', UNIQUE KEY `a` USING RTREE (`a`,`b`)) TYPE=MyISAM;
This version of MySQL doesn't yet support 'RTREE INDEX' ERROR 42000: This version of MySQL doesn't yet support 'RTREE INDEX'
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
Warnings: Warnings:
Note 1051 Unknown table 't1' Note 1051 Unknown table 't1'
...@@ -82,33 +82,33 @@ UPDATE t1 SET d=NULL; ...@@ -82,33 +82,33 @@ UPDATE t1 SET d=NULL;
Warnings: Warnings:
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'd' at row 1 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'd' at row 1
INSERT INTO t1 (a) values (null); INSERT INTO t1 (a) values (null);
Column 'a' cannot be null ERROR 23000: Column 'a' cannot be null
INSERT INTO t1 (a) values (1/null); INSERT INTO t1 (a) values (1/null);
Column 'a' cannot be null ERROR 23000: Column 'a' cannot be null
INSERT INTO t1 (a) values (null),(null); INSERT INTO t1 (a) values (null),(null);
Warnings: Warnings:
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'a' at row 1 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'a' at row 1
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'a' at row 2 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'a' at row 2
INSERT INTO t1 (b) values (null); INSERT INTO t1 (b) values (null);
Column 'b' cannot be null ERROR 23000: Column 'b' cannot be null
INSERT INTO t1 (b) values (1/null); INSERT INTO t1 (b) values (1/null);
Column 'b' cannot be null ERROR 23000: Column 'b' cannot be null
INSERT INTO t1 (b) values (null),(null); INSERT INTO t1 (b) values (null),(null);
Warnings: Warnings:
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'b' at row 1 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'b' at row 1
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'b' at row 2 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'b' at row 2
INSERT INTO t1 (c) values (null); INSERT INTO t1 (c) values (null);
Column 'c' cannot be null ERROR 23000: Column 'c' cannot be null
INSERT INTO t1 (c) values (1/null); INSERT INTO t1 (c) values (1/null);
Column 'c' cannot be null ERROR 23000: Column 'c' cannot be null
INSERT INTO t1 (c) values (null),(null); INSERT INTO t1 (c) values (null),(null);
Warnings: Warnings:
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'c' at row 1 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'c' at row 1
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'c' at row 2 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'c' at row 2
INSERT INTO t1 (d) values (null); INSERT INTO t1 (d) values (null);
Column 'd' cannot be null ERROR 23000: Column 'd' cannot be null
INSERT INTO t1 (d) values (1/null); INSERT INTO t1 (d) values (1/null);
Column 'd' cannot be null ERROR 23000: Column 'd' cannot be null
INSERT INTO t1 (d) values (null),(null); INSERT INTO t1 (d) values (null),(null);
Warnings: Warnings:
Warning 1261 Data truncated, NULL supplied to NOT NULL column 'd' at row 1 Warning 1261 Data truncated, NULL supplied to NOT NULL column 'd' at row 1
......
drop table if exists t1; drop table if exists t1,t2;
create table t1 ( product varchar(32), country varchar(32), year int, profit int); create table t1 (product varchar(32), country_id int not null, year int, profit int);
insert into t1 values ( 'Computer', 'India',2000, 1200), insert into t1 values ( 'Computer', 2,2000, 1200),
( 'TV', 'United States', 1999, 150), ( 'TV', 1, 1999, 150),
( 'Calculator', 'United States', 1999,50), ( 'Calculator', 1, 1999,50),
( 'Computer', 'United States', 1999,1500), ( 'Computer', 1, 1999,1500),
( 'Computer', 'United States', 2000,1500), ( 'Computer', 1, 2000,1500),
( 'TV', 'United States', 2000, 150), ( 'TV', 1, 2000, 150),
( 'TV', 'India', 2000, 100), ( 'TV', 2, 2000, 100),
( 'TV', 'India', 2000, 100), ( 'TV', 2, 2000, 100),
( 'Calculator', 'United States', 2000,75), ( 'Calculator', 1, 2000,75),
( 'Calculator', 'India', 2000,75), ( 'Calculator', 2, 2000,75),
( 'TV', 'India', 1999, 100), ( 'TV', 1, 1999, 100),
( 'Computer', 'India', 1999,1200), ( 'Computer', 1, 1999,1200),
( 'Computer', 'United States', 2000,1500), ( 'Computer', 2, 2000,1500),
( 'Calculator', 'United States', 2000,75); ( 'Calculator', 2, 2000,75),
select product, country , year, sum(profit) from t1 group by product, country, year with cube; ( 'Phone', 3, 2003,10)
This version of MySQL doesn't yet support 'CUBE' ;
explain select product, country , year, sum(profit) from t1 group by product, country, year with cube; create table t2 (country_id int primary key, country char(20) not null);
This version of MySQL doesn't yet support 'CUBE' insert into t2 values (1, 'USA'),(2,'India'), (3,'Finland');
select product, country , year, sum(profit) from t1 group by product, country, year with rollup; select product, sum(profit) from t1 group by product;
This version of MySQL doesn't yet support 'ROLLUP' product sum(profit)
explain select product, country , year, sum(profit) from t1 group by product, country, year with rollup; Calculator 275
This version of MySQL doesn't yet support 'ROLLUP' Computer 6900
select product, country , year, sum(profit) from t1 group by product, country, year with cube union all select product, country , year, sum(profit) from t1 group by product, country, year with rollup; Phone 10
This version of MySQL doesn't yet support 'CUBE' TV 600
drop table t1; select product, sum(profit) from t1 group by product with rollup;
product sum(profit)
Calculator 275
Computer 6900
Phone 10
TV 600
NULL 7785
select product, sum(profit) from t1 group by 1 with rollup;
product sum(profit)
Calculator 275
Computer 6900
Phone 10
TV 600
NULL 7785
select product, sum(profit),avg(profit) from t1 group by product with rollup;
product sum(profit) avg(profit)
Calculator 275 68.7500
Computer 6900 1380.0000
Phone 10 10.0000
TV 600 120.0000
NULL 7785 519.0000
select product, country_id , year, sum(profit) from t1 group by product, country_id, year;
product country_id year sum(profit)
Calculator 1 1999 50
Calculator 1 2000 75
Calculator 2 2000 150
Computer 1 1999 2700
Computer 1 2000 1500
Computer 2 2000 2700
Phone 3 2003 10
TV 1 1999 250
TV 1 2000 150
TV 2 2000 200
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup;
product country_id year sum(profit)
Calculator 1 1999 50
Calculator 1 2000 75
Calculator 1 NULL 125
Calculator 2 2000 150
Calculator 2 NULL 150
Calculator NULL NULL 275
Computer 1 1999 2700
Computer 1 2000 1500
Computer 1 NULL 4200
Computer 2 2000 2700
Computer 2 NULL 2700
Computer NULL NULL 6900
Phone 3 2003 10
Phone 3 NULL 10
Phone NULL NULL 10
TV 1 1999 250
TV 1 2000 150
TV 1 NULL 400
TV 2 2000 200
TV 2 NULL 200
TV NULL NULL 600
NULL NULL NULL 7785
explain select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using temporary; Using filesort
select product, country_id , sum(profit) from t1 group by product desc, country_id with rollup;
product country_id sum(profit)
TV 1 400
TV 2 200
TV NULL 600
Phone 3 10
Phone NULL 10
Computer 1 4200
Computer 2 2700
Computer NULL 6900
Calculator 1 125
Calculator 2 150
Calculator NULL 275
NULL NULL 7785
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup limit 5;
product country_id year sum(profit)
Calculator 1 1999 50
Calculator 1 2000 75
Calculator 1 NULL 125
Calculator 2 2000 150
Calculator 2 NULL 150
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup limit 3,3;
product country_id year sum(profit)
Calculator 2 2000 150
Calculator 2 NULL 150
Calculator NULL NULL 275
select product, country_id, count(*), count(distinct year) from t1 group by product, country_id;
product country_id count(*) count(distinct year)
Calculator 1 2 2
Calculator 2 2 1
Computer 1 3 2
Computer 2 2 1
Phone 3 1 1
TV 1 3 2
TV 2 2 1
select product, country_id, count(*), count(distinct year) from t1 group by product, country_id with rollup;
product country_id count(*) count(distinct year)
Calculator 1 2 2
Calculator 2 2 1
Calculator NULL 4 2
Computer 1 3 2
Computer 2 2 1
Computer NULL 5 2
Phone 3 1 1
Phone NULL 1 1
TV 1 3 2
TV 2 2 1
TV NULL 5 2
NULL NULL 15 3
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup having country_id = 1;
product country_id year sum(profit)
Calculator 1 1999 50
Calculator 1 2000 75
Calculator 1 NULL 125
Computer 1 1999 2700
Computer 1 2000 1500
Computer 1 NULL 4200
TV 1 1999 250
TV 1 2000 150
TV 1 NULL 400
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup having sum(profit) > 200;
product country_id year sum(profit)
Calculator NULL NULL 275
Computer 1 1999 2700
Computer 1 2000 1500
Computer 1 NULL 4200
Computer 2 2000 2700
Computer 2 NULL 2700
Computer NULL NULL 6900
TV 1 1999 250
TV 1 NULL 400
TV NULL NULL 600
NULL NULL NULL 7785
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup having sum(profit) > 7000;
product country_id year sum(profit)
NULL NULL NULL 7785
select concat(product,':',country_id) as 'prod', concat(":",year,":") as 'year',1+1, sum(profit)/count(*) from t1 group by 1,2 with rollup;
prod year 1+1 sum(profit)/count(*)
Calculator:1 :1999: 2 50.00
Calculator:1 :2000: 2 75.00
Calculator:1 NULL 2 62.50
Calculator:2 :2000: 2 75.00
Calculator:2 NULL 2 75.00
Computer:1 :1999: 2 1350.00
Computer:1 :2000: 2 1500.00
Computer:1 NULL 2 1400.00
Computer:2 :2000: 2 1350.00
Computer:2 NULL 2 1350.00
Phone:3 :2003: 2 10.00
Phone:3 NULL 2 10.00
TV:1 :1999: 2 125.00
TV:1 :2000: 2 150.00
TV:1 NULL 2 133.33
TV:2 :2000: 2 100.00
TV:2 NULL 2 100.00
NULL NULL 2 519.00
select product, sum(profit)/count(*) from t1 group by product with rollup;
product sum(profit)/count(*)
Calculator 68.75
Computer 1380.00
Phone 10.00
TV 120.00
NULL 519.00
select left(product,4) as prod, sum(profit)/count(*) from t1 group by prod with rollup;
prod sum(profit)/count(*)
Calc 68.75
Comp 1380.00
Phon 10.00
TV 120.00
NULL 519.00
select concat(product,':',country_id), 1+1, sum(profit)/count(*) from t1 group by concat(product,':',country_id) with rollup;
concat(product,':',country_id) 1+1 sum(profit)/count(*)
Calculator:1 2 62.50
Calculator:2 2 75.00
Computer:1 2 1400.00
Computer:2 2 1350.00
Phone:3 2 10.00
TV:1 2 133.33
TV:2 2 100.00
NULL 2 519.00
select product, country , year, sum(profit) from t1,t2 where t1.country_id=t2.country_id group by product, country, year with rollup;
product country year sum(profit)
Calculator India 2000 150
Calculator India NULL 150
Calculator USA 1999 50
Calculator USA 2000 75
Calculator USA NULL 125
Calculator NULL NULL 275
Computer India 2000 2700
Computer India NULL 2700
Computer USA 1999 2700
Computer USA 2000 1500
Computer USA NULL 4200
Computer NULL NULL 6900
Phone Finland 2003 10
Phone Finland NULL 10
Phone NULL NULL 10
TV India 2000 200
TV India NULL 200
TV USA 1999 250
TV USA 2000 150
TV USA NULL 400
TV NULL NULL 600
NULL NULL NULL 7785
select product, `sum` from (select product, sum(profit) as 'sum' from t1 group by product with rollup) as tmp where product is null;
product sum
NULL 7785
select product from t1 where exists (select product, country_id , sum(profit) from t1 as t2 where t1.product=t2.product group by product, country_id with rollup having sum(profit) > 6000);
product
Computer
Computer
Computer
Computer
Computer
select product, country_id , year, sum(profit) from t1 group by product, country_id, year having country_id is NULL;
product country_id year sum(profit)
select concat(':',product,':'), sum(profit),avg(profit) from t1 group by product with rollup;
concat(':',product,':') sum(profit) avg(profit)
:Calculator: 275 68.7500
:Computer: 6900 1380.0000
:Phone: 10 10.0000
:TV: 600 120.0000
:TV: 7785 519.0000
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with cube;
ERROR 42000: This version of MySQL doesn't yet support 'CUBE'
explain select product, country_id , year, sum(profit) from t1 group by product, country_id, year with cube;
ERROR 42000: This version of MySQL doesn't yet support 'CUBE'
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with cube union all select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup;
ERROR 42000: This version of MySQL doesn't yet support 'CUBE'
drop table t1,t2;
...@@ -466,25 +466,25 @@ gid sid uid ...@@ -466,25 +466,25 @@ gid sid uid
EXPLAIN select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t1.gid, t3.uid; EXPLAIN select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t1.gid, t3.uid;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index
1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 test.t1.gid 1
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 Using where; Using index 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 test.t2.uid 1 Using where; Using index
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 Using where 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 test.t1.gid 1 Using where
EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid; EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 test.t1.gid 1
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 Using where; Using index 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 test.t2.uid 1 Using where; Using index
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 Using where 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 test.t1.gid 1 Using where
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 Using where 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 test.t1.skr 1 Using where
drop table t1,t2,t3; drop table t1,t2,t3;
CREATE TABLE t1 ( CREATE TABLE t1 (
`titre` char(80) NOT NULL default '', `titre` char(80) NOT NULL default '',
......
...@@ -12,7 +12,7 @@ select @@net_buffer_length, @@max_allowed_packet; ...@@ -12,7 +12,7 @@ select @@net_buffer_length, @@max_allowed_packet;
@@net_buffer_length @@max_allowed_packet @@net_buffer_length @@max_allowed_packet
1024 80 1024 80
SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len; SELECT length("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") as len;
Got a packet bigger than 'max_allowed_packet' ERROR 08S01: Got a packet bigger than 'max_allowed_packet'
set global max_allowed_packet=default; set global max_allowed_packet=default;
set max_allowed_packet=default; set max_allowed_packet=default;
set global net_buffer_length=default; set global net_buffer_length=default;
......
...@@ -561,22 +561,62 @@ set GLOBAL query_cache_min_res_unit=default; ...@@ -561,22 +561,62 @@ set GLOBAL query_cache_min_res_unit=default;
show global variables like "query_cache_min_res_unit"; show global variables like "query_cache_min_res_unit";
Variable_name Value Variable_name Value
query_cache_min_res_unit 4096 query_cache_min_res_unit 4096
create table t1 (a int);
set GLOBAL query_cache_size=1000; set GLOBAL query_cache_size=1000;
show global variables like "query_cache_size"; show global variables like "query_cache_size";
Variable_name Value Variable_name Value
query_cache_size 0 query_cache_size 0
set GLOBAL query_cache_size=1100; select * from t1;
set GLOBAL query_cache_size=1200; a
set GLOBAL query_cache_size=1300; set GLOBAL query_cache_size=1024;
set GLOBAL query_cache_size=1400; show global variables like "query_cache_size";
set GLOBAL query_cache_size=1500; Variable_name Value
set GLOBAL query_cache_size=1600; query_cache_size 0
set GLOBAL query_cache_size=1700; select * from t1;
set GLOBAL query_cache_size=1800; a
set GLOBAL query_cache_size=1900; set GLOBAL query_cache_size=10240;
show global variables like "query_cache_size";
Variable_name Value
query_cache_size 0
select * from t1;
a
set GLOBAL query_cache_size=20480;
show global variables like "query_cache_size";
Variable_name Value
query_cache_size 0
select * from t1;
a
set GLOBAL query_cache_size=40960;
show global variables like "query_cache_size";
Variable_name Value
query_cache_size 0
select * from t1;
a
set GLOBAL query_cache_size=51200;
show global variables like "query_cache_size";
Variable_name Value
query_cache_size 51200
select * from t1;
a
set GLOBAL query_cache_size=61440;
show global variables like "query_cache_size"; show global variables like "query_cache_size";
Variable_name Value Variable_name Value
query_cache_size 1024 query_cache_size 61440
select * from t1;
a
set GLOBAL query_cache_size=81920;
show global variables like "query_cache_size";
Variable_name Value
query_cache_size 81920
select * from t1;
a
set GLOBAL query_cache_size=102400;
show global variables like "query_cache_size";
Variable_name Value
query_cache_size 102400
select * from t1;
a
drop table t1;
set GLOBAL query_cache_size=1048576; set GLOBAL query_cache_size=1048576;
create table t1 (i int not null); create table t1 (i int not null);
create table t2 (i int not null); create table t2 (i int not null);
...@@ -615,10 +655,10 @@ id ...@@ -615,10 +655,10 @@ id
2 2
alter table t1 rename to t2; alter table t1 rename to t2;
select * from t1 where id=2; select * from t1 where id=2;
Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
drop table t2; drop table t2;
select * from t1 where id=2; select * from t1 where id=2;
Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
create table t1 (word char(20) not null); create table t1 (word char(20) not null);
select * from t1; select * from t1;
word word
......
...@@ -36,7 +36,7 @@ select (1,2,(3,4)) IN ((3,2,(3,4)), (1,2,(3,4))); ...@@ -36,7 +36,7 @@ select (1,2,(3,4)) IN ((3,2,(3,4)), (1,2,(3,4)));
(1,2,(3,4)) IN ((3,2,(3,4)), (1,2,(3,4))) (1,2,(3,4)) IN ((3,2,(3,4)), (1,2,(3,4)))
1 1
select row(1,2,row(3,4)) IN (row(3,2,row(3,4)), row(1,2,4)); select row(1,2,row(3,4)) IN (row(3,2,row(3,4)), row(1,2,4));
Cardinality error (more/less than 2 columns) ERROR 21000: Cardinality error (more/less than 2 columns)
select row(1,2,row(3,4)) IN (row(3,2,row(3,4)), row(1,2,row(3,NULL))); select row(1,2,row(3,4)) IN (row(3,2,row(3,4)), row(1,2,row(3,NULL)));
row(1,2,row(3,4)) IN (row(3,2,row(3,4)), row(1,2,row(3,NULL))) row(1,2,row(3,4)) IN (row(3,2,row(3,4)), row(1,2,row(3,NULL)))
NULL NULL
...@@ -86,7 +86,7 @@ SELECT ROW('test',2,3.33)=ROW('test',2,3.33); ...@@ -86,7 +86,7 @@ SELECT ROW('test',2,3.33)=ROW('test',2,3.33);
ROW('test',2,3.33)=ROW('test',2,3.33) ROW('test',2,3.33)=ROW('test',2,3.33)
1 1
SELECT ROW('test',2,3.33)=ROW('test',2,3.33,4); SELECT ROW('test',2,3.33)=ROW('test',2,3.33,4);
Cardinality error (more/less than 3 columns) ERROR 21000: Cardinality error (more/less than 3 columns)
SELECT ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,33)); SELECT ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,33));
ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,33)) ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,33))
1 1
...@@ -97,7 +97,7 @@ SELECT ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,NULL)); ...@@ -97,7 +97,7 @@ SELECT ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,NULL));
ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,NULL)) ROW('test',2,ROW(3,33))=ROW('test',2,ROW(3,NULL))
NULL NULL
SELECT ROW('test',2,ROW(3,33))=ROW('test',2,4); SELECT ROW('test',2,ROW(3,33))=ROW('test',2,4);
Cardinality error (more/less than 2 columns) ERROR 21000: Cardinality error (more/less than 2 columns)
create table t1 ( a int, b int, c int); create table t1 ( a int, b int, c int);
insert into t1 values (1,2,3), (2,3,1), (3,2,1), (1,2,NULL); insert into t1 values (1,2,3), (2,3,1), (3,2,1), (1,2,NULL);
select * from t1 where ROW(1,2,3)=ROW(a,b,c); select * from t1 where ROW(1,2,3)=ROW(a,b,c);
...@@ -135,14 +135,14 @@ ROW(1,2,3) IN(row(a,b,c), row(1,2,3)) ...@@ -135,14 +135,14 @@ ROW(1,2,3) IN(row(a,b,c), row(1,2,3))
1 1
drop table t1; drop table t1;
select ROW(1,1); select ROW(1,1);
Cardinality error (more/less than 1 columns) ERROR 21000: Cardinality error (more/less than 1 columns)
create table t1 (i int); create table t1 (i int);
select 1 from t1 where ROW(1,1); select 1 from t1 where ROW(1,1);
Cardinality error (more/less than 1 columns) ERROR 21000: Cardinality error (more/less than 1 columns)
select count(*) from t1 order by ROW(1,1); select count(*) from t1 order by ROW(1,1);
Cardinality error (more/less than 1 columns) ERROR 21000: Cardinality error (more/less than 1 columns)
select count(*) from t1 having (1,1) order by i; select count(*) from t1 having (1,1) order by i;
Cardinality error (more/less than 1 columns) ERROR 21000: Cardinality error (more/less than 1 columns)
drop table t1; drop table t1;
create table t1 (a int, b int); create table t1 (a int, b int);
insert into t1 values (1, 4); insert into t1 values (1, 4);
......
...@@ -55,7 +55,7 @@ select (@id := id) - id from t2; ...@@ -55,7 +55,7 @@ select (@id := id) - id from t2;
0 0
kill @id; kill @id;
drop table t2; drop table t2;
Server shutdown in progress ERROR 08S01: Server shutdown in progress
set global sql_slave_skip_counter=1; set global sql_slave_skip_counter=1;
start slave; start slave;
select count(*) from t1; select count(*) from t1;
......
...@@ -21,7 +21,7 @@ n m ...@@ -21,7 +21,7 @@ n m
drop database mysqltest; drop database mysqltest;
drop database if exists mysqltest2; drop database if exists mysqltest2;
drop database mysqltest; drop database mysqltest;
Can't drop database 'mysqltest'. Database doesn't exist ERROR HY000: Can't drop database 'mysqltest'. Database doesn't exist
drop database mysqltest2; drop database mysqltest2;
set sql_log_bin = 0; set sql_log_bin = 0;
create database mysqltest2; create database mysqltest2;
......
...@@ -7,6 +7,6 @@ start slave; ...@@ -7,6 +7,6 @@ start slave;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
load table t1 from master; load table t1 from master;
Error connecting to master: Master is not configured ERROR 08S01: Error connecting to master: Master is not configured
load table t1 from master; load table t1 from master;
Error from master: 'Table 'test.t1' doesn't exist' ERROR HY000: Error from master: 'Table 'test.t1' doesn't exist'
...@@ -22,10 +22,12 @@ drop table t1; ...@@ -22,10 +22,12 @@ drop table t1;
drop table t2; drop table t2;
create table t1(a int auto_increment, key(a)); create table t1(a int auto_increment, key(a));
create table t2(b int auto_increment, c int, key(b)); create table t2(b int auto_increment, c int, key(b));
SET FOREIGN_KEY_CHECKS=0;
insert into t1 values (10); insert into t1 values (10);
insert into t1 values (null),(null),(null); insert into t1 values (null),(null),(null);
insert into t2 values (5,0); insert into t2 values (5,0);
insert into t2 values (null,last_insert_id()); insert into t2 values (null,last_insert_id());
SET FOREIGN_KEY_CHECKS=1;
select * from t1; select * from t1;
a a
10 10
...@@ -38,3 +40,31 @@ b c ...@@ -38,3 +40,31 @@ b c
6 11 6 11
drop table t1; drop table t1;
drop table t2; drop table t2;
create table t1(a int auto_increment, key(a));
create table t2(b int auto_increment, c int, key(b));
insert into t1 values (10);
insert into t1 values (null),(null),(null);
insert into t2 values (5,0);
insert into t2 (c) select * from t1;
select * from t2;
b c
5 0
6 10
7 11
8 12
9 13
select * from t1;
a
10
11
12
13
select * from t2;
b c
5 0
6 10
7 11
8 12
9 13
drop table t1;
drop table t2;
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment