summaryrefslogtreecommitdiff
path: root/sql/protocol.cc
diff options
context:
space:
mode:
authorunknown <konstantin@mysql.com>2004-06-09 03:21:50 +0400
committerunknown <konstantin@mysql.com>2004-06-09 03:21:50 +0400
commit27eda71204700eb6953205baf47d9cbeb4d367c1 (patch)
treeee6932d9f7ccdd66f6ccf84333180de34e7ac2a4 /sql/protocol.cc
parent5cc410bb70dca2fad9dd7452ef294e1020186dda (diff)
downloadmariadb-git-27eda71204700eb6953205baf47d9cbeb4d367c1.tar.gz
Proposed fix for Bug#4026 "Microseconds part of TIME/DATETIME types
is broken (prepared statements)": fixed date handling in many places of prepared statements code. libmysql/libmysql.c: Fix for Bug#4026: - now buffer_length is defined for any buffer type. Network buffer preallocation cleaned up. - added constants for maximum buffer sizes necessary for MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME types. - TIME/DATETIME packing/unpacking functions fixed - now result set metadata is always updated from fields sent to COM_EXECUTE. This is necessary to make 'SELECT ?' queries work without conversions. sql/item.cc: - added implementatoin of Item_param::get_date sql/item.h: - added enum_field_types Item_param::param_type. First step for proper handling of placeholders. - added get_date() implementation to prevent date -> string -> date conversions when MYSQL_TYPE_DATE/DATETIME parameter is used in temporal context. sql/protocol.cc: Fix for Bug#4026: - PACKET_BUFFET_EXTRA_ALLOC -> PACKET_BUFFER_EXTRA_ALLOC. The define itself was moved to .cc as it's used only in protocol.cc - fixed Protocol_prep::store_time() call. sql/protocol.h: - PACKET_BUFFER_EXTRA_ALLOC moved to protocol.cc sql/sql_prepare.cc: Fix for Bug#4026: - MYSQL_TYPE_TIME/DATETIME handling fixed. - added initialization for Item_param::param_type in setup_one_conversion_function tests/client_test.c: Test case for Bug#4026
Diffstat (limited to 'sql/protocol.cc')
-rw-r--r--sql/protocol.cc24
1 files changed, 13 insertions, 11 deletions
diff --git a/sql/protocol.cc b/sql/protocol.cc
index 44fc4eff9ad..7738349c742 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -26,6 +26,8 @@
#include "mysql_priv.h"
#include <stdarg.h>
+static const unsigned int PACKET_BUFFER_EXTRA_ALLOC= 1024;
+
#ifndef EMBEDDED_LIBRARY
bool Protocol::net_store_data(const char *from, uint length)
#else
@@ -687,7 +689,7 @@ bool Protocol_simple::store_null()
#endif
char buff[1];
buff[0]= (char)251;
- return packet->append(buff, sizeof(buff), PACKET_BUFFET_EXTRA_ALLOC);
+ return packet->append(buff, sizeof(buff), PACKET_BUFFER_EXTRA_ALLOC);
}
#endif
@@ -990,7 +992,7 @@ bool Protocol_prep::store_tiny(longlong from)
char buff[1];
field_pos++;
buff[0]= (uchar) from;
- return packet->append(buff, sizeof(buff), PACKET_BUFFET_EXTRA_ALLOC);
+ return packet->append(buff, sizeof(buff), PACKET_BUFFER_EXTRA_ALLOC);
}
@@ -1002,7 +1004,7 @@ bool Protocol_prep::store_short(longlong from)
field_types[field_pos] == MYSQL_TYPE_YEAR);
#endif
field_pos++;
- char *to= packet->prep_append(2, PACKET_BUFFET_EXTRA_ALLOC);
+ char *to= packet->prep_append(2, PACKET_BUFFER_EXTRA_ALLOC);
if (!to)
return 1;
int2store(to, (int) from);
@@ -1018,7 +1020,7 @@ bool Protocol_prep::store_long(longlong from)
field_types[field_pos] == MYSQL_TYPE_LONG);
#endif
field_pos++;
- char *to= packet->prep_append(4, PACKET_BUFFET_EXTRA_ALLOC);
+ char *to= packet->prep_append(4, PACKET_BUFFER_EXTRA_ALLOC);
if (!to)
return 1;
int4store(to, from);
@@ -1033,7 +1035,7 @@ bool Protocol_prep::store_longlong(longlong from, bool unsigned_flag)
field_types[field_pos] == MYSQL_TYPE_LONGLONG);
#endif
field_pos++;
- char *to= packet->prep_append(8, PACKET_BUFFET_EXTRA_ALLOC);
+ char *to= packet->prep_append(8, PACKET_BUFFER_EXTRA_ALLOC);
if (!to)
return 1;
int8store(to, from);
@@ -1048,7 +1050,7 @@ bool Protocol_prep::store(float from, uint32 decimals, String *buffer)
field_types[field_pos] == MYSQL_TYPE_FLOAT);
#endif
field_pos++;
- char *to= packet->prep_append(4, PACKET_BUFFET_EXTRA_ALLOC);
+ char *to= packet->prep_append(4, PACKET_BUFFER_EXTRA_ALLOC);
if (!to)
return 1;
float4store(to, from);
@@ -1063,7 +1065,7 @@ bool Protocol_prep::store(double from, uint32 decimals, String *buffer)
field_types[field_pos] == MYSQL_TYPE_DOUBLE);
#endif
field_pos++;
- char *to= packet->prep_append(8, PACKET_BUFFET_EXTRA_ALLOC);
+ char *to= packet->prep_append(8, PACKET_BUFFER_EXTRA_ALLOC);
if (!to)
return 1;
float8store(to, from);
@@ -1112,7 +1114,7 @@ bool Protocol_prep::store(TIME *tm)
else
length=0;
buff[0]=(char) length; // Length is stored first
- return packet->append(buff, length+1, PACKET_BUFFET_EXTRA_ALLOC);
+ return packet->append(buff, length+1, PACKET_BUFFER_EXTRA_ALLOC);
}
bool Protocol_prep::store_date(TIME *tm)
@@ -1129,7 +1131,7 @@ bool Protocol_prep::store_time(TIME *tm)
DBUG_ASSERT(field_types == 0 ||
field_types[field_pos] == MYSQL_TYPE_TIME);
#endif
- char buff[15],*pos;
+ char buff[13], *pos;
uint length;
field_pos++;
pos= buff+1;
@@ -1140,13 +1142,13 @@ bool Protocol_prep::store_time(TIME *tm)
pos[7]= (uchar) tm->second;
int4store(pos+8, tm->second_part);
if (tm->second_part)
- length=11;
+ length=12;
else if (tm->hour || tm->minute || tm->second || tm->day)
length=8;
else
length=0;
buff[0]=(char) length; // Length is stored first
- return packet->append(buff, length+1, PACKET_BUFFET_EXTRA_ALLOC);
+ return packet->append(buff, length+1, PACKET_BUFFER_EXTRA_ALLOC);
}
#ifdef EMBEDDED_LIBRARY