Commit 0812d0de authored by Alexander Barkov's avatar Alexander Barkov

MDEV-28131 Unexpected warning while selecting from information_schema.processlist

Problem:

DECIMAL columns in I_S must be explicitly set of some value.

I_S columns do not have `DEFAULT 0` (after MDEV-18918), so during
restore_record() their record fragments pointed by Field::ptr are
initialized to zero bytes 0x00.
But an array of 0x00's is not a valid binary DECIMAL value.
So val_decimal() called for such Field_new_decimal generated a warning
when seeing a wrong binary encoded DECIMAL value in the record.

Fix:

Explicitly setting INFORMATION_SCHEMA.PROCESSLIST.PROGRESS
to the decimal value of 0 if no progress information is available.
parent fbc1cc97
......@@ -40,3 +40,23 @@ utf8mb4_string xxx😎yyy
#
# End of 10.1 tests
#
#
# Start of 10.3 tests
#
#
# MDEV-28131 Unexpected warning while selecting from information_schema.processlist
#
connect conn1, localhost, root,,;
connection conn1;
SELECT SLEEP(1000);
connection default;
SELECT progress FROM information_schema.processlist WHERE info='SELECT SLEEP(1000)';
progress
0.000
connection conn1;
Got one of the listed errors
connection default;
disconnect conn1;
#
# End of 10.3 tests
#
......@@ -70,3 +70,38 @@ SELECT INFO, INFO_BINARY, 'xxx😎yyy' AS utf8mb4_string FROM INFORMATION_SCHEMA
--echo #
--echo # End of 10.1 tests
--echo #
--echo #
--echo # Start of 10.3 tests
--echo #
--echo #
--echo # MDEV-28131 Unexpected warning while selecting from information_schema.processlist
--echo #
connect (conn1, localhost, root,,);
connection conn1;
let $ID= `select connection_id()`;
send SELECT SLEEP(1000);
connection default;
let $wait_timeout= 10;
let $wait_condition=select count(*)=1 from information_schema.processlist
where state='User sleep' and info='SELECT SLEEP(1000)';
--source include/wait_condition.inc
SELECT progress FROM information_schema.processlist WHERE info='SELECT SLEEP(1000)';
disable_query_log;
eval kill $ID;
enable_query_log;
let $wait_timeout= 10;
let $wait_condition=select count(*)=0 from information_schema.processlist
where state='User sleep' and info='SELECT SLEEP(1000)';
--source include/wait_condition.inc
connection conn1;
--error 2013,ER_CONNECTION_KILLED
reap;
connection default;
disconnect conn1;
--echo #
--echo # End of 10.3 tests
--echo #
......@@ -3351,6 +3351,16 @@ int fill_schema_processlist(THD* thd, TABLE_LIST* tables, COND* cond)
table->field[11]->store((double) tmp->progress.counter /
(double) max_counter*100.0);
}
else
{
/*
This is a DECIMAL column without DEFAULT.
restore_record() fills its Field::ptr to zero bytes,
according to pack_length(). But an array of zero bytes
is not a valid decimal. Set it explicitly to 0.
*/
table->field[11]->store((longlong) 0, true);
}
mysql_mutex_unlock(&tmp->LOCK_thd_data);
}
......
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