summaryrefslogtreecommitdiff
path: root/sql/item.cc
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2005-08-25 17:34:34 +0400
committerunknown <sergefp@mysql.com>2005-08-25 17:34:34 +0400
commit8a5e527453eebea99854f7b8f8faee364f620a11 (patch)
tree97a53e7de82a610327287be68d515c8dc566aeb2 /sql/item.cc
parent9017addfd8e0a232b24bfe61aa9821feb45350bb (diff)
downloadmariadb-git-8a5e527453eebea99854f7b8f8faee364f620a11.tar.gz
Fix for BUG#12335 (SP replication) : New binlogging strategy for stored PROCEDUREs/FUNCTIONs.
"Interleaved SPs execution is now binlogged properly, "SELECT spfunc()" is binlogged too. The known remaining issue is binlogging/replication of "a routine is deleted while it is executed" scenario. mysql-test/r/rpl_sp.result: Fix for BUG#12335: updated test cases/results mysql-test/t/rpl_sp.test: Fix for BUG#12335: updated test cases/results sql/item.cc: Fix for BUG#12335 (SP replication): - Added Item_name_const 'function' - Addede 'delete reuse' to call dtor on item reuse sql/item.h: Fix for BUG#12335 (SP replication) : Added Item_name_const 'function' + code cleanup sql/item_create.cc: Fix for BUG#12335 (SP replication) : Added Item_name_const 'function' sql/item_create.h: Fix for BUG#12335 (SP replication) : Added Item_name_const 'function' sql/item_func.cc: Fix for BUG#12335 (SP replication) : binary log is now constrolled from within execute_function. sql/lex.h: Fix for BUG#12335 (SP replication) : Added Item_name_const 'function' sql/log.cc: Fix for BUG#12335 (SP replication) : Added MYSQL_LOG::{start|stop}_union_events to allow one to temporary disable binlogging but collect a 'union' information about binlog write calls. sql/mysql_priv.h: Fix for BUG#12335 (SP replication) sql/sp_head.cc: Fix for BUG#12335 (SP replication) : Now we use different SP binlogging strategy, grep for StoredRoutinesBinlogging for details sql/sp_head.h: Comments added sql/sp_pcontext.h: Comments added sql/sp_rcontext.h: Comments added sql/sql_class.cc: Fix for BUG#12335 (SP replication) : Now we use different SP binlogging strategy, grep for StoredRoutinesBinlogging for details sql/sql_class.h: Fix for BUG#12335 (SP replication) : Added MYSQL_LOG::{start|stop}_union_events to allow one to temporary disable binlogging but collect a 'union' information about binlog write calls. sql/sql_delete.cc: Fix for BUG#12335: check THD::query_str_binlog_unsuitable when writing to binlog. sql/sql_insert.cc: Fix for BUG#12335: check THD::query_str_binlog_unsuitable when writing to binlog. sql/sql_lex.cc: Fix for BUG#12335 (SP replication): Add ability to extract previous returned token from the tokenizer. sql/sql_lex.h: Fix for BUG#12335 (SP replication): Add ability to extract previous returned token from the tokenizer. sql/sql_parse.cc: Fix for BUG#12335 (SP replication) : Now we use different SP binlogging strategy, grep for StoredRoutinesBinlogging for details sql/sql_update.cc: Fix for BUG#12335: check THD::query_str_binlog_unsuitable when writing to binlog. sql/sql_yacc.yy: Fix for BUG#12335 (SP replication) : When creating Item_splocal, remember where it is located in the query.
Diffstat (limited to 'sql/item.cc')
-rw-r--r--sql/item.cc105
1 files changed, 100 insertions, 5 deletions
diff --git a/sql/item.cc b/sql/item.cc
index d8f5a7cf9c4..41f49b5d000 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -303,6 +303,7 @@ void *Item::operator new(size_t size, Item *reuse, uint *rsize)
if (rsize)
(*rsize)= reuse->rsize;
reuse->cleanup();
+ delete reuse;
TRASH((void *)reuse, size);
return (void *)reuse;
}
@@ -789,12 +790,15 @@ int Item::save_in_field_no_warnings(Field *field, bool no_conversions)
}
+/*****************************************************************************
+ Item_splocal methods
+*****************************************************************************/
double Item_splocal::val_real()
{
DBUG_ASSERT(fixed);
Item *it= this_item();
double ret= it->val_real();
- Item::null_value= it->null_value;
+ null_value= it->null_value;
return ret;
}
@@ -804,7 +808,7 @@ longlong Item_splocal::val_int()
DBUG_ASSERT(fixed);
Item *it= this_item();
longlong ret= it->val_int();
- Item::null_value= it->null_value;
+ null_value= it->null_value;
return ret;
}
@@ -814,7 +818,7 @@ String *Item_splocal::val_str(String *sp)
DBUG_ASSERT(fixed);
Item *it= this_item();
String *ret= it->val_str(sp);
- Item::null_value= it->null_value;
+ null_value= it->null_value;
return ret;
}
@@ -824,7 +828,7 @@ my_decimal *Item_splocal::val_decimal(my_decimal *decimal_value)
DBUG_ASSERT(fixed);
Item *it= this_item();
my_decimal *val= it->val_decimal(decimal_value);
- Item::null_value= it->null_value;
+ null_value= it->null_value;
return val;
}
@@ -833,7 +837,7 @@ bool Item_splocal::is_null()
{
Item *it= this_item();
bool ret= it->is_null();
- Item::null_value= it->null_value;
+ null_value= it->null_value;
return ret;
}
@@ -898,6 +902,97 @@ void Item_splocal::print(String *str)
}
+/*****************************************************************************
+ Item_name_const methods
+*****************************************************************************/
+double Item_name_const::val_real()
+{
+ DBUG_ASSERT(fixed);
+ double ret= value_item->val_real();
+ null_value= value_item->null_value;
+ return ret;
+}
+
+
+longlong Item_name_const::val_int()
+{
+ DBUG_ASSERT(fixed);
+ longlong ret= value_item->val_int();
+ null_value= value_item->null_value;
+ return ret;
+}
+
+
+String *Item_name_const::val_str(String *sp)
+{
+ DBUG_ASSERT(fixed);
+ String *ret= value_item->val_str(sp);
+ null_value= value_item->null_value;
+ return ret;
+}
+
+
+my_decimal *Item_name_const::val_decimal(my_decimal *decimal_value)
+{
+ DBUG_ASSERT(fixed);
+ my_decimal *val= value_item->val_decimal(decimal_value);
+ Item::null_value= value_item->null_value;
+ return val;
+}
+
+
+bool Item_name_const::is_null()
+{
+ bool ret= value_item->is_null();
+ Item::null_value= value_item->null_value;
+ return ret;
+}
+
+Item::Type Item_name_const::type() const
+{
+ return value_item->type();
+}
+
+
+bool Item_name_const::fix_fields(THD *thd, Item **)
+{
+ char buf[128];
+ String *item_name;
+ String s(buf, sizeof(buf), &my_charset_bin);
+ s.length(0);
+
+ if (value_item->fix_fields(thd, &value_item) ||
+ name_item->fix_fields(thd, &name_item))
+ return TRUE;
+ if (!(value_item->const_item() && name_item->const_item()))
+ return TRUE;
+
+ if (!(item_name= name_item->val_str(&s)))
+ return TRUE; /* Can't have a NULL name */
+
+ set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info);
+ max_length= value_item->max_length;
+ decimals= value_item->decimals;
+ fixed= 1;
+ return FALSE;
+}
+
+
+void Item_name_const::cleanup()
+{
+ fixed= 0;
+}
+
+
+void Item_name_const::print(String *str)
+{
+ str->append("NAME_CONST(");
+ name_item->print(str);
+ str->append(',');
+ value_item->print(str);
+ str->append(')');
+}
+
/*
Move SUM items out from item tree and replace with reference