Skip to content

Commit

Permalink
MDEV-16471 mysqldump throws "Variable 'sql_mode' can't be set to the …
Browse files Browse the repository at this point in the history
…value of 'NULL' (1231)"
  • Loading branch information
abarkov committed Jun 21, 2018
1 parent 9dc81f7 commit bcc2100
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 2 deletions.
24 changes: 24 additions & 0 deletions mysql-test/main/sql_mode.result
Expand Up @@ -780,3 +780,27 @@ END;
$$
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'error;
END' at line 4
#
# End of 10.2 tests
#
#
# Start of 10.3 tests
#
#
# MDEV-16471 mysqldump throws "Variable 'sql_mode' can't be set to the value of 'NULL' (1231)"
#
SET sql_mode='ORACLE,EMPTY_STRING_IS_NULL';
SELECT @@sql_mode;
@@sql_mode
PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,EMPTY_STRING_IS_NULL,SIMULTANEOUS_ASSIGNMENT
SELECT '' AS empty;
empty
NULL
SET sql_mode='';
SELECT @@sql_mode;
@@sql_mode

SET sql_mode=DEFAULT;
#
# End of 10.3 tests
#
Expand Down
23 changes: 23 additions & 0 deletions mysql-test/main/sql_mode.test
Expand Up @@ -554,3 +554,26 @@ BEGIN
END;
$$
DELIMITER ;$$

--echo #
--echo # End of 10.2 tests
--echo #

--echo #
--echo # Start of 10.3 tests
--echo #

--echo #
--echo # MDEV-16471 mysqldump throws "Variable 'sql_mode' can't be set to the value of 'NULL' (1231)"
--echo #

SET sql_mode='ORACLE,EMPTY_STRING_IS_NULL';
SELECT @@sql_mode;
SELECT '' AS empty;
SET sql_mode='';
SELECT @@sql_mode;
SET sql_mode=DEFAULT;

--echo #
--echo # End of 10.3 tests
--echo #
13 changes: 13 additions & 0 deletions sql/item.cc
Expand Up @@ -202,6 +202,19 @@ String *Item::val_str_ascii(String *str)
}


String *Item::val_str_ascii_revert_empty_string_is_null(THD *thd, String *str)
{
String *res= val_str_ascii(str);
if (!res && (thd->variables.sql_mode & MODE_EMPTY_STRING_IS_NULL))
{
null_value= false;
str->set("", 0, &my_charset_latin1);
return str;
}
return res;
}


String *Item::val_str(String *str, String *converter, CHARSET_INFO *cs)
{
String *res= val_str(str);
Expand Down
8 changes: 7 additions & 1 deletion sql/item.h
Expand Up @@ -1171,7 +1171,13 @@ class Item: public Value_source,
Similar to val_str()
*/
virtual String *val_str_ascii(String *str);


/*
Returns the result of val_str_ascii(), translating NULLs back
to empty strings (if MODE_EMPTY_STRING_IS_NULL is set).
*/
String *val_str_ascii_revert_empty_string_is_null(THD *thd, String *str);

/*
Returns the val_str() value converted to the given character set.
*/
Expand Down
3 changes: 2 additions & 1 deletion sql/sys_vars.ic
Expand Up @@ -1354,7 +1354,8 @@ public:

if (var->value->result_type() == STRING_RESULT)
{
if (!(res=var->value->val_str_ascii(&str)))
if (!(res= var->value->val_str_ascii_revert_empty_string_is_null(thd,
&str)))
return true;
else
{
Expand Down

0 comments on commit bcc2100

Please sign in to comment.