| Bug #60840 | Event Scheduler: No data - zero rows fetched, selected, or processed | ||
|---|---|---|---|
| Submitted: | 12 Apr 2011 10:02 | Modified: | 26 Apr 2011 19:08 |
| Reporter: | Sadeq NOT_FOUND | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | MySQL Server: Errors | Severity: | S3 (Non-critical) |
| Version: | 5.5 | OS: | Windows |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | Event | ||
[12 Apr 2011 10:02]
Sadeq NOT_FOUND
[12 Apr 2011 10:48]
Valeriy Kravchuk
Please, send the exact code of procedure and CREATE EVENT statement. Does this problem happen when you run procedure "manually"?
[13 Apr 2011 7:02]
Sadeq NOT_FOUND
No, It does not happen if call the stored procedures when call them manually!
[13 Apr 2011 12:59]
Sadeq NOT_FOUND
The Stored procedures and the Event definition:
DELIMITER ;;
CREATE PROCEDURE `FixTable`(IN `TableName` VARCHAR (400), IN `FixLevel` INT)
BEGIN
declare done int default 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
CASE FixLevel
WHEN 1 THEN SET @SQLText = CONCAT('REPAIR TABLE `',TableName, '` QUICK');
WHEN 2 THEN SET @SQLText = CONCAT('REPAIR TABLE `',TableName, '` EXTENDED');
WHEN 3 THEN SET @SQLText = CONCAT('REPAIR TABLE `',TableName, '` USE_FRM');
WHEN 4 THEN SET @SQLText = CONCAT('OPTIMIZE LOCAL TABLE `',TableName, '` ');
END CASE;
PREPARE RES from @SQLText;
EXECUTE RES;
END ;;
DELIMITER ;
DELIMITER ;;
CREATE PROCEDURE `fixAllTables`(IN `FixLevel` INT)
begin
DECLARE done INT DEFAULT 0;
declare TableName VARCHAR(30);
DECLARE tablestatusCur CURSOR FOR
SELECT TABLE_NAME FROM information_schema.`TABLES` T
where TABLE_SCHEMA=SCHEMA() and Table_comment not like '%VIEW%' and Table_ROWS is null;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open tablestatusCur;
repeat
FETCH tablestatusCur INTO TableName;
if not done then
call FixTable(TableName,FixLevel);
end if;
until done end repeat;
end ;;
DELIMITER ;
DELIMITER ;;
CREATE EVENT `fixTablesHourly`
ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT 'Check for damaged tables and fix them.'
DO BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET @LastEventErrorTime=CURRENT_TIMESTAMP;
call fixAllTables(1);
call fixAllTables(2);
call fixAllTables(3);
END ;;
DELIMITER ;
[13 Apr 2011 13:06]
Sadeq NOT_FOUND
The Create procedure and Event in pastebin: http://pastebin.com/v13HYyWM
[26 Apr 2011 19:08]
Sveta Smirnova
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://dev.mysql.com/doc/ and the instructions on how to report a bug at http://bugs.mysql.com/how-to-report.php Please read at http://dev.mysql.com/doc/refman/5.5/en/news-5-5-6.html: ----<q>---- # Incompatible Change: Handling of warnings and errors during stored program execution was problematic: * If one statement generated several warnings or errors, only the handler for the first was activated, even if another might be more appropriate. * Warning or error information could be lost. (Bug #36185, Bug #5889, Bug #9857, Bug #23032) ----</q>----- This means now, after this fix, warnings from SP which was called first time, are not cleared and accessible in the EVENT. You have to handle them in EVENT too.
[20 Jul 2011 12:12]
Robert Grellmann
Well, he DOES handle the warning in the Event: he declared a CONTINUE HANDLER. He was wrong when he wrote that the warning does not appear when executing the stored procedure manually. If he had executed a "SHOW WARNINGS" after the call, he would have seen the warning. It is just not recorded in the logs when the call is made manually. So this is a bug, and it occurs everytime you use a cursor in a stored procedure. The reason is, that the warning is remembered, although it has been handled. A handled warning should be cleared. At least the manual sections 12.7.4. and 12.7.5. should be updated, mentioning that a warning generated in a stored procedure will be remembered even it was handled, as long as it is not cleared by a subsequent query. This leads us to a workaround: Manual section 12.4.5.41. says, that "a statement that uses a table but generates no messages clears the message list". I was able to suppress the 1329/No data warning when I added another statement near the end of the stored procedure. I just selected a value from a table that contains data, so that it will be successful. In this case: SELECT TABLE_NAME INTO TableName FROM information_schema.`TABLES` LIMIT 1; near the end of `fixAllTables` will let the warning disappear. This is a very odd behaviour and I would consider this being a bug.
[21 Sep 2011 18:40]
Doron Enav
I have the same issue when I upgraded my server to 5.5.14-log. I still have an instance of my old server 5.1.47-log and the issue doesn't occur there.
[28 Dec 2011 13:13]
Van Stokes
This IS a bug and is still persistent as of 5.5.19-log (x64 on Ubuntu 11.10). The explanation from MySQL is incorrect. The error/warning should be cleared if it's handled.
