Commit 5f6cbe3d authored by serg@serg.mysql.com's avatar serg@serg.mysql.com

Merge

parents a9344b42 61e33ebe
...@@ -197,3 +197,4 @@ bdb/build_win32/db.h ...@@ -197,3 +197,4 @@ bdb/build_win32/db.h
bdb/dist/configure bdb/dist/configure
bdb/dist/tags bdb/dist/tags
bdb/build_unix/* bdb/build_unix/*
sql/.gdbinit
...@@ -7,11 +7,6 @@ extra_flags="$pentium_cflags $fast_cflags" ...@@ -7,11 +7,6 @@ extra_flags="$pentium_cflags $fast_cflags"
extra_configs="$pentium_configs" extra_configs="$pentium_configs"
strip=yes strip=yes
# Use the optimized version if it exists extra_configs="$extra_configs --with-berkeley-db --with-innobase"
if test -d /usr/local/BerkeleyDB-opt/
then
extra_configs="$extra_configs --with-berkeley-db=/usr/local/BerkeleyDB-opt/"
fi
extra_configs="$extra_configs --with-innobase"
. "$path/FINISH.sh" . "$path/FINISH.sh"
...@@ -8,11 +8,6 @@ c_warnings="$c_warnings $debug_extra_warnings" ...@@ -8,11 +8,6 @@ c_warnings="$c_warnings $debug_extra_warnings"
cxx_warnings="$cxx_warnings $debug_extra_warnings" cxx_warnings="$cxx_warnings $debug_extra_warnings"
extra_configs="$pentium_configs $debug_configs" extra_configs="$pentium_configs $debug_configs"
# Use the debug version if it exists extra_configs="$extra_configs --with-berkeley-db --with-innobase"
if test -d /usr/local/BerkeleyDB-dbug/
then
extra_configs="$extra_configs --with-berkeley-db=/usr/local/BerkeleyDB-dbug/"
fi
extra_configs="$extra_configs --with-innobase"
. "$path/FINISH.sh" . "$path/FINISH.sh"
This diff is collapsed.
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include "my_readline.h" #include "my_readline.h"
#include <signal.h> #include <signal.h>
const char *VER="11.12"; const char *VER="11.13";
/* 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
...@@ -1518,6 +1518,22 @@ com_ego(String *buffer,char *line) ...@@ -1518,6 +1518,22 @@ com_ego(String *buffer,char *line)
return result; return result;
} }
static void
print_field_types(MYSQL_RES *result)
{
MYSQL_FIELD *field;
while ((field = mysql_fetch_field(result)))
{
tee_fprintf(PAGER,"%s '%s' %d %d %d %d %d\n",
field->name,
field->table ? "" : field->table,
(int) field->type,
field->length, field->max_length,
field->flags, field->decimals);
}
tee_puts("", PAGER);
}
static void static void
print_table_data(MYSQL_RES *result) print_table_data(MYSQL_RES *result)
...@@ -1528,6 +1544,11 @@ print_table_data(MYSQL_RES *result) ...@@ -1528,6 +1544,11 @@ print_table_data(MYSQL_RES *result)
bool *num_flag; bool *num_flag;
num_flag=(bool*) my_alloca(sizeof(bool)*mysql_num_fields(result)); num_flag=(bool*) my_alloca(sizeof(bool)*mysql_num_fields(result));
if (info_flag)
{
print_field_types(result);
mysql_field_seek(result,0);
}
separator.copy("+",1); separator.copy("+",1);
while ((field = mysql_fetch_field(result))) while ((field = mysql_fetch_field(result)))
{ {
......
...@@ -28,9 +28,9 @@ ...@@ -28,9 +28,9 @@
#include <my_pthread.h> /* because of signal() */ #include <my_pthread.h> /* because of signal() */
#endif #endif
#define ADMIN_VERSION "8.17" #define ADMIN_VERSION "8.18"
#define MAX_MYSQL_VAR 64 #define MAX_MYSQL_VAR 64
#define MAX_TIME_TO_WAIT 3600 /* Wait for shutdown */ #define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */
#define MAX_TRUNC_LENGTH 3 #define MAX_TRUNC_LENGTH 3
char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH]; char truncated_var_names[MAX_MYSQL_VAR][MAX_TRUNC_LENGTH];
...@@ -40,7 +40,7 @@ static int interval=0; ...@@ -40,7 +40,7 @@ static int interval=0;
static my_bool option_force=0,interrupted=0,new_line=0, static my_bool option_force=0,interrupted=0,new_line=0,
opt_compress=0, opt_relative=0, opt_verbose=0, opt_vertical=0; opt_compress=0, opt_relative=0, opt_verbose=0, opt_vertical=0;
static uint tcp_port = 0, option_wait = 0, option_silent=0; static uint tcp_port = 0, option_wait = 0, option_silent=0;
static ulong opt_connect_timeout; static ulong opt_connect_timeout, opt_shutdown_timeout;
static my_string unix_port=0; static my_string unix_port=0;
/* When using extended-status relatively, ex_val_max_len is the estimated /* When using extended-status relatively, ex_val_max_len is the estimated
...@@ -134,6 +134,8 @@ static struct option long_options[] = { ...@@ -134,6 +134,8 @@ static struct option long_options[] = {
CHANGEABLE_VAR changeable_vars[] = { CHANGEABLE_VAR changeable_vars[] = {
{ "connect_timeout", (long*) &opt_connect_timeout, 0, 0, 3600*12, 0, 1}, { "connect_timeout", (long*) &opt_connect_timeout, 0, 0, 3600*12, 0, 1},
{ "shutdown_timeout", (long*) &opt_shutdown_timeout, SHUTDOWN_DEF_TIMEOUT, 0,
3600*12, 0, 1},
{ 0, 0, 0, 0, 0, 0, 0} { 0, 0, 0, 0, 0, 0, 0}
}; };
...@@ -148,6 +150,7 @@ int main(int argc,char *argv[]) ...@@ -148,6 +150,7 @@ int main(int argc,char *argv[])
MY_INIT(argv[0]); MY_INIT(argv[0]);
mysql_init(&mysql); mysql_init(&mysql);
load_defaults("my",load_default_groups,&argc,&argv); load_defaults("my",load_default_groups,&argc,&argv);
set_all_changeable_vars( changeable_vars );
while ((c=getopt_long(argc,argv,"h:i:p::u:#::P:sS:Ct:fq?vVw::WrEO:", while ((c=getopt_long(argc,argv,"h:i:p::u:#::P:sS:Ct:fq?vVw::WrEO:",
long_options, &option_index)) != EOF) long_options, &option_index)) != EOF)
...@@ -1125,7 +1128,7 @@ static void wait_pidfile(char *pidfile) ...@@ -1125,7 +1128,7 @@ static void wait_pidfile(char *pidfile)
uint count=0; uint count=0;
system_filename(buff,pidfile); system_filename(buff,pidfile);
while ((fd = open(buff, O_RDONLY)) >= 0 && count++ < MAX_TIME_TO_WAIT) while ((fd = open(buff, O_RDONLY)) >= 0 && count++ < opt_shutdown_timeout)
{ {
close(fd); close(fd);
sleep(1); sleep(1);
......
...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. ...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc) AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line! # The Docs Makefile.am parses this line!
AM_INIT_AUTOMAKE(mysql, 3.23.34) AM_INIT_AUTOMAKE(mysql, 3.23.34a)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10 PROTOCOL_VERSION=10
......
...@@ -21,4 +21,6 @@ libs_LIBRARIES = libmem.a ...@@ -21,4 +21,6 @@ libs_LIBRARIES = libmem.a
libmem_a_SOURCES = mem0mem.c mem0pool.c libmem_a_SOURCES = mem0mem.c mem0pool.c
EXTRA_DIST = mem0dbg.c
EXTRA_PROGRAMS = EXTRA_PROGRAMS =
...@@ -19,6 +19,8 @@ include ../include/Makefile.i ...@@ -19,6 +19,8 @@ include ../include/Makefile.i
libs_LIBRARIES = libpars.a libs_LIBRARIES = libpars.a
noinst_HEADERS = pars0grm.h
libpars_a_SOURCES = pars0grm.c lexyy.c pars0opt.c pars0pars.c pars0sym.c libpars_a_SOURCES = pars0grm.c lexyy.c pars0opt.c pars0pars.c pars0sym.c
EXTRA_PROGRAMS = EXTRA_PROGRAMS =
...@@ -6,7 +6,10 @@ actually have a co-existing MySQL installation - the tests will not ...@@ -6,7 +6,10 @@ actually have a co-existing MySQL installation - the tests will not
conflict with it. conflict with it.
All tests must pass. If one or more of them fail on your system, please All tests must pass. If one or more of them fail on your system, please
report the details to bugs@lists.mysql.com read the following manual section of how to report the problem:
http://www.mysql.com/doc/M/y/MySQL_test_suite.html
You can create your own test cases. To create a test case: You can create your own test cases. To create a test case:
......
...@@ -450,14 +450,14 @@ stop_slave () ...@@ -450,14 +450,14 @@ stop_slave ()
{ {
if [ x$SLAVE_RUNNING = x1 ] if [ x$SLAVE_RUNNING = x1 ]
then then
$MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root shutdown $MYSQLADMIN --no-defaults --socket=$SLAVE_MYSOCK -u root -O shutdown_timeout=10 shutdown
if [ $? != 0 ] && [ -f $SLAVE_MYPID ] if [ $? != 0 ] && [ -f $SLAVE_MYPID ]
then # try harder! then # try harder!
$ECHO "slave not cooperating with mysqladmin, will try manual kill" $ECHO "slave not cooperating with mysqladmin, will try manual kill"
kill `$CAT $SLAVE_MYPID` kill `$CAT $SLAVE_MYPID`
sleep $SLEEP_TIME sleep $SLEEP_TIME
if [ -f $SLAVE_MYPID ] ; then if [ -f $SLAVE_MYPID ] ; then
$ECHO "slave refused to die, resorting to SIGKILL murder" $ECHO "slave refused to die. Sending SIGKILL"
kill -9 `$CAT $SLAVE_MYPID` kill -9 `$CAT $SLAVE_MYPID`
$RM -f $SLAVE_MYPID $RM -f $SLAVE_MYPID
else else
...@@ -472,14 +472,14 @@ stop_master () ...@@ -472,14 +472,14 @@ stop_master ()
{ {
if [ x$MASTER_RUNNING = x1 ] if [ x$MASTER_RUNNING = x1 ]
then then
$MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root shutdown $MYSQLADMIN --no-defaults --socket=$MASTER_MYSOCK -u root -O shutdown_timeout=10 shutdown
if [ $? != 0 ] && [ -f $MASTER_MYPID ] if [ $? != 0 ] && [ -f $MASTER_MYPID ]
then # try harder! then # try harder!
$ECHO "master not cooperating with mysqladmin, will try manual kill" $ECHO "master not cooperating with mysqladmin, will try manual kill"
kill `$CAT $MASTER_MYPID` kill `$CAT $MASTER_MYPID`
sleep $SLEEP_TIME sleep $SLEEP_TIME
if [ -f $MASTER_MYPID ] ; then if [ -f $MASTER_MYPID ] ; then
$ECHO "master refused to die, resorting to SIGKILL murder" $ECHO "master refused to die. Sending SIGKILL"
kill -9 `$CAT $MASTER_MYPID` kill -9 `$CAT $MASTER_MYPID`
$RM -f $MASTER_MYPID $RM -f $MASTER_MYPID
else else
......
...@@ -490,3 +490,5 @@ a 2 ...@@ -490,3 +490,5 @@ a 2
a b a b
a 1 a 1
a 2 a 2
MIN(B) MAX(b)
1 1
...@@ -443,3 +443,5 @@ i j ...@@ -443,3 +443,5 @@ i j
1 2 1 2
i j i j
1 2 1 2
MIN(B) MAX(b)
1 1
...@@ -664,3 +664,17 @@ SELECT * FROM t1 WHERE a='a' AND b=2; ...@@ -664,3 +664,17 @@ SELECT * FROM t1 WHERE a='a' AND b=2;
SELECT * FROM t1 WHERE a='a' AND b in (2); SELECT * FROM t1 WHERE a='a' AND b in (2);
SELECT * FROM t1 WHERE a='a' AND b in (1,2); SELECT * FROM t1 WHERE a='a' AND b in (1,2);
drop table t1; drop table t1;
#
# Test min-max optimization
#
CREATE TABLE t1 (
a int3 unsigned NOT NULL,
b int1 unsigned NOT NULL,
UNIQUE (a, b)
) TYPE = BDB;
INSERT INTO t1 VALUES (1, 1);
SELECT MIN(B),MAX(b) FROM t1 WHERE t1.a = 1;
drop table t1;
...@@ -11,6 +11,7 @@ insert delayed into t1 set a = 4; ...@@ -11,6 +11,7 @@ insert delayed into t1 set a = 4;
insert delayed into t1 set a = 5, tmsp = 19711006010203; insert delayed into t1 set a = 5, tmsp = 19711006010203;
insert delayed into t1 (a, tmsp) values (6, 19711006010203); insert delayed into t1 (a, tmsp) values (6, 19711006010203);
insert delayed into t1 (a, tmsp) values (7, NULL); insert delayed into t1 (a, tmsp) values (7, NULL);
--sleep 1
insert into t1 set a = 8,tmsp=19711006010203; insert into t1 set a = 8,tmsp=19711006010203;
select * from t1 where tmsp=0; select * from t1 where tmsp=0;
select * from t1 where tmsp=19711006010203; select * from t1 where tmsp=19711006010203;
...@@ -27,5 +28,6 @@ insert delayed into t1 values (null,"c"); ...@@ -27,5 +28,6 @@ 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");
--error 1136 --error 1136
insert delayed into t1 values (3,"this will give an","error"); insert delayed into t1 values (3,"this will give an","error");
--sleep 2
select * from t1; select * from t1;
drop table t1; drop table t1;
...@@ -394,3 +394,17 @@ select * from t1 where i=1 and j=2; ...@@ -394,3 +394,17 @@ select * from t1 where i=1 and j=2;
create index ax1 on t1 (i,j); create index ax1 on t1 (i,j);
select * from t1 where i=1 and j=2; select * from t1 where i=1 and j=2;
drop table t1; drop table t1;
#
# Test min-max optimization
#
CREATE TABLE t1 (
a int3 unsigned NOT NULL,
b int1 unsigned NOT NULL,
UNIQUE (a, b)
) TYPE = innobase;
INSERT INTO t1 VALUES (1, 1);
SELECT MIN(B),MAX(b) FROM t1 WHERE t1.a = 1;
drop table t1;
...@@ -165,3 +165,43 @@ insert into t3 (ID, DateOfAction) values (87, '1999-07-19'), (89, '1999-07-19 ...@@ -165,3 +165,43 @@ insert into t3 (ID, DateOfAction) values (87, '1999-07-19'), (89, '1999-07-19
select t3.DateOfAction, t1.TransactionID from t1 join t2 join t3 where t2.ID = t1.TransactionID and t3.ID = t2.GroupID order by t3.DateOfAction, t1.TransactionID; select t3.DateOfAction, t1.TransactionID from t1 join t2 join t3 where t2.ID = t1.TransactionID and t3.ID = t2.GroupID order by t3.DateOfAction, t1.TransactionID;
select t3.DateOfAction, t1.TransactionID from t1 join t2 join t3 where t2.ID = t1.TransactionID and t3.ID = t2.GroupID order by t1.TransactionID,t3.DateOfAction; select t3.DateOfAction, t1.TransactionID from t1 join t2 join t3 where t2.ID = t1.TransactionID and t3.ID = t2.GroupID order by t1.TransactionID,t3.DateOfAction;
drop table t1,t2,t3; drop table t1,t2,t3;
#bug reported by Wouter de Jong
drop table if exists members;
CREATE TABLE members (
member_id int(11) NOT NULL auto_increment,
inschrijf_datum varchar(20) NOT NULL default '',
lastchange_datum varchar(20) NOT NULL default '',
nickname varchar(20) NOT NULL default '',
password varchar(8) NOT NULL default '',
voornaam varchar(30) NOT NULL default '',
tussenvoegsels varchar(10) NOT NULL default '',
achternaam varchar(50) NOT NULL default '',
straat varchar(100) NOT NULL default '',
postcode varchar(10) NOT NULL default '',
wijk varchar(40) NOT NULL default '',
plaats varchar(50) NOT NULL default '',
telefoon varchar(10) NOT NULL default '',
geboortedatum date NOT NULL default '0000-00-00',
geslacht varchar(5) NOT NULL default '',
email varchar(80) NOT NULL default '',
uin varchar(15) NOT NULL default '',
homepage varchar(100) NOT NULL default '',
internet varchar(15) NOT NULL default '',
scherk varchar(30) NOT NULL default '',
favo_boek varchar(50) NOT NULL default '',
favo_tijdschrift varchar(50) NOT NULL default '',
favo_tv varchar(50) NOT NULL default '',
favo_eten varchar(50) NOT NULL default '',
favo_muziek varchar(30) NOT NULL default '',
info text NOT NULL,
ipnr varchar(30) NOT NULL default '',
PRIMARY KEY (member_id)
) TYPE=MyISAM PACK_KEYS=1;
insert into members (member_id) values (1),(2),(3);
select member_id, nickname, voornaam FROM members
ORDER by lastchange_datum DESC LIMIT 2;
drop table members;
...@@ -282,7 +282,7 @@ fi ...@@ -282,7 +282,7 @@ fi
echo "Installing all prepared tables" echo "Installing all prepared tables"
if eval "$execdir/mysqld $defaults --bootstrap --skip-grant-tables \ if eval "$execdir/mysqld $defaults --bootstrap --skip-grant-tables \
--basedir=$basedir --datadir=$ldata --skip-innobase --skip-gemeni --skip-bdb $args" << END_OF_DATA --basedir=$basedir --datadir=$ldata --skip-innobase --skip-gemini --skip-bdb $args" << END_OF_DATA
use mysql; use mysql;
$c_d $c_d
$i_d $i_d
......
When comparing with ms-sql:
Check how to get MySQL faster mysql ms-sql
count_distinct (2000) | 89.00| 39.00|
count_distinct_big (120) | 324.00| 121.00|
count_distinct_group (1000) | 158.00| 107.00|
count_distinct_group_on_key (1000) | 49.00| 17.00|
count_distinct_group_on_key_parts (1| 157.00| 108.00|
order_by_big (10) | 197.00| 89.00|
order_by_big_key (10) | 170.00| 82.00|
order_by_big_key2 (10) | 163.00| 73.00|
order_by_big_key_desc (10) | 172.00| 84.00|
order_by_big_key_diff (10) | 193.00| 89.00|
order_by_big_key_prefix (10) | 165.00| 72.00|
Why is the following slow on NT:
NT Linux
update_of_primary_key_many_keys (256| 560.00| 65.00|
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
# $server Object for current server # $server Object for current server
# $limits Hash reference to limits for benchmark # $limits Hash reference to limits for benchmark
$benchmark_version="2.11a"; $benchmark_version="2.12";
use Getopt::Long; use Getopt::Long;
require "$pwd/server-cfg" || die "Can't read Configuration file: $!\n"; require "$pwd/server-cfg" || die "Can't read Configuration file: $!\n";
......
...@@ -47,6 +47,7 @@ require "$pwd/server-cfg" || die "Can't read Configuration file: $!\n"; ...@@ -47,6 +47,7 @@ require "$pwd/server-cfg" || die "Can't read Configuration file: $!\n";
$opt_server="mysql"; $opt_host="localhost"; $opt_database="test"; $opt_server="mysql"; $opt_host="localhost"; $opt_database="test";
$opt_dir="limits"; $opt_dir="limits";
$opt_user=$opt_password="";
$opt_debug=$opt_help=$opt_Information=$opt_restart=$opt_force=$opt_quick=0; $opt_debug=$opt_help=$opt_Information=$opt_restart=$opt_force=$opt_quick=0;
$opt_log_all_queries=$opt_fix_limit_file=$opt_batch_mode=0; $opt_log_all_queries=$opt_fix_limit_file=$opt_batch_mode=0;
$opt_db_start_cmd=""; # the db server start command $opt_db_start_cmd=""; # the db server start command
......
...@@ -36,11 +36,6 @@ ...@@ -36,11 +36,6 @@
use DBI; use DBI;
$opt_silent=1; # Don't write header $opt_silent=1; # Don't write header
$prog_args="";
foreach $arg (@ARGV)
{
$prog_args.="'" . $arg . "' ";
}
chomp($pwd = `pwd`); $pwd = "." if ($pwd eq ''); chomp($pwd = `pwd`); $pwd = "." if ($pwd eq '');
require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n"; require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n";
...@@ -50,6 +45,20 @@ $machine=machine(); ...@@ -50,6 +45,20 @@ $machine=machine();
$redirect= !($machine =~ /windows/i || $machine =~ "^NT\s") ? "2>&1" : ""; $redirect= !($machine =~ /windows/i || $machine =~ "^NT\s") ? "2>&1" : "";
$dir= ($pwd =~ /\\/) ? '\\' : '/'; # directory symbol for shell $dir= ($pwd =~ /\\/) ? '\\' : '/'; # directory symbol for shell
$prog_args="";
foreach $arg (@ARGV)
{
if ($redirect)
{
$prog_args.="'" . $arg . "' ";
}
else
{
# Windows/NT can't handle ' around arguments
$prog_args.=$arg . " ";
}
}
$prog_count=$errors=0; $prog_count=$errors=0;
if ($opt_cmp) { if ($opt_cmp) {
......
...@@ -194,6 +194,11 @@ sub new ...@@ -194,6 +194,11 @@ sub new
{ {
$limits{'working_blobs'} = 0; # HEAP tables can't handle BLOB's $limits{'working_blobs'} = 0; # HEAP tables can't handle BLOB's
} }
if (defined($main::opt_create_options) &&
$main::opt_create_options =~ /type=innobase/i)
{
$limits{'max_text_size'} = 8000; # Limit in Innobase
}
return $self; return $self;
} }
......
...@@ -130,6 +130,37 @@ if ($opt_lock_tables) ...@@ -130,6 +130,37 @@ if ($opt_lock_tables)
select_test: select_test:
if ($limits->{'group_functions'})
{
my ($tmp); $tmp=1000;
print "Test if the database has a query cache\n";
# First ensure that the table is read into memory
fetch_all_rows($dbh,"select sum(idn+$tmp),sum(rev_idn+$tmp) from bench1");
$loop_time=new Benchmark;
for ($tests=0 ; $tests < $opt_loop_count ; $tests++)
{
fetch_all_rows($dbh,"select sum(idn+$tests),sum(rev_idn+$tests) from bench1");
}
$end_time=new Benchmark;
print "Time for select_query_cache ($opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
# If the database has a query cache, the following loop should be much
# slower than the previous loop
$loop_time=new Benchmark;
for ($tests=0 ; $tests < $opt_loop_count ; $tests++)
{
fetch_all_rows($dbh,"select sum(idn+$tests),sum(rev_idn+$tests) from bench1");
}
$end_time=new Benchmark;
print "Time for select_query_cache2 ($opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
}
print "Testing big selects on the table\n"; print "Testing big selects on the table\n";
$loop_time=new Benchmark; $loop_time=new Benchmark;
$rows=0; $rows=0;
...@@ -288,8 +319,21 @@ if ($limits->{'group_distinct_functions'}) ...@@ -288,8 +319,21 @@ if ($limits->{'group_distinct_functions'})
$rows=$estimated=$count=0; $rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++) for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{ {
$count+=2; $count++;
$rows+=fetch_all_rows($dbh,"select count(distinct region) from bench1"); $rows+=fetch_all_rows($dbh,"select count(distinct region) from bench1");
$end_time=new Benchmark;
last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
$opt_medium_loop_count));
}
print_time($estimated);
print " for count_distinct_key_prefix ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark;
$rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{
$count++;
$rows+=fetch_all_rows($dbh,"select count(distinct grp) from bench1"); $rows+=fetch_all_rows($dbh,"select count(distinct grp) from bench1");
$end_time=new Benchmark; $end_time=new Benchmark;
last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1, last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
...@@ -299,6 +343,20 @@ if ($limits->{'group_distinct_functions'}) ...@@ -299,6 +343,20 @@ if ($limits->{'group_distinct_functions'})
print " for count_distinct ($count:$rows): " . print " for count_distinct ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n"; timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark;
$rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{
$count++;
$rows+=fetch_all_rows($dbh,"select count(distinct grp),count(distinct rev_idn) from bench1");
$end_time=new Benchmark;
last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
$opt_medium_loop_count));
}
print_time($estimated);
print " for count_distinct_2 ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark; $loop_time=new Benchmark;
$rows=$estimated=$count=0; $rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++) for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
......
...@@ -254,7 +254,7 @@ you have to change 'main' to print out the new function\n"); ...@@ -254,7 +254,7 @@ you have to change 'main' to print out the new function\n");
if (write_warning) if (write_warning)
fprintf (stderr,"Fatal error when generating hash for symbols\n\ fprintf (stderr,"Fatal error when generating hash for symbols\n\
Didn't find suitable values for perfect hashing:\n\ Didn't find suitable values for perfect hashing:\n\
You have to edit gen_lex_hase.cc to generate a new hashing function.\n\ You have to edit gen_lex_hash.cc to generate a new hashing function.\n\
You can try running gen_lex_hash with --search to find a suitable value\n\ You can try running gen_lex_hash with --search to find a suitable value\n\
Symbol array size = %d\n",function_mod); Symbol array size = %d\n",function_mod);
return -1; return -1;
...@@ -472,8 +472,10 @@ int main(int argc,char **argv) ...@@ -472,8 +472,10 @@ int main(int argc,char **argv)
int error; int error;
MY_INIT(argv[0]); MY_INIT(argv[0]);
start_value=5315771L; best_t1=6916833L; best_t2=3813748L; best_type=3; /* mode=5839 add=5 type: 0 */ start_value=4934807L; best_t1=5181754L; best_t2=1469522L; best_type=0;
if (get_options(argc,(char **) argv)) /* mode=4999 add=7 type: 0 */
if (get_options(argc,(char **) argv))
exit(1); exit(1);
make_max_length_table(); make_max_length_table();
......
...@@ -1429,7 +1429,12 @@ int ha_berkeley::index_read(byte * buf, const byte * key, ...@@ -1429,7 +1429,12 @@ int ha_berkeley::index_read(byte * buf, const byte * key,
pack_key(&last_key, active_index, key_buff, key, key_len); pack_key(&last_key, active_index, key_buff, key, key_len);
/* Store for compare */ /* Store for compare */
memcpy(key_buff2, key_buff, (key_len=last_key.size)); memcpy(key_buff2, key_buff, (key_len=last_key.size));
key_info->handler.bdb_return_if_eq= -1; /*
If HA_READ_AFTER_KEY is set, return next key, else return first
matching key.
*/
key_info->handler.bdb_return_if_eq= (find_flag == HA_READ_AFTER_KEY ?
1 : -1);
error=read_row(cursor->c_get(cursor, &last_key, &row, DB_SET_RANGE), error=read_row(cursor->c_get(cursor, &last_key, &row, DB_SET_RANGE),
(char*) buf, active_index, &row, (DBT*) 0, 0); (char*) buf, active_index, &row, (DBT*) 0, 0);
key_info->handler.bdb_return_if_eq= 0; key_info->handler.bdb_return_if_eq= 0;
......
...@@ -72,16 +72,18 @@ class ha_innobase: public handler ...@@ -72,16 +72,18 @@ class ha_innobase: public handler
/* Init values for the class: */ /* Init values for the class: */
public: public:
ha_innobase(TABLE *table): handler(table), ha_innobase(TABLE *table): handler(table),
int_option_flag(HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER | int_option_flag(HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER |
HA_REC_NOT_IN_SEQ | HA_REC_NOT_IN_SEQ |
HA_KEYPOS_TO_RNDPOS | HA_LASTKEY_ORDER | HA_KEYPOS_TO_RNDPOS | HA_LASTKEY_ORDER |
HA_HAVE_KEY_READ_ONLY | HA_READ_NOT_EXACT_KEY | HA_HAVE_KEY_READ_ONLY | HA_READ_NOT_EXACT_KEY |
HA_LONGLONG_KEYS | HA_NULL_KEY | HA_LONGLONG_KEYS | HA_NULL_KEY |
HA_NOT_EXACT_COUNT | HA_NOT_EXACT_COUNT |
HA_NO_WRITE_DELAYED | HA_NO_WRITE_DELAYED |
HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE), HA_PRIMARY_KEY_IN_READ_INDEX |
last_dup_key((uint) -1), HA_DROP_BEFORE_CREATE |
start_of_scan(0) HA_NOT_READ_AFTER_KEY),
last_dup_key((uint) -1),
start_of_scan(0)
{ {
} }
~ha_innobase() {} ~ha_innobase() {}
......
...@@ -33,7 +33,8 @@ class ha_isam: public handler ...@@ -33,7 +33,8 @@ class ha_isam: public handler
int_option_flag(HA_READ_NEXT+HA_READ_PREV+HA_READ_RND_SAME+ int_option_flag(HA_READ_NEXT+HA_READ_PREV+HA_READ_RND_SAME+
HA_KEYPOS_TO_RNDPOS+ HA_READ_ORDER+ HA_LASTKEY_ORDER+ HA_KEYPOS_TO_RNDPOS+ HA_READ_ORDER+ HA_LASTKEY_ORDER+
HA_HAVE_KEY_READ_ONLY+HA_READ_NOT_EXACT_KEY+ HA_HAVE_KEY_READ_ONLY+HA_READ_NOT_EXACT_KEY+
HA_LONGLONG_KEYS+HA_KEY_READ_WRONG_STR + HA_DUPP_POS) HA_LONGLONG_KEYS+HA_KEY_READ_WRONG_STR + HA_DUPP_POS +
HA_NOT_DELETE_WITH_CACHE)
{} {}
~ha_isam() {} ~ha_isam() {}
const char *table_type() const { return "ISAM"; } const char *table_type() const { return "ISAM"; }
......
...@@ -484,7 +484,8 @@ int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt) ...@@ -484,7 +484,8 @@ int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt)
} }
break; break;
} }
if (!error && start_records != file->state->records) if (!error && start_records != file->state->records &&
!(check_opt->flags & T_VERY_SILENT))
{ {
char llbuff[22],llbuff2[22]; char llbuff[22],llbuff2[22];
sql_print_error("Warning: Found %s of %s rows when repairing '%s'", sql_print_error("Warning: Found %s of %s rows when repairing '%s'",
......
...@@ -70,6 +70,8 @@ ...@@ -70,6 +70,8 @@
#define HA_NO_WRITE_DELAYED (HA_NOT_EXACT_COUNT*2) #define HA_NO_WRITE_DELAYED (HA_NOT_EXACT_COUNT*2)
#define HA_PRIMARY_KEY_IN_READ_INDEX (HA_NO_WRITE_DELAYED*2) #define HA_PRIMARY_KEY_IN_READ_INDEX (HA_NO_WRITE_DELAYED*2)
#define HA_DROP_BEFORE_CREATE (HA_PRIMARY_KEY_IN_READ_INDEX*2) #define HA_DROP_BEFORE_CREATE (HA_PRIMARY_KEY_IN_READ_INDEX*2)
#define HA_NOT_READ_AFTER_KEY (HA_DROP_BEFORE_CREATE*2)
#define HA_NOT_DELETE_WITH_CACHE (HA_NOT_READ_AFTER_KEY*2)
/* Parameters for open() (in register form->filestat) */ /* Parameters for open() (in register form->filestat) */
/* HA_GET_INFO does a implicit HA_ABORT_IF_LOCKED */ /* HA_GET_INFO does a implicit HA_ABORT_IF_LOCKED */
......
...@@ -270,6 +270,7 @@ static SYMBOL symbols[] = { ...@@ -270,6 +270,7 @@ static SYMBOL symbols[] = {
{ "SLAVE", SYM(SLAVE),0,0}, { "SLAVE", SYM(SLAVE),0,0},
{ "SMALLINT", SYM(SMALLINT),0,0}, { "SMALLINT", SYM(SMALLINT),0,0},
{ "SONAME", SYM(UDF_SONAME_SYM),0,0}, { "SONAME", SYM(UDF_SONAME_SYM),0,0},
{ "SQL_ANSI_MODE", SYM(SQL_ANSI_MODE),0,0},
{ "SQL_AUTO_IS_NULL", SYM(SQL_AUTO_IS_NULL),0,0}, { "SQL_AUTO_IS_NULL", SYM(SQL_AUTO_IS_NULL),0,0},
{ "SQL_BIG_RESULT", SYM(SQL_BIG_RESULT),0,0}, { "SQL_BIG_RESULT", SYM(SQL_BIG_RESULT),0,0},
{ "SQL_BIG_SELECTS", SYM(SQL_BIG_SELECTS),0,0}, { "SQL_BIG_SELECTS", SYM(SQL_BIG_SELECTS),0,0},
......
...@@ -477,7 +477,7 @@ extern uint32 server_id; ...@@ -477,7 +477,7 @@ extern uint32 server_id;
extern char mysql_data_home[2],server_version[SERVER_VERSION_LENGTH], extern char mysql_data_home[2],server_version[SERVER_VERSION_LENGTH],
max_sort_char, mysql_real_data_home[]; max_sort_char, mysql_real_data_home[];
extern my_string mysql_unix_port,mysql_tmpdir; extern my_string mysql_unix_port,mysql_tmpdir;
extern const char *first_keyword, *localhost; extern const char *first_keyword, *localhost, *delayed_user;
extern ulong refresh_version,flush_version, thread_id,query_id,opened_tables, extern ulong refresh_version,flush_version, thread_id,query_id,opened_tables,
created_tmp_tables, created_tmp_disk_tables, created_tmp_tables, created_tmp_disk_tables,
aborted_threads,aborted_connects, aborted_threads,aborted_connects,
...@@ -539,6 +539,8 @@ extern struct show_var_st init_vars[]; ...@@ -539,6 +539,8 @@ extern struct show_var_st init_vars[];
extern struct show_var_st status_vars[]; extern struct show_var_st status_vars[];
extern enum db_type default_table_type; extern enum db_type default_table_type;
extern uchar global_state_map[256];
#ifndef __WIN__ #ifndef __WIN__
extern pthread_t signal_thread; extern pthread_t signal_thread;
#endif #endif
...@@ -595,7 +597,7 @@ void change_byte(byte *,uint,char,char); ...@@ -595,7 +597,7 @@ void change_byte(byte *,uint,char,char);
void unireg_abort(int exit_code); void unireg_abort(int exit_code);
void init_read_record(READ_RECORD *info, THD *thd, TABLE *reg_form, void init_read_record(READ_RECORD *info, THD *thd, TABLE *reg_form,
SQL_SELECT *select, SQL_SELECT *select,
bool use_record_cache, bool print_errors); int use_record_cache, bool print_errors);
void end_read_record(READ_RECORD *info); void end_read_record(READ_RECORD *info);
ha_rows filesort(TABLE **form,struct st_sort_field *sortorder, uint s_length, ha_rows filesort(TABLE **form,struct st_sort_field *sortorder, uint s_length,
SQL_SELECT *select, ha_rows special,ha_rows max_rows); SQL_SELECT *select, ha_rows special,ha_rows max_rows);
......
...@@ -243,6 +243,7 @@ volatile ulong cached_thread_count=0; ...@@ -243,6 +243,7 @@ volatile ulong cached_thread_count=0;
my_string master_user = (char*) "test", master_password = 0, master_host=0, my_string master_user = (char*) "test", master_password = 0, master_host=0,
master_info_file = (char*) "master.info"; master_info_file = (char*) "master.info";
const char *localhost=LOCAL_HOST; const char *localhost=LOCAL_HOST;
const char *delayed_user="DELAYED";
uint master_port = MYSQL_PORT, master_connect_retry = 60; uint master_port = MYSQL_PORT, master_connect_retry = 60;
ulong max_tmp_tables,max_heap_table_size; ulong max_tmp_tables,max_heap_table_size;
...@@ -2364,7 +2365,7 @@ pthread_handler_decl(handle_connections_namedpipes,arg) ...@@ -2364,7 +2365,7 @@ pthread_handler_decl(handle_connections_namedpipes,arg)
continue; continue;
} }
/* host name is unknown */ /* host name is unknown */
thd->host = my_strdup("localhost",MYF(0)); /* Host is unknown */ thd->host = my_strdup(localhost,MYF(0)); /* Host is unknown */
create_new_thread(thd); create_new_thread(thd);
} }
...@@ -2715,6 +2716,14 @@ struct show_var_st init_vars[]= { ...@@ -2715,6 +2716,14 @@ struct show_var_st init_vars[]= {
{"have_raid", (char*) &have_raid, SHOW_HAVE}, {"have_raid", (char*) &have_raid, SHOW_HAVE},
{"have_ssl", (char*) &have_ssl, SHOW_HAVE}, {"have_ssl", (char*) &have_ssl, SHOW_HAVE},
{"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR}, {"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR},
#ifdef HAVE_INNOBASE_DB
{"innobase_data_file_path", innobase_data_file_path, SHOW_CHAR},
{"innobase_data_home_dir", innobase_data_home_dir, SHOW_CHAR},
{"innobase_flush_log_at_trx_commit", (char*) &innobase_flush_log_at_trx_commit, SHOW_MY_BOOL},
{"innobase_log_arch_dir", innobase_log_arch_dir, SHOW_CHAR},
{"innobase_log_archive", (char*) &innobase_log_archive, SHOW_MY_BOOL},
{"innobase_log_group_home_dir", innobase_log_group_home_dir, SHOW_CHAR},
#endif
{"interactive_timeout", (char*) &net_interactive_timeout, SHOW_LONG}, {"interactive_timeout", (char*) &net_interactive_timeout, SHOW_LONG},
{"join_buffer_size", (char*) &join_buff_size, SHOW_LONG}, {"join_buffer_size", (char*) &join_buff_size, SHOW_LONG},
{"key_buffer_size", (char*) &keybuff_size, SHOW_LONG}, {"key_buffer_size", (char*) &keybuff_size, SHOW_LONG},
...@@ -2960,12 +2969,19 @@ static void usage(void) ...@@ -2960,12 +2969,19 @@ static void usage(void)
--bdb-tmpdir=directory Berkeley DB tempfile name\n\ --bdb-tmpdir=directory Berkeley DB tempfile name\n\
--skip-bdb Don't use berkeley db (will save memory)\n\ --skip-bdb Don't use berkeley db (will save memory)\n\
"); ");
#endif #endif /* HAVE_BERKELEY_DB */
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
puts("\ puts("\
--skip-innobase Don't use innobase (will save memory)\n\ --innobase_data_home_dir=dir The common part for innobase table spaces\n
--innobase_data_file_path=dir Path to individual files and their sizes\n
--innobase_flush_log_at_trx_commit[=#]
Set to 0 if you don't want to flush logs\n\
--innobase_log_arch_dir=dir Where full logs should be archived\n\
--innobase_log_archive[=#] Set to 1 if you want to have logs archived\n\
--innobase_log_group_home_dir=dir Path to Innobase log files.
--skip-innobase Don't use innobase (will save memory)\n\
"); ");
#endif #endif /* HAVE_INNOBASE_DB */
print_defaults("my",load_default_groups); print_defaults("my",load_default_groups);
puts(""); puts("");
......
...@@ -141,6 +141,11 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds) ...@@ -141,6 +141,11 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
break; break;
} }
TABLE *table=((Item_field*) expr)->field->table; TABLE *table=((Item_field*) expr)->field->table;
if ((table->file->option_flag() & HA_NOT_READ_AFTER_KEY))
{
const_result=0;
break;
}
bool error=table->file->index_init((uint) ref.key); bool error=table->file->index_init((uint) ref.key);
if (!ref.key_length) if (!ref.key_length)
......
...@@ -31,7 +31,7 @@ static int rr_cmp(uchar *a,uchar *b); ...@@ -31,7 +31,7 @@ static int rr_cmp(uchar *a,uchar *b);
void init_read_record(READ_RECORD *info,THD *thd, TABLE *table, void init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
SQL_SELECT *select, SQL_SELECT *select,
bool use_record_cache, bool print_error) int use_record_cache, bool print_error)
{ {
IO_CACHE *tempfile; IO_CACHE *tempfile;
DBUG_ENTER("init_read_record"); DBUG_ENTER("init_read_record");
...@@ -97,9 +97,11 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table, ...@@ -97,9 +97,11 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
info->read_record=rr_sequential; info->read_record=rr_sequential;
table->file->rnd_init(); table->file->rnd_init();
/* We can use record cache if we don't update dynamic length tables */ /* We can use record cache if we don't update dynamic length tables */
if (use_record_cache || if (use_record_cache > 0 ||
(int) table->reginfo.lock_type <= (int) TL_READ_HIGH_PRIORITY || (int) table->reginfo.lock_type <= (int) TL_READ_HIGH_PRIORITY ||
!(table->db_options_in_use & HA_OPTION_PACK_RECORD)) !(table->db_options_in_use & HA_OPTION_PACK_RECORD) ||
(use_record_cache < 0 &&
!(table->file->option_flag() & HA_NOT_DELETE_WITH_CACHE)))
VOID(table->file->extra(HA_EXTRA_CACHE)); // Cache reads VOID(table->file->extra(HA_EXTRA_CACHE)); // Cache reads
} }
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
......
...@@ -36,6 +36,7 @@ bool wild_do_table_inited = 0, wild_ignore_table_inited = 0; ...@@ -36,6 +36,7 @@ bool wild_do_table_inited = 0, wild_ignore_table_inited = 0;
bool table_rules_on = 0; bool table_rules_on = 0;
uint32 slave_skip_counter = 0; uint32 slave_skip_counter = 0;
static TABLE* save_temporary_tables = 0; static TABLE* save_temporary_tables = 0;
THD* slave_thd = 0;
// when slave thread exits, we need to remember the temporary tables so we // when slave thread exits, we need to remember the temporary tables so we
// can re-use them on slave start // can re-use them on slave start
...@@ -1157,7 +1158,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused))) ...@@ -1157,7 +1158,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff // needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
my_thread_init(); my_thread_init();
thd = new THD; // note that contructor of THD uses DBUG_ ! slave_thd = thd = new THD; // note that contructor of THD uses DBUG_ !
thd->set_time(); thd->set_time();
DBUG_ENTER("handle_slave"); DBUG_ENTER("handle_slave");
...@@ -1347,6 +1348,7 @@ position %s", ...@@ -1347,6 +1348,7 @@ position %s",
pthread_cond_broadcast(&COND_slave_stopped); // tell the world we are done pthread_cond_broadcast(&COND_slave_stopped); // tell the world we are done
pthread_mutex_unlock(&LOCK_slave); pthread_mutex_unlock(&LOCK_slave);
net_end(&thd->net); // destructor will not free it, because we are weird net_end(&thd->net); // destructor will not free it, because we are weird
slave_thd = 0;
delete thd; delete thd;
my_thread_end(); my_thread_end();
#ifndef DBUG_OFF #ifndef DBUG_OFF
...@@ -1376,8 +1378,13 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) ...@@ -1376,8 +1378,13 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi)
} }
if(!slave_was_killed) if(!slave_was_killed)
mysql_log.write(thd, COM_CONNECT_OUT, "%s@%s:%d", {
mysql_log.write(thd, COM_CONNECT_OUT, "%s@%s:%d",
mi->user, mi->host, mi->port); mi->user, mi->host, mi->port);
#ifdef STOP_IO_WITH_FD_CLOSE
thd->set_active_fd(vio_fd(mysql->net.vio));
#endif
}
return slave_was_killed; return slave_was_killed;
} }
...@@ -1404,11 +1411,16 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) ...@@ -1404,11 +1411,16 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi)
} }
if(!slave_was_killed) if(!slave_was_killed)
sql_print_error("Slave: reconnected to master '%s@%s:%d',\ {
sql_print_error("Slave: reconnected to master '%s@%s:%d',\
replication resumed in log '%s' at position %s", glob_mi.user, replication resumed in log '%s' at position %s", glob_mi.user,
glob_mi.host, glob_mi.port, glob_mi.host, glob_mi.port,
RPL_LOG_NAME, RPL_LOG_NAME,
llstr(glob_mi.pos,llbuff)); llstr(glob_mi.pos,llbuff));
#ifdef STOP_IO_WITH_FD_CLOSE
thd->set_active_fd(vio_fd(mysql->net.vio));
#endif
}
return slave_was_killed; return slave_was_killed;
} }
......
...@@ -99,6 +99,7 @@ extern uint32 slave_skip_counter; ...@@ -99,6 +99,7 @@ extern uint32 slave_skip_counter;
// have caused errors, and have been manually applied by DBA already // have caused errors, and have been manually applied by DBA already
extern pthread_t slave_real_id; extern pthread_t slave_real_id;
extern THD* slave_thd;
extern MASTER_INFO glob_mi; extern MASTER_INFO glob_mi;
extern HASH replicate_do_table, replicate_ignore_table; extern HASH replicate_do_table, replicate_ignore_table;
extern DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table; extern DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table;
......
...@@ -84,6 +84,10 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), ...@@ -84,6 +84,10 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
query_start_used=0; query_start_used=0;
query_length=col_access=0; query_length=col_access=0;
query_error=0; query_error=0;
#ifdef STOP_IO_WITH_FD_CLOSE
active_fd = -1;
pthread_mutex_init(&active_fd_lock, NULL);
#endif
server_id = ::server_id; server_id = ::server_id;
server_status=SERVER_STATUS_AUTOCOMMIT; server_status=SERVER_STATUS_AUTOCOMMIT;
next_insert_id=last_insert_id=0; next_insert_id=last_insert_id=0;
...@@ -176,11 +180,15 @@ THD::~THD() ...@@ -176,11 +180,15 @@ THD::~THD()
if (host != localhost) // If not pointer to constant if (host != localhost) // If not pointer to constant
safeFree(host); safeFree(host);
safeFree(user); if (user != delayed_user)
safeFree(user);
safeFree(db); safeFree(db);
safeFree(ip); safeFree(ip);
free_root(&mem_root,MYF(0)); free_root(&mem_root,MYF(0));
mysys_var=0; // Safety (shouldn't be needed) mysys_var=0; // Safety (shouldn't be needed)
#ifdef STOP_IO_WITH_FD_CLOSE
pthread_mutex_destroy(&active_fd_lock);
#endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#pragma interface /* gcc class implementation */ #pragma interface /* gcc class implementation */
#endif #endif
#include <thr_alarm.h>
class Query_log_event; class Query_log_event;
class Load_log_event; class Load_log_event;
...@@ -256,6 +258,10 @@ class THD :public ilink { ...@@ -256,6 +258,10 @@ class THD :public ilink {
#ifndef __WIN__ #ifndef __WIN__
sigset_t signals,block_signals; sigset_t signals,block_signals;
#endif #endif
#ifdef STOP_IO_WITH_FD_CLOSE
int active_fd;
pthread_mutex_t active_fd_lock;
#endif
ulonglong next_insert_id,last_insert_id,current_insert_id; ulonglong next_insert_id,last_insert_id,current_insert_id;
ha_rows select_limit,offset_limit,default_select_limit,cuted_fields, ha_rows select_limit,offset_limit,default_select_limit,cuted_fields,
max_join_size,sent_row_count; max_join_size,sent_row_count;
...@@ -280,10 +286,58 @@ class THD :public ilink { ...@@ -280,10 +286,58 @@ class THD :public ilink {
ulong slave_proxy_id; // in slave thread we need to know in behalf of which ulong slave_proxy_id; // in slave thread we need to know in behalf of which
// thread the query is being run to replicate temp tables properly // thread the query is being run to replicate temp tables properly
// thread-specific state map for lex parser
uchar state_map[256];
THD(); THD();
~THD(); ~THD();
bool store_globals(); bool store_globals();
#ifdef STOP_IO_WITH_FD_CLOSE
inline void set_active_fd(int fd)
{
pthread_mutex_lock(&active_fd_lock);
active_fd = fd;
pthread_mutex_unlock(&active_fd_lock);
}
inline void clear_active_fd()
{
pthread_mutex_lock(&active_fd_lock);
active_fd = -1;
pthread_mutex_unlock(&active_fd_lock);
}
inline void close_active_fd()
{
pthread_mutex_lock(&active_fd_lock);
if(active_fd >= 0)
{
my_close(active_fd, MYF(MY_WME));
active_fd = -1;
}
pthread_mutex_unlock(&active_fd_lock);
}
#endif
inline void prepare_to_die()
{
thr_alarm_kill(real_id);
killed = 1;
#ifdef STOP_IO_WITH_FD_CLOSE
close_active_fd();
#endif
if (mysys_var)
{
pthread_mutex_lock(&mysys_var->mutex);
if (!system_thread) // Don't abort locks
mysys_var->abort=1;
if (mysys_var->current_mutex)
{
pthread_mutex_lock(mysys_var->current_mutex);
pthread_cond_broadcast(mysys_var->current_cond);
pthread_mutex_unlock(mysys_var->current_mutex);
}
pthread_mutex_unlock(&mysys_var->mutex);
}
}
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
const char* msg) const char* msg)
{ {
......
...@@ -192,7 +192,7 @@ int mysql_delete(THD *thd,TABLE_LIST *table_list,COND *conds,ha_rows limit, ...@@ -192,7 +192,7 @@ int mysql_delete(THD *thd,TABLE_LIST *table_list,COND *conds,ha_rows limit,
(void) table->file->extra(HA_EXTRA_NO_READCHECK); (void) table->file->extra(HA_EXTRA_NO_READCHECK);
if (options & OPTION_QUICK) if (options & OPTION_QUICK)
(void) table->file->extra(HA_EXTRA_QUICK); (void) table->file->extra(HA_EXTRA_QUICK);
init_read_record(&info,thd,table,select,1,1); init_read_record(&info,thd,table,select,-1,1);
ulong deleted=0L; ulong deleted=0L;
thd->proc_info="updating"; thd->proc_info="updating";
while (!(error=info.read_record(&info)) && !thd->killed) while (!(error=info.read_record(&info)) && !thd->killed)
......
...@@ -489,7 +489,7 @@ class delayed_insert :public ilink { ...@@ -489,7 +489,7 @@ class delayed_insert :public ilink {
table(0),tables_in_use(0),stacked_inserts(0), status(0), dead(0), table(0),tables_in_use(0),stacked_inserts(0), status(0), dead(0),
group_count(0) group_count(0)
{ {
thd.user=thd.priv_user=(char*) ""; thd.user=thd.priv_user=(char*) delayed_user;
thd.host=(char*) localhost; thd.host=(char*) localhost;
thd.current_tablenr=0; thd.current_tablenr=0;
thd.version=refresh_version; thd.version=refresh_version;
......
...@@ -75,7 +75,7 @@ inline int lex_casecmp(const char *s, const char *t, uint len) ...@@ -75,7 +75,7 @@ inline int lex_casecmp(const char *s, const char *t, uint len)
#include "lex_hash.h" #include "lex_hash.h"
static uchar state_map[256]; uchar global_state_map[256];
void lex_init(void) void lex_init(void)
...@@ -89,42 +89,49 @@ void lex_init(void) ...@@ -89,42 +89,49 @@ void lex_init(void)
VOID(pthread_key_create(&THR_LEX,NULL)); VOID(pthread_key_create(&THR_LEX,NULL));
/* Fill state_map with states to get a faster parser */ /* Fill global_state_map with states to get a faster parser */
for (i=0; i < 256 ; i++) for (i=0; i < 256 ; i++)
{ {
if (isalpha(i)) if (isalpha(i))
state_map[i]=(uchar) STATE_IDENT; global_state_map[i]=(uchar) STATE_IDENT;
else if (isdigit(i)) else if (isdigit(i))
state_map[i]=(uchar) STATE_NUMBER_IDENT; global_state_map[i]=(uchar) STATE_NUMBER_IDENT;
#if defined(USE_MB) && defined(USE_MB_IDENT) #if defined(USE_MB) && defined(USE_MB_IDENT)
else if (use_mb(default_charset_info) && my_ismbhead(default_charset_info, i)) else if (use_mb(default_charset_info) && my_ismbhead(default_charset_info, i))
state_map[i]=(uchar) STATE_IDENT; global_state_map[i]=(uchar) STATE_IDENT;
#endif #endif
else if (!isgraph(i)) else if (!isgraph(i))
state_map[i]=(uchar) STATE_SKIP; global_state_map[i]=(uchar) STATE_SKIP;
else else
state_map[i]=(uchar) STATE_CHAR; global_state_map[i]=(uchar) STATE_CHAR;
} }
state_map[(uchar)'_']=state_map[(uchar)'$']=(uchar) STATE_IDENT; global_state_map[(uchar)'_']=
state_map[(uchar)'\'']=state_map[(uchar)'"']=(uchar) STATE_STRING; global_state_map[(uchar)'$']=(uchar) STATE_IDENT;
state_map[(uchar)'-']=state_map[(uchar)'+']=(uchar) STATE_SIGNED_NUMBER; global_state_map[(uchar)'\'']=
state_map[(uchar)'.']=(uchar) STATE_REAL_OR_POINT; global_state_map[(uchar)'"']=(uchar) STATE_STRING;
state_map[(uchar)'>']=state_map[(uchar)'=']=state_map[(uchar)'!']= (uchar) STATE_CMP_OP; global_state_map[(uchar)'-']=
state_map[(uchar)'<']= (uchar) STATE_LONG_CMP_OP; global_state_map[(uchar)'+']=(uchar) STATE_SIGNED_NUMBER;
state_map[(uchar)'&']=state_map[(uchar)'|']=(uchar) STATE_BOOL; global_state_map[(uchar)'.']=(uchar) STATE_REAL_OR_POINT;
state_map[(uchar)'#']=(uchar) STATE_COMMENT; global_state_map[(uchar)'>']=
state_map[(uchar)';']=(uchar) STATE_COLON; global_state_map[(uchar)'=']=
state_map[(uchar)':']=(uchar) STATE_SET_VAR; global_state_map[(uchar)'!']= (uchar) STATE_CMP_OP;
state_map[0]=(uchar) STATE_EOL; global_state_map[(uchar)'<']= (uchar) STATE_LONG_CMP_OP;
state_map[(uchar)'\\']= (uchar) STATE_ESCAPE; global_state_map[(uchar)'&']=global_state_map[(uchar)'|']=(uchar) STATE_BOOL;
state_map[(uchar)'/']= (uchar) STATE_LONG_COMMENT; global_state_map[(uchar)'#']=(uchar) STATE_COMMENT;
state_map[(uchar)'*']= (uchar) STATE_END_LONG_COMMENT; global_state_map[(uchar)';']=(uchar) STATE_COLON;
state_map[(uchar)'@']= (uchar) STATE_USER_END; global_state_map[(uchar)':']=(uchar) STATE_SET_VAR;
state_map[(uchar) '`']= (uchar) STATE_USER_VARIABLE_DELIMITER; global_state_map[0]=(uchar) STATE_EOL;
global_state_map[(uchar)'\\']= (uchar) STATE_ESCAPE;
global_state_map[(uchar)'/']= (uchar) STATE_LONG_COMMENT;
global_state_map[(uchar)'*']= (uchar) STATE_END_LONG_COMMENT;
global_state_map[(uchar)'@']= (uchar) STATE_USER_END;
global_state_map[(uchar) '`']= (uchar) STATE_USER_VARIABLE_DELIMITER;
if (thd_startup_options & OPTION_ANSI_MODE) if (thd_startup_options & OPTION_ANSI_MODE)
{ {
state_map[(uchar) '"'] = STATE_USER_VARIABLE_DELIMITER; global_state_map[(uchar) '"'] = STATE_USER_VARIABLE_DELIMITER;
} }
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -250,7 +257,8 @@ static char *get_text(LEX *lex) ...@@ -250,7 +257,8 @@ static char *get_text(LEX *lex)
str=lex->tok_start+1; str=lex->tok_start+1;
end=lex->ptr-1; end=lex->ptr-1;
start=(uchar*) sql_alloc((uint) (end-str)+1); if (!(start=(uchar*) sql_alloc((uint) (end-str)+1)))
return (char*) ""; // Sql_alloc has set error flag
if (!found_escape) if (!found_escape)
{ {
lex->yytoklen=(uint) (end-str); lex->yytoklen=(uint) (end-str);
...@@ -417,6 +425,7 @@ int yylex(void *arg) ...@@ -417,6 +425,7 @@ int yylex(void *arg)
uint length; uint length;
enum lex_states state,prev_state; enum lex_states state,prev_state;
LEX *lex=current_lex; LEX *lex=current_lex;
uchar *state_map = lex->thd->state_map;
YYSTYPE *yylval=(YYSTYPE*) arg; YYSTYPE *yylval=(YYSTYPE*) arg;
lex->yylval=yylval; // The global state lex->yylval=yylval; // The global state
......
...@@ -512,6 +512,10 @@ pthread_handler_decl(handle_one_connection,arg) ...@@ -512,6 +512,10 @@ pthread_handler_decl(handle_one_connection,arg)
return 0; return 0;
} }
// copy global state map into thread
for(int x=0; x < 256; x++)
thd->state_map[x] = global_state_map[x];
do do
{ {
int error; int error;
...@@ -2778,22 +2782,8 @@ void kill_one_thread(THD *thd, ulong id) ...@@ -2778,22 +2782,8 @@ void kill_one_thread(THD *thd, ulong id)
if ((thd->master_access & PROCESS_ACL) || if ((thd->master_access & PROCESS_ACL) ||
!strcmp(thd->user,tmp->user)) !strcmp(thd->user,tmp->user))
{ {
thr_alarm_kill(tmp->real_id); tmp->prepare_to_die();
tmp->killed=1;
error=0; error=0;
if (tmp->mysys_var)
{
pthread_mutex_lock(&tmp->mysys_var->mutex);
if (!tmp->system_thread) // Don't abort locks
tmp->mysys_var->abort=1;
if (tmp->mysys_var->current_mutex)
{
pthread_mutex_lock(tmp->mysys_var->current_mutex);
pthread_cond_broadcast(tmp->mysys_var->current_cond);
pthread_mutex_unlock(tmp->mysys_var->current_mutex);
}
pthread_mutex_unlock(&tmp->mysys_var->mutex);
}
} }
else else
error=ER_KILL_DENIED_ERROR; error=ER_KILL_DENIED_ERROR;
......
...@@ -572,6 +572,9 @@ int stop_slave(THD* thd, bool net_report ) ...@@ -572,6 +572,9 @@ int stop_slave(THD* thd, bool net_report )
{ {
abort_slave = 1; abort_slave = 1;
thr_alarm_kill(slave_real_id); thr_alarm_kill(slave_real_id);
#ifdef STOP_IO_WITH_FD_CLOSE
slave_thd->close_active_fd();
#endif
// do not abort the slave in the middle of a query, so we do not set // do not abort the slave in the middle of a query, so we do not set
// thd->killed for the slave thread // thd->killed for the slave thread
thd->proc_info = "waiting for slave to die"; thd->proc_info = "waiting for slave to die";
......
...@@ -1027,6 +1027,7 @@ int mysql_backup_table(THD* thd, TABLE_LIST* table_list) ...@@ -1027,6 +1027,7 @@ int mysql_backup_table(THD* thd, TABLE_LIST* table_list)
"backup", TL_READ, 0, 0, 0, "backup", TL_READ, 0, 0, 0,
&handler::backup)); &handler::backup));
} }
int mysql_restore_table(THD* thd, TABLE_LIST* table_list) int mysql_restore_table(THD* thd, TABLE_LIST* table_list)
{ {
DBUG_ENTER("mysql_restore_table"); DBUG_ENTER("mysql_restore_table");
......
...@@ -394,6 +394,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); ...@@ -394,6 +394,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token END %token END
%token THEN_SYM %token THEN_SYM
%token SQL_ANSI_MODE
%token SQL_BIG_TABLES %token SQL_BIG_TABLES
%token SQL_BIG_SELECTS %token SQL_BIG_SELECTS
%token SQL_SELECT_LIMIT %token SQL_SELECT_LIMIT
...@@ -2603,6 +2604,18 @@ option_value: ...@@ -2603,6 +2604,18 @@ option_value:
else else
Lex->options|= OPTION_NOT_AUTO_COMMIT; Lex->options|= OPTION_NOT_AUTO_COMMIT;
} }
| SQL_ANSI_MODE equal NUM
{
if(atoi($3.str) == 0)
{
Lex->options &= ~(OPTION_ANSI_MODE);
Lex->thd->state_map[(uchar) '"'] = STATE_STRING;
} else {
Lex->options |= OPTION_ANSI_MODE;
Lex->thd->state_map[(uchar) '"'] = STATE_USER_VARIABLE_DELIMITER;
}
}
| SQL_SELECT_LIMIT equal ULONG_NUM | SQL_SELECT_LIMIT equal ULONG_NUM
{ {
Lex->select_limit= $3; Lex->select_limit= $3;
...@@ -2697,16 +2710,20 @@ text_or_password: ...@@ -2697,16 +2710,20 @@ text_or_password:
} }
set_option: set_option:
SQL_BIG_TABLES { $$= OPTION_BIG_TABLES; } SQL_BIG_TABLES { $$= OPTION_BIG_TABLES; }
| SQL_BIG_SELECTS { $$= OPTION_BIG_SELECTS; } | SQL_BIG_SELECTS { $$= OPTION_BIG_SELECTS; }
| SQL_LOG_OFF { $$= OPTION_LOG_OFF; } | SQL_LOG_OFF { $$= OPTION_LOG_OFF; }
| SQL_LOG_UPDATE | SQL_LOG_UPDATE
{ {
$$= (opt_sql_bin_update)? OPTION_UPDATE_LOG|OPTION_BIN_LOG: OPTION_UPDATE_LOG ; $$= (opt_sql_bin_update)?
OPTION_UPDATE_LOG|OPTION_BIN_LOG:
OPTION_UPDATE_LOG ;
} }
| SQL_LOG_BIN | SQL_LOG_BIN
{ {
$$= (opt_sql_bin_update)? OPTION_UPDATE_LOG|OPTION_BIN_LOG: OPTION_BIN_LOG ; $$= (opt_sql_bin_update)?
OPTION_UPDATE_LOG|OPTION_BIN_LOG:
OPTION_BIN_LOG ;
} }
| SQL_WARNINGS { $$= OPTION_WARNINGS; } | SQL_WARNINGS { $$= OPTION_WARNINGS; }
| SQL_LOW_PRIORITY_UPDATES { $$= OPTION_LOW_PRIORITY_UPDATES; } | SQL_LOW_PRIORITY_UPDATES { $$= OPTION_LOW_PRIORITY_UPDATES; }
......
#!/usr/bin/perl -w #!/usr/bin/perl -w
# #
# This is a test with uses 3 processes to insert, delete and select # This is a test with uses 4 processes to insert, delete , check and select
# #
$opt_loop_count=100000; # Change this to make test harder/easier $opt_loop_count=200000; # Change this to make test harder/easier
##################### Standard benchmark inits ############################## ##################### Standard benchmark inits ##############################
...@@ -21,8 +21,8 @@ GetOptions("host=s","db=s","loop-count=i","skip-create","skip-in","skip-delete", ...@@ -21,8 +21,8 @@ GetOptions("host=s","db=s","loop-count=i","skip-create","skip-in","skip-delete",
"verbose","fast-insert","lock-tables","debug","fast","force") || die "Aborted"; "verbose","fast-insert","lock-tables","debug","fast","force") || die "Aborted";
$opt_verbose=$opt_debug=$opt_lock_tables=$opt_fast_insert=$opt_fast=$opt_skip_in=$opt_force=undef; # Ignore warnings from these $opt_verbose=$opt_debug=$opt_lock_tables=$opt_fast_insert=$opt_fast=$opt_skip_in=$opt_force=undef; # Ignore warnings from these
print "Testing 3 multiple connections to a server with 1 insert, 1 delete\n"; print "Testing 4 multiple connections to a server with 1 insert, 1 delete\n";
print "and 1 select connections.\n"; print "1 select and one repair/check connection.\n";
$firsttable = "bench_f1"; $firsttable = "bench_f1";
...@@ -51,6 +51,7 @@ $|= 1; # Autoflush ...@@ -51,6 +51,7 @@ $|= 1; # Autoflush
test_insert() if (($pid=fork()) == 0); $work{$pid}="insert"; test_insert() if (($pid=fork()) == 0); $work{$pid}="insert";
test_delete() if (($pid=fork()) == 0); $work{$pid}="delete"; test_delete() if (($pid=fork()) == 0); $work{$pid}="delete";
test_select() if (($pid=fork()) == 0); $work{$pid}="select1"; test_select() if (($pid=fork()) == 0); $work{$pid}="select1";
repair_and_check() if (($pid=fork()) == 0); $work{$pid}="repair/check";
$errors=0; $errors=0;
while (($pid=wait()) != -1) while (($pid=wait()) != -1)
...@@ -148,3 +149,40 @@ sub test_select ...@@ -148,3 +149,40 @@ sub test_select
print "Test_select: ok\n"; print "Test_select: ok\n";
exit(0); exit(0);
} }
sub repair_and_check
{
my ($dbh,$row,$found1,$last_found1,$i,$type, $table);
$found1=0; $last_found1= -1;
$dbh = DBI->connect("DBI:mysql:$opt_db:$opt_host",
$opt_user, $opt_password,
{ PrintError => 0}) || die $DBI::errstr;
for ($i=0; $found1 != $last_found1 ; $i++)
{
$type=($i & 2) ? "repair" : "check";
$table=$firsttable;
$last_found1=$found1;
$sth=$dbh->prepare("$type table $table") || die "Got error on prepare: $dbh->errstr\n";
$sth->execute || die $dbh->errstr;
while (($row=$sth->fetchrow_arrayref))
{
if ($row->[3] ne "OK")
{
print "Got error " . $row->[3] . " when doing $type on $table\n";
exit(1);
}
}
$sth=$dbh->prepare("select count(*) from $table") || die "Got error on prepare: $dbh->errstr\n";
$sth->execute || die $dbh->errstr;
@row = $sth->fetchrow_array();
$found1= $row[0];
$sth->finish;
sleep(3);
}
$dbh->disconnect; $dbh=0;
print "check/repair: Did $i repair/checks\n";
exit(0);
}
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