MDEV-34142 Server crashes in create_internal_tmp_table with low tmp space limit
This commit is contained in:
parent
46751d4b81
commit
fcb3183479
@ -213,4 +213,25 @@ ERROR HY000: Local temporary space limit reached
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
connection default;
|
connection default;
|
||||||
disconnect c1;
|
disconnect c1;
|
||||||
|
#
|
||||||
|
# MDEV-34142 Server crashes in create_internal_tmp_table with low tmp
|
||||||
|
# space limit
|
||||||
|
#
|
||||||
|
SET MAX_TMP_SESSION_SPACE_USAGE = 128*1024, MAX_HEAP_TABLE_SIZE= 16*1024*1024;
|
||||||
|
CREATE TABLE t1 (a varchar(1024)) DEFAULT CHARACTER SET utf8mb3;
|
||||||
|
INSERT INTO t1 SELECT 'x' FROM seq_1_to_50;
|
||||||
|
SELECT * FROM t1 JOIN seq_1_to_200 INTERSECT ALL SELECT * FROM t1 JOIN seq_1_to_200;
|
||||||
|
ERROR HY000: Local temporary space limit reached
|
||||||
|
drop table t1;
|
||||||
|
#
|
||||||
|
# MDEV-34149 Corruption-like errors are produced when temporary space
|
||||||
|
# limit is reached
|
||||||
|
#
|
||||||
|
SET MAX_TMP_SESSION_SPACE_USAGE = 400*1024;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect max_tmp_session_space_usage value: '409600'
|
||||||
|
SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_VARIABLES JOIN seq_1_to_100
|
||||||
|
INTERSECT ALL
|
||||||
|
SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_VARIABLES JOIN seq_1_to_100;
|
||||||
|
ERROR HY000: Local temporary space limit reached
|
||||||
# End of 11.5 tests
|
# End of 11.5 tests
|
||||||
|
@ -275,4 +275,27 @@ drop table t1;
|
|||||||
connection default;
|
connection default;
|
||||||
disconnect c1;
|
disconnect c1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-34142 Server crashes in create_internal_tmp_table with low tmp
|
||||||
|
--echo # space limit
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET MAX_TMP_SESSION_SPACE_USAGE = 128*1024, MAX_HEAP_TABLE_SIZE= 16*1024*1024;
|
||||||
|
CREATE TABLE t1 (a varchar(1024)) DEFAULT CHARACTER SET utf8mb3;
|
||||||
|
INSERT INTO t1 SELECT 'x' FROM seq_1_to_50;
|
||||||
|
--error 200
|
||||||
|
SELECT * FROM t1 JOIN seq_1_to_200 INTERSECT ALL SELECT * FROM t1 JOIN seq_1_to_200;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-34149 Corruption-like errors are produced when temporary space
|
||||||
|
--echo # limit is reached
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET MAX_TMP_SESSION_SPACE_USAGE = 400*1024;
|
||||||
|
--error 200
|
||||||
|
SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_VARIABLES JOIN seq_1_to_100
|
||||||
|
INTERSECT ALL
|
||||||
|
SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_VARIABLES JOIN seq_1_to_100;
|
||||||
|
|
||||||
--echo # End of 11.5 tests
|
--echo # End of 11.5 tests
|
||||||
|
@ -21252,7 +21252,7 @@ TABLE *Create_tmp_table::start(THD *thd,
|
|||||||
&m_key_part_info,
|
&m_key_part_info,
|
||||||
sizeof(*m_key_part_info)*(param->group_parts+1),
|
sizeof(*m_key_part_info)*(param->group_parts+1),
|
||||||
¶m->start_recinfo,
|
¶m->start_recinfo,
|
||||||
sizeof(*param->recinfo)*(field_count*2+4),
|
sizeof(*param->start_recinfo)*(field_count*2+4),
|
||||||
¶m->rec_per_key, sizeof(ulong)*param->group_parts,
|
¶m->rec_per_key, sizeof(ulong)*param->group_parts,
|
||||||
&tmpname, (uint) strlen(path)+1,
|
&tmpname, (uint) strlen(path)+1,
|
||||||
&m_group_buff, (m_group && ! m_using_unique_constraint ?
|
&m_group_buff, (m_group && ! m_using_unique_constraint ?
|
||||||
@ -22714,6 +22714,7 @@ bool create_internal_tmp_table(TABLE *table, KEY *org_keyinfo,
|
|||||||
and copy all rows to this
|
and copy all rows to this
|
||||||
|
|
||||||
In case of error, my_error() or handler::print_error() will be called.
|
In case of error, my_error() or handler::print_error() will be called.
|
||||||
|
Note that in case of error, table->file->ha_rnd_end() may have been called!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,8 +157,9 @@ int select_unit::send_data(List<Item> &values)
|
|||||||
switch (step)
|
switch (step)
|
||||||
{
|
{
|
||||||
case UNION_TYPE:
|
case UNION_TYPE:
|
||||||
|
/* Errors not related to duplicate key are reported by write_record() */
|
||||||
rc= write_record();
|
rc= write_record();
|
||||||
/* no reaction with conversion */
|
/* no reaction with conversion. rc == -1 (dupp key) is ignored by caller */
|
||||||
if (rc == -2)
|
if (rc == -2)
|
||||||
rc= 0;
|
rc= 0;
|
||||||
break;
|
break;
|
||||||
@ -431,19 +432,12 @@ int select_unit::write_record()
|
|||||||
tmp_table_param.start_recinfo,
|
tmp_table_param.start_recinfo,
|
||||||
&tmp_table_param.recinfo,
|
&tmp_table_param.recinfo,
|
||||||
write_err, 1, &is_duplicate))
|
write_err, 1, &is_duplicate))
|
||||||
{
|
|
||||||
return -2;
|
return -2;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (is_duplicate)
|
if (is_duplicate)
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,27 +492,26 @@ bool select_unit_ext::disable_index_if_needed(SELECT_LEX *curr_sl)
|
|||||||
@retval
|
@retval
|
||||||
0 no error
|
0 no error
|
||||||
-1 conversion happened
|
-1 conversion happened
|
||||||
|
1 error
|
||||||
|
|
||||||
|
Note that duplicate keys are ignored (write_record() is returning -1)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int select_unit_ext::unfold_record(ha_rows cnt)
|
int select_unit_ext::unfold_record(ha_rows cnt)
|
||||||
{
|
{
|
||||||
|
|
||||||
DBUG_ASSERT(cnt > 0);
|
DBUG_ASSERT(cnt > 0);
|
||||||
int error= 0;
|
int ret= 0;
|
||||||
bool is_convertion_happened= false;
|
|
||||||
while (--cnt)
|
while (--cnt)
|
||||||
{
|
{
|
||||||
error= write_record();
|
int error= write_record();
|
||||||
if (error == -2)
|
if (error == -2)
|
||||||
{
|
ret= -1; // Conversion happened
|
||||||
is_convertion_happened= true;
|
else if (error > 0)
|
||||||
error= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_convertion_happened)
|
|
||||||
return -1;
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@brief
|
@brief
|
||||||
@ -873,7 +866,7 @@ bool select_unit_ext::send_eof()
|
|||||||
if (unlikely(error))
|
if (unlikely(error))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (unfold_record(dup_cnt) == -1)
|
if ((error= unfold_record(dup_cnt)) == -1)
|
||||||
{
|
{
|
||||||
/* restart the scan */
|
/* restart the scan */
|
||||||
if (unlikely(table->file->ha_rnd_init_with_error(1)))
|
if (unlikely(table->file->ha_rnd_init_with_error(1)))
|
||||||
@ -884,8 +877,14 @@ bool select_unit_ext::send_eof()
|
|||||||
additional_cnt= table->field[addon_cnt - 2];
|
additional_cnt= table->field[addon_cnt - 2];
|
||||||
else
|
else
|
||||||
additional_cnt= NULL;
|
additional_cnt= NULL;
|
||||||
|
error= 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (error > 0)
|
||||||
|
{
|
||||||
|
table->file->ha_index_or_rnd_end();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
} while (likely(!error));
|
} while (likely(!error));
|
||||||
table->file->ha_rnd_end();
|
table->file->ha_rnd_end();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user