=== added file 'mysql-test/r/parser_stack.result'
--- a/mysql-test/r/parser_stack.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/parser_stack.result	2008-07-14 21:41:30 +0000
@@ -0,0 +1,306 @@
+use test;
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+;
+1
+1
+prepare stmt from
+"
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+"
+;
+execute stmt;
+1
+1
+drop view if exists view_overflow;
+CREATE VIEW view_overflow AS
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+;
+SELECT * from view_overflow;
+1
+1
+drop view view_overflow;
+drop procedure if exists proc_overflow;
+CREATE PROCEDURE proc_overflow()
+BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+select 1;
+select 2;
+select 3;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END $$
+call proc_overflow();
+1
+1
+2
+2
+3
+3
+drop procedure proc_overflow;
+drop function if exists func_overflow;
+create function func_overflow() returns int
+BEGIN
+DECLARE x int default 0;
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+SET x=x+1;
+SET x=x+2;
+SET x=x+3;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+return x;
+END $$
+select func_overflow();
+func_overflow()
+6
+drop function func_overflow;
+drop table if exists table_overflow;
+create table table_overflow(a int, b int);
+create trigger trigger_overflow before insert on table_overflow
+for each row
+BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+SET NEW.b := NEW.a;
+SET NEW.b := NEW.b + 1;
+SET NEW.b := NEW.b + 2;
+SET NEW.b := NEW.b + 3;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+END $$
+insert into table_overflow set a=10;
+insert into table_overflow set a=20;
+select * from table_overflow;
+a	b
+10	16
+20	26
+drop table table_overflow;
+drop procedure if exists proc_35577;
+CREATE PROCEDURE proc_35577()
+BEGIN
+DECLARE z_done INT DEFAULT 0;
+DECLARE t_done VARCHAR(5000);
+outer_loop: LOOP
+IF t_done=1  THEN
+LEAVE outer_loop;
+END IF;
+inner_block:BEGIN
+DECLARE z_done INT DEFAULT  0;
+SET z_done = 0;
+inner_loop: LOOP
+IF z_done=1  THEN
+LEAVE inner_loop;
+END IF;
+IF (t_done = 'a') THEN
+IF (t_done <> 0) THEN
+IF ( t_done > 0) THEN
+IF (t_done = 'a') THEN
+SET t_done = 'a';
+ELSEIF (t_done = 'a') THEN
+SET t_done = 'a';
+ELSEIF(t_done = 'a') THEN
+SET t_done = 'a';
+ELSEIF(t_done = 'a') THEN
+SET t_done = 'a';
+ELSEIF(t_done = 'a') THEN
+SET t_done = 'a';
+ELSEIF(t_done = 'a') THEN
+SET t_done = 'a';
+ELSEIF(t_done = 'a') THEN
+SET t_done = 'a';
+ELSEIF(t_done = 'a') THEN
+SET t_done = 'a';
+END IF;
+END IF;
+END IF;
+END IF;
+END LOOP inner_loop;
+END inner_block;
+END LOOP outer_loop;
+END $$
+drop procedure proc_35577;
+drop procedure if exists p_37269;
+create procedure p_37269()
+begin
+declare done int default 0;
+declare varb int default 0;
+declare vara int default 0;
+repeat
+select now();
+until done end repeat;
+while varb do
+select now();
+begin
+select now();
+repeat
+select now();
+until done end repeat;
+if vara then 
+select now();
+repeat
+select now();
+loop
+select now();
+end loop;
+repeat
+select now();
+label1: while varb do
+select now();
+end while label1;
+if vara then 
+select now();
+repeat
+select now();
+until done end repeat;
+begin
+select now();
+while varb do
+select now();
+label1: while varb do
+select now();
+end while label1;
+if vara then 
+select now();
+while varb do
+select now();
+loop
+select now();
+end loop;
+repeat
+select now();
+loop
+select now();
+while varb do
+select now();
+end while;
+repeat
+select now();
+label1: loop
+select now();
+if vara then 
+select now();
+end if;
+end loop label1;
+until done end repeat;
+end loop;
+until done end repeat;
+end while;
+end if;
+end while;
+end;
+end if;
+until done end repeat;
+until done end repeat;
+end if;
+end;
+end while;
+end $$
+drop procedure p_37269;
+drop procedure if exists p_37228;
+create procedure p_37228 ()
+BEGIN
+DECLARE v INT DEFAULT 123;
+IF (v > 1) THEN SET v = 1; 
+ELSEIF (v < 10) THEN SET v = 10;
+ELSEIF (v < 11) THEN SET v = 11;
+ELSEIF (v < 12) THEN SET v = 12;
+ELSEIF (v < 13) THEN SET v = 13;
+ELSEIF (v < 14) THEN SET v = 14;
+ELSEIF (v < 15) THEN SET v = 15;
+ELSEIF (v < 16) THEN SET v = 16;
+ELSEIF (v < 17) THEN SET v = 17;
+ELSEIF (v < 18) THEN SET v = 18;
+ELSEIF (v < 19) THEN SET v = 19;
+ELSEIF (v < 20) THEN SET v = 20;
+ELSEIF (v < 21) THEN SET v = 21;
+ELSEIF (v < 22) THEN SET v = 22;
+ELSEIF (v < 23) THEN SET v = 23;
+ELSEIF (v < 24) THEN SET v = 24;
+ELSEIF (v < 25) THEN SET v = 25;
+ELSEIF (v < 26) THEN SET v = 26;
+ELSEIF (v < 27) THEN SET v = 27;
+ELSEIF (v < 28) THEN SET v = 28;
+ELSEIF (v < 29) THEN SET v = 29;
+ELSEIF (v < 30) THEN SET v = 30;
+ELSEIF (v < 31) THEN SET v = 31;
+ELSEIF (v < 32) THEN SET v = 32;
+ELSEIF (v < 33) THEN SET v = 33;
+ELSEIF (v < 34) THEN SET v = 34;
+ELSEIF (v < 35) THEN SET v = 35;
+ELSEIF (v < 36) THEN SET v = 36;
+ELSEIF (v < 37) THEN SET v = 37;
+ELSEIF (v < 38) THEN SET v = 38;
+ELSEIF (v < 39) THEN SET v = 39;
+END IF;
+END $$
+drop procedure p_37228;

