From: Alexander Nozdrin Date: May 6 2011 11:39am Subject: bzr commit into mysql-5.5 branch (alexander.nozdrin:3496) Bug#11848763 List-Archive: http://lists.mysql.com/commits/136820 X-Bug: 11848763 Message-Id: <201105061139.p46BdkBZ031842@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============9164233454031402885==" --===============9164233454031402885== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/alik/MySQL/bzr/00/bug60025/mysql-5.5-bug60025/ based on revid:magnus.blaudd@stripped 3496 Alexander Nozdrin 2011-05-06 Preliminary patch for Bug#11848763 / 60025 (SUBSTRING inside a stored function works too slow). Background: - THD classes derives from Query_arena, thus inherits the 'state' attribute and related operations (is_stmt_prepare() & co). - Although these operations are available in THD, they must not be used. THD has its own attribute to point to the active Query_arena -- stmt_arena. - So, instead of using thd->is_stmt_prepare(), thd->stmt_arena->is_stmt_prepare() must be used. This was the root cause of Bug 60025. This patch enforces the proper way of calling those operations. is_stmt_prepare() & co are declared as private operations in THD (thus, they are hidden from being called on THD instance). The patch tries to minimize changes in 5.5. modified: sql/item.cc sql/item_cmpfunc.cc sql/item_func.cc sql/item_row.cc sql/item_strfunc.cc sql/sql_class.h === modified file 'sql/item.cc' --- a/sql/item.cc 2011-04-08 13:15:23 +0000 +++ b/sql/item.cc 2011-05-06 11:39:40 +0000 @@ -581,7 +581,7 @@ void Item::rename(char *new_name) Item* Item::transform(Item_transformer transformer, uchar *arg) { - DBUG_ASSERT(!current_thd->is_stmt_prepare()); + DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare()); return (this->*transformer)(arg); } @@ -1845,7 +1845,7 @@ bool agg_item_set_converter(DTCollation been created in prepare. In this case register the change for rollback. */ - if (thd->is_stmt_prepare()) + if (thd->stmt_arena->is_stmt_prepare()) *arg= conv; else thd->change_item_tree(arg, conv); @@ -6965,7 +6965,7 @@ int Item_default_value::save_in_field(Fi Item *Item_default_value::transform(Item_transformer transformer, uchar *args) { - DBUG_ASSERT(!current_thd->is_stmt_prepare()); + DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare()); /* If the value of arg is NULL, then this object represents a constant, === modified file 'sql/item_cmpfunc.cc' --- a/sql/item_cmpfunc.cc 2011-05-06 08:27:04 +0000 +++ b/sql/item_cmpfunc.cc 2011-05-06 11:39:40 +0000 @@ -4345,7 +4345,7 @@ bool Item_cond::walk(Item_processor proc Item *Item_cond::transform(Item_transformer transformer, uchar *arg) { - DBUG_ASSERT(!current_thd->is_stmt_prepare()); + DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare()); List_iterator li(list); Item *item; @@ -5718,7 +5718,7 @@ bool Item_equal::walk(Item_processor pro Item *Item_equal::transform(Item_transformer transformer, uchar *arg) { - DBUG_ASSERT(!current_thd->is_stmt_prepare()); + DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare()); List_iterator it(fields); Item *item; === modified file 'sql/item_func.cc' --- a/sql/item_func.cc 2011-05-06 08:27:04 +0000 +++ b/sql/item_func.cc 2011-05-06 11:39:40 +0000 @@ -293,7 +293,7 @@ void Item_func::traverse_cond(Cond_trave Item *Item_func::transform(Item_transformer transformer, uchar *argument) { - DBUG_ASSERT(!current_thd->is_stmt_prepare()); + DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare()); if (arg_count) { === modified file 'sql/item_row.cc' --- a/sql/item_row.cc 2011-03-08 17:39:25 +0000 +++ b/sql/item_row.cc 2011-05-06 11:39:40 +0000 @@ -170,7 +170,7 @@ bool Item_row::walk(Item_processor proce Item *Item_row::transform(Item_transformer transformer, uchar *arg) { - DBUG_ASSERT(!current_thd->is_stmt_prepare()); + DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare()); for (uint i= 0; i < arg_count; i++) { === modified file 'sql/item_strfunc.cc' --- a/sql/item_strfunc.cc 2011-04-08 13:15:23 +0000 +++ b/sql/item_strfunc.cc 2011-05-06 11:39:40 +0000 @@ -2536,7 +2536,7 @@ String *Item_func_make_set::val_str(Stri Item *Item_func_make_set::transform(Item_transformer transformer, uchar *arg) { - DBUG_ASSERT(!current_thd->is_stmt_prepare()); + DBUG_ASSERT(!current_thd->stmt_arena->is_stmt_prepare()); Item *new_item= item->transform(transformer, arg); if (!new_item) === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2011-04-15 12:02:22 +0000 +++ b/sql/sql_class.h 2011-05-06 11:39:40 +0000 @@ -655,15 +655,10 @@ public: virtual ~Query_arena() {}; inline bool is_stmt_prepare() const { return state == INITIALIZED; } - inline bool is_first_sp_execute() const - { return state == INITIALIZED_FOR_SP; } inline bool is_stmt_prepare_or_first_sp_execute() const { return (int)state < (int)PREPARED; } inline bool is_stmt_prepare_or_first_stmt_execute() const { return (int)state <= (int)PREPARED; } - inline bool is_first_stmt_execute() const { return state == PREPARED; } - inline bool is_stmt_execute() const - { return state == PREPARED || state == EXECUTED; } inline bool is_conventional() const { return state == CONVENTIONAL_EXECUTION; } @@ -1434,6 +1429,19 @@ extern "C" void my_message_sql(uint erro class THD :public Statement, public Open_tables_state { +private: + inline bool is_stmt_prepare() const + { DBUG_ASSERT(0); return Statement::is_stmt_prepare(); } + + inline bool is_stmt_prepare_or_first_sp_execute() const + { DBUG_ASSERT(0); return Statement::is_stmt_prepare_or_first_sp_execute(); } + + inline bool is_stmt_prepare_or_first_stmt_execute() const + { DBUG_ASSERT(0); return Statement::is_stmt_prepare_or_first_stmt_execute(); } + + inline bool is_conventional() const + { DBUG_ASSERT(0); return Statement::is_conventional(); } + public: MDL_context mdl_context; --===============9164233454031402885== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.nozdrin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.nozdrin@stripped\ # vi12q2mulw2cr768 # target_branch: file:///home/alik/MySQL/bzr/00/bug60025/mysql-5.5-\ # bug60025/ # testament_sha1: 497c61d2b2608981358719fd3a90525470a10871 # timestamp: 2011-05-06 15:39:44 +0400 # source_branch: file:///home/alik/MySQL/bzr/00/bug60025/mysql-5.5/ # base_revision_id: magnus.blaudd@stripped\ # c7dyjvhkfojft2dn # # Begin bundle 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 hkA= --===============9164233454031402885==--