Commit e4cdb580 authored by unknown's avatar unknown

Merge olga.mysql.com:/home/igor/mysql-5.0-opt

into  olga.mysql.com:/home/igor/dev-opt/mysql-5.0-opt-bug26560


sql/sql_base.cc:
  Auto merged
sql/sql_select.cc:
  Auto merged
parents 6da758c2 cbd324d2
...@@ -463,5 +463,11 @@ CREATE TABLE t3 (a BIGINT UNSIGNED); ...@@ -463,5 +463,11 @@ CREATE TABLE t3 (a BIGINT UNSIGNED);
INSERT INTO t3 VALUES (9223372036854775551); INSERT INTO t3 VALUES (9223372036854775551);
SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42); SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42);
HEX(a) HEX(a)
DROP TABLE t1,t2,t3; CREATE TABLE t4 (a DATE);
INSERT INTO t4 VALUES ('1972-02-06'), ('1972-07-29');
SELECT * FROM t4 WHERE a IN ('1972-02-06','19772-07-29');
a
Warnings:
Warning 1292 Incorrect date value: '19772-07-29' for column 'a' at row 1
DROP TABLE t1,t2,t3,t4;
End of 5.0 tests End of 5.0 tests
...@@ -926,3 +926,11 @@ NULL ...@@ -926,3 +926,11 @@ NULL
2 2
3 3
DROP TABLE t1,t2,t3,t4; DROP TABLE t1,t2,t3,t4;
create table t1 (a int, b int, c int);
insert into t1 values (1,2,3), (9,8,3), (19,4,3), (1,4,9);
select a,(sum(b)/sum(c)) as ratio from t1 group by a order by sum(b)/sum(c) asc;
a ratio
1 0.5000
19 1.3333
9 2.6667
drop table t1;
...@@ -377,6 +377,10 @@ create table t1(f1 int, `*f2` int); ...@@ -377,6 +377,10 @@ create table t1(f1 int, `*f2` int);
insert into t1 values (1,1); insert into t1 values (1,1);
update t1 set `*f2`=1; update t1 set `*f2`=1;
drop table t1; drop table t1;
create table t1(f1 int);
update t1 set f2=1 order by f2;
ERROR 42S22: Unknown column 'f2' in 'order clause'
drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
request_id int unsigned NOT NULL auto_increment, request_id int unsigned NOT NULL auto_increment,
user_id varchar(12) default NULL, user_id varchar(12) default NULL,
......
...@@ -354,6 +354,10 @@ INSERT INTO t3 VALUES (9223372036854775551); ...@@ -354,6 +354,10 @@ INSERT INTO t3 VALUES (9223372036854775551);
SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42); SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42);
DROP TABLE t1,t2,t3; CREATE TABLE t4 (a DATE);
INSERT INTO t4 VALUES ('1972-02-06'), ('1972-07-29');
SELECT * FROM t4 WHERE a IN ('1972-02-06','19772-07-29');
DROP TABLE t1,t2,t3,t4;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -640,3 +640,11 @@ SELECT t2.b FROM t1 LEFT JOIN (t2, t3 LEFT JOIN t4 ON t3.a=t4.a) ...@@ -640,3 +640,11 @@ SELECT t2.b FROM t1 LEFT JOIN (t2, t3 LEFT JOIN t4 ON t3.a=t4.a)
ON (t1.a=t2.a AND t1.b=t3.b) order by t2.b; ON (t1.a=t2.a AND t1.b=t3.b) order by t2.b;
DROP TABLE t1,t2,t3,t4; DROP TABLE t1,t2,t3,t4;
#
# Bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.
#
create table t1 (a int, b int, c int);
insert into t1 values (1,2,3), (9,8,3), (19,4,3), (1,4,9);
select a,(sum(b)/sum(c)) as ratio from t1 group by a order by sum(b)/sum(c) asc;
drop table t1;
...@@ -306,6 +306,14 @@ create table t1(f1 int, `*f2` int); ...@@ -306,6 +306,14 @@ create table t1(f1 int, `*f2` int);
insert into t1 values (1,1); insert into t1 values (1,1);
update t1 set `*f2`=1; update t1 set `*f2`=1;
drop table t1; drop table t1;
#
# Bug#25126: Wrongly resolved field leads to a crash
#
create table t1(f1 int);
--error 1054
update t1 set f2=1 order by f2;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
# #
......
...@@ -4437,12 +4437,15 @@ bool setup_fields(THD *thd, Item **ref_pointer_array, ...@@ -4437,12 +4437,15 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
bool save_set_query_id= thd->set_query_id; bool save_set_query_id= thd->set_query_id;
nesting_map save_allow_sum_func= thd->lex->allow_sum_func; nesting_map save_allow_sum_func= thd->lex->allow_sum_func;
List_iterator<Item> it(fields); List_iterator<Item> it(fields);
bool save_is_item_list_lookup;
DBUG_ENTER("setup_fields"); DBUG_ENTER("setup_fields");
thd->set_query_id=set_query_id; thd->set_query_id=set_query_id;
if (allow_sum_func) if (allow_sum_func)
thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level; thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
thd->where= THD::DEFAULT_WHERE; thd->where= THD::DEFAULT_WHERE;
save_is_item_list_lookup= thd->lex->current_select->is_item_list_lookup;
thd->lex->current_select->is_item_list_lookup= 0;
/* /*
To prevent fail on forward lookup we fill it with zerows, To prevent fail on forward lookup we fill it with zerows,
...@@ -4465,6 +4468,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array, ...@@ -4465,6 +4468,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
if (!item->fixed && item->fix_fields(thd, it.ref()) || if (!item->fixed && item->fix_fields(thd, it.ref()) ||
(item= *(it.ref()))->check_cols(1)) (item= *(it.ref()))->check_cols(1))
{ {
thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
thd->lex->allow_sum_func= save_allow_sum_func; thd->lex->allow_sum_func= save_allow_sum_func;
thd->set_query_id= save_set_query_id; thd->set_query_id= save_set_query_id;
DBUG_RETURN(TRUE); /* purecov: inspected */ DBUG_RETURN(TRUE); /* purecov: inspected */
...@@ -4477,6 +4481,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array, ...@@ -4477,6 +4481,7 @@ bool setup_fields(THD *thd, Item **ref_pointer_array,
thd->used_tables|= item->used_tables(); thd->used_tables|= item->used_tables();
thd->lex->current_select->cur_pos_in_select_list++; thd->lex->current_select->cur_pos_in_select_list++;
} }
thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
thd->lex->current_select->cur_pos_in_select_list= UNDEF_POS; thd->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
thd->lex->allow_sum_func= save_allow_sum_func; thd->lex->allow_sum_func= save_allow_sum_func;
...@@ -4973,6 +4978,8 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves, ...@@ -4973,6 +4978,8 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves,
*/ */
bool it_is_update= (select_lex == &thd->lex->select_lex) && bool it_is_update= (select_lex == &thd->lex->select_lex) &&
thd->lex->which_check_option_applicable(); thd->lex->which_check_option_applicable();
bool save_is_item_list_lookup= select_lex->is_item_list_lookup;
select_lex->is_item_list_lookup= 0;
DBUG_ENTER("setup_conds"); DBUG_ENTER("setup_conds");
if (select_lex->conds_processed_with_permanent_arena || if (select_lex->conds_processed_with_permanent_arena ||
...@@ -5047,9 +5054,11 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves, ...@@ -5047,9 +5054,11 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves,
select_lex->where= *conds; select_lex->where= *conds;
select_lex->conds_processed_with_permanent_arena= 1; select_lex->conds_processed_with_permanent_arena= 1;
} }
thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
DBUG_RETURN(test(thd->net.report_error)); DBUG_RETURN(test(thd->net.report_error));
err_no_arena: err_no_arena:
select_lex->is_item_list_lookup= save_is_item_list_lookup;
DBUG_RETURN(1); DBUG_RETURN(1);
} }
......
...@@ -396,6 +396,7 @@ JOIN::prepare(Item ***rref_pointer_array, ...@@ -396,6 +396,7 @@ JOIN::prepare(Item ***rref_pointer_array,
join_list= &select_lex->top_join_list; join_list= &select_lex->top_join_list;
union_part= (unit_arg->first_select()->next_select() != 0); union_part= (unit_arg->first_select()->next_select() != 0);
thd->lex->current_select->is_item_list_lookup= 1;
/* /*
If we have already executed SELECT, then it have not sense to prevent If we have already executed SELECT, then it have not sense to prevent
its table from update (see unique_table()) its table from update (see unique_table())
...@@ -455,6 +456,17 @@ JOIN::prepare(Item ***rref_pointer_array, ...@@ -455,6 +456,17 @@ JOIN::prepare(Item ***rref_pointer_array,
select_lex->fix_prepare_information(thd, &conds, &having); select_lex->fix_prepare_information(thd, &conds, &having);
if (order)
{
ORDER *ord;
for (ord= order; ord; ord= ord->next)
{
Item *item= *ord->item;
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
item->split_sum_func(thd, ref_pointer_array, all_fields);
}
}
if (having && having->with_sum_func) if (having && having->with_sum_func)
having->split_sum_func2(thd, ref_pointer_array, all_fields, having->split_sum_func2(thd, ref_pointer_array, all_fields,
&having, TRUE); &having, TRUE);
...@@ -13265,16 +13277,11 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, ...@@ -13265,16 +13277,11 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
We check order_item->fixed because Item_func_group_concat can put We check order_item->fixed because Item_func_group_concat can put
arguments for which fix_fields already was called. arguments for which fix_fields already was called.
*/ */
thd->lex->current_select->is_item_list_lookup= 1;
if (!order_item->fixed && if (!order_item->fixed &&
(order_item->fix_fields(thd, order->item) || (order_item->fix_fields(thd, order->item) ||
(order_item= *order->item)->check_cols(1) || (order_item= *order->item)->check_cols(1) ||
thd->is_fatal_error)) thd->is_fatal_error))
{
thd->lex->current_select->is_item_list_lookup= 0;
return TRUE; /* Wrong field. */ return TRUE; /* Wrong field. */
}
thd->lex->current_select->is_item_list_lookup= 0;
uint el= all_fields.elements; uint el= all_fields.elements;
all_fields.push_front(order_item); /* Add new field to field list. */ all_fields.push_front(order_item); /* Add new field to field list. */
......
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