Merge mysql.com:/home/hf/work/w3475/my41-w3475
into mysql.com:/home/hf/work/w3475/my50-w3475
This commit is contained in:
commit
cd5684543c
@ -23,6 +23,7 @@
|
|||||||
* Matt Wagner <matt@mysql.com>
|
* Matt Wagner <matt@mysql.com>
|
||||||
* Monty
|
* Monty
|
||||||
* Jani
|
* Jani
|
||||||
|
* Holyfoot
|
||||||
**/
|
**/
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
@ -243,6 +244,12 @@ struct connection
|
|||||||
MYSQL* util_mysql;
|
MYSQL* util_mysql;
|
||||||
char *name;
|
char *name;
|
||||||
MYSQL_STMT* stmt;
|
MYSQL_STMT* stmt;
|
||||||
|
|
||||||
|
const char *cur_query;
|
||||||
|
int cur_query_len;
|
||||||
|
pthread_mutex_t mutex;
|
||||||
|
pthread_cond_t cond;
|
||||||
|
int query_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -480,6 +487,58 @@ static void handle_error(const char *query, struct st_query *q,
|
|||||||
const char *err_sqlstate, DYNAMIC_STRING *ds);
|
const char *err_sqlstate, DYNAMIC_STRING *ds);
|
||||||
static void handle_no_error(struct st_query *q);
|
static void handle_no_error(struct st_query *q);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EMBEDDED_LIBRARY
|
||||||
|
/*
|
||||||
|
send_one_query executes query in separate thread what is
|
||||||
|
necessary in embedded library to run 'send' in proper way.
|
||||||
|
This implementation doesn't handle errors returned
|
||||||
|
by mysql_send_query. It's technically possible, though
|
||||||
|
i don't see where it is needed.
|
||||||
|
*/
|
||||||
|
pthread_handler_decl(send_one_query, arg)
|
||||||
|
{
|
||||||
|
struct connection *cn= (struct connection*)arg;
|
||||||
|
|
||||||
|
mysql_thread_init();
|
||||||
|
VOID(mysql_send_query(&cn->mysql, cn->cur_query, cn->cur_query_len));
|
||||||
|
|
||||||
|
mysql_thread_end();
|
||||||
|
pthread_mutex_lock(&cn->mutex);
|
||||||
|
cn->query_done= 1;
|
||||||
|
VOID(pthread_cond_signal(&cn->cond));
|
||||||
|
pthread_mutex_unlock(&cn->mutex);
|
||||||
|
pthread_exit(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_send_query(struct connection *cn, const char *q, int q_len,
|
||||||
|
int flags)
|
||||||
|
{
|
||||||
|
pthread_t tid;
|
||||||
|
|
||||||
|
if (flags & QUERY_REAP)
|
||||||
|
return mysql_send_query(&cn->mysql, q, q_len);
|
||||||
|
|
||||||
|
if (pthread_mutex_init(&cn->mutex, NULL) ||
|
||||||
|
pthread_cond_init(&cn->cond, NULL))
|
||||||
|
die("Error in the thread library");
|
||||||
|
|
||||||
|
cn->cur_query= q;
|
||||||
|
cn->cur_query_len= q_len;
|
||||||
|
cn->query_done= 0;
|
||||||
|
if (pthread_create(&tid, NULL, send_one_query, (void*)cn))
|
||||||
|
die("Cannot start new thread for query");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /*EMBEDDED_LIBRARY*/
|
||||||
|
|
||||||
|
#define do_send_query(cn,q,q_len,flags) mysql_send_query(&cn->mysql, q, q_len)
|
||||||
|
|
||||||
|
#endif /*EMBEDDED_LIBRARY*/
|
||||||
|
|
||||||
static void do_eval(DYNAMIC_STRING* query_eval, const char *query,
|
static void do_eval(DYNAMIC_STRING* query_eval, const char *query,
|
||||||
my_bool pass_through_escape_chars)
|
my_bool pass_through_escape_chars)
|
||||||
{
|
{
|
||||||
@ -2038,7 +2097,7 @@ int close_connection(struct st_query *q)
|
|||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
if (q->type == Q_DIRTY_CLOSE)
|
if (q->type == Q_DIRTY_CLOSE)
|
||||||
{
|
{
|
||||||
if (con->mysql.net.vio)
|
while (con->mysql.net.vio)
|
||||||
{
|
{
|
||||||
vio_delete(con->mysql.net.vio);
|
vio_delete(con->mysql.net.vio);
|
||||||
con->mysql.net.vio = 0;
|
con->mysql.net.vio = 0;
|
||||||
@ -3578,7 +3637,6 @@ static int append_warnings(DYNAMIC_STRING *ds, MYSQL* mysql)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Run query using MySQL C API
|
Run query using MySQL C API
|
||||||
|
|
||||||
@ -3595,11 +3653,12 @@ static int append_warnings(DYNAMIC_STRING *ds, MYSQL* mysql)
|
|||||||
error - function will not return
|
error - function will not return
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void run_query_normal(MYSQL *mysql, struct st_query *command,
|
static void run_query_normal(struct connection *cn, struct st_query *command,
|
||||||
int flags, char *query, int query_len,
|
int flags, char *query, int query_len,
|
||||||
DYNAMIC_STRING *ds, DYNAMIC_STRING *ds_warnings)
|
DYNAMIC_STRING *ds, DYNAMIC_STRING *ds_warnings)
|
||||||
{
|
{
|
||||||
MYSQL_RES *res= 0;
|
MYSQL_RES *res= 0;
|
||||||
|
MYSQL *mysql= &cn->mysql;
|
||||||
int err= 0, counter= 0;
|
int err= 0, counter= 0;
|
||||||
DBUG_ENTER("run_query_normal");
|
DBUG_ENTER("run_query_normal");
|
||||||
DBUG_PRINT("enter",("flags: %d", flags));
|
DBUG_PRINT("enter",("flags: %d", flags));
|
||||||
@ -3610,13 +3669,26 @@ static void run_query_normal(MYSQL *mysql, struct st_query *command,
|
|||||||
/*
|
/*
|
||||||
Send the query
|
Send the query
|
||||||
*/
|
*/
|
||||||
if (mysql_send_query(mysql, query, query_len))
|
if (do_send_query(cn, query, query_len, flags))
|
||||||
{
|
{
|
||||||
handle_error(query, command, mysql_errno(mysql), mysql_error(mysql),
|
handle_error(query, command, mysql_errno(mysql), mysql_error(mysql),
|
||||||
mysql_sqlstate(mysql), ds);
|
mysql_sqlstate(mysql), ds);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef EMBEDDED_LIBRARY
|
||||||
|
/*
|
||||||
|
Here we handle 'reap' command, so we need to check if the
|
||||||
|
query's thread was finished and probably wait
|
||||||
|
*/
|
||||||
|
else if (flags & QUERY_REAP)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&cn->mutex);
|
||||||
|
if (!cn->query_done)
|
||||||
|
pthread_cond_wait(&cn->cond, &cn->mutex);
|
||||||
|
pthread_mutex_unlock(&cn->mutex);
|
||||||
|
}
|
||||||
|
#endif /*EMBEDDED_LIBRARY*/
|
||||||
|
|
||||||
if (!(flags & QUERY_REAP))
|
if (!(flags & QUERY_REAP))
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
@ -3867,10 +3939,11 @@ static void handle_no_error(struct st_query *q)
|
|||||||
error - function will not return
|
error - function will not return
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void run_query_stmt(MYSQL *mysql, struct st_query *command,
|
static void run_query_stmt(struct connection *cn, struct st_query *command,
|
||||||
char *query, int query_len, DYNAMIC_STRING *ds,
|
char *query, int query_len, DYNAMIC_STRING *ds,
|
||||||
DYNAMIC_STRING *ds_warnings)
|
DYNAMIC_STRING *ds_warnings)
|
||||||
{
|
{
|
||||||
|
MYSQL *mysql= &cn->mysql;
|
||||||
MYSQL_RES *res= NULL; /* Note that here 'res' is meta data result set */
|
MYSQL_RES *res= NULL; /* Note that here 'res' is meta data result set */
|
||||||
MYSQL_STMT *stmt;
|
MYSQL_STMT *stmt;
|
||||||
DYNAMIC_STRING ds_prepare_warnings;
|
DYNAMIC_STRING ds_prepare_warnings;
|
||||||
@ -4740,7 +4813,7 @@ int main(int argc, char **argv)
|
|||||||
q->require_file=require_file;
|
q->require_file=require_file;
|
||||||
save_file[0]=0;
|
save_file[0]=0;
|
||||||
}
|
}
|
||||||
run_query(&cur_con->mysql, q, QUERY_REAP|QUERY_SEND);
|
run_query(cur_con, q, QUERY_REAP|QUERY_SEND);
|
||||||
display_result_vertically= old_display_result_vertically;
|
display_result_vertically= old_display_result_vertically;
|
||||||
q->last_argument= q->end;
|
q->last_argument= q->end;
|
||||||
query_executed= 1;
|
query_executed= 1;
|
||||||
@ -4775,7 +4848,7 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
q->query= q->first_argument;
|
q->query= q->first_argument;
|
||||||
}
|
}
|
||||||
run_query(&cur_con->mysql, q, flags);
|
run_query(cur_con, q, flags);
|
||||||
query_executed= 1;
|
query_executed= 1;
|
||||||
q->last_argument= q->end;
|
q->last_argument= q->end;
|
||||||
break;
|
break;
|
||||||
@ -4796,7 +4869,7 @@ int main(int argc, char **argv)
|
|||||||
query and read the result some time later when reap instruction
|
query and read the result some time later when reap instruction
|
||||||
is given on this connection.
|
is given on this connection.
|
||||||
*/
|
*/
|
||||||
run_query(&cur_con->mysql, q, QUERY_SEND);
|
run_query(cur_con, q, QUERY_SEND);
|
||||||
query_executed= 1;
|
query_executed= 1;
|
||||||
q->last_argument= q->end;
|
q->last_argument= q->end;
|
||||||
break;
|
break;
|
||||||
|
@ -4769,14 +4769,6 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result->data)
|
|
||||||
{
|
|
||||||
free_root(&result->alloc, MYF(MY_KEEP_PREALLOC));
|
|
||||||
result->data= NULL;
|
|
||||||
result->rows= 0;
|
|
||||||
stmt->data_cursor= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stmt->update_max_length && !stmt->bind_result_done)
|
if (stmt->update_max_length && !stmt->bind_result_done)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -1,11 +1,3 @@
|
|||||||
# This test doesn't work with the embedded version as this code
|
|
||||||
# assumes that one query is running while we are doing queries on
|
|
||||||
# a second connection.
|
|
||||||
# This would work if mysqltest run would be threaded and handle each
|
|
||||||
# connection in a separate thread.
|
|
||||||
#
|
|
||||||
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
-- source include/have_bdb.inc
|
-- source include/have_bdb.inc
|
||||||
|
|
||||||
connect (con1,localhost,root,,);
|
connect (con1,localhost,root,,);
|
||||||
|
@ -1,11 +1,3 @@
|
|||||||
# This test doesn't work with the embedded version as this code
|
|
||||||
# assumes that one query is running while we are doing queries on
|
|
||||||
# a second connection.
|
|
||||||
# This would work if mysqltest run would be threaded and handle each
|
|
||||||
# connection in a separate thread.
|
|
||||||
#
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
|
|
||||||
connect (con1,localhost,root,,);
|
connect (con1,localhost,root,,);
|
||||||
connect (con2,localhost,root,,);
|
connect (con2,localhost,root,,);
|
||||||
connection con1;
|
connection con1;
|
||||||
|
@ -3,9 +3,6 @@
|
|||||||
# We verify that we did not introduce a deadlock.
|
# We verify that we did not introduce a deadlock.
|
||||||
# This is intended to mimick how mysqldump and innobackup work.
|
# This is intended to mimick how mysqldump and innobackup work.
|
||||||
|
|
||||||
# This test doesn't work with the embedded server
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
|
|
||||||
# And it requires InnoDB
|
# And it requires InnoDB
|
||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
|
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
# Can't test this with embedded server
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
|
|
||||||
connect (con1,localhost,root,,);
|
connect (con1,localhost,root,,);
|
||||||
connect (con2,localhost,root,,);
|
connect (con2,localhost,root,,);
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
# Can't test this with embedded server
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check and select innodb lock type
|
# Check and select innodb lock type
|
||||||
|
@ -1,11 +1,3 @@
|
|||||||
# This test doesn't work with the embedded version as this code
|
|
||||||
# assumes that one query is running while we are doing queries on
|
|
||||||
# a second connection.
|
|
||||||
# This would work if mysqltest run would be threaded and handle each
|
|
||||||
# connection in a separate thread.
|
|
||||||
#
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1,t2;
|
drop table if exists t1,t2;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
@ -2,10 +2,6 @@
|
|||||||
# Test of rename table
|
# Test of rename table
|
||||||
#
|
#
|
||||||
|
|
||||||
# Test requires concurrent connections, which can't be tested on embedded
|
|
||||||
# server
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t0,t1,t2,t3,t4;
|
drop table if exists t0,t1,t2,t3,t4;
|
||||||
# Clear up from other tests (to ensure that SHOW TABLES below is right)
|
# Clear up from other tests (to ensure that SHOW TABLES below is right)
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
# Requires use of multiple simultaneous connections, not supported with
|
# Uses GRANT commands that usually disabled in embedded server
|
||||||
# embedded server testing
|
|
||||||
-- source include/not_embedded.inc
|
-- source include/not_embedded.inc
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1,10 +1,3 @@
|
|||||||
# This test doesn't work with the embedded version as this code
|
|
||||||
# assumes that one query is running while we are doing queries on
|
|
||||||
# a second connection.
|
|
||||||
# This would work if mysqltest run would be threaded and handle each
|
|
||||||
# connection in a separate thread.
|
|
||||||
#
|
|
||||||
--source include/not_embedded.inc
|
|
||||||
# PS causes different statistics
|
# PS causes different statistics
|
||||||
--disable_ps_protocol
|
--disable_ps_protocol
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user