summaryrefslogtreecommitdiff
path: root/sql/item_cmpfunc.cc
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-11-19 17:31:57 +0200
committerunknown <monty@mashka.mysql.fi>2003-11-19 17:31:57 +0200
commit6401f58ac629228b43b86900f323b4423ce6f5cd (patch)
tree443115763c8883fe2cec46dd174648a1c25aeedf /sql/item_cmpfunc.cc
parent84281294eab2441a118d2c1414c6d6e531e89c5b (diff)
downloadmariadb-git-6401f58ac629228b43b86900f323b4423ce6f5cd.tar.gz
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.
Diffstat (limited to 'sql/item_cmpfunc.cc')
-rw-r--r--sql/item_cmpfunc.cc62
1 files changed, 42 insertions, 20 deletions
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 8731e8fbe21..709b20e5a54 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1375,6 +1375,7 @@ cmp_item* cmp_item::get_comparator(Item *item)
return 0; // to satisfy compiler :)
}
+
cmp_item* cmp_item_sort_string::make_same()
{
return new cmp_item_sort_string_in_static(cmp_charset);
@@ -1395,6 +1396,23 @@ cmp_item* cmp_item_row::make_same()
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)
{
THD *thd= current_thd;
@@ -1404,18 +1422,16 @@ void cmp_item_row::store_value(Item *item)
item->bring_value();
item->null_value= 0;
for (uint i=0; i < n; i++)
- if ((comparators[i]= cmp_item::get_comparator(item->el(i))))
- {
- comparators[i]->store_value(item->el(i));
- item->null_value|= item->el(i)->null_value;
- }
- else
- return;
+ {
+ if (!(comparators[i]= cmp_item::get_comparator(item->el(i))))
+ break; // new failed
+ comparators[i]->store_value(item->el(i));
+ item->null_value|= item->el(i)->null_value;
+ }
}
- else
- return;
}
+
void cmp_item_row::store_value_by_template(cmp_item *t, Item *item)
{
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)
item->bring_value();
item->null_value= 0;
for (uint i=0; i < n; i++)
- if ((comparators[i]= tmpl->comparators[i]->make_same()))
- {
- comparators[i]->store_value_by_template(tmpl->comparators[i],
- item->el(i));
- item->null_value|= item->el(i)->null_value;
- }
- else
- return;
+ {
+ if (!(comparators[i]= tmpl->comparators[i]->make_same()))
+ break; // new failed
+ comparators[i]->store_value_by_template(tmpl->comparators[i],
+ item->el(i));
+ item->null_value|= item->el(i)->null_value;
+ }
}
- else
- return;
}
+
int cmp_item_row::cmp(Item *arg)
{
arg->null_value= 0;
@@ -1454,25 +1468,31 @@ int cmp_item_row::cmp(Item *arg)
bool was_null= 0;
arg->bring_value();
for (uint i=0; i < n; i++)
+ {
if (comparators[i]->cmp(arg->el(i)))
{
if (!arg->el(i)->null_value)
return 1;
was_null= 1;
}
+ }
return (arg->null_value= was_null);
}
+
int cmp_item_row::compare(cmp_item *c)
{
- int res;
cmp_item_row *cmp= (cmp_item_row *) c;
for (uint i=0; i < n; i++)
+ {
+ int res;
if ((res= comparators[i]->compare(cmp->comparators[i])))
return res;
+ }
return 0;
}
+
bool Item_func_in::nulls_in_row()
{
Item **arg,**arg_end;
@@ -1484,6 +1504,7 @@ bool Item_func_in::nulls_in_row()
return 0;
}
+
static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y)
{
return cs->coll->strnncollsp(cs,
@@ -1491,6 +1512,7 @@ static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y)
(unsigned char *) y->ptr(),y->length());
}
+
void Item_func_in::fix_length_and_dec()
{
Item **arg, **arg_end;