Commit 833baf6f authored by hf@deer.(none)'s avatar hf@deer.(none)

Merge abotchkov@bk-internal.mysql.com:/home/bk/mysql-4.1

into deer.(none):/home/hf/work/mysql-4.1.emb
parents 4ec4e266 0bda11b6
...@@ -627,6 +627,7 @@ typedef struct st_mysql_methods ...@@ -627,6 +627,7 @@ typedef struct st_mysql_methods
MYSQL_RES * (*use_result)(MYSQL *mysql); MYSQL_RES * (*use_result)(MYSQL *mysql);
void (*fetch_lengths)(unsigned long *to, void (*fetch_lengths)(unsigned long *to,
MYSQL_ROW column, unsigned int field_count); MYSQL_ROW column, unsigned int field_count);
void (*flush_use_result)(MYSQL *mysql);
#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY) #if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY)
MYSQL_FIELD * (*list_fields)(MYSQL *mysql); MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
......
...@@ -25,7 +25,6 @@ extern "C" { ...@@ -25,7 +25,6 @@ extern "C" {
MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
my_bool default_value, uint server_capabilities); my_bool default_value, uint server_capabilities);
void free_rows(MYSQL_DATA *cur); void free_rows(MYSQL_DATA *cur);
void flush_use_result(MYSQL *mysql);
my_bool mysql_autenticate(MYSQL *mysql, const char *passwd); my_bool mysql_autenticate(MYSQL *mysql, const char *passwd);
void free_old_query(MYSQL *mysql); void free_old_query(MYSQL *mysql);
void end_server(MYSQL *mysql); void end_server(MYSQL *mysql);
......
...@@ -4392,7 +4392,7 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt) ...@@ -4392,7 +4392,7 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt)
if (mysql->status != MYSQL_STATUS_READY) if (mysql->status != MYSQL_STATUS_READY)
{ {
/* There is a result set and it belongs to this statement */ /* There is a result set and it belongs to this statement */
flush_use_result(mysql); (*mysql->methods->flush_use_result)(mysql);
mysql->status= MYSQL_STATUS_READY; mysql->status= MYSQL_STATUS_READY;
} }
} }
...@@ -4442,7 +4442,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt) ...@@ -4442,7 +4442,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
Flush result set of the connection. If it does not belong Flush result set of the connection. If it does not belong
to this statement, set a warning. to this statement, set a warning.
*/ */
flush_use_result(mysql); (*mysql->methods->flush_use_result)(mysql);
if (mysql->unbuffered_fetch_owner) if (mysql->unbuffered_fetch_owner)
*mysql->unbuffered_fetch_owner= TRUE; *mysql->unbuffered_fetch_owner= TRUE;
mysql->status= MYSQL_STATUS_READY; mysql->status= MYSQL_STATUS_READY;
......
...@@ -84,6 +84,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command, ...@@ -84,6 +84,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
thd->clear_error(); thd->clear_error();
mysql->affected_rows= ~(my_ulonglong) 0; mysql->affected_rows= ~(my_ulonglong) 0;
mysql->field_count= 0; mysql->field_count= 0;
net->last_errno= 0;
thd->store_globals(); // Fix if more than one connect thd->store_globals(); // Fix if more than one connect
/* /*
...@@ -107,17 +108,38 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command, ...@@ -107,17 +108,38 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
if (!skip_check) if (!skip_check)
result= thd->net.last_errno ? -1 : 0; result= thd->net.last_errno ? -1 : 0;
/*
If mysql->field_count is set it means the parsing of the query was OK
and metadata was returned (see Protocol::send_fields).
In this case we postpone the error to be returned in mysql_stmt_store_result
(see emb_read_rows) to behave just as standalone server.
*/
if (!mysql->field_count)
embedded_get_error(mysql); embedded_get_error(mysql);
mysql->server_status= thd->server_status; mysql->server_status= thd->server_status;
mysql->warning_count= ((THD*)mysql->thd)->total_warn_count; mysql->warning_count= ((THD*)mysql->thd)->total_warn_count;
return result; return result;
} }
static void emb_flush_use_result(MYSQL *mysql)
{
MYSQL_DATA *data= ((THD*)(mysql->thd))->data;
if (data)
{
free_rows(data);
((THD*)(mysql->thd))->data= NULL;
}
}
static MYSQL_DATA * static MYSQL_DATA *
emb_read_rows(MYSQL *mysql, MYSQL_FIELD *mysql_fields __attribute__((unused)), emb_read_rows(MYSQL *mysql, MYSQL_FIELD *mysql_fields __attribute__((unused)),
unsigned int fields __attribute__((unused))) unsigned int fields __attribute__((unused)))
{ {
MYSQL_DATA *result= ((THD*)mysql->thd)->data; MYSQL_DATA *result= ((THD*)mysql->thd)->data;
embedded_get_error(mysql);
if (mysql->net.last_errno)
return NULL;
if (!result) if (!result)
{ {
if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA), if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),
...@@ -227,6 +249,9 @@ int emb_read_binary_rows(MYSQL_STMT *stmt) ...@@ -227,6 +249,9 @@ int emb_read_binary_rows(MYSQL_STMT *stmt)
int emb_unbuffered_fetch(MYSQL *mysql, char **row) int emb_unbuffered_fetch(MYSQL *mysql, char **row)
{ {
MYSQL_DATA *data= ((THD*)mysql->thd)->data; MYSQL_DATA *data= ((THD*)mysql->thd)->data;
embedded_get_error(mysql);
if (mysql->net.last_errno)
return mysql->net.last_errno;
if (!data || !data->data) if (!data || !data->data)
{ {
*row= NULL; *row= NULL;
...@@ -293,6 +318,7 @@ MYSQL_METHODS embedded_methods= ...@@ -293,6 +318,7 @@ MYSQL_METHODS embedded_methods=
emb_read_rows, emb_read_rows,
emb_mysql_store_result, emb_mysql_store_result,
emb_fetch_lengths, emb_fetch_lengths,
emb_flush_use_result,
emb_list_fields, emb_list_fields,
emb_read_prepare_result, emb_read_prepare_result,
emb_stmt_execute, emb_stmt_execute,
...@@ -442,14 +468,6 @@ int init_embedded_server(int argc, char **argv, char **groups) ...@@ -442,14 +468,6 @@ int init_embedded_server(int argc, char **argv, char **groups)
} }
} }
/*
Update mysqld variables from client variables if set
The client variables are set also by get_one_option() in mysqld.cc
*/
if (max_allowed_packet)
global_system_variables.max_allowed_packet= max_allowed_packet;
if (net_buffer_length)
global_system_variables.net_buffer_length= net_buffer_length;
return 0; return 0;
} }
...@@ -478,18 +496,20 @@ void *create_embedded_thd(int client_flag, char *db) ...@@ -478,18 +496,20 @@ void *create_embedded_thd(int client_flag, char *db)
if (thd->store_globals()) if (thd->store_globals())
{ {
fprintf(stderr,"store_globals failed.\n"); fprintf(stderr,"store_globals failed.\n");
return NULL; goto err;
} }
thd->mysys_var= my_thread_var; thd->mysys_var= my_thread_var;
thd->dbug_thread_id= my_thread_id(); thd->dbug_thread_id= my_thread_id();
thd->thread_stack= (char*) &thd; thd->thread_stack= (char*) &thd;
/* TODO - add init_connect command execution */
thd->proc_info=0; // Remove 'login' thd->proc_info=0; // Remove 'login'
thd->command=COM_SLEEP; thd->command=COM_SLEEP;
thd->version=refresh_version; thd->version=refresh_version;
thd->set_time(); thd->set_time();
init_sql_alloc(&thd->mem_root,8192,8192); thd->init_for_queries();
thd->client_capabilities= client_flag; thd->client_capabilities= client_flag;
thd->db= db; thd->db= db;
...@@ -504,6 +524,9 @@ void *create_embedded_thd(int client_flag, char *db) ...@@ -504,6 +524,9 @@ void *create_embedded_thd(int client_flag, char *db)
thread_count++; thread_count++;
return thd; return thd;
err:
delete(thd);
return NULL;
} }
#ifdef NO_EMBEDDED_ACCESS_CHECKS #ifdef NO_EMBEDDED_ACCESS_CHECKS
......
...@@ -723,7 +723,7 @@ void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate) ...@@ -723,7 +723,7 @@ void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
Flush result set sent from server Flush result set sent from server
*/ */
void flush_use_result(MYSQL *mysql) static void cli_flush_use_result(MYSQL *mysql)
{ {
/* Clear the current execution status */ /* Clear the current execution status */
DBUG_PRINT("warning",("Not all packets read, clearing them")); DBUG_PRINT("warning",("Not all packets read, clearing them"));
...@@ -842,7 +842,7 @@ mysql_free_result(MYSQL_RES *result) ...@@ -842,7 +842,7 @@ mysql_free_result(MYSQL_RES *result)
mysql->unbuffered_fetch_owner= 0; mysql->unbuffered_fetch_owner= 0;
if (mysql->status == MYSQL_STATUS_USE_RESULT) if (mysql->status == MYSQL_STATUS_USE_RESULT)
{ {
flush_use_result(mysql); (*mysql->methods->flush_use_result)(mysql);
mysql->status=MYSQL_STATUS_READY; mysql->status=MYSQL_STATUS_READY;
} }
} }
...@@ -1493,7 +1493,8 @@ static MYSQL_METHODS client_methods= ...@@ -1493,7 +1493,8 @@ static MYSQL_METHODS client_methods=
cli_advanced_command, cli_advanced_command,
cli_read_rows, cli_read_rows,
cli_use_result, cli_use_result,
cli_fetch_lengths cli_fetch_lengths,
cli_flush_use_result
#ifndef MYSQL_SERVER #ifndef MYSQL_SERVER
,cli_list_fields, ,cli_list_fields,
cli_read_prepare_result, cli_read_prepare_result,
......
...@@ -5619,9 +5619,11 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -5619,9 +5619,11 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
#ifdef EMBEDDED_LIBRARY #ifdef EMBEDDED_LIBRARY
case OPT_MAX_ALLOWED_PACKET: case OPT_MAX_ALLOWED_PACKET:
max_allowed_packet= atoi(argument); max_allowed_packet= atoi(argument);
global_system_variables.max_allowed_packet= max_allowed_packet;
break; break;
case OPT_NET_BUFFER_LENGTH: case OPT_NET_BUFFER_LENGTH:
net_buffer_length= atoi(argument); net_buffer_length= atoi(argument);
global_system_variables.net_buffer_length= net_buffer_length;
break; break;
#endif #endif
#include <sslopt-case.h> #include <sslopt-case.h>
......
...@@ -1138,8 +1138,10 @@ static int check_max_delayed_threads(THD *thd, set_var *var) ...@@ -1138,8 +1138,10 @@ static int check_max_delayed_threads(THD *thd, set_var *var)
static void fix_max_connections(THD *thd, enum_var_type type) static void fix_max_connections(THD *thd, enum_var_type type)
{ {
#ifndef EMBEDDED_LIBRARY
resize_thr_alarm(max_connections + resize_thr_alarm(max_connections +
global_system_variables.max_insert_delayed_threads + 10); global_system_variables.max_insert_delayed_threads + 10);
#endif
} }
......
...@@ -696,6 +696,7 @@ static bool emb_insert_params(Prepared_statement *stmt, String *expanded_query) ...@@ -696,6 +696,7 @@ static bool emb_insert_params(Prepared_statement *stmt, String *expanded_query)
else else
{ {
uchar *buff= (uchar*) client_param->buffer; uchar *buff= (uchar*) client_param->buffer;
param->unsigned_flag= client_param->is_unsigned;
param->set_param_func(param, &buff, param->set_param_func(param, &buff,
client_param->length ? client_param->length ?
*client_param->length : *client_param->length :
...@@ -736,6 +737,7 @@ static bool emb_insert_params_withlog(Prepared_statement *stmt, String *query) ...@@ -736,6 +737,7 @@ static bool emb_insert_params_withlog(Prepared_statement *stmt, String *query)
else else
{ {
uchar *buff= (uchar*)client_param->buffer; uchar *buff= (uchar*)client_param->buffer;
param->unsigned_flag= client_param->is_unsigned;
param->set_param_func(param, &buff, param->set_param_func(param, &buff,
client_param->length ? client_param->length ?
*client_param->length : *client_param->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