This commit is contained in:
Sergei Golubchik 2010-02-12 09:47:31 +01:00
commit b6d030edbf
35 changed files with 276 additions and 100 deletions

View File

@ -14,13 +14,6 @@ AC_DEFUN([MYSQL_USE_BUNDLED_LIBEVENT], [
libevent_libs="\$(top_builddir)/extra/libevent/libevent.a" libevent_libs="\$(top_builddir)/extra/libevent/libevent.a"
libevent_includes="-I\$(top_srcdir)/extra/libevent" libevent_includes="-I\$(top_srcdir)/extra/libevent"
libevent_test_option="--mysqld=--thread-handling=pool-of-threads"
AC_SUBST(libevent_libs)
AC_SUBST(libevent_includes)
AC_SUBST(libevent_test_option)
AC_DEFINE([HAVE_LIBEVENT], [1], [If we want to use libevent and have connection pooling])
AC_MSG_RESULT([using bundled libevent])
dnl Get the upstream file with the original libevent configure macros. dnl Get the upstream file with the original libevent configure macros.
dnl Use builtin include for this, to work around path problems in old versions of aclocal. dnl Use builtin include for this, to work around path problems in old versions of aclocal.
@ -39,17 +32,64 @@ AC_DEFUN([MYSQL_CHECK_LIBEVENT], [
AC_CONFIG_FILES(extra/libevent/Makefile) AC_CONFIG_FILES(extra/libevent/Makefile)
AC_MSG_CHECKING(for libevent) AC_MSG_NOTICE([checking what libevent library to use])
AC_ARG_WITH([libevent],
[ --with-libevent use libevent and have connection pooling],
[with_libevent=$withval],
[with_libevent=no]
)
if test "$with_libevent" != "no"; then AC_ARG_WITH([libevent],
AC_HELP_STRING([--with-libevent=yes|no|bundled|DIR],
[Use libevent and have connection pooling.
A location of libevent library can be specified.
Given DIR, libevent library is
assumed to be in $DIR/lib and header files
in $DIR/include.]),
[with_libevent=${withval}],
[with_libevent=no])
case "$with_libevent" in
"no")
with_libevent=disabled
;;
"bundled")
MYSQL_USE_BUNDLED_LIBEVENT
;;
"" | "yes")
libevent_includes=""
libevent_libs="-levent"
AC_CHECK_LIB(event, evutil_socketpair,[with_libevent=system],
[with_libevent=bundled])
AC_CHECK_HEADER(evutil.h,,[with_libevent=bundled])
if test "$with_libevent" = "bundled"; then
MYSQL_USE_BUNDLED_LIBEVENT MYSQL_USE_BUNDLED_LIBEVENT
else
AC_MSG_RESULT([disabled])
fi fi
AM_CONDITIONAL([HAVE_LIBEVENT], [ test "$with_libevent" != "no" ]) ;;
*)
# Test for libevent using all known library file endings
if test \( -f "$with_libevent/lib/libevent.a" -o \
-f "$with_libevent/lib/libevent.so" -o \
-f "$with_libevent/lib/libevent.sl" -o \
-f "$with_libevent/lib/libevent.dylib" \) \
-a -f "$with_libevent/include/evutil.h"; then
libevent_includes="-I$with_libevent/include"
libevent_libs="-L$with_libevent/lib -levent"
AC_CHECK_LIB(event, evutil_socketpair,[with_libevent=$with_libevent],
[with_libevent=no], [$libevent_libs])
else
with_libevent=no
fi
if test "$with_libevent" = "no"; then
AC_MSG_ERROR([libevent headers or binaries were not found])
fi
;;
esac
AC_MSG_CHECKING(for libevent)
AC_MSG_RESULT([$with_libevent])
if test "$with_libevent" != "disabled"; then
libevent_test_option="--mysqld=--thread-handling=pool-of-threads"
AC_SUBST(libevent_libs)
AC_SUBST(libevent_includes)
AC_SUBST(libevent_test_option)
AC_DEFINE([HAVE_LIBEVENT], [1], [If we want to use libevent and have connection pooling])
fi
AM_CONDITIONAL([HAVE_LIBEVENT], [ test "$with_libevent" != "disabled" ])
]) ])

View File

@ -609,7 +609,7 @@ AC_CHECK_TOOL([NM], [nm])
if test "$TARGET_LINUX" = "true" -a "$static_nss" = "" if test "$TARGET_LINUX" = "true" -a "$static_nss" = ""
then then
tmp=`$NM ${other_libc_lib:-/usr/lib*}/libc.a | grep _nss_files_getaliasent_r1` tmp=`$NM ${other_libc_lib:-/usr/lib*}/libc.a 2>&1 | grep _nss_files_getaliasent_r1`
if test -n "$tmp" if test -n "$tmp"
then then
STATIC_NSS_FLAGS="-lc -lnss_files -lnss_dns -lresolv" STATIC_NSS_FLAGS="-lc -lnss_files -lnss_dns -lresolv"

View File

