List:Commits« Previous MessageNext Message »
From:Jonathan Perkin Date:July 17 2008 3:35pm
Subject:bzr commit into mysql-5.0 branch (jperkin:2581)
View as plain text  
#At file:///data0/mysqldev/bzr/mysql-5.0-community/

 2581 Jonathan Perkin	2008-07-17 [merge]
      Merge from mysql-5.0.66-release
added:
  mysql-test/r/parser.result
  mysql-test/t/parser.test
modified:
  mysql-test/include/have_archive.inc
  mysql-test/include/have_bdb.inc
  mysql-test/include/have_big5.inc
  mysql-test/include/have_blackhole.inc
  mysql-test/include/have_case_sensitive_file_system.inc
  mysql-test/include/have_compress.inc
  mysql-test/include/have_cp1250_ch.inc
  mysql-test/include/have_cp932.inc
  mysql-test/include/have_crypt.inc
  mysql-test/include/have_csv.inc
  mysql-test/include/have_eucjpms.inc
  mysql-test/include/have_euckr.inc
  mysql-test/include/have_exampledb.inc
  mysql-test/include/have_federated_db.inc
  mysql-test/include/have_gb2312.inc
  mysql-test/include/have_gbk.inc
  mysql-test/include/have_geometry.inc
  mysql-test/include/have_innodb.inc
  mysql-test/include/have_latin2_ch.inc
  mysql-test/include/have_log_bin.inc
  mysql-test/include/have_lowercase0.inc
  mysql-test/include/have_multi_ndb.inc
  mysql-test/include/have_ndb.inc
  mysql-test/include/have_query_cache.inc
  mysql-test/include/have_sjis.inc
  mysql-test/include/have_ssl.inc
  mysql-test/include/have_tis620.inc
  mysql-test/include/have_ucs2.inc
  mysql-test/include/have_udf.inc
  mysql-test/include/have_ujis.inc
  mysql-test/r/comments.result
  mysql-test/r/ps.result
  mysql-test/r/varbinary.result
  mysql-test/suite/funcs_1/t/is_columns_myisam_embedded.test
  mysql-test/t/varbinary.test
  mysys/default.c
  sql/item.cc
  sql/log_event.cc
  sql/sp_head.h
  sql/sql_lex.cc
  sql/sql_parse.cc
  sql/sql_yacc.yy

=== modified file 'mysql-test/include/have_archive.inc'
--- a/mysql-test/include/have_archive.inc	2005-10-27 19:45:18 +0000
+++ b/mysql-test/include/have_archive.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 --require r/have_archive.require
 --disable_query_log
-show variables like "have_archive";
+show variables like 'have_archive';
 --enable_query_log

=== modified file 'mysql-test/include/have_bdb.inc'
--- a/mysql-test/include/have_bdb.inc	2001-10-04 21:42:25 +0000
+++ b/mysql-test/include/have_bdb.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_bdb.require
 disable_query_log;
-show variables like "have_bdb";
+show variables like 'have_bdb';
 enable_query_log;

=== modified file 'mysql-test/include/have_big5.inc'
--- a/mysql-test/include/have_big5.inc	2003-12-24 12:59:48 +0000
+++ b/mysql-test/include/have_big5.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_big5.require
 disable_query_log;
-show collation like "big5_chinese_ci";
+show collation like 'big5_chinese_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_blackhole.inc'
--- a/mysql-test/include/have_blackhole.inc	2005-03-23 00:10:39 +0000
+++ b/mysql-test/include/have_blackhole.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_blackhole.require
 disable_query_log;
-show variables like "have_blackhole_engine";
+show variables like 'have_blackhole_engine';
 enable_query_log;

=== modified file 'mysql-test/include/have_case_sensitive_file_system.inc'
--- a/mysql-test/include/have_case_sensitive_file_system.inc	2006-05-04 06:55:09 +0000
+++ b/mysql-test/include/have_case_sensitive_file_system.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 --require r/case_sensitive_file_system.require
 --disable_query_log
-show variables like "lower_case_file_system";
+show variables like 'lower_case_file_system';
 --enable_query_log

=== modified file 'mysql-test/include/have_compress.inc'
--- a/mysql-test/include/have_compress.inc	2003-04-10 00:50:30 +0000
+++ b/mysql-test/include/have_compress.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_compress.require
 disable_query_log;
-show variables like "have_compress";
+show variables like 'have_compress';
 enable_query_log;

=== modified file 'mysql-test/include/have_cp1250_ch.inc'
--- a/mysql-test/include/have_cp1250_ch.inc	2005-03-03 10:15:37 +0000
+++ b/mysql-test/include/have_cp1250_ch.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_cp1250_ch.require
 disable_query_log;
-show collation like "cp1250_czech_cs";
+show collation like 'cp1250_czech_cs';
 enable_query_log;

=== modified file 'mysql-test/include/have_cp932.inc'
--- a/mysql-test/include/have_cp932.inc	2005-02-01 10:37:51 +0000
+++ b/mysql-test/include/have_cp932.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_cp932.require
 disable_query_log;
-show collation like "cp932_japanese_ci";
+show collation like 'cp932_japanese_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_crypt.inc'
--- a/mysql-test/include/have_crypt.inc	2003-01-28 06:38:28 +0000
+++ b/mysql-test/include/have_crypt.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_crypt.require
 disable_query_log;
-show variables like "have_crypt";
+show variables like 'have_crypt';
 enable_query_log;

=== modified file 'mysql-test/include/have_csv.inc'
--- a/mysql-test/include/have_csv.inc	2004-08-13 03:57:18 +0000
+++ b/mysql-test/include/have_csv.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_csv.require
 disable_query_log;
-show variables like "have_csv";
+show variables like 'have_csv';
 enable_query_log;

