Commit 90ca6d15 authored by unknown's avatar unknown

Review fixes since last pull

Fix for bug #13025; Server crash in filesort because wrong call to handler::position()


client/mysqltest.c:
  Code cleanup during review
mysql-test/r/innodb.result:
  Added test case for bug #13025; Server crash in filesort because wrong call to handler::position()
mysql-test/t/innodb.test:
  Added test case for bug #13025; Server crash in filesort because wrong call to handler::position()
sql/filesort.cc:
  Don't call handler::position() if row was not found
sql/item_cmpfunc.cc:
  Indentation changes
sql/sql_select.cc:
  Moved variable to outer level
parent e98e15db
...@@ -2170,7 +2170,8 @@ int read_line(char *buf, int size) ...@@ -2170,7 +2170,8 @@ int read_line(char *buf, int size)
if (feof(cur_file->file)) if (feof(cur_file->file))
{ {
found_eof: found_eof:
if (cur_file->file != stdin){ if (cur_file->file != stdin)
{
my_fclose(cur_file->file, MYF(0)); my_fclose(cur_file->file, MYF(0));
cur_file->file= 0; cur_file->file= 0;
} }
......
...@@ -1674,3 +1674,14 @@ select * from t1; ...@@ -1674,3 +1674,14 @@ select * from t1;
a a
42 42
drop table t1; drop table t1;
create table t1 (a int not null, b int not null, c blob not null, d int not null, e int, primary key (a,b,c(255),d)) engine=innodb;
insert into t1 values (2,2,"b",2,2),(1,1,"a",1,1),(3,3,"ab",3,3);
select * from t1 order by a,b,c,d;
a b c d e
1 1 a 1 1
2 2 b 2 2
3 3 ab 3 3
explain select * from t1 order by a,b,c,d;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using filesort
drop table t1;
...@@ -1220,4 +1220,14 @@ insert into t1 values (42); ...@@ -1220,4 +1220,14 @@ insert into t1 values (42);
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# Bug #13025 Server crash during filesort
#
create table t1 (a int not null, b int not null, c blob not null, d int not null, e int, primary key (a,b,c(255),d)) engine=innodb;
insert into t1 values (2,2,"b",2,2),(1,1,"a",1,1),(3,3,"ab",3,3);
select * from t1 order by a,b,c,d;
explain select * from t1 order by a,b,c,d;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -443,7 +443,7 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -443,7 +443,7 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
ha_store_ptr(ref_pos,ref_length,record); // Position to row ha_store_ptr(ref_pos,ref_length,record); // Position to row
record+=sort_form->db_record_offset; record+=sort_form->db_record_offset;
} }
else else if (!error)
file->position(sort_form->record[0]); file->position(sort_form->record[0]);
} }
if (error && error != HA_ERR_RECORD_DELETED) if (error && error != HA_ERR_RECORD_DELETED)
......
...@@ -51,7 +51,8 @@ static void agg_cmp_type(Item_result *type, Item **items, uint nitems) ...@@ -51,7 +51,8 @@ static void agg_cmp_type(Item_result *type, Item **items, uint nitems)
type[0]= item_cmp_type(type[0], items[i]->result_type()); type[0]= item_cmp_type(type[0], items[i]->result_type());
} }
static void my_coll_agg_error(DTCollation &c1, DTCollation &c2, const char *fname) static void my_coll_agg_error(DTCollation &c1, DTCollation &c2,
const char *fname)
{ {
my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0), my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0),
c1.collation->name,c1.derivation_name(), c1.collation->name,c1.derivation_name(),
...@@ -850,8 +851,8 @@ longlong Item_func_interval::val_int() ...@@ -850,8 +851,8 @@ longlong Item_func_interval::val_int()
1 got error 1 got error
*/ */
bool bool Item_func_between::fix_fields(THD *thd, struct st_table_list *tables,
Item_func_between::fix_fields(THD *thd, struct st_table_list *tables, Item **ref) Item **ref)
{ {
if (Item_func_opt_neg::fix_fields(thd, tables, ref)) if (Item_func_opt_neg::fix_fields(thd, tables, ref))
return 1; return 1;
...@@ -861,8 +862,9 @@ Item_func_between::fix_fields(THD *thd, struct st_table_list *tables, Item **ref ...@@ -861,8 +862,9 @@ Item_func_between::fix_fields(THD *thd, struct st_table_list *tables, Item **ref
return 0; return 0;
/* not_null_tables_cache == union(T1(e), intersection(T1(e1),T1(e2))) */ /* not_null_tables_cache == union(T1(e), intersection(T1(e1),T1(e2))) */
not_null_tables_cache= args[0]->not_null_tables() | not_null_tables_cache= (args[0]->not_null_tables() |
(args[1]->not_null_tables() & args[2]->not_null_tables()); (args[1]->not_null_tables() &
args[2]->not_null_tables()));
return 0; return 0;
} }
...@@ -1106,8 +1108,8 @@ Item_func_if::fix_fields(THD *thd, struct st_table_list *tlist, Item **ref) ...@@ -1106,8 +1108,8 @@ Item_func_if::fix_fields(THD *thd, struct st_table_list *tlist, Item **ref)
if (Item_func::fix_fields(thd, tlist, ref)) if (Item_func::fix_fields(thd, tlist, ref))
return 1; return 1;
not_null_tables_cache= (args[1]->not_null_tables() not_null_tables_cache= (args[1]->not_null_tables() &
& args[2]->not_null_tables()); args[2]->not_null_tables());
return 0; return 0;
} }
......
...@@ -9307,12 +9307,12 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list, ...@@ -9307,12 +9307,12 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list,
if (expr->arg_count) if (expr->arg_count)
{ {
Item **arg,**arg_end; Item **arg,**arg_end;
bool arg_changed= FALSE;
for (arg= expr->arguments(), for (arg= expr->arguments(),
arg_end= expr->arguments()+expr->arg_count; arg_end= expr->arguments()+expr->arg_count;
arg != arg_end; arg++) arg != arg_end; arg++)
{ {
Item *item= *arg; Item *item= *arg;
bool arg_changed= FALSE;
if (item->type() == Item::FIELD_ITEM || item->type() == Item::REF_ITEM) if (item->type() == Item::FIELD_ITEM || item->type() == Item::REF_ITEM)
{ {
ORDER *group_tmp; ORDER *group_tmp;
...@@ -9333,13 +9333,13 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list, ...@@ -9333,13 +9333,13 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list,
if (change_group_ref(thd, (Item_func *) item, group_list, &arg_changed)) if (change_group_ref(thd, (Item_func *) item, group_list, &arg_changed))
return 1; return 1;
} }
}
if (arg_changed) if (arg_changed)
{ {
expr->maybe_null= 1; expr->maybe_null= 1;
*changed= TRUE; *changed= TRUE;
} }
} }
}
return 0; return 0;
} }
......
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