@ -111,7 +111,7 @@ enum ha_storage_media {
enum ha_extra_function { enum ha_extra_function {
HA_EXTRA_NORMAL=0, /* Optimize for space (def) */ HA_EXTRA_NORMAL=0, /* Optimize for space (def) */
HA_EXTRA_QUICK=1, /* Optimize for speed */ HA_EXTRA_QUICK=1, /* Optimize for speed */
HA_EXTRA_NOT_USED=2, HA_EXTRA_NOT_USED=2, /* Should be ignored by handler */
HA_EXTRA_CACHE=3, /* Cache record in HA_rrnd() */ HA_EXTRA_CACHE=3, /* Cache record in HA_rrnd() */
HA_EXTRA_NO_CACHE=4, /* End caching of records (def) */ HA_EXTRA_NO_CACHE=4, /* End caching of records (def) */
HA_EXTRA_NO_READCHECK=5, /* No readcheck on update */ HA_EXTRA_NO_READCHECK=5, /* No readcheck on update */

View File

@ -153,7 +153,7 @@ FILE(WRITE cmake_dummy.c " ")
# custom targets to "sql/CMakeLists.txt" and reference them here. # custom targets to "sql/CMakeLists.txt" and reference them here.
ADD_LIBRARY(mysqlserver STATIC ${LIBMYSQLD_SOURCES}) ADD_LIBRARY(mysqlserver STATIC ${LIBMYSQLD_SOURCES})
ADD_DEPENDENCIES(mysqlserver GenServerSource GenError) ADD_DEPENDENCIES(mysqlserver GenServerSource GenError)
TARGET_LINK_LIBRARIES(mysqlserver) TARGET_LINK_LIBRARIES(mysqlserver psapi.lib)
# Add any additional libraries requested by engine(s) # Add any additional libraries requested by engine(s)
FOREACH (ENGINE_LIB ${MYSQLD_STATIC_ENGINE_LIBS}) FOREACH (ENGINE_LIB ${MYSQLD_STATIC_ENGINE_LIBS})

View File

@ -5542,6 +5542,8 @@ sub usage ($) {
if ( $message ) if ( $message )
{ {
print STDERR "$message\n"; print STDERR "$message\n";
print STDERR "For full list of options, use $0 --help\n";
exit;
} }
print <<HERE; print <<HERE;

View File

@ -1,4 +1,5 @@
call mtr.add_suppression("Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted"); call mtr.add_suppression("Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted");
flush table mysql.proc;
use test; use test;
drop procedure if exists bug14233; drop procedure if exists bug14233;
drop function if exists bug14233; drop function if exists bug14233;

View File

@ -1261,12 +1261,12 @@ ERROR HY000: Variable 'lower_case_table_names' is a read only variable
# #
SHOW VARIABLES like 'myisam_recover_options'; SHOW VARIABLES like 'myisam_recover_options';
Variable_name Value Variable_name Value
myisam_recover_options OFF myisam_recover_options DEFAULT
SELECT @@session.myisam_recover_options; SELECT @@session.myisam_recover_options;
ERROR HY000: Variable 'myisam_recover_options' is a GLOBAL variable ERROR HY000: Variable 'myisam_recover_options' is a GLOBAL variable
SELECT @@global.myisam_recover_options; SELECT @@global.myisam_recover_options;
@@global.myisam_recover_options @@global.myisam_recover_options
OFF DEFAULT
SET @@session.myisam_recover_options= 'x'; SET @@session.myisam_recover_options= 'x';
ERROR HY000: Variable 'myisam_recover_options' is a read only variable ERROR HY000: Variable 'myisam_recover_options' is a read only variable
SET @@global.myisam_recover_options= 'x'; SET @@global.myisam_recover_options= 'x';

View File

@ -155,13 +155,13 @@ v5 VIEW
v6 VIEW v6 VIEW
show table status; show table status;
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 MyISAM 10 Fixed 5 9 45 # 1024 0 NULL # # NULL latin1_swedish_ci NULL t1 MyISAM 10 Fixed 5 9 45 # 1024 0 NULL # # # latin1_swedish_ci NULL
v1 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL VIEW v1 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # # NULL NULL NULL VIEW
v2 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL VIEW v2 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # # NULL NULL NULL VIEW
v3 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL VIEW v3 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # # NULL NULL NULL VIEW
v4 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL VIEW v4 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # # NULL NULL NULL VIEW
v5 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL VIEW v5 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # # NULL NULL NULL VIEW
v6 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL VIEW v6 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # # NULL NULL NULL VIEW
drop view v1,v2,v3,v4,v5,v6; drop view v1,v2,v3,v4,v5,v6;
create view v1 (c,d,e,f) as select a,b, create view v1 (c,d,e,f) as select a,b,
a in (select a+2 from t1), a = all (select a from t1) from t1; a in (select a+2 from t1), a = all (select a from t1) from t1;

View File

@ -1 +1 @@
--skip-stack-trace --skip-core-file --loose-maria-log-dir-path=$MYSQLTEST_VARDIR/tmp --skip-stack-trace --skip-core-file --loose-maria-log-dir-path=$MYSQLTEST_VARDIR/tmp --myisam-recover=

View File

@ -0,0 +1 @@
--myisam-recover=off

View File

@ -17,6 +17,7 @@ call mtr.add_suppression("Column count of mysql.proc is wrong. Expected 20, foun
# Backup proc table # Backup proc table
let $MYSQLD_DATADIR= `select @@datadir`; let $MYSQLD_DATADIR= `select @@datadir`;
flush table mysql.proc;
--copy_file $MYSQLD_DATADIR/mysql/proc.frm $MYSQLTEST_VARDIR/tmp/proc.frm --copy_file $MYSQLD_DATADIR/mysql/proc.frm $MYSQLTEST_VARDIR/tmp/proc.frm
--copy_file $MYSQLD_DATADIR/mysql/proc.MYD $MYSQLTEST_VARDIR/tmp/proc.MYD --copy_file $MYSQLD_DATADIR/mysql/proc.MYD $MYSQLTEST_VARDIR/tmp/proc.MYD
--copy_file $MYSQLD_DATADIR/mysql/proc.MYI $MYSQLTEST_VARDIR/tmp/proc.MYI --copy_file $MYSQLD_DATADIR/mysql/proc.MYI $MYSQLTEST_VARDIR/tmp/proc.MYI

View File

@ -87,7 +87,7 @@ explain extended select c from v6;
# show table/table status test # show table/table status test
show tables; show tables;
show full tables; show full tables;
--replace_column 8 # 12 # 13 # --replace_column 8 # 12 # 13 # 14 #
show table status; show table status;
drop view v1,v2,v3,v4,v5,v6; drop view v1,v2,v3,v4,v5,v6;

View File

@ -39,8 +39,8 @@ require "$pwd/server-cfg" || die "Can't read Configuration file: $!\n";
$|=1; # Output data immediately $|=1; # Output data immediately
$opt_skip_test=$opt_skip_create=$opt_skip_delete=$opt_verbose=$opt_fast_insert=$opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=$opt_log=$opt_use_old_results=$opt_help=$opt_odbc=$opt_small_test=$opt_small_tables=$opt_samll_key_tables=$opt_stage=$opt_old_headers=$opt_die_on_errors=$opt_tcpip=$opt_random=$opt_only_missing_tests=0; $opt_skip_test=$opt_skip_create=$opt_skip_delete=$opt_verbose=$opt_fast_insert=$opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=$opt_log=$opt_use_old_results=$opt_help=$opt_odbc=$opt_small_test=$opt_small_tables=$opt_samll_key_tables=$opt_stage=$opt_old_headers=$opt_die_on_errors=$opt_tcpip=$opt_random=$opt_only_missing_tests=$opt_temporary_tables=0;
$opt_cmp=$opt_user=$opt_password=$opt_connect_options=""; $opt_cmp=$opt_user=$opt_password=$opt_connect_options=$opt_connect_command= "";
$opt_server="mysql"; $opt_dir="output"; $opt_server="mysql"; $opt_dir="output";
$opt_host="localhost";$opt_database="test"; $opt_host="localhost";$opt_database="test";
$opt_machine=""; $opt_suffix=""; $opt_machine=""; $opt_suffix="";
@ -59,7 +59,7 @@ $log_prog_args=join(" ", skip_arguments(\@ARGV,"comments","cmp","server",
"use-old-results","skip-test", "use-old-results","skip-test",
"optimization","hw", "optimization","hw",
"machine", "dir", "suffix", "log")); "machine", "dir", "suffix", "log"));
GetOptions("skip-test=s","comments=s","cmp=s","server=s","user=s","host=s","database=s","password=s","loop-count=i","row-count=i","skip-create","skip-delete","verbose","fast-insert","lock-tables","debug","fast","force","field-count=i","regions=i","groups=i","time-limit=i","log","use-old-results","machine=s","dir=s","suffix=s","help","odbc","small-test","small-tables","small-key-tables","stage=i","threads=i","random","old-headers","die-on-errors","create-options=s","hires","tcpip","silent","optimization=s","hw=s","socket=s","connect-options=s","only-missing-tests") || usage(); GetOptions("skip-test=s","comments=s","cmp=s","server=s","user=s","host=s","database=s","password=s","loop-count=i","row-count=i","skip-create","skip-delete","verbose","fast-insert","lock-tables","debug","fast","force","field-count=i","regions=i","groups=i","time-limit=i","log","use-old-results","machine=s","dir=s","suffix=s","help","odbc","small-test","small-tables","small-key-tables","stage=i","threads=i","random","old-headers","die-on-errors","create-options=s","hires","tcpip","silent","optimization=s","hw=s","socket=s","connect-options=s","connect-command=s","only-missing-tests","temporary-tables") || usage();
usage() if ($opt_help); usage() if ($opt_help);
$server=get_server($opt_server,$opt_host,$opt_database,$opt_odbc, $server=get_server($opt_server,$opt_host,$opt_database,$opt_odbc,
@ -454,6 +454,9 @@ All benchmarks takes the following options:
create all MySQL tables as InnoDB tables use: create all MySQL tables as InnoDB tables use:
--create-options=ENGINE=InnoDB --create-options=ENGINE=InnoDB
--temporary-tables
Use temporary tables for all tests.
--database (Default $opt_database) --database (Default $opt_database)
In which database the test tables are created. In which database the test tables are created.
@ -595,6 +598,10 @@ All benchmarks takes the following options:
Add options, which uses at DBI connect. Add options, which uses at DBI connect.
For example --connect-options=mysql_read_default_file=/etc/my.cnf. For example --connect-options=mysql_read_default_file=/etc/my.cnf.
--connect-command='SQL command'
Initialization command to execute when logged in. Useful for setting
up the environment.
EOF EOF
exit(0); exit(0);
} }

View File

@ -159,6 +159,7 @@ sub new
$limits{'max_index'} = 16; # Max number of keys $limits{'max_index'} = 16; # Max number of keys
$limits{'max_index_parts'} = 16; # Max segments/key $limits{'max_index_parts'} = 16; # Max segments/key
$limits{'max_tables'} = (($machine || '') =~ "^win") ? 5000 : 65000; $limits{'max_tables'} = (($machine || '') =~ "^win") ? 5000 : 65000;
$limits{'max_temporary_tables'}= 400;
$limits{'max_text_size'} = 1000000; # Good enough for tests $limits{'max_text_size'} = 1000000; # Good enough for tests
$limits{'multi_drop'} = 1; # Drop table can take many tables $limits{'multi_drop'} = 1; # Drop table can take many tables
$limits{'order_by_position'} = 1; # Can use 'ORDER BY 1' $limits{'order_by_position'} = 1; # Can use 'ORDER BY 1'
@ -189,6 +190,7 @@ sub new
$self->{'transactions'} = 1; # Transactions enabled $self->{'transactions'} = 1; # Transactions enabled
$limits{'max_columns'} = 90; # Max number of columns in table $limits{'max_columns'} = 90; # Max number of columns in table
$limits{'max_tables'} = 32; # No comments $limits{'max_tables'} = 32; # No comments
$limits{'max_temporary_tables'}= $limits{"max_tables"};
} }
if (defined($main::opt_create_options) && if (defined($main::opt_create_options) &&
$main::opt_create_options =~ /engine=bdb/i) $main::opt_create_options =~ /engine=bdb/i)
@ -200,6 +202,7 @@ sub new
{ {
$limits{'working_blobs'} = 0; # Blobs not implemented yet $limits{'working_blobs'} = 0; # Blobs not implemented yet
$limits{'max_tables'} = 500; $limits{'max_tables'} = 500;
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$self->{'transactions'} = 1; # Transactions enabled $self->{'transactions'} = 1; # Transactions enabled
} }
@ -249,6 +252,11 @@ sub connect
die "Got error: '$DBI::errstr' when connecting to " . $self->{'data_source'} ." with user: '$main::opt_user' password: '$main::opt_password'\n"; die "Got error: '$DBI::errstr' when connecting to " . $self->{'data_source'} ." with user: '$main::opt_user' password: '$main::opt_password'\n";
$dbh->do("SET OPTION LOG_OFF=1,UPDATE_LOG=0"); $dbh->do("SET OPTION LOG_OFF=1,UPDATE_LOG=0");
if ($main::opt_connect_command ne "")
{
$dbh->do($main::opt_connect_command) or
die "Can't execute connect_command: $main::opt_connect_command error: $DBI::errstr\n";
}
return $dbh; return $dbh;
} }
@ -265,7 +273,14 @@ sub create
my($self,$table_name,$fields,$index,$options) = @_; my($self,$table_name,$fields,$index,$options) = @_;
my($query,@queries); my($query,@queries);
if ($main::opt_temporary_tables)
{
$query="create temporary table $table_name (";
}
else
{
$query="create table $table_name ("; $query="create table $table_name (";
}
foreach $field (@$fields) foreach $field (@$fields)
{ {
# $field =~ s/ decimal/ double(10,2)/i; # $field =~ s/ decimal/ double(10,2)/i;
@ -388,6 +403,7 @@ sub new
$limits{'max_conditions'} = 74; $limits{'max_conditions'} = 74;
$limits{'max_columns'} = 75; $limits{'max_columns'} = 75;
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 32000; $limits{'max_text_size'} = 32000;
$limits{'query_size'} = 65535; $limits{'query_size'} = 65535;
$limits{'max_index'} = 5; $limits{'max_index'} = 5;
@ -617,7 +633,9 @@ sub new
$limits{'max_conditions'} = 9999; # This makes Pg real slow $limits{'max_conditions'} = 9999; # This makes Pg real slow
$limits{'max_index'} = 64; # Big enough $limits{'max_index'} = 64; # Big enough
$limits{'max_index_parts'} = 16; $limits{'max_index_parts'} = 16;
$limits{'max_tables'} = 5000; # 10000 crashes pg 7.0.2 $limits{'max_tables'} = 65000;
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 65000; # Good enough for test $limits{'max_text_size'} = 65000; # Good enough for test
$limits{'multi_drop'} = 1; $limits{'multi_drop'} = 1;
$limits{'order_by_position'} = 1; $limits{'order_by_position'} = 1;
@ -868,6 +886,8 @@ sub new
$limits{'max_conditions'} = 9999; # Probably big enough $limits{'max_conditions'} = 9999; # Probably big enough
$limits{'max_columns'} = 2000; # From crash-me $limits{'max_columns'} = 2000; # From crash-me
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 65492; # According to tests $limits{'max_text_size'} = 65492; # According to tests
$limits{'query_size'} = 65535; # Probably a limit $limits{'query_size'} = 65535; # Probably a limit
$limits{'max_index'} = 64; # Probably big enough $limits{'max_index'} = 64; # Probably big enough
@ -1099,6 +1119,7 @@ sub new
# above this value .... but can handle 2419 columns # above this value .... but can handle 2419 columns
# maybe something for crash-me ... but how to check ??? # maybe something for crash-me ... but how to check ???
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 4095; # max returned .... $limits{'max_text_size'} = 4095; # max returned ....
$limits{'query_size'} = 65535; # Not a limit, big enough $limits{'query_size'} = 65535; # Not a limit, big enough
$limits{'max_index'} = 64; # Big enough $limits{'max_index'} = 64; # Big enough
@ -1369,6 +1390,8 @@ sub new
$limits{'max_conditions'} = 9999; # (Actually not a limit) $limits{'max_conditions'} = 9999; # (Actually not a limit)
$limits{'max_columns'} = 254; # Max number of columns in table $limits{'max_columns'} = 254; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 2000; # Limit for blob test-connect $limits{'max_text_size'} = 2000; # Limit for blob test-connect
$limits{'query_size'} = 65525; # Max size with default buffers. $limits{'query_size'} = 65525; # Max size with default buffers.
$limits{'max_index'} = 16; # Max number of keys $limits{'max_index'} = 16; # Max number of keys
@ -1642,6 +1665,8 @@ sub new
$limits{'max_column_name'} = 18; # max table and column name $limits{'max_column_name'} = 18; # max table and column name
$limits{'max_columns'} = 994; # Max number of columns in table $limits{'max_columns'} = 994; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_index'} = 64; # Max number of keys $limits{'max_index'} = 64; # Max number of keys
$limits{'max_index_parts'} = 15; # Max segments/key $limits{'max_index_parts'} = 15; # Max segments/key
$limits{'max_text_size'} = 65535; # Max size with default buffers. ?? $limits{'max_text_size'} = 65535; # Max size with default buffers. ??
@ -1830,6 +1855,8 @@ sub new
$limits{'max_conditions'} = 97; # We get 'Query is too complex' $limits{'max_conditions'} = 97; # We get 'Query is too complex'
$limits{'max_columns'} = 255; # Max number of columns in table $limits{'max_columns'} = 255; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 255; # Max size with default buffers. $limits{'max_text_size'} = 255; # Max size with default buffers.
$limits{'query_size'} = 65535; # Not a limit, big enough $limits{'query_size'} = 65535; # Not a limit, big enough
$limits{'max_index'} = 32; # Max number of keys $limits{'max_index'} = 32; # Max number of keys
@ -2015,6 +2042,8 @@ sub new
$limits{'max_conditions'} = 1030; # We get 'Query is too complex' $limits{'max_conditions'} = 1030; # We get 'Query is too complex'
$limits{'max_columns'} = 250; # Max number of columns in table $limits{'max_columns'} = 250; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 9830; # Max size with default buffers. $limits{'max_text_size'} = 9830; # Max size with default buffers.
$limits{'query_size'} = 9830; # Max size with default buffers. $limits{'query_size'} = 9830; # Max size with default buffers.
$limits{'max_index'} = 64; # Max number of keys $limits{'max_index'} = 64; # Max number of keys
@ -2211,6 +2240,8 @@ sub new
$limits{'max_conditions'} = 1030; # We get 'Query is too complex' $limits{'max_conditions'} = 1030; # We get 'Query is too complex'
$limits{'max_columns'} = 250; # Max number of columns in table $limits{'max_columns'} = 250; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 9830; # Max size with default buffers. $limits{'max_text_size'} = 9830; # Max size with default buffers.
$limits{'query_size'} = 9830; # Max size with default buffers. $limits{'query_size'} = 9830; # Max size with default buffers.
$limits{'max_index'} = 64; # Max number of keys $limits{'max_index'} = 64; # Max number of keys
@ -2443,6 +2474,8 @@ sub new
$limits{'max_conditions'} = 50; # (Actually not a limit) $limits{'max_conditions'} = 50; # (Actually not a limit)
$limits{'max_columns'} = 254; # Max number of columns in table $limits{'max_columns'} = 254; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 2000; # Limit for blob test-connect $limits{'max_text_size'} = 2000; # Limit for blob test-connect
$limits{'query_size'} = 65525; # Max size with default buffers. $limits{'query_size'} = 65525; # Max size with default buffers.
$limits{'max_index'} = 16; # Max number of keys $limits{'max_index'} = 16; # Max number of keys
@ -2647,6 +2680,8 @@ sub new
$limits{'max_conditions'} = 418; # We get 'Query is too complex' $limits{'max_conditions'} = 418; # We get 'Query is too complex'
$limits{'max_columns'} = 500; # Max number of columns in table $limits{'max_columns'} = 500; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 254; # Max size with default buffers. $limits{'max_text_size'} = 254; # Max size with default buffers.
$limits{'query_size'} = 254; # Max size with default buffers. $limits{'query_size'} = 254; # Max size with default buffers.
$limits{'max_index'} = 48; # Max number of keys $limits{'max_index'} = 48; # Max number of keys
@ -2825,6 +2860,7 @@ sub new
$limits{'max_conditions'} = 9999; # (Actually not a limit) $limits{'max_conditions'} = 9999; # (Actually not a limit)
$limits{'max_columns'} = 252; # Max number of columns in table $limits{'max_columns'} = 252; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 15000; # Max size with default buffers. $limits{'max_text_size'} = 15000; # Max size with default buffers.
$limits{'query_size'} = 1000000; # Max size with default buffers. $limits{'query_size'} = 1000000; # Max size with default buffers.
$limits{'max_index'} = 32; # Max number of keys $limits{'max_index'} = 32; # Max number of keys
@ -3027,6 +3063,7 @@ sub new
$limits{'max_conditions'} = 9999; # (Actually not a limit) $limits{'max_conditions'} = 9999; # (Actually not a limit)
$limits{'max_columns'} = 252; # Max number of columns in table $limits{'max_columns'} = 252; # Max number of columns in table
$limits{'max_tables'} = 65000; # Should be big enough $limits{'max_tables'} = 65000; # Should be big enough
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 15000; # Max size with default buffers. $limits{'max_text_size'} = 15000; # Max size with default buffers.
$limits{'query_size'} = 1000000; # Max size with default buffers. $limits{'query_size'} = 1000000; # Max size with default buffers.
$limits{'max_index'} = 65000; # Max number of keys $limits{'max_index'} = 65000; # Max number of keys
@ -3223,6 +3260,7 @@ sub new
# The following should be 8192, but is smaller because Frontbase crashes.. # The following should be 8192, but is smaller because Frontbase crashes..
$limits{'max_columns'} = 150; # Max number of columns in table $limits{'max_columns'} = 150; # Max number of columns in table
$limits{'max_tables'} = 5000; # 10000 crashed FrontBase $limits{'max_tables'} = 5000; # 10000 crashed FrontBase
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 65000; # Max size with default buffers. $limits{'max_text_size'} = 65000; # Max size with default buffers.
$limits{'query_size'} = 8000000; # Max size with default buffers. $limits{'query_size'} = 8000000; # Max size with default buffers.
$limits{'max_index'} = 38; # Max number of keys $limits{'max_index'} = 38; # Max number of keys
@ -3435,6 +3473,7 @@ sub new
$limits{'max_conditions'} = 9999; # (Actually not a limit) * $limits{'max_conditions'} = 9999; # (Actually not a limit) *
$limits{'max_columns'} = 1023; # Max number of columns in table * $limits{'max_columns'} = 1023; # Max number of columns in table *
$limits{'max_tables'} = 65000; # Should be big enough * unlimited actually $limits{'max_tables'} = 65000; # Should be big enough * unlimited actually
$limits{'max_temporary_tables'}= $limits{"max_tables"};
$limits{'max_text_size'} = 15000; # Max size with default buffers. $limits{'max_text_size'} = 15000; # Max size with default buffers.
$limits{'query_size'} = 64*1024; # Max size with default buffers. *64 kb by default. May be set by system variable $limits{'query_size'} = 64*1024; # Max size with default buffers. *64 kb by default. May be set by system variable
$limits{'max_index'} = 510; # Max number of keys * $limits{'max_index'} = 510; # Max number of keys *

View File

@ -161,11 +161,16 @@ if ($opt_fast && defined($server->{vacuum}))
{ {
$server->vacuum(0,\$dbh); $server->vacuum(0,\$dbh);
} }
if (!$main::opt_temporary_tables)
{
$dbh->disconnect; $dbh->disconnect;
}
# #
# First test connect/select/disconnect # First test connect/select/disconnect
# #
if (!$main::opt_temporary_tables)
{
print "Testing connect/select 1 row from table/disconnect\n"; print "Testing connect/select 1 row from table/disconnect\n";
$loop_time=new Benchmark; $loop_time=new Benchmark;
@ -190,12 +195,14 @@ print "Warning: $errors connections didn't work without a time delay\n" if ($err
print "Time to connect+select_1_row ($small_loop_count): " . print "Time to connect+select_1_row ($small_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n"; timestr(timediff($end_time, $loop_time),"all") . "\n\n";
$dbh = $server->connect();
}
# #
# The same test, but without connect/disconnect # The same test, but without connect/disconnect
# #
print "Testing select 1 row from table\n"; print "Testing select 1 row from table\n";
$dbh = $server->connect();
$loop_time=new Benchmark; $loop_time=new Benchmark;
for ($i=0 ; $i < $opt_loop_count ; $i++) for ($i=0 ; $i < $opt_loop_count ; $i++)

View File

@ -47,7 +47,15 @@ if ($opt_small_test)
$create_loop_count/=1000; $create_loop_count/=1000;
} }
if ($opt_temporary_tables)
{
$max_tables=min($limits->{'max_tables'},$opt_loop_count); $max_tables=min($limits->{'max_tables'},$opt_loop_count);
}
else
{
$max_tables=min($limits->{'max_tables'},$opt_loop_count);
$max_tables=400;
}
if ($opt_small_test) if ($opt_small_test)
{ {
@ -71,7 +79,7 @@ $dbh = $server->connect();
if ($opt_force) # If tables used in this test exist, drop 'em if ($opt_force) # If tables used in this test exist, drop 'em
{ {
print "Okay..Let's make sure that our tables don't exist yet.\n\n"; print "Okay..Let's make sure that our tables don't exist yet.\n\n";
for ($i=1 ; $i <= $max_tables ; $i++) for ($i=1 ; $i <= max($max_tables, $create_loop_count) ; $i++)
{ {
$dbh->do("drop table bench_$i" . $server->{'drop_attr'}); $dbh->do("drop table bench_$i" . $server->{'drop_attr'});
} }
@ -245,7 +253,7 @@ for ($i=2 ; $i <= $keys ; $i++)
} }
$loop_time=new Benchmark; $loop_time=new Benchmark;
for ($i=1 ; $i <= $opt_loop_count ; $i++) for ($i=1 ; $i <= $create_loop_count ; $i++)
{ {
do_many($dbh,$server->create("bench_$i", \@fields, \@keys)); do_many($dbh,$server->create("bench_$i", \@fields, \@keys));
$dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr; $dbh->do("drop table bench_$i" . $server->{'drop_attr'}) or die $DBI::errstr;

View File

@ -1049,10 +1049,14 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list, bool check_in_use)
DBUG_RETURN(-1); DBUG_RETURN(-1);
table_list->table=table; table_list->table=table;
table->s->deleting= table_list->deleting;
/* Return 1 if table is in use */ /* Return 1 if table is in use */
DBUG_RETURN(test(remove_table_from_cache(thd, db, table_list->table_name, DBUG_RETURN(test(remove_table_from_cache(thd, db, table_list->table_name,
check_in_use ? RTFC_NO_FLAG : RTFC_WAIT_OTHER_THREAD_FLAG))); (check_in_use ?
RTFC_NO_FLAG :
RTFC_WAIT_OTHER_THREAD_FLAG),
table_list->deleting)));
} }

View File

@ -1652,7 +1652,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
#define RTFC_WAIT_OTHER_THREAD_FLAG 0x0002 #define RTFC_WAIT_OTHER_THREAD_FLAG 0x0002
#define RTFC_CHECK_KILLED_FLAG 0x0004 #define RTFC_CHECK_KILLED_FLAG 0x0004
bool remove_table_from_cache(THD *thd, const char *db, const char *table, bool remove_table_from_cache(THD *thd, const char *db, const char *table,
uint flags); uint flags, my_bool deleting);
#define NORMAL_PART_NAME 0 #define NORMAL_PART_NAME 0
#define TEMP_PART_NAME 1 #define TEMP_PART_NAME 1

View File

@ -600,6 +600,7 @@ char *mysqld_unix_port, *opt_mysql_tmpdir;
const char **errmesg; /**< Error messages */ const char **errmesg; /**< Error messages */
const char *myisam_recover_options_str="OFF"; const char *myisam_recover_options_str="OFF";
const char *myisam_stats_method_str="nulls_unequal"; const char *myisam_stats_method_str="nulls_unequal";
const char *opt_thread_handling= thread_handling_typelib.type_names[0];
/** name of reference on left espression in rewritten IN subquery */ /** name of reference on left espression in rewritten IN subquery */
const char *in_left_expr_name= "<left expr>"; const char *in_left_expr_name= "<left expr>";
@ -7321,7 +7322,8 @@ The minimum value for this variable is 4096.",
1024, 0}, 1024, 0},
{"thread_handling", OPT_THREAD_HANDLING, {"thread_handling", OPT_THREAD_HANDLING,
"Define threads usage for handling queries: " "Define threads usage for handling queries: "
"one-thread-per-connection or no-threads", 0, 0, "one-thread-per-connection or no-threads",
(uchar**) &opt_thread_handling, (uchar**) &opt_thread_handling,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"updatable_views_with_limit", OPT_UPDATABLE_VIEWS_WITH_LIMIT, {"updatable_views_with_limit", OPT_UPDATABLE_VIEWS_WITH_LIMIT,
"1 = YES = Don't issue an error message (warning only) if a VIEW without presence of a key of the underlying table is used in queries with a LIMIT clause for updating. 0 = NO = Prohibit update of a VIEW, which does not contain a key of the underlying table and the query uses a LIMIT clause (usually get from GUI tools).", "1 = YES = Don't issue an error message (warning only) if a VIEW without presence of a key of the underlying table is used in queries with a LIMIT clause for updating. 0 = NO = Prohibit update of a VIEW, which does not contain a key of the underlying table and the query uses a LIMIT clause (usually get from GUI tools).",
@ -8004,7 +8006,13 @@ static int mysql_init_variables(void)
refresh_version= 1L; /* Increments on each reload */ refresh_version= 1L; /* Increments on each reload */
global_query_id= thread_id= 1L; global_query_id= thread_id= 1L;
strmov(server_version, MYSQL_SERVER_VERSION); strmov(server_version, MYSQL_SERVER_VERSION);
myisam_recover_options_str= sql_mode_str= "OFF"; sql_mode_str= "";
/* By default, auto-repair MyISAM tables after crash */
myisam_recover_options_str= "DEFAULT";
myisam_recover_options= HA_RECOVER_DEFAULT;
ha_open_options|= HA_OPEN_ABORT_IF_CRASHED;
myisam_stats_method_str= "nulls_unequal"; myisam_stats_method_str= "nulls_unequal";
my_bind_addr = htonl(INADDR_ANY); my_bind_addr = htonl(INADDR_ANY);
threads.empty(); threads.empty();
@ -8658,17 +8666,21 @@ mysqld_get_one_option(int optid,
break; break;
#endif #endif
case OPT_MYISAM_RECOVER: case OPT_MYISAM_RECOVER:
{
if (argument && (!argument[0] ||
my_strcasecmp(system_charset_info, argument, "OFF") == 0))
{
myisam_recover_options= HA_RECOVER_NONE;
myisam_recover_options_str= "OFF";
ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED;
}
else
{ {
if (!argument) if (!argument)
{ {
myisam_recover_options= HA_RECOVER_DEFAULT; myisam_recover_options= HA_RECOVER_DEFAULT;
myisam_recover_options_str= myisam_recover_typelib.type_names[0]; myisam_recover_options_str= myisam_recover_typelib.type_names[0];
} }
else if (!argument[0])
{
myisam_recover_options= HA_RECOVER_NONE;
myisam_recover_options_str= "OFF";
}
else else
{ {
myisam_recover_options_str=argument; myisam_recover_options_str=argument;
@ -8679,6 +8691,7 @@ mysqld_get_one_option(int optid,
return 1; return 1;
} }
ha_open_options|=HA_OPEN_ABORT_IF_CRASHED; ha_open_options|=HA_OPEN_ABORT_IF_CRASHED;
}
break; break;
} }
case OPT_CONCURRENT_INSERT: case OPT_CONCURRENT_INSERT:
@ -8753,14 +8766,15 @@ mysqld_get_one_option(int optid,
break; break;
} }
case OPT_ONE_THREAD: case OPT_ONE_THREAD:
global_system_variables.thread_handling= global_system_variables.thread_handling= SCHEDULER_NO_THREADS;
SCHEDULER_ONE_THREAD_PER_CONNECTION; opt_thread_handling= thread_handling_typelib.type_names[global_system_variables.thread_handling];
break; break;
case OPT_THREAD_HANDLING: case OPT_THREAD_HANDLING:
{ {
int id; int id;
if (!find_opt_type(argument, &thread_handling_typelib, opt->name, &id)) if (!find_opt_type(argument, &thread_handling_typelib, opt->name, &id))
global_system_variables.thread_handling= id - 1; global_system_variables.thread_handling= id - 1;
opt_thread_handling= thread_handling_typelib.type_names[global_system_variables.thread_handling];
break; break;
} }
case OPT_FT_BOOLEAN_SYNTAX: case OPT_FT_BOOLEAN_SYNTAX:

View File

@ -930,7 +930,7 @@ bool close_cached_tables(THD *thd, TABLE_LIST *tables, bool have_lock,
for (TABLE_LIST *table= tables; table; table= table->next_local) for (TABLE_LIST *table= tables; table; table= table->next_local)
{ {
if (remove_table_from_cache(thd, table->db, table->table_name, if (remove_table_from_cache(thd, table->db, table->table_name,
RTFC_OWNED_BY_THD_FLAG)) RTFC_OWNED_BY_THD_FLAG, table->deleting))
found=1; found=1;
} }
if (!found) if (!found)
@ -8547,6 +8547,11 @@ void remove_db_from_cache(const char *db)
if (!strcmp(table->s->db.str, db)) if (!strcmp(table->s->db.str, db))
{ {
table->s->version= 0L; /* Free when thread is ready */ table->s->version= 0L; /* Free when thread is ready */
/*
This functions only called from DROP DATABASE code, so we are going
to drop all tables so we mark them as deleting
*/
table->s->deleting= TRUE;
if (!table->in_use) if (!table->in_use)
relink_unused(table); relink_unused(table);
} }
@ -8589,7 +8594,7 @@ void flush_tables()
*/ */
bool remove_table_from_cache(THD *thd, const char *db, const char *table_name, bool remove_table_from_cache(THD *thd, const char *db, const char *table_name,
uint flags) uint flags, my_bool deleting)
{ {
char key[MAX_DBKEY_LENGTH]; char key[MAX_DBKEY_LENGTH];
uint key_length; uint key_length;
@ -8683,7 +8688,10 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name,
} }
} }
while (unused_tables && !unused_tables->s->version) while (unused_tables && !unused_tables->s->version)
{
unused_tables->s->deleting= deleting;
VOID(hash_delete(&open_cache,(uchar*) unused_tables)); VOID(hash_delete(&open_cache,(uchar*) unused_tables));
}
DBUG_PRINT("info", ("Removing table from table_def_cache")); DBUG_PRINT("info", ("Removing table from table_def_cache"));
/* Remove table from table definition cache if it's not in use */ /* Remove table from table definition cache if it's not in use */
@ -8877,7 +8885,8 @@ int abort_and_upgrade_lock(ALTER_PARTITION_PARAM_TYPE *lpt)
/* If MERGE child, forward lock handling to parent. */ /* If MERGE child, forward lock handling to parent. */
mysql_lock_abort(lpt->thd, lpt->table->parent ? lpt->table->parent : mysql_lock_abort(lpt->thd, lpt->table->parent ? lpt->table->parent :
lpt->table, TRUE); lpt->table, TRUE);
VOID(remove_table_from_cache(lpt->thd, lpt->db, lpt->table_name, flags)); VOID(remove_table_from_cache(lpt->thd, lpt->db, lpt->table_name, flags,
FALSE));
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
DBUG_RETURN(0); DBUG_RETURN(0);
} }
@ -8902,7 +8911,7 @@ void close_open_tables_and_downgrade(ALTER_PARTITION_PARAM_TYPE *lpt)
{ {
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
remove_table_from_cache(lpt->thd, lpt->db, lpt->table_name, remove_table_from_cache(lpt->thd, lpt->db, lpt->table_name,
RTFC_WAIT_OTHER_THREAD_FLAG); RTFC_WAIT_OTHER_THREAD_FLAG, FALSE);
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
/* If MERGE child, forward lock handling to parent. */ /* If MERGE child, forward lock handling to parent. */
mysql_lock_downgrade_write(lpt->thd, lpt->table->parent ? lpt->table->parent : mysql_lock_downgrade_write(lpt->thd, lpt->table->parent ? lpt->table->parent :

View File

@ -1088,6 +1088,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
HA_CREATE_INFO create_info; HA_CREATE_INFO create_info;
char path[FN_REFLEN + 1]; char path[FN_REFLEN + 1];
TABLE *table; TABLE *table;
TABLE_LIST *tbl;
bool error; bool error;
uint path_length; uint path_length;
bool is_temporary_table= false; bool is_temporary_table= false;
@ -1108,6 +1109,9 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE)) if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE))
goto trunc_by_del; goto trunc_by_del;
for (tbl= table_list; tbl; tbl= tbl->next_local)
tbl->deleting= TRUE; /* to trigger HA_PREPARE_FOR_DROP */
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK); table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
create_info.options|= HA_LEX_CREATE_TMP_TABLE; create_info.options|= HA_LEX_CREATE_TMP_TABLE;

