#At file:///export/home/tmp/mysql2/subselect/ based on revid:davi.arnaut@stripped
3135 Olav Sandstaa 2011-06-01
This is preparation patch for Bug#12355958 "FAILING ASSERTION:
TRX->LOCK.N_ACTIVE_THRS == 1". It does not contain the fix for
the bug but will make the bug fix simpler/better.
The Item::with_subselect member variable is public and is used
directly in code outside the Item tree. This patch changes this
to be protected and adds a new method Item::has_subquery() for
getting the value of it.
The patch should not change any behavior.
@ sql/item.cc
Changes in order for initialization of with_subselect in
Item constructors.
@ sql/item.h
Make Item::with_subselect protected and add a getter
fuction Item::has_subquery().
@ sql/item_cmpfunc.cc
Use the new Item::has_subquery() function instead of accessing
Item::with_subselect directly.
@ sql/item_func.cc
Use the new Item::has_subquery() function instead of accessing
Item::with_subselect directly.
@ sql/sql_select.cc
Use the new Item::has_subquery() function instead of accessing
Item::with_subselect directly.
modified:
sql/item.cc
sql/item.h
sql/item_cmpfunc.cc
sql/item_func.cc
sql/sql_select.cc
=== modified file 'sql/item.cc'
=== modified file 'sql/item.cc'
--- a/sql/item.cc 2011-05-26 15:20:09 +0000
+++ b/sql/item.cc 2011-06-01 08:03:48 +0000
@@ -419,12 +419,11 @@
Item::Item():
is_expensive_cache(-1), rsize(0), name(0), orig_name(0), name_length(0),
fixed(0), is_autogenerated_name(TRUE),
- collation(&my_charset_bin, DERIVATION_COERCIBLE)
+ collation(&my_charset_bin, DERIVATION_COERCIBLE), with_subselect(false)
{
marker= 0;
maybe_null=null_value=with_sum_func=unsigned_flag=0;
decimals= 0; max_length= 0;
- with_subselect= 0;
cmp_context= (Item_result)-1;
/* Put item in free list so that we can free all items at end */
@@ -470,8 +469,8 @@
fixed(item->fixed),
is_autogenerated_name(item->is_autogenerated_name),
collation(item->collation),
- with_subselect(item->with_subselect),
- cmp_context(item->cmp_context)
+ cmp_context(item->cmp_context),
+ with_subselect(item->with_subselect)
{
next= thd->free_list; // Put in free list
thd->free_list= this;
=== modified file 'sql/item.h'
--- a/sql/item.h 2011-05-26 15:20:09 +0000
+++ b/sql/item.h 2011-06-01 08:03:48 +0000
@@ -567,10 +567,13 @@
my_bool is_autogenerated_name; /* indicate was name of this Item
autogenerated or set by user */
DTCollation collation;
+ Item_result cmp_context; /* Comparison context */
+ protected:
my_bool with_subselect; /* If this item is a subselect or some
of its arguments is or contains a
subselect. Computed by fix_fields. */
- Item_result cmp_context; /* Comparison context */
+
+ public:
// alloc & destruct is done as start of select using sql_alloc
Item();
/*
@@ -1301,6 +1304,11 @@
@retval FALSE Otherwise.
*/
bool is_blob_field() const;
+
+ /**
+ Checks if this item or any of its arguments contains a subquery.
+ */
+ virtual bool has_subquery() const { return with_subselect; }
};
=== modified file 'sql/item_cmpfunc.cc'
--- a/sql/item_cmpfunc.cc 2011-05-26 05:50:01 +0000
+++ b/sql/item_cmpfunc.cc 2011-06-01 08:03:48 +0000
@@ -4404,7 +4404,7 @@
const_item_cache= FALSE;
}
with_sum_func= with_sum_func || item->with_sum_func;
- with_subselect|= item->with_subselect;
+ with_subselect|= item->has_subquery();
if (item->maybe_null)
maybe_null=1;
}
=== modified file 'sql/item_func.cc'
--- a/sql/item_func.cc 2011-05-26 10:13:07 +0000
+++ b/sql/item_func.cc 2011-06-01 08:03:48 +0000
@@ -218,7 +218,7 @@
used_tables_cache|= item->used_tables();
not_null_tables_cache|= item->not_null_tables();
const_item_cache&= item->const_item();
- with_subselect|= item->with_subselect;
+ with_subselect|= item->has_subquery();
}
}
fix_length_and_dec();
=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc 2011-05-26 15:20:09 +0000
+++ b/sql/sql_select.cc 2011-06-01 08:03:48 +0000
@@ -10118,7 +10118,7 @@
contains a subquery. If this is the case we do not include this
part of the condition.
*/
- return !item->with_subselect;
+ return !item->has_subquery();
}
const Item::Type item_type= item->type();
@@ -11971,7 +11971,7 @@
*simple_order=0; // Must do a temp table to sort
else if (!(order_tables & not_const_tables))
{
- if (order->item[0]->with_subselect &&
+ if (order->item[0]->has_subquery() &&
!(join->select_lex->options & SELECT_DESCRIBE))
order->item[0]->val_str(&order->item[0]->str_value);
DBUG_PRINT("info",("removing: %s", order->item[0]->full_name()));
Attachment: [text/bzr-bundle] bzr/olav.sandstaa@oracle.com-20110601080348-n4kquodzu3c0apqd.bundle