=== modified file 'mysql-test/include/have_eucjpms.inc'
--- a/mysql-test/include/have_eucjpms.inc	2005-02-01 10:37:51 +0000
+++ b/mysql-test/include/have_eucjpms.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_eucjpms.require
 disable_query_log;
-show collation like "eucjpms_japanese_ci";
+show collation like 'eucjpms_japanese_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_euckr.inc'
--- a/mysql-test/include/have_euckr.inc	2005-12-09 12:37:58 +0000
+++ b/mysql-test/include/have_euckr.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_euckr.require
 disable_query_log;
-show collation like "euckr_korean_ci";
+show collation like 'euckr_korean_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_exampledb.inc'
--- a/mysql-test/include/have_exampledb.inc	2004-08-14 00:14:36 +0000
+++ b/mysql-test/include/have_exampledb.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_exampledb.require
 disable_query_log;
-show variables like "have_example_engine";
+show variables like 'have_example_engine';
 enable_query_log;

=== modified file 'mysql-test/include/have_federated_db.inc'
--- a/mysql-test/include/have_federated_db.inc	2005-01-21 02:36:40 +0000
+++ b/mysql-test/include/have_federated_db.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_federated_db.require
 disable_query_log;
-show variables like "have_federated_engine";
+show variables like 'have_federated_engine';
 enable_query_log;

=== modified file 'mysql-test/include/have_gb2312.inc'
--- a/mysql-test/include/have_gb2312.inc	2005-12-09 12:37:58 +0000
+++ b/mysql-test/include/have_gb2312.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_gb2312.require
 disable_query_log;
-show collation like "gb2312_chinese_ci";
+show collation like 'gb2312_chinese_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_gbk.inc'
--- a/mysql-test/include/have_gbk.inc	2005-07-22 16:06:02 +0000
+++ b/mysql-test/include/have_gbk.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_gbk.require
 disable_query_log;
-show collation like "gbk_chinese_ci";
+show collation like 'gbk_chinese_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_geometry.inc'
--- a/mysql-test/include/have_geometry.inc	2005-10-27 19:45:18 +0000
+++ b/mysql-test/include/have_geometry.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 --require r/have_geometry.require
 --disable_query_log
-show variables like "have_geometry";
+show variables like 'have_geometry';
 --enable_query_log

=== modified file 'mysql-test/include/have_innodb.inc'
--- a/mysql-test/include/have_innodb.inc	2001-10-04 21:42:25 +0000
+++ b/mysql-test/include/have_innodb.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_innodb.require
 disable_query_log;
-show variables like "have_innodb";
+show variables like 'have_innodb';
 enable_query_log;

=== modified file 'mysql-test/include/have_latin2_ch.inc'
--- a/mysql-test/include/have_latin2_ch.inc	2006-03-20 12:28:25 +0000
+++ b/mysql-test/include/have_latin2_ch.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_latin2_ch.require
 disable_query_log;
-show collation like "latin2_czech_cs";
+show collation like 'latin2_czech_cs';
 enable_query_log;

=== modified file 'mysql-test/include/have_log_bin.inc'
--- a/mysql-test/include/have_log_bin.inc	2007-05-14 12:38:50 +0000
+++ b/mysql-test/include/have_log_bin.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_log_bin.require
 disable_query_log;
-show variables like "log_bin";
+show variables like 'log_bin';
 enable_query_log;

=== modified file 'mysql-test/include/have_lowercase0.inc'
--- a/mysql-test/include/have_lowercase0.inc	2006-10-19 09:35:10 +0000
+++ b/mysql-test/include/have_lowercase0.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 --require r/lowercase0.require
 --disable_query_log
-show variables like "lower_case_%";
+show variables like 'lower_case_%';
 --enable_query_log

=== modified file 'mysql-test/include/have_multi_ndb.inc'
--- a/mysql-test/include/have_multi_ndb.inc	2006-10-03 14:14:23 +0000
+++ b/mysql-test/include/have_multi_ndb.inc	2008-07-04 16:41:27 +0000
@@ -10,7 +10,7 @@ drop table if exists t1, t2;
 --enable_warnings
 flush tables;
 --require r/have_ndb.require
-show variables like "have_ndbcluster";
+show variables like 'have_ndbcluster';
 enable_query_log;
 
 # Check that server2 has NDB support
@@ -21,7 +21,7 @@ drop table if exists t1, t2;
 --enable_warnings
 flush tables;
 --require r/have_ndb.require
-show variables like "have_ndbcluster";
+show variables like 'have_ndbcluster';
 enable_query_log;
 
 # Set the default connection to 'server1'

=== modified file 'mysql-test/include/have_ndb.inc'
--- a/mysql-test/include/have_ndb.inc	2006-10-05 10:42:39 +0000
+++ b/mysql-test/include/have_ndb.inc	2008-07-04 16:41:27 +0000
@@ -1,7 +1,7 @@
 # Check that server is compiled and started with support for NDB
 -- require r/have_ndb.require
 disable_query_log;
-show variables like "have_ndbcluster";
+show variables like 'have_ndbcluster';
 enable_query_log;
 
 # Check that NDB is installed and known to be working

=== modified file 'mysql-test/include/have_query_cache.inc'
--- a/mysql-test/include/have_query_cache.inc	2004-10-26 16:30:01 +0000
+++ b/mysql-test/include/have_query_cache.inc	2008-07-04 16:41:27 +0000
@@ -3,5 +3,5 @@
 # of query cache hits
 -- disable_ps_protocol
 disable_query_log;
-show variables like "have_query_cache";
+show variables like 'have_query_cache';
 enable_query_log;

=== modified file 'mysql-test/include/have_sjis.inc'
--- a/mysql-test/include/have_sjis.inc	2004-03-25 10:29:56 +0000
+++ b/mysql-test/include/have_sjis.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_sjis.require
 disable_query_log;
