Commit 25bd1e9a authored by hf@genie.(none)'s avatar hf@genie.(none)

Merged by hands

parents 38787c5d 52bf2add
...@@ -20,6 +20,8 @@ heikki@donna.mysql.fi ...@@ -20,6 +20,8 @@ heikki@donna.mysql.fi
heikki@hundin.mysql.fi heikki@hundin.mysql.fi
heikki@rescue. heikki@rescue.
heikki@work.mysql.com heikki@work.mysql.com
hf@bison.(none)
hf@bisonxp.(none)
hf@genie.(none) hf@genie.(none)
jani@dsl-jkl1657.dial.inet.fi jani@dsl-jkl1657.dial.inet.fi
jani@hynda.(none) jani@hynda.(none)
......
...@@ -314,6 +314,10 @@ int mysql_rpl_parse_enabled(MYSQL* mysql __attribute__((unused))) { return 1; } ...@@ -314,6 +314,10 @@ int mysql_rpl_parse_enabled(MYSQL* mysql __attribute__((unused))) { return 1; }
my_bool mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; } my_bool mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; }
#endif #endif
#ifdef EMBEDDED_LIBRARY
#define mysql_send_query mysql_real_query
#endif
#define MAX_SERVER_ARGS 20 #define MAX_SERVER_ARGS 20
static int embedded_server_arg_count=0; static int embedded_server_arg_count=0;
......
...@@ -108,6 +108,9 @@ typedef struct st_mysql_data { ...@@ -108,6 +108,9 @@ typedef struct st_mysql_data {
unsigned int fields; unsigned int fields;
MYSQL_ROWS *data; MYSQL_ROWS *data;
MEM_ROOT alloc; MEM_ROOT alloc;
#ifdef EMBEDDED_LIBRARY
MYSQL_ROWS **prev_ptr;
#endif
} MYSQL_DATA; } MYSQL_DATA;
struct st_mysql_options { struct st_mysql_options {
...@@ -137,13 +140,20 @@ struct st_mysql_options { ...@@ -137,13 +140,20 @@ struct st_mysql_options {
a read that is replication-aware a read that is replication-aware
*/ */
my_bool no_master_reads; my_bool no_master_reads;
#ifdef EMBEDDED_LIBRARY
my_bool separate_thread;
#endif
}; };
enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS,
MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND, MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND,
MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME,
MYSQL_OPT_LOCAL_INFILE}; MYSQL_OPT_LOCAL_INFILE,
#ifdef EMBEDDED_LIBRARY
MYSQL_OPT_USE_RESULT
#endif
};
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};
...@@ -156,13 +166,19 @@ enum mysql_status { MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT, ...@@ -156,13 +166,19 @@ enum mysql_status { MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,
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 };
struct st_mysql_res;
typedef struct st_mysql typedef struct st_mysql
{ {
NET net; /* Communication parameters */ NET net; /* Communication parameters */
gptr connector_fd; /* ConnectorFd for SSL */ gptr connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,*server_version,*host_info, #ifndef _0EMBEDDED_LIBRARY
*info,*db; char *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
#endif
#ifdef EMBEDDED_LIBRARY
struct st_mysql_res *result;
#endif
char *db;
struct charset_info_st *charset; struct charset_info_st *charset;
MYSQL_FIELD *fields; MYSQL_FIELD *fields;
MEM_ROOT field_alloc; MEM_ROOT field_alloc;
...@@ -201,6 +217,9 @@ typedef struct st_mysql ...@@ -201,6 +217,9 @@ typedef struct st_mysql
typedef struct st_mysql_res { typedef struct st_mysql_res {
#ifdef EMBEDDED_LIBRARY
const char *query_str;
#endif
my_ulonglong row_count; my_ulonglong row_count;
MYSQL_FIELD *fields; MYSQL_FIELD *fields;
MYSQL_DATA *data; MYSQL_DATA *data;
......
...@@ -31,8 +31,13 @@ ...@@ -31,8 +31,13 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
enum enum_vio_type { VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET, enum enum_vio_type {
VIO_TYPE_NAMEDPIPE, VIO_TYPE_SSL}; VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET,
VIO_TYPE_NAMEDPIPE, VIO_TYPE_SSL
#ifdef EMBEDDED_LIBRARY
,VIO_SHARED_MEMORY, VIO_BUFFER
#endif
};
#ifndef __WIN__ #ifndef __WIN__
#define HANDLE void * #define HANDLE void *
......
...@@ -26,6 +26,9 @@ C_MODE_START ...@@ -26,6 +26,9 @@ C_MODE_START
extern void start_embedded_connection(NET * net); extern void start_embedded_connection(NET * net);
extern void end_embedded_connection(NET * net); extern void end_embedded_connection(NET * net);
extern void lib_connection_phase(NET *net, int phase); extern void lib_connection_phase(NET *net, int phase);
extern bool lib_dispatch_command(enum enum_server_command command, NET *net, extern void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db);
const char *arg, ulong length); extern void *create_embedded_thd(Vio *vio, unsigned char *buff, int client_flag, char *db);
extern NET *get_mysql_net(MYSQL *mysql);
extern my_bool simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
ulong length, my_bool skipp_check);
C_MODE_END C_MODE_END
This diff is collapsed.
...@@ -42,14 +42,7 @@ ...@@ -42,14 +42,7 @@
struct st_vio struct st_vio
{ {
my_socket sd; /* my_socket - real or imaginary */
HANDLE hPipe;
my_bool localhost; /* Are we from localhost? */
int fcntl_mode; /* Buffered fcntl(sd,F_GETFL) */
struct sockaddr_in local; /* Local internet address */
struct sockaddr_in remote; /* Remote internet address */
enum enum_vio_type type; /* Type of connection */ enum enum_vio_type type; /* Type of connection */
char desc[30]; /* String description */
void *dest_thd; void *dest_thd;
char *packets, **last_packet; char *packets, **last_packet;
char *where_in_packet, *end_of_packet; char *where_in_packet, *end_of_packet;
...@@ -57,6 +50,7 @@ struct st_vio ...@@ -57,6 +50,7 @@ struct st_vio
MEM_ROOT root; MEM_ROOT root;
}; };
/* Initialize the communication buffer */ /* Initialize the communication buffer */
Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost) Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
...@@ -69,6 +63,7 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost) ...@@ -69,6 +63,7 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
init_alloc_root(&vio->root, 8192, 8192); init_alloc_root(&vio->root, 8192, 8192);
vio->root.min_malloc = sizeof(char *) + 4; vio->root.min_malloc = sizeof(char *) + 4;
vio->last_packet = &vio->packets; vio->last_packet = &vio->packets;
vio->type = type;
} }
DBUG_RETURN(vio); DBUG_RETURN(vio);
} }
...@@ -219,4 +214,22 @@ my_bool vio_poll_read(Vio *vio,uint timeout) ...@@ -219,4 +214,22 @@ my_bool vio_poll_read(Vio *vio,uint timeout)
return 0; return 0;
} }
int create_vio(NET *net, int separate_thread)
{
Vio * v = net->vio;
if (!v)
{
v = vio_new(0, separate_thread ? VIO_SHARED_MEMORY : VIO_BUFFER, 0);
net->vio = v;
}
return !v;
}
void set_thd(Vio *v, void *thd)
{
if (v)
{
v -> dest_thd = thd;
}
}
#endif /* HAVE_VIO */ #endif /* HAVE_VIO */
This diff is collapsed.
...@@ -473,3 +473,12 @@ bool CONVERT::store(String *packet,const char *from,uint length) ...@@ -473,3 +473,12 @@ bool CONVERT::store(String *packet,const char *from,uint length)
packet->length((uint) (to-packet->ptr())); packet->length((uint) (to-packet->ptr()));
return 0; return 0;
} }
#ifdef EMBEDDED_LIBRARY
void CONVERT::convert_back(char *dest, const char *source, uint length) const
{
for (char *end= dest+length; dest < end; dest++, source++)
*dest= to_map[*source];
}
#endif
...@@ -4472,7 +4472,7 @@ void Field_blob::set_key_image(char *buff,uint length) ...@@ -4472,7 +4472,7 @@ void Field_blob::set_key_image(char *buff,uint length)
void Field_geom::get_key_image(char *buff,uint length, imagetype type) void Field_geom::get_key_image(char *buff,uint length, imagetype type)
{ {
length-=HA_KEY_BLOB_LENGTH; /* length-=HA_KEY_BLOB_LENGTH;
ulong blob_length=get_length(ptr); ulong blob_length=get_length(ptr);
char *blob; char *blob;
get_ptr(&blob); get_ptr(&blob);
...@@ -4487,12 +4487,19 @@ void Field_geom::get_key_image(char *buff,uint length, imagetype type) ...@@ -4487,12 +4487,19 @@ void Field_geom::get_key_image(char *buff,uint length, imagetype type)
float8store(buff+16, mbr.ymin); float8store(buff+16, mbr.ymin);
float8store(buff+24, mbr.ymax); float8store(buff+24, mbr.ymax);
return; return;
*/
Field_blob::get_key_image(buff, length, type);
} }
void Field_geom::set_key_image(char *buff,uint length) void Field_geom::set_key_image(char *buff,uint length)
{ {
Field_blob::set_key_image(buff, length);
} }
void Field_geom::sql_type(String &res) const
{
res.set("geometry", 8U, default_charset_info);
}
int Field_blob::key_cmp(const byte *key_ptr, uint max_key_length) int Field_blob::key_cmp(const byte *key_ptr, uint max_key_length)
{ {
...@@ -5163,6 +5170,7 @@ uint32 calc_pack_length(enum_field_types type,uint32 length) ...@@ -5163,6 +5170,7 @@ uint32 calc_pack_length(enum_field_types type,uint32 length)
case FIELD_TYPE_BLOB: return 2+portable_sizeof_char_ptr; case FIELD_TYPE_BLOB: return 2+portable_sizeof_char_ptr;
case FIELD_TYPE_MEDIUM_BLOB: return 3+portable_sizeof_char_ptr; case FIELD_TYPE_MEDIUM_BLOB: return 3+portable_sizeof_char_ptr;
case FIELD_TYPE_LONG_BLOB: return 4+portable_sizeof_char_ptr; case FIELD_TYPE_LONG_BLOB: return 4+portable_sizeof_char_ptr;
case FIELD_TYPE_GEOMETRY: return 2+portable_sizeof_char_ptr;
case FIELD_TYPE_SET: case FIELD_TYPE_SET:
case FIELD_TYPE_ENUM: abort(); return 0; // This shouldn't happen case FIELD_TYPE_ENUM: abort(); return 0; // This shouldn't happen
default: return 0; default: return 0;
...@@ -5209,15 +5217,15 @@ Field *make_field(char *ptr, uint32 field_length, ...@@ -5209,15 +5217,15 @@ Field *make_field(char *ptr, uint32 field_length,
f_packtype(pack_flag), f_packtype(pack_flag),
field_length); field_length);
if (f_is_blob(pack_flag))
return new Field_blob(ptr,null_pos,null_bit,
unireg_check, field_name, table,
pack_length, field_charset);
if (f_is_geom(pack_flag)) if (f_is_geom(pack_flag))
return new Field_geom(ptr,null_pos,null_bit, return new Field_geom(ptr,null_pos,null_bit,
unireg_check, field_name, table, unireg_check, field_name, table,
pack_length); pack_length,f_is_binary(pack_flag) != 0);
if (f_is_blob(pack_flag))
return new Field_blob(ptr,null_pos,null_bit,
unireg_check, field_name, table,
pack_length,f_is_binary(pack_flag) != 0,
default_charset_info);
if (interval) if (interval)
{ {
if (f_is_enum(pack_flag)) if (f_is_enum(pack_flag))
......
...@@ -922,6 +922,8 @@ class Field_geom :public Field_blob { ...@@ -922,6 +922,8 @@ class Field_geom :public Field_blob {
:Field_blob(len_arg, maybe_null_arg, field_name_arg, :Field_blob(len_arg, maybe_null_arg, field_name_arg,
table_arg, my_charset_bin) {} table_arg, my_charset_bin) {}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; }
enum_field_types type() const { return FIELD_TYPE_GEOMETRY;}
void sql_type(String &str) const;
void get_key_image(char *buff,uint length, imagetype type); void get_key_image(char *buff,uint length, imagetype type);
void set_key_image(char *buff,uint length); void set_key_image(char *buff,uint length);
......
...@@ -79,7 +79,7 @@ static void mi_check_print_msg(MI_CHECK *param, const char* msg_type, ...@@ -79,7 +79,7 @@ static void mi_check_print_msg(MI_CHECK *param, const char* msg_type,
net_store_data(packet, msg_type); net_store_data(packet, msg_type);
net_store_data(packet, msgbuf); net_store_data(packet, msgbuf);
if (my_net_write(&thd->net, (char*)thd->packet.ptr(), thd->packet.length())) if (SEND_ROW(thd, 4, (char*)thd->packet.ptr(), thd->packet.length()))
sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n", sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n",
msgbuf); msgbuf);
return; return;
...@@ -1097,7 +1097,7 @@ int ha_myisam::create(const char *name, register TABLE *table, ...@@ -1097,7 +1097,7 @@ int ha_myisam::create(const char *name, register TABLE *table,
keydef[i].flag|=HA_AUTO_KEY; keydef[i].flag|=HA_AUTO_KEY;
found_auto_increment=1; found_auto_increment=1;
} }
if (field->type() == FIELD_TYPE_BLOB) if ((field->type() == FIELD_TYPE_BLOB) || (field->type() == FIELD_TYPE_GEOMETRY))
{ {
keydef[i].seg[j].flag|=HA_BLOB_PART; keydef[i].seg[j].flag|=HA_BLOB_PART;
/* save number of bytes used to pack length */ /* save number of bytes used to pack length */
......
...@@ -444,6 +444,9 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -444,6 +444,9 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
cause error ER_NON_UNIQ_ERROR in find_field_in_tables. cause error ER_NON_UNIQ_ERROR in find_field_in_tables.
*/ */
SELECT_LEX *last= 0; SELECT_LEX *last= 0;
#ifdef EMBEDDED_LIBRARY
thd->net.last_errno= 0;
#endif
for (SELECT_LEX *sl= thd->lex.current_select->outer_select(); for (SELECT_LEX *sl= thd->lex.current_select->outer_select();
sl; sl;
sl= sl->outer_select()) sl= sl->outer_select())
...@@ -797,11 +800,64 @@ bool Item::send(THD *thd, String *packet) ...@@ -797,11 +800,64 @@ bool Item::send(THD *thd, String *packet)
return net_store_data(packet,res->ptr(),res->length()); return net_store_data(packet,res->ptr(),res->length());
} }
bool Item_null::send(THD *thd, String *packet) bool Item_null::send(THD *thd, String *packet)
{ {
return net_store_null(packet); return net_store_null(packet);
} }
#ifdef EMBEDDED_LIBRARY
bool Item::embedded_send(const CONVERT *convert, CHARSET_INFO *charset, MEM_ROOT *alloc,
char **result, ulong *length)
{
char buff[MAX_FIELD_WIDTH];
String s(buff, sizeof(buff), charset), *value;
if (!(value=val_str(&s)) ||
!(*result=alloc_root(alloc, value->length() + 1)))
return true;
*length= value->length();
if (convert)
convert->convert_back(*result, value->ptr(), *length);
else
memcpy(*result, value->ptr(), *length);
(*result)[*length]= 0;
return false;
}
bool Item_null::embedded_send(const CONVERT *convert, CHARSET_INFO *charset, MEM_ROOT *alloc,
char **result, ulong *length)
{
*result= NULL;
return false;
}
bool Item_field::embedded_send(const CONVERT *convert, CHARSET_INFO *charset, MEM_ROOT *alloc,
char **result, ulong *length)
{
if (result_field->is_null())
{
result= NULL;
return false;
}
char buff[MAX_FIELD_WIDTH];
String tmp(buff,sizeof(buff),default_charset_info);
result_field->val_str(&tmp,&tmp);
if (!(*result=alloc_root(alloc, tmp.length() + 1)))
return true;
*length= tmp.length();
if (convert)
convert->convert_back(*result, tmp.ptr(), *length);
else
memcpy(*result, tmp.ptr(), *length);
(*result)[*length]= 0;
return false;
}
#endif
/* /*
This is used for HAVING clause This is used for HAVING clause
Find field in select list having the same name Find field in select list having the same name
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
struct st_table_list; struct st_table_list;
void item_init(void); /* Init item functions */ void item_init(void); /* Init item functions */
class CONVERT;
class Item { class Item {
Item(const Item &); /* Prevent use of these */ Item(const Item &); /* Prevent use of these */
void operator=(Item &); void operator=(Item &);
...@@ -58,6 +60,10 @@ class Item { ...@@ -58,6 +60,10 @@ class Item {
virtual int save_safe_in_field(Field *field) virtual int save_safe_in_field(Field *field)
{ return save_in_field(field); } { return save_in_field(field); }
virtual bool send(THD *thd, String *str); virtual bool send(THD *thd, String *str);
#ifdef EMBEDDED_LIBRARY
virtual bool embedded_send(const CONVERT *convert, CHARSET_INFO *charset, MEM_ROOT *alloc,
char **result, ulong *length);
#endif
virtual bool eq(const Item *, bool binary_cmp) const; virtual bool eq(const Item *, bool binary_cmp) const;
virtual Item_result result_type () const { return REAL_RESULT; } virtual Item_result result_type () const { return REAL_RESULT; }
virtual enum Type type() const =0; virtual enum Type type() const =0;
...@@ -133,6 +139,10 @@ class Item_field :public Item_ident ...@@ -133,6 +139,10 @@ class Item_field :public Item_ident
{ {
return result_field->send(thd,str_arg); return result_field->send(thd,str_arg);
} }
#ifdef EMBEDDED_LIBRARY
bool embedded_send(const CONVERT *convert, CHARSET_INFO *charset, MEM_ROOT *alloc,
char **result, ulong *length);
#endif
void make_field(Send_field *field); void make_field(Send_field *field);
bool fix_fields(THD *, struct st_table_list *, Item **); bool fix_fields(THD *, struct st_table_list *, Item **);
int save_in_field(Field *field); int save_in_field(Field *field);
...@@ -165,6 +175,10 @@ class Item_null :public Item ...@@ -165,6 +175,10 @@ class Item_null :public Item
enum Item_result result_type () const enum Item_result result_type () const
{ return STRING_RESULT; } { return STRING_RESULT; }
bool send(THD *thd, String *str); bool send(THD *thd, String *str);
#ifdef EMBEDDED_LIBRARY
bool embedded_send(const CONVERT *convert, CHARSET_INFO *charset, MEM_ROOT *alloc,
char **result, ulong *length);
#endif
bool basic_const_item() const { return 1; } bool basic_const_item() const { return 1; }
Item *new_item() { return new Item_null(name); } Item *new_item() { return new Item_null(name); }
bool is_null() { return 1; } bool is_null() { return 1; }
...@@ -428,6 +442,11 @@ class Item_ref :public Item_ident ...@@ -428,6 +442,11 @@ class Item_ref :public Item_ident
return (null_value=(*ref)->get_date(ltime,fuzzydate)); return (null_value=(*ref)->get_date(ltime,fuzzydate));
} }
bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); } bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); }
#ifdef EMBEDDED_LIBRARY
bool embedded_send(const CONVERT *convert, CHARSET_INFO *charset, MEM_ROOT *alloc,
char **result, ulong *length)
{ return (*ref)->embedded_send(convert, charset, alloc, result, length); }
#endif
void make_field(Send_field *field) { (*ref)->make_field(field); } void make_field(Send_field *field) { (*ref)->make_field(field); }
bool fix_fields(THD *, struct st_table_list *, Item **); bool fix_fields(THD *, struct st_table_list *, Item **);
int save_in_field(Field *field) { return (*ref)->save_in_field(field); } int save_in_field(Field *field) { return (*ref)->save_in_field(field); }
......
...@@ -1373,10 +1373,15 @@ String *Item_func_database::val_str(String *str) ...@@ -1373,10 +1373,15 @@ String *Item_func_database::val_str(String *str)
String *Item_func_user::val_str(String *str) String *Item_func_user::val_str(String *str)
{ {
THD *thd=current_thd; THD *thd=current_thd;
#ifdef EMBEDDED_LIBRARY
if (str->copy("localuser@localhost", (uint)strlen("localuser@localhost")))
return &empty_string;
#else
if (str->copy((const char*) thd->user,(uint) strlen(thd->user), system_charset_info) || if (str->copy((const char*) thd->user,(uint) strlen(thd->user), system_charset_info) ||
str->append('@') || str->append('@') ||
str->append(thd->host ? thd->host : thd->ip ? thd->ip : "")) str->append(thd->host ? thd->host : thd->ip ? thd->ip : ""))
return &empty_string; return &empty_string;
#endif
return str; return str;
} }
......
...@@ -867,3 +867,13 @@ inline void mark_as_null_row(TABLE *table) ...@@ -867,3 +867,13 @@ inline void mark_as_null_row(TABLE *table)
table->status|=STATUS_NULL_ROW; table->status|=STATUS_NULL_ROW;
bfill(table->null_flags,table->null_bytes,255); bfill(table->null_flags,table->null_bytes,255);
} }
#ifdef EMBEDDED_LIBRARY
int embedded_send_row(THD *thd, int n_fields, char *data, int data_len);
#define SEND_ROW(thd, n_fields, data, data_len)\
embedded_send_row(thd, n_fields, data, data_len)
#else
#define SEND_ROW(thd, n_fields, data, data_len)\
my_net_write(&thd->net, data, data_len)
#endif
This diff is collapsed.
...@@ -47,6 +47,12 @@ void send_error(THD *thd, uint sql_errno, const char *err) ...@@ -47,6 +47,12 @@ void send_error(THD *thd, uint sql_errno, const char *err)
} }
} }
} }
#ifdef EMBEDDED_LIBRARY
net->last_errno= sql_errno;
strmake(net->last_error, err, sizeof(net->last_error)-1);
#else
if (net->vio == 0) if (net->vio == 0)
{ {
if (thd->bootstrap) if (thd->bootstrap)
...@@ -69,6 +75,7 @@ void send_error(THD *thd, uint sql_errno, const char *err) ...@@ -69,6 +75,7 @@ void send_error(THD *thd, uint sql_errno, const char *err)
set_if_smaller(length,MYSQL_ERRMSG_SIZE-1); set_if_smaller(length,MYSQL_ERRMSG_SIZE-1);
} }
VOID(net_write_command(net,(uchar) 255, "", 0, (char*) err,length)); VOID(net_write_command(net,(uchar) 255, "", 0, (char*) err,length));
#endif /* EMBEDDED_LIBRARY*/
thd->fatal_error=0; // Error message is given thd->fatal_error=0; // Error message is given
thd->net.report_error= 0; thd->net.report_error= 0;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -158,6 +165,7 @@ net_printf(THD *thd, uint errcode, ...) ...@@ -158,6 +165,7 @@ net_printf(THD *thd, uint errcode, ...)
length=sizeof(net->last_error)-1; /* purecov: inspected */ length=sizeof(net->last_error)-1; /* purecov: inspected */
va_end(args); va_end(args);
#ifndef EMBEDDED_LIBRARY
if (net->vio == 0) if (net->vio == 0)
{ {
if (thd->bootstrap) if (thd->bootstrap)
...@@ -175,6 +183,10 @@ net_printf(THD *thd, uint errcode, ...) ...@@ -175,6 +183,10 @@ net_printf(THD *thd, uint errcode, ...)
if (offset) if (offset)
int2store(text_pos-2, errcode); int2store(text_pos-2, errcode);
VOID(net_real_write(net,(char*) net->buff,length+head_length+1+offset)); VOID(net_real_write(net,(char*) net->buff,length+head_length+1+offset));
#else
net->last_errno= errcode;
strmake(net->last_error, text_pos, length);
#endif
thd->fatal_error=0; // Error message is given thd->fatal_error=0; // Error message is given
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -205,6 +217,7 @@ net_printf(THD *thd, uint errcode, ...) ...@@ -205,6 +217,7 @@ net_printf(THD *thd, uint errcode, ...)
If net->no_send_ok return without sending packet If net->no_send_ok return without sending packet
*/ */
#ifndef EMBEDDED_LIBRARY
void void
send_ok(THD *thd, ha_rows affected_rows, ulonglong id, const char *message) send_ok(THD *thd, ha_rows affected_rows, ulonglong id, const char *message)
...@@ -290,6 +303,7 @@ send_eof(THD *thd, bool no_flush) ...@@ -290,6 +303,7 @@ send_eof(THD *thd, bool no_flush)
} }
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
#endif /* EMBEDDED_LIBRARY */
/**************************************************************************** /****************************************************************************
......
...@@ -2635,8 +2635,12 @@ ulong get_table_grant(THD *thd, TABLE_LIST *table) ...@@ -2635,8 +2635,12 @@ ulong get_table_grant(THD *thd, TABLE_LIST *table)
GRANT_TABLE *grant_table; GRANT_TABLE *grant_table;
rw_rdlock(&LOCK_grant); rw_rdlock(&LOCK_grant);
#ifdef EMBEDDED_LIBRARY
grant_table= NULL;
#else
grant_table = table_hash_search(thd->host,thd->ip,db,user, grant_table = table_hash_search(thd->host,thd->ip,db,user,
table->real_name,0); table->real_name,0);
#endif
table->grant.grant_table=grant_table; // Remember for column test table->grant.grant_table=grant_table; // Remember for column test
table->grant.version=grant_version; table->grant.version=grant_version;
if (grant_table) if (grant_table)
......
...@@ -195,7 +195,6 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild) ...@@ -195,7 +195,6 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild)
DBUG_RETURN(open_list); DBUG_RETURN(open_list);
} }
/* /*
Send name and type of result to client converted to a given char set Send name and type of result to client converted to a given char set
...@@ -216,6 +215,8 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild) ...@@ -216,6 +215,8 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild)
1 Error (Note that in this case the error is not sent to the client) 1 Error (Note that in this case the error is not sent to the client)
*/ */
#ifndef EMBEDDED_LIBRARY
bool bool
send_convert_fields(THD *thd,List<Item> &list,CONVERT *convert,uint flag) send_convert_fields(THD *thd,List<Item> &list,CONVERT *convert,uint flag)
{ {
...@@ -439,6 +440,7 @@ send_fields(THD *thd, List<Item> &list, uint flag) ...@@ -439,6 +440,7 @@ send_fields(THD *thd, List<Item> &list, uint flag)
DBUG_RETURN(1); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */
} }
#endif /* EMBEDDED_LIBRARY */
/***************************************************************************** /*****************************************************************************
* Functions to free open table cache * Functions to free open table cache
......
...@@ -463,6 +463,8 @@ bool select_send::send_fields(List<Item> &list,uint flag) ...@@ -463,6 +463,8 @@ bool select_send::send_fields(List<Item> &list,uint flag)
} }
#ifndef EMBEDDED_LIBRARY
/* Send data to client. Returns 0 if ok */ /* Send data to client. Returns 0 if ok */
bool select_send::send_data(List<Item> &items) bool select_send::send_data(List<Item> &items)
...@@ -497,6 +499,7 @@ bool select_send::send_data(List<Item> &items) ...@@ -497,6 +499,7 @@ bool select_send::send_data(List<Item> &items)
else else
DBUG_RETURN(1); DBUG_RETURN(1);
} }
#endif /* EMBEDDED_LIBRARY */
bool select_send::send_eof() bool select_send::send_eof()
{ {
......
...@@ -178,6 +178,9 @@ class CONVERT ...@@ -178,6 +178,9 @@ class CONVERT
convert_array(from_map, (uchar*) a,length); convert_array(from_map, (uchar*) a,length);
} }
bool store(String *, const char *,uint); bool store(String *, const char *,uint);
#ifdef EMBEDDED_LIBRARY
void convert_back(char *dest, const char *source, uint length) const;
#endif
inline uint number() { return numb; } inline uint number() { return numb; }
}; };
...@@ -335,6 +338,10 @@ class select_result; ...@@ -335,6 +338,10 @@ class select_result;
#define THD_SENTRY_MAGIC 0xfeedd1ff #define THD_SENTRY_MAGIC 0xfeedd1ff
#define THD_SENTRY_GONE 0xdeadbeef #define THD_SENTRY_GONE 0xdeadbeef
#ifdef EMBEDDED_LIBRARY
typedef struct st_mysql;
#endif
#define THD_CHECK_SENTRY(thd) DBUG_ASSERT(thd->dbug_sentry == THD_SENTRY_MAGIC) #define THD_CHECK_SENTRY(thd) DBUG_ASSERT(thd->dbug_sentry == THD_SENTRY_MAGIC)
struct system_variables struct system_variables
...@@ -393,6 +400,9 @@ class THD :public ilink { ...@@ -393,6 +400,9 @@ class THD :public ilink {
struct rand_struct rand; // used for authentication struct rand_struct rand; // used for authentication
struct system_variables variables; // Changeable local variables struct system_variables variables; // Changeable local variables
pthread_mutex_t LOCK_delete; // Locked before thd is deleted pthread_mutex_t LOCK_delete; // Locked before thd is deleted
#ifdef EMBEDDED_LIBRARY
struct st_mysql *mysql;
#endif
char *query; // Points to the current query, char *query; // Points to the current query,
/* /*
......
...@@ -233,7 +233,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -233,7 +233,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
goto err; goto err;
} }
} }
my_net_write(&thd->net, (char*)packet->ptr(), packet->length()); SEND_ROW(thd, list.elements, (char*)packet->ptr(), packet->length());
} }
} }
num_rows++; num_rows++;
......
...@@ -839,8 +839,9 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd) ...@@ -839,8 +839,9 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd)
} }
/* Execute one command from socket (query or simple command) */ #ifndef EMBEDDED_LIBRARY
/* Execute one command from socket (query or simple command) */
bool do_command(THD *thd) bool do_command(THD *thd)
{ {
char *packet; char *packet;
...@@ -878,6 +879,7 @@ bool do_command(THD *thd) ...@@ -878,6 +879,7 @@ bool do_command(THD *thd)
DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length)); DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));
} }
#endif /* EMBEDDED_LIBRARY */
bool dispatch_command(enum enum_server_command command, THD *thd, bool dispatch_command(enum enum_server_command command, THD *thd,
char* packet, uint packet_length) char* packet, uint packet_length)
...@@ -3166,7 +3168,6 @@ bool add_field_to_list(char *field_name, enum_field_types type, ...@@ -3166,7 +3168,6 @@ bool add_field_to_list(char *field_name, enum_field_types type,
case FIELD_TYPE_STRING: case FIELD_TYPE_STRING:
case FIELD_TYPE_VAR_STRING: case FIELD_TYPE_VAR_STRING:
case FIELD_TYPE_NULL: case FIELD_TYPE_NULL:
case FIELD_TYPE_GEOMETRY:
break; break;
case FIELD_TYPE_DECIMAL: case FIELD_TYPE_DECIMAL:
if (!length) if (!length)
...@@ -3179,6 +3180,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, ...@@ -3179,6 +3180,7 @@ bool add_field_to_list(char *field_name, enum_field_types type,
case FIELD_TYPE_TINY_BLOB: case FIELD_TYPE_TINY_BLOB:
case FIELD_TYPE_LONG_BLOB: case FIELD_TYPE_LONG_BLOB:
case FIELD_TYPE_MEDIUM_BLOB: case FIELD_TYPE_MEDIUM_BLOB:
case FIELD_TYPE_GEOMETRY:
if (default_value) // Allow empty as default value if (default_value) // Allow empty as default value
{ {
String str,*res; String str,*res;
...@@ -3314,7 +3316,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, ...@@ -3314,7 +3316,7 @@ bool add_field_to_list(char *field_name, enum_field_types type,
if (new_field->length >= MAX_FIELD_WIDTH || if (new_field->length >= MAX_FIELD_WIDTH ||
(!new_field->length && !(new_field->flags & BLOB_FLAG) && (!new_field->length && !(new_field->flags & BLOB_FLAG) &&
type != FIELD_TYPE_STRING && type != FIELD_TYPE_VAR_STRING)) type != FIELD_TYPE_STRING && type != FIELD_TYPE_VAR_STRING && type != FIELD_TYPE_GEOMETRY))
{ {
net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name, net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name,
MAX_FIELD_WIDTH-1); /* purecov: inspected */ MAX_FIELD_WIDTH-1); /* purecov: inspected */
......
...@@ -5354,6 +5354,9 @@ end_update(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), ...@@ -5354,6 +5354,9 @@ end_update(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
{ {
Item *item= *group->item; Item *item= *group->item;
item->save_org_in_field(group->field); item->save_org_in_field(group->field);
#ifdef EMBEDDED_LIBRARY
join->thd->net.last_errno= 0;
#endif
/* Store in the used key if the field was 0 */ /* Store in the used key if the field was 0 */
if (item->maybe_null) if (item->maybe_null)
group->buff[-1]=item->null_value ? 1 : 0; group->buff[-1]=item->null_value ? 1 : 0;
......
...@@ -52,8 +52,6 @@ extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd; ...@@ -52,8 +52,6 @@ extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd;
** Send list of databases ** Send list of databases
** A database is a directory in the mysql_data_home directory ** A database is a directory in the mysql_data_home directory
****************************************************************************/ ****************************************************************************/
int int
mysqld_show_dbs(THD *thd,const char *wild) mysqld_show_dbs(THD *thd,const char *wild)
{ {
...@@ -87,8 +85,8 @@ mysqld_show_dbs(THD *thd,const char *wild) ...@@ -87,8 +85,8 @@ mysqld_show_dbs(THD *thd,const char *wild)
{ {
packet->length(0); packet->length(0);
net_store_data(packet, thd->variables.convert_set, file_name); net_store_data(packet, thd->variables.convert_set, file_name);
if (my_net_write(&thd->net, (char*) packet->ptr(), if (SEND_ROW(thd, field_list.elements,
packet->length())) (char *)packet->ptr(), packet->length()))
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
} }
...@@ -127,7 +125,8 @@ int mysqld_show_open_tables(THD *thd,const char *wild) ...@@ -127,7 +125,8 @@ int mysqld_show_open_tables(THD *thd,const char *wild)
net_store_data(packet,convert, open_list->table); net_store_data(packet,convert, open_list->table);
net_store_data(packet,open_list->in_use); net_store_data(packet,open_list->in_use);
net_store_data(packet,open_list->locked); net_store_data(packet,open_list->locked);
if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) if (SEND_ROW(thd, field_list.elements,
(char *)packet->ptr(), packet->length()))
{ {
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
...@@ -169,7 +168,8 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild) ...@@ -169,7 +168,8 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild)
{ {
packet->length(0); packet->length(0);
net_store_data(packet, thd->variables.convert_set, file_name); net_store_data(packet, thd->variables.convert_set, file_name);
if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) if (SEND_ROW(thd, field_list.elements,
(char *)packet->ptr(), packet->length()))
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
send_eof(thd); send_eof(thd);
...@@ -635,9 +635,9 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) ...@@ -635,9 +635,9 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
} }
close_thread_tables(thd,0); close_thread_tables(thd,0);
} }
if (my_net_write(&thd->net,(char*) packet->ptr(), if (SEND_ROW(thd, field_list.elements,
packet->length())) (char *)packet->ptr(), packet->length()))
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
send_eof(thd); send_eof(thd);
DBUG_RETURN(0); DBUG_RETURN(0);
...@@ -647,7 +647,6 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) ...@@ -647,7 +647,6 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
/*************************************************************************** /***************************************************************************
** List all columns in a table_list->real_name ** List all columns in a table_list->real_name
***************************************************************************/ ***************************************************************************/
int int
mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
bool verbose) bool verbose)
...@@ -750,8 +749,8 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, ...@@ -750,8 +749,8 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
if (verbose) if (verbose)
{ {
/* Add grant options & comments */ /* Add grant options & comments */
col_access= get_column_grant(thd,table_list,field) & COL_ACLS;
end=tmp; end=tmp;
col_access= get_column_grant(thd,table_list,field) & COL_ACLS;
for (uint bitnr=0; col_access ; col_access>>=1,bitnr++) for (uint bitnr=0; col_access ; col_access>>=1,bitnr++)
{ {
if (col_access & 1) if (col_access & 1)
...@@ -763,8 +762,9 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, ...@@ -763,8 +762,9 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
net_store_data(packet,convert, tmp+1,end == tmp ? 0 : (uint) (end-tmp-1)); net_store_data(packet,convert, tmp+1,end == tmp ? 0 : (uint) (end-tmp-1));
net_store_data(packet, field->comment.str,field->comment.length); net_store_data(packet, field->comment.str,field->comment.length);
} }
if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) if (SEND_ROW(thd, field_list.elements,
DBUG_RETURN(1); (char *)packet->ptr(), packet->length()))
DBUG_RETURN(-1);
} }
} }
} }
...@@ -833,8 +833,9 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list) ...@@ -833,8 +833,9 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
int3store(p, create_len); int3store(p, create_len);
// now we are in business :-) // now we are in business :-)
if (my_net_write(&thd->net, (char*)packet->ptr(), packet->length())) if (SEND_ROW(thd, field_list.elements,
DBUG_RETURN(1); (char *)packet->ptr(), packet->length()))
DBUG_RETURN(-1);
} }
send_eof(thd); send_eof(thd);
DBUG_RETURN(0); DBUG_RETURN(0);
...@@ -956,8 +957,9 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list) ...@@ -956,8 +957,9 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list)
net_store_data(packet,convert,table->file->index_type(i)); net_store_data(packet,convert,table->file->index_type(i));
/* Comment */ /* Comment */
net_store_data(packet,convert,""); net_store_data(packet,convert,"");
if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) if (SEND_ROW(thd, field_list.elements,
DBUG_RETURN(1); /* purecov: inspected */ (char *)packet->ptr(), packet->length()))
DBUG_RETURN(-1);
} }
} }
send_eof(thd); send_eof(thd);
...@@ -1384,8 +1386,9 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) ...@@ -1384,8 +1386,9 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
net_store_data(packet,convert,thd_info->query); net_store_data(packet,convert,thd_info->query);
else else
net_store_null(packet); net_store_null(packet);
if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) if (SEND_ROW(thd, field_list.elements,
break; /* purecov: inspected */ (char *)packet->ptr(), packet->length()))
break;
} }
send_eof(thd); send_eof(thd);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -1684,8 +1687,9 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables, ...@@ -1684,8 +1687,9 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
net_store_data(&packet2, ""); // Safety net_store_data(&packet2, ""); // Safety
break; break;
} }
if (my_net_write(&thd->net, (char*) packet2.ptr(),packet2.length())) if (SEND_ROW(thd, field_list.elements,
goto err; /* purecov: inspected */ (char *)packet2.ptr(), packet2.length()))
goto err;
} }
} }
pthread_mutex_unlock(&LOCK_status); pthread_mutex_unlock(&LOCK_status);
......
...@@ -403,6 +403,16 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, ...@@ -403,6 +403,16 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
sql_field->unireg_check=Field::BLOB_FIELD; sql_field->unireg_check=Field::BLOB_FIELD;
blob_columns++; blob_columns++;
break; break;
case FIELD_TYPE_GEOMETRY:
sql_field->pack_flag=FIELDFLAG_GEOM |
pack_length_to_packflag(sql_field->pack_length -
portable_sizeof_char_ptr);
if (sql_field->flags & BINARY_FLAG)
sql_field->pack_flag|=FIELDFLAG_BINARY;
sql_field->length=8; // Unireg field length
sql_field->unireg_check=Field::BLOB_FIELD;
blob_columns++;
break;
case FIELD_TYPE_VAR_STRING: case FIELD_TYPE_VAR_STRING:
case FIELD_TYPE_STRING: case FIELD_TYPE_STRING:
sql_field->pack_flag=0; sql_field->pack_flag=0;
...@@ -1012,8 +1022,7 @@ static int send_check_errmsg(THD* thd, TABLE_LIST* table, ...@@ -1012,8 +1022,7 @@ static int send_check_errmsg(THD* thd, TABLE_LIST* table,
net_store_data(packet, "error"); net_store_data(packet, "error");
net_store_data(packet, errmsg); net_store_data(packet, errmsg);
thd->net.last_error[0]=0; thd->net.last_error[0]=0;
if (my_net_write(&thd->net, (char*) thd->packet.ptr(), if (SEND_ROW(thd, 4, (char*) thd->packet.ptr(), packet->length()))
packet->length()))
return -1; return -1;
return 1; return 1;
} }
...@@ -1183,6 +1192,9 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -1183,6 +1192,9 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
thd->open_options|= extra_open_options; thd->open_options|= extra_open_options;
table->table = open_ltable(thd, table, lock_type); table->table = open_ltable(thd, table, lock_type);
#ifdef EMBEDDED_LIBRARY
thd->net.last_errno= 0; // these errors shouldn't get client
#endif
thd->open_options&= ~extra_open_options; thd->open_options&= ~extra_open_options;
packet->length(0); packet->length(0);
if (prepare_func) if (prepare_func)
...@@ -1204,7 +1216,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -1204,7 +1216,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
err_msg=ER(ER_CHECK_NO_SUCH_TABLE); err_msg=ER(ER_CHECK_NO_SUCH_TABLE);
net_store_data(packet, err_msg); net_store_data(packet, err_msg);
thd->net.last_error[0]=0; thd->net.last_error[0]=0;
if (my_net_write(&thd->net, (char*) thd->packet.ptr(), if (SEND_ROW(thd, field_list.elements, (char*) thd->packet.ptr(),
packet->length())) packet->length()))
goto err; goto err;
continue; continue;
...@@ -1219,7 +1231,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -1219,7 +1231,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
net_store_data(packet, buff); net_store_data(packet, buff);
close_thread_tables(thd); close_thread_tables(thd);
table->table=0; // For query cache table->table=0; // For query cache
if (my_net_write(&thd->net, (char*) thd->packet.ptr(), if (SEND_ROW(thd, field_list.elements, (char*) thd->packet.ptr(),
packet->length())) packet->length()))
goto err; goto err;
continue; continue;
...@@ -1248,6 +1260,9 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -1248,6 +1260,9 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
} }
int result_code = (table->table->file->*operator_func)(thd, check_opt); int result_code = (table->table->file->*operator_func)(thd, check_opt);
#ifdef EMBEDDED_LIBRARY
thd->net.last_errno= 0; // these errors shouldn't get client
#endif
packet->length(0); packet->length(0);
net_store_data(packet, table_name); net_store_data(packet, table_name);
net_store_data(packet, operator_name); net_store_data(packet, operator_name);
...@@ -1303,8 +1318,8 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -1303,8 +1318,8 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
} }
close_thread_tables(thd); close_thread_tables(thd);
table->table=0; // For query cache table->table=0; // For query cache
if (my_net_write(&thd->net, (char*) packet->ptr(), if (SEND_ROW(thd, field_list.elements,
packet->length())) (char *)thd->packet.ptr(), thd->packet.length()))
goto err; goto err;
} }
......
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