List:Commits« Previous MessageNext Message »
From:Kristofer Pettersson Date:October 20 2009 6:21am
Subject:bzr commit into mysql-5.1-bugteam branch (kristofer.pettersson:3185)
View as plain text  
#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 Pettersson20 Oct