-show collation like "sjis_japanese_ci";
+show collation like 'sjis_japanese_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_ssl.inc'
--- a/mysql-test/include/have_ssl.inc	2007-03-05 09:03:42 +0000
+++ b/mysql-test/include/have_ssl.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_ssl.require
 disable_query_log;
-show variables like "have_ssl";
+show variables like 'have_ssl';
 enable_query_log;

=== modified file 'mysql-test/include/have_tis620.inc'
--- a/mysql-test/include/have_tis620.inc	2003-12-25 16:11:01 +0000
+++ b/mysql-test/include/have_tis620.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_tis620.require
 disable_query_log;
-show collation like "tis620_thai_ci";
+show collation like 'tis620_thai_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_ucs2.inc'
--- a/mysql-test/include/have_ucs2.inc	2003-05-23 10:10:05 +0000
+++ b/mysql-test/include/have_ucs2.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_ucs2.require
 disable_query_log;
-show collation like "ucs2_general_ci";
+show collation like 'ucs2_general_ci';
 enable_query_log;

=== modified file 'mysql-test/include/have_udf.inc'
--- a/mysql-test/include/have_udf.inc	2006-04-27 14:32:40 +0000
+++ b/mysql-test/include/have_udf.inc	2008-07-04 16:41:27 +0000
@@ -4,7 +4,7 @@
 #
 --require r/have_udf.require
 disable_query_log;
-show variables like "have_dynamic_loading";
+show variables like 'have_dynamic_loading';
 enable_query_log;
 
 #

=== modified file 'mysql-test/include/have_ujis.inc'
--- a/mysql-test/include/have_ujis.inc	2003-05-23 10:10:05 +0000
+++ b/mysql-test/include/have_ujis.inc	2008-07-04 16:41:27 +0000
@@ -1,4 +1,4 @@
 -- require r/have_ujis.require
 disable_query_log;
-show collation like "ujis_japanese_ci";
+show collation like 'ujis_japanese_ci';
 enable_query_log;

=== modified file 'mysql-test/r/comments.result'
--- a/mysql-test/r/comments.result	2007-08-29 20:50:32 +0000
+++ b/mysql-test/r/comments.result	2008-07-07 16:00:08 +0000
@@ -35,7 +35,7 @@ ERROR 42000: You have an error in your S
 prepare bar from "DELETE FROM table_28779 WHERE a = 7 OR 1=1/*! AND 2=2;";
 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
 prepare bar from "DELETE FROM table_28779 WHERE a = 7 OR 1=1/*! AND 2=2;*";
-ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';*' at line 1
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*' at line 1
 prepare bar from "DELETE FROM table_28779 WHERE a = 7 OR 1=1/*!98765' AND b = 'bar';";
 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*!98765' AND b = 'bar'' at line 1
 prepare bar from "DELETE FROM table_28779 WHERE a = 7 OR 1=1/*!98765' AND b = 'bar';*";

=== added file 'mysql-test/r/parser.result'
--- a/mysql-test/r/parser.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/parser.result	2008-07-07 16:00:08 +0000
@@ -0,0 +1,68 @@
+DROP PROCEDURE IF EXISTS p26030;
+select "non terminated"$$
+non terminated
+non terminated
+select "terminated";$$
+terminated
+terminated
+select "non terminated, space"      $$
+non terminated, space
+non terminated, space
+select "terminated, space";      $$
+terminated, space
+terminated, space
+select "non terminated, comment" /* comment */$$
+non terminated, comment
+non terminated, comment
+select "terminated, comment"; /* comment */$$
+terminated, comment
+terminated, comment
+select "stmt 1";select "stmt 2 non terminated"$$
+stmt 1
+stmt 1
+stmt 2 non terminated
+stmt 2 non terminated
+select "stmt 1";select "stmt 2 terminated";$$
+stmt 1
+stmt 1
+stmt 2 terminated
+stmt 2 terminated
+select "stmt 1";select "stmt 2 non terminated, space"      $$
+stmt 1
+stmt 1
+stmt 2 non terminated, space
+stmt 2 non terminated, space
+select "stmt 1";select "stmt 2 terminated, space";      $$
+stmt 1
+stmt 1
+stmt 2 terminated, space
+stmt 2 terminated, space
+select "stmt 1";select "stmt 2 non terminated, comment" /* comment */$$
+stmt 1
+stmt 1
+stmt 2 non terminated, comment
+stmt 2 non terminated, comment
+select "stmt 1";select "stmt 2 terminated, comment"; /* comment */$$
+stmt 1
+stmt 1
+stmt 2 terminated, comment
+stmt 2 terminated, comment
+select "stmt 1";             select "space, stmt 2"$$
+stmt 1
+stmt 1
+space, stmt 2
+space, stmt 2
+select "stmt 1";/* comment */select "comment, stmt 2"$$
+stmt 1
+stmt 1
+comment, stmt 2
+comment, stmt 2
+DROP PROCEDURE IF EXISTS p26030; CREATE PROCEDURE p26030() BEGIN SELECT 1; END; CALL p26030()
+$$
+1
+1
+DROP PROCEDURE IF EXISTS p26030; CREATE PROCEDURE p26030() SELECT 1; CALL p26030()
+$$
+1
+1
+DROP PROCEDURE p26030;

=== modified file 'mysql-test/r/ps.result'
--- a/mysql-test/r/ps.result	2008-02-28 14:34:08 +0000
+++ b/mysql-test/r/ps.result	2008-07-07 16:00:08 +0000
@@ -85,9 +85,9 @@ NULL
 NULL
 NULL
 prepare stmt6 from 'select 1; select2';
-ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; select2' at line 1
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select2' at line 1
 prepare stmt6 from 'insert into t1 values (5,"five"); select2';
-ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; select2' at line 1
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select2' at line 1
 explain prepare stmt6 from 'insert into t1 values (5,"five"); select2';
 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from 'insert into t1 values (5,"five"); select2'' at line 1
 create table t2

=== modified file 'mysql-test/r/varbinary.result'
--- a/mysql-test/r/varbinary.result	2007-03-09 21:29:02 +0000
+++ b/mysql-test/r/varbinary.result	2008-06-27 15:56:41 +0000
@@ -78,3 +78,34 @@ alter table t1 modify a varchar(255);
 select length(a) from t1;
 length(a)
 6
+select 0b01000001;
+0b01000001
+A
+select 0x41;
+0x41
+A
+select b'01000001';
+b'01000001'
+A
+select x'41', 0+x'41';
+x'41'	0+x'41'
+A	65
+select N'abc', length(N'abc');
+abc	length(N'abc')
+abc	3
+select N'', length(N'');
+	length(N'')
+	0
+select '', length('');
+	length('')
+	0
+select b'', 0+b'';
+b''	0+b''
+	0
+select x'', 0+x'';
+x''	0+x''
+	0
+select 0x;
+ERROR 42S22: Unknown column '0x' in 'field list'
+select 0b;
+ERROR 42S22: Unknown column '0b' in 'field list'

=== modified file 'mysql-test/suite/funcs_1/t/is_columns_myisam_embedded.test'
--- a/mysql-test/suite/funcs_1/t/is_columns_myisam_embedded.test	2008-06-16 18:39:58 +0000
+++ b/mysql-test/suite/funcs_1/t/is_columns_myisam_embedded.test	2008-07-01 18:44:47 +0000
@@ -10,11 +10,6 @@
 # 2008-06-06 mleich Create this this variant for the embedded server.
 #
 
