Commit ce8b1f9b authored by unknown's avatar unknown

Merge myvenu.com:/home/venu/bk/src-4.1

into myvenu.com:/home/venu/work/sql/dev-4.1


sql/field.cc:
  Auto merged
parents 389cec7d 218e9524
This diff is collapsed.
...@@ -2599,7 +2599,7 @@ String *Field_double::val_str(String *val_buffer, ...@@ -2599,7 +2599,7 @@ String *Field_double::val_str(String *val_buffer,
bool Field_double::send_binary(Protocol *protocol) bool Field_double::send_binary(Protocol *protocol)
{ {
return protocol->store((float) Field_double::val_real(), dec, (String*) 0); return protocol->store((double) Field_double::val_real(), dec, (String*) 0);
} }
...@@ -3169,7 +3169,7 @@ bool Field_time::send_binary(Protocol *protocol) ...@@ -3169,7 +3169,7 @@ bool Field_time::send_binary(Protocol *protocol)
Field_time::get_time(&tm); Field_time::get_time(&tm);
tm.day= tm.hour/3600; // Move hours to days tm.day= tm.hour/3600; // Move hours to days
tm.hour-= tm.day*3600; tm.hour-= tm.day*3600;
return protocol->store(&tm); return protocol->store_time(&tm);
} }
...@@ -3254,6 +3254,13 @@ int Field_year::store(longlong nr) ...@@ -3254,6 +3254,13 @@ int Field_year::store(longlong nr)
return 0; return 0;
} }
bool Field_year::send_binary(Protocol *protocol)
{
ulonglong tmp= Field_year::val_int();
TIME tm;
tm.year= (uint32) tmp;
return protocol->store_date(&tm);
}
double Field_year::val_real(void) double Field_year::val_real(void)
{ {
...@@ -3371,6 +3378,16 @@ int Field_date::store(longlong nr) ...@@ -3371,6 +3378,16 @@ int Field_date::store(longlong nr)
return error; return error;
} }
bool Field_date::send_binary(Protocol *protocol)
{
longlong tmp= Field_date::val_int();
TIME tm;
tm.year= (uint32) tmp/10000L % 10000;
tm.month= (uint32) tmp/100 % 100;
tm.day= (uint32) tmp % 100;
return protocol->store_date(&tm);
}
double Field_date::val_real(void) double Field_date::val_real(void)
{ {
...@@ -3544,7 +3561,12 @@ void Field_newdate::store_time(TIME *ltime,timestamp_type type) ...@@ -3544,7 +3561,12 @@ void Field_newdate::store_time(TIME *ltime,timestamp_type type)
int3store(ptr,tmp); int3store(ptr,tmp);
} }
bool Field_newdate::send_binary(Protocol *protocol)
{
TIME tm;
Field_newdate::get_date(&tm,0);
return protocol->store_date(&tm);
}
double Field_newdate::val_real(void) double Field_newdate::val_real(void)
{ {
...@@ -3705,6 +3727,13 @@ void Field_datetime::store_time(TIME *ltime,timestamp_type type) ...@@ -3705,6 +3727,13 @@ void Field_datetime::store_time(TIME *ltime,timestamp_type type)
longlongstore(ptr,tmp); longlongstore(ptr,tmp);
} }
bool Field_datetime::send_binary(Protocol *protocol)
{
TIME tm;
Field_datetime::get_date(&tm, 1);
return protocol->store(&tm);
}
double Field_datetime::val_real(void) double Field_datetime::val_real(void)
{ {
......
...@@ -166,7 +166,7 @@ class Field ...@@ -166,7 +166,7 @@ class Field
ptr-=row_offset; ptr-=row_offset;
return tmp; return tmp;
} }
bool send_binary(Protocol *protocol); virtual bool send_binary(Protocol *protocol);
virtual char *pack(char* to, const char *from, uint max_length=~(uint) 0) virtual char *pack(char* to, const char *from, uint max_length=~(uint) 0)
{ {
uint32 length=pack_length(); uint32 length=pack_length();
...@@ -792,7 +792,6 @@ class Field_string :public Field_str { ...@@ -792,7 +792,6 @@ class Field_string :public Field_str {
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
bool send_binary(Protocol *protocol);
int cmp(const char *,const char*); int cmp(const char *,const char*);
void sort_string(char *buff,uint length); void sort_string(char *buff,uint length);
void sql_type(String &str) const; void sql_type(String &str) const;
...@@ -833,7 +832,6 @@ class Field_varstring :public Field_str { ...@@ -833,7 +832,6 @@ class Field_varstring :public Field_str {
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
bool send_binary(Protocol *protocol);
int cmp(const char *,const char*); int cmp(const char *,const char*);
void sort_string(char *buff,uint length); void sort_string(char *buff,uint length);
void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type); void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type);
...@@ -876,7 +874,6 @@ class Field_blob :public Field_str { ...@@ -876,7 +874,6 @@ class Field_blob :public Field_str {
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
bool send_binary(Protocol *protocol);
int cmp(const char *,const char*); int cmp(const char *,const char*);
int cmp(const char *a, uint32 a_length, const char *b, uint32 b_length); int cmp(const char *a, uint32 a_length, const char *b, uint32 b_length);
int cmp_offset(uint offset); int cmp_offset(uint offset);
...@@ -982,7 +979,6 @@ class Field_enum :public Field_str { ...@@ -982,7 +979,6 @@ class Field_enum :public Field_str {
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
bool send_binary(Protocol *protocol);
int cmp(const char *,const char*); int cmp(const char *,const char*);
void sort_string(char *buff,uint length); void sort_string(char *buff,uint length);
uint32 pack_length() const { return (uint32) packlength; } uint32 pack_length() const { return (uint32) packlength; }
......
...@@ -616,7 +616,7 @@ bool Protocol_simple::store_null() ...@@ -616,7 +616,7 @@ bool Protocol_simple::store_null()
field_pos++; field_pos++;
#endif #endif
char buff[1]; char buff[1];
buff[0]= 251; buff[0]= (char)251;
return packet->append(buff, sizeof(buff), PACKET_BUFFET_EXTRA_ALLOC); return packet->append(buff, sizeof(buff), PACKET_BUFFET_EXTRA_ALLOC);
} }
...@@ -774,13 +774,27 @@ bool Protocol_simple::store_time(TIME *tm) ...@@ -774,13 +774,27 @@ bool Protocol_simple::store_time(TIME *tm)
/**************************************************************************** /****************************************************************************
Functions to handle the binary protocol used with prepared statements Functions to handle the binary protocol used with prepared statements
Data format:
[ok:1] <-- reserved ok packet
[null_field:(field_count+7+2)/8] <-- reserved to send null data. The size is
calculated using:
bit_fields= (field_count+7+2)/8;
2 bits are reserved
[[length]data] <-- data field (the length applies only for
string/binary/time/timestamp fields and
rest of them are not sent as they have
the default length that client understands
based on the field type
[..]..[[length]data] <-- data
****************************************************************************/ ****************************************************************************/
bool Protocol_prep::prepare_for_send(List<Item> *item_list) bool Protocol_prep::prepare_for_send(List<Item> *item_list)
{ {
field_count=item_list->elements; field_count= item_list->elements;
bit_fields= (field_count+3)/8; bit_fields= (field_count+9)/8;
if (packet->alloc(bit_fields)) if (packet->alloc(bit_fields+1))
return 1; return 1;
/* prepare_for_resend will be called after this one */ /* prepare_for_resend will be called after this one */
return 0; return 0;
...@@ -789,9 +803,8 @@ bool Protocol_prep::prepare_for_send(List<Item> *item_list) ...@@ -789,9 +803,8 @@ bool Protocol_prep::prepare_for_send(List<Item> *item_list)
void Protocol_prep::prepare_for_resend() void Protocol_prep::prepare_for_resend()
{ {
packet->length(bit_fields); packet->length(bit_fields+1);
bzero((char*) packet->ptr()+1, bit_fields-1); bzero((char*) packet->ptr(), 1+bit_fields);
packet[0]=1; // Marker for ok packet
field_pos=0; field_pos=0;
} }
...@@ -813,7 +826,7 @@ bool Protocol_prep::store(const char *from,uint length) ...@@ -813,7 +826,7 @@ bool Protocol_prep::store(const char *from,uint length)
bool Protocol_prep::store_null() bool Protocol_prep::store_null()
{ {
uint offset=(field_pos+2)/8, bit= (1 << ((field_pos+2) & 7)); uint offset= (field_pos+2)/8+1, bit= (1 << ((field_pos+2) & 7));
/* Room for this as it's allocated in prepare_for_send */ /* Room for this as it's allocated in prepare_for_send */
char *to= (char*) packet->ptr()+offset; char *to= (char*) packet->ptr()+offset;
*to= (char) ((uchar) *to | (uchar) bit); *to= (char) ((uchar) *to | (uchar) bit);
...@@ -926,6 +939,7 @@ bool Protocol_prep::store(TIME *tm) ...@@ -926,6 +939,7 @@ bool Protocol_prep::store(TIME *tm)
{ {
#ifndef DEBUG_OFF #ifndef DEBUG_OFF
DBUG_ASSERT(field_types == 0 || DBUG_ASSERT(field_types == 0 ||
field_types[field_pos] == MYSQL_TYPE_YEAR ||
field_types[field_pos] == MYSQL_TYPE_DATETIME || field_types[field_pos] == MYSQL_TYPE_DATETIME ||
field_types[field_pos] == MYSQL_TYPE_DATE || field_types[field_pos] == MYSQL_TYPE_DATE ||
field_types[field_pos] == MYSQL_TYPE_TIMESTAMP); field_types[field_pos] == MYSQL_TYPE_TIMESTAMP);
...@@ -987,3 +1001,10 @@ bool Protocol_prep::store_time(TIME *tm) ...@@ -987,3 +1001,10 @@ bool Protocol_prep::store_time(TIME *tm)
buff[0]=(char) length; // Length is stored first 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_BUFFET_EXTRA_ALLOC);
} }
#if 0
bool Protocol_prep::send_fields(List<Item> *list, uint flag)
{
return prepare_for_send(list);
};
#endif
...@@ -440,10 +440,9 @@ static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list, ...@@ -440,10 +440,9 @@ static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list,
COND *conds) COND *conds)
{ {
THD *thd= stmt->thd; THD *thd= stmt->thd;
TABLE *table;
DBUG_ENTER("mysql_test_upd_fields"); DBUG_ENTER("mysql_test_upd_fields");
if (!(table = open_ltable(thd,table_list,table_list->lock_type))) if (open_and_lock_tables(thd, table_list))
DBUG_RETURN(1); DBUG_RETURN(1);
if (setup_tables(table_list) || setup_fields(thd,table_list,fields,1,0,0) || if (setup_tables(table_list) || setup_fields(thd,table_list,fields,1,0,0) ||
...@@ -477,13 +476,12 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, ...@@ -477,13 +476,12 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
COND *conds, ORDER *order, ORDER *group, COND *conds, ORDER *order, ORDER *group,
Item *having) Item *having)
{ {
TABLE *table;
bool hidden_group_fields; bool hidden_group_fields;
THD *thd= stmt->thd; THD *thd= stmt->thd;
List<Item> all_fields(fields); List<Item> all_fields(fields);
DBUG_ENTER("mysql_test_select_fields"); DBUG_ENTER("mysql_test_select_fields");
if (!(table = open_ltable(thd,tables,TL_READ))) if (open_and_lock_tables(thd, tables))
DBUG_RETURN(1); DBUG_RETURN(1);
thd->used_tables=0; // Updated by setup_fields thd->used_tables=0; // Updated by setup_fields
...@@ -512,7 +510,7 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, ...@@ -512,7 +510,7 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
sending any info on where clause. sending any info on where clause.
*/ */
if (send_prep_stmt(stmt, fields.elements) || if (send_prep_stmt(stmt, fields.elements) ||
thd->protocol_prep.send_fields(&fields,0) || thd->protocol_simple.send_fields(&fields,0) ||
send_item_params(stmt)) send_item_params(stmt))
DBUG_RETURN(1); DBUG_RETURN(1);
DBUG_RETURN(0); DBUG_RETURN(0);
...@@ -626,14 +624,17 @@ static bool parse_prepare_query(PREP_STMT *stmt, ...@@ -626,14 +624,17 @@ static bool parse_prepare_query(PREP_STMT *stmt,
/* /*
Initialize parameter items in statement Initialize parameter items in statement
*/ */
static bool init_param_items(THD *thd, PREP_STMT *stmt)
static bool init_param_items( PREP_STMT *stmt)
{ {
List<Item> &params= stmt->thd->lex.param_list;
Item_param **to; Item_param **to;
if (!(stmt->param= to= (Item_param **) if (!(stmt->param= to= (Item_param **)
my_malloc(sizeof(Item_param *)*(stmt->param_count+1), my_malloc(sizeof(Item_param *)*(stmt->param_count+1),
MYF(MY_WME)))) MYF(MY_WME))))
return 1; return 1;
List_iterator<Item> param_iterator(thd->lex.param_list); List_iterator<Item> param_iterator(params);
while ((*(to++) = (Item_param *)param_iterator++)); while ((*(to++) = (Item_param *)param_iterator++));
return 0; return 0;
} }
...@@ -659,29 +660,32 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length) ...@@ -659,29 +660,32 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length)
DBUG_ENTER("mysql_stmt_prepare"); DBUG_ENTER("mysql_stmt_prepare");
bzero((char*) &stmt, sizeof(stmt)); bzero((char*) &stmt, sizeof(stmt));
stmt.thd= thd;
stmt.stmt_id= ++thd->current_stmt_id; stmt.stmt_id= ++thd->current_stmt_id;
init_sql_alloc(&stmt.mem_root, 8192, 8192); init_sql_alloc(&stmt.mem_root, 8192, 8192);
stmt.thd= thd;
stmt.thd->mem_root= stmt.mem_root;
thd->mem_root= stmt.mem_root; if (alloc_query(stmt.thd, packet, packet_length))
if (alloc_query(thd, packet, packet_length))
goto err; goto err;
if (parse_prepare_query(&stmt, thd->query, thd->query_length)) if (parse_prepare_query(&stmt, thd->query, thd->query_length))
goto err; goto err;
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(),WAIT_PRIOR); my_pthread_setprio(pthread_self(),WAIT_PRIOR);
if (init_param_items(thd, &stmt)) if (init_param_items(&stmt))
goto err; goto err;
stmt.mem_root= thd->mem_root; stmt.mem_root= stmt.thd->mem_root;
tree_insert(&thd->prepared_statements, (void *)&stmt, 0, (void *)0); tree_insert(&thd->prepared_statements, (void *)&stmt, 0, (void *)0);
thd->mem_root= thd_root; // restore main mem_root thd->mem_root= thd_root; // restore main mem_root
DBUG_RETURN(0); DBUG_RETURN(0);
err: err:
stmt.mem_root= thd->mem_root; stmt.mem_root= stmt.thd->mem_root;
free_prep_stmt(&stmt, free_free, (void*) 0); free_prep_stmt(&stmt, free_free, (void*) 0);
thd->mem_root = thd_root; // restore main mem_root thd->mem_root = thd_root; // restore main mem_root
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -727,9 +731,9 @@ void mysql_stmt_execute(THD *thd, char *packet) ...@@ -727,9 +731,9 @@ void mysql_stmt_execute(THD *thd, char *packet)
mysql_delete(), mysql_update() and mysql_select() to not to mysql_delete(), mysql_update() and mysql_select() to not to
have re-check on setup_* and other things .. have re-check on setup_* and other things ..
*/ */
thd->protocol= &thd->protocol_prep; // Switch to binary protocol stmt->thd->protocol= &thd->protocol_prep; // Switch to binary protocol
mysql_execute_command(stmt->thd); mysql_execute_command(stmt->thd);
thd->protocol= &thd->protocol_simple; // Use normal protocol stmt->thd->protocol= &thd->protocol_simple; // Use normal protocol
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(), WAIT_PRIOR); my_pthread_setprio(pthread_self(), WAIT_PRIOR);
......
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