Below is the list of changes that have just been committed into a local
5.1 repository of kgeorge. When kgeorge 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-26 17:03:57+03:00, gkodinov@stripped +13 -0
Merge magare.gmz:/home/kgeorge/mysql/work/WL3527-5.0-opt
into magare.gmz:/home/kgeorge/mysql/work/WL3527-5.1-opt
MERGE: 1.1810.2374.96
mysql-test/r/gis.result@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.35.1.7
mysql-test/r/subselect.result@stripped, 2007-03-26 17:03:55+03:00, gkodinov@stripped +19 -19
merge 5.0-opt -> 5.1-opt
MERGE: 1.134.1.47
mysql-test/t/gis.test@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.29.1.6
mysql-test/t/subselect.test@stripped, 2007-03-26 17:03:55+03:00, gkodinov@stripped +19 -19
merge 5.0-opt -> 5.1-opt
MERGE: 1.129.1.17
sql/field.h@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.153.12.14
sql/item.cc@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.113.1.146
sql/item_sum.cc@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.170.1.31
sql/item_sum.h@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.102.1.10
sql/sql_base.cc@stripped, 2007-03-26 17:03:55+03:00, gkodinov@stripped +0 -0
merge 5.0-opt -> 5.1-opt
MERGE: 1.235.1.138
sql/sql_class.h@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.230.1.97
sql/sql_delete.cc@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.144.1.50
sql/sql_insert.cc@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.146.1.81
sql/sql_select.cc@stripped, 2007-03-26 16:58:57+03:00, gkodinov@stripped +0 -0
Auto merged
MERGE: 1.312.1.190
# 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: gkodinov
# Host: magare.gmz
# Root: /home/kgeorge/mysql/work/WL3527-5.1-opt/RESYNC
--- 1.216/sql/field.h 2007-03-22 21:55:44 +02:00
+++ 1.217/sql/field.h 2007-03-26 16:58:57 +03:00
@@ -1353,7 +1353,7 @@ public:
int store_decimal(const my_decimal *);
void get_key_image(char *buff,uint length,imagetype type);
uint size_of() const { return sizeof(*this); }
- int reset(void) { return !maybe_null(); }
+ int reset(void) { return !maybe_null() || Field_blob::reset(); }
};
#endif /*HAVE_SPATIAL*/
--- 1.259/sql/item.cc 2007-03-26 14:04:17 +03:00
+++ 1.260/sql/item.cc 2007-03-26 16:58:57 +03:00
@@ -1291,15 +1291,18 @@ void Item::split_sum_func2(THD *thd, Ite
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.216/sql/item_sum.cc 2007-03-22 21:55:44 +02:00
+++ 1.217/sql/item_sum.cc 2007-03-26 16:58:57 +03:00
@@ -61,9 +61,9 @@ bool Item_sum::init_sum_func_check(THD *
/* 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 @@ bool Item_sum::check_sum_func(THD *thd,
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::check_sum_func(THD *thd,
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 @@ bool Item_sum::register_sum_func(THD *th
{
/* 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 @@ bool Item_sum::register_sum_func(THD *th
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 @@ bool Item_sum::register_sum_func(THD *th
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(List<Item> &list) :ar
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;
@@ -449,8 +452,7 @@ void Item_sum::update_used_tables ()
used_tables_cache&= PSEUDO_TABLE_BITS;
/* 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.117/sql/item_sum.h 2007-03-22 09:21:15 +02:00
+++ 1.118/sql/item_sum.h 2007-03-26 16:58:57 +03:00
@@ -233,6 +233,7 @@ public:
Item_sum *next; /* next in the circular chain of registered objects */
uint arg_count;
Item_sum *in_sum_func; /* embedding set function if any */
+ st_select_lex * aggr_sel; /* select where the function is aggregated */
int8 nest_level; /* number of the nesting level of the set function */
int8 aggr_level; /* nesting level of the aggregating subquery */
int8 max_arg_level; /* max level of unbound column references */
@@ -242,7 +243,6 @@ public:
protected:
table_map used_tables_cache;
bool forced_const;
- byte nest_level_tables_count;
public:
@@ -365,6 +365,8 @@ public:
bool init_sum_func_check(THD *thd);
bool check_sum_func(THD *thd, Item **ref);
bool register_sum_func(THD *thd, Item **ref);
+ st_select_lex *depended_from()
+ { return (nest_level == aggr_level ? 0 : aggr_sel); }
};
--- 1.349/sql/sql_class.h 2007-03-22 10:20:46 +02:00
+++ 1.350/sql/sql_class.h 2007-03-26 16:58:57 +03:00
@@ -1412,9 +1412,6 @@ public:
partition_info *work_part_info;
#endif
- /* pass up the count of "leaf" tables in a JOIN out of setup_tables() */
- byte leaf_count;
-
THD();
~THD();
--- 1.211/sql/sql_delete.cc 2007-03-09 16:55:58 +02:00
+++ 1.212/sql/sql_delete.cc 2007-03-26 16:58:57 +03:00
@@ -54,6 +54,27 @@ bool mysql_delete(THD *thd, TABLE_LIST *
if (mysql_prepare_delete(thd, table_list, &conds))
DBUG_RETURN(TRUE);
+ /* check ORDER BY even if it can be ignored */
+ if (order && order->elements)
+ {
+ TABLE_LIST tables;
+ List<Item> fields;
+ List<Item> all_fields;
+
+ bzero((char*) &tables,sizeof(tables));
+ tables.table = table;
+ tables.alias = table_list->alias;
+
+ if (select_lex->setup_ref_array(thd, order->elements) ||
+ setup_order(thd, select_lex->ref_pointer_array, &tables,
+ fields, all_fields, (ORDER*) order->first))
+ {
+ delete select;
+ free_underlaid_joins(thd, &thd->lex->select_lex);
+ DBUG_RETURN(TRUE);
+ }
+ }
+
const_cond= (!conds || conds->const_item());
safe_update=test(thd->options & OPTION_SAFE_UPDATES);
if (safe_update && const_cond)
@@ -155,23 +176,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *
{
uint length= 0;
SORT_FIELD *sortorder;
- TABLE_LIST tables;
- List<Item> fields;
- List<Item> all_fields;
ha_rows examined_rows;
-
- bzero((char*) &tables,sizeof(tables));
- tables.table = table;
- tables.alias = table_list->alias;
-
- if (select_lex->setup_ref_array(thd, order->elements) ||
- setup_order(thd, select_lex->ref_pointer_array, &tables,
- fields, all_fields, (ORDER*) order->first))
- {
- delete select;
- free_underlaid_joins(thd, &thd->lex->select_lex);
- DBUG_RETURN(TRUE);
- }
if ((!select || table->quick_keys.is_clear_all()) && limit != HA_POS_ERROR)
usable_index= get_index_for_order(table, (ORDER*)(order->first), limit);
--- 1.255/sql/sql_insert.cc 2007-03-22 09:21:16 +02:00
+++ 1.256/sql/sql_insert.cc 2007-03-26 16:58:57 +03:00
@@ -2466,14 +2466,12 @@ bool mysql_insert_select_prepare(THD *th
DBUG_ASSERT(select_lex->leaf_tables != 0);
lex->leaf_tables_insert= select_lex->leaf_tables;
/* skip all leaf tables belonged to view where we are insert */
- for (first_select_leaf_table= select_lex->leaf_tables->next_leaf,
- thd->leaf_count --;
+ for (first_select_leaf_table= select_lex->leaf_tables->next_leaf;
first_select_leaf_table &&
first_select_leaf_table->belong_to_view &&
first_select_leaf_table->belong_to_view ==
lex->leaf_tables_insert->belong_to_view;
- first_select_leaf_table= first_select_leaf_table->next_leaf,
- thd->leaf_count --)
+ first_select_leaf_table= first_select_leaf_table->next_leaf)
{}
select_lex->leaf_tables= first_select_leaf_table;
DBUG_RETURN(FALSE);
--- 1.502/sql/sql_select.cc 2007-03-22 10:22:13 +02:00
+++ 1.503/sql/sql_select.cc 2007-03-26 16:58:57 +03:00
@@ -413,7 +413,12 @@ JOIN::prepare(Item ***rref_pointer_array
tables_list, &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) ||
@@ -9417,13 +9422,19 @@ create_tmp_table(THD *thd,TMP_TABLE_PARA
{
if (item->with_sum_func && type != Item::SUM_FUNC_ITEM)
{
- /*
- Mark that the we have ignored an item that refers to a summary
- function. We need to know this if someone is going to use
- DISTINCT on the result.
- */
- param->using_indirect_summary_function=1;
- continue;
+ if (item->used_tables() & OUTER_REF_TABLE_BIT)
+ item->update_used_tables();
+ if (type == Item::SUBSELECT_ITEM ||
+ (item->used_tables() & ~OUTER_REF_TABLE_BIT))
+ {
+ /*
+ Mark that the we have ignored an item that refers to a summary
+ function. We need to know this if someone is going to use
+ DISTINCT on the result.
+ */
+ param->using_indirect_summary_function=1;
+ continue;
+ }
}
if (item->const_item() && (int) hidden_field_count <= 0)
continue; // We don't have to store this
@@ -9608,6 +9619,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARA
share->default_values= table->record[1]+alloc_length;
}
copy_func[0]=0; // End marker
+ param->func_count= copy_func - param->items_to_copy;
setup_tmp_table_column_bitmaps(table, bitmaps);
@@ -13824,6 +13836,7 @@ count_field_types(TMP_TABLE_PARAM *param
if (!sum_item->quick_group)
param->quick_group=0; // UDF SUM function
param->sum_func_count++;
+ param->func_count++;
for (uint i=0 ; i < sum_item->arg_count ; i++)
{
--- 1.175/mysql-test/r/subselect.result 2007-03-22 09:25:24 +02:00
+++ 1.176/mysql-test/r/subselect.result 2007-03-26 17:03:55 +03:00
@@ -3905,6 +3905,25 @@ COUNT(*) a
2 2
3 3
DROP TABLE t1,t2;
+CREATE TABLE t1 (a int, b int);
+CREATE TABLE t2 (m int, n int);
+INSERT INTO t1 VALUES (2,2), (2,2), (3,3), (3,3), (3,3), (4,4);
+INSERT INTO t2 VALUES (1,11), (2,22), (3,32), (4,44), (4,44);
+SELECT COUNT(*) c, a,
+(SELECT GROUP_CONCAT(COUNT(a)) FROM t2 WHERE m = a)
+FROM t1 GROUP BY a;
+c a (SELECT GROUP_CONCAT(COUNT(a)) FROM t2 WHERE m = a)
+2 2 2
+3 3 3
+1 4 1,1
+SELECT COUNT(*) c, a,
+(SELECT GROUP_CONCAT(COUNT(a)+1) FROM t2 WHERE m = a)
+FROM t1 GROUP BY a;
+c a (SELECT GROUP_CONCAT(COUNT(a)+1) FROM t2 WHERE m = a)
+2 2 3
+3 3 4
+1 4 2,2
+DROP table t1,t2;
CREATE TABLE t1 (s1 char(1));
INSERT INTO t1 VALUES ('a');
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
--- 1.149/mysql-test/t/subselect.test 2007-03-22 09:26:57 +02:00
+++ 1.150/mysql-test/t/subselect.test 2007-03-26 17:03:55 +03:00
@@ -2765,6 +2765,25 @@ SELECT COUNT(*), a
DROP TABLE t1,t2;
#
+# Bug #27229: GROUP_CONCAT in subselect with COUNT() as an argument
+#
+
+CREATE TABLE t1 (a int, b int);
+CREATE TABLE t2 (m int, n int);
+INSERT INTO t1 VALUES (2,2), (2,2), (3,3), (3,3), (3,3), (4,4);
+INSERT INTO t2 VALUES (1,11), (2,22), (3,32), (4,44), (4,44);
+
+SELECT COUNT(*) c, a,
+ (SELECT GROUP_CONCAT(COUNT(a)) FROM t2 WHERE m = a)
+ FROM t1 GROUP BY a;
+
+SELECT COUNT(*) c, a,
+ (SELECT GROUP_CONCAT(COUNT(a)+1) FROM t2 WHERE m = a)
+ FROM t1 GROUP BY a;
+
+DROP table t1,t2;
+
+#
# Bug#20835 (literal string with =any values)
#
CREATE TABLE t1 (s1 char(1));
--- 1.43/mysql-test/r/gis.result 2007-03-05 15:12:36 +02:00
+++ 1.44/mysql-test/r/gis.result 2007-03-26 16:58:57 +03:00
@@ -730,6 +730,12 @@ point(b, b) IS NULL linestring(b) IS NUL
1 1 1 1 1 1 1
0 1 1 1 1 1 1
drop table t1;
+CREATE TABLE t1(a POINT) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (NULL);
+SELECT * FROM t1;
+a
+NULL
+DROP TABLE t1;
End of 4.1 tests
create table t1 (s1 geometry not null,s2 char(100));
create trigger t1_bu before update on t1 for each row set new.s1 = null;
--- 1.36/mysql-test/t/gis.test 2007-03-22 23:46:00 +02:00
+++ 1.37/mysql-test/t/gis.test 2007-03-26 16:58:57 +03:00
@@ -424,6 +424,14 @@ from t1;
drop table t1;
+#
+# Bug #27164: Crash when mixing InnoDB and MyISAM Geospatial tables
+#
+CREATE TABLE t1(a POINT) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (NULL);
+SELECT * FROM t1;
+DROP TABLE t1;
+
--echo End of 4.1 tests
#
| Thread |
|---|
| • bk commit into 5.1 tree (gkodinov:1.2505) | kgeorge | 26 Mar |