List:Internals« Previous MessageNext Message »
From:sinisa Date:August 20 2003 10:56am
Subject:bk commit into 4.1 tree (1.1575)
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of Sinisa. When Sinisa does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://www.mysql.com/doc/I/n/Installing_source_tree.html

ChangeSet
  1.1575 03/08/20 13:56:32 Sinisa@stripped +1 -0
  fixing limit and SQL_CALC_FOUND_ROWS issues

  sql/sql_union.cc
    1.86 03/08/20 13:56:24 Sinisa@stripped +24 -16
    fixing limit and SQL_CALC_FOUND_ROWS issues

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	Sinisa
# Host:	sinisa.nasamreza.org
# Root:	/mnt/work/mysql-4.1

--- 1.85/sql/sql_union.cc	Tue Aug 19 00:08:57 2003
+++ 1.86/sql/sql_union.cc	Wed Aug 20 13:56:24 2003
@@ -123,7 +123,7 @@
     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 @@
   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
@@ -256,6 +249,7 @@
 {
   SELECT_LEX_NODE *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))
@@ -272,6 +266,7 @@
     }
     for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select())
     {
+      unsigned int rows;
       if (optimized)
 	res= sl->join->reinit();
       else
@@ -286,6 +281,11 @@
 	  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;
+	}
 	
 	res= join->prepare(&sl->ref_pointer_array,
 			   (TABLE_LIST*) sl->table_list.first, sl->with_wild,
@@ -321,6 +321,8 @@
 	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;
@@ -337,15 +339,17 @@
     if (!thd->is_fatal_error)			// Check if EOM
     {
       SELECT_LEX *fake_select  = new SELECT_LEX(&thd->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->ftfunc_list= &empty_list;
       fake_select->table_list.link_in_list((byte *)&result_table_list,
 					   (byte **)&result_table_list.next);
@@ -357,7 +361,11 @@
 			thd->options | SELECT_NO_UNLOCK,
 			result, this, fake_select, 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;
+      }
       fake_select->exclude();
       delete fake_select;
       /*
Thread
bk commit into 4.1 tree (1.1575)sinisa25 Aug