Bug #26670 sql_mode set to null old value
Submitted: 27 Feb 2007 8:42 Modified: 30 Oct 2007 8:23
Reporter: bocquet denis Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Backup Severity:S2 (Serious)
Version:5.0.41, 5.1 OS:Linux (linux)
Assigned to: CPU Architecture:Any
Tags: Backup, mysqldump, sql_node

[27 Feb 2007 8:42] bocquet denis
Description:
--
-- Dumping routines for database 'footx'
--
DELIMITER ;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`lxquip`@`%`*/ /*!50003 PROCEDURE `spAjouteSportifsNonJoue`(IN idniveau BIGINT)
BEGIN
[...]
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`lequipe`@`%`*/ /*!50003 PROCEDURE `spAttribueRang`(IN idniveau BIGINT,IN idcompet BIGINT)
BEGIN

How to repeat:
when one makes a safeguard with 
 mysqldump $CNX_BKP -q -R \
          --hex-blob \
          --add-drop-table=0 \
          --single-transaction \
          --fields-terminated-by="|" --lines-terminated-by='\n' \
          $DB --tab . -r $DB.proc
an error occurs has the execution
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
that is in the result $DB.proc
@OLD_SQL_MODE is set to NULL (it doesn't exist)

Suggested fix:
set the @OLD_SQL_MODE when execute /*!50003 SET SESSION SQL_MODE=""*/;;

it is not necessary to put 
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 SET SESSION SQL_MODE=""*/;;
between 2 proc but only at the end (i think)
it will be best to put "drop proc if exist" before create proc
[27 Feb 2007 10:10] bocquet denis
sorry the "drop if exist" is put when you don't use add-drop-table=0.
that-'s ok
but the OLD_SQL_node is not set.
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 DROP PROCEDURE IF EXISTS `spAttribueRang` */;;
/*!50003 SET SESSION SQL_MODE=""*/;;
[28 Feb 2007 10:30] Sveta Smirnova
Thank you for the report.

As I understand from your description your request is put before CREATE PROCEDURE line /*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;; and not reset SESSION SQL_MODE in next line.

Please confirm or refuse if I understood you correctly.
[28 Feb 2007 12:02] bocquet denis
in sql generated for the tables before create table, you put 
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
and after you put
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
this isn't the same with the procedure, you have 
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
but @OLD_SQL_MODE isn't known and an error occurs.
so before create proc you have
/*!50003 SET SESSION SQL_MODE=""*/;;
it will be best to have 
/*!50003 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
[1 Mar 2007 12:18] Sveta Smirnova
Thank you for the feedback.

I can not repeat it with current development sources. Below is output of mysqldump for database contains only stored procedures. You can see string "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;" before dump of any procedure.

So, please, provide output of mysqldump which can raise error.

$mysqldump --socket=/tmp/mysql50.sock -uroot -R bug26670
-- MySQL dump 10.11
--
-- Host: localhost    Database: bug26670
-- ------------------------------------------------------
-- Server version       5.0.38-debug

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping routines for database 'bug26670'
--
DELIMITER ;;
/*!50003 DROP PROCEDURE IF EXISTS `p1` */;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 PROCEDURE `p1`()
begin
select 1;
end */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 DROP PROCEDURE IF EXISTS `p2` */;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 PROCEDURE `p2`()
begin
select 1;
end */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 DROP PROCEDURE IF EXISTS `p3` */;;
/*!50003 SET SESSION SQL_MODE="ANSI_QUOTES"*/;;
/*!50003 CREATE*/ /*!50020 DEFINER="root"@"localhost"*/ /*!50003 PROCEDURE "p3"()
begin
select 'foo' as "foo";
end */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
DELIMITER ;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2007-03-01 12:11:23
[1 Apr 2007 23:00] Bugs System
No feedback was provided for this bug for over a month, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
[12 Apr 2007 12:48] Valeriy Kravchuk
"Can't repeat" looks like a more reasonable state.
[21 May 2007 9:46] bocquet denis
to repeat : 
1 - you create 2 procedures in database test
2 - you use mysqldump -R test -r test.proc
3 - you reload the proc with mysql < test.proc

and you receive this error:
ERROR 1231 (42000) at line 13: Variable 'sql_mode' can't be set to the value of 'NULL'

