diff options
author | unknown <konstantin@mysql.com> | 2004-06-09 03:21:50 +0400 |
---|---|---|
committer | unknown <konstantin@mysql.com> | 2004-06-09 03:21:50 +0400 |
commit | 27eda71204700eb6953205baf47d9cbeb4d367c1 (patch) | |
tree | ee6932d9f7ccdd66f6ccf84333180de34e7ac2a4 /sql/protocol.cc | |
parent | 5cc410bb70dca2fad9dd7452ef294e1020186dda (diff) | |
download | mariadb-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.cc | 24 |
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 |