=== added file 'mysql-test/t/parser_stack.test'
--- a/mysql-test/t/parser_stack.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/parser_stack.test	2008-07-14 21:41:30 +0000
@@ -0,0 +1,402 @@
+# Copyright (C) 2008 Sun Microsystems, Inc
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+#
+# These tests are designed to cause an internal parser stack overflow,
+# and trigger my_yyoverflow().
+#
+
+use test;
+
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+;
+
+prepare stmt from
+"
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+"
+;
+
+execute stmt;
+
+--disable_warnings
+drop view if exists view_overflow;
+--enable_warnings
+
+CREATE VIEW view_overflow AS
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+;
+
+SELECT * from view_overflow;
+
+drop view view_overflow;
+
+--disable_warnings
+drop procedure if exists proc_overflow;
+--enable_warnings
+
+delimiter $$;
+
+CREATE PROCEDURE proc_overflow()
+BEGIN
+
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+
+  select 1;
+  select 2;
+  select 3;
+
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+
+END $$
+
+delimiter ;$$
+
+call proc_overflow();
+
+drop procedure proc_overflow;
+
+--disable_warnings
+drop function if exists func_overflow;
+--enable_warnings
+
+delimiter $$;
+
+create function func_overflow() returns int
+BEGIN
+  DECLARE x int default 0;
+
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+
+  SET x=x+1;
+  SET x=x+2;
+  SET x=x+3;
+
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+
+  return x;
+END $$
+
+delimiter ;$$
+
+select func_overflow();
+
+drop function func_overflow;
+
+--disable_warnings
+drop table if exists table_overflow;
+--enable_warnings
+
+create table table_overflow(a int, b int);
+
+delimiter $$;
+
+create trigger trigger_overflow before insert on table_overflow
+for each row
+BEGIN
+
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+  BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+
+  SET NEW.b := NEW.a;
+  SET NEW.b := NEW.b + 1;
+  SET NEW.b := NEW.b + 2;
+  SET NEW.b := NEW.b + 3;
+
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;  END;
+
+END $$
+
+delimiter ;$$
+
+insert into table_overflow set a=10;
+insert into table_overflow set a=20;
+select * from table_overflow;
+
+drop table table_overflow;
+
+--disable_warnings
+drop procedure if exists proc_35577;
+--enable_warnings
+
+delimiter $$;
+
+CREATE PROCEDURE proc_35577()
+BEGIN
+  DECLARE z_done INT DEFAULT 0;
+  DECLARE t_done VARCHAR(5000);
+  outer_loop: LOOP
+    IF t_done=1  THEN
+      LEAVE outer_loop;
+    END IF;
+
+    inner_block:BEGIN
+      DECLARE z_done INT DEFAULT  0;
+      SET z_done = 0;
+      inner_loop: LOOP
+        IF z_done=1  THEN
+          LEAVE inner_loop;
+        END IF;
+        IF (t_done = 'a') THEN
+          IF (t_done <> 0) THEN
+            IF ( t_done > 0) THEN
+              IF (t_done = 'a') THEN
+                SET t_done = 'a';
+              ELSEIF (t_done = 'a') THEN
+                SET t_done = 'a';
+              ELSEIF(t_done = 'a') THEN
+                SET t_done = 'a';
+              ELSEIF(t_done = 'a') THEN
+                SET t_done = 'a';
+              ELSEIF(t_done = 'a') THEN
+                SET t_done = 'a';
+              ELSEIF(t_done = 'a') THEN
+                SET t_done = 'a';
+              ELSEIF(t_done = 'a') THEN
+                SET t_done = 'a';
+              ELSEIF(t_done = 'a') THEN
+                SET t_done = 'a';
+              END IF;
+            END IF;
+          END IF;
+        END IF;
+      END LOOP inner_loop;
+    END inner_block;
+  END LOOP outer_loop;
+END $$
+
+delimiter ;$$
+
+drop procedure proc_35577;
+
+#
+# Bug#37269 (parser crash when creating stored procedure)
+#
+
+--disable_warnings
+drop procedure if exists p_37269;
+--enable_warnings
+
+delimiter $$;
+
+create procedure p_37269()
+begin
+  declare done int default 0;
+  declare varb int default 0;
+  declare vara int default 0;
+
+  repeat
+    select now();
+  until done end repeat;
+  while varb do
+    select now();
+    begin
+      select now();
+      repeat
+        select now();
+      until done end repeat;
+      if vara then 
+        select now();
+        repeat
+          select now();
+          loop
+            select now();
+          end loop;
+          repeat
+            select now();
+            label1: while varb do
+              select now();
+            end while label1;
+            if vara then 
+              select now();
+              repeat
+                select now();
+              until done end repeat;
+              begin
+                select now();
+                while varb do
+                  select now();
+                  label1: while varb do
+                    select now();
+                  end while label1;
+                  if vara then 
+                    select now();
+                    while varb do
+                      select now();
+                      loop
+                        select now();
+                      end loop;
+                      repeat
+                        select now();
+                        loop
+                          select now();
+                          while varb do
+                            select now();
+                          end while;
+                          repeat
+                            select now();
+                            label1: loop
+                              select now();
+                              if vara then 
+                                select now();
+                              end if;
+                            end loop label1;
+                          until done end repeat;
+                        end loop;
+                      until done end repeat;
+                    end while;
+                  end if;
+                end while;
+              end;
+            end if;
+          until done end repeat;
+        until done end repeat;
+      end if;
+    end;
+  end while;
+end $$
+
+delimiter ;$$
+
+drop procedure p_37269;
+
+#
+# Bug#37228 (Sever crashes when creating stored procedure with more than
+#            10 IF/ELSEIF)
+#
+
+--disable_warnings
+drop procedure if exists p_37228;
+--enable_warnings
+
+delimiter $$;
+
+create procedure p_37228 ()
+BEGIN
+  DECLARE v INT DEFAULT 123;
+
+  IF (v > 1) THEN SET v = 1; 
+  ELSEIF (v < 10) THEN SET v = 10;
+  ELSEIF (v < 11) THEN SET v = 11;
+  ELSEIF (v < 12) THEN SET v = 12;
+  ELSEIF (v < 13) THEN SET v = 13;
+  ELSEIF (v < 14) THEN SET v = 14;
+  ELSEIF (v < 15) THEN SET v = 15;
+  ELSEIF (v < 16) THEN SET v = 16;
+  ELSEIF (v < 17) THEN SET v = 17;
+  ELSEIF (v < 18) THEN SET v = 18;
+  ELSEIF (v < 19) THEN SET v = 19;
+  ELSEIF (v < 20) THEN SET v = 20;
+  ELSEIF (v < 21) THEN SET v = 21;
+  ELSEIF (v < 22) THEN SET v = 22;
+  ELSEIF (v < 23) THEN SET v = 23;
+  ELSEIF (v < 24) THEN SET v = 24;
+  ELSEIF (v < 25) THEN SET v = 25;
+  ELSEIF (v < 26) THEN SET v = 26;
+  ELSEIF (v < 27) THEN SET v = 27;
+  ELSEIF (v < 28) THEN SET v = 28;
+  ELSEIF (v < 29) THEN SET v = 29;
+  ELSEIF (v < 30) THEN SET v = 30;
+  ELSEIF (v < 31) THEN SET v = 31;
+  ELSEIF (v < 32) THEN SET v = 32;
+  ELSEIF (v < 33) THEN SET v = 33;
+  ELSEIF (v < 34) THEN SET v = 34;
+  ELSEIF (v < 35) THEN SET v = 35;
+  ELSEIF (v < 36) THEN SET v = 36;
+  ELSEIF (v < 37) THEN SET v = 37;
+  ELSEIF (v < 38) THEN SET v = 38;
+  ELSEIF (v < 39) THEN SET v = 39;
+  END IF;
+END $$
+
+delimiter ;$$
+
+drop procedure p_37228;
+
+

