Commit 6401f58a authored by unknown's avatar unknown

Changed mysql_next_result() to return int instead of bool

Changed ~Item_func_in() to call cleanup() (to fix memory leak)
Fixed test_multi_statements() test in client_test


include/mysql.h:
  Changed mysql_next_result() to return int instead of bool
libmysql/libmysql.c:
  Changed mysql_next_result() to return int instead of bool
  Added check to mysql_next_result() to ensure that it's not called in wrong context.
sql/item_cmpfunc.cc:
  Indentation fixes
sql/item_cmpfunc.h:
  Changed ~Item_func_in() to call cleanup()
  (Fixed memory leak in cmp_item_row())
tests/client_test.c:
  Fixed test_multi_statements() test.
parent 84281294
...@@ -604,7 +604,7 @@ MYSQL_RES *STDCALL mysql_param_result(MYSQL_STMT *stmt); ...@@ -604,7 +604,7 @@ MYSQL_RES *STDCALL mysql_param_result(MYSQL_STMT *stmt);
my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt); my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt);
int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt); int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt);
my_bool STDCALL mysql_more_results(MYSQL *mysql); my_bool STDCALL mysql_more_results(MYSQL *mysql);
my_bool STDCALL mysql_next_result(MYSQL *mysql); int STDCALL mysql_next_result(MYSQL *mysql);
MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt,
MYSQL_ROW_OFFSET offset); MYSQL_ROW_OFFSET offset);
MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt); MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt);
......
...@@ -3317,7 +3317,7 @@ my_ulonglong STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt) ...@@ -3317,7 +3317,7 @@ my_ulonglong STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt)
my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt) my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt)
{ {
MYSQL *mysql; MYSQL *mysql;
DBUG_ENTER("mysql_stmt_close"); DBUG_ENTER("mysql_stmt_free_result");
DBUG_ASSERT(stmt != 0); DBUG_ASSERT(stmt != 0);
...@@ -3498,10 +3498,18 @@ my_bool STDCALL mysql_more_results(MYSQL *mysql) ...@@ -3498,10 +3498,18 @@ my_bool STDCALL mysql_more_results(MYSQL *mysql)
Reads and returns the next query results Reads and returns the next query results
*/ */
my_bool STDCALL mysql_next_result(MYSQL *mysql) int STDCALL mysql_next_result(MYSQL *mysql)
{ {
DBUG_ENTER("mysql_next_result"); DBUG_ENTER("mysql_next_result");
if (mysql->status != MYSQL_STATUS_READY)
{
strmov(mysql->net.sqlstate, unknown_sqlstate);
strmov(mysql->net.last_error,
ER(mysql->net.last_errno=CR_COMMANDS_OUT_OF_SYNC));
DBUG_RETURN(1);
}
mysql->net.last_error[0]= 0; mysql->net.last_error[0]= 0;
mysql->net.last_errno= 0; mysql->net.last_errno= 0;
strmov(mysql->net.sqlstate, not_error_sqlstate); strmov(mysql->net.sqlstate, not_error_sqlstate);
...@@ -3510,9 +3518,10 @@ my_bool STDCALL mysql_next_result(MYSQL *mysql) ...@@ -3510,9 +3518,10 @@ my_bool STDCALL mysql_next_result(MYSQL *mysql)
if (mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS) if (mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)
DBUG_RETURN((*mysql->methods->read_query_result)(mysql)); DBUG_RETURN((*mysql->methods->read_query_result)(mysql));
DBUG_RETURN(0); DBUG_RETURN(-1); /* No more results */
} }
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql) MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql)
{ {
return (*mysql->methods->use_result)(mysql); return (*mysql->methods->use_result)(mysql);
......
...@@ -1375,6 +1375,7 @@ cmp_item* cmp_item::get_comparator(Item *item) ...@@ -1375,6 +1375,7 @@ cmp_item* cmp_item::get_comparator(Item *item)
return 0; // to satisfy compiler :) return 0; // to satisfy compiler :)
} }
cmp_item* cmp_item_sort_string::make_same() cmp_item* cmp_item_sort_string::make_same()
{ {
return new cmp_item_sort_string_in_static(cmp_charset); return new cmp_item_sort_string_in_static(cmp_charset);
...@@ -1395,6 +1396,23 @@ cmp_item* cmp_item_row::make_same() ...@@ -1395,6 +1396,23 @@ cmp_item* cmp_item_row::make_same()
return new cmp_item_row(); return new cmp_item_row();
} }
cmp_item_row::~cmp_item_row()
{
DBUG_ENTER("~cmp_item_row");
DBUG_PRINT("enter",("this: %lx", this));
if (comparators)
{
for (uint i= 0; i < n; i++)
{
if (comparators[i])
delete comparators[i];
}
}
DBUG_VOID_RETURN;
}
void cmp_item_row::store_value(Item *item) void cmp_item_row::store_value(Item *item)
{ {
THD *thd= current_thd; THD *thd= current_thd;
...@@ -1404,18 +1422,16 @@ void cmp_item_row::store_value(Item *item) ...@@ -1404,18 +1422,16 @@ void cmp_item_row::store_value(Item *item)
item->bring_value(); item->bring_value();
item->null_value= 0; item->null_value= 0;
for (uint i=0; i < n; i++) for (uint i=0; i < n; i++)
if ((comparators[i]= cmp_item::get_comparator(item->el(i)))) {
{ if (!(comparators[i]= cmp_item::get_comparator(item->el(i))))
comparators[i]->store_value(item->el(i)); break; // new failed
item->null_value|= item->el(i)->null_value; comparators[i]->store_value(item->el(i));
} item->null_value|= item->el(i)->null_value;
else }
return;
} }
else
return;
} }
void cmp_item_row::store_value_by_template(cmp_item *t, Item *item) void cmp_item_row::store_value_by_template(cmp_item *t, Item *item)
{ {
cmp_item_row *tmpl= (cmp_item_row*) t; cmp_item_row *tmpl= (cmp_item_row*) t;
...@@ -1430,19 +1446,17 @@ void cmp_item_row::store_value_by_template(cmp_item *t, Item *item) ...@@ -1430,19 +1446,17 @@ void cmp_item_row::store_value_by_template(cmp_item *t, Item *item)
item->bring_value(); item->bring_value();
item->null_value= 0; item->null_value= 0;
for (uint i=0; i < n; i++) for (uint i=0; i < n; i++)
if ((comparators[i]= tmpl->comparators[i]->make_same())) {
{ if (!(comparators[i]= tmpl->comparators[i]->make_same()))
comparators[i]->store_value_by_template(tmpl->comparators[i], break; // new failed
item->el(i)); comparators[i]->store_value_by_template(tmpl->comparators[i],
item->null_value|= item->el(i)->null_value; item->el(i));
} item->null_value|= item->el(i)->null_value;
else }
return;
} }
else
return;
} }
int cmp_item_row::cmp(Item *arg) int cmp_item_row::cmp(Item *arg)
{ {
arg->null_value= 0; arg->null_value= 0;
...@@ -1454,25 +1468,31 @@ int cmp_item_row::cmp(Item *arg) ...@@ -1454,25 +1468,31 @@ int cmp_item_row::cmp(Item *arg)
bool was_null= 0; bool was_null= 0;
arg->bring_value(); arg->bring_value();
for (uint i=0; i < n; i++) for (uint i=0; i < n; i++)
{
if (comparators[i]->cmp(arg->el(i))) if (comparators[i]->cmp(arg->el(i)))
{ {
if (!arg->el(i)->null_value) if (!arg->el(i)->null_value)
return 1; return 1;
was_null= 1; was_null= 1;
} }
}
return (arg->null_value= was_null); return (arg->null_value= was_null);
} }
int cmp_item_row::compare(cmp_item *c) int cmp_item_row::compare(cmp_item *c)
{ {
int res;
cmp_item_row *cmp= (cmp_item_row *) c; cmp_item_row *cmp= (cmp_item_row *) c;
for (uint i=0; i < n; i++) for (uint i=0; i < n; i++)
{
int res;
if ((res= comparators[i]->compare(cmp->comparators[i]))) if ((res= comparators[i]->compare(cmp->comparators[i])))
return res; return res;
}
return 0; return 0;
} }
bool Item_func_in::nulls_in_row() bool Item_func_in::nulls_in_row()
{ {
Item **arg,**arg_end; Item **arg,**arg_end;
...@@ -1484,6 +1504,7 @@ bool Item_func_in::nulls_in_row() ...@@ -1484,6 +1504,7 @@ bool Item_func_in::nulls_in_row()
return 0; return 0;
} }
static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y) static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y)
{ {
return cs->coll->strnncollsp(cs, return cs->coll->strnncollsp(cs,
...@@ -1491,6 +1512,7 @@ static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y) ...@@ -1491,6 +1512,7 @@ static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y)
(unsigned char *) y->ptr(),y->length()); (unsigned char *) y->ptr(),y->length());
} }
void Item_func_in::fix_length_and_dec() void Item_func_in::fix_length_and_dec()
{ {
Item **arg, **arg_end; Item **arg, **arg_end;
......
...@@ -638,17 +638,7 @@ class cmp_item_row :public cmp_item ...@@ -638,17 +638,7 @@ class cmp_item_row :public cmp_item
uint n; uint n;
public: public:
cmp_item_row(): comparators(0), n(0) {} cmp_item_row(): comparators(0), n(0) {}
~cmp_item_row() ~cmp_item_row();
{
if (comparators)
{
for (uint i= 0; i < n; i++)
{
if (comparators[i])
delete comparators[i];
}
}
}
void store_value(Item *item); void store_value(Item *item);
int cmp(Item *arg); int cmp(Item *arg);
int compare(cmp_item *arg); int compare(cmp_item *arg);
...@@ -694,7 +684,7 @@ class cmp_item_sort_string_in_static :public cmp_item_string ...@@ -694,7 +684,7 @@ class cmp_item_sort_string_in_static :public cmp_item_string
cmp_item_string *cmp= (cmp_item_string *)c; cmp_item_string *cmp= (cmp_item_string *)c;
return sortcmp(value_res, cmp->value_res, cmp_charset); return sortcmp(value_res, cmp->value_res, cmp_charset);
} }
cmp_item * make_same() cmp_item *make_same()
{ {
return new cmp_item_sort_string_in_static(cmp_charset); return new cmp_item_sort_string_in_static(cmp_charset);
} }
...@@ -715,7 +705,10 @@ class Item_func_in :public Item_int_func ...@@ -715,7 +705,10 @@ class Item_func_in :public Item_int_func
} }
longlong val_int(); longlong val_int();
void fix_length_and_dec(); void fix_length_and_dec();
~Item_func_in() {} ~Item_func_in()
{
cleanup(); /* This is not called by Item::~Item() */
}
void cleanup() void cleanup()
{ {
delete array; delete array;
......
This diff is collapsed.
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