mirror of
https://github.com/MariaDB/server.git
synced 2025-11-09 11:41:36 +03:00
Fix for BUG#16211: Stored function return type for strings is ignored.
Fix for BUG#16676: Database CHARSET not used for stored procedures
The problem in BUG#16211 is that CHARSET-clause of the return type for
stored functions is just ignored.
The problem in BUG#16676 is that if character set is not explicitly
specified for sp-variable, the server character set is used instead
of the database one.
The fix has two parts:
- always store CHARSET-clause of the return type along with the
type definition in mysql.proc.returns column. "Always" means that
CHARSET-clause is appended even if it has not been explicitly
specified in CREATE FUNCTION statement (this affects BUG#16211 only).
Storing CHARSET-clause if it is not specified is essential to avoid
changing character set if the database character set is altered in
the future.
NOTE: this change is not backward compatible with the previous releases.
- use database default character set if CHARSET-clause is not explicitly
specified (this affects both BUG#16211 and BUG#16676).
NOTE: this also breaks backward compatibility.
mysql-test/r/mysqldump.result:
Updated result file.
mysql-test/r/sp.result:
Updated result file.
mysql-test/t/sp.test:
Provided test cases for BUG#16211, BUG#16676.
sql/mysql_priv.h:
Added two convenient functions for work with databases.
sql/sp.cc:
1. Add CHARSET-clause to CREATE-statement if it has been explicitly specified.
2. Polishing -- provided some comments.
sql/sp_head.cc:
Use database charset as default charset of sp-variable.
sql/sp_head.h:
Move init_sp_name() out of init_strings().
sql/sql_db.cc:
Two new functions created:
- load_db_opt_by_name();
- check_db_dir_existence();
sql/sql_show.cc:
Eliminate duplicated code by using
check_db_dir_existence() and load_db_opt_by_name()
sql/sql_table.cc:
Eliminate duplicated code by using
check_db_dir_existence() and load_db_opt_by_name()
sql/sql_yacc.yy:
Call sp_head::init_sp_name() to initialize stored routine name.
This commit is contained in:
@@ -2248,7 +2248,7 @@ RETURN a+b */;;
|
||||
/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE*/;;
|
||||
/*!50003 DROP FUNCTION IF EXISTS `bug9056_func2` */;;
|
||||
/*!50003 SET SESSION SQL_MODE=""*/;;
|
||||
/*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 FUNCTION `bug9056_func2`(f1 char binary) RETURNS char(1)
|
||||
/*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 FUNCTION `bug9056_func2`(f1 char binary) RETURNS char(1) CHARSET latin1
|
||||
begin
|
||||
set f1= concat( 'hello', f1 );
|
||||
return f1;
|
||||
|
||||
@@ -5069,4 +5069,157 @@ END |
|
||||
SET @a = _latin2"aaaaaaaaaa" |
|
||||
CALL bug21013(10) |
|
||||
DROP PROCEDURE bug21013 |
|
||||
DROP DATABASE IF EXISTS mysqltest1|
|
||||
DROP DATABASE IF EXISTS mysqltest2|
|
||||
CREATE DATABASE mysqltest1 DEFAULT CHARACTER SET utf8|
|
||||
CREATE DATABASE mysqltest2 DEFAULT CHARACTER SET utf8|
|
||||
use mysqltest1|
|
||||
CREATE FUNCTION bug16211_f1() RETURNS CHAR(10)
|
||||
RETURN ""|
|
||||
CREATE FUNCTION bug16211_f2() RETURNS CHAR(10) CHARSET koi8r
|
||||
RETURN ""|
|
||||
CREATE FUNCTION mysqltest2.bug16211_f3() RETURNS CHAR(10)
|
||||
RETURN ""|
|
||||
CREATE FUNCTION mysqltest2.bug16211_f4() RETURNS CHAR(10) CHARSET koi8r
|
||||
RETURN ""|
|
||||
SHOW CREATE FUNCTION bug16211_f1|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f1 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f1`() RETURNS char(10) CHARSET utf8
|
||||
RETURN ""
|
||||
SHOW CREATE FUNCTION bug16211_f2|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f2 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f2`() RETURNS char(10) CHARSET koi8r
|
||||
RETURN ""
|
||||
SHOW CREATE FUNCTION mysqltest2.bug16211_f3|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f3 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f3`() RETURNS char(10) CHARSET utf8
|
||||
RETURN ""
|
||||
SHOW CREATE FUNCTION mysqltest2.bug16211_f4|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f4 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f4`() RETURNS char(10) CHARSET koi8r
|
||||
RETURN ""
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest1" AND ROUTINE_NAME = "bug16211_f1"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET utf8
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest1" AND ROUTINE_NAME = "bug16211_f2"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET koi8r
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest2" AND ROUTINE_NAME = "bug16211_f3"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET utf8
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest2" AND ROUTINE_NAME = "bug16211_f4"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET koi8r
|
||||
SELECT CHARSET(bug16211_f1())|
|
||||
CHARSET(bug16211_f1())
|
||||
utf8
|
||||
SELECT CHARSET(bug16211_f2())|
|
||||
CHARSET(bug16211_f2())
|
||||
koi8r
|
||||
SELECT CHARSET(mysqltest2.bug16211_f3())|
|
||||
CHARSET(mysqltest2.bug16211_f3())
|
||||
utf8
|
||||
SELECT CHARSET(mysqltest2.bug16211_f4())|
|
||||
CHARSET(mysqltest2.bug16211_f4())
|
||||
koi8r
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp1251|
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp1251|
|
||||
SHOW CREATE FUNCTION bug16211_f1|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f1 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f1`() RETURNS char(10) CHARSET utf8
|
||||
RETURN ""
|
||||
SHOW CREATE FUNCTION bug16211_f2|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f2 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f2`() RETURNS char(10) CHARSET koi8r
|
||||
RETURN ""
|
||||
SHOW CREATE FUNCTION mysqltest2.bug16211_f3|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f3 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f3`() RETURNS char(10) CHARSET utf8
|
||||
RETURN ""
|
||||
SHOW CREATE FUNCTION mysqltest2.bug16211_f4|
|
||||
Function sql_mode Create Function
|
||||
bug16211_f4 CREATE DEFINER=`root`@`localhost` FUNCTION `bug16211_f4`() RETURNS char(10) CHARSET koi8r
|
||||
RETURN ""
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest1" AND ROUTINE_NAME = "bug16211_f1"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET utf8
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest1" AND ROUTINE_NAME = "bug16211_f2"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET koi8r
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest2" AND ROUTINE_NAME = "bug16211_f3"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET utf8
|
||||
SELECT dtd_identifier
|
||||
FROM INFORMATION_SCHEMA.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA = "mysqltest2" AND ROUTINE_NAME = "bug16211_f4"|
|
||||
dtd_identifier
|
||||
char(10) CHARSET koi8r
|
||||
SELECT CHARSET(bug16211_f1())|
|
||||
CHARSET(bug16211_f1())
|
||||
utf8
|
||||
SELECT CHARSET(bug16211_f2())|
|
||||
CHARSET(bug16211_f2())
|
||||
koi8r
|
||||
SELECT CHARSET(mysqltest2.bug16211_f3())|
|
||||
CHARSET(mysqltest2.bug16211_f3())
|
||||
utf8
|
||||
SELECT CHARSET(mysqltest2.bug16211_f4())|
|
||||
CHARSET(mysqltest2.bug16211_f4())
|
||||
koi8r
|
||||
use test|
|
||||
DROP DATABASE mysqltest1|
|
||||
DROP DATABASE mysqltest2|
|
||||
DROP DATABASE IF EXISTS mysqltest1|
|
||||
CREATE DATABASE mysqltest1 DEFAULT CHARACTER SET utf8|
|
||||
use mysqltest1|
|
||||
CREATE PROCEDURE bug16676_p1(
|
||||
IN p1 CHAR(10),
|
||||
INOUT p2 CHAR(10),
|
||||
OUT p3 CHAR(10))
|
||||
BEGIN
|
||||
SELECT CHARSET(p1), COLLATION(p1);
|
||||
SELECT CHARSET(p2), COLLATION(p2);
|
||||
SELECT CHARSET(p3), COLLATION(p3);
|
||||
END|
|
||||
CREATE PROCEDURE bug16676_p2(
|
||||
IN p1 CHAR(10) CHARSET koi8r,
|
||||
INOUT p2 CHAR(10) CHARSET cp1251,
|
||||
OUT p3 CHAR(10) CHARSET greek)
|
||||
BEGIN
|
||||
SELECT CHARSET(p1), COLLATION(p1);
|
||||
SELECT CHARSET(p2), COLLATION(p2);
|
||||
SELECT CHARSET(p3), COLLATION(p3);
|
||||
END|
|
||||
SET @v2 = 'b'|
|
||||
SET @v3 = 'c'|
|
||||
CALL bug16676_p1('a', @v2, @v3)|
|
||||
CHARSET(p1) COLLATION(p1)
|
||||
utf8 utf8_general_ci
|
||||
CHARSET(p2) COLLATION(p2)
|
||||
utf8 utf8_general_ci
|
||||
CHARSET(p3) COLLATION(p3)
|
||||
utf8 utf8_general_ci
|
||||
CALL bug16676_p2('a', @v2, @v3)|
|
||||
CHARSET(p1) COLLATION(p1)
|
||||
koi8r koi8r_general_ci
|
||||
CHARSET(p2) COLLATION(p2)
|
||||
cp1251 cp1251_general_ci
|
||||
CHARSET(p3) COLLATION(p3)
|
||||
greek greek_general_ci
|
||||
use test|
|
||||
DROP DATABASE mysqltest1|
|
||||
drop table t1,t2;
|
||||
|
||||
Reference in New Issue
Block a user