=== modified file 'sql/sp.cc'
--- a/sql/sp.cc	2008-05-15 23:13:24 +0000
+++ b/sql/sp.cc	2008-07-14 21:41:30 +0000
@@ -443,11 +443,12 @@
     goto end;
 
   {
-    Lex_input_stream lip(thd, defstr.c_ptr(), defstr.length());
-    thd->m_lip= &lip;
+    Parser_state parser_state(thd, defstr.c_ptr(), defstr.length());
+    thd->m_parser_state= &parser_state;
     lex_start(thd);
     thd->spcont= NULL;
     ret= MYSQLparse(thd);
+    thd->m_parser_state= NULL;
 
     if (ret == 0)
     {

=== modified file 'sql/sp_head.cc'
--- a/sql/sp_head.cc	2008-05-15 23:13:24 +0000
+++ b/sql/sp_head.cc	2008-07-14 21:41:30 +0000
@@ -591,7 +591,7 @@
   const char *endp;                  /* Used to trim the end */
   /* During parsing, we must use thd->mem_root */
   MEM_ROOT *root= thd->mem_root;
-  Lex_input_stream *lip=thd->m_lip;
+  Lex_input_stream *lip= & thd->m_parser_state->m_lip;
 
   if (m_param_begin && m_param_end)
   {

=== modified file 'sql/sql_class.cc'
--- a/sql/sql_class.cc	2008-03-14 02:03:01 +0000
+++ b/sql/sql_class.cc	2008-07-14 21:41:30 +0000
@@ -177,7 +177,8 @@
    rand_used(0), time_zone_used(0),
    last_insert_id_used(0), last_insert_id_used_bin_log(0), insert_id_used(0),
    clear_next_insert_id(0), in_lock_tables(0), bootstrap(0),
-   derived_tables_processing(FALSE), spcont(NULL), m_lip(NULL)
+   derived_tables_processing(FALSE), spcont(NULL),
+   m_parser_state(NULL)
 {
   ulong tmp;
 

=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h	2008-02-28 14:34:08 +0000
+++ b/sql/sql_class.h	2008-07-14 21:41:30 +0000
@@ -28,7 +28,7 @@
 class Format_description_log_event;
 class sp_rcontext;
 class sp_cache;
-class Lex_input_stream;
+class Parser_state;
 
 enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
 enum enum_ha_read_modes { RFIRST, RNEXT, RPREV, RLAST, RKEY, RNEXT_SAME };
@@ -1575,13 +1575,11 @@
   } binlog_evt_union;
 
   /**
-    Character input stream consumed by the lexical analyser,
-    used during parsing.
-    Note that since the parser is not re-entrant, we keep only one input
-    stream here. This member is valid only when executing code during parsing,
-    and may point to invalid memory after that.
+    Internal parser state.
+    Note that since the parser is not re-entrant, we keep only one parser
+    state here. This member is valid only when executing code during parsing.
   */
-  Lex_input_stream *m_lip;
+  Parser_state *m_parser_state;
 
   THD();
   ~THD();

=== modified file 'sql/sql_lex.cc'
--- a/sql/sql_lex.cc	2008-07-07 16:00:08 +0000
+++ b/sql/sql_lex.cc	2008-07-14 21:41:30 +0000
@@ -192,7 +192,6 @@
   lex->select_lex.order_list.empty();
   lex->select_lex.udf_list.empty();
   lex->current_select= &lex->select_lex;
-  lex->yacc_yyss=lex->yacc_yyvs=0;
   lex->sql_command= lex->orig_sql_command= SQLCOM_END;
   lex->duplicates= DUP_ERROR;
   lex->ignore= 0;
@@ -210,11 +209,16 @@
 
 void lex_end(LEX *lex)
 {
-  DBUG_ENTER("lex_end");
-  DBUG_PRINT("enter", ("lex: 0x%lx", (long) lex));
-  x_free(lex->yacc_yyss);
-  x_free(lex->yacc_yyvs);
-  DBUG_VOID_RETURN;
+  /* Empty in 5.0, non empty in 5.1 */
+}
+
+Yacc_state::~Yacc_state()
+{
+  if (yacc_yyss)
+  {
+    x_free(yacc_yyss);
+    x_free(yacc_yyvs);
+  }
 }
 
 
@@ -531,7 +535,7 @@
   uint length;
   enum my_lex_states state;
   THD *thd= (THD *)yythd;
-  Lex_input_stream *lip= thd->m_lip;
+  Lex_input_stream *lip= & thd->m_parser_state->m_lip;
   LEX *lex= thd->lex;
   YYSTYPE *yylval=(YYSTYPE*) arg;
   CHARSET_INFO *cs= thd->charset();
@@ -1781,7 +1785,7 @@
 */
 
 st_lex::st_lex()
-  :result(0), yacc_yyss(0), yacc_yyvs(0),
+  :result(0),
    sql_command(SQLCOM_END)
 {
   reset_query_tables_list(TRUE);

=== modified file 'sql/sql_lex.h'
--- a/sql/sql_lex.h	2008-03-27 16:49:32 +0000
+++ b/sql/sql_lex.h	2008-07-14 21:41:30 +0000
@@ -1004,7 +1004,6 @@
   LEX_STRING comment, ident;
   LEX_USER *grant_user;
   XID *xid;
-  gptr yacc_yyss,yacc_yyvs;
   THD *thd;
   CHARSET_INFO *charset, *underscore_charset;
   bool text_string_is_7bit;
@@ -1290,6 +1289,59 @@
   }
 } LEX;
 
+
+/**
+  The internal state of the syntax parser.
+  This object is only available during parsing,
+  and is private to the syntax parser implementation (sql_yacc.yy).
+*/
+class Yacc_state
+{
+public:
+  Yacc_state()
+    : yacc_yyss(NULL), yacc_yyvs(NULL)
+  {}
+
+  ~Yacc_state();
+
+  /**
+    Bison internal state stack, yyss, when dynamically allocated using
+    my_yyoverflow().
+  */
+  gptr yacc_yyss;
+
+  /**
+    Bison internal semantic value stack, yyvs, when dynamically allocated using
+    my_yyoverflow().
+  */
+  gptr yacc_yyvs;
+
+  /*
+    TODO: move more attributes from the LEX structure here.
+  */
+};
+
+/**
+  Internal state of the parser.
+  The complete state consist of:
+  - state data used during lexical parsing,
+  - state data used during syntactic parsing.
+*/
+class Parser_state
+{
+public:
+  Parser_state(THD *thd, const char* buff, unsigned int length)
+    : m_lip(thd, buff, length), m_yacc()
+  {}
+
+  ~Parser_state()
+  {}
+
+  Lex_input_stream m_lip;
+  Yacc_state m_yacc;
+};
+
+
 struct st_lex_local: public st_lex
 {
   static void *operator new(size_t size) throw()

=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc	2008-07-07 16:00:08 +0000
+++ b/sql/sql_parse.cc	2008-07-14 21:41:30 +0000
@@ -5875,29 +5875,35 @@
 
 bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize)
 {
-  LEX	*lex= current_thd->lex;
+  Yacc_state *state= & current_thd->m_parser_state->m_yacc;
   ulong old_info=0;
+  DBUG_ASSERT(state);
   if ((uint) *yystacksize >= MY_YACC_MAX)
     return 1;
-  if (!lex->yacc_yyvs)
+  if (!state->yacc_yyvs)
     old_info= *yystacksize;
   *yystacksize= set_zone((*yystacksize)*2,MY_YACC_INIT,MY_YACC_MAX);
-  if (!(lex->yacc_yyvs= (char*)
-	my_realloc((gptr) lex->yacc_yyvs,
+  if (!(state->yacc_yyvs= (char*)
+        my_realloc(state->yacc_yyvs,
 		   *yystacksize*sizeof(**yyvs),
 		   MYF(MY_ALLOW_ZERO_PTR | MY_FREE_ON_ERROR))) ||
-      !(lex->yacc_yyss= (char*)
-	my_realloc((gptr) lex->yacc_yyss,
+      !(state->yacc_yyss= (char*)
+        my_realloc(state->yacc_yyss,
 		   *yystacksize*sizeof(**yyss),
 		   MYF(MY_ALLOW_ZERO_PTR | MY_FREE_ON_ERROR))))
     return 1;
   if (old_info)
-  {						// Copy old info from stack
-    memcpy(lex->yacc_yyss, (gptr) *yyss, old_info*sizeof(**yyss));
-    memcpy(lex->yacc_yyvs, (gptr) *yyvs, old_info*sizeof(**yyvs));
+  {
+    /*
+      Only copy the old stack on the first call to my_yyoverflow(),
+      when replacing a static stack (YYINITDEPTH) by a dynamic stack.
+      For subsequent calls, my_realloc already did preserve the old stack.
+    */
+    memcpy(state->yacc_yyss, *yyss, old_info*sizeof(**yyss));
+    memcpy(state->yacc_yyvs, *yyvs, old_info*sizeof(**yyvs));
   }
-  *yyss=(short*) lex->yacc_yyss;
-  *yyvs=(YYSTYPE*) lex->yacc_yyvs;
+  *yyss= (short*) state->yacc_yyss;
+  *yyvs= (YYSTYPE*) state->yacc_yyvs;
   return 0;
 }
 
@@ -6136,11 +6142,12 @@
     sp_cache_flush_obsolete(&thd->sp_proc_cache);
     sp_cache_flush_obsolete(&thd->sp_func_cache);
 
-    Lex_input_stream lip(thd, inBuf, length);
-    thd->m_lip= &lip;
+    Parser_state parser_state(thd, inBuf, length);
+    thd->m_parser_state= &parser_state;
 
     int err= MYSQLparse(thd);
-    *found_semicolon= lip.found_semicolon;
+    *found_semicolon= parser_state.m_lip.found_semicolon;
+    thd->m_parser_state= NULL;
 
     if (!err && ! thd->is_fatal_error)
     {
@@ -6165,8 +6172,9 @@
             PROCESSLIST.
             Note that we don't need LOCK_thread_count to modify query_length.
           */
-          if (lip.found_semicolon &&
-              (thd->query_length= (ulong)(lip.found_semicolon - thd->query)))
+          if (parser_state.m_lip.found_semicolon &&
+              (thd->query_length= (ulong)(parser_state.m_lip.found_semicolon
+                                          - thd->query)))
             thd->query_length--;
           /* Actually execute the query */
           if (*found_semicolon)
@@ -6225,11 +6233,13 @@
   bool error= 0;
   DBUG_ENTER("mysql_test_parse_for_slave");
 
-  Lex_input_stream lip(thd, inBuf, length);
-  thd->m_lip= &lip;
+  Parser_state parser_state(thd, inBuf, length);
+  thd->m_parser_state= &parser_state;
+
   lex_start(thd);
   mysql_reset_thd_for_next_command(thd);
   int err= MYSQLparse((void*) thd);
+  thd->m_parser_state= NULL;
 
   if (!err && ! thd->is_fatal_error &&
       all_tables_not_ok(thd,(TABLE_LIST*) lex->select_lex.table_list.first))
@@ -7295,7 +7305,7 @@
   if (lex->current_select != &lex->select_lex)
   {
     char command[80];
-    Lex_input_stream *lip= thd->m_lip;
+    Lex_input_stream *lip= & thd->m_parser_state->m_lip;
     strmake(command, lip->yylval->symbol.str,
 	    min(lip->yylval->symbol.length, sizeof(command)-1));
     my_error(ER_CANT_USE_OPTION_HERE, MYF(0), command);

=== modified file 'sql/sql_prepare.cc'
--- a/sql/sql_prepare.cc	2008-03-27 11:52:55 +0000
+++ b/sql/sql_prepare.cc	2008-07-14 21:41:30 +0000
@@ -2849,12 +2849,13 @@
   old_stmt_arena= thd->stmt_arena;
   thd->stmt_arena= this;
 
-  Lex_input_stream lip(thd, thd->query, thd->query_length);
-  lip.stmt_prepare_mode= TRUE;
-  thd->m_lip= &lip;
+  Parser_state parser_state(thd, thd->query, thd->query_length);
+  parser_state.m_lip.stmt_prepare_mode= TRUE;
+  thd->m_parser_state= &parser_state;
   lex_start(thd);
   lex->safe_to_cache_query= FALSE;
   int err= MYSQLparse((void *)thd);
+  thd->m_parser_state= NULL;
   lex->set_trg_event_type_for_tables();
 
   error= err || thd->is_fatal_error ||

=== modified file 'sql/sql_trigger.cc'
--- a/sql/sql_trigger.cc	2007-09-04 22:40:27 +0000
+++ b/sql/sql_trigger.cc	2008-07-14 21:41:30 +0000
@@ -968,11 +968,13 @@
 
         thd->variables.sql_mode= (ulong)*trg_sql_mode;
 
-        Lex_input_stream lip(thd, trg_create_str->str, trg_create_str->length);
-        thd->m_lip= &lip;
+        Parser_state parser_state(thd, trg_create_str->str,
+                                  trg_create_str->length);
+        thd->m_parser_state= &parser_state;
         lex_start(thd);
         thd->spcont= NULL;
         int err= MYSQLparse((void *)thd);
+        thd->m_parser_state= NULL;
 
         if (err || thd->is_fatal_error)
         {

=== modified file 'sql/sql_view.cc'
--- a/sql/sql_view.cc	2008-05-08 07:41:22 +0000
+++ b/sql/sql_view.cc	2008-07-14 21:41:30 +0000
@@ -1081,8 +1081,7 @@
     char old_db_buf[NAME_LEN+1];
     LEX_STRING old_db= { old_db_buf, sizeof(old_db_buf) };
     bool dbchanged;
-    Lex_input_stream lip(thd, table->query.str, table->query.length);
-    thd->m_lip= &lip;
+    Parser_state parser_state(thd, table->query.str, table->query.length);
 
     /* 
       Use view db name as thread default database, in order to ensure
@@ -1091,6 +1090,7 @@
     if ((result= sp_use_new_db(thd, table->view_db, &old_db, 1, &dbchanged)))
       goto end;
 
+    thd->m_parser_state= &parser_state;
     lex_start(thd);
     view_select= &lex->select_lex;
     view_select->select_number= ++thd->select_number;
@@ -1125,6 +1125,7 @@
     CHARSET_INFO *save_cs= thd->variables.character_set_client;
     thd->variables.character_set_client= system_charset_info;
     res= MYSQLparse((void *)thd);
+    thd->m_parser_state= NULL;
 
     if ((old_lex->sql_command == SQLCOM_SHOW_FIELDS) ||
         (old_lex->sql_command == SQLCOM_SHOW_CREATE))

=== modified file 'sql/sql_yacc.yy'
--- a/sql/sql_yacc.yy	2008-07-07 16:00:08 +0000
+++ b/sql/sql_yacc.yy	2008-07-14 21:41:30 +0000
@@ -23,6 +23,7 @@
 #define YYPARSE_PARAM yythd
 #define YYLEX_PARAM yythd
 #define YYTHD ((THD *)yythd)
+#define YYLIP (& YYTHD->m_parser_state->m_lip)
 
 #define MYSQL_YACC
 #define YYINITDEPTH 100
@@ -86,7 +87,7 @@
 void my_parse_error(const char *s)
 {
   THD *thd= current_thd;
-  Lex_input_stream *lip= thd->m_lip;
+  Lex_input_stream *lip= & thd->m_parser_state->m_lip;
 
   const char *yytext= lip->tok_start;
   /* Push an error into the error stack */
@@ -1213,11 +1214,11 @@
               MYSQL_YYABORT;
             }
             thd->lex->sql_command= SQLCOM_EMPTY_QUERY;
-            thd->m_lip->found_semicolon= NULL;
+            YYLIP->found_semicolon= NULL;
           }
         | verb_clause
           {
-            Lex_input_stream *lip = YYTHD->m_lip;
+            Lex_input_stream *lip = YYLIP;
 
             if ((YYTHD->client_capabilities & CLIENT_MULTI_QUERIES) &&
                 ! lip->stmt_prepare_mode &&
@@ -1243,7 +1244,7 @@
         | verb_clause END_OF_INPUT
           {
             /* Single query, not terminated. */
-            YYTHD->m_lip->found_semicolon= NULL;
+            YYLIP->found_semicolon= NULL;
           }
         ;
 
@@ -2155,7 +2156,7 @@
 	  {
             THD *thd= YYTHD;
 	    LEX *lex= thd->lex;
-            Lex_input_stream *lip= thd->m_lip;
+            Lex_input_stream *lip= YYLIP;
 
 	    if (lex->sphead->reset_lex(thd))
               MYSQL_YYABORT;
@@ -2165,7 +2166,7 @@
 	  {
             THD *thd= YYTHD;
 	    LEX *lex= thd->lex;
-            Lex_input_stream *lip= thd->m_lip;
+            Lex_input_stream *lip= YYLIP;
 	    sp_head *sp= lex->sphead;
 
             sp->m_flags|= sp_get_flags_for_command(lex);
@@ -4503,16 +4504,12 @@
 
 remember_name:
 	{
-          THD *thd= YYTHD;
-          Lex_input_stream *lip= thd->m_lip;
-          $$= (char*) lip->tok_start;
+          $$= (char*) YYLIP->tok_start;
         };
 
 remember_end:
 	{
-          THD *thd= YYTHD;
-          Lex_input_stream *lip= thd->m_lip;
-          $$=(char*) lip->tok_end;
+          $$=(char*) YYLIP->tok_end;
         };
 
 select_item2:
@@ -6452,7 +6449,7 @@
 	  remember_name expr
 	  {
             THD *thd= YYTHD;
-            Lex_input_stream *lip= thd->m_lip;
+            Lex_input_stream *lip= YYLIP;
 
 	    if (add_proc_to_list(thd, $2))
 	      MYSQL_YYABORT;
@@ -7524,7 +7521,7 @@
         {
           THD *thd= YYTHD;
           LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
 
 	  if (lex->sphead)
 	  {
@@ -7566,10 +7563,7 @@
         }
         opt_duplicate INTO
         {
-          THD *thd= YYTHD;
-	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
-	  lex->fname_end= lip->ptr;
+	  Lex->fname_end= YYLIP->ptr;
 	}
         TABLE_SYM table_ident
         {
@@ -7787,7 +7781,7 @@
         {
           THD *thd= YYTHD;
 	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
           Item_param *item;
           if (! lex->parsing_options.allows_variable)
           {
@@ -7820,7 +7814,7 @@
 	| NULL_SYM
           {
             $$ = new Item_null();
-            YYTHD->m_lip->next_state=MY_LEX_OPERATOR_OR_IDENT;
+            YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT;
           }
 	| FALSE_SYM	{ $$= new Item_int((char*) "FALSE",0,1); }
 	| TRUE_SYM	{ $$= new Item_int((char*) "TRUE",1,1); }
@@ -7924,7 +7918,7 @@
 	{
           THD *thd= YYTHD;
 	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
 	  sp_variable_t *spv;
           sp_pcontext *spc = lex->spcont;
 	  if (spc && (spv = spc->find_variable(&$1)))
@@ -8537,7 +8531,7 @@
         {
           THD *thd= YYTHD;
 	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
 
           if (lex->sphead)
           {
@@ -8568,7 +8562,7 @@
         {
           THD *thd= YYTHD;
 	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
 
           if (lex->sphead)
           {
@@ -9878,7 +9872,7 @@
 	{
           THD *thd= YYTHD;
 	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
 	  sp_head *sp;
 	 
 	  if (lex->sphead)
@@ -9971,7 +9965,7 @@
           { /* $5 */
             THD *thd= YYTHD;
 	    LEX *lex= thd->lex;
-            Lex_input_stream *lip= thd->m_lip;
+            Lex_input_stream *lip= YYLIP;
 	    sp_head *sp;
 
 	    lex->stmt_definition_begin= $1;
@@ -9996,11 +9990,7 @@
           sp_fdparam_list /* $6 */
           ')' /* $7 */
           { /* $8 */
-            THD *thd= YYTHD;
-	    LEX *lex= thd->lex;
-            Lex_input_stream *lip= thd->m_lip;
-
-	    lex->sphead->m_param_end= lip->tok_start;
+	    Lex->sphead->m_param_end= YYLIP->tok_start;
 	  }
           RETURNS_SYM /* $9 */
 	  { /* $10 */
@@ -10026,7 +10016,7 @@
           { /* $14 */
             THD *thd= YYTHD;
 	    LEX *lex= thd->lex;
-            Lex_input_stream *lip= thd->m_lip;
+            Lex_input_stream *lip= YYLIP;
 
 	    lex->sphead->m_chistics= &lex->sp_chistics;
 	    lex->sphead->m_body_begin= lip->tok_start;
@@ -10078,18 +10068,14 @@
 	}
         '('
 	{
-          THD *thd= YYTHD;
-	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
-
-	  lex->sphead->m_param_begin= lip->tok_start+1;
+	  Lex->sphead->m_param_begin= YYLIP->tok_start+1;
 	}
 	sp_pdparam_list
 	')'
 	{
           THD *thd= YYTHD;
 	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
 
 	  lex->sphead->m_param_end= lip->tok_start;
 	  bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics));
@@ -10098,7 +10084,7 @@
 	{
           THD *thd= YYTHD;
 	  LEX *lex= thd->lex;
-          Lex_input_stream *lip= thd->m_lip;
+          Lex_input_stream *lip= YYLIP;
 
 	  lex->sphead->m_chistics= &lex->sp_chistics;
 	  lex->sphead->m_body_begin= lip->tok_start;



