diff options
author | Alexander Barkov <bar@mariadb.org> | 2017-11-07 21:57:42 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2017-11-07 21:57:42 +0400 |
commit | ca695888e00a4bdace1bc2143d91a0a871f39a6b (patch) | |
tree | 55682e8170e5c80805f0183aa652915ef8390cea | |
parent | 6a524fcfdde539c6448aa4126ccb5ed79055b9ce (diff) | |
download | mariadb-git-ca695888e00a4bdace1bc2143d91a0a871f39a6b.tar.gz |
MDEV-14116 INET6_NTOA output is set as null to varchar(39) variable
-rw-r--r-- | mysql-test/r/func_misc.result | 14 | ||||
-rw-r--r-- | mysql-test/t/func_misc.test | 16 | ||||
-rw-r--r-- | sql/item_inetfunc.cc | 7 | ||||
-rw-r--r-- | sql/item_inetfunc.h | 6 |
4 files changed, 37 insertions, 6 deletions
diff --git a/mysql-test/r/func_misc.result b/mysql-test/r/func_misc.result index e44335f1b51..d54a70cab45 100644 --- a/mysql-test/r/func_misc.result +++ b/mysql-test/r/func_misc.result @@ -1407,3 +1407,17 @@ SELECT CONCAT(NAME_CONST('name',15),'오'); CONCAT(NAME_CONST('name',15),'오') 15오 SET NAMES latin1; +# +# MDEV-14116 INET6_NTOA output is set as null to varchar(39) variable +# +CREATE PROCEDURE p1() +BEGIN +DECLARE ip_full_addr varchar(39) DEFAULT ""; +SELECT INET6_NTOA(UNHEX('20000000000000000000000000000000')) into ip_full_addr; +SELECT ip_full_addr; +END; +$$ +CALL p1(); +ip_full_addr +2000:: +DROP PROCEDURE p1; diff --git a/mysql-test/t/func_misc.test b/mysql-test/t/func_misc.test index ebd5675e031..dc7202268d6 100644 --- a/mysql-test/t/func_misc.test +++ b/mysql-test/t/func_misc.test @@ -1091,3 +1091,19 @@ SELECT COERCIBILITY(NAME_CONST('name',TIME'00:00:00')); SELECT COERCIBILITY(NAME_CONST('name',15)); SELECT CONCAT(NAME_CONST('name',15),'오'); SET NAMES latin1; + +--echo # +--echo # MDEV-14116 INET6_NTOA output is set as null to varchar(39) variable +--echo # + +DELIMITER $$; +CREATE PROCEDURE p1() +BEGIN + DECLARE ip_full_addr varchar(39) DEFAULT ""; + SELECT INET6_NTOA(UNHEX('20000000000000000000000000000000')) into ip_full_addr; + SELECT ip_full_addr; +END; +$$ +DELIMITER ;$$ +CALL p1(); +DROP PROCEDURE p1; diff --git a/sql/item_inetfunc.cc b/sql/item_inetfunc.cc index 6a09747fa1a..4c4dfa4497b 100644 --- a/sql/item_inetfunc.cc +++ b/sql/item_inetfunc.cc @@ -181,7 +181,8 @@ String *Item_func_inet_str_base::val_str_ascii(String *buffer) return NULL; } - String *arg_str= args[0]->val_str(buffer); + StringBuffer<STRING_BUFFER_USUAL_SIZE> tmp; + String *arg_str= args[0]->val_str(&tmp); if (!arg_str) // Out-of memory happened. The error has been reported. { // Or: the underlying field is NULL null_value= true; @@ -679,7 +680,7 @@ static void ipv6_to_str(const in6_addr *ipv6, char *str) @retval true The string has been converted sucessfully. */ -bool Item_func_inet6_aton::calc_value(String *arg, String *buffer) +bool Item_func_inet6_aton::calc_value(const String *arg, String *buffer) { // ipv4-string -> varbinary(4) // ipv6-string -> varbinary(16) @@ -719,7 +720,7 @@ bool Item_func_inet6_aton::calc_value(String *arg, String *buffer) @retval true The string has been converted sucessfully. */ -bool Item_func_inet6_ntoa::calc_value(String *arg, String *buffer) +bool Item_func_inet6_ntoa::calc_value(const String *arg, String *buffer) { if (arg->charset() != &my_charset_bin) return false; diff --git a/sql/item_inetfunc.h b/sql/item_inetfunc.h index 3a85d367ff1..d6fcc07a1c6 100644 --- a/sql/item_inetfunc.h +++ b/sql/item_inetfunc.h @@ -99,7 +99,7 @@ public: virtual String *val_str_ascii(String *buffer); protected: - virtual bool calc_value(String *arg, String *buffer) = 0; + virtual bool calc_value(const String *arg, String *buffer) = 0; }; @@ -126,7 +126,7 @@ public: } protected: - virtual bool calc_value(String *arg, String *buffer); + virtual bool calc_value(const String *arg, String *buffer); }; @@ -158,7 +158,7 @@ public: } protected: - virtual bool calc_value(String *arg, String *buffer); + virtual bool calc_value(const String *arg, String *buffer); }; |