-let $value= query_get_value(SHOW VARIABLES LIKE 'version_compile_os',Value,1);
-if (`SELECT '$value' LIKE 'apple-darwin%'`)
-{
-   skip Bug#37380 Test funcs_1.is_columns_myisam_embedded fails on OS X;
-}
 if (`SELECT VERSION() NOT LIKE '%embedded%'`)
 {
    --skip Test requires: embedded server

=== added file 'mysql-test/t/parser.test'
--- a/mysql-test/t/parser.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/parser.test	2008-07-07 16:00:08 +0000
@@ -0,0 +1,59 @@
+#
+# This file contains tests covering the parser
+#
+
+#=============================================================================
+# LEXICAL PARSER (lex)
+#=============================================================================
+
+#
+# Maintainer: these tests are for the lexical parser, so every character,
+# even whitespace or comments, is significant here.
+#
+
+#
+# Bug#26030 (Parsing fails for stored routine w/multi-statement execution
+# enabled)
+#
+
+--disable_warnings
+DROP PROCEDURE IF EXISTS p26030;
+--enable_warnings
+
+delimiter $$;
+
+select "non terminated"$$
+select "terminated";$$
+select "non terminated, space"      $$
+select "terminated, space";      $$
+select "non terminated, comment" /* comment */$$
+select "terminated, comment"; /* comment */$$
+
+# Multi queries can not be used in --ps-protocol test mode
+--disable_ps_protocol
+
+select "stmt 1";select "stmt 2 non terminated"$$
+select "stmt 1";select "stmt 2 terminated";$$
+select "stmt 1";select "stmt 2 non terminated, space"      $$
+select "stmt 1";select "stmt 2 terminated, space";      $$
+select "stmt 1";select "stmt 2 non terminated, comment" /* comment */$$
+select "stmt 1";select "stmt 2 terminated, comment"; /* comment */$$
+
+select "stmt 1";             select "space, stmt 2"$$
+select "stmt 1";/* comment */select "comment, stmt 2"$$
+
+DROP PROCEDURE IF EXISTS p26030; CREATE PROCEDURE p26030() BEGIN SELECT 1; END; CALL p26030()
+$$
+
+DROP PROCEDURE IF EXISTS p26030; CREATE PROCEDURE p26030() SELECT 1; CALL p26030()
+$$
+
+--enable_ps_protocol
+
+delimiter ;$$
+DROP PROCEDURE p26030;
+
+#============================================================================r
+# SYNTACTIC PARSER (bison)
+#=============================================================================
+

=== modified file 'mysql-test/t/varbinary.test'
--- a/mysql-test/t/varbinary.test	2006-12-21 23:38:34 +0000
+++ b/mysql-test/t/varbinary.test	2008-06-27 15:56:41 +0000
@@ -84,3 +84,31 @@ select length(a) from t1;
 alter table t1 modify a varchar(255);
 select length(a) from t1;
 
+#
+# Bug#35658 (An empty binary value leads to mysqld crash)
+#
+
+select 0b01000001;
+
+select 0x41;
+
+select b'01000001';
+
+select x'41', 0+x'41';
+
+select N'abc', length(N'abc');
+
+select N'', length(N'');
+
+select '', length('');
+
+select b'', 0+b'';
+
+select x'', 0+x'';
+
+--error ER_BAD_FIELD_ERROR
+select 0x;
+
+--error ER_BAD_FIELD_ERROR
+select 0b;
+

=== modified file 'mysys/default.c'
--- a/mysys/default.c	2007-11-16 21:56:37 +0000
+++ b/mysys/default.c	2008-07-09 10:03:48 +0000
@@ -48,13 +48,12 @@ char *my_defaults_extra_file=0;
 /* Which directories are searched for options (and in which order) */
 
 #define MAX_DEFAULT_DIRS 6
-const char *default_directories[MAX_DEFAULT_DIRS + 1];
+#define DEFAULT_DIRS_SIZE (MAX_DEFAULT_DIRS + 1)  /* Terminate with NULL */
+static const char **default_directories = NULL;
 
 #ifdef __WIN__
 static const char *f_extensions[]= { ".ini", ".cnf", 0 };
 #define NEWLINE "\r\n"
-static char system_dir[FN_REFLEN], shared_system_dir[FN_REFLEN],
-            config_dir[FN_REFLEN];
 #else
 static const char *f_extensions[]= { ".cnf", 0 };
 #define NEWLINE "\n"
@@ -85,19 +84,34 @@ static int search_default_file_with_ext(
 					const char *config_file, int recursion_level);
 
 
-
 /**
   Create the list of default directories.
 
+  @param alloc  MEM_ROOT where the list of directories is stored
+
   @details
+  The directories searched, in order, are:
+  - Windows:     GetSystemWindowsDirectory()
+  - Windows:     GetWindowsDirectory()
+  - Windows:     C:/
+  - Windows:     Directory above where the executable is located
+  - Netware:     sys:/etc/
+  - Unix & OS/2: /etc/
+  - Unix:        --sysconfdir=<path> (compile-time option)
+  - OS/2:        getenv(ETC)
+  - ALL:         getenv(DEFAULT_HOME_ENV)
+  - ALL:         --defaults-extra-file=<path> (run-time option)
+  - Unix:        ~/
+
   On all systems, if a directory is already in the list, it will be moved
   to the end of the list.  This avoids reading defaults files multiple times,
   while ensuring the correct precedence.
 
-  @return void
+  @retval NULL  Failure (out of memory, probably)
+  @retval other Pointer to NULL-terminated array of default directories
 */
 
-static void (*init_default_directories)();
+static const char **init_default_directories(MEM_ROOT *alloc);
 
 
 static char *remove_end_comment(char *ptr);
@@ -386,8 +400,9 @@ int load_defaults(const char *conf_file,
   struct handle_option_ctx ctx;
   DBUG_ENTER("load_defaults");
 
-  init_default_directories();
   init_alloc_root(&alloc,512,0);
+  if ((default_directories= init_default_directories(&alloc)) == NULL)
+    goto err;
   /*
     Check if the user doesn't want any default option processing
     --no-defaults is always the first option
@@ -864,34 +879,49 @@ void my_print_default_files(const char *
   my_bool have_ext= fn_ext(conf_file)[0] != 0;
   const char **exts_to_use= have_ext ? empty_list : f_extensions;
   char name[FN_REFLEN], **ext;
-  const char **dirs;
 
-  init_default_directories();
   puts("\nDefault options are read from the following files in the given order:");
 
   if (dirname_length(conf_file))
     fputs(conf_file,stdout);
   else
   {
-    for (dirs=default_directories ; *dirs; dirs++)
+    /*
+      If default_directories is already initialized, use it.  Otherwise,
+      use a private MEM_ROOT.
+    */
+    const char **dirs = default_directories;
+    MEM_ROOT alloc;
+    init_alloc_root(&alloc,512,0);
+
+    if (!dirs && (dirs= init_default_directories(&alloc)) == NULL)
     {
-      for (ext= (char**) exts_to_use; *ext; ext++)
+      fputs("Internal error initializing default directories list", stdout);
+    }
+    else
+    {
+      for ( ; *dirs; dirs++)
       {
-	const char *pos;
-	char *end;
-	if (**dirs)
-	  pos= *dirs;
-	else if (my_defaults_extra_file)
-	  pos= my_defaults_extra_file;
-	else
-	  continue;
-	end= convert_dirname(name, pos, NullS);
-	if (name[0] == FN_HOMELIB)	/* Add . to filenames in home */
-	  *end++='.';
-	strxmov(end, conf_file, *ext, " ", NullS);
-	fputs(name,stdout);
+        for (ext= (char**) exts_to_use; *ext; ext++)
+        {
+          const char *pos;
+          char *end;
+          if (**dirs)
+            pos= *dirs;
+          else if (my_defaults_extra_file)
+            pos= my_defaults_extra_file;
+          else
+            continue;
+          end= convert_dirname(name, pos, NullS);
+          if (name[0] == FN_HOMELIB)	/* Add . to filenames in home */
+            *end++= '.';
+          strxmov(end, conf_file, *ext, " ", NullS);
+          fputs(name, stdout);
+        }
       }
     }
+
+    free_root(&alloc, MYF(0));
   }
   puts("");
 }
@@ -928,32 +958,23 @@ void print_defaults(const char *conf_fil
 #include <help_end.h>
 
 
-/*
-  This extra complexity is to avoid declaring 'rc' if it won't be
-  used.
-*/
-#define ADD_DIRECTORY_INTERNAL(DIR) \
-  array_append_string_unique((DIR), default_directories, \
-                             array_elements(default_directories))
-#ifdef DBUG_OFF
-#  define ADD_DIRECTORY(DIR)  (void) ADD_DIRECTORY_INTERNAL(DIR)
-#else
-#define ADD_DIRECTORY(DIR) \
-  do { \
-    my_bool rc= ADD_DIRECTORY_INTERNAL(DIR); \
-    DBUG_ASSERT(rc == FALSE);                   /* Success */ \
-  } while (0)
-#endif
-
+static int add_directory(MEM_ROOT *alloc, const char *dir, const char **dirs)
+{
+  char buf[FN_REFLEN];
+  uint len;
+  char *p;
+  my_bool err __attribute__((unused));
+
+  /* Normalize directory name */
+  len= unpack_dirname(buf, dir);
+  if (!(p= strmake_root(alloc, buf, len)))
+    return 1;  /* Failure */
+  /* Should never fail if DEFAULT_DIRS_SIZE is correct size */
+  err= array_append_string_unique(p, dirs, DEFAULT_DIRS_SIZE);
+  DBUG_ASSERT(err == FALSE);
 
-#define ADD_COMMON_DIRECTORIES() \
-  do { \
-    char *env; \
-    if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV)))) \
-      ADD_DIRECTORY(env); \
-    /* Placeholder for --defaults-extra-file=<path> */ \
-    ADD_DIRECTORY(""); \
-  } while (0)
+  return 0;
+}
 
 
 #ifdef __WIN__
