diff --git a/mysql-test/r/analyse.result b/mysql-test/r/analyse.result index ede83afe4e1..0cb33526457 100644 --- a/mysql-test/r/analyse.result +++ b/mysql-test/r/analyse.result @@ -1,6 +1,9 @@ drop table if exists t1,t2; create table t1 (i int, j int); insert into t1 values (1,2), (3,4), (5,6), (7,8); +select count(*) from t1 procedure analyse(); +Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype + -6510615555426900571 -6510615555426900571 -6510615555426900571 -6510615555426900571 select * from t1 procedure analyse(); Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL diff --git a/mysql-test/r/handler.result b/mysql-test/r/handler.result index 35765c48049..b47f97e167f 100644 --- a/mysql-test/r/handler.result +++ b/mysql-test/r/handler.result @@ -5,6 +5,8 @@ insert into t1 values (14,"aaa"),(15,"bbb"),(16,"ccc"),(16,"xxx"), (20,"ggg"),(21,"hhh"),(22,"iii"); handler t1 open as t2; +handler t2 read a=(SELECT 1); +You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT 1)' at line 1 handler t2 read a first; a b 14 aaa diff --git a/mysql-test/t/analyse.test b/mysql-test/t/analyse.test index ccbfb56a801..117ca40ce54 100644 --- a/mysql-test/t/analyse.test +++ b/mysql-test/t/analyse.test @@ -7,6 +7,7 @@ drop table if exists t1,t2; --enable_warnings create table t1 (i int, j int); insert into t1 values (1,2), (3,4), (5,6), (7,8); +select count(*) from t1 procedure analyse(); select * from t1 procedure analyse(); create table t2 select * from t1 procedure analyse(); select * from t2; diff --git a/mysql-test/t/handler.test b/mysql-test/t/handler.test index 2b0a6a7be8d..b72b739600e 100644 --- a/mysql-test/t/handler.test +++ b/mysql-test/t/handler.test @@ -12,6 +12,8 @@ insert into t1 values (14,"aaa"),(15,"bbb"),(16,"ccc"),(16,"xxx"), (20,"ggg"),(21,"hhh"),(22,"iii"); handler t1 open as t2; +-- error 1064 +handler t2 read a=(SELECT 1); handler t2 read a first; handler t2 read a next; handler t2 read a next; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 6d6d2004be5..95adcc4d974 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -970,11 +970,12 @@ int select_dumpvar::prepare(List &list, SELECT_LEX_UNIT *u) my_error(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, MYF(0)); return 1; } + unit=u; while ((item=li++)) { ls= gl++; Item_func_set_user_var *xx = new Item_func_set_user_var(*ls,item); - xx->fix_fields(current_thd,(TABLE_LIST*) current_thd->lex.select_lex.table_list.first,&item); + xx->fix_fields(thd,(TABLE_LIST*) thd->lex.select_lex.table_list.first,&item); xx->fix_length_and_dec(); vars.push_back(xx); } @@ -986,6 +987,11 @@ bool select_dumpvar::send_data(List &items) Item_func_set_user_var *xx; DBUG_ENTER("send_data"); + if (unit->offset_limit_cnt) + { // Using limit offset,count + unit->offset_limit_cnt--; + DBUG_RETURN(0); + } if (row_count++) { my_error(ER_TOO_MANY_ROWS, MYF(0)); diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 9ca5c9f69a2..f4c3979a34a 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -25,7 +25,7 @@ #include "sql_select.h" #include "sql_acl.h" -extern const char *any_db="*any*"; // Special symbol for check_access +extern const char *any_db; // Special symbol for check_access /* Resolve derived tables in all queries diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 0243cd7cfb6..5952502bec3 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -714,6 +714,13 @@ JOIN::exec() int tmp_error; DBUG_ENTER("JOIN::exec"); + + if (procedure) + { + if (procedure->change_columns(fields_list) || + result->prepare(fields_list, unit)) + DBUG_VOID_RETURN; + } if (!tables_list) { // Only test of functions @@ -768,8 +775,6 @@ JOIN::exec() test_if_skip_sort_order(&join_tab[const_tables], order, select_limit, 0)))) order=0; - if (procedure) - (void)result->prepare(fields_list, unit); select_describe(this, need_tmp, order != 0 && !skip_sort_order, select_distinct); @@ -989,9 +994,6 @@ JOIN::exec() } if (procedure) { - if (procedure->change_columns(fields_list) || - result->prepare(fields_list, unit)) - DBUG_VOID_RETURN; count_field_types(&tmp_table_param, all_fields, 0); } if (group || tmp_table_param.sum_func_count || diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index a424aefd45f..5de78df3aa5 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2573,6 +2573,12 @@ select_derived: { LEX *lex= Lex; lex->derived_tables= 1; + if (((int)lex->sql_command >= (int)SQLCOM_HA_OPEN && + lex->sql_command <= (int)SQLCOM_HA_READ) || lex->sql_command == (int)SQLCOM_KILL) + { + send_error(lex->thd, ER_SYNTAX_ERROR); + YYABORT; + } if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE || mysql_new_select(lex, 1)) YYABORT; @@ -4643,6 +4649,12 @@ in_subselect_init: subselect_start: '(' SELECT_SYM { + LEX *lex=Lex; + if (((int)lex->sql_command >= (int)SQLCOM_HA_OPEN && + lex->sql_command <= (int)SQLCOM_HA_READ) || lex->sql_command == (int)SQLCOM_KILL) { + send_error(lex->thd, ER_SYNTAX_ERROR); + YYABORT; + } if (mysql_new_select(Lex, 1)) YYABORT; };