summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2002-09-19 18:46:35 +0300
committerunknown <monty@mashka.mysql.fi>2002-09-19 18:46:35 +0300
commit79538703466b4800a85a3340b40afe145b8fe1d1 (patch)
tree9f00115eb7182d7833a4091c56ad43281a11537e
parent8ff9e7089f7e73ad53ed745ca4cf58aa19d911a0 (diff)
parenta1e75ac0ce89e77a9efa84d47bbbfc8670bf9580 (diff)
downloadmariadb-git-79538703466b4800a85a3340b40afe145b8fe1d1.tar.gz
Merge work:/my/mysql-4.0 into mashka.mysql.fi:/home/my/mysql-4.0
-rw-r--r--Docs/manual.texi27
-rw-r--r--client/mysqlbinlog.cc3
-rw-r--r--client/mysqldump.c2
-rw-r--r--include/Makefile.am4
-rw-r--r--include/my_base.h1
-rw-r--r--include/my_sys.h6
-rw-r--r--include/sslopt-usage.h25
-rw-r--r--myisam/mi_extra.c12
-rw-r--r--mysql-test/r/insert.result8
-rw-r--r--mysql-test/t/insert.test9
-rw-r--r--mysys/safemalloc.c14
-rw-r--r--sql/ha_isam.cc4
-rw-r--r--sql/ha_myisam.cc24
-rw-r--r--sql/lock.cc42
-rw-r--r--sql/log_event.cc8
-rw-r--r--sql/mysqld.cc2
-rw-r--r--sql/sql_insert.cc2
-rw-r--r--sql/sql_load.cc3
-rw-r--r--sql/sql_table.cc4
-rw-r--r--sql/table.h2
-rw-r--r--vio/viosslfactories.c2
21 files changed, 143 insertions, 61 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index ab42c609a96..7c108bc2d74 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -31258,8 +31258,8 @@ stored into a temporary table) is calculated in MySQL Version
@item expr2 or expr3 returns an integer @tab integer
@end multitable
-If expr2 and expr3 are strings, then the result is case-sensitive if
-both strings are case-sensitive. (Starting from 3.23.51)
+If expr2 and expr3 are strings, then the result is case-insensitive if
+both strings are case-insensitive. (Starting from 3.23.51)
@findex CASE
@item CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
@@ -33246,9 +33246,15 @@ anything; just use the string value as it would be a number:
@example
mysql> SELECT 1+'1';
- -> 2
+ -> 2
@end example
+If you use a number in string context the number will automaticly be
+converted to a @code{BINARY} string.
+
+mysql> SELECT concat("hello you ",2);
+ -> "hello you 2"
+
MySQL supports arithmetic with both signed and unsigned 64-bit values.
If you are using an numerical operations (like @code{+}) and one of the
operands are @code{unsigned integer}, then the result will be unsigned.
@@ -50442,7 +50448,15 @@ each individual 4.0.x release.
@itemize @bullet
@item
-Fixed overrun bug when calling @code{AES_DECRYPT()} with wrong arguments
+Increased max possible @code{max_allowed_packet} in @code{mysqld} to 1G.
+@item
+Fixed bug when doing a multi-line @code{INSERT} on a table with an
+auto_increment key which was not in the first part of the key.
+@item
+Changed @code{LOAD DATA INFILE} to not recreate index if the table had
+rows from before.
+@item
+Fixed overrun bug when calling @code{AES_DECRYPT()} with wrong arguments.
@item
@code{--skip-ssl} can now be used to disable SSL in the MySQL clients,
even if one is using other ssl options in a options file or previously
@@ -50502,8 +50516,9 @@ Fixed a bug in my_getopt; --set-variable syntax didn't work for
those options that didn't have a valid variable in my_option struct.
This affected at least @code{default-table-type} option.
@item
-Fixed a bug that caused @code{REPAIR TABLE} to fail on tables
-with duplicates in a unique key.
+Fixed a bug from 4.0.2 that caused @code{REPAIR TABLE} and
+@code{myisamchk --repair} to fail on tables with duplicates in a unique
+key.
@item
Fixed a bug from 4.0.3 in calculating the default field type for some
functions. This affected queries of type @code{CREATE TABLE table_name
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index 0b7add434c9..b2100ac1596 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -407,7 +407,8 @@ static void dump_local_log_entries(const char* logname)
File fd = -1;
IO_CACHE cache,*file= &cache;
ulonglong rec_count = 0;
- char last_db[FN_REFLEN+1], tmp_buff[BIN_LOG_HEADER_SIZE];
+ char last_db[FN_REFLEN+1];
+ byte tmp_buff[BIN_LOG_HEADER_SIZE];
bool old_format = 0;
last_db[0]=0;
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 612746c205b..e957e33ae04 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -232,7 +232,7 @@ static struct my_option my_long_options[] =
NO_ARG, 0, 0, 0, 0, 0, 0},
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, "",
(gptr*) &max_allowed_packet, (gptr*) &max_allowed_packet, 0,
- GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096, 512*1024L*1024L,
+ GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096, 1024*1024L*1024L,
MALLOC_OVERHEAD, 1024, 0},
{"net_buffer_length", OPT_NET_BUFFER_LENGTH, "",
(gptr*) &net_buffer_length, (gptr*) &net_buffer_length, 0,
diff --git a/include/Makefile.am b/include/Makefile.am
index c03d113ddf9..077ec3c9017 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -20,8 +20,8 @@ pkginclude_HEADERS = dbug.h m_string.h my_sys.h my_list.h \
mysql.h mysql_com.h mysqld_error.h mysql_embed.h \
my_semaphore.h my_pthread.h my_no_pthread.h raid.h \
errmsg.h my_global.h my_net.h my_alloc.h \
- my_getopt.h sslopt-longopts.h sslopt-usage.h \
- sslopt-vars.h $(BUILT_SOURCES)
+ my_getopt.h sslopt-longopts.h \
+ sslopt-vars.h sslopt-case.h $(BUILT_SOURCES)
noinst_HEADERS = config-win.h config-os2.h \
nisam.h heap.h merge.h my_bitmap.h\
myisam.h myisampack.h myisammrg.h ft_global.h\
diff --git a/include/my_base.h b/include/my_base.h
index ae8fc2204d5..7d7e296ead3 100644
--- a/include/my_base.h
+++ b/include/my_base.h
@@ -107,6 +107,7 @@ enum ha_extra_function {
HA_EXTRA_NO_IGNORE_DUP_KEY,
HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE, /* Cursor will not be used for update */
HA_EXTRA_BULK_INSERT_BEGIN,
+ HA_EXTRA_BULK_INSERT_FLUSH, /* Flush one index */
HA_EXTRA_BULK_INSERT_END,
HA_EXTRA_PREPARE_FOR_DELETE
};
diff --git a/include/my_sys.h b/include/my_sys.h
index 444f7ab34ee..e873f2012b7 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -553,9 +553,9 @@ extern gptr _my_memdup(const byte *from,uint length,
const char *sFile, uint uLine,myf MyFlag);
extern my_string _my_strdup(const char *from, const char *sFile, uint uLine,
myf MyFlag);
-extern my_string _my_strdup_with_length(const char *from, uint length,
- const char *sFile, uint uLine,
- myf MyFlag);
+extern char *_my_strdup_with_length(const byte *from, uint length,
+ const char *sFile, uint uLine,
+ myf MyFlag);
#ifndef TERMINATE
extern void TERMINATE(FILE *file);
diff --git a/include/sslopt-usage.h b/include/sslopt-usage.h
deleted file mode 100644
index e3536edf804..00000000000
--- a/include/sslopt-usage.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* 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 */
-
-#ifdef HAVE_OPENSSL
- puts("\
- --ssl Use SSL for connection (automatically set with other flags\n\
- --ssl-key X509 key in PEM format (implies --ssl)\n\
- --ssl-cert X509 cert in PEM format (implies --ssl)\n\
- --ssl-ca CA file in PEM format (check OpenSSL docs, implies --ssl)\n\
- --ssl-capath CA directory (check OpenSSL docs, implies --ssl)\n\
- --ssl-cipher SSL cipher to use (implies --ssl)");
-#endif
diff --git a/myisam/mi_extra.c b/myisam/mi_extra.c
index 519cc5bc2b8..39eb4b0bd99 100644
--- a/myisam/mi_extra.c
+++ b/myisam/mi_extra.c
@@ -34,7 +34,9 @@
HA_EXTRA_WRITE_CACHE
HA_EXTRA_CACHE
HA_EXTRA_BULK_INSERT_BEGIN
- If extra_arg is 0, then the default cache size is used.
+ If extra_arg is 0, then the default cache size is used.
+ HA_EXTRA_BULK_INSERT_FLUSH
+ extra_arg is a a pointer to which index to flush (uint*)
RETURN VALUES
0 ok
*/
@@ -356,6 +358,14 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
error=_mi_init_bulk_insert(info, (extra_arg ? *(ulong*) extra_arg :
myisam_bulk_insert_tree_size));
break;
+ case HA_EXTRA_BULK_INSERT_FLUSH:
+ if (info->bulk_insert)
+ {
+ uint index_to_flush= *(uint*) extra_arg;
+ if (is_tree_inited(&info->bulk_insert[index_to_flush]))
+ reset_tree(&info->bulk_insert[index_to_flush]);
+ }
+ break;
case HA_EXTRA_BULK_INSERT_END:
if (info->bulk_insert)
{
diff --git a/mysql-test/r/insert.result b/mysql-test/r/insert.result
index b27cbb46210..2ffa9d88618 100644
--- a/mysql-test/r/insert.result
+++ b/mysql-test/r/insert.result
@@ -41,6 +41,14 @@ a t>0 c i
5 0 a NULL
6 1 hello NULL
drop table t1;
+create table t1 (sid char(20), id int(2) NOT NULL auto_increment, key(sid, id));
+insert into t1 values ('skr',NULL),('skr',NULL),('test',NULL);
+select * from t1;
+sid id
+skr 1
+skr 2
+test 1
+drop table t1;
drop database if exists foo;
create database foo;
use foo;
diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test
index 2c912d94c70..0bca8dc5890 100644
--- a/mysql-test/t/insert.test
+++ b/mysql-test/t/insert.test
@@ -40,6 +40,15 @@ select a,t>0,c,i from t1;
drop table t1;
#
+# Test problem with bulk insert and auto_increment on second part keys
+#
+
+create table t1 (sid char(20), id int(2) NOT NULL auto_increment, key(sid, id));
+insert into t1 values ('skr',NULL),('skr',NULL),('test',NULL);
+select * from t1;
+drop table t1;
+
+#
# Test of mysqld crash with fully qualified column names
#
diff --git a/mysys/safemalloc.c b/mysys/safemalloc.c
index f7e77878e41..2b990448b08 100644
--- a/mysys/safemalloc.c
+++ b/mysys/safemalloc.c
@@ -529,20 +529,20 @@ gptr _my_memdup(const byte *from, uint length, const char *sFile, uint uLine,
} /*_my_memdup */
-my_string _my_strdup(const char *from, const char *sFile, uint uLine,
- myf MyFlags)
+char *_my_strdup(const char *from, const char *sFile, uint uLine,
+ myf MyFlags)
{
gptr ptr;
uint length=(uint) strlen(from)+1;
if ((ptr=_mymalloc(length,sFile,uLine,MyFlags)) != 0)
memcpy((byte*) ptr, (byte*) from,(size_t) length);
- return((my_string) ptr);
+ return((char*) ptr);
} /* _my_strdup */
-my_string _my_strdup_with_length(const char *from, uint length,
- const char *sFile, uint uLine,
- myf MyFlags)
+char *_my_strdup_with_length(const byte *from, uint length,
+ const char *sFile, uint uLine,
+ myf MyFlags)
{
gptr ptr;
if ((ptr=_mymalloc(length+1,sFile,uLine,MyFlags)) != 0)
@@ -550,5 +550,5 @@ my_string _my_strdup_with_length(const char *from, uint length,
memcpy((byte*) ptr, (byte*) from,(size_t) length);
ptr[length]=0;
}
- return((my_string) ptr);
+ return((char *) ptr);
}
diff --git a/sql/ha_isam.cc b/sql/ha_isam.cc
index 55d24f5edb9..052e6a4b9ec 100644
--- a/sql/ha_isam.cc
+++ b/sql/ha_isam.cc
@@ -244,7 +244,9 @@ int ha_isam::reset(void)
int ha_isam::external_lock(THD *thd, int lock_type)
{
- return nisam_lock_database(file,lock_type);
+ if (!table->tmp_table)
+ return nisam_lock_database(file,lock_type);
+ return 0;
}
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index bae455cbb3c..f96ef7210ac 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -657,7 +657,15 @@ int ha_myisam::repair(THD *thd, MI_CHECK &param, bool optimize)
}
-/* Deactive all not unique index that can be recreated fast */
+/*
+ Deactive all not unique index that can be recreated fast
+
+ SYNOPSIS
+ deactivate_non_unique_index()
+ rows Rows to be inserted
+ 0 if we don't know
+ HA_POS_ERROR if we want to disable all keys
+*/
void ha_myisam::deactivate_non_unique_index(ha_rows rows)
{
@@ -670,9 +678,12 @@ void ha_myisam::deactivate_non_unique_index(ha_rows rows)
mi_extra(file, HA_EXTRA_NO_KEYS, 0);
else
{
- mi_disable_non_unique_index(file,rows);
+ /* Only disable old index if the table was empty */
+ if (file->state->records == 0)
+ mi_disable_non_unique_index(file,rows);
ha_myisam::extra_opt(HA_EXTRA_BULK_INSERT_BEGIN,
current_thd->variables.bulk_insert_buff_size);
+ table->bulk_insert= 1;
}
}
enable_activate_all_index=1;
@@ -690,6 +701,7 @@ bool ha_myisam::activate_all_index(THD *thd)
DBUG_ENTER("activate_all_index");
mi_extra(file, HA_EXTRA_BULK_INSERT_END, 0);
+ table->bulk_insert= 0;
if (enable_activate_all_index &&
share->state.key_map != set_bits(ulonglong, share->base.keys))
{
@@ -958,7 +970,9 @@ int ha_myisam::delete_table(const char *name)
int ha_myisam::external_lock(THD *thd, int lock_type)
{
- return mi_lock_database(file,lock_type);
+ if (!table->tmp_table)
+ return mi_lock_database(file,lock_type);
+ return 0;
}
@@ -1194,6 +1208,10 @@ longlong ha_myisam::get_auto_increment()
return auto_increment_value;
}
+ if (table->bulk_insert)
+ mi_extra(file, HA_EXTRA_BULK_INSERT_FLUSH,
+ (void*) &table->next_number_index);
+
longlong nr;
int error;
byte key[MI_MAX_KEY_LENGTH];
diff --git a/sql/lock.cc b/sql/lock.cc
index 056ed0fec8f..ea627207e42 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -21,6 +21,46 @@
before getting internal locks. If we do it in the other order, the status
information is not up to date when called from the lock handler.
+ GENERAL DESCRIPTION OF LOCKING
+
+ When not using LOCK TABLES:
+
+ - For each SQL statement mysql_lock_tables() is called for all involved
+ tables.
+ - mysql_lock_tables() will call
+ table_handler->external_lock(thd,locktype) for each table.
+ This is followed by a call to thr_multi_lock() for all tables.
+
+ - When statement is done, we call mysql_unlock_tables().
+ This will call thr_multi_unlock() followed by
+ table_handler->external_lock(thd, F_UNLCK) for each table.
+
+ - Note that mysql_unlock_tables() may be called several times as
+ MySQL in some cases can free some tables earlier than others.
+
+ - The above is true both for normal and temporary tables.
+
+ - Temporary non transactional tables are never passed to thr_multi_lock()
+ and we never call external_lock(thd, F_UNLOCK) on these.
+
+ When using LOCK TABLES:
+
+ - LOCK TABLE will call mysql_lock_tables() for all tables.
+ mysql_lock_tables() will call
+ table_handler->external_lock(thd,locktype) for each table.
+ This is followed by a call to thr_multi_lock() for all tables.
+
+ - For each statement, we will call table_handler->start_stmt(THD)
+ to inform the table handler that we are using the table.
+
+ The tables used can only be tables used in LOCK TABLES or a
+ temporary table.
+
+ - When statement is done, we will call ha_commit_stmt(thd);
+
+ - When calling UNLOCK TABLES we call mysql_unlock_tables() for all
+ tables used in LOCK TABLES
+
TODO:
Change to use my_malloc() ONLY when using LOCK TABLES command or when
we are forced to use mysql_lock_merge.
@@ -206,7 +246,7 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock)
sql_lock->lock_count= found;
}
- /* Then to the same for the external locks */
+ /* Then do the same for the external locks */
/* Move all write locked tables first */
TABLE **table=sql_lock->table;
for (i=found=0 ; i < sql_lock->table_count ; i++)
diff --git a/sql/log_event.cc b/sql/log_event.cc
index ec5b7c4b5a5..2d634618e2d 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -744,10 +744,10 @@ Rotate_log_event::Rotate_log_event(const char* buf, int event_len,
ident_offset = ROTATE_HEADER_LEN;
}
set_if_smaller(ident_len,FN_REFLEN-1);
- if (!(new_log_ident= (char*) my_strdup_with_length((byte*) buf +
- ident_offset,
- (uint) ident_len,
- MYF(MY_WME))))
+ if (!(new_log_ident= my_strdup_with_length((byte*) buf +
+ ident_offset,
+ (uint) ident_len,
+ MYF(MY_WME))))
return;
alloced = 1;
}
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 94d9efa9108..fa189ac24df 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -3477,7 +3477,7 @@ struct my_option my_long_options[] =
"Max packetlength to send/receive from to server.",
(gptr*) &global_system_variables.max_allowed_packet,
(gptr*) &max_system_variables.max_allowed_packet, 0, GET_ULONG,
- REQUIRED_ARG, 1024*1024L, 80, 64*1024*1024L, MALLOC_OVERHEAD, 1024, 0},
+ REQUIRED_ARG, 1024*1024L, 80, 1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
{"max_binlog_cache_size", OPT_MAX_BINLOG_CACHE_SIZE,
"Can be used to restrict the total size used to cache a multi-transaction query.",
(gptr*) &max_binlog_cache_size, (gptr*) &max_binlog_cache_size, 0,
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 9b6e6a549c9..de2e15cd29d 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -202,6 +202,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
thd->variables.read_buff_size);
table->file->extra_opt(HA_EXTRA_BULK_INSERT_BEGIN,
thd->variables.bulk_insert_buff_size);
+ table->bulk_insert= 1;
}
while ((values= its++))
@@ -290,6 +291,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
error=1;
}
}
+ table->bulk_insert= 0;
}
if (id && values_list.elements != 1)
thd->insert_id(id); // For update log
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index 50e0ea9d5c8..8881c79eba4 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -248,8 +248,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
table->next_number_field=table->found_next_number_field;
VOID(table->file->extra_opt(HA_EXTRA_WRITE_CACHE,
thd->variables.read_buff_size));
- VOID(table->file->extra_opt(HA_EXTRA_BULK_INSERT_BEGIN,
- thd->variables.bulk_insert_buff_size));
+ table->bulk_insert= 1;
if (handle_duplicates == DUP_IGNORE ||
handle_duplicates == DUP_REPLACE)
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index cf03288860f..94d4ae5cc5b 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -18,10 +18,10 @@
/* drop and alter of tables */
#include "mysql_priv.h"
-#include <hash.h>
#ifdef HAVE_BERKELEY_DB
-#include <ha_berkeley.h>
+#include "ha_berkeley.h"
#endif
+#include <hash.h>
#include <myisam.h>
#include <assert.h>
diff --git a/sql/table.h b/sql/table.h
index 229d41a2df7..2c9a1b2c16a 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -91,7 +91,7 @@ struct st_table {
my_bool null_row; /* All columns are null */
my_bool maybe_null,outer_join; /* Used with OUTER JOIN */
my_bool distinct,const_table,no_rows;
- my_bool key_read;
+ my_bool key_read, bulk_insert;
my_bool crypted;
my_bool db_low_byte_first; /* Portable row format */
my_bool locked_by_flush;
diff --git a/vio/viosslfactories.c b/vio/viosslfactories.c
index 23a35f540f6..9e7a1475951 100644
--- a/vio/viosslfactories.c
+++ b/vio/viosslfactories.c
@@ -71,9 +71,11 @@ report_errors()
while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0)
{
+#ifndef DBUG_OFF /* Avoid warning */
char buf[200];
DBUG_PRINT("error", ("OpenSSL: %s:%s:%d:%s\n", ERR_error_string(l,buf),
file,line,(flags & ERR_TXT_STRING) ? data : "")) ;
+#endif
}
DBUG_VOID_RETURN;
}