summaryrefslogtreecommitdiff
path: root/libmysql
diff options
context:
space:
mode:
authormonty@mysql.com <>2004-10-29 19:26:52 +0300
committermonty@mysql.com <>2004-10-29 19:26:52 +0300
commitafbe601302fc59c498437321b296ed6c8d360564 (patch)
tree23bcc9a71fe7237887a111b158e30f5a6bb665d3 /libmysql
parent67456bb970cc949ceb5779b230592e455843c35c (diff)
parent541883f9d89a8d38affba60bf9506289a6232da1 (diff)
downloadmariadb-git-afbe601302fc59c498437321b296ed6c8d360564.tar.gz
merge with 4.1
Diffstat (limited to 'libmysql')
-rw-r--r--libmysql/Makefile.shared2
-rw-r--r--libmysql/client_settings.h3
-rw-r--r--libmysql/errmsg.c12
-rw-r--r--libmysql/libmysql.c287
-rw-r--r--libmysql/libmysql.def1
-rw-r--r--libmysql/manager.c2
6 files changed, 197 insertions, 110 deletions
diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared
index 389e8e9ff34..9664fb0abef 100644
--- a/libmysql/Makefile.shared
+++ b/libmysql/Makefile.shared
@@ -46,7 +46,7 @@ mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \
ctype-win1250ch.lo ctype-utf8.lo ctype-extra.lo \
ctype-ucs2.lo ctype-gb2312.lo ctype-gbk.lo \
ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo \
- ctype-uca.lo xml.lo
+ ctype-uca.lo xml.lo my_strtoll10.lo
mystringsextra= strto.c
dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo
diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h
index a29f52ce366..375e75919a4 100644
--- a/libmysql/client_settings.h
+++ b/libmysql/client_settings.h
@@ -21,7 +21,7 @@ extern my_string mysql_unix_port;
CLIENT_TRANSACTIONS | \
CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION)
-sig_handler pipe_sig_handler(int sig __attribute__((unused)));
+sig_handler pipe_sig_handler(int sig);
void read_user_name(char *name);
my_bool handle_local_infile(MYSQL *mysql, const char *net_filename);
@@ -42,6 +42,7 @@ my_bool handle_local_infile(MYSQL *mysql, const char *net_filename);
void mysql_read_default_options(struct st_mysql_options *options,
const char *filename,const char *group);
+void mysql_detach_stmt_list(LIST **stmt_list);
MYSQL *
cli_mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db,
diff --git a/libmysql/errmsg.c b/libmysql/errmsg.c
index 82040100ded..710bf4ccd8d 100644
--- a/libmysql/errmsg.c
+++ b/libmysql/errmsg.c
@@ -42,7 +42,7 @@ const char *client_errors[]=
"Error in server handshake",
"Lost connection to MySQL server during query",
"Commands out of sync; you can't run this command now",
- "Verbindung ueber Named Pipe; Host: %-.100s",
+ "Verbindung ueber Named Pipe: %-.32s",
"Kann nicht auf Named Pipe warten. Host: %-.64s pipe: %-.32s (%lu)",
"Kann Named Pipe nicht oeffnen. Host: %-.64s pipe: %-.32s (%lu)",
"Kann den Status der Named Pipe nicht setzen. Host: %-.64s pipe: %-.32s (%lu)",
@@ -64,7 +64,7 @@ const char *client_errors[]=
"Invalid parameter number",
"Can't send long data for non-string/non-binary data types (parameter: %d)",
"Using unsupported buffer type: %d (parameter: %d)",
- "Shared memory (%lu)",
+ "Shared memory: %-.100s",
"Can't open shared memory; client could not create request event (%lu)",
"Can't open shared memory; no answer event received from server (%lu)",
"Can't open shared memory; server could not allocate file mapping (%lu)",
@@ -101,7 +101,7 @@ const char *client_errors[]=
"Erro na negociação de acesso ao servidor",
"Conexão perdida com servidor MySQL durante 'query'",
"Comandos fora de sincronismo; você não pode executar este comando agora",
- "%-.100s via 'named pipe'",
+ "Named pipe: %-.32s",
"Não pode esperar pelo 'named pipe' para o 'host' %-.64s - 'pipe' %-.32s (%lu)",
"Não pode abrir 'named pipe' para o 'host' %-.64s - 'pipe' %-.32s (%lu)",
"Não pode estabelecer o estado do 'named pipe' para o 'host' %-.64s - 'pipe' %-.32s (%lu)",
@@ -123,7 +123,7 @@ const char *client_errors[]=
"Invalid parameter number",
"Can't send long data for non-string/non-binary data types (parameter: %d)",
"Using unsupported buffer type: %d (parameter: %d)",
- "Shared memory (%lu)",
+ "Shared memory: %-.100s",
"Can't open shared memory; client could not create request event (%lu)",
"Can't open shared memory; no answer event received from server (%lu)",
"Can't open shared memory; server could not allocate file mapping (%lu)",
@@ -158,7 +158,7 @@ const char *client_errors[]=
"Error in server handshake",
"Lost connection to MySQL server during query",
"Commands out of sync; you can't run this command now",
- "%-.100s via named pipe",
+ "Named pipe: %-.32s",
"Can't wait for named pipe to host: %-.64s pipe: %-.32s (%lu)",
"Can't open named pipe to host: %-.64s pipe: %-.32s (%lu)",
"Can't set state of named pipe to host: %-.64s pipe: %-.32s (%lu)",
@@ -180,7 +180,7 @@ const char *client_errors[]=
"Invalid parameter number",
"Can't send long data for non-string/non-binary data types (parameter: %d)",
"Using unsupported buffer type: %d (parameter: %d)",
- "Shared memory (%lu)",
+ "Shared memory: %-.100s",
"Can't open shared memory; client could not create request event (%lu)",
"Can't open shared memory; no answer event received from server (%lu)",
"Can't open shared memory; server could not allocate file mapping (%lu)",
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index fcea9288283..35d01b5bcec 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -662,6 +662,7 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
const char *passwd, const char *db)
{
char buff[512],*end=buff;
+ int rc;
DBUG_ENTER("mysql_change_user");
if (!user)
@@ -695,18 +696,26 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
/* Write authentication package */
simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (end-buff),1);
- if ((*mysql->methods->read_change_user_result)(mysql, buff, passwd))
- DBUG_RETURN(1);
- /* Free old connect information */
- my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
- my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
- my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
-
- /* alloc new connect information */
- mysql->user= my_strdup(user,MYF(MY_WME));
- mysql->passwd=my_strdup(passwd,MYF(MY_WME));
- mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0;
- DBUG_RETURN(0);
+ rc= (*mysql->methods->read_change_user_result)(mysql, buff, passwd);
+
+ /*
+ The server will close all statements no matter was the attempt
+ to change user successful or not.
+ */
+ mysql_detach_stmt_list(&mysql->stmts);
+ if (rc == 0)
+ {
+ /* Free old connect information */
+ my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
+ my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
+ my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
+
+ /* alloc new connect information */
+ mysql->user= my_strdup(user,MYF(MY_WME));
+ mysql->passwd=my_strdup(passwd,MYF(MY_WME));
+ mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0;
+ }
+ DBUG_RETURN(rc);
}
#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)
@@ -1507,6 +1516,16 @@ uint STDCALL mysql_thread_safe(void)
#endif
}
+
+my_bool STDCALL mysql_embedded(void)
+{
+#ifdef EMBEDDED_LIBRARY
+ return 1;
+#else
+ return 0;
+#endif
+}
+
/****************************************************************************
Some support functions
****************************************************************************/
@@ -1525,6 +1544,40 @@ void my_net_local_init(NET *net)
}
/*
+ This function is used to create HEX string that you
+ can use in a SQL statement in of the either ways:
+ INSERT INTO blob_column VALUES (0xAABBCC); (any MySQL version)
+ INSERT INTO blob_column VALUES (X'AABBCC'); (4.1 and higher)
+
+ The string in "from" is encoded to a HEX string.
+ The result is placed in "to" and a terminating null byte is appended.
+
+ The string pointed to by "from" must be "length" bytes long.
+ You must allocate the "to" buffer to be at least length*2+1 bytes long.
+ Each character needs two bytes, and you need room for the terminating
+ null byte. When mysql_hex_string() returns, the contents of "to" will
+ be a null-terminated string. The return value is the length of the
+ encoded string, not including the terminating null character.
+
+ The return value does not contain any leading 0x or a leading X' and
+ trailing '. The caller must supply whichever of those is desired.
+*/
+
+ulong mysql_hex_string(char *to, const char *from, ulong length)
+{
+ char *to0= to;
+ const char *end;
+
+ for (end= from + length; from < end; from++)
+ {
+ *to++= _dig_vec_upper[((unsigned char) *from) >> 4];
+ *to++= _dig_vec_upper[((unsigned char) *from) & 0x0F];
+ }
+ *to= '\0';
+ return (ulong) (to-to0);
+}
+
+/*
Add escape characters to a string (blob?) to make it suitable for a insert
to should at least have place for length*2+1 chars
Returns the length of the to string
@@ -1700,20 +1753,23 @@ static void stmt_update_metadata(MYSQL_STMT *stmt, MYSQL_ROWS *data);
*/
#define MAX_DATETIME_REP_LENGTH 12
+#define MAX_DOUBLE_STRING_REP_LENGTH 331
/**************** Misc utility functions ****************************/
/*
- Reallocate the NET package to be at least of 'length' bytes
+ Reallocate the NET package to have at least length bytes available.
SYNPOSIS
- my_realloc_str()
- net The NET structure to modify
- length Ensure that net->buff is at least this big
+ my_realloc_str()
+ net The NET structure to modify.
+ length Ensure that net->buff has space for at least
+ this number of bytes.
RETURN VALUES
- 0 ok
- 1 Error
+ 0 Success.
+ 1 Error, i.e. out of memory or requested packet size is bigger
+ than max_allowed_packet. The error code is stored in net->last_errno.
*/
static my_bool my_realloc_str(NET *net, ulong length)
@@ -1826,6 +1882,7 @@ my_bool cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt)
}
stmt->field_count= (uint) field_count;
stmt->param_count= (ulong) param_count;
+ mysql->warning_count= 0;
DBUG_RETURN(0);
}
@@ -1859,14 +1916,14 @@ MYSQL_STMT * STDCALL mysql_prepare(MYSQL *mysql, const char *query,
a server-side prepared statement. Memory for this structure (~700
bytes) is allocated using 'malloc'. Once created, the handle can be
reused many times. Created statement handle is bound to connection
- handle provided to this call: it's lifetime is limited by lifetime
+ handle provided to this call: its lifetime is limited by lifetime
of connection.
'mysql_stmt_init()' is a pure local call, server side structure is
created only in mysql_stmt_prepare.
Next steps you may want to make:
- set a statement attribute (mysql_stmt_attr_set()),
- prepare statement handle with a query (mysql_stmt_prepare()),
- - close statement handle and free it's memory (mysql_stmt_close()),
+ - close statement handle and free its memory (mysql_stmt_close()),
- reset statement with mysql_stmt_reset() (a no-op which will
just return).
Behaviour of the rest of API calls on this statement is not defined yet
@@ -2366,7 +2423,7 @@ static my_bool store_param(MYSQL_STMT *stmt, MYSQL_BIND *param)
*/
if ((my_realloc_str(net, *param->length)))
{
- set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate);
+ set_stmt_error(stmt, net->last_errno, unknown_sqlstate);
DBUG_RETURN(1);
}
(*param->store_param_func)(net, param);
@@ -2429,6 +2486,11 @@ int cli_stmt_execute(MYSQL_STMT *stmt)
net_clear(net); /* Sets net->write_pos */
/* Reserve place for null-marker bytes */
null_count= (stmt->param_count+7) /8;
+ if (my_realloc_str(net, null_count + 1))
+ {
+ set_stmt_error(stmt, net->last_errno, unknown_sqlstate);
+ DBUG_RETURN(1);
+ }
bzero((char*) net->write_pos, null_count);
net->write_pos+= null_count;
param_end= stmt->params + stmt->param_count;
@@ -2437,6 +2499,11 @@ int cli_stmt_execute(MYSQL_STMT *stmt)
*(net->write_pos)++= (uchar) stmt->send_types_to_server;
if (stmt->send_types_to_server)
{
+ if (my_realloc_str(net, 2 * stmt->param_count))
+ {
+ set_stmt_error(stmt, net->last_errno, unknown_sqlstate);
+ DBUG_RETURN(1);
+ }
/*
Store types of parameters in first in first package
that is sent to the server.
@@ -2635,7 +2702,7 @@ stmt_read_row_no_data(MYSQL_STMT *stmt __attribute__((unused)),
mysql_stmt_attr_get()
mysql_stmt_attr_set()
- attr_type statemenet attribute
+ attr_type statement attribute
value casted to const void * pointer to value.
RETURN VALUE
@@ -2737,7 +2804,7 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt)
mysql_stmt_free_result(stmt);
/*
No need to check for stmt->state: if the statement wasn't
- prepared we'll get 'unknown statemenet handler' error from server.
+ prepared we'll get 'unknown statement handler' error from server.
*/
if (mysql->methods->stmt_execute(stmt))
DBUG_RETURN(1);
@@ -2870,7 +2937,7 @@ static my_bool int_is_null_false= 0;
By properly initializing bind array you can bind virtually any
C language type to statement's placeholders:
First, it's strongly recommended to always zero-initialize entire
- bind structure before setting it's members. This will both shorten
+ bind structure before setting its members. This will both shorten
your application code and make it robust to future extensions of
MYSQL_BIND structure.
Then you need to assign typecode of your application buffer to
@@ -3244,24 +3311,20 @@ mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number,
read_binary_{date,time,datetime}()
tm MYSQL_TIME structure to fill
pos pointer to current position in network buffer.
- These functions increase pos to point to the beginning of this
- field (this is just due to implementation of net_field_length
- which is used to get length of binary representation of
- time value).
+ These functions increase pos to point to the beginning of the
+ next column.
Auxiliary functions to read time (date, datetime) values from network
buffer and store in MYSQL_TIME structure. Jointly used by conversion
and no-conversion fetching.
*/
-static uint read_binary_time(MYSQL_TIME *tm, uchar **pos)
+static void read_binary_time(MYSQL_TIME *tm, uchar **pos)
{
- uint length;
-
/* net_field_length will set pos to the first byte of data */
- if (!(length= net_field_length(pos)))
- set_zero_time(tm);
- else
+ uint length= net_field_length(pos);
+
+ if (length)
{
uchar *to= *pos;
tm->neg= (bool) to[0];
@@ -3271,20 +3334,25 @@ static uint read_binary_time(MYSQL_TIME *tm, uchar **pos)
tm->minute= (uint) to[6];
tm->second= (uint) to[7];
tm->second_part= (length > 8) ? (ulong) sint4korr(to+8) : 0;
-
tm->year= tm->month= 0;
- tm->time_type= MYSQL_TIMESTAMP_TIME;
+ if (tm->day)
+ {
+ /* Convert days to hours at once */
+ tm->hour+= tm->day*24;
+ tm->day= 0;
+ }
+ *pos+= length;
}
- return length;
+ else
+ set_zero_time(tm);
+ tm->time_type= MYSQL_TIMESTAMP_TIME;
}
-static uint read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
+static void read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
{
- uint length;
+ uint length= net_field_length(pos);
- if (!(length= net_field_length(pos)))
- set_zero_time(tm);
- else
+ if (length)
{
uchar *to= *pos;
@@ -3302,18 +3370,19 @@ static uint read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
else
tm->hour= tm->minute= tm->second= 0;
tm->second_part= (length > 7) ? (ulong) sint4korr(to+7) : 0;
- tm->time_type= MYSQL_TIMESTAMP_DATETIME;
+
+ *pos+= length;
}
- return length;
+ else
+ set_zero_time(tm);
+ tm->time_type= MYSQL_TIMESTAMP_DATETIME;
}
-static uint read_binary_date(MYSQL_TIME *tm, uchar **pos)
+static void read_binary_date(MYSQL_TIME *tm, uchar **pos)
{
- uint length;
+ uint length= net_field_length(pos);
- if (!(length= net_field_length(pos)))
- set_zero_time(tm);
- else
+ if (length)
{
uchar *to= *pos;
tm->year = (uint) sint2korr(to);
@@ -3323,9 +3392,12 @@ static uint read_binary_date(MYSQL_TIME *tm, uchar **pos)
tm->hour= tm->minute= tm->second= 0;
tm->second_part= 0;
tm->neg= 0;
- tm->time_type= MYSQL_TIMESTAMP_DATE;
+
+ *pos+= length;
}
- return length;
+ else
+ set_zero_time(tm);
+ tm->time_type= MYSQL_TIMESTAMP_DATE;
}
@@ -3492,7 +3564,16 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
char buff[22]; /* Enough for longlong */
char *end= longlong10_to_str(value, buff, field_is_unsigned ? 10: -10);
/* Resort to string conversion which supports all typecodes */
- fetch_string_with_conversion(param, buff, (uint) (end - buff));
+ uint length= (uint) (end-buff);
+
+ if (field->flags & ZEROFILL_FLAG && length < field->length &&
+ field->length < 21)
+ {
+ bmove_upp((char*) buff+field->length,buff+length, length);
+ bfill((char*) buff, field->length - length,'0');
+ length= field->length;
+ }
+ fetch_string_with_conversion(param, buff, length);
break;
}
}
@@ -3552,14 +3633,21 @@ static void fetch_float_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
floating point -> string conversion nicely, honor all typecodes
and param->offset possibly set in mysql_stmt_fetch_column
*/
- char buff[331];
+ char buff[MAX_DOUBLE_STRING_REP_LENGTH];
char *end;
/* TODO: move this to a header shared between client and server. */
#define NOT_FIXED_DEC 31
- if (field->decimals >= 31)
+ if (field->decimals >= NOT_FIXED_DEC)
#undef NOT_FIXED_DEC
{
- sprintf(buff, "%-*.*g", (int) param->buffer_length, width, value);
+ /*
+ The 14 below is to ensure that the server and client has the same
+ precisions. This will ensure that on the same machine you get the
+ same value as a string independent of the protocol you use.
+ */
+ sprintf(buff, "%-*.*g", (int) min(sizeof(buff)-1,
+ param->buffer_length),
+ min(14,width), value);
end= strcend(buff, ' ');
*end= 0;
}
@@ -3602,28 +3690,8 @@ static void fetch_datetime_with_conversion(MYSQL_BIND *param,
Convert time value to string and delegate the rest to
fetch_string_with_conversion:
*/
- char buff[25];
- uint length;
-
- switch (time->time_type) {
- case MYSQL_TIMESTAMP_DATE:
- length= my_sprintf(buff,(buff, "%04d-%02d-%02d",
- time->year, time->month, time->day));
- break;
- case MYSQL_TIMESTAMP_DATETIME:
- length= my_sprintf(buff,(buff, "%04d-%02d-%02d %02d:%02d:%02d",
- time->year, time->month, time->day,
- time->hour, time->minute, time->second));
- break;
- case MYSQL_TIMESTAMP_TIME:
- length= my_sprintf(buff, (buff, "%02d:%02d:%02d",
- time->hour, time->minute, time->second));
- break;
- default:
- length= 0;
- buff[0]='\0';
- break;
- }
+ char buff[MAX_DATE_STRING_REP_LENGTH];
+ uint length= my_TIME_to_str(time, buff);
/* Resort to string conversion */
fetch_string_with_conversion(param, (char *)buff, length);
break;
@@ -3651,18 +3719,18 @@ static void fetch_datetime_with_conversion(MYSQL_BIND *param,
static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
uchar **row)
{
- ulong length;
enum enum_field_types field_type= field->type;
uint field_is_unsigned= field->flags & UNSIGNED_FLAG;
switch (field_type) {
case MYSQL_TYPE_TINY:
{
- char value= (char) **row;
- longlong data= field_is_unsigned ? (longlong) (unsigned char) value :
- (longlong) value;
+ uchar value= **row;
+ /* sic: we need to cast to 'signed char' as 'char' may be unsigned */
+ longlong data= field_is_unsigned ? (longlong) value :
+ (longlong) (signed char) value;
fetch_long_with_conversion(param, field, data);
- length= 1;
+ *row+= 1;
break;
}
case MYSQL_TYPE_SHORT:
@@ -3672,7 +3740,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
longlong data= field_is_unsigned ? (longlong) (unsigned short) value :
(longlong) value;
fetch_long_with_conversion(param, field, data);
- length= 2;
+ *row+= 2;
break;
}
case MYSQL_TYPE_INT24: /* mediumint is sent as 4 bytes int */
@@ -3682,14 +3750,14 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
longlong data= field_is_unsigned ? (longlong) (unsigned long) value :
(longlong) value;
fetch_long_with_conversion(param, field, data);
- length= 4;
+ *row+= 4;
break;
}
case MYSQL_TYPE_LONGLONG:
{
longlong value= (longlong)sint8korr(*row);
fetch_long_with_conversion(param, field, value);
- length= 8;
+ *row+= 8;
break;
}
case MYSQL_TYPE_FLOAT:
@@ -3697,7 +3765,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
float value;
float4get(value,*row);
fetch_float_with_conversion(param, field, value, FLT_DIG);
- length= 4;
+ *row+= 4;
break;
}
case MYSQL_TYPE_DOUBLE:
@@ -3705,14 +3773,14 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
double value;
float8get(value,*row);
fetch_float_with_conversion(param, field, value, DBL_DIG);
- length= 8;
+ *row+= 8;
break;
}
case MYSQL_TYPE_DATE:
{
MYSQL_TIME tm;
- length= read_binary_date(&tm, row);
+ read_binary_date(&tm, row);
fetch_datetime_with_conversion(param, &tm);
break;
}
@@ -3720,7 +3788,7 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
{
MYSQL_TIME tm;
- length= read_binary_time(&tm, row);
+ read_binary_time(&tm, row);
fetch_datetime_with_conversion(param, &tm);
break;
}
@@ -3729,16 +3797,18 @@ static void fetch_result_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
{
MYSQL_TIME tm;
- length= read_binary_datetime(&tm, row);
+ read_binary_datetime(&tm, row);
fetch_datetime_with_conversion(param, &tm);
break;
}
default:
- length= net_field_length(row);
+ {
+ ulong length= net_field_length(row);
fetch_string_with_conversion(param, (char*) *row, length);
+ *row+= length;
break;
}
- *row+= length;
+ }
}
@@ -3807,19 +3877,19 @@ static void fetch_result_double(MYSQL_BIND *param, uchar **row)
static void fetch_result_time(MYSQL_BIND *param, uchar **row)
{
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
- *row+= read_binary_time(tm, row);
+ read_binary_time(tm, row);
}
static void fetch_result_date(MYSQL_BIND *param, uchar **row)
{
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
- *row+= read_binary_date(tm, row);
+ read_binary_date(tm, row);
}
static void fetch_result_datetime(MYSQL_BIND *param, uchar **row)
{
MYSQL_TIME *tm= (MYSQL_TIME *)param->buffer;
- *row+= read_binary_datetime(tm, row);
+ read_binary_datetime(tm, row);
}
static void fetch_result_bin(MYSQL_BIND *param, uchar **row)
@@ -3888,12 +3958,12 @@ my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
{
MYSQL_BIND *param, *end;
MYSQL_FIELD *field;
- ulong bind_count;
+ ulong bind_count= stmt->field_count;
uint param_count= 0;
DBUG_ENTER("mysql_stmt_bind_result");
- DBUG_ASSERT(stmt != 0);
+ DBUG_PRINT("enter",("field_count: %d", bind_count));
- if (!stmt->field_count)
+ if (!bind_count)
{
if ((int) stmt->state < (int) MYSQL_STMT_PREPARE_DONE)
{
@@ -3901,7 +3971,6 @@ my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
}
DBUG_RETURN(0);
}
- bind_count= stmt->field_count;
/*
We only need to check that stmt->field_count - if it is not null
@@ -3914,6 +3983,8 @@ my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
param < end ;
param++, field++)
{
+ DBUG_PRINT("info",("buffer_type: %u field_type: %u",
+ (uint) param->buffer_type, (uint) field->type));
/*
Set param->is_null to point to a dummy variable if it's not set.
This is to make the execute code easier
@@ -3996,32 +4067,43 @@ my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)
switch (field->type) {
case MYSQL_TYPE_NULL: /* for dummy binds */
param->pack_length= 0;
+ field->max_length= 0;
break;
case MYSQL_TYPE_TINY:
param->pack_length= 1;
+ field->max_length= 4; /* as in '-127' */
break;
case MYSQL_TYPE_YEAR:
case MYSQL_TYPE_SHORT:
param->pack_length= 2;
+ field->max_length= 6; /* as in '-32767' */
break;
case MYSQL_TYPE_INT24:
+ field->max_length= 9; /* as in '16777216' or in '-8388607' */
+ param->pack_length= 4;
+ break;
case MYSQL_TYPE_LONG:
+ field->max_length= 11; /* '-2147483647' */
param->pack_length= 4;
break;
case MYSQL_TYPE_LONGLONG:
+ field->max_length= 21; /* '18446744073709551616' */
param->pack_length= 8;
break;
case MYSQL_TYPE_FLOAT:
param->pack_length= 4;
+ field->max_length= MAX_DOUBLE_STRING_REP_LENGTH;
break;
case MYSQL_TYPE_DOUBLE:
param->pack_length= 8;
+ field->max_length= MAX_DOUBLE_STRING_REP_LENGTH;
break;
case MYSQL_TYPE_TIME:
case MYSQL_TYPE_DATE:
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_TIMESTAMP:
param->skip_result= skip_result_with_length;
+ field->max_length= MAX_DATE_STRING_REP_LENGTH;
break;
case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_ENUM:
@@ -4241,6 +4323,8 @@ int cli_read_binary_rows(MYSQL_STMT *stmt)
*prev_ptr= 0;
mysql->warning_count= uint2korr(cp+1);
mysql->server_status= uint2korr(cp+3);
+ DBUG_PRINT("info",("status: %u warning_count: %u",
+ mysql->server_status, mysql->warning_count));
DBUG_RETURN(0);
}
}
@@ -4336,11 +4420,12 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
bind < end ;
bind++, field++)
{
- bind->buffer_type= field->type;
+ bind->buffer_type= MYSQL_TYPE_NULL;
bind->buffer_length=1;
}
- mysql_stmt_bind_result(stmt, stmt->bind);
+ if (mysql_stmt_bind_result(stmt, stmt->bind))
+ DBUG_RETURN(1);
stmt->bind_result_done= 0; /* No normal bind done */
}
diff --git a/libmysql/libmysql.def b/libmysql/libmysql.def
index 38ac9505e4b..bc91e90a41c 100644
--- a/libmysql/libmysql.def
+++ b/libmysql/libmysql.def
@@ -144,3 +144,4 @@ EXPORTS
mysql_rpl_probe
mysql_rpl_query_type
mysql_slave_query
+ mysql_embedded
diff --git a/libmysql/manager.c b/libmysql/manager.c
index f030eb17889..631bfa26cb2 100644
--- a/libmysql/manager.c
+++ b/libmysql/manager.c
@@ -237,7 +237,7 @@ int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, char* res_buf,
char* res_buf_end=res_buf+res_buf_size;
char* net_buf=(char*) con->net.read_pos, *net_buf_end;
int res_buf_shift=RES_BUF_SHIFT;
- uint num_bytes;
+ ulong num_bytes;
if (res_buf_size<RES_BUF_SHIFT)
{