Below is the list of changes that have just been committed into a local
5.0 repository of igor. When igor does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-03-22 14:51:20-07:00, igor@stripped +4 -0
Merge olga.mysql.com:/home/igor/mysql-5.0-opt
into olga.mysql.com:/home/igor/dev-opt/mysql-5.0-opt-bug27229
MERGE: 1.2392.106.1
sql/item.cc@stripped, 2007-03-22 14:51:14-07:00, igor@stripped +0 -0
Auto merged
MERGE: 1.256.2.1
sql/item_sum.cc@stripped, 2007-03-22 14:51:14-07:00, igor@stripped +0 -0
Auto merged
MERGE: 1.198.1.1
sql/sql_base.cc@stripped, 2007-03-22 14:51:14-07:00, igor@stripped +0 -0
Auto merged
MERGE: 1.370.1.2
sql/sql_select.cc@stripped, 2007-03-22 14:51:14-07:00, igor@stripped +0 -0
Auto merged
MERGE: 1.498.1.2
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: igor
# Host: olga.mysql.com
# Root: /home/igor/dev-opt/mysql-5.0-opt-bug27229/RESYNC
--- 1.258/sql/item.cc 2007-03-22 14:51:25 -07:00
+++ 1.259/sql/item.cc 2007-03-22 14:51:25 -07:00
@@ -1261,15 +1261,18 @@
Exception is Item_direct_view_ref which we need to convert to
Item_ref to allow fields from view being stored in tmp table.
*/
+ Item_aggregate_ref *item_ref;
uint el= fields.elements;
- Item *new_item, *real_itm= real_item();
+ Item *real_itm= real_item();
ref_pointer_array[el]= real_itm;
- if (!(new_item= new Item_aggregate_ref(&thd->lex->current_select->context,
+ if (!(item_ref= new Item_aggregate_ref(&thd->lex->current_select->context,
ref_pointer_array + el, 0, name)))
return; // fatal_error is set
+ if (type() == SUM_FUNC_ITEM)
+ item_ref->depended_from= ((Item_sum *) this)->depended_from();
fields.push_front(real_itm);
- thd->change_item_tree(ref, new_item);
+ thd->change_item_tree(ref, item_ref);
}
}
--- 1.199/sql/item_sum.cc 2007-03-22 14:51:25 -07:00
+++ 1.200/sql/item_sum.cc 2007-03-22 14:51:25 -07:00
@@ -61,9 +61,9 @@
/* Save a pointer to object to be used in items for nested set functions */
thd->lex->in_sum_func= this;
nest_level= thd->lex->current_select->nest_level;
- nest_level_tables_count= thd->lex->current_select->join->tables;
ref_by= 0;
aggr_level= -1;
+ aggr_sel= NULL;
max_arg_level= -1;
max_sum_func_level= -1;
return FALSE;
@@ -151,7 +151,10 @@
invalid= aggr_level < 0 && !(allow_sum_func & (1 << nest_level));
}
if (!invalid && aggr_level < 0)
+ {
aggr_level= nest_level;
+ aggr_sel= thd->lex->current_select;
+ }
/*
By this moment we either found a subquery where the set function is
to be aggregated and assigned a value that is >= 0 to aggr_level,
@@ -212,7 +215,6 @@
bool Item_sum::register_sum_func(THD *thd, Item **ref)
{
SELECT_LEX *sl;
- SELECT_LEX *aggr_sl= NULL;
nesting_map allow_sum_func= thd->lex->allow_sum_func;
for (sl= thd->lex->current_select->master_unit()->outer_select() ;
sl && sl->nest_level > max_arg_level;
@@ -222,7 +224,7 @@
{
/* Found the most nested subquery where the function can be aggregated */
aggr_level= sl->nest_level;
- aggr_sl= sl;
+ aggr_sel= sl;
}
}
if (sl && (allow_sum_func & (1 << sl->nest_level)))
@@ -233,21 +235,22 @@
The set function will be aggregated in this subquery.
*/
aggr_level= sl->nest_level;
- aggr_sl= sl;
+ aggr_sel= sl;
+
}
if (aggr_level >= 0)
{
ref_by= ref;
- /* Add the object to the list of registered objects assigned to aggr_sl */
- if (!aggr_sl->inner_sum_func_list)
+ /* Add the object to the list of registered objects assigned to aggr_sel */
+ if (!aggr_sel->inner_sum_func_list)
next= this;
else
{
- next= aggr_sl->inner_sum_func_list->next;
- aggr_sl->inner_sum_func_list->next= this;
+ next= aggr_sel->inner_sum_func_list->next;
+ aggr_sel->inner_sum_func_list->next= this;
}
- aggr_sl->inner_sum_func_list= this;
- aggr_sl->with_sum_func= 1;
+ aggr_sel->inner_sum_func_list= this;
+ aggr_sel->with_sum_func= 1;
/*
Mark Item_subselect(s) as containing aggregate function all the way up
@@ -265,11 +268,11 @@
has aggregate functions directly referenced (i.e. not through a sub-select).
*/
for (sl= thd->lex->current_select;
- sl && sl != aggr_sl && sl->master_unit()->item;
+ sl && sl != aggr_sel && sl->master_unit()->item;
sl= sl->master_unit()->outer_select() )
sl->master_unit()->item->with_sum_func= 1;
}
- thd->lex->current_select->mark_as_dependent(aggr_sl);
+ thd->lex->current_select->mark_as_dependent(aggr_sel);
return FALSE;
}
@@ -299,10 +302,10 @@
Item_sum::Item_sum(THD *thd, Item_sum *item):
Item_result_field(thd, item), arg_count(item->arg_count),
+ aggr_sel(item->aggr_sel),
nest_level(item->nest_level), aggr_level(item->aggr_level),
quick_group(item->quick_group), used_tables_cache(item->used_tables_cache),
- forced_const(item->forced_const),
- nest_level_tables_count(item->nest_level_tables_count)
+ forced_const(item->forced_const)
{
if (arg_count <= 2)
args=tmp_args;
@@ -447,7 +450,7 @@
/* the aggregate function is aggregated into its local context */
if (aggr_level == nest_level)
- used_tables_cache |= (1 << nest_level_tables_count) - 1;
+ used_tables_cache |= (1 << aggr_sel->join->tables) - 1;
}
}
--- 1.372/sql/sql_base.cc 2007-03-22 14:51:25 -07:00
+++ 1.373/sql/sql_base.cc 2007-03-22 14:51:25 -07:00
@@ -4865,7 +4865,6 @@
TABLE_LIST *leaves_tmp = NULL;
bool first_table= true;
- thd->leaf_count= 0;
if (setup_tables (thd, context, from_clause, tables, conds,
&leaves_tmp, select_insert))
return TRUE;
@@ -4883,7 +4882,6 @@
return TRUE;
}
first_table= false;
- thd->leaf_count++;
}
return FALSE;
}
--- 1.500/sql/sql_select.cc 2007-03-22 14:51:26 -07:00
+++ 1.501/sql/sql_select.cc 2007-03-22 14:51:26 -07:00
@@ -412,7 +412,12 @@
&select_lex->leaf_tables, FALSE,
SELECT_ACL, SELECT_ACL))
DBUG_RETURN(-1);
- tables= thd->leaf_count;
+
+ TABLE_LIST *table_ptr;
+ for (table_ptr= select_lex->leaf_tables;
+ table_ptr;
+ table_ptr= table_ptr->next_leaf)
+ tables++;
if (setup_wild(thd, tables_list, fields_list, &all_fields, wild_num) ||
select_lex->setup_ref_array(thd, og_num) ||
@@ -9191,7 +9196,9 @@
Item::Type type=item->type();
if (not_all_columns)
{
- if (item->with_sum_func && type != Item::SUM_FUNC_ITEM)
+ if (item->with_sum_func && type != Item::SUM_FUNC_ITEM &&
+ (type == Item::SUBSELECT_ITEM ||
+ (item->used_tables() & ~PSEUDO_TABLE_BITS)))
{
/*
Mark that the we have ignored an item that refers to a summary
| Thread |
|---|
| • bk commit into 5.0 tree (igor:1.2416) | igor | 22 Mar |