@@ -992,138 +1013,93 @@ static uint my_get_system_windows_direct
 }
 
 
-/**
-  Initialize default directories for Microsoft Windows
-
-  @details
-    1. GetSystemWindowsDirectory()
-    2. GetWindowsDirectory()
-    3. C:/
-    4. Directory above where the executable is located
-    5. getenv(DEFAULT_HOME_ENV)
-    6. --defaults-extra-file=<path> (run-time option)
-*/
-
-static void init_default_directories_win()
+static const char *my_get_module_parent(char *buf, size_t size)
 {
-  bzero((char *) default_directories, sizeof(default_directories));
-
-  if (my_get_system_windows_directory(shared_system_dir,
-                                      sizeof(shared_system_dir)))
-    ADD_DIRECTORY(shared_system_dir);
-
-  if (GetWindowsDirectory(system_dir,sizeof(system_dir)))
-    ADD_DIRECTORY(system_dir);
-
-  ADD_DIRECTORY("C:/");
+  char *last= NULL;
+  char *end;
+  if (!GetModuleFileName(NULL, buf, (DWORD) size))
+    return NULL;
+  end= strend(buf);
 
-  if (GetModuleFileName(NULL, config_dir, sizeof(config_dir)))
+  /*
+    Look for the second-to-last \ in the filename, but hang on
+    to a pointer after the last \ in case we're in the root of
+    a drive.
+  */
+  for ( ; end > buf; end--)
   {
-    char *last= NULL, *end= strend(config_dir);
-    /*
-      Look for the second-to-last \ in the filename, but hang on
-      to a pointer after the last \ in case we're in the root of
-      a drive.
-    */
-    for ( ; end > config_dir; end--)
+    if (*end == FN_LIBCHAR)
     {
-      if (*end == FN_LIBCHAR)
+      if (last)
       {
-        if (last)
-        {
-          if (end != config_dir)
-          {
-            /* Keep the last '\' as this works both with D:\ and a directory */
-            end[1]= 0;
-          }
-          else
-          {
-            /* No parent directory (strange). Use current dir + '\' */
-            last[1]= 0;
-          }
-          break;
-        }
-        last= end;
+        /* Keep the last '\' as this works both with D:\ and a directory */
+        end[1]= 0;
+        break;
       }
+      last= end;
     }
-    ADD_DIRECTORY(config_dir);
   }
 
-  ADD_COMMON_DIRECTORIES();
+  return buf;
 }
+#endif /* __WIN__ */
 
-static void (*init_default_directories)()= init_default_directories_win;
-
-#elif defined(__NETWARE__)
-
-/**
-  Initialize default directories for Novell Netware
 
-  @details
-    1. sys:/etc/
-    2. getenv(DEFAULT_HOME_ENV)
-    3. --defaults-extra-file=<path> (run-time option)
-*/
-
-static void init_default_directories_netware()
+static const char **init_default_directories(MEM_ROOT *alloc)
 {
-  bzero((char *) default_directories, sizeof(default_directories));
-  ADD_DIRECTORY("sys:/etc/");
-  ADD_COMMON_DIRECTORIES();
-}
+  const char **dirs;
+  char *env;
+  int errors= 0;
 
-static void (*init_default_directories)()= init_default_directories_netware;
+  dirs= (const char **)alloc_root(alloc, DEFAULT_DIRS_SIZE * sizeof(char *));
+  if (dirs == NULL)
+    return NULL;
+  bzero((char *) dirs, DEFAULT_DIRS_SIZE * sizeof(char *));
 
-#elif defined(__EMX__) || defined(OS2)
+#ifdef __WIN__
 
-/**
-  Initialize default directories for OS/2
+  {
+    char fname_buffer[FN_REFLEN];
+    if (my_get_system_windows_directory(fname_buffer, sizeof(fname_buffer)))
+      errors += add_directory(alloc, fname_buffer, dirs);
 
-  @details
-    1. /etc/
-    2. getenv(ETC)
-    3. getenv(DEFAULT_HOME_ENV)
-    4. --defaults-extra-file=<path> (run-time option)
-*/
+    if (GetWindowsDirectory(fname_buffer, sizeof(fname_buffer)))
+      errors += add_directory(alloc, fname_buffer, dirs);
 
-static void init_default_directories_os2()
-{
-  const char *env;
+    errors += add_directory(alloc, "C:/", dirs);
 
-  bzero((char *) default_directories, sizeof(default_directories));
-  ADD_DIRECTORY("/etc/");
-  if ((env= getenv("ETC")))
-    ADD_DIRECTORY(env);
-  ADD_COMMON_DIRECTORIES();
-}
+    if (my_get_module_parent(fname_buffer, sizeof(fname_buffer)) != NULL)
+      errors += add_directory(alloc, fname_buffer, dirs);
+  }
 
-static void (*init_default_directories)()= init_default_directories_os2;
+#elif defined(__NETWARE__)
 
-#else
+  errors += add_directory(alloc, "sys:/etc/", dirs);
 
-/**
-  Initialize default directories for Unix
+#else
 
-  @details
-    1. /etc/
-    2. --sysconfdir=<path> (compile-time option)
-    3. getenv(DEFAULT_HOME_ENV)
-    4. --defaults-extra-file=<path> (run-time option)
-    5. "~/"
-*/
+  errors += add_directory(alloc, "/etc/", dirs);
 
