Commit cb304292 authored by unknown's avatar unknown

Fixed fulltext after merge from 3.23.45

First (incomplete) version of transaction and as3ap tests.


BitKeeper/etc/ignore:
  Added sql-bench/test-transactions to the ignore list
mysql-test/r/fulltext.result:
  Update fulltext results after merge
sql-bench/Makefile.am:
  Added transaction test
sql-bench/run-all-tests.sh:
  Added transaction test
sql-bench/server-cfg.sh:
  Added transaction test
sql-bench/test-ATIS.sh:
  Cleanup
sql/item_func.cc:
  Fix bad merge
sql/mysqld.cc:
  Cleanup
sql/sql_base.cc:
  Fix bad merge
sql/sql_delete.cc:
  Cleanup
sql/sql_parse.cc:
  Fix bad merge
sql/sql_select.cc:
  Fix bad merge
sql/sql_union.cc:
  Fix bad merge
tools/mysqlmanager.c:
  C
parent babfc897
...@@ -445,3 +445,4 @@ vio/test-ssl ...@@ -445,3 +445,4 @@ vio/test-ssl
vio/test-sslclient vio/test-sslclient
vio/test-sslserver vio/test-sslserver
vio/viotest-ssl vio/viotest-ssl
sql-bench/test-transactions
...@@ -56,6 +56,13 @@ Only MyISAM tables support collections 2 ...@@ -56,6 +56,13 @@ Only MyISAM tables support collections 2
Function MATCH ... AGAINST() is used to do a search 0 Function MATCH ... AGAINST() is used to do a search 0
Full-text search in MySQL implements vector space model 0 Full-text search in MySQL implements vector space model 0
delete from t1 where a like "MySQL%"; delete from t1 where a like "MySQL%";
update t1 set a='some test foobar' where MATCH a,b AGAINST ('model');
delete from t1 where MATCH(a,b) AGAINST ("indexes");
select * from t1;
a b
Only MyISAM tables support collections
Function MATCH ... AGAINST() is used to do a search
some test foobar implements vector space model
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
id int(11), id int(11),
......
...@@ -21,13 +21,15 @@ benchdir_root= $(prefix) ...@@ -21,13 +21,15 @@ benchdir_root= $(prefix)
benchdir = $(benchdir_root)/sql-bench benchdir = $(benchdir_root)/sql-bench
bench_SCRIPTS = test-ATIS test-connect test-create test-insert \ bench_SCRIPTS = test-ATIS test-connect test-create test-insert \
test-big-tables test-select test-wisconsin \ test-big-tables test-select test-wisconsin \
test-alter-table graph-compare-results \ test-alter-table test-transactions \
graph-compare-results \
bench-init.pl compare-results run-all-tests \ bench-init.pl compare-results run-all-tests \
server-cfg crash-me copy-db bench-count-distinct server-cfg crash-me copy-db bench-count-distinct
CLEANFILES = $(bench_SCRIPTS) CLEANFILES = $(bench_SCRIPTS)
EXTRA_SCRIPTS = test-ATIS.sh test-connect.sh test-create.sh \ EXTRA_SCRIPTS = test-ATIS.sh test-connect.sh test-create.sh \
test-insert.sh test-big-tables.sh test-select.sh \ test-insert.sh test-big-tables.sh test-select.sh \
test-alter-table.sh test-wisconsin.sh \ test-alter-table.sh test-wisconsin.sh \
test-transactions.sh \
bench-init.pl.sh compare-results.sh server-cfg.sh \ bench-init.pl.sh compare-results.sh server-cfg.sh \
run-all-tests.sh crash-me.sh copy-db.sh \ run-all-tests.sh crash-me.sh copy-db.sh \
bench-count-distinct.sh graph-compare-results.sh bench-count-distinct.sh graph-compare-results.sh
......
This diff is collapsed.
...@@ -195,6 +195,10 @@ while (<test-*>) ...@@ -195,6 +195,10 @@ while (<test-*>)
print "Summary for $prog: ", join(" ",@prog_sum), "\n"; print "Summary for $prog: ", join(" ",@prog_sum), "\n";
} }
} }
elsif ($last_line =~ /^Test skipped/i)
{
print "$last_line\n";
}
else else
{ {
$errors++; $errors++;
......
...@@ -121,7 +121,7 @@ sub new ...@@ -121,7 +121,7 @@ sub new
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s' $self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'vacuum'} = 1; # When using with --fast $self->{'vacuum'} = 1; # When using with --fast
$self->{'drop_attr'} = ""; $self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled $self->{'transactions'} = 0; # Transactions disabled by default
$limits{'NEG'} = 1; # Supports -id $limits{'NEG'} = 1; # Supports -id
$limits{'alter_add_multi_col'}= 1; #Have ALTER TABLE t add a int,add b int; $limits{'alter_add_multi_col'}= 1; #Have ALTER TABLE t add a int,add b int;
...@@ -197,12 +197,14 @@ sub new ...@@ -197,12 +197,14 @@ sub new
$main::opt_create_options =~ /type=innodb/i) $main::opt_create_options =~ /type=innodb/i)
{ {
$limits{'max_text_size'} = 8000; # Limit in Innobase $limits{'max_text_size'} = 8000; # Limit in Innobase
$self->{'transactions'} = 1; # Transactions enabled
} }
if (defined($main::opt_create_options) && if (defined($main::opt_create_options) &&
$main::opt_create_options =~ /type=gemini/i) $main::opt_create_options =~ /type=gemini/i)
{ {
$limits{'working_blobs'} = 0; # Blobs not implemented yet $limits{'working_blobs'} = 0; # Blobs not implemented yet
$limits{'max_tables'} = 500; $limits{'max_tables'} = 500;
$self->{'transactions'} = 1; # Transactions enabled
} }
return $self; return $self;
...@@ -1333,6 +1335,14 @@ sub query { ...@@ -1333,6 +1335,14 @@ sub query {
return $sql; return $sql;
} }
sub fix_for_insert
{
my ($self,$cmd) = @_;
$cmd =~ s/\'\'/\' \'/g;
return $cmd;
}
sub drop_index sub drop_index
{ {
my ($self,$table,$index) = @_; my ($self,$table,$index) = @_;
...@@ -1556,6 +1566,14 @@ sub query { ...@@ -1556,6 +1566,14 @@ sub query {
return $sql; return $sql;
} }
sub fix_for_insert
{
my ($self,$cmd) = @_;
$cmd =~ s/\'\'/\' \'/g;
return $cmd;
}
sub drop_index sub drop_index
{ {
my ($self,$table,$index) = @_; my ($self,$table,$index) = @_;
...@@ -1789,6 +1807,16 @@ sub query { ...@@ -1789,6 +1807,16 @@ sub query {
return $sql; return $sql;
} }
sub fix_for_insert
{
my ($self,$cmd) = @_;
$cmd =~ s/\\'//g;
return $cmd;
}
sub drop_index sub drop_index
{ {
my ($self,$table,$index) = @_; my ($self,$table,$index) = @_;
......
...@@ -125,8 +125,7 @@ if (!$opt_skip_create) ...@@ -125,8 +125,7 @@ if (!$opt_skip_create)
chomp; chomp;
next unless ( $_ =~ /\w/ ); # skip blank lines next unless ( $_ =~ /\w/ ); # skip blank lines
my $command = $insert_start . $_ . ")"; my $command = $insert_start . $_ . ")";
$command =~ s/\'\'/\' \'/g if ($opt_server =~ /empress/i || $opt_server =~ /oracle/i); $command = $server->fix_for_insert($command);
$command =~ s/\\'//g if ($opt_server =~ /informix/i);
print "$command\n" if ($opt_debug); print "$command\n" if ($opt_debug);
$command =~ s/\\'/\'\'/g if ($double_quotes); $command =~ s/\\'/\'\'/g if ($double_quotes);
......
#!@PERL@
#
# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library 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
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the Free
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
# MA 02111-1307, USA
#
# Test of transactions performance.
#
##################### Standard benchmark inits ##############################
use DBI;
use Benchmark;
use warnings;
$opt_groups=27; # Characters are 'A' -> Z
$opt_loop_count=100000; # Change this to make test harder/easier
$opt_medium_loop_count=100; # Change this to make test harder/easier
chomp($pwd = `pwd`); $pwd = "." if ($pwd eq '');
require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n";
# Avoid warnings for variables in bench-init.pl
our ($opt_small_test, $opt_small_tables, $opt_debug, $opt_force);
if ($opt_small_test || $opt_small_tables)
{
$opt_loop_count/=100;
$opt_medium_loop_count/=10;
}
if (!$server->{transactions} && !$opt_force)
{
print "Test skipped because the database doesn't support transactions\n";
exit(0);
}
####
#### Connect and start timeing
####
$start_time=new Benchmark;
$dbh = $server->connect();
###
### Create Table
###
print "Creating tables\n";
$dbh->do("drop table bench1");
$dbh->do("drop table bench2");
do_many($dbh,$server->create("bench1",
["idn int NOT NULL",
"rev_idn int NOT NULL",
"region char(1) NOT NULL",
"grp int NOT NULL",
"updated tinyint NOT NULL"],
["primary key (idn)",
"unique (region,grp)"]));
do_many($dbh,$server->create("bench2",
["idn int NOT NULL",
"rev_idn int NOT NULL",
"region char(1) NOT NULL",
"grp int NOT NULL",
"updated tinyint NOT NULL"],
["primary key (idn)",
"unique (region,grp)"]));
$dbh->{AutoCommit} = 0;
###
### Test insert perfomance
###
test_insert("bench1","insert_commit",0);
test_insert("bench2","insert_autocommit",1);
sub test_insert
{
my ($table, $test_name, $auto_commit)= @_;
my ($loop_time,$end_time,$id,$rev_id,$grp,$region);
$dbh->{AutoCommit}= $auto_commit;
$loop_time=new Benchmark;
for ($id=0,$rev_id=$opt_loop_count-1 ; $id < $opt_loop_count ;
$id++,$rev_id--)
{
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"insert into $table values ($id,$rev_id,'$region',$grp,0)");
}
$dbh->commit if (!$auto_commit);
$end_time=new Benchmark;
print "Time for $test_name ($opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Test update perfomance
###
test_update("bench1","update_commit",0);
test_update("bench2","update_autocommit",1);
sub test_update
{
my ($table, $test_name, $auto_commit)= @_;
my ($loop_time,$end_time,$id);
$dbh->{AutoCommit}= $auto_commit;
$loop_time=new Benchmark;
for ($id=0 ; $id < $opt_loop_count ; $id++)
{
do_query($dbh,"update bench1 set updated=1 where idn=$id");
}
$dbh->commit if (!$auto_commit);
$end_time=new Benchmark;
print "Time for $test_name ($opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Test delete perfomance
###
test_delete("bench1","delete_commit",0);
test_delete("bench2","delete_autocommit",1);
sub test_delete
{
my ($table, $test_name, $auto_commit)= @_;
my ($loop_time,$end_time,$id);
$dbh->{AutoCommit}= $auto_commit;
$loop_time=new Benchmark;
for ($id=0 ; $id < $opt_loop_count ; $id++)
{
do_query($dbh,"delete from $table where idn=$id");
}
$dbh->commit if (!$auto_commit);
$end_time=new Benchmark;
print "Time for $test_name ($opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Test rollback performance
###
print "Test transactions rollback performance\n" if($opt_debug);
##
## Insert rollback test
##
#
# Test is done by inserting 10 rows in a table with lots of rows and
# then doing a rollback on these
#
{
my ($id,$rev_id,$grp,$region,$end,$loop_time,$end_time,$commit_loop,$count);
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
$end=$opt_loop_count*2;
$count=0;
for ($commit_loop=1, $id=$opt_loop_count ; $id < $end ;
$id++, $commit_loop++)
{
$rev_id=$end-$id;
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"insert into bench1 values ($id,$rev_id,'$region',$grp,0)");
if ($commit_loop >= $opt_medium_loop_count)
{
$dbh->rollback;
$commit_loop=0;
$count++;
}
}
if ($commit_loop > 1)
{
$dbh->rollback;
$count++;
}
$end_time=new Benchmark;
print "Time for insert_rollback ($count:$opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
###
### Update rollback test
###
if (0)
{
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
for ($id=0,$rev_id=$opt_medium_loop_count ; $id < $opt_medium_loop_count; $id++,$rev_id--)
{
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"update bench1 set region='$region',grp=$grp where idn=$id");
}
$dbh->rollback;
$end_time=new Benchmark;
print "Time for update rollback (" . ($opt_medium_loop_count) . "): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
### Delete rollback test
$dbh->{AutoCommit} = 0;
$loop_time=new Benchmark;
for ($id=0,$rev_id=$opt_medium_loop_count; $id < $opt_medium_loop_count; $id++,$rev_id--)
{
$grp=$id/$opt_groups;
$region=chr(65+$id%$opt_groups);
do_query($dbh,"delete from bench1 where idn=$id");
}
$dbh->rollback;
$end_time=new Benchmark;
print "Time for delete rollback (" . ($opt_medium_loop_count) . "): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
$dbh->{AutoCommit} = 1;
}
####
#### End of benchmark
####
$sth = $dbh->do("drop table bench1" . $server->{'drop_attr'}) or die $DBI::errstr;
$sth = $dbh->do("drop table bench2" . $server->{'drop_attr'}) or die $DBI::errstr;
$dbh->disconnect; # close connection
end_benchmark($start_time);
...@@ -2164,10 +2164,7 @@ bool Item_func_match::eq(const Item *item) const ...@@ -2164,10 +2164,7 @@ bool Item_func_match::eq(const Item *item) const
double Item_func_match::val() double Item_func_match::val()
{ {
if (ft_handler==NULL) if (ft_handler==NULL)
init_search(1); return -1.0;
if ((null_value= (ft_handler==NULL)))
return 0.0;
if (join_key) if (join_key)
{ {
......
...@@ -47,7 +47,6 @@ char pstack_file_name[80]; ...@@ -47,7 +47,6 @@ char pstack_file_name[80];
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ) #if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
#define HAVE_CLOSE_SERVER_SOCK 1 #define HAVE_CLOSE_SERVER_SOCK 1
void close_server_sock();
#endif #endif
extern "C" { // Because of SCO 3.2V4.2 extern "C" { // Because of SCO 3.2V4.2
...@@ -207,7 +206,7 @@ SHOW_COMP_OPTION have_openssl=SHOW_OPTION_NO; ...@@ -207,7 +206,7 @@ SHOW_COMP_OPTION have_openssl=SHOW_OPTION_NO;
SHOW_COMP_OPTION have_symlink=SHOW_OPTION_YES; SHOW_COMP_OPTION have_symlink=SHOW_OPTION_YES;
static bool opt_skip_slave_start = 0; // if set, slave is not autostarted static bool opt_skip_slave_start = 0; // If set, slave is not autostarted
static bool opt_do_pstack = 0; static bool opt_do_pstack = 0;
static ulong opt_specialflag=SPECIAL_ENGLISH; static ulong opt_specialflag=SPECIAL_ENGLISH;
static ulong back_log,connect_timeout,concurrency; static ulong back_log,connect_timeout,concurrency;
...@@ -229,8 +228,10 @@ int segfaulted = 0; // ensure we do not enter SIGSEGV handler twice ...@@ -229,8 +228,10 @@ int segfaulted = 0; // ensure we do not enter SIGSEGV handler twice
extern MASTER_INFO glob_mi; extern MASTER_INFO glob_mi;
extern int init_master_info(MASTER_INFO* mi); extern int init_master_info(MASTER_INFO* mi);
// if sql_bin_update is true, SQL_LOG_UPDATE and SQL_LOG_BIN are kept in sync, /*
// and are treated as aliases for each other If sql_bin_update is true, SQL_LOG_UPDATE and SQL_LOG_BIN are kept in sync,
and are treated as aliases for each other
*/
static bool kill_in_progress=FALSE; static bool kill_in_progress=FALSE;
static struct rand_struct sql_rand; static struct rand_struct sql_rand;
...@@ -385,6 +386,7 @@ static char *get_relative_path(const char *path); ...@@ -385,6 +386,7 @@ static char *get_relative_path(const char *path);
static void fix_paths(void); static void fix_paths(void);
static pthread_handler_decl(handle_connections_sockets,arg); static pthread_handler_decl(handle_connections_sockets,arg);
static int bootstrap(FILE *file); static int bootstrap(FILE *file);
static void close_server_sock();
static bool read_init_file(char *file_name); static bool read_init_file(char *file_name);
#ifdef __NT__ #ifdef __NT__
static pthread_handler_decl(handle_connections_namedpipes,arg); static pthread_handler_decl(handle_connections_namedpipes,arg);
...@@ -454,9 +456,7 @@ static void close_connections(void) ...@@ -454,9 +456,7 @@ static void close_connections(void)
if (error != 0 && !count++) if (error != 0 && !count++)
sql_print_error("Got error %d from pthread_cond_timedwait",error); sql_print_error("Got error %d from pthread_cond_timedwait",error);
#endif #endif
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
close_server_sock(); close_server_sock();
#endif
} }
(void) pthread_mutex_unlock(&LOCK_thread_count); (void) pthread_mutex_unlock(&LOCK_thread_count);
#endif /* __WIN__ */ #endif /* __WIN__ */
...@@ -570,28 +570,31 @@ static void close_connections(void) ...@@ -570,28 +570,31 @@ static void close_connections(void)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
#ifdef HAVE_CLOSE_SERVER_SOCK static void close_server_sock()
void close_server_sock()
{ {
#ifdef HAVE_CLOSE_SERVER_SOCK
DBUG_ENTER("close_server_sock"); DBUG_ENTER("close_server_sock");
if (ip_sock != INVALID_SOCKET) my_socket tmp_sock;
tmp_sock=ip_sock;
if (tmp_sock != INVALID_SOCKET)
{ {
DBUG_PRINT("info",("closing TCP/IP socket"));
VOID(shutdown(ip_sock,2));
VOID(closesocket(ip_sock));
ip_sock=INVALID_SOCKET; ip_sock=INVALID_SOCKET;
DBUG_PRINT("info",("closing TCP/IP socket"));
VOID(shutdown(tmp_sock,2));
VOID(closesocket(tmp_sock));
} }
if (unix_sock != INVALID_SOCKET) tmp_sock=unix_sock;
if (tmp_sock != INVALID_SOCKET)
{ {
unix_sock=INVALID_SOCKET;
DBUG_PRINT("info",("closing Unix socket")); DBUG_PRINT("info",("closing Unix socket"));
VOID(shutdown(unix_sock,2)); VOID(shutdown(tmp_sock,2));
VOID(closesocket(unix_sock)); VOID(closesocket(tmp_sock));
VOID(unlink(mysql_unix_port)); VOID(unlink(mysql_unix_port));
unix_sock=INVALID_SOCKET;
} }
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
}
#endif #endif
}
void kill_mysql(void) void kill_mysql(void)
{ {
...@@ -607,10 +610,12 @@ void kill_mysql(void) ...@@ -607,10 +610,12 @@ void kill_mysql(void)
{ {
DBUG_PRINT("error",("Got error: %ld from SetEvent",GetLastError())); DBUG_PRINT("error",("Got error: %ld from SetEvent",GetLastError()));
} }
// or: /*
// HANDLE hEvent=OpenEvent(0, FALSE, "MySqlShutdown"); or:
// SetEvent(hEventShutdown); HANDLE hEvent=OpenEvent(0, FALSE, "MySqlShutdown");
// CloseHandle(hEvent); SetEvent(hEventShutdown);
CloseHandle(hEvent);
*/
} }
#elif defined(OS2) #elif defined(OS2)
pthread_cond_signal( &eventShutdown); // post semaphore pthread_cond_signal( &eventShutdown); // post semaphore
...@@ -647,8 +652,7 @@ static void __cdecl kill_server(int sig_ptr) ...@@ -647,8 +652,7 @@ static void __cdecl kill_server(int sig_ptr)
int sig=(int) (long) sig_ptr; // This is passed a int int sig=(int) (long) sig_ptr; // This is passed a int
DBUG_ENTER("kill_server"); DBUG_ENTER("kill_server");
// if there is a signal during the kill in progress, we do not need // if there is a signal during the kill in progress, ignore the other
// another one
if (kill_in_progress) // Safety if (kill_in_progress) // Safety
RETURN_FROM_KILL_SERVER; RETURN_FROM_KILL_SERVER;
kill_in_progress=TRUE; kill_in_progress=TRUE;
...@@ -1207,10 +1211,12 @@ static void start_signal_handler(void) ...@@ -1207,10 +1211,12 @@ static void start_signal_handler(void)
static sig_handler handle_segfault(int sig) static sig_handler handle_segfault(int sig)
{ {
THD *thd=current_thd; THD *thd=current_thd;
// strictly speaking, one needs a mutex here /*
// but since we have got SIGSEGV already, things are a mess Strictly speaking, one needs a mutex here
// so not having the mutex is not as bad as possibly using a buggy but since we have got SIGSEGV already, things are a mess
// mutex - so we keep things simple so not having the mutex is not as bad as possibly using a buggy
mutex - so we keep things simple
*/
if (segfaulted) if (segfaulted)
{ {
fprintf(stderr, "Fatal signal %d while backtracing\n", sig); fprintf(stderr, "Fatal signal %d while backtracing\n", sig);
...@@ -1559,8 +1565,10 @@ pthread_handler_decl(handle_shutdown,arg) ...@@ -1559,8 +1565,10 @@ pthread_handler_decl(handle_shutdown,arg)
// close semaphore and kill server // close semaphore and kill server
pthread_cond_destroy( &eventShutdown); pthread_cond_destroy( &eventShutdown);
// exit main loop on main thread, so kill will be done from /*
// main thread (this is thread 2) Exit main loop on main thread, so kill will be done from
main thread (this is thread 2)
*/
abort_loop = 1; abort_loop = 1;
// unblock select() // unblock select()
...@@ -1584,8 +1592,9 @@ static void open_log(MYSQL_LOG *log, const char *hostname, ...@@ -1584,8 +1592,9 @@ static void open_log(MYSQL_LOG *log, const char *hostname,
char tmp[FN_REFLEN]; char tmp[FN_REFLEN];
if (!opt_name || !opt_name[0]) if (!opt_name || !opt_name[0])
{ {
/* TODO: The following should be using fn_format(); We just need to /*
first change fn_format() to cut the file name if it's too long. TODO: The following should be using fn_format(); We just need to
first change fn_format() to cut the file name if it's too long.
*/ */
strmake(tmp,hostname,FN_REFLEN-5); strmake(tmp,hostname,FN_REFLEN-5);
strmov(strcend(tmp,'.'),extension); strmov(strcend(tmp,'.'),extension);
...@@ -2136,9 +2145,11 @@ int main(int argc, char **argv) ...@@ -2136,9 +2145,11 @@ int main(int argc, char **argv)
} }
} }
// This is a WIN95 machine or a start of mysqld as a standalone program /*
// we have to pass the arguments, in case of NT-service this will be done This is a WIN95 machine or a start of mysqld as a standalone program
// by ServiceMain() we have to pass the arguments, in case of NT-service this will be done
by ServiceMain()
*/
Service.my_argc=argc; Service.my_argc=argc;
Service.my_argv=argv; Service.my_argv=argv;
...@@ -2726,8 +2737,10 @@ static struct option long_options[] = { ...@@ -2726,8 +2737,10 @@ static struct option long_options[] = {
{"master-ssl-cert", optional_argument, 0, (int) OPT_MASTER_SSL_CERT}, {"master-ssl-cert", optional_argument, 0, (int) OPT_MASTER_SSL_CERT},
{"myisam-recover", optional_argument, 0, (int) OPT_MYISAM_RECOVER}, {"myisam-recover", optional_argument, 0, (int) OPT_MYISAM_RECOVER},
{"memlock", no_argument, 0, (int) OPT_MEMLOCK}, {"memlock", no_argument, 0, (int) OPT_MEMLOCK},
// needs to be available for the test case to pass in non-debugging mode /*
// is a no-op Option needs to be available for the test case to pass in non-debugging
mode. is a no-op.
*/
{"disconnect-slave-event-count", required_argument, 0, {"disconnect-slave-event-count", required_argument, 0,
(int) OPT_DISCONNECT_SLAVE_EVENT_COUNT}, (int) OPT_DISCONNECT_SLAVE_EVENT_COUNT},
{"abort-slave-event-count", required_argument, 0, {"abort-slave-event-count", required_argument, 0,
...@@ -2762,8 +2775,7 @@ static struct option long_options[] = { ...@@ -2762,8 +2775,7 @@ static struct option long_options[] = {
(int) OPT_REPLICATE_WILD_IGNORE_TABLE}, (int) OPT_REPLICATE_WILD_IGNORE_TABLE},
{"replicate-rewrite-db", required_argument, 0, {"replicate-rewrite-db", required_argument, 0,
(int) OPT_REPLICATE_REWRITE_DB}, (int) OPT_REPLICATE_REWRITE_DB},
// In replication, we may need to tell the other servers how to connect // In replication, we may need to tell the other servers how to connect
// to us
{"report-host", required_argument, 0, (int) OPT_REPORT_HOST}, {"report-host", required_argument, 0, (int) OPT_REPORT_HOST},
{"report-user", required_argument, 0, (int) OPT_REPORT_USER}, {"report-user", required_argument, 0, (int) OPT_REPORT_USER},
{"report-password", required_argument, 0, (int) OPT_REPORT_PASSWORD}, {"report-password", required_argument, 0, (int) OPT_REPORT_PASSWORD},
......
...@@ -2174,8 +2174,8 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name, ...@@ -2174,8 +2174,8 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name,
int setup_ftfuncs(THD *thd) int setup_ftfuncs(THD *thd)
{ {
List_iterator<Item_func_match> li(thd->lex.ftfunc_list), List_iterator<Item_func_match> li(thd->lex.select_lex.ftfunc_list),
lj(thd->lex.ftfunc_list); lj(thd->lex.select_lex.ftfunc_list);
Item_func_match *ftf, *ftf2; Item_func_match *ftf, *ftf2;
while ((ftf=li++)) while ((ftf=li++))
...@@ -2195,7 +2195,7 @@ int setup_ftfuncs(THD *thd) ...@@ -2195,7 +2195,7 @@ int setup_ftfuncs(THD *thd)
int init_ftfuncs(THD *thd, bool no_order) int init_ftfuncs(THD *thd, bool no_order)
{ {
List_iterator<Item_func_match> li(thd->lex.ftfunc_list); List_iterator<Item_func_match> li(thd->lex.select_lex.ftfunc_list);
Item_func_match *ifm; Item_func_match *ifm;
DBUG_PRINT("info",("Performing FULLTEXT search")); DBUG_PRINT("info",("Performing FULLTEXT search"));
thd->proc_info="FULLTEXT initialization"; thd->proc_info="FULLTEXT initialization";
......
/* Copyright (C) 2000 MySQL AB /* Copyright (C) 2000 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
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* /*
Delete of records and truncate of tables. Delete of records and truncate of tables.
Multi-table deletes were introduced by Monty and Sinisa Multi-table deletes were introduced by Monty and Sinisa
*/ */
#include "mysql_priv.h" #include "mysql_priv.h"
#include "ha_innobase.h" #include "ha_innobase.h"
#include "sql_select.h" #include "sql_select.h"
...@@ -75,7 +79,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -75,7 +79,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
if (error) if (error)
DBUG_RETURN(-1); DBUG_RETURN(-1);
if ((select && select->check_quick(test(thd->options & SQL_SAFE_UPDATES), if ((select && select->check_quick(test(thd->options & SQL_SAFE_UPDATES),
limit)) || limit)) ||
!limit) !limit)
{ {
delete select; delete select;
...@@ -125,8 +129,8 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -125,8 +129,8 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
} }
init_read_record(&info,thd,table,select,1,1); init_read_record(&info,thd,table,select,1,1);
init_ftfuncs(thd,1);
deleted=0L; deleted=0L;
init_ftfuncs(thd,1);
thd->proc_info="updating"; thd->proc_info="updating";
while (!(error=info.read_record(&info)) && !thd->killed) while (!(error=info.read_record(&info)) && !thd->killed)
{ {
......
...@@ -1718,7 +1718,7 @@ mysql_execute_command(void) ...@@ -1718,7 +1718,7 @@ mysql_execute_command(void)
table_count)) && ! thd->fatal_error) table_count)) && ! thd->fatal_error)
{ {
res=mysql_select(thd,tables,select_lex->item_list, res=mysql_select(thd,tables,select_lex->item_list,
select_lex->where,select_lex->ftfunc_list, select_lex->where,
(ORDER *)NULL,(ORDER *)NULL,(Item *)NULL, (ORDER *)NULL,(ORDER *)NULL,(Item *)NULL,
(ORDER *)NULL, (ORDER *)NULL,
select_lex->options | thd->options | select_lex->options | thd->options |
......
...@@ -35,11 +35,10 @@ const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref", ...@@ -35,11 +35,10 @@ const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref",
"MAYBE_REF","ALL","range","index","fulltext" }; "MAYBE_REF","ALL","range","index","fulltext" };
static bool make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds, static bool make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
DYNAMIC_ARRAY *keyuse,List<Item_func_match> &ftfuncs); DYNAMIC_ARRAY *keyuse);
static bool update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse, static bool update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,
JOIN_TAB *join_tab, JOIN_TAB *join_tab,
uint tables,COND *conds,table_map table_map, uint tables,COND *conds,table_map table_map);
List<Item_func_match> &ftfuncs);
static int sort_keyuse(KEYUSE *a,KEYUSE *b); static int sort_keyuse(KEYUSE *a,KEYUSE *b);
static void set_position(JOIN *join,uint index,JOIN_TAB *table,KEYUSE *key); static void set_position(JOIN *join,uint index,JOIN_TAB *table,KEYUSE *key);
static void find_best_combination(JOIN *join,table_map rest_tables); static void find_best_combination(JOIN *join,table_map rest_tables);
...@@ -156,7 +155,6 @@ int handle_select(THD *thd, LEX *lex, select_result *result) ...@@ -156,7 +155,6 @@ int handle_select(THD *thd, LEX *lex, select_result *result)
res=mysql_select(thd,(TABLE_LIST*) select_lex->table_list.first, res=mysql_select(thd,(TABLE_LIST*) select_lex->table_list.first,
select_lex->item_list, select_lex->item_list,
select_lex->where, select_lex->where,
select_lex->ftfunc_list,
(ORDER*) select_lex->order_list.first, (ORDER*) select_lex->order_list.first,
(ORDER*) select_lex->group_list.first, (ORDER*) select_lex->group_list.first,
select_lex->having, select_lex->having,
...@@ -177,7 +175,6 @@ int handle_select(THD *thd, LEX *lex, select_result *result) ...@@ -177,7 +175,6 @@ int handle_select(THD *thd, LEX *lex, select_result *result)
int int
mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
List<Item_func_match> &ftfuncs,
ORDER *order, ORDER *group,Item *having,ORDER *proc_param, ORDER *order, ORDER *group,Item *having,ORDER *proc_param,
ulong select_options,select_result *result) ulong select_options,select_result *result)
{ {
...@@ -220,7 +217,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, ...@@ -220,7 +217,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
if (having->with_sum_func) if (having->with_sum_func)
having->split_sum_func(all_fields); having->split_sum_func(all_fields);
} }
if (setup_ftfuncs(thd,tables,ftfuncs)) /* should be after having->fix_fields */ if (setup_ftfuncs(thd)) /* should be after having->fix_fields */
DBUG_RETURN(-1); DBUG_RETURN(-1);
/* /*
Check if one one uses a not constant column with group functions Check if one one uses a not constant column with group functions
...@@ -408,8 +405,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, ...@@ -408,8 +405,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
/* Calculate how to do the join */ /* Calculate how to do the join */
thd->proc_info="statistics"; thd->proc_info="statistics";
if (make_join_statistics(&join,tables,conds,&keyuse,ftfuncs) || if (make_join_statistics(&join,tables,conds,&keyuse) || thd->fatal_error)
thd->fatal_error)
goto err; goto err;
thd->proc_info="preparing"; thd->proc_info="preparing";
result->initialize_tables(&join); result->initialize_tables(&join);
...@@ -532,7 +528,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, ...@@ -532,7 +528,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
make_join_readinfo(&join, make_join_readinfo(&join,
(select_options & (SELECT_DESCRIBE | (select_options & (SELECT_DESCRIBE |
SELECT_NO_JOIN_CACHE)) | SELECT_NO_JOIN_CACHE)) |
(ftfuncs.elements ? SELECT_NO_JOIN_CACHE : 0)); (thd->lex.select_lex.ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0));
/* Need to tell Innobase that to play it safe, it should fetch all /* Need to tell Innobase that to play it safe, it should fetch all
columns of the tables: this is because MySQL columns of the tables: this is because MySQL
...@@ -599,18 +595,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds, ...@@ -599,18 +595,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
} }
/* Perform FULLTEXT search before all regular searches */ /* Perform FULLTEXT search before all regular searches */
if (ftfuncs.elements) init_ftfuncs(thd,test(order));
{
List_iterator_fast<Item_func_match> li(ftfuncs);
Item_func_match *ifm;
DBUG_PRINT("info",("Performing FULLTEXT search"));
thd->proc_info="FULLTEXT search init";
while ((ifm=li++))
{
ifm->init_search(test(order));
}
}
/* Create a tmp table if distinct or if the sort is too complicated */ /* Create a tmp table if distinct or if the sort is too complicated */
if (need_tmp) if (need_tmp)
{ {
...@@ -902,8 +888,7 @@ static ha_rows get_quick_record_count(SQL_SELECT *select,TABLE *table, ...@@ -902,8 +888,7 @@ static ha_rows get_quick_record_count(SQL_SELECT *select,TABLE *table,
static bool static bool
make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds, make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
DYNAMIC_ARRAY *keyuse_array, DYNAMIC_ARRAY *keyuse_array)
List<Item_func_match> &ftfuncs)
{ {
int error; int error;
uint i,table_count,const_count,found_ref,refs,key,const_ref,eq_part; uint i,table_count,const_count,found_ref,refs,key,const_ref,eq_part;
...@@ -1015,7 +1000,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds, ...@@ -1015,7 +1000,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
if (conds || outer_join) if (conds || outer_join)
if (update_ref_and_keys(join->thd,keyuse_array,stat,join->tables, if (update_ref_and_keys(join->thd,keyuse_array,stat,join->tables,
conds,~outer_join,ftfuncs)) conds,~outer_join))
DBUG_RETURN(1); DBUG_RETURN(1);
/* loop until no more const tables are found */ /* loop until no more const tables are found */
...@@ -1524,8 +1509,7 @@ sort_keyuse(KEYUSE *a,KEYUSE *b) ...@@ -1524,8 +1509,7 @@ sort_keyuse(KEYUSE *a,KEYUSE *b)
static bool static bool
update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
uint tables, COND *cond, table_map normal_tables, uint tables, COND *cond, table_map normal_tables)
List<Item_func_match> &ftfuncs)
{ {
uint and_level,i,found_eq_constant; uint and_level,i,found_eq_constant;
...@@ -1553,7 +1537,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, ...@@ -1553,7 +1537,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
add_key_part(keyuse,field); add_key_part(keyuse,field);
} }
if (ftfuncs.elements) if (thd->lex.select_lex.ftfunc_list.elements)
{ {
add_ft_keys(keyuse,join_tab,cond,normal_tables); add_ft_keys(keyuse,join_tab,cond,normal_tables);
} }
...@@ -1561,7 +1545,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, ...@@ -1561,7 +1545,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
/* /*
** remove ref if there is a keypart which is a ref and a const. ** remove ref if there is a keypart which is a ref and a const.
** remove keyparts without previous keyparts. ** remove keyparts without previous keyparts.
** Special treatment for ft-keys. SerG. ** Special treatment for ft-keys.
*/ */
if (keyuse->elements) if (keyuse->elements)
{ {
......
...@@ -68,7 +68,6 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) ...@@ -68,7 +68,6 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first, res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first,
sl->item_list, sl->item_list,
sl->where, sl->where,
sl->ftfunc_list,
(sl->braces) ? (ORDER *) sl->order_list.first : (ORDER *) 0, (sl->braces) ? (ORDER *) sl->order_list.first : (ORDER *) 0,
(ORDER*) sl->group_list.first, (ORDER*) sl->group_list.first,
sl->having, sl->having,
...@@ -127,7 +126,6 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) ...@@ -127,7 +126,6 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first, res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first,
sl->item_list, sl->item_list,
sl->where, sl->where,
sl->ftfunc_list,
(sl->braces) ? (ORDER *)sl->order_list.first : (ORDER *) 0, (sl->braces) ? (ORDER *)sl->order_list.first : (ORDER *) 0,
(ORDER*) sl->group_list.first, (ORDER*) sl->group_list.first,
sl->having, sl->having,
...@@ -150,8 +148,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) ...@@ -150,8 +148,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
/* Create a list of fields in the temporary table */ /* Create a list of fields in the temporary table */
List_iterator<Item> it(item_list); List_iterator<Item> it(item_list);
Field **field; Field **field;
#if 0
List<Item_func_match> ftfunc_list; List<Item_func_match> ftfunc_list;
ftfunc_list.empty(); ftfunc_list.empty();
#else
thd->lex.select_lex.ftfunc_list.empty();
#endif
for (field=table->field ; *field ; field++) for (field=table->field ; *field ; field++)
{ {
...@@ -170,7 +172,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) ...@@ -170,7 +172,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
thd->options&= ~OPTION_FOUND_ROWS; thd->options&= ~OPTION_FOUND_ROWS;
} }
res=mysql_select(thd,&result_table_list, res=mysql_select(thd,&result_table_list,
item_list, NULL, ftfunc_list, order, item_list, NULL, /*ftfunc_list,*/ order,
(ORDER*) NULL, NULL, (ORDER*) NULL, (ORDER*) NULL, NULL, (ORDER*) NULL,
thd->options, result); thd->options, result);
} }
......
...@@ -330,7 +330,7 @@ LOG_MSG_FUNC(log_debug,LOG_DEBUG) ...@@ -330,7 +330,7 @@ LOG_MSG_FUNC(log_debug,LOG_DEBUG)
void log_debug(const char* __attribute__((unused)) fmt,...) {} void log_debug(const char* __attribute__((unused)) fmt,...) {}
#endif #endif
static void handle_sigterm(int sig) static void handle_sigterm(int sig __attribute__((unused)))
{ {
log_info("Got SIGTERM"); log_info("Got SIGTERM");
if (!one_thread) if (!one_thread)
......
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