cleanup: Select_limit_counters rename set_unlimited to clear
The function was originally introduced by eb0804ef5e7eeb059bb193c3c6787e8a4188d34d MDEV-18553: MDEV-16327 pre-requisits part 1: isolation of LIMIT/OFFSET handling set_unlimited had an overloaded notion of both clearing the offset value and the limit value. The code is used for SQL_CALC_ROWS option to disable the limit clause after the limit is reached, while at the same time the calling code suppreses sending of rows. Proposed solution: Dedicated clear method for query initialization (to ensure no garbage remains between executions). Dedicated set_unlimited that only alters the limit value.
This commit is contained in:
parent
3fcc4f6fc2
commit
2d595319bf
@ -2910,7 +2910,7 @@ void st_select_lex_unit::init_query()
|
|||||||
{
|
{
|
||||||
init_query_common();
|
init_query_common();
|
||||||
set_linkage(GLOBAL_OPTIONS_TYPE);
|
set_linkage(GLOBAL_OPTIONS_TYPE);
|
||||||
lim.set_unlimited();
|
lim.clear();
|
||||||
union_distinct= 0;
|
union_distinct= 0;
|
||||||
prepared= optimized= optimized_2= executed= 0;
|
prepared= optimized= optimized_2= executed= 0;
|
||||||
bag_set_op_optimized= 0;
|
bag_set_op_optimized= 0;
|
||||||
|
@ -37,8 +37,13 @@ class Select_limit_counters
|
|||||||
{
|
{
|
||||||
offset_limit_cnt= offset;
|
offset_limit_cnt= offset;
|
||||||
select_limit_cnt= limit;
|
select_limit_cnt= limit;
|
||||||
if (select_limit_cnt + offset_limit_cnt >=
|
/*
|
||||||
select_limit_cnt)
|
Guard against an overflow condition, where limit + offset exceede
|
||||||
|
ha_rows value range. This case covers unreasonably large parameter
|
||||||
|
values that do not have any practical use so assuming in this case
|
||||||
|
that the query does not have a limit is fine.
|
||||||
|
*/
|
||||||
|
if (select_limit_cnt + offset_limit_cnt >= select_limit_cnt)
|
||||||
select_limit_cnt+= offset_limit_cnt;
|
select_limit_cnt+= offset_limit_cnt;
|
||||||
else
|
else
|
||||||
select_limit_cnt= HA_POS_ERROR;
|
select_limit_cnt= HA_POS_ERROR;
|
||||||
@ -52,7 +57,16 @@ class Select_limit_counters
|
|||||||
|
|
||||||
bool is_unlimited() const
|
bool is_unlimited() const
|
||||||
{ return select_limit_cnt == HA_POS_ERROR; }
|
{ return select_limit_cnt == HA_POS_ERROR; }
|
||||||
|
/*
|
||||||
|
Set the limit to allow returning an unlimited number of rows. Useful
|
||||||
|
for cases when we want to continue execution indefinitely after the limit
|
||||||
|
is reached (for example for SQL_CALC_ROWS extension).
|
||||||
|
*/
|
||||||
void set_unlimited()
|
void set_unlimited()
|
||||||
|
{ select_limit_cnt= HA_POS_ERROR; }
|
||||||
|
|
||||||
|
/* Reset the limit entirely. */
|
||||||
|
void clear()
|
||||||
{ select_limit_cnt= HA_POS_ERROR; offset_limit_cnt= 0; }
|
{ select_limit_cnt= HA_POS_ERROR; offset_limit_cnt= 0; }
|
||||||
|
|
||||||
bool check_offset(ha_rows sent) const
|
bool check_offset(ha_rows sent) const
|
||||||
|
@ -7761,8 +7761,8 @@ void mysql_init_multi_delete(LEX *lex)
|
|||||||
{
|
{
|
||||||
lex->sql_command= SQLCOM_DELETE_MULTI;
|
lex->sql_command= SQLCOM_DELETE_MULTI;
|
||||||
mysql_init_select(lex);
|
mysql_init_select(lex);
|
||||||
lex->first_select_lex()->limit_params.select_limit= 0;
|
lex->first_select_lex()->limit_params.clear();
|
||||||
lex->unit.lim.set_unlimited();
|
lex->unit.lim.clear();
|
||||||
lex->first_select_lex()->table_list.
|
lex->first_select_lex()->table_list.
|
||||||
save_and_clear(&lex->auxiliary_table_list);
|
save_and_clear(&lex->auxiliary_table_list);
|
||||||
lex->query_tables= 0;
|
lex->query_tables= 0;
|
||||||
|
@ -1340,7 +1340,7 @@ bool st_select_lex_unit::prepare(TABLE_LIST *derived_arg,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
sl->join->result= result;
|
sl->join->result= result;
|
||||||
lim.set_unlimited();
|
lim.clear();
|
||||||
if (!sl->join->procedure &&
|
if (!sl->join->procedure &&
|
||||||
result->prepare(sl->join->fields_list, this))
|
result->prepare(sl->join->fields_list, this))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user