summaryrefslogtreecommitdiff
path: root/sql/item.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/item.cc')
-rw-r--r--sql/item.cc38
1 files changed, 38 insertions, 0 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 9e9f71abeba..ab13761167b 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -387,6 +387,8 @@ Item::Item():
decimals= 0; max_length= 0;
with_subselect= 0;
cmp_context= IMPOSSIBLE_RESULT;
+ /* Initially this item is not attached to any JOIN_TAB. */
+ join_tab_idx= MAX_TABLES;
/* Put item in free list so that we can free all items at end */
THD *thd= current_thd;
@@ -415,6 +417,7 @@ Item::Item():
tables.
*/
Item::Item(THD *thd, Item *item):
+ join_tab_idx(item->join_tab_idx),
is_expensive_cache(-1),
rsize(0),
str_value(item->str_value),
@@ -474,6 +477,7 @@ void Item::cleanup()
DBUG_PRINT("enter", ("this: %p", this));
fixed=0;
marker= 0;
+ join_tab_idx= MAX_TABLES;
if (orig_name)
name= orig_name;
DBUG_VOID_RETURN;
@@ -6773,6 +6777,40 @@ bool Item_direct_ref::get_date(MYSQL_TIME *ltime,uint fuzzydate)
}
+Item* Item_direct_ref_to_ident::transform(Item_transformer transformer,
+ uchar *argument)
+{
+ DBUG_ASSERT(!current_thd->is_stmt_prepare());
+
+ Item *new_item= ident->transform(transformer, argument);
+ if (!new_item)
+ return 0;
+ DBUG_ASSERT(new_item->type() == FIELD_ITEM || new_item->type() == REF_ITEM);
+
+ if (ident != new_item)
+ current_thd->change_item_tree((Item**)&ident, new_item);
+ return (this->*transformer)(argument);
+}
+
+
+Item* Item_direct_ref_to_ident::compile(Item_analyzer analyzer, uchar **arg_p,
+ Item_transformer transformer,
+ uchar *arg_t)
+{
+ if (!(this->*analyzer)(arg_p))
+ return 0;
+
+ uchar *arg_v= *arg_p;
+ Item *new_item= ident->compile(analyzer, &arg_v, transformer, arg_t);
+ if (new_item && ident != new_item)
+ {
+ DBUG_ASSERT(new_item->type() == FIELD_ITEM || new_item->type() == REF_ITEM);
+ current_thd->change_item_tree((Item**)&ident, new_item);
+ }
+ return (this->*transformer)(arg_t);
+}
+
+
Item_cache_wrapper::~Item_cache_wrapper()
{
DBUG_ASSERT(expr_cache == 0);