--
-- Dumping routines for database 'test'
--
DELIMITER ;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`sa`@`%`*/ /*!50003 FUNCTION `GEN_ID`(name VARCHAR(15), increment INT) RETURNS int(11)
    MODIFIES SQL DATA
BEGIN
 UPDATE test.sequences SET seq_value=@id:=seq_value+increment WHERE seq_name=name;
     RETURN @id;
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`sa`@`%`*/ /*!50003 FUNCTION `GETAPPMODE`(PDATE CHAR(10), PTIME CHAR(10), POFFSET INTEGER) RETURNS char(1)
    READS SQL DATA
BEGIN
...

te pb is here : /*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
[21 May 2007 10:33] Sveta Smirnova
Thank you for the feedback.

But you provided only part of mysqldump output. Please provide full test.proc file.
[21 May 2007 12:05] bocquet denis
why not

--
-- Dumping routines for database 'test'
--
DELIMITER ;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`sa`@`%`*/ /*!50003 FUNCTION `ADDSECONDS`(t TIME, s INT) RETURNS time
    DETERMINISTIC
BEGIN
RETURN SEC_TO_TIME(TIME_TO_SEC(t) + s);
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`sa`@`%`*/ /*!50003 FUNCTION `GEN_ID`(name VARCHAR(15), increment INT) RETURNS int(11)
    MODIFIES SQL DATA
BEGIN
 UPDATE test.sequences SET seq_value=@id:=seq_value+increment WHERE seq_name=name;
     RETURN @id;
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`sa`@`%`*/ /*!50003 FUNCTION `GETAPPMODE`(PDATE CHAR(10), PTIME CHAR(10), POFFSET INTEGER) RETURNS char(1)
    READS SQL DATA
BEGIN
DECLARE rMode CHAR(1);
DECLARE vCount INT;
DECLARE no_more_rows BOOLEAN;
DECLARE cur1 CURSOR FOR
SELECT TMP.C FROM (
SELECT count(*) C
FROM test.app_data a
WHERE a.app_id = 1
AND a.object = 'MATCH'
AND a.field in ('ID', 'DATE', 'HEURE', 'STATUS')
AND a.rec_id in (select rec_id from test.app_data where field = 'DATE' and data = PDATE)
AND a.rec_id in (select rec_id from test.app_data where field = 'STATUS' and data = '2')
AND a.rec_id in (select rec_id from test.app_data where field = 'HEURE' and
cast(PTIME AS TIME) <= test.ADDSECONDS(cast(data AS TIME), (60 * 120)))
UNION
SELECT count(*) C
FROM test.app_data a
WHERE a.app_id = 1
AND a.object = 'MATCH'
AND a.field in ('ID', 'DATE', 'HEURE', 'STATUS')

AND a.rec_id in (select rec_id from test.app_data where field = 'DATE' and data = PDATE)
AND a.rec_id in (select rec_id from test.app_data where field = 'STATUS' and data = '0')
AND a.rec_id in (select rec_id from test.app_data where field = 'HEURE' and
cast(PTIME AS TIME) >= test.ADDSECONDS(cast(data AS TIME), -(60 * POFFSET)) and
cast(PTIME AS TIME) <= test.ADDSECONDS(cast(data AS TIME), (60 * 120)))
UNION
SELECT count(*) C
FROM test.app_data a
WHERE a.app_id = 1
AND a.object = 'MATCH'
AND a.field in ('ID', 'DATE', 'HEURE', 'STATUS')

AND a.rec_id in (select rec_id from test.app_data where field = 'DATE' and data = PDATE)
AND a.rec_id in (select rec_id from test.app_data where field = 'STATUS' and data = '1' and
cast(PTIME AS TIME) <= test.ADDSECONDS(cast(update_ts AS TIME), (60 * POFFSET)))
) TMP ORDER BY TMP.C ASC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND
        SET no_more_rows = TRUE;
SET rMode = 'F';
OPEN cur1;
loop_cur1: LOOP
FETCH cur1 INTO vCount;
IF no_more_rows THEN
CLOSE cur1;
LEAVE loop_cur1;
END IF;
IF(vCount > 0) THEN
SET rMode = 'C';
ELSE
SET rMode = 'F';
END IF;
END LOOP loop_cur1;
    RETURN rMode;
END */;;
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
DELIMITER ;

 mysql -h0 -P0 -usa -p$SAPASS -Dtest < test.proc
ERROR 1231 (42000) at line 12: Variable 'sql_mode' can't be set to the value of 'NULL'
[22 May 2007 8:16] Sveta Smirnova
Thank you for the feedback.

But before string

--
-- Dumping routines for database 'test'
--

output of mysqldump must contain header like:

-- MySQL dump 10.11
--
-- Host: localhost    Database: bug26670
-- ------------------------------------------------------
-- Server version       5.0.38-debug

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0
*/;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

Are you sure your version of mysqldump creates dump file without such header? If yes, please, provide output of mysqldump --version and name of package you get it form.
[8 Jun 2007 11:28] Sveta Smirnova
test case

Attachment: bug26670.test (application/octet-stream, text), 390 bytes.

[8 Jun 2007 11:28] Sveta Smirnova
Thank you for the feedback.

Verified as described using attached test case.
[30 Oct 2007 8:23] bocquet denis
it's ok in 5.0.45
regards