summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <holyfoot/hf@mysql.com/hfmain.(none)>2007-03-08 21:14:31 +0400
committerunknown <holyfoot/hf@mysql.com/hfmain.(none)>2007-03-08 21:14:31 +0400
commit0fcd9c2bfb68e8c2078e975d69cb25992324fe13 (patch)
tree7c49046b65481c7d5faa15b714e63bd431a7c166
parent5130e88e418f48c9e15e8ecb730b68dd9174cec1 (diff)
parent72773f4f8adfe8b4973d0392914d15ada43021e6 (diff)
downloadmariadb-git-0fcd9c2bfb68e8c2078e975d69cb25992324fe13.tar.gz
Merge bk@192.168.21.1:mysql-4.1
into mysql.com:/home/hf/work/mrg/mysql-4.1-opt
-rw-r--r--mysql-test/r/update.result4
-rw-r--r--mysql-test/t/update.test8
-rw-r--r--sql/sql_base.cc31
-rw-r--r--sql/sql_select.cc7
4 files changed, 44 insertions, 6 deletions
diff --git a/mysql-test/r/update.result b/mysql-test/r/update.result
index 0f86a959250..186e0955e61 100644
--- a/mysql-test/r/update.result
+++ b/mysql-test/r/update.result
@@ -377,3 +377,7 @@ create table t1(f1 int, `*f2` int);
insert into t1 values (1,1);
update t1 set `*f2`=1;
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;
diff --git a/mysql-test/t/update.test b/mysql-test/t/update.test
index c69c56f0331..e5287eacbc8 100644
--- a/mysql-test/t/update.test
+++ b/mysql-test/t/update.test
@@ -306,4 +306,12 @@ create table t1(f1 int, `*f2` int);
insert into t1 values (1,1);
update t1 set `*f2`=1;
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
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 05ecfe9b484..2f7661182a6 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -2518,11 +2518,14 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
{
reg2 Item *item;
List_iterator<Item> it(fields);
+ bool save_is_item_list_lookup;
DBUG_ENTER("setup_fields");
thd->set_query_id=set_query_id;
thd->allow_sum_func= allow_sum_func;
thd->where="field list";
+ 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,
@@ -2543,7 +2546,10 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
{
if (!item->fixed && item->fix_fields(thd, tables, it.ref()) ||
(item= *(it.ref()))->check_cols(1))
+ {
+ thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
DBUG_RETURN(-1); /* purecov: inspected */
+ }
if (ref)
*(ref++)= item;
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM &&
@@ -2551,6 +2557,7 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
item->split_sum_func(thd, ref_pointer_array, *sum_func_list);
thd->used_tables|=item->used_tables();
}
+ thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
DBUG_RETURN(test(thd->net.report_error));
}
@@ -2747,6 +2754,8 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
{
table_map not_null_tables= 0;
Item_arena *arena= 0, backup;
+ bool save_is_item_list_lookup= thd->lex->current_select->is_item_list_lookup;
+ thd->lex->current_select->is_item_list_lookup= 0;
DBUG_ENTER("setup_conds");
thd->set_query_id=1;
@@ -2756,7 +2765,10 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
thd->where="where clause";
if (!(*conds)->fixed && (*conds)->fix_fields(thd, tables, conds) ||
(*conds)->check_cols(1))
+ {
+ thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
DBUG_RETURN(1);
+ }
not_null_tables= (*conds)->not_null_tables();
}
@@ -2772,7 +2784,10 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
if (!table->on_expr->fixed &&
table->on_expr->fix_fields(thd, tables, &table->on_expr) ||
table->on_expr->check_cols(1))
+ {
+ thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
DBUG_RETURN(1);
+ }
thd->lex->current_select->cond_count++;
/*
@@ -2794,7 +2809,11 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
}
if ((*conds) && !(*conds)->fixed &&
(*conds)->fix_fields(thd, tables, conds))
+ {
+ thd->lex->current_select->is_item_list_lookup=
+ save_is_item_list_lookup;
DBUG_RETURN(1);
+ }
}
}
if (table->natural_join)
@@ -2846,7 +2865,11 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
{
if (!(*conds)->fixed &&
(*conds)->fix_fields(thd, tables, conds))
+ {
+ thd->lex->current_select->is_item_list_lookup=
+ save_is_item_list_lookup;
DBUG_RETURN(1);
+ }
}
}
else
@@ -2859,7 +2882,11 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
{
if (!table->on_expr->fixed &&
table->on_expr->fix_fields(thd, tables, &table->on_expr))
- DBUG_RETURN(1);
+ {
+ thd->lex->current_select->is_item_list_lookup=
+ save_is_item_list_lookup;
+ DBUG_RETURN(1);
+ }
}
}
}
@@ -2881,9 +2908,11 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
*/
thd->lex->current_select->where= *conds;
}
+ thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
DBUG_RETURN(test(thd->net.report_error));
err:
+ thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
if (arena)
thd->restore_backup_item_arena(arena, &backup);
DBUG_RETURN(1);
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 9eb9d2640e9..af3ad782ee3 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -265,6 +265,7 @@ JOIN::prepare(Item ***rref_pointer_array,
select_lex->join= this;
union_part= (unit_arg->first_select()->next_select() != 0);
+ thd->lex->current_select->is_item_list_lookup= 1;
/* Check that all tables, fields, conds and order are ok */
if (setup_tables(tables_list) ||
@@ -8702,16 +8703,12 @@ find_order_in_list(THD *thd, Item **ref_pointer_array,
'it' reassigned in if condition because fix_field can change it.
*/
- thd->lex->current_select->is_item_list_lookup= 1;
if (!it->fixed &&
(it->fix_fields(thd, tables, order->item) ||
(it= *order->item)->check_cols(1) ||
thd->is_fatal_error))
- {
- thd->lex->current_select->is_item_list_lookup= 0;
return 1; // Wrong field
- }
- thd->lex->current_select->is_item_list_lookup= 0;
+
uint el= all_fields.elements;
all_fields.push_front(it); // Add new field to field list
ref_pointer_array[el]= it;