summaryrefslogtreecommitdiff
path: root/libmysqld
diff options
context:
space:
mode:
authorunknown <hf@deer.(none)>2004-08-19 15:47:09 +0500
committerunknown <hf@deer.(none)>2004-08-19 15:47:09 +0500
commit37c025e6f9e862725a819076a4967dfc4913974d (patch)
tree1bb5b160e9bb81115b19732348ba96c4bf069602 /libmysqld
parentcba27e4a91d18439f421b3a33d27df8a2bfa04c1 (diff)
parentde40ed916e4d4a70cee06250682e8a2c52d527a8 (diff)
downloadmariadb-git-37c025e6f9e862725a819076a4967dfc4913974d.tar.gz
Merge bk@192.168.21.1:/usr/home/bk/mysql-4.1
into deer.(none):/home/hf/work/mysql-4.1.emb libmysql/libmysql.c: Auto merged libmysqld/lib_sql.cc: Auto merged sql-common/client.c: Auto merged sql/mysqld.cc: Auto merged sql/set_var.cc: Auto merged sql/sql_prepare.cc: Auto merged
Diffstat (limited to 'libmysqld')
-rw-r--r--libmysqld/lib_sql.cc45
1 files changed, 34 insertions, 11 deletions
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index f1404d12654..f4a53343e45 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -84,6 +84,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
thd->clear_error();
mysql->affected_rows= ~(my_ulonglong) 0;
mysql->field_count= 0;
+ net->last_errno= 0;
thd->store_globals(); // Fix if more than one connect
/*
@@ -107,17 +108,38 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
if (!skip_check)
result= thd->net.last_errno ? -1 : 0;
- embedded_get_error(mysql);
+ /*
+ 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);
mysql->server_status= thd->server_status;
mysql->warning_count= ((THD*)mysql->thd)->total_warn_count;
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 *
emb_read_rows(MYSQL *mysql, MYSQL_FIELD *mysql_fields __attribute__((unused)),
unsigned int fields __attribute__((unused)))
{
MYSQL_DATA *result= ((THD*)mysql->thd)->data;
+ embedded_get_error(mysql);
+ if (mysql->net.last_errno)
+ return NULL;
if (!result)
{
if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),
@@ -227,6 +249,9 @@ int emb_read_binary_rows(MYSQL_STMT *stmt)
int emb_unbuffered_fetch(MYSQL *mysql, char **row)
{
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)
{
*row= NULL;
@@ -293,6 +318,7 @@ MYSQL_METHODS embedded_methods=
emb_read_rows,
emb_mysql_store_result,
emb_fetch_lengths,
+ emb_flush_use_result,
emb_list_fields,
emb_read_prepare_result,
emb_stmt_execute,
@@ -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;
}
@@ -478,18 +496,20 @@ void *create_embedded_thd(int client_flag, char *db)
if (thd->store_globals())
{
fprintf(stderr,"store_globals failed.\n");
- return NULL;
+ goto err;
}
thd->mysys_var= my_thread_var;
thd->dbug_thread_id= my_thread_id();
thd->thread_stack= (char*) &thd;
+/* TODO - add init_connect command execution */
+
thd->proc_info=0; // Remove 'login'
thd->command=COM_SLEEP;
thd->version=refresh_version;
thd->set_time();
- init_sql_alloc(&thd->mem_root,8192,8192);
+ thd->init_for_queries();
thd->client_capabilities= client_flag;
thd->db= db;
@@ -504,6 +524,9 @@ void *create_embedded_thd(int client_flag, char *db)
thread_count++;
return thd;
+err:
+ delete(thd);
+ return NULL;
}
#ifdef NO_EMBEDDED_ACCESS_CHECKS