From: Alexander Nozdrin Date: April 22 2011 11:36am Subject: bzr commit into mysql-5.5 branch (alexander.nozdrin:3458) Bug#11848763 List-Archive: http://lists.mysql.com/commits/135951 X-Bug: 11848763 Message-Id: <201104221136.p3MBaKpG026286@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2979678570345872349==" --===============2979678570345872349== 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/ based on revid:jon.hauglid@stripped 3458 Alexander Nozdrin 2011-04-22 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 them 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-04-22 11:36:14 +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-04-12 10:13:15 +0000 +++ b/sql/item_cmpfunc.cc 2011-04-22 11:36:14 +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-04-20 07:52:40 +0000 +++ b/sql/item_func.cc 2011-04-22 11:36:14 +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-04-22 11:36:14 +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-04-22 11:36:14 +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-04-22 11:36:14 +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; --===============2979678570345872349== 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\ # 1mxgd4fq88h2fp9y # target_branch: file:///home/alik/MySQL/bzr/00/bug60025/mysql-5.5/ # testament_sha1: 42b03cf7c063be8d631b68abfea13d4b0808aa7e # timestamp: 2011-04-22 15:36:18 +0400 # base_revision_id: jon.hauglid@stripped\ # wqkqx1u7jjw06jrh # # Begin bundle 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 JOO8e8MzYs8yrZINRFeJYbAf/F3JFOFCQaUizHg= --===============2979678570345872349==--