From: Sergey Glukhov Date: December 14 2010 11:15am Subject: bzr commit into mysql-trunk-bugfixing branch (sergey.glukhov:3426) List-Archive: http://lists.mysql.com/commits/126742 Message-Id: <201012141125.oBEBPJxg005357@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///home/gluh/MySQL/mysql-trunk-bugfixing/ based on revid:anitha.gopi@stripped 3426 Sergey Glukhov 2010-12-14 [merge] 5.5-bugteam->trunk-bugfixing merge @ mysql-test/r/derived.result 5.5-bugteam->trunk-bugfixing merge @ mysql-test/r/multi_update.result 5.5-bugteam->trunk-bugfixing merge @ mysql-test/r/view.result 5.5-bugteam->trunk-bugfixing merge @ mysql-test/suite/innodb/r/innodb_multi_update.result 5.5-bugteam->trunk-bugfixing merge @ mysql-test/suite/innodb/t/innodb_multi_update.test 5.5-bugteam->trunk-bugfixing merge @ mysql-test/t/derived.test 5.5-bugteam->trunk-bugfixing merge @ mysql-test/t/multi_update.test 5.5-bugteam->trunk-bugfixing merge @ mysql-test/t/view.test 5.5-bugteam->trunk-bugfixing merge @ sql/item.cc 5.5-bugteam->trunk-bugfixing merge @ sql/item_cmpfunc.cc 5.5-bugteam->trunk-bugfixing merge @ sql/item_func.cc 5.5-bugteam->trunk-bugfixing merge @ sql/item_row.cc 5.5-bugteam->trunk-bugfixing merge @ sql/item_subselect.cc 5.5-bugteam->trunk-bugfixing merge @ sql/item_subselect.h 5.5-bugteam->trunk-bugfixing merge @ sql/sql_class.h 5.5-bugteam->trunk-bugfixing merge @ sql/sql_derived.cc 5.5-bugteam->trunk-bugfixing merge @ sql/sql_lex.cc 5.5-bugteam->trunk-bugfixing merge @ sql/sql_lex.h 5.5-bugteam->trunk-bugfixing merge @ sql/sql_parse.cc 5.5-bugteam->trunk-bugfixing merge @ sql/sql_prepare.cc 5.5-bugteam->trunk-bugfixing merge @ sql/sql_priv.h 5.5-bugteam->trunk-bugfixing merge @ sql/sql_select.cc 5.5-bugteam->trunk-bugfixing merge @ sql/sql_show.cc 5.5-bugteam->trunk-bugfixing merge @ sql/sql_view.cc 5.5-bugteam->trunk-bugfixing merge modified: mysql-test/r/derived.result mysql-test/r/multi_update.result mysql-test/r/view.result mysql-test/suite/innodb/r/innodb_multi_update.result mysql-test/suite/innodb/t/innodb_multi_update.test mysql-test/t/derived.test mysql-test/t/multi_update.test mysql-test/t/view.test sql/item.cc sql/item_cmpfunc.cc sql/item_func.cc sql/item_row.cc sql/item_subselect.cc sql/item_subselect.h sql/sql_class.h sql/sql_derived.cc sql/sql_lex.cc sql/sql_lex.h sql/sql_parse.cc sql/sql_prepare.cc sql/sql_priv.h sql/sql_select.cc sql/sql_show.cc sql/sql_view.cc === modified file 'mysql-test/r/derived.result' --- a/mysql-test/r/derived.result 2010-11-29 13:30:18 +0000 +++ b/mysql-test/r/derived.result 2010-12-14 11:15:13 +0000 @@ -400,4 +400,15 @@ SELECT 0 FROM (SELECT 0) t61; 0 0 +# +# A nested materialized derived table is used before being populated. +# (addon for bug#19077) +# +CREATE TABLE t1 (i INT, j BIGINT); +INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2); +SELECT * FROM (SELECT MIN(i) FROM t1 +WHERE j = SUBSTRING('12', (SELECT * FROM (SELECT MIN(j) FROM t1) t2))) t3; +MIN(i) +1 +DROP TABLE t1; # End of 5.0 tests === modified file 'mysql-test/r/multi_update.result' --- a/mysql-test/r/multi_update.result 2010-09-10 08:06:58 +0000 +++ b/mysql-test/r/multi_update.result 2010-12-14 11:15:13 +0000 @@ -669,4 +669,15 @@ Error 1242 Subquery returns more than 1 Error 1242 Subquery returns more than 1 row DROP TABLE t1, t2, t3; SET SESSION sql_safe_updates = DEFAULT; +# +# Bug#52157 various crashes and assertions with multi-table update, stored function +# +CREATE FUNCTION f1 () RETURNS BLOB RETURN 1; +CREATE TABLE t1 (f1 DATE); +INSERT INTO t1 VALUES('2001-01-01'); +UPDATE (SELECT 1 FROM t1 WHERE f1 = (SELECT f1() FROM t1)) x, t1 SET f1 = 1; +Warnings: +Warning 1292 Truncated incorrect datetime value: '1' +DROP FUNCTION f1; +DROP TABLE t1; end of tests === modified file 'mysql-test/r/view.result' --- a/mysql-test/r/view.result 2010-12-03 09:18:23 +0000 +++ b/mysql-test/r/view.result 2010-12-14 11:15:13 +0000 @@ -3999,6 +3999,19 @@ CREATE VIEW v1 AS SELECT 1 from t1 WHERE t1.b <=> (SELECT a FROM t1 WHERE a < SOME(SELECT '1')); DROP VIEW v1; DROP TABLE t1; +# +# Bug#57703 create view cause Assertion failed: 0, file .\item_subselect.cc, line 846 +# +CREATE TABLE t1(a int); +CREATE VIEW v1 AS SELECT 1 FROM t1 GROUP BY +SUBSTRING(1 FROM (SELECT 3 FROM t1 WHERE a >= ANY(SELECT 1))); +DROP VIEW v1; +DROP TABLE t1; +# +# Bug#57352 valgrind warnings when creating view +# +CREATE VIEW v1 AS SELECT 1 IN (1 LIKE 2,0) AS f; +DROP VIEW v1; # ----------------------------------------------------------------- # -- End of 5.1 tests. # ----------------------------------------------------------------- === modified file 'mysql-test/suite/innodb/r/innodb_multi_update.result' --- a/mysql-test/suite/innodb/r/innodb_multi_update.result 2010-05-05 11:03:14 +0000 +++ b/mysql-test/suite/innodb/r/innodb_multi_update.result 2010-12-14 10:46:00 +0000 @@ -74,3 +74,11 @@ a b 4 14 5 15 drop table bug38999_1,bug38999_2; +# +# Bug#54475 improper error handling causes cascading crashing failures in innodb/ndb +# +CREATE TABLE t1(f1 INT) ENGINE=INNODB; +INSERT INTO t1 VALUES(1); +UPDATE (SELECT ((SELECT 1 FROM t1), 1) FROM t1 WHERE (SELECT 1 FROM t1)) x, (SELECT 1) AS d SET d.f1 = 1; +ERROR 21000: Operand should contain 1 column(s) +DROP TABLE t1; === modified file 'mysql-test/suite/innodb/t/innodb_multi_update.test' --- a/mysql-test/suite/innodb/t/innodb_multi_update.test 2010-05-05 11:03:14 +0000 +++ b/mysql-test/suite/innodb/t/innodb_multi_update.test 2010-12-14 10:46:00 +0000 @@ -27,3 +27,12 @@ select * from bug38999_1; select * from bug38999_2; drop table bug38999_1,bug38999_2; + +--echo # +--echo # Bug#54475 improper error handling causes cascading crashing failures in innodb/ndb +--echo # +CREATE TABLE t1(f1 INT) ENGINE=INNODB; +INSERT INTO t1 VALUES(1); +--error ER_OPERAND_COLUMNS +UPDATE (SELECT ((SELECT 1 FROM t1), 1) FROM t1 WHERE (SELECT 1 FROM t1)) x, (SELECT 1) AS d SET d.f1 = 1; +DROP TABLE t1; === modified file 'mysql-test/t/derived.test' --- a/mysql-test/t/derived.test 2009-11-10 18:48:46 +0000 +++ b/mysql-test/t/derived.test 2010-12-14 10:46:00 +0000 @@ -301,4 +301,15 @@ SELECT 0 FROM (SELECT 0) t56, (SELECT 0) t57, (SELECT 0) t58, (SELECT 0) t59, (SELECT 0) t60, (SELECT 0) t61; # 61 == MAX_TABLES +--echo # +--echo # A nested materialized derived table is used before being populated. +--echo # (addon for bug#19077) +--echo # + +CREATE TABLE t1 (i INT, j BIGINT); +INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2); +SELECT * FROM (SELECT MIN(i) FROM t1 +WHERE j = SUBSTRING('12', (SELECT * FROM (SELECT MIN(j) FROM t1) t2))) t3; +DROP TABLE t1; + --echo # End of 5.0 tests === modified file 'mysql-test/t/multi_update.test' --- a/mysql-test/t/multi_update.test 2010-09-10 08:06:58 +0000 +++ b/mysql-test/t/multi_update.test 2010-12-14 11:15:13 +0000 @@ -672,4 +672,15 @@ SET t3.a = 0; DROP TABLE t1, t2, t3; SET SESSION sql_safe_updates = DEFAULT; +--echo # +--echo # Bug#52157 various crashes and assertions with multi-table update, stored function +--echo # + +CREATE FUNCTION f1 () RETURNS BLOB RETURN 1; +CREATE TABLE t1 (f1 DATE); +INSERT INTO t1 VALUES('2001-01-01'); +UPDATE (SELECT 1 FROM t1 WHERE f1 = (SELECT f1() FROM t1)) x, t1 SET f1 = 1; +DROP FUNCTION f1; +DROP TABLE t1; + --echo end of tests === modified file 'mysql-test/t/view.test' --- a/mysql-test/t/view.test 2010-11-29 13:04:34 +0000 +++ b/mysql-test/t/view.test 2010-12-14 11:15:13 +0000 @@ -3973,6 +3973,22 @@ WHERE t1.b <=> (SELECT a FROM t1 WHERE a DROP VIEW v1; DROP TABLE t1; +--echo # +--echo # Bug#57703 create view cause Assertion failed: 0, file .\item_subselect.cc, line 846 +--echo # + +CREATE TABLE t1(a int); +CREATE VIEW v1 AS SELECT 1 FROM t1 GROUP BY +SUBSTRING(1 FROM (SELECT 3 FROM t1 WHERE a >= ANY(SELECT 1))); +DROP VIEW v1; +DROP TABLE t1; + +--echo # +--echo # Bug#57352 valgrind warnings when creating view +--echo # +CREATE VIEW v1 AS SELECT 1 IN (1 LIKE 2,0) AS f; +DROP VIEW v1; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.1 tests. --echo # ----------------------------------------------------------------- === modified file 'sql/item.cc' --- a/sql/item.cc 2010-11-29 16:27:58 +0000 +++ b/sql/item.cc 2010-12-14 11:15:13 +0000 @@ -1834,16 +1834,7 @@ bool agg_item_set_converter(DTCollation if (!(conv= (*arg)->safe_charset_converter(coll.collation)) && ((*arg)->collation.repertoire == MY_REPERTOIRE_ASCII)) - { - /* - We should disable const subselect item evaluation because - subselect transformation does not happen in view_prepare_mode - and thus val_...() methods can not be called for const items. - */ - bool resolve_const= ((*arg)->type() == Item::SUBSELECT_ITEM && - thd->lex->view_prepare_mode) ? FALSE : TRUE; - conv= new Item_func_conv_charset(*arg, coll.collation, resolve_const); - } + conv= new Item_func_conv_charset(*arg, coll.collation, 1); if (!conv) { === modified file 'sql/item_cmpfunc.cc' --- a/sql/item_cmpfunc.cc 2010-11-29 16:27:58 +0000 +++ b/sql/item_cmpfunc.cc 2010-12-14 11:15:13 +0000 @@ -403,7 +403,7 @@ static bool convert_constant_item(THD *t Field *field= field_item->field; int result= 0; - if (!(*item)->with_subselect && (*item)->const_item()) + if ((*item)->const_item()) { TABLE *table= field->table; sql_mode_t orig_sql_mode= thd->variables.sql_mode; @@ -499,7 +499,7 @@ void Item_bool_func2::fix_length_and_dec } thd= current_thd; - if (!thd->is_context_analysis_only()) + if (!thd->lex->is_ps_or_view_context_analysis()) { if (args[0]->real_item()->type() == FIELD_ITEM) { @@ -803,7 +803,7 @@ Arg_comparator::can_compare_as_dates(Ite confuse storage engines since in context analysis mode tables aren't locked. */ - if (!thd->is_context_analysis_only() && + if (!thd->lex->is_ps_or_view_context_analysis() && cmp_type != CMP_DATE_WITH_DATE && str_arg->const_item() && (str_arg->type() != Item::FUNC_ITEM || ((Item_func*)str_arg)->functype() != Item_func::GUSERVAR_FUNC)) @@ -1036,7 +1036,7 @@ Item** Arg_comparator::cache_converted_c Item_result type) { /* Don't need cache if doing context analysis only. */ - if (!thd_arg->is_context_analysis_only() && + if (!thd->lex->is_ps_or_view_context_analysis() && (*value)->const_item() && type != (*value)->result_type()) { Item_cache *cache= Item_cache::get_cache(*value, type); @@ -4840,7 +4840,7 @@ bool Item_func_like::fix_fields(THD *thd return TRUE; } - if (escape_item->const_item() && !thd->lex->view_prepare_mode) + if (escape_item->const_item()) { /* If we are on execution stage */ String *escape_str= escape_item->val_str(&cmp.value1); === modified file 'sql/item_func.cc' --- a/sql/item_func.cc 2010-12-02 15:45:50 +0000 +++ b/sql/item_func.cc 2010-12-14 11:15:13 +0000 @@ -6512,7 +6512,7 @@ Item_func_sp::fix_fields(THD *thd, Item if (res) DBUG_RETURN(res); - if (thd->lex->view_prepare_mode) + if (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW) { /* Here we check privileges of the stored routine only during view === modified file 'sql/item_row.cc' --- a/sql/item_row.cc 2010-10-15 10:32:50 +0000 +++ b/sql/item_row.cc 2010-12-14 11:15:13 +0000 @@ -80,12 +80,8 @@ bool Item_row::fix_fields(THD *thd, Item used_tables_cache |= item->used_tables(); const_item_cache&= item->const_item() && !with_null; not_null_tables_cache|= item->not_null_tables(); - /* - Some subqueries transformations aren't done in the view_prepare_mode thus - is_null() will fail. So we skip is_null() calculation for CREATE VIEW as - not necessary. - */ - if (const_item_cache && !thd->lex->view_prepare_mode) + + if (const_item_cache) { if (item->cols() > 1) with_null|= item->null_inside(); === modified file 'sql/item_subselect.cc' --- a/sql/item_subselect.cc 2010-11-26 15:20:05 +0000 +++ b/sql/item_subselect.cc 2010-12-14 11:15:13 +0000 @@ -132,20 +132,6 @@ void Item_subselect::cleanup() } -/* - We cannot use generic Item::safe_charset_converter() because - Subselect transformation does not happen in view_prepare_mode - and thus we can not evaluate val_...() for const items. -*/ - -Item *Item_subselect::safe_charset_converter(CHARSET_INFO *tocs) -{ - Item_func_conv_charset *conv= - new Item_func_conv_charset(this, tocs, thd->lex->view_prepare_mode ? 0 : 1); - return conv->safe ? conv : NULL; -} - - void Item_singlerow_subselect::cleanup() { DBUG_ENTER("Item_singlerow_subselect::cleanup"); @@ -302,6 +288,7 @@ bool Item_subselect::exec() if (thd->is_error() || thd->killed) return 1; + DBUG_ASSERT(!thd->lex->context_analysis_only); /* Simulate a failure in sub-query execution. Used to test e.g. out of memory or query being killed conditions. @@ -449,7 +436,7 @@ table_map Item_subselect::used_tables() bool Item_subselect::const_item() const { - return const_item_cache; + return thd->lex->context_analysis_only ? FALSE : const_item_cache; } Item *Item_subselect::get_tmp_table_item(THD *thd_arg) @@ -1876,7 +1863,8 @@ bool Item_in_subselect::fix_fields(THD * if (exec_method == EXEC_SEMI_JOIN) return !( (*ref)= new Item_int(1)); - if (thd_arg->lex->view_prepare_mode && left_expr && !left_expr->fixed) + if ((thd_arg->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW) && + left_expr && !left_expr->fixed) result = left_expr->fix_fields(thd_arg, &left_expr); return result || Item_subselect::fix_fields(thd_arg, ref); === modified file 'sql/item_subselect.h' --- a/sql/item_subselect.h 2010-10-15 10:32:50 +0000 +++ b/sql/item_subselect.h 2010-12-14 11:15:13 +0000 @@ -158,7 +158,6 @@ public: virtual void reset_value_registration() {} enum_parsing_place place() { return parsing_place; } bool walk(Item_processor processor, bool walk_subquery, uchar *arg); - Item *safe_charset_converter(CHARSET_INFO *tocs); /** Get the SELECT_LEX structure associated with this Item. === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2010-11-29 16:27:58 +0000 +++ b/sql/sql_class.h 2010-12-14 11:15:13 +0000 @@ -2548,8 +2548,6 @@ public: (variables.sql_mode & MODE_STRICT_ALL_TABLES))); } void set_status_var_init(); - bool is_context_analysis_only() - { return stmt_arena->is_stmt_prepare() || lex->view_prepare_mode; } void reset_n_backup_open_tables_state(Open_tables_backup *backup); void restore_backup_open_tables_state(Open_tables_backup *backup); void reset_sub_statement_state(Sub_statement_state *backup, uint new_state); === modified file 'sql/sql_derived.cc' --- a/sql/sql_derived.cc 2010-07-13 17:29:44 +0000 +++ b/sql/sql_derived.cc 2010-12-14 11:15:13 +0000 @@ -151,10 +151,11 @@ bool mysql_derived_prepare(THD *thd, LEX if (!(derived_result= new select_union)) DBUG_RETURN(TRUE); // out of memory + lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_DERIVED; // st_select_lex_unit::prepare correctly work for single select if ((res= unit->prepare(thd, derived_result, 0))) goto exit; - + lex->context_analysis_only&= ~CONTEXT_ANALYSIS_ONLY_DERIVED; if ((res= check_duplicate_names(unit->types, 0))) goto exit; === modified file 'sql/sql_lex.cc' --- a/sql/sql_lex.cc 2010-11-29 11:28:55 +0000 +++ b/sql/sql_lex.cc 2010-12-14 11:15:13 +0000 @@ -382,7 +382,7 @@ void lex_start(THD *thd) lex->select_lex.group_list.empty(); lex->describe= DESCRIBE_NONE; lex->subqueries= FALSE; - lex->view_prepare_mode= FALSE; + lex->context_analysis_only= 0; lex->derived_tables= 0; lex->safe_to_cache_query= 1; lex->leaf_tables_insert= 0; === modified file 'sql/sql_lex.h' --- a/sql/sql_lex.h 2010-12-02 15:05:07 +0000 +++ b/sql/sql_lex.h 2010-12-14 11:15:13 +0000 @@ -2182,19 +2182,12 @@ struct LEX: public Query_tables_list uint8 derived_tables; uint8 create_view_algorithm; uint8 create_view_check; + uint8 context_analysis_only; bool drop_if_exists, drop_temporary, local_file, one_shot_set; bool autocommit; bool verbose, no_write_to_binlog; enum enum_yes_no_unknown tx_chain, tx_release; - /* - Special JOIN::prepare mode: changing of query is prohibited. - When creating a view, we need to just check its syntax omitting - any optimizations: afterwards definition of the view will be - reconstructed by means of ::print() methods and written to - to an .frm file. We need this definition to stay untouched. - */ - bool view_prepare_mode; bool safe_to_cache_query; bool subqueries, ignore; st_parsing_options parsing_options; @@ -2299,6 +2292,13 @@ struct LEX: public Query_tables_list delete_dynamic(&plugins); } + inline bool is_ps_or_view_context_analysis() + { + return (context_analysis_only & + (CONTEXT_ANALYSIS_ONLY_PREPARE | + CONTEXT_ANALYSIS_ONLY_VIEW)); + } + inline void uncacheable(uint8 cause) { safe_to_cache_query= 0; === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2010-11-29 11:28:55 +0000 +++ b/sql/sql_parse.cc 2010-12-14 11:15:13 +0000 @@ -5337,13 +5337,6 @@ mysql_new_select(LEX *lex, bool move_dow DBUG_RETURN(1); } select_lex->nest_level= lex->nest_level; - /* - Don't evaluate this subquery during statement prepare even if - it's a constant one. The flag is switched off in the end of - mysqld_stmt_prepare. - */ - if (thd->stmt_arena->is_stmt_prepare()) - select_lex->uncacheable|= UNCACHEABLE_PREPARE; if (move_down) { SELECT_LEX_UNIT *unit; === modified file 'sql/sql_prepare.cc' --- a/sql/sql_prepare.cc 2010-11-26 15:20:05 +0000 +++ b/sql/sql_prepare.cc 2010-12-14 11:15:13 +0000 @@ -1781,7 +1781,7 @@ static bool mysql_test_create_view(Prepa if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL)) goto err; - lex->view_prepare_mode= 1; + lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; res= select_like_stmt_test(stmt, 0, 0); err: @@ -2293,19 +2293,6 @@ end: } -/** Init PS/SP specific parse tree members. */ - -static void init_stmt_after_parse(LEX *lex) -{ - SELECT_LEX *sl= lex->all_selects_list; - /* - Switch off a temporary flag that prevents evaluation of - subqueries in statement prepare. - */ - for (; sl; sl= sl->next_select_in_list()) - sl->uncacheable&= ~UNCACHEABLE_PREPARE; -} - /** SQLCOM_PREPARE implementation. @@ -3224,6 +3211,7 @@ bool Prepared_statement::prepare(const c parser_state.m_lip.multi_statements= FALSE; lex_start(thd); + lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_PREPARE; error= parse_sql(thd, & parser_state, NULL) || thd->is_error() || @@ -3284,7 +3272,7 @@ bool Prepared_statement::prepare(const c if (error == 0) { setup_set_params(); - init_stmt_after_parse(lex); + lex->context_analysis_only&= ~CONTEXT_ANALYSIS_ONLY_PREPARE; state= Query_arena::PREPARED; flags&= ~ (uint) IS_IN_USE; === modified file 'sql/sql_priv.h' --- a/sql/sql_priv.h 2010-12-06 13:12:51 +0000 +++ b/sql/sql_priv.h 2010-12-14 11:15:13 +0000 @@ -217,17 +217,42 @@ */ +/* + Flags below are set when we perform + context analysis of the statement and make + subqueries non-const. It prevents subquery + evaluation at context analysis stage. +*/ + +/* + Don't evaluate this subquery during statement prepare even if + it's a constant one. The flag is switched off in the end of + mysqld_stmt_prepare. +*/ +#define CONTEXT_ANALYSIS_ONLY_PREPARE 1 +/* + Special JOIN::prepare mode: changing of query is prohibited. + When creating a view, we need to just check its syntax omitting + any optimizations: afterwards definition of the view will be + reconstructed by means of ::print() methods and written to + to an .frm file. We need this definition to stay untouched. +*/ +#define CONTEXT_ANALYSIS_ONLY_VIEW 2 +/* + Don't evaluate this subquery during derived table prepare even if + it's a constant one. +*/ +#define CONTEXT_ANALYSIS_ONLY_DERIVED 4 + // uncachable cause #define UNCACHEABLE_DEPENDENT 1 #define UNCACHEABLE_RAND 2 #define UNCACHEABLE_SIDEEFFECT 4 /// forcing to save JOIN for explain #define UNCACHEABLE_EXPLAIN 8 -/** Don't evaluate subqueries in prepare even if they're not correlated */ -#define UNCACHEABLE_PREPARE 16 /* For uncorrelated SELECT in an UNION with some correlated SELECTs */ -#define UNCACHEABLE_UNITED 32 -#define UNCACHEABLE_CHECKOPTION 64 +#define UNCACHEABLE_UNITED 16 +#define UNCACHEABLE_CHECKOPTION 32 /* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */ #define UNDEF_POS (-1) === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-12-08 12:55:40 +0000 +++ b/sql/sql_select.cc 2010-12-14 11:15:13 +0000 @@ -595,7 +595,8 @@ JOIN::prepare(Item ***rref_pointer_array } if (select_lex->master_unit()->item && // This is a subquery - !thd->lex->view_prepare_mode && // Not normalizing a view + // Not normalizing a view + !(thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW) && !(select_options & SELECT_DESCRIBE)) // Not within a describe { /* Join object is a subquery within an IN/ANY/ALL/EXISTS predicate */ === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2010-12-06 13:12:51 +0000 +++ b/sql/sql_show.cc 2010-12-14 11:15:13 +0000 @@ -674,7 +674,7 @@ mysqld_show_create(THD *thd, TABLE_LIST MDL_savepoint mdl_savepoint= thd->mdl_context.mdl_savepoint(); /* We want to preserve the tree for views. */ - thd->lex->view_prepare_mode= TRUE; + thd->lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; { Show_create_error_handler view_error_suppressor(thd, table_list); @@ -3440,7 +3440,7 @@ int get_all_tables(THD *thd, TABLE_LIST uint derived_tables= lex->derived_tables; int error= 1; Open_tables_backup open_tables_state_backup; - bool save_view_prepare_mode= lex->view_prepare_mode; + uint8 save_context_analysis_only= lex->context_analysis_only; Query_tables_list query_tables_list_backup; #ifndef NO_EMBEDDED_ACCESS_CHECKS Security_context *sctx= thd->security_ctx; @@ -3460,7 +3460,7 @@ int get_all_tables(THD *thd, TABLE_LIST */ can_deadlock= thd->mdl_context.has_locks(); - lex->view_prepare_mode= TRUE; + lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; lex->reset_n_backup_query_tables_list(&query_tables_list_backup); /* Restore Query_tables_list::sql_command value, which was reset @@ -3690,7 +3690,7 @@ err: lex->restore_backup_query_tables_list(&query_tables_list_backup); lex->derived_tables= derived_tables; lex->all_selects_list= old_all_select_lex; - lex->view_prepare_mode= save_view_prepare_mode; + lex->context_analysis_only= save_context_analysis_only; DBUG_RETURN(error); } === modified file 'sql/sql_view.cc' --- a/sql/sql_view.cc 2010-11-29 16:27:58 +0000 +++ b/sql/sql_view.cc 2010-12-14 11:15:13 +0000 @@ -549,7 +549,7 @@ bool mysql_create_view(THD *thd, TABLE_L } /* prepare select to resolve all fields */ - lex->view_prepare_mode= 1; + lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; if (unit->prepare(thd, 0, 0)) { /* No bundle (reason: revision is a merge).