diff --git a/mysql-test/r/type_set.result b/mysql-test/r/type_set.result index b0ea1b69e59..086f55a47a5 100644 --- a/mysql-test/r/type_set.result +++ b/mysql-test/r/type_set.result @@ -13,3 +13,5 @@ t1 CREATE TABLE `t1` ( `a` set('','a','b') NOT NULL default 'b' ) TYPE=MyISAM CHARSET=latin1 drop table t1; +CREATE TABLE t1 ( user varchar(64) NOT NULL default '', path varchar(255) NOT NULL default '', privilege set('select','RESERVED30','RESERVED29','RESERVED28','RESERVED27','RESERVED26', 'RESERVED25','RESERVED24','data.delete','RESERVED22','RESERVED21', 'RESERVED20','data.insert.none','data.insert.approve', 'data.insert.delete','data.insert.move','data.insert.propose', 'data.insert.reject','RESERVED13','RESERVED12','RESERVED11','RESERVED10', 'RESERVED09','data.update','RESERVED07','RESERVED06','RESERVED05', 'RESERVED04','metadata.delete','metadata.put','RESERVED01','RESERVED00') NOT NULL default '', KEY user (user) ) TYPE=MyISAM CHARSET=utf8; +DROP TABLE t1; diff --git a/mysql-test/t/type_set.test b/mysql-test/t/type_set.test index 4505e3f747b..6c0f162dc86 100644 --- a/mysql-test/t/type_set.test +++ b/mysql-test/t/type_set.test @@ -12,3 +12,5 @@ drop table t1; create table t1 (a set (' ','a','b ') not null default 'b '); show create table t1; drop table t1; +CREATE TABLE t1 ( user varchar(64) NOT NULL default '', path varchar(255) NOT NULL default '', privilege set('select','RESERVED30','RESERVED29','RESERVED28','RESERVED27','RESERVED26', 'RESERVED25','RESERVED24','data.delete','RESERVED22','RESERVED21', 'RESERVED20','data.insert.none','data.insert.approve', 'data.insert.delete','data.insert.move','data.insert.propose', 'data.insert.reject','RESERVED13','RESERVED12','RESERVED11','RESERVED10', 'RESERVED09','data.update','RESERVED07','RESERVED06','RESERVED05', 'RESERVED04','metadata.delete','metadata.put','RESERVED01','RESERVED00') NOT NULL default '', KEY user (user) ) TYPE=MyISAM CHARSET=utf8; +DROP TABLE t1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 573ca724fe2..33e96cc2776 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4038,9 +4038,10 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, } } - if (new_field->length > MAX_FIELD_CHARLENGTH || + if ((new_field->length > MAX_FIELD_CHARLENGTH && type != FIELD_TYPE_SET && + type != FIELD_TYPE_ENUM) || (!new_field->length && !(new_field->flags & BLOB_FLAG) && - type != FIELD_TYPE_STRING && + type != FIELD_TYPE_STRING && type != FIELD_TYPE_VAR_STRING && type != FIELD_TYPE_GEOMETRY)) { net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name, diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 5e9a50d038e..b1fdc48b22f 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -123,7 +123,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result, DBUG_RETURN(0); prepared= 1; res= 0; - found_rows_for_union= 0; + found_rows_for_union= first_select_in_union()->options & OPTION_FOUND_ROWS; TMP_TABLE_PARAM tmp_table_param; result= sel_result; t_and_f= tables_and_fields_initied; @@ -131,13 +131,6 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result, bzero((char *)&tmp_table_param,sizeof(TMP_TABLE_PARAM)); thd->lex.current_select= select_cursor= first_select_in_union(); /* Global option */ - if (((void*)(global_parameters)) == ((void*)this)) - { - found_rows_for_union= first_select()->options & OPTION_FOUND_ROWS && - global_parameters->select_limit; - if (found_rows_for_union) - first_select()->options&= ~OPTION_FOUND_ROWS; - } if (t_and_f) { // Item list and tables will be initialized by mysql_derived @@ -245,6 +238,7 @@ int st_select_lex_unit::exec() { SELECT_LEX *lex_select_save= thd->lex.current_select; SELECT_LEX *select_cursor=first_select_in_union(); + unsigned int add_rows=0; DBUG_ENTER("st_select_lex_unit::exec"); if (executed && !(dependent || uncacheable)) @@ -261,6 +255,7 @@ int st_select_lex_unit::exec() } for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select()) { + unsigned int rows; thd->lex.current_select= sl; if (optimized) @@ -273,6 +268,11 @@ int st_select_lex_unit::exec() select_limit_cnt= HA_POS_ERROR; // no limit if (select_limit_cnt == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; + else if (found_rows_for_union) + { + rows= thd->select_limit; + sl->options|= OPTION_FOUND_ROWS; + } /* As far as union share table space we should reassign table map, @@ -313,6 +313,8 @@ int st_select_lex_unit::exec() thd->lex.current_select= lex_select_save; DBUG_RETURN(res); } + if (found_rows_for_union && !sl->braces && sl->options & OPTION_FOUND_ROWS) + add_rows+= (thd->limit_found_rows > rows) ? thd->limit_found_rows - rows : 0; } } optimized= 1; @@ -328,15 +330,17 @@ int st_select_lex_unit::exec() if (!thd->is_fatal_error) // Check if EOM { thd->lex.current_select= fake_select_lex; - offset_limit_cnt= (select_cursor->braces ? - global_parameters->offset_limit : 0); - select_limit_cnt= (select_cursor->braces ? - global_parameters->select_limit+ - global_parameters->offset_limit : HA_POS_ERROR); - if (select_limit_cnt < global_parameters->select_limit) - select_limit_cnt= HA_POS_ERROR; // no limit + if (select_cursor->braces) + { + offset_limit_cnt= global_parameters->offset_limit; + select_limit_cnt= global_parameters->select_limit + global_parameters->offset_limit; + if (select_limit_cnt < global_parameters->select_limit) + select_limit_cnt= HA_POS_ERROR; // no limit + } if (select_limit_cnt == HA_POS_ERROR) thd->options&= ~OPTION_FOUND_ROWS; + else if (found_rows_for_union && !describe) + thd->options|= OPTION_FOUND_ROWS; fake_select_lex->ftfunc_list= &empty_list; fake_select_lex->table_list.link_in_list((byte *)&result_table_list, (byte **) @@ -374,7 +378,11 @@ int st_select_lex_unit::exec() thd->options | SELECT_NO_UNLOCK, result, this, fake_select_lex, 0); if (found_rows_for_union && !res) - thd->limit_found_rows = (ulonglong)table->file->records; + { + thd->limit_found_rows= table->file->records; + if (!select_cursor->braces) + thd->limit_found_rows+= add_rows; + } /* Mark for slow query log if any of the union parts didn't use indexes efficiently