View File

@ -1880,6 +1880,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
{ {
TABLE_SHARE *share; TABLE_SHARE *share;
table->db_type= NULL; table->db_type= NULL;
if ((share= get_cached_table_share(table->db, table->table_name))) if ((share= get_cached_table_share(table->db, table->table_name)))
table->db_type= share->db_type(); table->db_type= share->db_type();
@ -1974,9 +1975,10 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
{ {
TABLE *locked_table; TABLE *locked_table;
abort_locked_tables(thd, db, table->table_name); abort_locked_tables(thd, db, table->table_name);
table->deleting= TRUE;
remove_table_from_cache(thd, db, table->table_name, remove_table_from_cache(thd, db, table->table_name,
RTFC_WAIT_OTHER_THREAD_FLAG | RTFC_WAIT_OTHER_THREAD_FLAG |
RTFC_CHECK_KILLED_FLAG); RTFC_CHECK_KILLED_FLAG, FALSE);
/* /*
If the table was used in lock tables, remember it so that If the table was used in lock tables, remember it so that
unlock_table_names can free it unlock_table_names can free it
@ -4249,8 +4251,9 @@ void wait_while_table_is_used(THD *thd,TABLE *table,
/* Wait until all there are no other threads that has this table open */ /* Wait until all there are no other threads that has this table open */
remove_table_from_cache(thd, table->s->db.str, remove_table_from_cache(thd, table->s->db.str,
table->s->table_name.str, table->s->table_name.str,
RTFC_WAIT_OTHER_THREAD_FLAG); RTFC_WAIT_OTHER_THREAD_FLAG, FALSE);
/* extra() call must come only after all instances above are closed */ /* extra() call must come only after all instances above are closed */
if (function != HA_EXTRA_NOT_USED)
VOID(table->file->extra(function)); VOID(table->file->extra(function));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
@ -4753,7 +4756,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
remove_table_from_cache(thd, table->table->s->db.str, remove_table_from_cache(thd, table->table->s->db.str,
table->table->s->table_name.str, table->table->s->table_name.str,
RTFC_WAIT_OTHER_THREAD_FLAG | RTFC_WAIT_OTHER_THREAD_FLAG |
RTFC_CHECK_KILLED_FLAG); RTFC_CHECK_KILLED_FLAG, FALSE);
thd->exit_cond(old_message); thd->exit_cond(old_message);
DBUG_EXECUTE_IF("wait_in_mysql_admin_table", wait_for_kill_signal(thd);); DBUG_EXECUTE_IF("wait_in_mysql_admin_table", wait_for_kill_signal(thd););
if (thd->killed) if (thd->killed)
@ -5011,7 +5014,8 @@ send_result_message:
{ {
pthread_mutex_lock(&LOCK_open); pthread_mutex_lock(&LOCK_open);
remove_table_from_cache(thd, table->table->s->db.str, remove_table_from_cache(thd, table->table->s->db.str,
table->table->s->table_name.str, RTFC_NO_FLAG); table->table->s->table_name.str,
RTFC_NO_FLAG, FALSE);
pthread_mutex_unlock(&LOCK_open); pthread_mutex_unlock(&LOCK_open);
} }
/* May be something modified consequently we have to invalidate cache */ /* May be something modified consequently we have to invalidate cache */
@ -6797,7 +6801,9 @@ view_err:
from concurrent DDL statements. from concurrent DDL statements.
*/ */
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN); wait_while_table_is_used(thd, table,
thd->locked_tables ? HA_EXTRA_NOT_USED :
HA_EXTRA_FORCE_REOPEN);
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
DBUG_EXECUTE_IF("sleep_alter_enable_indexes", my_sleep(6000000);); DBUG_EXECUTE_IF("sleep_alter_enable_indexes", my_sleep(6000000););
error= table->file->ha_enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); error= table->file->ha_enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
@ -6805,7 +6811,9 @@ view_err:
break; break;
case DISABLE: case DISABLE:
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN); wait_while_table_is_used(thd, table,
thd->locked_tables ? HA_EXTRA_NOT_USED :
HA_EXTRA_FORCE_REOPEN);
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
error=table->file->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); error=table->file->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
/* COND_refresh will be signaled in close_thread_tables() */ /* COND_refresh will be signaled in close_thread_tables() */
@ -7251,7 +7259,9 @@ view_err:
else else
{ {
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN); wait_while_table_is_used(thd, table,
thd->locked_tables ? HA_EXTRA_NOT_USED :
HA_EXTRA_FORCE_REOPEN);
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
thd_proc_info(thd, "manage keys"); thd_proc_info(thd, "manage keys");
alter_table_manage_keys(table, table->file->indexes_are_disabled(), alter_table_manage_keys(table, table->file->indexes_are_disabled(),

View File

@ -2399,7 +2399,11 @@ int closefrm(register TABLE *table, bool free_share)
DBUG_PRINT("enter", ("table: 0x%lx", (long) table)); DBUG_PRINT("enter", ("table: 0x%lx", (long) table));
if (table->db_stat) if (table->db_stat)
{
if (table->s->deleting)
table->file->extra(HA_EXTRA_PREPARE_FOR_DROP);
error=table->file->close(); error=table->file->close();
}
my_free((char*) table->alias, MYF(MY_ALLOW_ZERO_PTR)); my_free((char*) table->alias, MYF(MY_ALLOW_ZERO_PTR));
table->alias= 0; table->alias= 0;
if (table->field) if (table->field)

View File

@ -436,6 +436,7 @@ typedef struct st_table_share
bool is_view; bool is_view;
bool name_lock, replace_with_name_lock; bool name_lock, replace_with_name_lock;
bool waiting_on_cond; /* Protection against free */ bool waiting_on_cond; /* Protection against free */
bool deleting; /* going to delete this table */
ulong table_map_id; /* for row-based replication */ ulong table_map_id; /* for row-based replication */
ulonglong table_map_version; ulonglong table_map_version;
@ -1392,7 +1393,7 @@ struct TABLE_LIST
*/ */
bool create; bool create;
bool internal_tmp_table; bool internal_tmp_table;
bool deleting; /* going to delete this table */
/* View creation context. */ /* View creation context. */

View File

@ -2255,9 +2255,12 @@ int ha_maria::extra(enum ha_extra_function operation)
extern_lock(F_UNLOCK) (which resets file->trn) followed by maria_close() extern_lock(F_UNLOCK) (which resets file->trn) followed by maria_close()
without calling commit/rollback in between. If file->trn is not set without calling commit/rollback in between. If file->trn is not set
we can't remove file->share from the transaction list in the extra() call. we can't remove file->share from the transaction list in the extra() call.
table->in_use is not set in the case this is a done as part of closefrm()
as part of drop table.
*/ */
if (!file->trn && if (file->s->now_transactional && !file->trn && table->in_use &&
(operation == HA_EXTRA_PREPARE_FOR_DROP || (operation == HA_EXTRA_PREPARE_FOR_DROP ||
operation == HA_EXTRA_PREPARE_FOR_RENAME)) operation == HA_EXTRA_PREPARE_FOR_RENAME))
{ {

View File

@ -430,8 +430,9 @@ my_bool _ma_once_end_block_record(MARIA_SHARE *share)
if (share->bitmap.file.file >= 0) if (share->bitmap.file.file >= 0)
{ {
if (flush_pagecache_blocks(share->pagecache, &share->bitmap.file, if (flush_pagecache_blocks(share->pagecache, &share->bitmap.file,
share->temporary ? FLUSH_IGNORE_CHANGED : ((share->temporary || share->deleting) ?
FLUSH_RELEASE)) FLUSH_IGNORE_CHANGED :
FLUSH_RELEASE)))
res= 1; res= 1;
/* /*
File must be synced as it is going out of the maria_open_list and so File must be synced as it is going out of the maria_open_list and so

View File

@ -79,7 +79,7 @@ int maria_close(register MARIA_HA *info)
if ((*share->once_end)(share)) if ((*share->once_end)(share))
error= my_errno; error= my_errno;
if (flush_pagecache_blocks(share->pagecache, &share->kfile, if (flush_pagecache_blocks(share->pagecache, &share->kfile,
(share->temporary ? ((share->temporary || share->deleting) ?
FLUSH_IGNORE_CHANGED : FLUSH_IGNORE_CHANGED :
FLUSH_RELEASE))) FLUSH_RELEASE)))
error= my_errno; error= my_errno;

View File

@ -305,6 +305,12 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function,
pthread_mutex_unlock(&THR_LOCK_maria); pthread_mutex_unlock(&THR_LOCK_maria);
break; break;
case HA_EXTRA_PREPARE_FOR_DROP: case HA_EXTRA_PREPARE_FOR_DROP:
/* Signals about intent to delete this table */
share->deleting= TRUE;
share->global_changed= FALSE; /* force writing changed flag */
/* To force repair if reopened */
_ma_mark_file_changed(info);
/* Fall trough */
case HA_EXTRA_PREPARE_FOR_RENAME: case HA_EXTRA_PREPARE_FOR_RENAME:
{ {
my_bool do_flush= test(function != HA_EXTRA_PREPARE_FOR_DROP); my_bool do_flush= test(function != HA_EXTRA_PREPARE_FOR_DROP);

View File

@ -387,6 +387,9 @@ int _ma_test_if_changed(register MARIA_HA *info)
open_count is not maintained on disk for temporary tables. open_count is not maintained on disk for temporary tables.
*/ */
#define _MA_ALREADY_MARKED_FILE_CHANGED \
((share->state.changed & STATE_CHANGED) && share->global_changed)
int _ma_mark_file_changed(MARIA_HA *info) int _ma_mark_file_changed(MARIA_HA *info)
{ {
uchar buff[3]; uchar buff[3];
@ -394,8 +397,6 @@ int _ma_mark_file_changed(MARIA_HA *info)
int error= 1; int error= 1;
DBUG_ENTER("_ma_mark_file_changed"); DBUG_ENTER("_ma_mark_file_changed");
#define _MA_ALREADY_MARKED_FILE_CHANGED \
((share->state.changed & STATE_CHANGED) && share->global_changed)
if (_MA_ALREADY_MARKED_FILE_CHANGED) if (_MA_ALREADY_MARKED_FILE_CHANGED)
DBUG_RETURN(0); DBUG_RETURN(0);
pthread_mutex_lock(&share->intern_lock); /* recheck under mutex */ pthread_mutex_lock(&share->intern_lock); /* recheck under mutex */

View File

@ -312,11 +312,14 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
now= my_getsystime(); now= my_getsystime();
in_redo_phase= TRUE; in_redo_phase= TRUE;
trnman_init(max_trid_in_control_file);
if (run_redo_phase(from_lsn, apply)) if (run_redo_phase(from_lsn, apply))
{ {
ma_message_no_user(0, "Redo phase failed"); ma_message_no_user(0, "Redo phase failed");
trnman_destroy();
goto err; goto err;
} }
trnman_destroy();
if ((uncommitted_trans= if ((uncommitted_trans=
end_of_redo_phase(should_run_undo_phase)) == (uint)-1) end_of_redo_phase(should_run_undo_phase)) == (uint)-1)

View File

@ -390,6 +390,7 @@ typedef struct st_maria_share
my_bool now_transactional; my_bool now_transactional;
my_bool have_versioning; my_bool have_versioning;
my_bool key_del_used; /* != 0 if key_del is locked */ my_bool key_del_used; /* != 0 if key_del is locked */
my_bool deleting; /* we are going to delete this table */
#ifdef THREAD #ifdef THREAD
THR_LOCK lock; THR_LOCK lock;
void (*lock_restore_status)(void *); void (*lock_restore_status)(void *);

View File

@ -64,8 +64,9 @@ int mi_close(register MI_INFO *info)
if (share->kfile >= 0) abort();); if (share->kfile >= 0) abort(););
if (share->kfile >= 0 && if (share->kfile >= 0 &&
flush_key_blocks(share->key_cache, share->kfile, flush_key_blocks(share->key_cache, share->kfile,
share->temporary ? FLUSH_IGNORE_CHANGED : ((share->temporary || share->deleting) ?
FLUSH_RELEASE)) FLUSH_IGNORE_CHANGED :
FLUSH_RELEASE)))
error=my_errno; error=my_errno;
if (share->kfile >= 0) if (share->kfile >= 0)
{ {

View File

@ -256,8 +256,13 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
share->last_version= 0L; /* Impossible version */ share->last_version= 0L; /* Impossible version */
pthread_mutex_unlock(&THR_LOCK_myisam); pthread_mutex_unlock(&THR_LOCK_myisam);
break; break;
case HA_EXTRA_PREPARE_FOR_RENAME:
case HA_EXTRA_PREPARE_FOR_DROP: case HA_EXTRA_PREPARE_FOR_DROP:
/* Signals about intent to delete this table */
share->deleting= TRUE;
share->global_changed= FALSE; /* force writing changed flag */
_mi_mark_file_changed(info);
/* Fall trough */
case HA_EXTRA_PREPARE_FOR_RENAME:
pthread_mutex_lock(&THR_LOCK_myisam); pthread_mutex_lock(&THR_LOCK_myisam);
share->last_version= 0L; /* Impossible version */ share->last_version= 0L; /* Impossible version */
pthread_mutex_lock(&share->intern_lock); pthread_mutex_lock(&share->intern_lock);

View File

@ -58,6 +58,8 @@ MI_INFO *test_if_reopen(char *filename)
{ {
MI_INFO *info=(MI_INFO*) pos->data; MI_INFO *info=(MI_INFO*) pos->data;
MYISAM_SHARE *share=info->s; MYISAM_SHARE *share=info->s;
DBUG_ASSERT(strcmp(share->unique_file_name,filename) ||
share->last_version);
if (!strcmp(share->unique_file_name,filename) && share->last_version) if (!strcmp(share->unique_file_name,filename) && share->last_version)
return info; return info;
} }

View File

@ -221,6 +221,7 @@ typedef struct st_mi_isam_share
my_bool changed, /* If changed since lock */ my_bool changed, /* If changed since lock */
global_changed, /* If changed since open */ global_changed, /* If changed since open */
not_flushed, temporary, delay_key_write, concurrent_insert; not_flushed, temporary, delay_key_write, concurrent_insert;
my_bool deleting; /* we are going to delete this table */
#ifdef THREAD #ifdef THREAD
THR_LOCK lock; THR_LOCK lock;
pthread_mutex_t intern_lock; /* Locking for use with _locking */ pthread_mutex_t intern_lock; /* Locking for use with _locking */