summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Docs/manual.texi12
-rw-r--r--client/mysql.cc1
-rw-r--r--client/mysqlimport.c21
-rw-r--r--configure.in2
-rw-r--r--include/global.h1
-rw-r--r--mysql-test/r/create.result37
-rw-r--r--mysql-test/t/create.test8
-rw-r--r--scripts/mysqlhotcopy.sh36
-rw-r--r--sql/ha_isam.cc2
-rw-r--r--sql/ha_myisam.cc2
-rw-r--r--sql/ha_myisammrg.cc2
-rw-r--r--sql/mysqld.cc1
-rw-r--r--sql/sql_acl.cc22
-rw-r--r--sql/table.cc4
14 files changed, 117 insertions, 34 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index 9e8c63f88f5..4955de63ea8 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -12010,6 +12010,12 @@ make sure that @file{gmalloc.o} is included in @file{libgthreads.a} and
In FSU Pthreads, the following system calls are pthreads-aware: @code{read()},
@code{write()}, @code{getmsg()}, @code{connect()}, @code{accept()},
@code{select()}, and @code{wait()}.
+
+@item
+The CSSA-2001-SCO.35.2 (the patch is listed in custom as
+erg711905-dscr_remap security patch (ver 2.0.0) breaks FSU threads and
+makes mysqld instable. You have to remove this one if you want to run
+mysqld on an OpenServer 5.0.6 machine.
@end itemize
If you want to install DBI on SCO, you have to edit the @file{Makefile} in
@@ -46890,6 +46896,12 @@ not yet 100% confident in this code.
@node News-3.23.50, News-3.23.49, News-3.23.x, News-3.23.x
@appendixsubsec Changes in release 3.23.50
@itemize @bullet
+@item
+Fixed problem with @code{SHOW CREATE TABLE} and @code{PRIMARY KEY} when using
+32 indexes.
+@item
+Fixed that one can use @code{SET PASSWORD} for the anonymous user.
+@item
Fixed core-dump bug when reading client groups from option files using
@code{mysql_options()}.
@item
diff --git a/client/mysql.cc b/client/mysql.cc
index ab8740dbe3c..22213b8edf5 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -487,6 +487,7 @@ static void usage(int version)
-i, --ignore-space Ignore space after function names.\n\
-h, --host=... Connect to host.\n\
-H, --html Produce HTML output.\n\
+ --local-infile=[1|0] Enable/disable LOAD DATA LOCAL INFILE\n\
-L, --skip-line-numbers\n\
Don't write line number for errors.\n");
#ifndef __WIN__
diff --git a/client/mysqlimport.c b/client/mysqlimport.c
index d8f763b9653..d1140c74358 100644
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@ -1,15 +1,15 @@
-/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
-
+/* Copyright (C) 2000 MySQL AB
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
@@ -25,7 +25,7 @@
** * *
** *************************
*/
-#define IMPORT_VERSION "2.7"
+#define IMPORT_VERSION "2.8"
#include "client_priv.h"
#include "mysql_version.h"
@@ -336,7 +336,7 @@ static int write_to_table(char *filename, MYSQL *sock)
if (ignore)
end= strmov(end, " IGNORE");
end= strmov(strmov(end, " INTO TABLE "), tablename);
-
+
if (fields_terminated || enclosed || opt_enclosed || escaped)
end= strmov(end, " FIELDS");
end= add_load_option(end, fields_terminated, " TERMINATED BY");
@@ -397,10 +397,13 @@ static MYSQL *db_connect(char *host, char *database, char *user, char *passwd)
mysql_init(&mysql_connection);
if (opt_compress)
mysql_options(&mysql_connection,MYSQL_OPT_COMPRESS,NullS);
+ if (opt_local_file)
+ mysql_options(&mysql_connection,MYSQL_OPT_LOCAL_INFILE,
+ (char*) &opt_local_file);
#ifdef HAVE_OPENSSL
if (opt_use_ssl)
mysql_ssl_set(&mysql_connection, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
- opt_ssl_capath);
+ opt_ssl_capath, opt_ssl_cipher);
#endif
if (!(sock= mysql_real_connect(&mysql_connection,host,user,passwd,
database,opt_mysql_port,opt_mysql_unix_port,
@@ -482,7 +485,7 @@ static char *add_load_option(char *ptr, const char *object,
** This is done by doubleing ' and add a end -\ if needed to avoid
** syntax errors from the SQL parser.
*/
-
+
static char *field_escape(char *to,const char *from,uint length)
{
const char *end;
@@ -505,7 +508,7 @@ static char *field_escape(char *to,const char *from,uint length)
*to++= '\\';
return to;
}
-
+
int main(int argc, char **argv)
diff --git a/configure.in b/configure.in
index 9473c5d7c34..417870c3dcd 100644
--- a/configure.in
+++ b/configure.in
@@ -607,7 +607,7 @@ AC_SUBST(MYSQLD_USER)
AC_MSG_CHECKING(if we should should enable LOAD DATA LOCAL by default)
AC_ARG_ENABLE(local-infile,
[ --enable-local-infile
- If LOAD DATA LOCAL INFILE is enabled by default.],
+ Enable LOAD DATA LOCAL INFILE (default: disabled)],
[ ENABLED_LOCAL_INFILE=$enableval ],
[ ENABLED_LOCAL_INFILE=no ]
)
diff --git a/include/global.h b/include/global.h
index b8b118cd855..a58179e6759 100644
--- a/include/global.h
+++ b/include/global.h
@@ -281,6 +281,7 @@ typedef unsigned short ushort;
#define set_if_bigger(a,b) { if ((a) < (b)) (a)=(b); }
#define set_if_smaller(a,b) { if ((a) > (b)) (a)=(b); }
#define test_all_bits(a,b) (((a) & (b)) == (b))
+#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1))
#define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0])))
#ifndef HAVE_RINT
#define rint(A) floor((A)+0.5)
diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result
index 7940d51868a..88d597bd3d7 100644
--- a/mysql-test/r/create.result
+++ b/mysql-test/r/create.result
@@ -12,3 +12,40 @@ table type possible_keys key key_len ref rows Extra
t2 ref B B 21 const 1 where used
a B
3 world
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL default '0',
+ `b` int(11) default NULL,
+ PRIMARY KEY (`a`),
+ KEY `b` (`b`),
+ KEY `b_2` (`b`),
+ KEY `b_3` (`b`),
+ KEY `b_4` (`b`),
+ KEY `b_5` (`b`),
+ KEY `b_6` (`b`),
+ KEY `b_7` (`b`),
+ KEY `b_8` (`b`),
+ KEY `b_9` (`b`),
+ KEY `b_10` (`b`),
+ KEY `b_11` (`b`),
+ KEY `b_12` (`b`),
+ KEY `b_13` (`b`),
+ KEY `b_14` (`b`),
+ KEY `b_15` (`b`),
+ KEY `b_16` (`b`),
+ KEY `b_17` (`b`),
+ KEY `b_18` (`b`),
+ KEY `b_19` (`b`),
+ KEY `b_20` (`b`),
+ KEY `b_21` (`b`),
+ KEY `b_22` (`b`),
+ KEY `b_23` (`b`),
+ KEY `b_24` (`b`),
+ KEY `b_25` (`b`),
+ KEY `b_26` (`b`),
+ KEY `b_27` (`b`),
+ KEY `b_28` (`b`),
+ KEY `b_29` (`b`),
+ KEY `b_30` (`b`),
+ KEY `b_31` (`b`)
+) TYPE=MyISAM
diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test
index d45d013c9fb..1a829eec6a3 100644
--- a/mysql-test/t/create.test
+++ b/mysql-test/t/create.test
@@ -69,3 +69,11 @@ create table t2 (key (b)) select * from t1;
explain select * from t2 where b="world";
select * from t2 where b="world";
drop table t1,t2;
+
+#
+# Test of primary key with 32 index
+#
+
+create table t1 (a int not null, b int, primary key(a), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b));
+show create table t1;
+drop table t1;
diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh
index b0fee84c332..45f1f1ed24a 100644
--- a/scripts/mysqlhotcopy.sh
+++ b/scripts/mysqlhotcopy.sh
@@ -37,7 +37,7 @@ WARNING: THIS PROGRAM IS STILL IN BETA. Comments/patches welcome.
# Documentation continued at end of file
-my $VERSION = "1.15";
+my $VERSION = "1.16";
my $opt_tmpdir = $ENV{TMPDIR} || "/tmp";
@@ -236,9 +236,7 @@ my $num_files = 0;
foreach my $rdb ( @db_desc ) {
my $db = $rdb->{src};
- eval { $dbh->do( "use $db" ); };
- die "Database '$db' not accessible: $@" if ( $@ );
- my @dbh_tables = $dbh->tables();
+ my @dbh_tables = get_list_of_tables( $db );
## generate regex for tables/files
my $t_regex;
@@ -307,7 +305,7 @@ foreach my $rdb ( @db_desc ) {
$rdb->{files} = [ @db_files ];
$rdb->{index} = [ @index_files ];
- my @hc_tables = map { "$db.$_" } @dbh_tables;
+ my @hc_tables = map { "`$db`.`$_`" } @dbh_tables;
$rdb->{tables} = [ @hc_tables ];
$rdb->{raid_dirs} = [ get_raid_dirs( $rdb->{files} ) ];
@@ -562,14 +560,14 @@ sub copy_files {
# add recursive option for scp
push @cp, "-r" if $^O =~ /m^(solaris|linux|freebsd)$/ && $method =~ /^scp\b/;
- my @non_raid = grep { ! m:/\d{2}/[^/]+$: } @$files;
+ my @non_raid = map { "'$_'" } grep { ! m:/\d{2}/[^/]+$: } @$files;
# add files to copy and the destination directory
- safe_system( @cp, @non_raid, $target );
++ safe_system( @cp, @non_raid, "'$target'" );
foreach my $rd ( @$raid_dirs ) {
- my @raid = grep { m:$rd/: } @$files;
- safe_system( @cp, @raid, "$target/$rd" ) if ( @raid );
+ my @raid = map { "'$_'" } grep { m:$rd/: } @$files;
+ safe_system( @cp, @raid, "'$target'/$rd" ) if ( @raid );
}
}
else
@@ -735,6 +733,25 @@ sub get_raid_dirs {
return sort keys %dirs;
}
+sub get_list_of_tables {
+ my ( $db ) = @_;
+
+ # "use database" cannot cope with database names containing spaces
+ # so create a new connection
+
+ my $dbh = DBI->connect("dbi:mysql:${db}${dsn};mysql_read_default_group=mysqlhotcopy",
+ $opt{user}, $opt{password},
+ {
+ RaiseError => 1,
+ PrintError => 0,
+ AutoCommit => 1,
+ });
+
+ my @dbh_tables = eval { $dbh->tables() };
+ $dbh->disconnect();
+ return @dbh_tables;
+}
+
__END__
=head1 DESCRIPTION
@@ -975,3 +992,4 @@ Jeremy D. Zawodny - Removed depricated DBI calls. Fixed bug which
resulted in nothing being copied when a regexp was specified but no
database name(s).
+Martin Waite - Fix to handle database name that contains space.
diff --git a/sql/ha_isam.cc b/sql/ha_isam.cc
index 746fdd2f585..ac37d09e6b4 100644
--- a/sql/ha_isam.cc
+++ b/sql/ha_isam.cc
@@ -191,7 +191,7 @@ void ha_isam::info(uint flag)
sortkey = info.sortkey;
block_size=nisam_block_size;
table->keys = min(table->keys,info.keys);
- table->keys_in_use= (((key_map) 1) << table->keys)- (key_map) 1;
+ table->keys_in_use= set_bits(key_map,table->keys);
table->db_options_in_use= info.options;
table->db_record_offset=
(table->db_options_in_use &
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index fb98708c317..595c83ff8ef 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -664,7 +664,7 @@ bool ha_myisam::activate_all_index(THD *thd)
MI_CHECK param;
MYISAM_SHARE* share = file->s;
DBUG_ENTER("activate_all_index");
- if (share->state.key_map != ((ulonglong) 1L << share->base.keys)-1)
+ if (share->state.key_map != set_bits(ulonglong, share->base.keys))
{
const char *save_proc_info=thd->proc_info;
thd->proc_info="Creating index";
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index 9499c42fdc9..e5fb0310a36 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -169,7 +169,7 @@ void ha_myisammrg::info(uint flag)
deleted = (ha_rows) info.deleted;
data_file_length=info.data_file_length;
errkey = info.errkey;
- table->keys_in_use=(((key_map) 1) << table->keys)- (key_map) 1;
+ table->keys_in_use= set_bits(key_map, table->keys);
table->db_options_in_use = info.options;
table->is_view=1;
mean_rec_length=info.reclength;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index b3c67fd5126..9aabf97701a 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -3243,6 +3243,7 @@ Starts the MySQL server\n");
--init-file=file Read SQL commands from this file at startup\n\
-L, --language=... Client error messages in given language. May be\n\
given as a full path\n\
+ --local-infile=[1|0] Enable/disable LOAD DATA LOCAL INFILE\n\
-l, --log[=file] Log connections and queries to file\n\
--log-bin[=file] Log queries in new binary format (for replication)\n\
--log-bin-index=file File that holds the names for last binary log files\n\
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 7ad778cf5d0..33924ada8ab 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -765,11 +765,6 @@ bool change_password(THD *thd, const char *host, const char *user,
char *new_password)
{
uint length=0;
- if (!user[0])
- {
- send_error(&thd->net, ER_PASSWORD_ANONYMOUS_USER);
- return 1;
- }
if (!initialized)
{
send_error(&thd->net, ER_PASSWORD_NOT_ALLOWED); /* purecov: inspected */
@@ -781,15 +776,21 @@ bool change_password(THD *thd, const char *host, const char *user,
length=(uint) strlen(new_password);
new_password[length & 16]=0;
- if (!thd || (!thd->slave_thread && ( strcmp(thd->user,user) ||
- my_strcasecmp(host,thd->host ? thd->host : thd->ip))))
+ if (!thd->slave_thread &&
+ (strcmp(thd->user,user) ||
+ my_strcasecmp(host,thd->host ? thd->host : thd->ip)))
{
if (check_access(thd, UPDATE_ACL, "mysql",0,1))
return 1;
}
+ if (!thd->slave_thread && !thd->user[0])
+ {
+ send_error(&thd->net, ER_PASSWORD_ANONYMOUS_USER);
+ return 1;
+ }
VOID(pthread_mutex_lock(&acl_cache->lock));
ACL_USER *acl_user;
- if (!(acl_user= find_acl_user(host,user)) || !acl_user->user)
+ if (!(acl_user= find_acl_user(host,user)))
{
send_error(&thd->net, ER_PASSWORD_NO_MATCH);
VOID(pthread_mutex_unlock(&acl_cache->lock));
@@ -797,7 +798,8 @@ bool change_password(THD *thd, const char *host, const char *user,
}
if (update_user_table(thd,
acl_user->host.hostname ? acl_user->host.hostname : "",
- acl_user->user, new_password))
+ acl_user->user ? acl_user->user : "",
+ new_password))
{
VOID(pthread_mutex_unlock(&acl_cache->lock)); /* purecov: deadcode */
send_error(&thd->net,0); /* purecov: deadcode */
@@ -817,7 +819,7 @@ bool change_password(THD *thd, const char *host, const char *user,
qinfo.q_len =
my_sprintf(buff,
(buff,"SET PASSWORD FOR \"%-.120s\"@\"%-.120s\"=\"%-.120s\"",
- acl_user->user,
+ acl_user->user ? acl_user->user : "",
acl_user->host.hostname ? acl_user->host.hostname : "",
new_password));
mysql_update_log.write(thd,buff,qinfo.q_len);
diff --git a/sql/table.cc b/sql/table.cc
index 247e1dda196..66cbe7cfa16 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -130,8 +130,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
VOID(my_seek(file,(ulong) uint2korr(head+6),MY_SEEK_SET,MYF(0)));
if (read_string(file,(gptr*) &disk_buff,(uint) uint2korr(head+28)))
goto err_not_open; /* purecov: inspected */
- outparam->keys=keys=disk_buff[0];
- outparam->keys_in_use= (((key_map) 1) << keys)- (key_map) 1;
+ outparam->keys=keys= disk_buff[0];
+ outparam->keys_in_use= set_bits(key_map, keys);
outparam->key_parts=key_parts=disk_buff[1];
n_length=keys*sizeof(KEY)+key_parts*sizeof(KEY_PART_INFO);