Commit 1e6fe8f1 authored by monty@tik.mysql.fi's avatar monty@tik.mysql.fi

merge

parents 080f7d4d fc81fdb4
...@@ -22287,11 +22287,11 @@ The buffer that is allocated when sorting the index when doing a ...@@ -22287,11 +22287,11 @@ The buffer that is allocated when sorting the index when doing a
@code{ALTER TABLE}. @code{ALTER TABLE}.
@item @code{myisam_bulk_insert_tree_size} @item @code{myisam_bulk_insert_tree_size}
@strong{MySQL} uses special tree-like cache to make bulk inserts (that is, @code{MyISAM} uses special tree-like cache to make bulk inserts (that is,
@code{INSERT ... SELECT}, @code{INSERT ... SELECT},
@code{INSERT ... VALUES (...), (...), ...}, and @code{INSERT ... VALUES (...), (...), ...}, and
@code{LOAD DATA INFILE}) faster. This variable limits @code{LOAD DATA INFILE}) faster. This variable limits
the size of the cache tree in bytes @strong{per thread, per index}. the size of the cache tree in bytes @strong{per thread, per table}.
Default value is 8 MB. Default value is 8 MB.
@item @code{myisam_max_extra_sort_file_size}. @item @code{myisam_max_extra_sort_file_size}.
...@@ -24011,7 +24011,7 @@ The following options to @code{mysqld} can be used to change the behavior of ...@@ -24011,7 +24011,7 @@ The following options to @code{mysqld} can be used to change the behavior of
@item @code{--delay-key-write-for-all-tables} @tab Don't flush key buffers between writes for any MyISAM table @item @code{--delay-key-write-for-all-tables} @tab Don't flush key buffers between writes for any MyISAM table
@item @code{-O myisam_max_extra_sort_file_size=#} @tab Used to help @strong{MySQL} to decide when to use the slow but safe key cache index create method. @strong{NOTE} that this parameter is given in megabytes! @item @code{-O myisam_max_extra_sort_file_size=#} @tab Used to help @strong{MySQL} to decide when to use the slow but safe key cache index create method. @strong{NOTE} that this parameter is given in megabytes!
@item @code{-O myisam_max_sort_file_size=#} @tab Don't use the fast sort index method to created index if the temporary file would get bigger than this. @strong{NOTE} that this paramter is given in megabytes! @item @code{-O myisam_max_sort_file_size=#} @tab Don't use the fast sort index method to created index if the temporary file would get bigger than this. @strong{NOTE} that this paramter is given in megabytes!
@item @code{-O myisam_bulk_insert_tree_size=#} @tab Size of tree cache used in bulk insert optimization. @strong{NOTE} that this is a limit @strong{per index}! @item @code{-O myisam_bulk_insert_tree_size=#} @tab Size of tree cache used in bulk insert optimization. @strong{NOTE} that this is the total size used for all index in one table.
@end multitable @end multitable
The automatic recovery is activated if you start @code{mysqld} with The automatic recovery is activated if you start @code{mysqld} with
...@@ -34,19 +34,13 @@ int main(int argc, char **argv) ...@@ -34,19 +34,13 @@ int main(int argc, char **argv)
exit(1); exit(1);
} }
if (!(sock = mysql_connect(&mysql,NULL,0,0))) if (!(sock = mysql_real_connect(&mysql,NULL,NULL,NULL,argv[1],0,NULL,0)))
{ {
fprintf(stderr,"Couldn't connect to engine!\n%s\n",mysql_error(&mysql)); fprintf(stderr,"Couldn't connect to engine!\n%s\n",mysql_error(&mysql));
perror(""); perror("");
exit(1); exit(1);
} }
if (mysql_select_db(sock,argv[1]))
{
fprintf(stderr,"Couldn't select database %s!\n%s\n",argv[1],
mysql_error(sock));
}
num = atoi(argv[2]); num = atoi(argv[2]);
count = 0; count = 0;
while (count < num) while (count < num)
......
...@@ -126,24 +126,30 @@ typedef struct st_mysql_data { ...@@ -126,24 +126,30 @@ typedef struct st_mysql_data {
struct st_mysql_options { struct st_mysql_options {
unsigned int connect_timeout,client_flag; unsigned int connect_timeout,client_flag;
my_bool compress,named_pipe;
my_bool rpl_probe; /* on connect, find out the replication
role of the server, and establish connections
to all the peers */
my_bool rpl_parse; /* each call to mysql_real_query() will parse
it to tell if it is a read or a write, and
direct it to the slave or the master */
my_bool no_master_reads; /* if set, never read from
a master,only from slave, when doing
a read that is replication-aware */
unsigned int port; unsigned int port;
char *host,*init_command,*user,*password,*unix_socket,*db; char *host,*init_command,*user,*password,*unix_socket,*db;
char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name; char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
my_bool use_ssl; /* if to use SSL or not */
char *ssl_key; /* PEM key file */ char *ssl_key; /* PEM key file */
char *ssl_cert; /* PEM cert file */ char *ssl_cert; /* PEM cert file */
char *ssl_ca; /* PEM CA file */ char *ssl_ca; /* PEM CA file */
char *ssl_capath; /* PEM directory of CA-s? */ char *ssl_capath; /* PEM directory of CA-s? */
my_bool use_ssl; /* if to use SSL or not */
my_bool compress,named_pipe;
/*
on connect, find out the replication role of the server, and
establish connections to all the peers
*/
my_bool rpl_probe;
/*
each call to mysql_real_query() will parse it to tell if it is a read
or a write, and direct it to the slave or the master
*/
my_bool rpl_parse;
/*
if set, never read from a master,only from slave, when doing
a read that is replication-aware
*/
my_bool no_master_reads;
}; };
enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS,
...@@ -154,12 +160,13 @@ enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, ...@@ -154,12 +160,13 @@ enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS,
enum mysql_status { MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT, enum mysql_status { MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,
MYSQL_STATUS_USE_RESULT}; MYSQL_STATUS_USE_RESULT};
/* there are three types of queries - the ones that have to go to /*
the master, the ones that go to a slave, and the adminstrative There are three types of queries - the ones that have to go to
type which must happen on the pivot connectioin the master, the ones that go to a slave, and the adminstrative
type which must happen on the pivot connectioin
*/ */
enum mysql_rpl_type { MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, enum mysql_rpl_type { MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE,
MYSQL_RPL_ADMIN }; MYSQL_RPL_ADMIN };
typedef struct st_mysql { typedef struct st_mysql {
...@@ -191,15 +198,13 @@ typedef struct st_mysql { ...@@ -191,15 +198,13 @@ typedef struct st_mysql {
struct st_mysql* master, *next_slave; struct st_mysql* master, *next_slave;
struct st_mysql* last_used_slave; /* needed for round-robin slave pick */ struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
struct st_mysql* last_used_con; /* needed for send/read/store/use /* needed for send/read/store/use result to work correctly with replication */
result to work struct st_mysql* last_used_con;
correctly with replication /*
*/ Set if this is the original connection, not a master or a slave we have
my_bool rpl_pivot; /* set if this is the original connection, added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
not a master or a slave we have added though */
mysql_rpl_probe() or mysql_set_master()/ my_bool rpl_pivot;
mysql_add_slave()
*/
} MYSQL; } MYSQL;
...@@ -246,11 +251,8 @@ int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, ...@@ -246,11 +251,8 @@ int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key,
char * STDCALL mysql_ssl_cipher(MYSQL *mysql); char * STDCALL mysql_ssl_cipher(MYSQL *mysql);
int STDCALL mysql_ssl_clear(MYSQL *mysql); int STDCALL mysql_ssl_clear(MYSQL *mysql);
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host,
const char *user, const char *passwd);
my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
const char *passwd, const char *db); const char *passwd, const char *db);
#if MYSQL_VERSION_ID >= 32200
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
const char *user, const char *user,
const char *passwd, const char *passwd,
...@@ -258,14 +260,6 @@ MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, ...@@ -258,14 +260,6 @@ MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
unsigned int port, unsigned int port,
const char *unix_socket, const char *unix_socket,
unsigned int clientflag); unsigned int clientflag);
#else
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
unsigned int port,
const char *unix_socket,
unsigned int clientflag);
#endif
void STDCALL mysql_close(MYSQL *sock); void STDCALL mysql_close(MYSQL *sock);
int STDCALL mysql_select_db(MYSQL *mysql, const char *db); int STDCALL mysql_select_db(MYSQL *mysql, const char *db);
int STDCALL mysql_query(MYSQL *mysql, const char *q); int STDCALL mysql_query(MYSQL *mysql, const char *q);
...@@ -285,8 +279,10 @@ int STDCALL mysql_slave_query(MYSQL *mysql, const char *q, ...@@ -285,8 +279,10 @@ int STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q, int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
unsigned int length); unsigned int length);
/* enable/disable parsing of all queries to decide /*
if they go on master or slave */ enable/disable parsing of all queries to decide if they go on master or
slave
*/
void STDCALL mysql_enable_rpl_parse(MYSQL* mysql); void STDCALL mysql_enable_rpl_parse(MYSQL* mysql);
void STDCALL mysql_disable_rpl_parse(MYSQL* mysql); void STDCALL mysql_disable_rpl_parse(MYSQL* mysql);
/* get the value of the parse flag */ /* get the value of the parse flag */
...@@ -305,17 +301,14 @@ int STDCALL mysql_rpl_probe(MYSQL* mysql); ...@@ -305,17 +301,14 @@ int STDCALL mysql_rpl_probe(MYSQL* mysql);
/* set the master, close/free the old one, if it is not a pivot */ /* set the master, close/free the old one, if it is not a pivot */
int STDCALL mysql_set_master(MYSQL* mysql, const char* host, int STDCALL mysql_set_master(MYSQL* mysql, const char* host,
unsigned int port, unsigned int port,
const char* user, const char* user,
const char* passwd); const char* passwd);
int STDCALL mysql_add_slave(MYSQL* mysql, const char* host, int STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
unsigned int port, unsigned int port,
const char* user, const char* user,
const char* passwd); const char* passwd);
int STDCALL mysql_create_db(MYSQL *mysql, const char *DB);
int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
int STDCALL mysql_shutdown(MYSQL *mysql); int STDCALL mysql_shutdown(MYSQL *mysql);
int STDCALL mysql_dump_debug_info(MYSQL *mysql); int STDCALL mysql_dump_debug_info(MYSQL *mysql);
int STDCALL mysql_refresh(MYSQL *mysql, int STDCALL mysql_refresh(MYSQL *mysql,
...@@ -364,9 +357,15 @@ char * STDCALL mysql_odbc_escape_string(MYSQL *mysql, ...@@ -364,9 +357,15 @@ char * STDCALL mysql_odbc_escape_string(MYSQL *mysql,
void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name); void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name);
unsigned int STDCALL mysql_thread_safe(void); unsigned int STDCALL mysql_thread_safe(void);
#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) #define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
#ifndef USE_OLD_FUNCTIONS
MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host,
const char *user, const char *passwd);
int STDCALL mysql_create_db(MYSQL *mysql, const char *DB);
int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
#endif
/* new api functions */ /* new api functions */
#define HAVE_MYSQL_REAL_CONNECT #define HAVE_MYSQL_REAL_CONNECT
......
...@@ -212,6 +212,5 @@ ...@@ -212,6 +212,5 @@
#define ER_CREATE_DB_WITH_READ_LOCK 1209 #define ER_CREATE_DB_WITH_READ_LOCK 1209
#define ER_CONNECT_TO_MASTER 1210 #define ER_CONNECT_TO_MASTER 1210
#define ER_QUERY_ON_MASTER 1211 #define ER_QUERY_ON_MASTER 1211
#define ER_SHOW_BINLOG_EVENTS 1212 #define ER_ERROR_WHEN_EXECUTING_COMMAND 1212
#define ER_SHOW_NEW_MASTER 1213 #define ER_ERROR_MESSAGES 213
#define ER_ERROR_MESSAGES 214
...@@ -770,8 +770,9 @@ int _mi_init_bulk_insert(MI_INFO *info) ...@@ -770,8 +770,9 @@ int _mi_init_bulk_insert(MI_INFO *info)
if (info->bulk_insert) if (info->bulk_insert)
return 0; return 0;
info->bulk_insert=(TREE *)my_malloc( info->bulk_insert=(TREE *)
(sizeof(TREE)+sizeof(bulk_insert_param))*share->base.keys, MYF(0)); my_malloc((sizeof(TREE)+sizeof(bulk_insert_param))*share->base.keys,
MYF(0));
if (!info->bulk_insert) if (!info->bulk_insert)
return HA_ERR_OUT_OF_MEM; return HA_ERR_OUT_OF_MEM;
...@@ -785,9 +786,10 @@ int _mi_init_bulk_insert(MI_INFO *info) ...@@ -785,9 +786,10 @@ int _mi_init_bulk_insert(MI_INFO *info)
if (!(key->flag & HA_NOSAME) && share->base.auto_key != i+1 if (!(key->flag & HA_NOSAME) && share->base.auto_key != i+1
&& test(share->state.key_map & ((ulonglong) 1 << i))) && test(share->state.key_map & ((ulonglong) 1 << i)))
{ {
init_tree(& info->bulk_insert[i], 0, myisam_bulk_insert_tree_size, 0, init_tree(& info->bulk_insert[i], 0,
(qsort_cmp2)keys_compare, 0, myisam_bulk_insert_tree_size / share->base.keys, 0,
(tree_element_free) keys_free, (void *)params); (qsort_cmp2)keys_compare, 0,
(tree_element_free) keys_free, (void *)params);
} }
else else
info->bulk_insert[i].root=0; info->bulk_insert[i].root=0;
......
...@@ -21,7 +21,7 @@ drop table t1; ...@@ -21,7 +21,7 @@ drop table t1;
# #
--error 1064 --error 1064
select x'hello'; select x'hello';
--error 1064 --error 1054
select 0xfg; select 0xfg;
# #
......
...@@ -97,7 +97,8 @@ void init_tree(TREE *tree, uint default_alloc_size, uint memory_limit, ...@@ -97,7 +97,8 @@ void init_tree(TREE *tree, uint default_alloc_size, uint memory_limit,
DBUG_ENTER("init_tree"); DBUG_ENTER("init_tree");
DBUG_PRINT("enter",("tree: %lx size: %d",tree,size)); DBUG_PRINT("enter",("tree: %lx size: %d",tree,size));
default_alloc_size=DEFAULT_ALLOC_SIZE; if (!default_alloc_size)
default_alloc_size= DEFAULT_ALLOC_SIZE;
bzero((gptr) &tree->null_element,sizeof(tree->null_element)); bzero((gptr) &tree->null_element,sizeof(tree->null_element));
tree->root= &tree->null_element; tree->root= &tree->null_element;
tree->compare=compare; tree->compare=compare;
......
...@@ -86,11 +86,10 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, ...@@ -86,11 +86,10 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
my_b_clear(&tempfile); my_b_clear(&tempfile);
buffpek= (BUFFPEK *) NULL; sort_keys= (uchar **) NULL; error= 1; buffpek= (BUFFPEK *) NULL; sort_keys= (uchar **) NULL; error= 1;
maxbuffer=1; maxbuffer=1;
bzero((char*) &param,sizeof(param));
param.ref_length= table->file->ref_length; param.ref_length= table->file->ref_length;
param.sort_length=sortlength(sortorder,s_length)+ param.ref_length; param.sort_length=sortlength(sortorder,s_length)+ param.ref_length;
param.max_rows= max_rows; param.max_rows= max_rows;
param.examined_rows=0;
param.unique_buff=0;
if (select && select->quick) if (select && select->quick)
{ {
...@@ -686,9 +685,16 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file, ...@@ -686,9 +685,16 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
BUFFPEK *buffpek,**refpek; BUFFPEK *buffpek,**refpek;
QUEUE queue; QUEUE queue;
qsort2_cmp cmp; qsort2_cmp cmp;
volatile bool *killed= &current_thd->killed;
bool not_killable;
DBUG_ENTER("merge_buffers"); DBUG_ENTER("merge_buffers");
statistic_increment(filesort_merge_passes, &LOCK_status); statistic_increment(filesort_merge_passes, &LOCK_status);
if (param->not_killable)
{
killed= &not_killable;
not_killable=0;
}
error=0; error=0;
offset=(sort_length=param->sort_length)-param->ref_length; offset=(sort_length=param->sort_length)-param->ref_length;
...@@ -738,6 +744,10 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file, ...@@ -738,6 +744,10 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
while (queue.elements > 1) while (queue.elements > 1)
{ {
if (*killed)
{
error=1; goto err; /* purecov: inspected */
}
for (;;) for (;;)
{ {
buffpek=(BUFFPEK*) queue_top(&queue); buffpek=(BUFFPEK*) queue_top(&queue);
......
...@@ -245,9 +245,9 @@ public: ...@@ -245,9 +245,9 @@ public:
int get_data_size() int get_data_size()
{ {
return q_len + db_len + 2 + return q_len + db_len + 2 +
sizeof(uint32) // thread_id 4 // thread_id
+ sizeof(uint32) // exec_time + 4 // exec_time
+ sizeof(uint16) // error_code + 2 // error_code
; ;
} }
......
...@@ -222,5 +222,4 @@ ...@@ -222,5 +222,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -216,5 +216,4 @@ ...@@ -216,5 +216,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -213,5 +213,4 @@ ...@@ -213,5 +213,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -213,5 +213,4 @@ ...@@ -213,5 +213,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -217,5 +217,4 @@ ...@@ -217,5 +217,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -213,5 +213,4 @@ ...@@ -213,5 +213,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -216,5 +216,4 @@ ...@@ -216,5 +216,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -213,5 +213,4 @@ ...@@ -213,5 +213,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -215,5 +215,4 @@ ...@@ -215,5 +215,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -213,5 +213,4 @@ ...@@ -213,5 +213,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -215,5 +215,4 @@ ...@@ -215,5 +215,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -213,5 +213,4 @@ ...@@ -213,5 +213,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -215,5 +215,4 @@ ...@@ -215,5 +215,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -215,5 +215,4 @@ ...@@ -215,5 +215,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -217,5 +217,4 @@ ...@@ -217,5 +217,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -213,5 +213,4 @@ ...@@ -213,5 +213,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -217,5 +217,4 @@ ...@@ -217,5 +217,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -216,5 +216,4 @@ ...@@ -216,5 +216,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -221,5 +221,4 @@ ...@@ -221,5 +221,4 @@
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE not allowed while thread is holding global read lock",
"Error connecting to master: %-.128s", "Error connecting to master: %-.128s",
"Error running query on master: %-.128s", "Error running query on master: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Error when executing command %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -214,5 +214,4 @@ ...@@ -214,5 +214,4 @@
"CREATE DATABASE no permitido mientras un thread está ejerciendo un bloqueo de lectura global", "CREATE DATABASE no permitido mientras un thread está ejerciendo un bloqueo de lectura global",
"Error de coneccion a master: %-128s", "Error de coneccion a master: %-128s",
"Error executando el query en master: %-128%", "Error executando el query en master: %-128%",
"Error de SHOW BINLOG EVENTS: %-128%", "Error de %s: %-128%",
"Error de SHOW NEW MASTER: %-128%",
...@@ -209,9 +209,8 @@ ...@@ -209,9 +209,8 @@
"Lock wait timeout exceeded", "Lock wait timeout exceeded",
"The total number of locks exceeds the lock table size", "The total number of locks exceeds the lock table size",
"Update locks cannot be acquired during a READ UNCOMMITTED transaction", "Update locks cannot be acquired during a READ UNCOMMITTED transaction",
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE är inte tillåtet när man har ett globalt läs-lås",
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE är inte tillåtet när man har ett globalt läs-lås",
"Error connecting to master: %-.128s", "Fick fel vid anslutning till master: %-.128s",
"Error running query on master: %-.128s", "Fick fel vid utförande av command på mastern: %-.128s",
"Error in SHOW BINLOG EVENTS: %-.128s", "Fick fel vid utförande av %s: %-.128s",
"Error in SHOW NEW MASTER: %-.128s",
...@@ -421,7 +421,7 @@ public: ...@@ -421,7 +421,7 @@ public:
virtual int prepare(List<Item> &list) { return 0; } virtual int prepare(List<Item> &list) { return 0; }
virtual bool send_fields(List<Item> &list,uint flag)=0; virtual bool send_fields(List<Item> &list,uint flag)=0;
virtual bool send_data(List<Item> &items)=0; virtual bool send_data(List<Item> &items)=0;
virtual void initialize_tables (JOIN *join=0) {}; virtual void initialize_tables (JOIN *join=0) {}
virtual void send_error(uint errcode,const char *err)=0; virtual void send_error(uint errcode,const char *err)=0;
virtual bool send_eof()=0; virtual bool send_eof()=0;
virtual void abort() {} virtual void abort() {}
......
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB & Sinisa /* Copyright (C) 2000 MySQL AB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -316,14 +316,14 @@ multi_delete::multi_delete(THD *thd_arg, TABLE_LIST *dt, ...@@ -316,14 +316,14 @@ multi_delete::multi_delete(THD *thd_arg, TABLE_LIST *dt,
#endif #endif
(void) dt->table->file->extra(HA_EXTRA_NO_READCHECK); (void) dt->table->file->extra(HA_EXTRA_NO_READCHECK);
(void) dt->table->file->extra(HA_EXTRA_NO_KEYREAD);
/* Don't use key read with MULTI-TABLE-DELETE */ /* Don't use key read with MULTI-TABLE-DELETE */
(void) dt->table->file->extra(HA_EXTRA_NO_KEYREAD);
dt->table->used_keys=0; dt->table->used_keys=0;
for (dt=dt->next ; dt ; dt=dt->next,counter++) for (dt=dt->next ; dt ; dt=dt->next,counter++)
{ {
TABLE *table=dt->table; TABLE *table=dt->table;
(void) dt->table->file->extra(HA_EXTRA_NO_READCHECK); (void) dt->table->file->extra(HA_EXTRA_NO_READCHECK);
(void) dt->table->file->extra(HA_EXTRA_NO_KEYREAD); (void) dt->table->file->extra(HA_EXTRA_NO_KEYREAD);
#ifdef SINISAS_STRIP #ifdef SINISAS_STRIP
tempfiles[counter]=(IO_CACHE *) sql_alloc(sizeof(IO_CACHE)); tempfiles[counter]=(IO_CACHE *) sql_alloc(sizeof(IO_CACHE));
if (open_cached_file(tempfiles[counter], mysql_tmpdir,TEMP_PREFIX, if (open_cached_file(tempfiles[counter], mysql_tmpdir,TEMP_PREFIX,
...@@ -366,50 +366,38 @@ multi_delete::prepare(List<Item> &values) ...@@ -366,50 +366,38 @@ multi_delete::prepare(List<Item> &values)
DBUG_RETURN(0); DBUG_RETURN(0);
} }
inline static void
link_in_list(SQL_LIST *list,byte *element,byte **next)
{
list->elements++;
(*list->next)=element;
list->next=next;
*next=0;
}
void void
multi_delete::initialize_tables(JOIN *join) multi_delete::initialize_tables(JOIN *join)
{ {
SQL_LIST *new_list=(SQL_LIST *) sql_alloc(sizeof(SQL_LIST)); TABLE_LIST *walk;
new_list->elements=0; new_list->first=0; table_map tables_to_delete_from=0;
new_list->next= (byte**) &(new_list->first); for (walk= delete_tables ; walk ; walk=walk->next)
tables_to_delete_from|= walk->table->map;
walk= delete_tables;
for (JOIN_TAB *tab=join->join_tab, *end=join->join_tab+join->tables; for (JOIN_TAB *tab=join->join_tab, *end=join->join_tab+join->tables;
tab < end; tab < end;
tab++) tab++)
{ {
TABLE_LIST *walk; if (tab->table->map & tables_to_delete_from)
for (walk=(TABLE_LIST*) delete_tables ; walk ; walk=walk->next)
if (!strcmp(tab->table->path,walk->table->path))
break;
if (walk) // Table need not be the one to be deleted
{ {
register TABLE_LIST *ptr = (TABLE_LIST *) sql_alloc(sizeof(TABLE_LIST)); /* We are going to delete from this table */
memcpy(ptr,walk,sizeof(TABLE_LIST)); ptr->next=0; walk->table=tab->table;
link_in_list(new_list,(byte*) ptr,(byte**) &ptr->next); walk=walk->next;
} }
} }
delete_tables=(TABLE_LIST *)new_list->first;
return;
} }
multi_delete::~multi_delete() multi_delete::~multi_delete()
{ {
/* Add back EXTRA_READCHECK; In 4.0.1 we shouldn't need this anymore */ /* Add back EXTRA_READCHECK; In 4.0.1 we shouldn't need this anymore */
for (table_being_deleted=delete_tables ; for (table_being_deleted=delete_tables ;
table_being_deleted ; table_being_deleted ;
table_being_deleted=table_being_deleted->next) table_being_deleted=table_being_deleted->next)
{ (void) table_being_deleted->table->file->extra(HA_EXTRA_READCHECK);
VOID(table_being_deleted->table->file->extra(HA_EXTRA_READCHECK));
}
for (uint counter = 0; counter < num_of_tables-1; counter++) for (uint counter = 0; counter < num_of_tables-1; counter++)
{ {
if (tempfiles[counter]) if (tempfiles[counter])
......
This diff is collapsed.
...@@ -114,7 +114,7 @@ int mysqld_show_open_tables(THD *thd,const char *db,const char *wild) ...@@ -114,7 +114,7 @@ int mysqld_show_open_tables(THD *thd,const char *db,const char *wild)
if (send_fields(thd,field_list,1)) if (send_fields(thd,field_list,1))
DBUG_RETURN(1); DBUG_RETURN(1);
if (list_open_tables(thd,&tables,db,wild)) if (!(open_list=list_open_tables(thd,wild)) && thd->fatal_error)
DBUG_RETURN(-1); DBUG_RETURN(-1);
List_iterator<char> it(tables); List_iterator<char> it(tables);
......
...@@ -37,6 +37,7 @@ typedef struct st_sort_param { ...@@ -37,6 +37,7 @@ typedef struct st_sort_param {
SORT_FIELD *local_sortorder; SORT_FIELD *local_sortorder;
SORT_FIELD *end; SORT_FIELD *end;
uchar *unique_buff; uchar *unique_buff;
bool not_killable;
#ifdef USE_STRCOLL #ifdef USE_STRCOLL
char* tmp_buffer; char* tmp_buffer;
#endif #endif
......
...@@ -128,10 +128,12 @@ bool Unique::get(TABLE *table) ...@@ -128,10 +128,12 @@ bool Unique::get(TABLE *table)
return 1; return 1;
reinit_io_cache(outfile,WRITE_CACHE,0L,0,0); reinit_io_cache(outfile,WRITE_CACHE,0L,0,0);
bzero((char*) &sort_param,sizeof(sort_param));
sort_param.max_rows= elements; sort_param.max_rows= elements;
sort_param.sort_form=table; sort_param.sort_form=table;
sort_param.sort_length=sort_param.ref_length=tree.size_of_element; sort_param.sort_length=sort_param.ref_length=tree.size_of_element;
sort_param.keys= max_in_memory_size / sort_param.sort_length; sort_param.keys= max_in_memory_size / sort_param.sort_length;
sort_param.not_killable=1;
if (!(sort_buffer=(uchar*) my_malloc((sort_param.keys+1) * if (!(sort_buffer=(uchar*) my_malloc((sort_param.keys+1) *
sort_param.sort_length, sort_param.sort_length,
......
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