summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2007-02-24 23:04:47 +0300
committerunknown <evgen@moonbone.local>2007-02-24 23:04:47 +0300
commit9d142a6d80b381ad2c433f3c02b95be50c09b1aa (patch)
tree5f69de8bcdfba00b7cde5ca9846bf13ddc3eb874
parent1f93b0c83af4b30b90e3a71eb6f2a663375feebc (diff)
parentb1e1f77f1ffcbd1f3f9d07d8da598061ea2cb75c (diff)
downloadmariadb-git-9d142a6d80b381ad2c433f3c02b95be50c09b1aa.tar.gz
Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.0-opt
into moonbone.local:/mnt/gentoo64/work/23800-bug1-5.0-opt-mysql
-rw-r--r--sql/item.cc3
-rw-r--r--sql/sql_lex.cc2
-rw-r--r--sql/sql_lex.h5
-rw-r--r--sql/sql_yacc.yy6
4 files changed, 16 insertions, 0 deletions
diff --git a/sql/item.cc b/sql/item.cc
index a57f3c0fa96..9149a1240ea 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -1664,7 +1664,10 @@ Item_field::Item_field(Name_resolution_context *context_arg,
field(0), result_field(0), item_equal(0), no_const_subst(0),
have_privileges(0), any_privileges(0), fixed_as_field(0)
{
+ SELECT_LEX *select= current_thd->lex->current_select;
collation.set(DERIVATION_IMPLICIT);
+ if (select && select->parsing_place != IN_HAVING)
+ select->select_n_where_fields++;
}
// Constructor need to process subselect with temporary tables (see Item)
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index c3e18394c41..cd26bfbc6f8 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1151,6 +1151,7 @@ void st_select_lex::init_query()
cond_count= between_count= with_wild= 0;
conds_processed_with_permanent_arena= 0;
ref_pointer_array= 0;
+ select_n_where_fields= 0;
select_n_having_items= 0;
subquery_in_having= explicit_limit= 0;
is_item_list_lookup= 0;
@@ -1550,6 +1551,7 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num)
(Item **)arena->alloc(sizeof(Item*) * (n_child_sum_items +
item_list.elements +
select_n_having_items +
+ select_n_where_fields +
order_group_num)*5)) == 0;
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index f8d8e6efcb2..d2171f745c1 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -530,6 +530,11 @@ public:
uint select_n_having_items;
uint cond_count; /* number of arguments of and/or/xor in where/having/on */
uint between_count; /* number of between predicates in where/having/on */
+ /*
+ Number of fields used in select list or where clause of current select
+ and all inner subselects.
+ */
+ uint select_n_where_fields;
enum_parsing_place parsing_place; /* where we are parsing expression */
bool with_sum_func; /* sum function indicator */
/*
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index d5b3aadbf39..2e9cc662ba8 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -9275,6 +9275,12 @@ subselect_end:
lex->current_select = lex->current_select->return_after_parsing();
lex->nest_level--;
lex->current_select->n_child_sum_items += child->n_sum_items;
+ /*
+ A subselect can add fields to an outer select. Reserve space for
+ them.
+ */
+ lex->current_select->select_n_where_fields+=
+ child->select_n_where_fields;
};
/**************************************************************************