summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <Sinisa@sinisa.nasamreza.org>2003-08-27 14:36:38 +0300
committerunknown <Sinisa@sinisa.nasamreza.org>2003-08-27 14:36:38 +0300
commit8a6f8201bec9b8b5c338cd7f5a9d3e42ab8b1457 (patch)
tree580538f16974ea7d0c8ebf343e76e523efdb91cf
parent8e8e4fe059a8cebc4f8446f2b6cdcc810bdff9e0 (diff)
parent76438bd1bb07979badbd05048b7bb4a1b9fb333a (diff)
downloadmariadb-git-8a6f8201bec9b8b5c338cd7f5a9d3e42ab8b1457.tar.gz
merge fixes
sql/sql_lex.h: Auto merged sql/sql_select.cc: Auto merged
-rw-r--r--mysql-test/r/symlink.result2
-rw-r--r--mysql-test/r/union.result2
-rw-r--r--sql/sql_lex.h4
-rw-r--r--sql/sql_select.cc5
-rw-r--r--sql/sql_union.cc88
5 files changed, 55 insertions, 46 deletions
diff --git a/mysql-test/r/symlink.result b/mysql-test/r/symlink.result
index 216fb4d6124..4469ca36941 100644
--- a/mysql-test/r/symlink.result
+++ b/mysql-test/r/symlink.result
@@ -46,8 +46,6 @@ alter table t8 rename t7;
rename table t7 to t9;
drop table t1;
Got one of the listed errors
-Warnings:
-Note 1008 Can't drop database 'test_mysqltest'; database doesn't exist
Got one of the listed errors
Got one of the listed errors
Got one of the listed errors
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result
index 396eba7197b..fc72f55172b 100644
--- a/mysql-test/r/union.result
+++ b/mysql-test/r/union.result
@@ -103,7 +103,7 @@ a b
2 b
select found_rows();
found_rows()
-6
+8
explain select a,b from t1 union all select a,b from t2;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 4
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 7a7071ae56b..9c195bf4efb 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -272,8 +272,8 @@ protected:
select_result *result;
int res;
- bool describe, found_rows_for_union,
- prepared, // prepare phase already performed for UNION (unit)
+ ulong describe, found_rows_for_union;
+ bool prepared, // prepare phase already performed for UNION (unit)
optimized, // optimize phase already performed for UNION (unit)
executed, // already executed
t_and_f; // used for transferring tables_and_fields_initied UNIT:: methods
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 412e891bad1..e6e7abf14a0 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1043,6 +1043,7 @@ JOIN::exec()
DBUG_ENTER("JOIN::exec");
error= 0;
+ thd->limit_found_rows= thd->examined_row_count= 0;
if (procedure)
{
if (procedure->change_columns(fields_list) ||
@@ -1425,6 +1426,8 @@ JOIN::exec()
thd->proc_info="Sending data";
error= thd->net.report_error ||
do_select(curr_join, curr_fields_list, NULL, procedure);
+ thd->limit_found_rows= curr_join->send_records;
+ thd->examined_row_count= curr_join->examined_rows;
DBUG_VOID_RETURN;
}
@@ -1547,8 +1550,6 @@ err:
(join->tmp_join->error=join->error,join->tmp_join):
join);
- thd->limit_found_rows= curr_join->send_records;
- thd->examined_row_count= curr_join->examined_rows;
thd->proc_info="end";
err= join->cleanup();
if (thd->net.report_error)
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index ae91b0b3ace..57fc026f4f4 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -187,31 +187,34 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select())
{
- JOIN *join= new JOIN(thd, sl->item_list,
- sl->options | thd->options | SELECT_NO_UNLOCK,
- union_result);
- thd->lex.current_select= sl;
- offset_limit_cnt= sl->offset_limit;
- select_limit_cnt= sl->select_limit+sl->offset_limit;
- if (select_limit_cnt < sl->select_limit)
- select_limit_cnt= HA_POS_ERROR; // no limit
- if (select_limit_cnt == HA_POS_ERROR && !sl->braces)
- sl->options&= ~OPTION_FOUND_ROWS;
-
- res= join->prepare(&sl->ref_pointer_array,
- (TABLE_LIST*) sl->table_list.first, sl->with_wild,
- sl->where,
- ((sl->braces) ? sl->order_list.elements : 0) +
- sl->group_list.elements,
- (sl->braces) ?
- (ORDER *)sl->order_list.first : (ORDER *) 0,
- (ORDER*) sl->group_list.first,
- sl->having,
- (ORDER*) NULL,
- sl, this, t_and_f);
- t_and_f= 0;
- if (res || thd->is_fatal_error)
- goto err;
+ for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select())
+ {
+ JOIN *join= new JOIN(thd, sl->item_list,
+ sl->options | thd->options | SELECT_NO_UNLOCK,
+ union_result);
+ thd->lex.current_select= sl;
+ offset_limit_cnt= sl->offset_limit;
+ select_limit_cnt= sl->select_limit+sl->offset_limit;
+ if (select_limit_cnt < sl->select_limit)
+ select_limit_cnt= HA_POS_ERROR; // no limit
+ if (select_limit_cnt == HA_POS_ERROR || sl->braces)
+ sl->options&= ~OPTION_FOUND_ROWS;
+
+ res= join->prepare(&sl->ref_pointer_array,
+ (TABLE_LIST*) sl->table_list.first, sl->with_wild,
+ sl->where,
+ ((sl->braces) ? sl->order_list.elements : 0) +
+ sl->group_list.elements,
+ (sl->braces) ?
+ (ORDER *)sl->order_list.first : (ORDER *) 0,
+ (ORDER*) sl->group_list.first,
+ sl->having,
+ (ORDER*) NULL,
+ sl, this, t_and_f);
+ t_and_f= 0;
+ if (res || thd->is_fatal_error)
+ goto err;
+ }
}
item_list.empty();
@@ -267,12 +270,15 @@ int st_select_lex_unit::exec()
select_limit_cnt= sl->select_limit+sl->offset_limit;
if (select_limit_cnt < sl->select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit
- if (select_limit_cnt == HA_POS_ERROR)
+ if (select_limit_cnt == HA_POS_ERROR || sl->braces)
sl->options&= ~OPTION_FOUND_ROWS;
- else if (found_rows_for_union)
+ else
{
- rows= sl->select_limit;
- sl->options|= OPTION_FOUND_ROWS;
+ /*
+ We are doing an union without braces. In this case
+ SQL_CALC_FOUND_ROWS should be done on all sub parts
+ */
+ sl->options|= found_rows_for_union;
}
/*
@@ -301,6 +307,7 @@ int st_select_lex_unit::exec()
}
if (!res)
{
+ records_at_start= table->file->records;
sl->join->exec();
res= sl->join->error;
if (!res && union_result->flush())
@@ -314,10 +321,17 @@ 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+= (sl->join->send_records > rows) ?
- sl->join->send_records - rows : 0;
+ 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.
+ We get this from the difference of between total number of possible
+ rows and actual rows added to the temporary table.
+ */
+ add_rows+= (ulonglong) (thd->limit_found_rows - (table->file->records -
+ records_at_start));
+ }
}
}
optimized= 1;
@@ -382,12 +396,8 @@ int st_select_lex_unit::exec()
(ORDER*) NULL, NULL, (ORDER*) NULL,
options | SELECT_NO_UNLOCK,
result, this, fake_select_lex, 0);
- if (found_rows_for_union && !res)
- {
- thd->limit_found_rows= table->file->records;
- if (!select_cursor->braces)
- thd->limit_found_rows+= add_rows;
- }
+ if (!res)
+ thd->limit_found_rows = (ulonglong)table->file->records + add_rows;
/*
Mark for slow query log if any of the union parts didn't use
indexes efficiently