#At file:///Users/thek/Development/mysql-5.1-bugteam/ based on revid:kristofer.pettersson@stripped
3185 Kristofer Pettersson 2009-10-20 [merge]
automerge
modified:
mysql-test/r/sp.result
mysql-test/t/sp.test
sql/sql_yacc.yy
=== modified file 'mysql-test/r/sp.result'
--- a/mysql-test/r/sp.result 2009-09-04 08:14:54 +0000
+++ b/mysql-test/r/sp.result 2009-10-19 07:43:33 +0000
@@ -6979,6 +6979,51 @@ CALL p1;
ERROR 42S22: Unknown column 'A.b' in 'IN/ALL/ANY subquery'
DROP PROCEDURE p1;
DROP TABLE t1, t2;
+#
+# Bug47627 SET @@{global.session}.local_variable in stored routine causes crash
+#
+DROP PROCEDURE IF EXISTS p1;
+DROP PROCEDURE IF EXISTS p2;
+DROP PROCEDURE IF EXISTS p3;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE v INT DEFAULT 0;
+SET @@session.v= 10;
+END//
+ERROR HY000: Unknown system variable 'v'
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE v INT DEFAULT 0;
+SET v= 10;
+END//
+call p2()//
+CREATE PROCEDURE p3()
+BEGIN
+DECLARE v INT DEFAULT 0;
+SELECT @@session.v;
+END//
+ERROR HY000: Unknown system variable 'v'
+CREATE PROCEDURE p4()
+BEGIN
+DECLARE v INT DEFAULT 0;
+SET @@global.v= 10;
+END//
+ERROR HY000: Unknown system variable 'v'
+CREATE PROCEDURE p5()
+BEGIN
+DECLARE v INT DEFAULT 0;
+SET @@global.query_cache_size= 0;
+SET @@session.identity= 1;
+SELECT @@session.identity;
+SELECT @@global.query_cache_size;
+END//
+CALL p5();
+@@session.identity
+1
+@@global.query_cache_size
+0
+DROP PROCEDURE p2;
+DROP PROCEDURE p5;
# ------------------------------------------------------------------
# -- End of 5.1 tests
# ------------------------------------------------------------------
=== modified file 'mysql-test/t/sp.test'
--- a/mysql-test/t/sp.test 2009-09-04 08:14:54 +0000
+++ b/mysql-test/t/sp.test 2009-10-19 07:43:33 +0000
@@ -8263,7 +8263,51 @@ CALL p1;
DROP PROCEDURE p1;
DROP TABLE t1, t2;
-
+--echo #
+--echo # Bug47627 SET @@{global.session}.local_variable in stored routine causes crash
+--echo #
+--disable_warnings
+DROP PROCEDURE IF EXISTS p1;
+DROP PROCEDURE IF EXISTS p2;
+DROP PROCEDURE IF EXISTS p3;
+--enable_warnings
+delimiter //;
+--error ER_UNKNOWN_SYSTEM_VARIABLE
+CREATE PROCEDURE p1()
+BEGIN
+ DECLARE v INT DEFAULT 0;
+ SET @@session.v= 10;
+END//
+CREATE PROCEDURE p2()
+BEGIN
+ DECLARE v INT DEFAULT 0;
+ SET v= 10;
+END//
+call p2()//
+--error ER_UNKNOWN_SYSTEM_VARIABLE
+CREATE PROCEDURE p3()
+BEGIN
+ DECLARE v INT DEFAULT 0;
+ SELECT @@session.v;
+END//
+--error ER_UNKNOWN_SYSTEM_VARIABLE
+CREATE PROCEDURE p4()
+BEGIN
+ DECLARE v INT DEFAULT 0;
+ SET @@global.v= 10;
+END//
+CREATE PROCEDURE p5()
+BEGIN
+ DECLARE v INT DEFAULT 0;
+ SET @@global.query_cache_size= 0;
+ SET @@session.identity= 1;
+ SELECT @@session.identity;
+ SELECT @@global.query_cache_size;
+END//
+delimiter ;//
+CALL p5();
+DROP PROCEDURE p2;
+DROP PROCEDURE p5;
--echo # ------------------------------------------------------------------
--echo # -- End of 5.1 tests
--echo # ------------------------------------------------------------------
=== modified file 'sql/sql_yacc.yy'
--- a/sql/sql_yacc.yy 2009-10-16 10:29:42 +0000
+++ b/sql/sql_yacc.yy 2009-10-20 06:21:35 +0000
@@ -11783,8 +11783,17 @@ option_type:
;
option_type2:
- /* empty */ { $$= OPT_DEFAULT; }
- | ONE_SHOT_SYM { Lex->one_shot_set= 1; $$= OPT_SESSION; }
+ /* empty */
+ {
+ $$= OPT_DEFAULT;
+ Lex->option_type= OPT_DEFAULT;
+ }
+ | ONE_SHOT_SYM
+ {
+ Lex->one_shot_set= 1;
+ $$= OPT_SESSION;
+ Lex->option_type= OPT_SESSION;
+ }
;
opt_var_type:
@@ -11795,10 +11804,26 @@ opt_var_type:
;
opt_var_ident_type:
- /* empty */ { $$=OPT_DEFAULT; }
- | GLOBAL_SYM '.' { $$=OPT_GLOBAL; }
- | LOCAL_SYM '.' { $$=OPT_SESSION; }
- | SESSION_SYM '.' { $$=OPT_SESSION; }
+ /* empty */
+ {
+ $$=OPT_DEFAULT;
+ Lex->option_type= OPT_DEFAULT;
+ }
+ | GLOBAL_SYM '.'
+ {
+ $$=OPT_GLOBAL;
+ Lex->option_type= OPT_GLOBAL;
+ }
+ | LOCAL_SYM '.'
+ {
+ $$=OPT_SESSION;
+ Lex->option_type= OPT_SESSION;
+ }
+ | SESSION_SYM '.'
+ {
+ $$=OPT_SESSION;
+ Lex->option_type= OPT_SESSION;
+ }
;
ext_option_value:
@@ -12038,8 +12063,22 @@ internal_variable_name:
sp_pcontext *spc= lex->spcont;
sp_variable_t *spv;
- /* We have to lookup here since local vars can shadow sysvars */
- if (!spc || !(spv = spc->find_variable(&$1)))
+ /*
+ We have to lookup here since local vars can shadow sysvars.
+
+ We also have to inspect the option_type first since the variable
+ identifier might have been prefixed with @@session or @@global
+ prefixes. Without this check we would wrongly identify them
+ as SP local variables.
+ */
+ if (lex->option_type == OPT_DEFAULT && spc &&
+ (spv= spc->find_variable(&$1)))
+ {
+ /* An SP local variable */
+ $$.var= NULL;
+ $$.base_name= $1;
+ }
+ else
{
/* Not an SP local variable */
sys_var *tmp=find_sys_var(thd, $1.str, $1.length);
@@ -12056,12 +12095,6 @@ internal_variable_name:
lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT;
}
}
- else
- {
- /* An SP local variable */
- $$.var= NULL;
- $$.base_name= $1;
- }
}
| ident '.' ident
{
Attachment: [text/bzr-bundle]
| Thread |
|---|
| • bzr commit into mysql-5.1-bugteam branch (kristofer.pettersson:3185) | Kristofer Pettersson | 20 Oct |