Commit 90e18cd2 authored by unknown's avatar unknown

Merge work:/home/bk/mysql

into mysql.sashanet.com:/home/sasha/src/bk/mysql


Docs/manual.texi:
  Auto merged
parents a4cd2a53 6052a714
This diff is collapsed.
...@@ -1906,6 +1906,32 @@ dnl echo "bdb = '$bdb'; inc = '$bdb_includes', lib = '$bdb_libs'" ...@@ -1906,6 +1906,32 @@ dnl echo "bdb = '$bdb'; inc = '$bdb_includes', lib = '$bdb_libs'"
fi fi
AC_DEFINE(HAVE_BERKELEY_DB) AC_DEFINE(HAVE_BERKELEY_DB)
else
if test -d bdb; then :
else
mkdir bdb && mkdir bdb/build_unix
fi
if test -r bdb/build_unix/db.h; then :
else
cat <<EOF > bdb/build_unix/db.h
This file is a placeholder to fool make. The way that automake
and GNU make work together causes some files to depend on this
header, even if we're not building with Berkeley DB.
Obviously, if this file *is* used, it'll break and hopefully we can find
out why this file was generated by $(top_srcdir)/configure instead of
the real db.h.
If you run into some problems because of this file, please use mysql_bug
to generate a bug report, and give the exact output of make and any
details you can think of. Send the message to bugs@lists.mysql.com.
Thank you!
EOF
fi
fi fi
if test X"$have_innobase_db" = Xyes if test X"$have_innobase_db" = Xyes
......
...@@ -291,6 +291,11 @@ report_stats () { ...@@ -291,6 +291,11 @@ report_stats () {
xwhole=`$EXPR $whole \* 100` xwhole=`$EXPR $whole \* 100`
deci=`$EXPR $raw - $xwhole` deci=`$EXPR $raw - $xwhole`
$ECHO "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful." $ECHO "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful."
$ECHO ""
$ECHO "The log files in $MYSQL_TEST_DIR/var/log may give you some hint"
$ECHO "of what when wrong."
$ECHO "If you want to report this error, please read first the documentation at"
$ECHO "http://www.mysql.com/doc/M/y/MySQL_test_suite.html"
fi fi
} }
......
...@@ -3,3 +3,8 @@ a tmsp ...@@ -3,3 +3,8 @@ a tmsp
5 19711006010203 5 19711006010203
6 19711006010203 6 19711006010203
8 19711006010203 8 19711006010203
a b
1 b
2 c
3 d
4 e
...@@ -11,7 +11,23 @@ insert delayed into t1 set a = 4; ...@@ -11,7 +11,23 @@ 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;
drop table t1; drop table t1;
#
# Test bug when inserting NULL into an auto_increment field with
# INSERT DELAYED
#
create table t1 (a int not null auto_increment primary key, b char(10));
insert delayed into t1 values (1,"b");
insert delayed into t1 values (null,"c");
insert delayed into t1 values (3,"d"),(null,"e");
--error 1136
insert delayed into t1 values (3,"this will give an","error");
--sleep 2
select * from t1;
drop table t1;
...@@ -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
......
#!@PERL@ #!@PERL@
# mysqldumpslow - parse and summarize the MySQL slow query log # mysqldumpslow - parse and summarize the MySQL slow query log
# Original version by Tim Bunce, sometime in 2000.
# Further changes by Tim Bunce, 8th March 2001.
use strict; use strict;
use Getopt::Long; use Getopt::Long;
...@@ -8,69 +11,128 @@ use Getopt::Long; ...@@ -8,69 +11,128 @@ use Getopt::Long;
# at, al, and ar are the corresponding averages # at, al, and ar are the corresponding averages
my %opt = ( my %opt = (
s => 'at', s => 'at',
h => '*', h => '*',
); );
GetOptions(\%opt, GetOptions(\%opt,
'v+', # verbose 'v+', # verbose
'd+', # debug 'd+', # debug
's=s', # what to sort by (t, at, l, al, r, ar etc) 's=s', # what to sort by (t, at, l, al, r, ar etc)
'a!', # don't abstract all numbers to N and strings to 'S' 'r!', # reverse the sort order (largest last instead of first)
'g=s', # grep: only consider stmts that include this string 't=i', # just show the top n queries
'h=s', # hostname of db server (can be wildcard) 'a!', # don't abstract all numbers to N and strings to 'S'
'n=i', # abstract numbers with at least n digits within names
'g=s', # grep: only consider stmts that include this string
'h=s', # hostname of db server for *-slow.log filename (can be wildcard)
'i=s', # name of server instance (if using mysql.server startup script)
'l!', # don't subtract lock time from total time
) or die "Bad option"; ) or die "Bad option";
my %stmt;
my $datadir = "/var/lib/mysql"; # XXX should fetch dynamically
@ARGV = <$datadir/$opt{h}-slow.log>;
$/ = "\n#"; # read entire statements using paragraph mode
while (<>) {
print "[$_]\n" if $opt{v};
s/^#// unless %stmt;
s/\s*Time: (\d+) Lock_time: (\d+) Rows_sent: (\d+).*\n//;
my ($t, $l, $r) = ($1, $2, $3);
s/^use \w+;\n//; # not consistently added unless (@ARGV) {
s/^SET timestamp=\d+;\n//; my $defaults = `my_print_defaults mysqld`;
my $basedir = ($defaults =~ m/--basedir=(.*)/)[0]
s/^[ ]*\n//mg; # delete blank lines or die "Can't determine basedir from 'my_print_defaults mysqld' output: $defaults";
s/^[ ]*/ /mg; # normalize leading whitespace warn "basedir=$basedir\n" if $opt{v};
s/\s*;\s*(#\s*)?$//; # remove traing semicolon(+newline-hash)
my $datadir = ($defaults =~ m/--datadir=(.*)/)[0];
next if $opt{g} and !m/$opt{g}/i; if (!$datadir or $opt{i}) {
# determine the datadir from the instances section of /etc/my.cnf, if any
unless ($opt{a}) { my $instances = `my_print_defaults instances`;
s/\b\d+\b/N/g; die "Can't determine datadir from 'my_print_defaults mysqld' output: $defaults"
s/\b0x[0-9A-Fa-f]+\b/N/g; unless $instances;
s/'.*?'/'S'/g; my @instances = ($instances =~ m/^--(\w+)-/mg);
s/".*?"/"S"/g; die "No -i 'instance_name' specified to select among known instances: @instances.\n"
} unless $opt{i};
die "Instance '$opt{i}' is unknown (known instances: @instances)\n"
unless grep { $_ eq $opt{i} } @instances;
$datadir = ($instances =~ m/--$opt{i}-datadir=(.*)/)[0]
or die "Can't determine --$opt{i}-datadir from 'my_print_defaults instances' output: $instances";
warn "datadir=$datadir\n" if $opt{v};
}
@ARGV = <$datadir/$opt{h}-slow.log>;
die "Can't find '$datadir/$opt{h}-slow.log'\n" unless @ARGV;
}
$stmt{$_}->{c} += 1; warn "\nReading mysql slow query log from @ARGV\n";
$stmt{$_}->{t} += $t;
$stmt{$_}->{l} += $l;
$stmt{$_}->{r} += $r;
warn "[$_]" if $opt{d}; my @pending;
my %stmt;
$/ = ";\n#"; # read entire statements using paragraph mode
while ( defined($_ = shift @pending) or defined($_ = <>) ) {
warn "[[$_]]\n" if $opt{d}; # show raw paragraph being read
my @chunks = split /^\/.*Version.*started with[\000-\377]*?Time.*Id.*Command.*Argument.*\n/m;
if (@chunks > 1) {
unshift @pending, map { length($_) ? $_ : () } @chunks;
warn "<<".join(">>\n<<",@chunks).">>" if $opt{d};
next;
}
s/^#? Time: \d{6}\s+\d+:\d+:\d+.*\n//;
my ($user,$host) = s/^#? User\@Host:\s+(\S+)\s+\@\s+(\S+).*\n// ? ($1,$2) : ('','');
s/^# Time: (\d+) Lock_time: (\d+) Rows_sent: (\d+).*\n//;
my ($t, $l, $r) = ($1, $2, $3);
$t -= $l unless $opt{l};
# remove fluff that mysqld writes to log when it (re)starts:
s!^/.*Version.*started with:.*\n!!mg;
s!^Tcp port: \d+ Unix socket: \S+\n!!mg;
s!^Time.*Id.*Command.*Argument.*\n!!mg;
s/^use \w+;\n//; # not consistently added
s/^SET timestamp=\d+;\n//;
s/^[ ]*\n//mg; # delete blank lines
s/^[ ]*/ /mg; # normalize leading whitespace
s/\s*;\s*(#\s*)?$//; # remove trailing semicolon(+newline-hash)
next if $opt{g} and !m/$opt{g}/io;
unless ($opt{a}) {
s/\b\d+\b/N/g;
s/\b0x[0-9A-Fa-f]+\b/N/g;
s/'.*?'/'S'/g;
s/".*?"/"S"/g;
# -n=8: turn log_20001231 into log_NNNNNNNN
s/([a-z_]+)(\d{$opt{n},})/$1.('N' x length($2))/ieg if $opt{n};
# abbreviate massive "in (...)" statements and similar
s!(([NS],){100,})!sprintf("$2,{repeated %d times}",length($1)/2)!eg;
}
my $s = $stmt{$_} ||= { users=>{}, hosts=>{} };
$s->{c} += 1;
$s->{t} += $t;
$s->{l} += $l;
$s->{r} += $r;
$s->{users}->{$user}++ if $user;
$s->{hosts}->{$host}++ if $host;
warn "{{$_}}\n\n" if $opt{d}; # show processed statement string
} }
foreach (keys %stmt) { foreach (keys %stmt) {
my $v = $stmt{$_} || die; my $v = $stmt{$_} || die;
my ($c, $t, $l, $r) = @{ $v }{qw(c t l r)}; my ($c, $t, $l, $r) = @{ $v }{qw(c t l r)};
$v->{at} = $t / $c; $v->{at} = $t / $c;
$v->{al} = $l / $c; $v->{al} = $l / $c;
$v->{ar} = $r / $c; $v->{ar} = $r / $c;
} }
my @sorted = sort { $stmt{$a}->{$opt{s}} <=> $stmt{$b}->{$opt{s}} } keys %stmt; my @sorted = sort { $stmt{$b}->{$opt{s}} <=> $stmt{$a}->{$opt{s}} } keys %stmt;
@sorted = @sorted[0 .. $opt{t}-1] if $opt{t};
@sorted = reverse @sorted if $opt{r};
foreach (@sorted) { foreach (@sorted) {
my $v = $stmt{$_} || die; my $v = $stmt{$_} || die;
my ($c, $t,$at, $l,$al, $r,$ar) = @{ $v }{qw(c t at l al r ar)}; my ($c, $t,$at, $l,$al, $r,$ar) = @{ $v }{qw(c t at l al r ar)};
printf "Count: %d Time: %.2f (%d) Lock_time: %.2f (%d) Rows_sent: %.1f (%d) \n%s\n\n", my @users = keys %{$v->{users}};
$c, $at,$t, $al,$l, $ar,$r, $_; my $user = (@users==1) ? $users[0] : sprintf "%dusers",scalar @users;
my @hosts = keys %{$v->{hosts}};
my $host = (@hosts==1) ? $hosts[0] : sprintf "%dhosts",scalar @hosts;
printf "Count: %d Time=%.2fs (%ds) Lock=%.2fs (%ds) Rows=%.1f (%d), $user\@$host\n%s\n\n",
$c, $at,$t, $al,$l, $ar,$r, $_;
} }
...@@ -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
......
...@@ -133,7 +133,8 @@ set_field_to_null(Field *field) ...@@ -133,7 +133,8 @@ set_field_to_null(Field *field)
return 0; return 0;
} }
if (!current_thd->no_errors) if (!current_thd->no_errors)
my_printf_error(ER_BAD_NULL_ERROR,ER(ER_BAD_NULL_ERROR),MYF(0),field->field_name); my_printf_error(ER_BAD_NULL_ERROR,ER(ER_BAD_NULL_ERROR),MYF(0),
field->field_name);
return 1; return 1;
} }
return 0; return 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,
......
...@@ -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);
} }
......
...@@ -176,7 +176,8 @@ THD::~THD() ...@@ -176,7 +176,8 @@ 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));
......
...@@ -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,0,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)
......
...@@ -247,9 +247,12 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, ...@@ -247,9 +247,12 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
} }
if (lock_type == TL_WRITE_DELAYED) if (lock_type == TL_WRITE_DELAYED)
{ {
id=0; // No auto_increment id if (!error)
info.copied=values_list.elements; {
end_delayed_insert(thd); id=0; // No auto_increment id
info.copied=values_list.elements;
end_delayed_insert(thd);
}
} }
else else
{ {
...@@ -486,7 +489,8 @@ class delayed_insert :public ilink { ...@@ -486,7 +489,8 @@ 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.host=(char*) ""; thd.user=thd.priv_user=(char*) delayed_user;
thd.host=(char*) localhost;
thd.current_tablenr=0; thd.current_tablenr=0;
thd.version=refresh_version; thd.version=refresh_version;
thd.command=COM_DELAYED_INSERT; thd.command=COM_DELAYED_INSERT;
...@@ -676,7 +680,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list) ...@@ -676,7 +680,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list)
TABLE *delayed_insert::get_local_table(THD* client_thd) TABLE *delayed_insert::get_local_table(THD* client_thd)
{ {
my_ptrdiff_t adjust_ptrs; my_ptrdiff_t adjust_ptrs;
Field **field,**org_field; Field **field,**org_field, *found_next_number_field;
TABLE *copy; TABLE *copy;
/* First request insert thread to get a lock */ /* First request insert thread to get a lock */
...@@ -719,11 +723,14 @@ TABLE *delayed_insert::get_local_table(THD* client_thd) ...@@ -719,11 +723,14 @@ TABLE *delayed_insert::get_local_table(THD* client_thd)
adjust_ptrs=PTR_BYTE_DIFF(copy->record[0],table->record[0]); adjust_ptrs=PTR_BYTE_DIFF(copy->record[0],table->record[0]);
found_next_number_field=table->found_next_number_field;
for (org_field=table->field ; *org_field ; org_field++,field++) for (org_field=table->field ; *org_field ; org_field++,field++)
{ {
if (!(*field= (*org_field)->new_field(copy))) if (!(*field= (*org_field)->new_field(copy)))
return 0; return 0;
(*field)->move_field(adjust_ptrs); // Point at copy->record[0] (*field)->move_field(adjust_ptrs); // Point at copy->record[0]
if (*org_field == found_next_number_field)
(*field)->table->found_next_number_field= *field;
} }
*field=0; *field=0;
...@@ -806,14 +813,17 @@ static int write_delayed(THD *thd,TABLE *table,enum_duplicates duplic, ...@@ -806,14 +813,17 @@ static int write_delayed(THD *thd,TABLE *table,enum_duplicates duplic,
static void end_delayed_insert(THD *thd) static void end_delayed_insert(THD *thd)
{ {
DBUG_ENTER("end_delayed_insert");
delayed_insert *di=thd->di; delayed_insert *di=thd->di;
pthread_mutex_lock(&di->mutex); pthread_mutex_lock(&di->mutex);
DBUG_PRINT("info",("tables in use: %d",di->tables_in_use));
if (!--di->tables_in_use || di->thd.killed) if (!--di->tables_in_use || di->thd.killed)
{ // Unlock table { // Unlock table
di->status=1; di->status=1;
pthread_cond_signal(&di->cond); pthread_cond_signal(&di->cond);
} }
pthread_mutex_unlock(&di->mutex); pthread_mutex_unlock(&di->mutex);
DBUG_VOID_RETURN;
} }
...@@ -951,6 +961,7 @@ static pthread_handler_decl(handle_delayed_insert,arg) ...@@ -951,6 +961,7 @@ static pthread_handler_decl(handle_delayed_insert,arg)
pthread_mutex_unlock(&di->thd.mysys_var->mutex); pthread_mutex_unlock(&di->thd.mysys_var->mutex);
di->thd.proc_info=0; di->thd.proc_info=0;
DBUG_PRINT("info",("Waiting for someone to insert rows"));
for ( ; ;) for ( ; ;)
{ {
int error; int error;
......
#!/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