-static void init_default_directories_unix()
-{
-  bzero((char *) default_directories, sizeof(default_directories));
-  ADD_DIRECTORY("/etc/");
-#ifdef DEFAULT_SYSCONFDIR
+#if defined(__EMX__) || defined(OS2)
+  if ((env= getenv("ETC")))
+    errors += add_directory(alloc, env, dirs);
+#elif defined(DEFAULT_SYSCONFDIR)
   if (DEFAULT_SYSCONFDIR != "")
-    ADD_DIRECTORY(DEFAULT_SYSCONFDIR);
+    errors += add_directory(alloc, DEFAULT_SYSCONFDIR, dirs);
+#endif /* __EMX__ || __OS2__ */
+
 #endif
-  ADD_COMMON_DIRECTORIES();
-  ADD_DIRECTORY("~/");
-}
 
-static void (*init_default_directories)()= init_default_directories_unix;
+  if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV))))
+    errors += add_directory(alloc, env, dirs);
+
+  /* Placeholder for --defaults-extra-file=<path> */
+  errors += add_directory(alloc, "", dirs);
 
+#if !defined(__WIN__) && !defined(__NETWARE__) && \
+    !defined(__EMX__) && !defined(OS2)
+  errors += add_directory(alloc, "~/", dirs);
 #endif
+
+  return (errors > 0 ? NULL : dirs);
+}

=== modified file 'sql/item.cc'
--- a/sql/item.cc	2008-04-21 22:53:12 +0000
+++ b/sql/item.cc	2008-06-27 15:56:41 +0000
@@ -5013,21 +5013,28 @@ Item_bin_string::Item_bin_string(const c
   if (!ptr)
     return;
   str_value.set(ptr, max_length, &my_charset_bin);
-  ptr+= max_length - 1;
-  ptr[1]= 0;                     // Set end null for string
-  for (; end >= str; end--)
+
+  if (max_length > 0)
   {
-    if (power == 256)
+    ptr+= max_length - 1;
+    ptr[1]= 0;                     // Set end null for string
+    for (; end >= str; end--)
     {
-      power= 1;
-      *ptr--= bits;
-      bits= 0;     
+      if (power == 256)
+      {
+        power= 1;
+        *ptr--= bits;
+        bits= 0;
+      }
+      if (*end == '1')
+        bits|= power;
+      power<<= 1;
     }
-    if (*end == '1')
-      bits|= power; 
-    power<<= 1;
+    *ptr= (char) bits;
   }
-  *ptr= (char) bits;
+  else
+    ptr[0]= 0;
+
   collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
   fixed= 1;
 }

=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc	2008-07-10 18:50:07 +0000
+++ b/sql/log_event.cc	2008-07-17 15:35:05 +0000
@@ -4154,8 +4154,14 @@ int User_var_log_event::exec_event(struc
   /*
     Item_func_set_user_var can't substitute something else on its place =>
     0 can be passed as last argument (reference on item)
+
+    Fix_fields() can fail, in which case a call of update_hash() might
+    crash the server, so if fix fields fails, we just return with an
+    error.
   */
-  e.fix_fields(thd, 0);
+  if (e.fix_fields(thd, 0))
+    return 1;
+
   /*
     A variable can just be considered as a table with
     a single record and with a single column. Thus, like

=== modified file 'sql/sp_head.h'
--- a/sql/sp_head.h	2008-05-15 23:13:24 +0000
+++ b/sql/sp_head.h	2008-07-07 16:00:08 +0000
@@ -117,7 +117,6 @@ public:
   create_field m_return_field_def; /* This is used for FUNCTIONs only. */
 
   const char *m_tmp_query;	// Temporary pointer to sub query string
-  uint m_old_cmq;		// Old CLIENT_MULTI_QUERIES value
   st_sp_chistics *m_chistics;
   ulong m_sql_mode;		// For SHOW CREATE and execution
   LEX_STRING m_qname;		// db.name

=== modified file 'sql/sql_lex.cc'
--- a/sql/sql_lex.cc	2008-07-14 20:16:37 +0000
+++ b/sql/sql_lex.cc	2008-07-17 15:35:05 +0000
@@ -1010,21 +1010,8 @@ int MYSQLlex(void *arg, void *yythd)
       yySkip();
       return (SET_VAR);
     case MY_LEX_SEMICOLON:			// optional line terminator
-      if (yyPeek())
-      {
-        if ((thd->client_capabilities & CLIENT_MULTI_STATEMENTS) && 
-            !lip->stmt_prepare_mode)
-        {
-	  lex->safe_to_cache_query= 0;
-          lip->found_semicolon= lip->ptr;
-          thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
-          lip->next_state=     MY_LEX_END;
-          return (END_OF_INPUT);
-        }
-        state= MY_LEX_CHAR;		// Return ';'
-	break;
-      }
-      /* fall true */
+      state= MY_LEX_CHAR;               // Return ';'
+      break;
     case MY_LEX_EOL:
       if (lip->ptr >= lip->end_of_query)
       {
@@ -1039,7 +1026,7 @@ int MYSQLlex(void *arg, void *yythd)
     case MY_LEX_END:
       lip->next_state=MY_LEX_END;
       return(0);			// We found end of input last time
-      
+
       /* Actually real shouldn't start with . but allow them anyhow */
     case MY_LEX_REAL_OR_POINT:
       if (my_isdigit(cs,yyPeek()))

=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc	2008-07-15 16:51:05 +0000
+++ b/sql/sql_parse.cc	2008-07-17 15:35:05 +0000
@@ -6224,6 +6224,11 @@ void mysql_parse(THD *thd, const char *i
               (thd->query_length= (ulong)(lip.found_semicolon - thd->query)))
             thd->query_length--;
           /* Actually execute the query */
+          if (*found_semicolon)
+          {
+            lex->safe_to_cache_query= 0;
+            thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
+          }
           lex->set_trg_event_type_for_tables();
           mysql_execute_command(thd);
           query_cache_end_of_result(thd);

=== modified file 'sql/sql_yacc.yy'
--- a/sql/sql_yacc.yy	2008-07-14 20:16:37 +0000
+++ b/sql/sql_yacc.yy	2008-07-17 15:35:05 +0000
@@ -1216,21 +1216,54 @@ END_OF_INPUT
 
 
 query:
-	END_OF_INPUT
-	{
-	   THD *thd= YYTHD;
-	   if (!thd->bootstrap &&
-	      (!(thd->lex->select_lex.options & OPTION_FOUND_COMMENT)))
-	   {
-	     my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY), MYF(0));
-	     MYSQL_YYABORT;
-	   }
-	   else
-	   {
-	     thd->lex->sql_command= SQLCOM_EMPTY_QUERY;
-	   }
-	}
-	| verb_clause END_OF_INPUT {};
+          END_OF_INPUT
+          {
+            THD *thd= YYTHD;
+            if (!thd->bootstrap &&
+              (!(thd->lex->select_lex.options & OPTION_FOUND_COMMENT)))
+            {
+              my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY), MYF(0));
+              MYSQL_YYABORT;
+            }
+            thd->lex->sql_command= SQLCOM_EMPTY_QUERY;
+            thd->m_lip->found_semicolon= NULL;
+          }
+        | verb_clause
+          {
+            Lex_input_stream *lip = YYTHD->m_lip;
+
+            if ((YYTHD->client_capabilities & CLIENT_MULTI_QUERIES) &&
+                ! lip->stmt_prepare_mode &&
+                ! (lip->ptr >= lip->end_of_query))
+            {
+              /*
+                We found a well formed query, and multi queries are allowed:
+                - force the parser to stop after the ';'
+                - mark the start of the next query for the next invocation
+                  of the parser.
+              */
+              lip->next_state= MY_LEX_END;
+              lip->found_semicolon= lip->ptr;
+            }
+            else
+            {
+              /* Single query, terminated. */
+              lip->found_semicolon= NULL;
+            }
+          }
+          ';'
+          opt_end_of_input
+        | verb_clause END_OF_INPUT
+          {
+            /* Single query, not terminated. */
+            YYTHD->m_lip->found_semicolon= NULL;
+          }
+        ;
+
+opt_end_of_input:
+          /* empty */
+        | END_OF_INPUT
+        ;
 
 verb_clause:
 	  statement
