summaryrefslogtreecommitdiff
path: root/sql/item_func.h
diff options
context:
space:
mode:
authorunknown <Kristofer.Pettersson@naruto.>2007-03-16 14:25:11 +0100
committerunknown <Kristofer.Pettersson@naruto.>2007-03-16 14:25:11 +0100
commitffc605aad563c7634ea6b5ac8cb480793fcb9258 (patch)
tree6d91ece01a3a323d340611812b3bd65c0422e0b7 /sql/item_func.h
parentc039eed82cb21d75965fd9b2e936396e0282e0cb (diff)
downloadmariadb-git-ffc605aad563c7634ea6b5ac8cb480793fcb9258.tar.gz
Bug#20777 Function w BIGINT UNSIGNED shows diff. behaviour with and without --ps-protocol
- Stored procedures returning unsinged values returns signed values if text protocol is used. The reason is that the stored proceedure item Item_func_sp wasn't initializing the member variables properly based on the information contained in the associated result field. - The patch is to upon field-item association, ::fix_fields, initialize the member variables in appropriate order. - Field type of an Item_func_sp was hard coded to MYSQL_TYPE_VARCHAR. This is changed to return the type of the actual result field. - Member function name sp_result_field was refactored to the more appropriate init_result_field. - Member function name find_and_check_access was refactored to sp_check_access. mysql-test/r/sp.result: - Added test mysql-test/t/sp.test: - Added test sql/item_func.cc: Bug#20777 Function w BIGINT UNSIGNED shows diff. behaviour with and without --ps-protocol - Stored procedures returning unsinged values returns signed values if text protocol is used. The reason is that the stored proceedure item Item_func_sp wasn't initializing the member variables properly based on the information contained in the associated result field. - The patch is to upon field-item association, ::fix_fields, initialize the member variables in appropriate order. - Field type of an Item_func_sp was hard coded to MYSQL_TYPE_VARCHAR. This is changed to to return the type of the actual result field. - Member function name sp_result_field was refactored to the more appropriate init_result_field. - Member function name find_and_check_access was refactored to sp_check_access. sql/item_func.h: Bug#20777 Function w BIGINT UNSIGNED shows diff. behaviour with and without --ps-protocol - Stored procedures returning unsinged values returns signed values if text protocol is used. The reason is that the stored proceedure item Item_func_sp wasn't initializing the member variables properly based on the information contained in the associated result field. - The patch is to upon field-item association, ::fix_fields, initialize the member variables in appropriate order. - Field type of an Item_func_sp was hard coded to MYSQL_TYPE_VARCHAR. This is changed to to return the type of the actual result field. - Member function name sp_result_field was refactored to the more appropriate init_result_field. - Member function name find_and_check_access was refactored to sp_check_access.
Diffstat (limited to 'sql/item_func.h')
-rw-r--r--sql/item_func.h31
1 files changed, 17 insertions, 14 deletions
diff --git a/sql/item_func.h b/sql/item_func.h
index 68591f9c6f5..6a619327590 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -1405,12 +1405,15 @@ private:
sp_name *m_name;
mutable sp_head *m_sp;
TABLE *dummy_table;
- Field *result_field;
char result_buf[64];
+ /*
+ The result field of the concrete stored function.
+ */
+ Field *sp_result_field;
- bool execute(Field **flp);
- bool execute_impl(THD *thd, Field *return_value_fld);
- Field *sp_result_field(void) const;
+ bool execute();
+ bool execute_impl(THD *thd);
+ bool init_result_field(THD *thd);
public:
@@ -1436,23 +1439,23 @@ public:
longlong val_int()
{
- if (execute(&result_field))
+ if (execute())
return (longlong) 0;
- return result_field->val_int();
+ return sp_result_field->val_int();
}
double val_real()
{
- if (execute(&result_field))
+ if (execute())
return 0.0;
- return result_field->val_real();
+ return sp_result_field->val_real();
}
my_decimal *val_decimal(my_decimal *dec_buf)
{
- if (execute(&result_field))
+ if (execute())
return NULL;
- return result_field->val_decimal(dec_buf);
+ return sp_result_field->val_decimal(dec_buf);
}
String *val_str(String *str)
@@ -1461,7 +1464,7 @@ public:
char buff[20];
buf.set(buff, 20, str->charset());
buf.length(0);
- if (execute(&result_field))
+ if (execute())
return NULL;
/*
result_field will set buf pointing to internal buffer
@@ -1469,7 +1472,7 @@ public:
when SP is executed. In order to prevent occasional
corruption of returned value, we make here a copy.
*/
- result_field->val_str(&buf);
+ sp_result_field->val_str(&buf);
str->copy(buf);
return str;
}
@@ -1477,11 +1480,11 @@ public:
virtual bool change_context_processor(byte *cntx)
{ context= (Name_resolution_context *)cntx; return FALSE; }
- void fix_length_and_dec();
- bool find_and_check_access(THD * thd);
+ bool sp_check_access(THD * thd);
virtual enum Functype functype() const { return FUNC_SP; }
bool fix_fields(THD *thd, Item **ref);
+ void fix_length_and_dec(void);
bool is_expensive() { return 1; }
};