diff options
author | unknown <monty@narttu.mysql.fi> | 2003-09-03 19:53:08 +0300 |
---|---|---|
committer | unknown <monty@narttu.mysql.fi> | 2003-09-03 19:53:08 +0300 |
commit | 35af1442b6492f0962dd48f8dbcbb995a0f5f7e1 (patch) | |
tree | a927f30b44fb1ffd56321ff4510effc73a2e493e /sql/sql_union.cc | |
parent | f6daa5c358d6c8f697bda11b5315d307c23f5633 (diff) | |
parent | 0fa5279543d20c0d0c9ef6a1835c7f5056f0a997 (diff) | |
download | mariadb-git-35af1442b6492f0962dd48f8dbcbb995a0f5f7e1.tar.gz |
merge
BitKeeper/etc/ignore:
auto-union
BitKeeper/etc/logging_ok:
auto-union
client/mysqldump.c:
Auto merged
include/my_sys.h:
Auto merged
include/mysql_com.h:
Auto merged
isam/open.c:
Auto merged
libmysql/libmysql.c:
Auto merged
mysql-test/r/isam.result:
Auto merged
mysql-test/r/myisam.result:
Auto merged
mysql-test/r/rpl_loaddata.result:
Auto merged
mysql-test/r/rpl_log.result:
Auto merged
mysql-test/r/show_check.result:
Auto merged
mysql-test/t/myisam.test:
Auto merged
sql/ha_myisam.cc:
Auto merged
sql/item.h:
Auto merged
sql/item_func.cc:
Auto merged
sql/item_func.h:
Auto merged
sql/item_sum.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
sql/repl_failsafe.cc:
Auto merged
sql/set_var.cc:
Auto merged
sql/slave.cc:
Auto merged
sql/slave.h:
Auto merged
sql/sql_class.cc:
Auto merged
sql/sql_class.h:
Auto merged
sql/sql_insert.cc:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_repl.cc:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/share/portuguese/errmsg.txt:
Auto merged
sql/share/spanish/errmsg.txt:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_union.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
sql/handler.cc:
Merge
sql/sql_acl.cc:
Merge and code cleanup of acl_getroot()
Diffstat (limited to 'sql/sql_union.cc')
-rw-r--r-- | sql/sql_union.cc | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 55f697e9981..7146630d132 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -123,8 +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= test(first_select_in_union()->options - & OPTION_FOUND_ROWS); + 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; @@ -239,7 +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(); - ha_rows add_rows=0; + ulonglong add_rows=0; DBUG_ENTER("st_select_lex_unit::exec"); if (executed && !(dependent || uncacheable)) @@ -263,10 +262,30 @@ int st_select_lex_unit::exec() res= sl->join->reinit(); else { - offset_limit_cnt= sl->offset_limit; - select_limit_cnt= sl->select_limit+sl->offset_limit; + /* Don't use offset for the last union if there is no braces */ + if (sl != lex_sl) + { + offset_limit_cnt= sl->offset_limit; + select_limit_cnt= sl->select_limit+sl->offset_limit; + } + else + { + offset_limit_cnt= 0; + /* + We can't use LIMIT at this stage if we are using ORDER BY for the + whole query + */ + select_limit_cnt= HA_POS_ERROR; + if (! sl->order_list.first) + select_limit_cnt= sl->select_limit+sl->offset_limit; + } if (select_limit_cnt < sl->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit + + /* + When using braces, SQL_CALC_FOUND_ROWS affects the whole query. + We don't calculate found_rows() per union part + */ if (select_limit_cnt == HA_POS_ERROR || sl->braces) sl->options&= ~OPTION_FOUND_ROWS; else @@ -318,11 +337,13 @@ int st_select_lex_unit::exec() thd->lex.current_select= lex_select_save; DBUG_RETURN(res); } + /* Needed for the following test and for records_at_start in next loop */ + table->file->info(HA_STATUS_VARIABLE); if (found_rows_for_union & sl->options) { /* - This is a union without braces. Remember the number of rows that could - also have been part of the result set. + This is a union without braces. Remember the number of rows that + could also have been part of the result set. We get this from the difference of between total number of possible rows and actual rows added to the temporary table. */ @@ -341,7 +362,7 @@ int st_select_lex_unit::exec() List<Item_func_match> empty_list; empty_list.empty(); - if (!thd->is_fatal_error) // Check if EOM + if (!thd->is_fatal_error) // Check if EOM { ulong options= thd->options; thd->lex.current_select= fake_select_lex; |