@@ -9961,13 +9994,6 @@ trigger_tail:
 
 	  lex->sphead= sp;
 	  lex->spname= $3;
-	  /*
-	    We have to turn of CLIENT_MULTI_QUERIES while parsing a
-	    stored procedure, otherwise yylex will chop it into pieces
-	    at each ';'.
-	  */
-	  sp->m_old_cmq= thd->client_capabilities & CLIENT_MULTI_QUERIES;
-	  thd->client_capabilities &= ~CLIENT_MULTI_QUERIES;
 	  
 	  bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics));
 	  lex->sphead->m_chistics= &lex->sp_chistics;
@@ -9982,9 +10008,6 @@ trigger_tail:
 	  
 	  lex->sql_command= SQLCOM_CREATE_TRIGGER;
 	  sp->init_strings(YYTHD, lex);
-	  /* Restore flag if it was cleared above */
-	  if (sp->m_old_cmq)
-	    YYTHD->client_capabilities |= CLIENT_MULTI_QUERIES;
 	  sp->restore_thd_mem_root(YYTHD);
 	
 	  if (sp->is_not_allowed_in_function("trigger"))
@@ -10062,13 +10085,6 @@ sf_tail:
 
 	    sp->m_type= TYPE_ENUM_FUNCTION;
 	    lex->sphead= sp;
-	    /*
-	     * We have to turn of CLIENT_MULTI_QUERIES while parsing a
-	     * stored procedure, otherwise yylex will chop it into pieces
-	     * at each ';'.
-	     */
-	    sp->m_old_cmq= thd->client_capabilities & CLIENT_MULTI_QUERIES;
-	    thd->client_capabilities &= ~CLIENT_MULTI_QUERIES;
 	    lex->sphead->m_param_begin= lip->tok_start+1;
 	  }
           sp_fdparam_list /* $6 */
@@ -10124,9 +10140,6 @@ sf_tail:
               my_error(ER_SP_NORETURN, MYF(0), sp->m_qname.str);
               MYSQL_YYABORT;
             }
-	    /* Restore flag if it was cleared above */
-	    if (sp->m_old_cmq)
-	      YYTHD->client_capabilities |= CLIENT_MULTI_QUERIES;
 	    sp->restore_thd_mem_root(YYTHD);
 	  }
 	;
@@ -10156,13 +10169,6 @@ sp_tail:
           sp->init_sp_name(YYTHD, $3);
 
 	  lex->sphead= sp;
-	  /*
-	   * We have to turn of CLIENT_MULTI_QUERIES while parsing a
-	   * stored procedure, otherwise yylex will chop it into pieces
-	   * at each ';'.
-	   */
-	  sp->m_old_cmq= YYTHD->client_capabilities & CLIENT_MULTI_QUERIES;
-	  YYTHD->client_capabilities &= (~CLIENT_MULTI_QUERIES);
 	}
         '('
 	{
@@ -10198,9 +10204,6 @@ sp_tail:
 
 	  sp->init_strings(YYTHD, lex);
 	  lex->sql_command= SQLCOM_CREATE_PROCEDURE;
-	  /* Restore flag if it was cleared above */
-	  if (sp->m_old_cmq)
-	    YYTHD->client_capabilities |= CLIENT_MULTI_QUERIES;
 	  sp->restore_thd_mem_root(YYTHD);
 	}
 	;

Thread
bzr commit into mysql-5.0 branch (jperkin:2581) Jonathan Perkin17 Jul