Commit 60ac1f1b authored by igor@olga.mysql.com's avatar igor@olga.mysql.com

Fixed bug #24987.

Made the function opt_sum_query to return HA_ERR_KEY_NOT_FOUND when
no matches were found (instead of -1 it returned prior this patch).
This changes allow us to avoid possible conflicts with return values
from user-defined handler methods which also may return -1. 
No particular test cases are provided with this fix.
parent 36df33d8
...@@ -68,9 +68,9 @@ static int maxmin_in_range(bool max_fl, Field* field, COND *cond); ...@@ -68,9 +68,9 @@ static int maxmin_in_range(bool max_fl, Field* field, COND *cond);
GROUP BY part. GROUP BY part.
RETURN VALUES RETURN VALUES
0 No errors 0 no errors
1 if all items were resolved 1 if all items were resolved
-1 on impossible conditions HA_ERR_KEY_NOT_FOUND on impossible conditions
OR an error number from my_base.h HA_ERR_... if a deadlock or a lock OR an error number from my_base.h HA_ERR_... if a deadlock or a lock
wait timeout happens, for example wait timeout happens, for example
*/ */
...@@ -216,7 +216,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds) ...@@ -216,7 +216,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
if (error) if (error)
{ {
if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE) if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE)
return -1; // No rows matching WHERE return HA_ERR_KEY_NOT_FOUND; // No rows matching WHERE
/* HA_ERR_LOCK_DEADLOCK or some other error */ /* HA_ERR_LOCK_DEADLOCK or some other error */
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
return(error); return(error);
...@@ -303,7 +303,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds) ...@@ -303,7 +303,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
if (error) if (error)
{ {
if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE) if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE)
return -1; // No rows matching WHERE return HA_ERR_KEY_NOT_FOUND; // No rows matching WHERE
/* HA_ERR_LOCK_DEADLOCK or some other error */ /* HA_ERR_LOCK_DEADLOCK or some other error */
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
return(error); return(error);
......
...@@ -531,23 +531,25 @@ JOIN::optimize() ...@@ -531,23 +531,25 @@ JOIN::optimize()
{ {
int res; int res;
/* /*
opt_sum_query() returns -1 if no rows match to the WHERE conditions, opt_sum_query() returns HA_ERR_KEY_NOT_FOUND if no rows match
or 1 if all items were resolved, or 0, or an error number HA_ERR_... to the WHERE conditions,
or 1 if all items were resolved,
or 0, or an error number HA_ERR_...
*/ */
if ((res=opt_sum_query(tables_list, all_fields, conds))) if ((res=opt_sum_query(tables_list, all_fields, conds)))
{ {
if (res == HA_ERR_KEY_NOT_FOUND)
{
zero_result_cause= "No matching min/max row";
error=0;
DBUG_RETURN(0);
}
if (res > 1) if (res > 1)
{ {
thd->fatal_error(); thd->fatal_error();
error= res; error= res;
DBUG_RETURN(1); DBUG_RETURN(1);
} }
if (res < 0)
{
zero_result_cause= "No matching min/max row";
error=0;
DBUG_RETURN(0);
}
zero_result_cause= "Select tables optimized away"; zero_result_cause= "Select tables optimized away";
tables_list= 0; // All tables resolved tables_list= 0; // All tables resolved
/* /*
......
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