Commit 11af1f3c authored by bell@laptop.sanja.is.com.ua's avatar bell@laptop.sanja.is.com.ua

Merge

parents 30913419 7635c537
...@@ -13,3 +13,5 @@ t1 CREATE TABLE `t1` ( ...@@ -13,3 +13,5 @@ t1 CREATE TABLE `t1` (
`a` set('','a','b') NOT NULL default 'b' `a` set('','a','b') NOT NULL default 'b'
) TYPE=MyISAM CHARSET=latin1 ) TYPE=MyISAM CHARSET=latin1
drop 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;
...@@ -12,3 +12,5 @@ drop table t1; ...@@ -12,3 +12,5 @@ drop table t1;
create table t1 (a set (' ','a','b ') not null default 'b '); create table t1 (a set (' ','a','b ') not null default 'b ');
show create table t1; show create table t1;
drop 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;
...@@ -4038,9 +4038,10 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, ...@@ -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) && (!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)) type != FIELD_TYPE_VAR_STRING && type != FIELD_TYPE_GEOMETRY))
{ {
net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name, net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name,
......
...@@ -123,7 +123,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result, ...@@ -123,7 +123,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
DBUG_RETURN(0); DBUG_RETURN(0);
prepared= 1; prepared= 1;
res= 0; 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; TMP_TABLE_PARAM tmp_table_param;
result= sel_result; result= sel_result;
t_and_f= tables_and_fields_initied; t_and_f= tables_and_fields_initied;
...@@ -131,13 +131,6 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result, ...@@ -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)); bzero((char *)&tmp_table_param,sizeof(TMP_TABLE_PARAM));
thd->lex.current_select= select_cursor= first_select_in_union(); thd->lex.current_select= select_cursor= first_select_in_union();
/* Global option */ /* 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) if (t_and_f)
{ {
// Item list and tables will be initialized by mysql_derived // Item list and tables will be initialized by mysql_derived
...@@ -245,6 +238,7 @@ int st_select_lex_unit::exec() ...@@ -245,6 +238,7 @@ int st_select_lex_unit::exec()
{ {
SELECT_LEX *lex_select_save= thd->lex.current_select; SELECT_LEX *lex_select_save= thd->lex.current_select;
SELECT_LEX *select_cursor=first_select_in_union(); SELECT_LEX *select_cursor=first_select_in_union();
unsigned int add_rows=0;
DBUG_ENTER("st_select_lex_unit::exec"); DBUG_ENTER("st_select_lex_unit::exec");
if (executed && !(dependent || uncacheable)) if (executed && !(dependent || uncacheable))
...@@ -261,6 +255,7 @@ int st_select_lex_unit::exec() ...@@ -261,6 +255,7 @@ int st_select_lex_unit::exec()
} }
for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select()) for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select())
{ {
unsigned int rows;
thd->lex.current_select= sl; thd->lex.current_select= sl;
if (optimized) if (optimized)
...@@ -273,6 +268,11 @@ int st_select_lex_unit::exec() ...@@ -273,6 +268,11 @@ int st_select_lex_unit::exec()
select_limit_cnt= HA_POS_ERROR; // no limit select_limit_cnt= HA_POS_ERROR; // no limit
if (select_limit_cnt == HA_POS_ERROR) if (select_limit_cnt == HA_POS_ERROR)
sl->options&= ~OPTION_FOUND_ROWS; 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, As far as union share table space we should reassign table map,
...@@ -313,6 +313,8 @@ int st_select_lex_unit::exec() ...@@ -313,6 +313,8 @@ int st_select_lex_unit::exec()
thd->lex.current_select= lex_select_save; thd->lex.current_select= lex_select_save;
DBUG_RETURN(res); 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; optimized= 1;
...@@ -328,15 +330,17 @@ int st_select_lex_unit::exec() ...@@ -328,15 +330,17 @@ int st_select_lex_unit::exec()
if (!thd->is_fatal_error) // Check if EOM if (!thd->is_fatal_error) // Check if EOM
{ {
thd->lex.current_select= fake_select_lex; thd->lex.current_select= fake_select_lex;
offset_limit_cnt= (select_cursor->braces ? if (select_cursor->braces)
global_parameters->offset_limit : 0); {
select_limit_cnt= (select_cursor->braces ? offset_limit_cnt= global_parameters->offset_limit;
global_parameters->select_limit+ select_limit_cnt= global_parameters->select_limit + global_parameters->offset_limit;
global_parameters->offset_limit : HA_POS_ERROR); if (select_limit_cnt < global_parameters->select_limit)
if (select_limit_cnt < global_parameters->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit
select_limit_cnt= HA_POS_ERROR; // no limit }
if (select_limit_cnt == HA_POS_ERROR) if (select_limit_cnt == HA_POS_ERROR)
thd->options&= ~OPTION_FOUND_ROWS; 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->ftfunc_list= &empty_list;
fake_select_lex->table_list.link_in_list((byte *)&result_table_list, fake_select_lex->table_list.link_in_list((byte *)&result_table_list,
(byte **) (byte **)
...@@ -374,7 +378,11 @@ int st_select_lex_unit::exec() ...@@ -374,7 +378,11 @@ int st_select_lex_unit::exec()
thd->options | SELECT_NO_UNLOCK, thd->options | SELECT_NO_UNLOCK,
result, this, fake_select_lex, 0); result, this, fake_select_lex, 0);
if (found_rows_for_union && !res) 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 Mark for slow query log if any of the union parts didn't use
indexes efficiently indexes efficiently
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment